v0.3.9 — trash, activity log & draft preview · Changelog →

Your entire CMS
in one file.

Content, media, schema, users — all in a single .pod file. Copy it anywhere. No database server. No cloud account. Built for Astro.

$ npm install @a83/orbiter-admin
localhost:4322
Orbiter admin dashboard
0 cloud deps
MIT license
1 file everything
offline works without internet
< 5 min to first admin
As written about on
D
dev.to
Building a standalone CMS admin with Hono and vanilla CSS glassmorphism
How I extracted the admin from the Astro integration into a standalone Hono server — architecture, CSS glassmorphism without a build step, and the theme system.
Read article →
r/
Reddit · r/web_design
Orbiter v0.2.0 — self-hosted CMS in a single SQLite file, now with inline image blocks, video embedding, and cloud import
Update on Orbiter: block editor now supports inline images with float alignment, YouTube/Vimeo embedding, and server-side Dropbox/Drive import. Still one .pod file.
Read article →
r/
Reddit · r/cms
Orbiter is now on npm — plus bulk actions, JSON API, and version history
Just shipped v0.1.0: multi-user auth, a full JSON API, version snapshots, and GitHub sync. Everything in one .pod file. Now at v0.2.0 with video embedding, image blocks, and cloud import.
Read article →
D
dev.to
I built a CMS that fits in one file — here's why and how
Every CMS I've tried for Astro comes with the same overhead: a database to provision, a media CDN to configure...
Read article →
X
X · @gerwinweiher
Orbiter — CMS in one SQLite file for Astro
One file. No database server. No cloud account. Built for Astro. Copy it anywhere, back it up with cp.
Read article →
Y
Hacker News
Show HN: Orbiter — CMS in one SQLite file for Astro
Hacker News discussion — community feedback, use cases, and technical questions.
Read article →

See it in action

A full CMS admin — standalone server on port 4322, glassmorphism UI, three themes.

Orbiter admin dashboard — collection overview, entry counts, live/draft status, glassmorphism UI
Dashboard — entry counts per collection, recently changed, live/draft status

Write. Insert. Arrange.

A block-based editor built for real content — rich text, inline images, and layout controls without leaving the page.

Orbiter block editor — heading, paragraph, and inline image with alignment controls
Block editor — B / I / code / H1–H3 / quote / list / divider / image
Image picker sheet showing media library thumbnails and upload button
Insert from anywhere

Pick from your media library or upload directly — the native file picker gives you access to iCloud Drive, Dropbox, Google Drive, and any connected cloud folder, no integration needed.

Editor showing image floated right with text wrapping around it, alignment toolbar visible
Text flow control

Float images left or right so text wraps around them naturally — or center them, or stretch full-width. One click, instant preview in split view. Serialized as standard markdown.

What's new

Recent updates and improvements to Orbiter.

May
2026
v0.3.9
Trash, activity log & draft preview
  • Trash / soft delete — deleted entries move to a recoverable Trash tab. Restore to draft or permanently delete. Bulk restore and bulk purge supported.
  • Activity log — every create, update, publish, unpublish, delete, and restore is recorded with the acting user and timestamp. Visible in the editor's meta panel.
  • Draft preview — generate a preview token in Settings → API and attach it to your preview URL. getPreviewEntry() in orbiter:collections reads any draft directly from the pod, bypassing the published-only snapshot.
  • Schema field drag-sort — reorder fields in the schema editor with a drag handle. Order is preserved in the stored schema.
  • Rate limiting — login endpoint is limited to 5 attempts per 15 minutes per IP. Returns 429 with a human-readable message.
  • TypeScript typesorbiter-env.d.ts is auto-generated at build time with per-collection interfaces and typed overloads for all query functions.
May
2026
v0.3.3
Singletons, drag-sort, editor blocks & version display
  • Singleton collections — mark a collection as singleton to skip the entries list and go straight to the one record. Good for site settings, about pages, or any single-document content.
  • Drag-to-sort entries — reorder entries manually with a drag handle. Order persists in the pod and is reflected in getCollection() output.
  • Callout blocks — type /note in the block picker to insert a tinted info/warning box inline with prose.
  • Table blocks — type /tbl for an editable 2×2 table. Tab to navigate cells, toolbar to add/remove rows and columns.
  • Boolean field — on/off toggle field type for schema definitions.
  • Preview URL per collection — set a URL template with {slug} in Schema; an ↗ Preview button appears in the editor topbar.
  • Version display — admin sidebar footer now shows Orbiter vX.Y.Z · pod vN so you always know what's running.
