This post is a quick overview of how Crystal lang built-in documentation features work and an easy setup to host them for free for Open Source projects. A compilation of things I’ve seen across Crystal repos and applied on mine.

Documenting code

Crystal maintains a crystal docs command that processes your project’s codebase and exports a website with the README & inline comments. IMO it’s awesome to encourage documentation to live within the codebase itself.

The generated site will reference/link files (i.e. Module::Class mentions are automatically resolved and converted into links to the respective feature), Admonitions (i.e. support for NOTE, TODO, etc notes), Inheriting Documentation (based on class inheritance), amongst others.

Official Crystal documenting code guide

GitHub Actions ➡ GitHub Pages

Automating becomes possible when putting GitHub actions & pages together, something I jumped into as soon as I realized it would be cool to ensure the docs are always up-to-date with the main branch. Here’s what my docs.yml GitHub action looks like:

name: Upload docs
    branches: [main]
  contents: write
    runs-on: ubuntu-latest
      - name: Checkout 🛎️
        uses: actions/[email protected]

      - name: Install Crystal
        uses: crystal-lang/[email protected]

      - name: Build docs
        run: shards && crystal docs

      - name: Deploy 🚀
        uses: JamesIves/[email protected]
          folder: docs # The folder the action should deploy.

The docs are generated and committed to gh-pages branch, so once enabled in the repo’s settings (screenshot below) you’ll get https://<username><repo-name> website hosted (for free).

I didn’t enable a custom domain because I’m okay with GitHub’s subdomain, but that should be able to work out with the proper DNS configuration (tutorial) if you rather have the site hosted on a subdomain of yours.

GitHub repo pages configuration

What it looks like

The landing pages will be the README, and you can structure that however you prefer. This is what the current README of the battlesnake project looks like compared to the hosted site.

It’s great to be able to dive deeper into each model class (i.e. BattleSnake::Context) or an existing Strategy (i.e. Strategy::CautiousCarol) from the README references or the navigation on the left side.

A small problem I noticed is that markdown tables (from README) aren’t supported yet. I still find this documentation hosting awesome for either when the repo is a shard (for others to reference), or when you/team need to keep up docs (context) for reference on the project down the road.

Pura vida.