# Segment Docs Developer Guide
The contents of this guide will help you get up and running with the Segment Docs local environment.
## Local development with `ruby` and `node`, without Config API
If using MacOS:
* Install command line tools, `xcode-select --install`
* Install `Ruby` >= 2.3.0 https://www.ruby-lang.org/en/documentation/installation/
* Ensure you're running `RubyGems` >= 2.5.0 by running `gem update --system` followed by `gem --version`
* Install `Bundler 2` with `gem install bundler`
* Install `Node` https://nodejs.org/en/download/
* Install `Yarn` https://yarnpkg.com/en/docs/install
* Run server, `make dev`
* Visit http://localhost:4000/docs/
## All about the Catalog script
You run the Catalog update script by running `make catalog` from the docs repo. You, a person who is going to run the script, must first save a Segment token to an `.env` file locally, which is `gitignored` so we don’t check it in to GitHub accidentally.
Note: Old ConfigAPI tokens are not compatible with Public API. You'll need a new one if you want to use Public API.
The script takes your token, inserts it into a request header, then contacts the API, downloads all the available metadata for destinations and sources. It then writes them into a series of yml files that the docs build can consume. (You can find these in `/src/_data/catalog/`)
Note: We don’t currently (Feb '21) do this for warehouses (storage dests) because they were originally lumped in with destinations, and didn’t change often enough to be worth writing a script for. We just have a static `warehouses.yml` file instead. With the switch to Public API from ConfigAPI, we should change this.
The script also “calculates” the values for the `connection-modes` table for destinations, but that’s a huge other headache.
It also does some slugification and destination-name normalization, since our handling of dots and dashes hasn't been consistent over time. Finally, it checks to see if there’s a folder for each destination. If it finds a new one, the script makes a folder with a “stub” markdown file for that destination, and then adds a line for it to an "incompleteDocs.txt" file. (It doesn't check to see if it's already listed, just appends to the file.)
## 3. Developer information
### 3.1. Layouts
`default.html` is the base container through which all the individual other layouts are built to have the right title, SEO, etc. The template inheritance is described in the diagram below.
The `destination.html`, `source.html`, and `integration.html` templates contain the logic that runs the layouts for individual catalog pages. Storage/warehouses use the generic Integration right now because they don't need anything special. Set the layout in the Jekyll `_config.yml` file.
```text
default.html
|- integration.html
|- destination.html
|- source.html
|- main.html
|- catalog.html - used for connections catalog pages only
|- home.html - for main landing page only
|- page.html - used for all pages outside Connections catalogs, without an explicit override
|- search.html - search results page only
```
### 3.2. Config API + Catalog
The Segment Config API provides the data for the Source and Destination catalog pages. This happens on demand using `make catalog`, and the results are stored in the respective `_data/catalog` yml files.
Warehouses.yml is currently built by hand, because warehouses have traditionally been considered a form of destination, so are not separated out in the Config API.
#### 3.2.1. API Key
The Config API needs an API key to pull in the _latest_ catalog data and currently looks for one in the environment variable `PLATFORM_API_TOKEN`. This value is stored in a special file named `.env` that the appropriate scripts reference. You can what this file looks like by looking at `.env.example`
If you want to interact with the Platform API, locally, first make sure you have run `make env`. This will create the appropriate `.env` file for you to work with
**NOTE: Never check-in `.env` or remove it from `.gitignore`.**
Once your local environment is configured, you then have two options to pull Platform API data: You can use the token in [`chamber`](https://github.com/segmentio/chamber) or you can create your own token.
##### Bring your own token
You create your own token in the Segment App. You can use your own personal workspace, or if you have access to them, use [`segment-engineering`](https://app.segment.com/segment-engineering/settings/access-management) or [`segment_prod`](https://app.segment.com/segment_prod/settings/access-management). Go to **Settings > Access Management > Tokens**.
Any type of token will work, but you might want to limit it to a read-only token. If you're working in a shared workspace, make sure you label it so folks know what it's for and don't revoke it.
Once you make a new token, paste the token value in the `.env` file like so:
```text
PLATFORM_API_TOKEN=(token value here)
```
You can now run `make catalog`!
### Sidenav
The sidenav is managed by the files in `_data/sidenav/`. Depending on what section we are in determines the file used. We currently support up to 2 levels deep on a sidenav.
### Breadcrumb
The current breadcrumb is currently determined based on the `page.path` and the current page's `title` front-matter attribute.
### Searching
We're using Algolia, which uses `algolia.js` and `algolia.css`. The index is updated as part of the build process on Netlify..