Apr
2026
v0.3.1
S3 backends, docs & auto-webhook
  • S3-compatible media backend — store uploads on Cloudflare R2, Backblaze B2, AWS S3, or any S3-compatible endpoint. Config via Settings → Media.
  • External media links — reference a Dropbox, Drive, or CDN URL directly without fetching the file. Third tab in the image picker.
  • Auto-publish webhook — fires automatically when an entry transitions from draft to published, no manual trigger needed.
  • Docs site — full reference at orbiter.sh/docs: quick start, collections, media, API, deployment, CLI.
May
2025
Editor
Images, Video & Cloud Import
  • Inline image blocks — float left, right, center, or full width. Text wraps naturally, travel-blog style.
  • Video embedding — paste a YouTube, Vimeo, or direct .mp4 URL. The editor auto-embeds in a responsive 16:9 player.
  • Cloud URL import — paste a share link from Dropbox, Google Drive, or OneDrive. The server fetches it and stores it in your pod. No CORS, no manual download.
  • Block picker/img and /vid shortcuts to insert media blocks from the keyboard.
Mar
2025
Themes
Three Themes & Glass Layout
  • Space — dark space station HUD, light solar command ice blue.
  • Zen — Japandi aesthetic: slate, mauve, moss, warm neutrals.
  • Catppuccin — Mocha (dark) and Latte (light) from the popular palette.
  • Glass layout — frosted panels, backdrop blur, animated gradient orbs. Ships as the default; classic grid still available.
Jan
2025
v0.1.0 → v0.2.0
Now on npm
  • Published to npmorbiter-core, orbiter-integration, orbiter-admin, orbiter-cli.
  • Block editor with live preview, autosave, version history, and draft/published toggle.
  • i18n — per-entry locale variants, getLocaleCollection(), locale fallback.
  • Relations — resolved at build time into full Entry objects.
  • WordPress importer, Git sync mode, JSON API, multi-user auth, PWA.

How it works

Your entire CMS lives next to your source code — in one file.

your-site/
├── astro.config.mjs
├── content.pod   ← your entire CMS
└── src/pages/
Step 1 — Start the admin
npm install @a83/orbiter-admin
ORBITER_POD=$(pwd)/content.pod npm start
Step 2 — Add the integration to astro.config.mjs
import orbiter from '@a83/orbiter-integration';

export default defineConfig({
  output: 'server',
  integrations: [orbiter({ pod: './content.pod' })],
});
Step 3 — Read content in your pages
import { getCollection } from 'orbiter:collections';

const posts = await getCollection('posts');

What's included

A full CMS admin — standalone on port 4322. The Astro integration handles content at build time via orbiter:collections.

One file. Everything.
Content, media, schema, users, sessions — all in a single .pod file. Copy it anywhere. Back it up with cp.
Astro-native
One line in astro.config.mjs gives you orbiter:collections — a Vite virtual module that snapshots your published content at build time. Zero runtime fetch.
Familiar content API
Read content with getCollection and getEntry — same shape as Astro's built-in content collections.
Schema editor
Add or change fields in the admin without writing migrations. Changes apply immediately.
Media library
Images and files stored as BLOBs directly in the pod. No CDN to configure, no broken paths after deploy.
Version history
Every save creates a snapshot. Roll back to any previous version of any entry directly in the admin.
JSON API
GET /orbiter/api/[collection] — optional Bearer token, ready to use from any frontend or mobile app.
Git sync mode
orbiter unpack extracts media BLOBs to files, orbiter pack restores them. Commit your pod + media to Git — a GitHub Actions template is included for automatic rebuilds.
Import
Migrate from WordPress (WXR export) or bring in Markdown files. Done in the admin, no CLI needed.
🌍
Multilingual
Per-entry locale variants with slug--locale convention. getLocaleCollection() and locale fallback support built in.
Command palette
⌘K fuzzy search across all content and navigation. Installable as a PWA on mobile and desktop.
👥
Multi-user & roles
Admin and editor roles. Manage users in the UI — no config file, no code change.
No cloud. No lock-in. No compromise.

Your data.
No strings attached.

