Keel Docs
Contributing

Adding Blog Posts

How to write and publish blog posts on the Keel marketing site.

Adding Blog Posts

Blog posts are MDX files in content/blog/. Each file becomes a page at /blog/{slug}.

File Naming

Use the format: YYYY-MM-title-slug.mdx

content/blog/
├── 2026-04-announcing-keel.mdx
├── 2026-04-why-traders-lose-money.mdx
└── 2026-05-funding-rate-strategies.mdx

Frontmatter Schema

Every blog post requires this frontmatter:

---
title: "Your Blog Post Title"
author: "Author Name"
date: "2026-04-15"
description: "A brief description for SEO and social cards (max 160 chars)."
tags: ["strategy", "hyperliquid"]
image: "/blog/your-image.png"  # Optional
draft: false                     # Set to true to hide from listings
---

Required Fields

FieldTypeDescription
titlestringPost title (used as H1 and in page metadata)
authorstringAuthor name
datestringISO date format YYYY-MM-DD
descriptionstringSEO description, shown in blog listing cards

Optional Fields

FieldTypeDefaultDescription
tagsstring[][]Topic tags for filtering
imagestringOG image path (relative to /public)
draftbooleanfalseDraft posts are hidden from listings and sitemap

MDX Features

You can use all standard Markdown plus:

Code Blocks

```python title="strategy.py"
def create_strategy():
    return Pipeline([
        PriceData("ETH-USD", "15m"),
        EMACrossover(fast=9, slow=21),
    ])
```

Callouts

<Callout type="info">
  This is an info callout for important notes.
</Callout>

<Callout type="warn">
  This is a warning callout.
</Callout>

Images

Place images in public/blog/ and reference them:

![Description](/blog/my-image.png)

Preview Locally

cd services/keel-site
npm run dev
# Visit http://localhost:3001/blog/your-slug

Publishing

  1. Set draft: false in frontmatter
  2. Commit and push to main
  3. CI builds and deploys automatically