# dev-site **Repository Path**: mirrors_maxmind/dev-site ## Basic Information - **Project Name**: dev-site - **Description**: Static site generator for https://dev.maxmind.com. - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-25 - **Last Updated**: 2026-10-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

MaxMind

Developer Documentation Static Site Generator

--- ## Overview - **Static Site Generator**: [Hugo](https://gohugo.io/) + [TypeScript](https://www.typescriptlang.org/) + - **Hosting**: [Cloudflare Pages](https://pages.cloudflare.com/) ## Usage - [Minimum Requirements](#minimum-requirements) - [Installation](#installation) - [Development](#development) - [Development Server](#development-server) - [Creating a Release Note](#creating-a-release-note) ### Prerequisites This project uses [mise](https://mise.jdx.dev/) to manage tool versions (Node.js, Hugo, pnpm, precious, Dart Sass). #### Install mise ```sh curl https://mise.jdx.dev/install.sh | sh ``` See the [mise installation guide](https://mise.jdx.dev/getting-started.html) for other installation methods. ### Installation ```sh mise trust # Trust the mise.toml configuration mise install # Install all required tools (Node, Hugo, pnpm, etc.) pnpm install # Install Node.js dependencies ``` #### Pre-commit Hooks You should install our pre-commit hook. You can do this from your checkout by running `git/setup.sh`. These hooks do things like ensure that the code you commit is tidy and passes various linter checks. ### Development #### Development Server The development server watches files, rebuilds the site, and reloads the browser when files change. ```sh hugo server ``` #### Cloudflare Pages HTTP Headers Configuration The `static/_headers` file is automatically generated from `bin/_headers.config.ts` during the build process. **Do not edit `static/_headers` directly**. ##### Making Changes to Headers 1. Edit `bin/_headers.config.ts` (the source of truth with readable format and TypeScript type safety) 2. Test your changes locally by generating the headers file: ```sh pnpm run build:headers ``` 3. Commit only `bin/_headers.config.ts` - the `_headers` file will be generated automatically during deployment ##### Build-Time Generation The headers file is generated automatically during deployment via `build.sh`. You can also generate it manually for local testing with `pnpm run build:headers`. ### Creating a Release Note Each release note is its own content file. Create one with the `release-note` archetype: ```sh hugo new content --kind release-note geoip/release-notes/2026-01-15-geoip2-city-database-update.md ``` The archetype fills in the title from the filename, stamps the current date and time, and sets `draft = false`. The time component orders notes that are published on the same day, so do not replace it with a bare date. If you create two different notes in the same second, move the later one forward by a minute so that the order is unambiguous. Rewrite the generated title before you publish. Note titles use sentence case, but the archetype capitalizes only the first word of the slug, which is rarely the final wording you want. #### Filename Convention Name the file `-.md`, where the date is the publication date and the slug describes the note. The filename becomes the URL, so keep it readable and do not change it after the note is published. The date in the filename must match the date in the front matter. The archetype stamps the current date, so create the file on the day you publish it. #### Cross-Posting to Both Products A note that applies to GeoIP and minFraud is two files, one in each product's `release-notes` folder. Run the command twice with the same filename: ```sh hugo new content --kind release-note geoip/release-notes/2026-01-15-web-service-maintenance.md hugo new content --kind release-note minfraud/release-notes/2026-01-15-web-service-maintenance.md ``` Then copy the `date` value from the first file into the second. The two runs stamp times that are seconds apart, and a shared timestamp keeps the note in the same position in both listings and both feeds. You can then edit each copy independently, for example to list the services that each product affects. #### Setting a Description The `description` field is optional. It controls the preview card that Slack, email clients, and search engines show for the release note. Without it, these services usually show the opening of the release note body. ```toml +++ title = 'Monthly GeoIP database diff report' date = 2026-01-15T09:30:00-05:00 draft = false description = 'Changes between the December and January GeoIP database releases.' +++ ``` ### Updating Example CSVs To do this, use the `create-example-csv-zips-for-dev-site` script in the internal oneoffs repository. ### Adding Page Metadata for SEO and Social Sharing #### Adding a description In the markdown (mdx) file, add a `description` to the frontmatter located at the top of the file: ```toml +++ draft = false title = 'GeoIP is the best' description = 'GeoIP is the best IP Intelligence product suite ever made' +++ ``` #### Adding an image 1. Add your image to the [static/images](static/images) directory. 2. In the markdown (mdx) file, add the path to the `image` key in the frontmatter located at the top of the file. **Do not include `static` to the path.** For example, if your file is at `static/images/geoip2-so-cool.gif`, your frontmatter would look like: ```toml +++ draft = false title = 'GeoIP is the best' description = 'GeoIP is the best IP Intelligence product suite ever made' image = '/images/geoip2-so-cool.gif' +++ ```