Every other CMS gives your content to a cloud. Orbiter gives it to you. A single .pod file — on your disk, in your repo, on your server. Copy it, encrypt it, email it. No account required. No monthly invoice. No vendor who can change pricing, shut down, or hold your data hostage.

📁
Backup in one command
cp content.pod backup.pod — that's your entire CMS. A 500-entry blog with images typically weighs under 50 MB.
✈️
Works completely offline
Run npm run dev on your laptop with no internet. Edit content on a plane. No API calls, no auth endpoints, no CDN.
🔍
Fully inspectable, always
Open your pod with any SQLite GUI. Run ad-hoc queries. No black box, no proprietary format, no data you can't read yourself.
⚖️
MIT License — genuinely free
Use it commercially, fork it, sell products built with it. No "open core" bait-and-switch. The full source ships with your project.
sqlite3 content.pod
# open your CMS like any other database
$ sqlite3 content.pod # list all tables
sqlite> .tables
_collections  _entries  _media  _users  _versions # inspect recent entries
sqlite> SELECT slug, status, updated_at
        FROM _entries ORDER BY updated_at DESC LIMIT 4;
my-first-post   published  2025-04-20
about-orbiter   published  2025-04-19
new-draft       draft      2025-04-18
hello-world     published  2025-04-15 # how many media files?
sqlite> SELECT COUNT(*) || ' files, ' ||
        ROUND(SUM(LENGTH(data))/1048576.0, 1) || ' MB'
        FROM _media;
47 files, 18.3 MB # version history — every save is a snapshot
sqlite> SELECT COUNT(*) FROM _versions;
312
Runs on any Node.js host
Railway Coolify Fly.io Render Hetzner Node.js GitHub Pages* Netlify*
* serverless platforms use Git sync mode — content is committed to the repo before each build

How Orbiter compares

Other CMS options for Astro — and where Orbiter fits in.

🪐 Orbiter Decap CMS Keystatic Tina CMS Payload CMS
Storage SQLite file Git Git / files Git + cloud Postgres / MongoDB
External service ✓ None GitHub OAuth required GitHub / local Tina Cloud (free tier) ✓ None
Setup npm install + 3 lines YAML config file Config file Config + dashboard Full backend setup
Astro support ✓ Native ~ Plugin ✓ Native ~ Plugin Manual
Media storage In pod (BLOBs) External CDN External CDN External CDN DB / S3
Version history ✓ Built-in Git history Git history Git history Custom / code
Schema editor UI ✓ Yes YAML only Config only Config only Code only
Offline admin ✓ Yes No ~ Local only No ✓ Yes
Backup cp content.pod git push git push Tina Cloud + git DB dump
Serverless deploy ✓ Git sync mode ✓ Git-native ✓ Git-native ✓ Git-native DB required
License MIT free MIT free MIT free MIT + paid tiers MIT free

Pricing

Orbiter is open source under the MIT License — free for personal and commercial use, forever. If it saves you time, consider supporting its development.

Open Source
Free forever
$0 / always
MIT License
  • Full source code on GitHub
  • Commercial use allowed
  • Modify and distribute freely
  • No attribution required
  • Self-hosted — your data, your server
  • All features included, no paywalls
  • Community support via GitHub Issues
Support
Buy us a coffee
one-time or recurring

Orbiter is free and stays free. If it saves you time or earns you money, consider supporting ongoing development — new features, bug fixes, and long-term maintenance.

  • Same MIT License (still free)
  • Help fund active development
  • Prioritized GitHub issue responses
  • Mention in README supporters list
  • Via Polar — any amount appreciated
Support Orbiter ☕
No account needed · secure payment via Polar

Frequently asked questions

Everything you need to know before getting started.

