A narrative platform for the AI era
Your thinking, your experience, your writing — kept where you stay the one telling the story, not the one being synthesized by AI.
Baan runs on plain Markdown plus lightweight metadata in libSQL/SQLite. Sync from any editor you love, or use the built-in AI editor. Article bodies and media live in the local filesystem, S3, R2, or Google Cloud Storage.
Traditional CMSs often store post bodies as database rows. Static generators put them in Git. Baan takes a different path: article bodies are plain Markdown files in storage you choose, while metadata and indexes stay in libSQL/SQLite.
.md file on storage you choose — your local filesystem, GCS, S3, or R2. Lightweight metadata, settings, users, rate-limit counters, and the article index sit in libSQL / SQLite. No MySQL or PostgreSQL server to run. Your writing remains readable in any text editor by design.git add post.md, no merge conflicts on articles.baan posts create ./draft.md. Baan Admin handles metadata, slugs, and publish state either way.| Traditional CMS | Static Generators Hugo · Jekyll · Astro | Baan | |
|---|---|---|---|
| Posts live in | MySQL / PostgreSQLDatabase rows — server required | Git repositoryEvery post = a commit | Storage you choose (.md files)Local filesystem, GCS, S3, or R2. Yours. Portable by design. |
| Git repo | App code & themes | App code + all contentHistory is mixed | App code only — clean |
| Database | MySQL / PostgreSQLRequired to run | None | libSQL / Turso / SQLiteSettings, users, metadata, article index, and rate limits |
| Publishing | Admin panel | git commit + full rebuildRequires dev workflow | Baan Admin or CLI |
| Portability | mysqldump exportPlatform-dependent | Files in Git | Copy Markdown files from storageDB still holds operational metadata |
Get Started
Clone the repo, run the setup wizard, and you're writing. Self-hosted installs auto-create a local SQLite database; serverless deployments use a managed libSQL/Turso database and cloud storage.
# Clone and start git clone https://github.com/baan-press/baan npm install && npm run dev # Open setup wizard → http://localhost:3000/baan-admin/setup
# Start with Docker Compose docker compose up -d # Open setup wizard → http://localhost:3000/baan-admin/setup
From your vault
Obsidian Publish hosts your notes on their servers. Baan turns the same vault into a real multi-language blog on storage you control — one command, diff-synced.
# Install the CLI npm i -g baan-cli # Point it at your vault, then sync baan config set-vault ~/Documents/vault baan sync → uploads only new & changed notes, images included
Obsidian ![[image.png]] wikilinks are resolved and uploaded automatically. Notes sync as drafts by default — add --publish when you're ready.
| Obsidian Publish | Baan | |
|---|---|---|
| Hosting | Obsidian's servers | Your infraLocal filesystem, GCS, S3, or R2 |
| Content ownership | On their platform | Plain .md in storage you own |
| Cost | Paid monthly subscription | Free & open sourceSelf-host; you pay only your own infra |
| Output | A published vault site | A full CMSThemes, RSS, SEO, analytics |
| Multi-language | — | 11 localesAI-assisted translation |
| Themes | Limited | 7 built-in + AI-built custom |
| Sync | One-way, hosted | One-way baan syncDiff-tracked — only changes upload |
Baan — Thai for home (บ้าน)
In an age where AI synthesizes knowledge from countless fragments across the web, your own thinking, experience, and writing get dispersed across platforms you don't own. Baan is where it all comes home — a single place, on infrastructure you control.
Who is this for
Features
baan sync ./vault detects changes, uploads only what's new, and handles images automatically.
prompts/concept.md so the design recipe travels alongside the code.
AI Optimization
AI systems can better interpret sources with clear structure, metadata, and machine-readable signals. Baan outputs Schema.org data, can add extracted entities, and can serve an optional llms.txt when configured, so your articles are easier for ChatGPT, Perplexity, and Google AI Overview to interpret.
/llms.txt from storage — a machine-readable index of your site for AI crawlers. Your AIO score tracks practical readiness signals across content delivery, authority, structured data, and graph coverage.How Baan compares
| Ghost Pro / Substack | WordPress (self-hosted) | Static generators | Baan | |
|---|---|---|---|---|
| Posts stored as plain files | ✗ Database rows | ✗ Database rows | ✓ Files in Git | ✓ Files in your storage |
| No Git commits for articles | ✓ | ✓ | ✗ Every post is a commit | ✓ |
| You own the infrastructure | ✗ Hosted by vendor | ✓ | ✓ | ✓ |
| Modern admin UI | ✓ | △ Plugin-heavy | ✗ No admin | ✓ |
| AI writing assistant | △ Vendor AI only | △ Plugins | ✗ | ✓ Bring your own key |
| AI-readable structured data | ✗ Basic only | △ Plugin/theme dependent | ✗ | ✓ Built into core |
| AI-agent friendly codebase | ✗ | ✗ | ✗ | ✓ Repo guidance included |
| Headless CMS REST API | △ Ghost only | △ REST API plugin | ✗ | ✓ Built-in |
| External editor support | ✗ | ✗ | ✓ Git-based | ✓ Obsidian, VSCode, CLI |
| No mandatory SaaS fee | ✗ Subscription | ✓ Hosting cost only | ✓ Hosting cost only | ✓ Hosting cost only |
Deployment
Baan auto-detects its environment and adapts. Serverless or self-hosted — same codebase, different defaults.
Made possible by
Baan exists because of the people who built these projects. Thank you.