This is the public site for omnideck. Content is written in Markdown with TOML front matter. No build tools or Node.js required.
Clone the repo. No npm install, no build step, no additional setup required.
./arbor previewOpens a live-reloading dev server at http://localhost:8080. Changes to content, templates, and CSS are picked up automatically.
Run the production build in a container so its generated data and output stay outside the checkout:
docker build --platform linux/amd64 --file container/Dockerfile .Location: content/blog/<slug>.md
+++
title = "Your Post Title"
date = 2026-01-15
draft = false
tags = ["tag-one", "tag-two"]
template = "templates/types/blog.html"
[extra]
description = "One or two sentences shown in previews and meta tags."
author = "Your Name"
featured_image = "/images/your-image.jpg"
+++
Your content here...| Field | Required | Notes |
|---|---|---|
title |
yes | Displayed as the page <h1> |
date |
yes | Format: YYYY-MM-DD |
draft |
yes | Set true to hide from the live site |
tags |
no | Array of lowercase-kebab strings — see Tags below |
template |
yes | Always "templates/types/blog.html" for blog posts |
description |
no | Used in meta tags and the blog listing |
author |
no | Shown below the title |
featured_image |
no | Path under static/images/ — e.g. /images/my-photo.jpg. Shown full-width above the title and used for social link previews. |
To create a new post stub:
./arbor new blog my-post-slugLocation: content/docs/<slug>.md
+++
title = "Page Title"
date = 2026-01-15
draft = false
template = "templates/types/docs.html"
[extra]
description = "One sentence shown in meta tags."
order = 3
+++
Your content here...| Field | Required | Notes |
|---|---|---|
title |
yes | Displayed as the page <h1> and in the sidebar |
date |
yes | Format: YYYY-MM-DD |
draft |
yes | Set true to hide from the live site |
template |
yes | Always "templates/types/docs.html" |
description |
no | Used in meta tags |
order |
no | Integer — controls sort order in the sidebar nav |
Location: content/<slug>.md
+++
title = "Page Title"
date = 2026-01-15
draft = false
template = "templates/types/page.html"
[extra]
description = "One sentence shown in meta tags."
+++
Your content here...Tags appear as chips on blog posts and in the blog sidebar. Use lowercase-kebab format in frontmatter:
tags = ["open-source", "local-ai", "new-tag"]Tags are managed automatically. On every deploy, CI runs bash scripts/sync-data.sh, which:
- Updates
data/tags.tomlwith current tag counts - Creates any missing
content/blog/tags/<slug>.mdlisting pages
You never need to touch data/tags.toml or the tag pages directly.
To run manually:
bash scripts/sync-data.shTwo data files are auto-generated from blog post frontmatter and should not be edited by hand:
| File | What it does |
|---|---|
data/tags.toml |
Tag names, slugs, and post counts — drives the blog sidebar and tag listing pages |
data/homepage.toml |
Latest post title, date, and URL — drives the announcement ribbon on the homepage |
Both are regenerated by bash scripts/sync-data.sh, which runs automatically on commit (via the pre-commit hook) and on every CI deploy (via GitHub Actions).
Place images in static/images/ and reference them as /images/filename.jpg.
For blog post hero images, set featured_image in the front matter. The image appears full-width above the post title and is included in Open Graph meta tags for social previews.
Set draft = true in any file's front matter to exclude it from the live site. Drafts are visible during local preview by default.