A .pod file is a standard SQLite database — just with a custom extension. You can open it with any SQLite GUI (TablePlus, DB Browser for SQLite, DBeaver) and inspect or query your content directly. The extension makes it easy to identify in your project.
No. SQLite runs in-process alongside your Astro server. Nothing to provision, nothing to pay for, nothing to configure separately. The database is the file.
Yes, with a note: serverless platforms don't persist filesystem writes between function invocations. Your content is available at build time for static generation, but for editing you need a persistent Node.js server (VPS, Railway, Coolify). Netlify/Vercel are great for hosting the frontend — run the Orbiter admin on a persistent server.
cp content.pod backup.pod. That's it. Every entry, every media file, every schema definition, every user account — in one file. Schedule a cron job, sync to S3, commit it to git. Standard file tooling works.
Orbiter supports multiple users with admin and editor roles. Two people editing the same entry simultaneously uses last-write-wins semantics. Fine for teams of 1–5 people, not designed for large editorial teams editing in parallel.
GET /orbiter/api/[collection] returns all published entries as JSON. Supports optional Bearer token authentication. Works from any frontend, mobile app, or external service without extra setup.
Yes. Export your WordPress site as WXR (the standard WordPress XML export) and import it via the Orbiter admin. Text content, post dates, and categories are converted. HTML body text is transformed to Markdown automatically.
The Astro integration works with any output mode — it only provides orbiter:collections at build time. The admin runs as a separate server (@a83/orbiter-admin) independently of your Astro output mode.
Yes. Open content.pod with any SQLite GUI — TablePlus, DB Browser for SQLite, DBeaver, or the sqlite3 CLI. Tables are _collections, _entries, _media, _users, _sessions, and _versions.
Orbiter is at v0.3.9 — published to npm, actively maintained, and used in real projects. The API may evolve before v1.0. It's suitable for personal sites, client projects, and small teams. Check the GitHub issues for anything relevant to your use case.
MIT License. Use it for any project including commercial ones. Modify it, fork it, distribute it. No attribution required (though appreciated). The source is on GitHub and stays open source.

Honest tradeoffs

Orbiter is the right tool for small teams and content sites. Here's where it isn't.

Not for large media libraries
SQLite BLOB storage is convenient for content sites but not for thousands of high-res images. If your media library is in the gigabytes, this isn't the right tool.
Serverless requires extra steps
Netlify and Vercel don't persist filesystem writes between deploys. The GitHub sync mode works around this, but it adds steps. A VPS or Coolify gives you a better experience.
Built for small teams
Two people editing the same entry at the same moment will get last-write-wins. Fine for a team of 1–5. Not designed for large editorial teams working in parallel.
Claude Code · ChatGPT · Gemini

Scaffold a full project with AI.

One prompt. A complete Astro blog with Orbiter CMS — collections, example content, all pages, and a working admin — built by your AI assistant from scratch.

Full project structure

BaseLayout, Header, PostCard components. Blog listing, post detail, and About page — all wired to Orbiter content.

Collections with example data

Posts, Authors, and Pages collections. Three seeded blog posts, an author, and an About page — ready to edit.

Working admin at localhost:4322

Login with admin / admin and start creating content immediately. Change schema, upload media, switch themes.

AI_SETUP.md — paste into any AI assistant
You are scaffolding a new Astro blog site using Orbiter CMS (https://orbiter.sh). Orbiter is a self-hosted CMS where all content, media, schema, and users live in a single SQLite file called a .pod file. No database server. No cloud dependency. Your task: set up a complete, working project from scratch — including a seed script that creates collections and example content, and Astro pages that consume the data. Follow every step below in order. Run commands as you go. Do not skip steps. ───────────────────────────────────────────── STEP 1 — Create the Astro project ───────────────────────────────────────────── STEP 2 — Install Orbiter packages + add npm scripts STEP 3 — Configure astro.config.mjs STEP 4 — Write seed.js (collections, posts, authors, pages, admin user) STEP 5 — Run the seed script STEP 6 — Create BaseLayout, Header, PostCard, and all pages STEP 7 — Start both dev servers STEP 8 — Verify everything works STEP 9 — Clean up [ + full file contents, project structure, and troubleshooting guide ]

Try it in 60 seconds.

Clone the repo, seed the demo pod, start the admin — login at localhost:4322 with admin / admin.

git clone https://github.com/aeon022/orbiter.git
cd orbiter && npm install && npm run seed
ORBITER_POD=$(pwd)/apps/demo/demo.pod npm run dev --workspace=packages/admin
or scaffold a new project: npm install -g @a83/orbiter-cliorbiter init my-site
Like what you see?
Orbiter is free and open source. If it saves you time, consider supporting its development.
Support Orbiter ☕
Deploy to production
Built by
Abteilung83

Advanced Web Architecture & Digital Systems Engineering — Less Noise. Nice Data. No Bloat.

abteilung83.at →
./ab83_init --status
hash: 3726f9ff3fc75e974f5365206182f841b7aadc2c
build: 19.05.26, 16:38