Content, media, schema, users — all in a single POD. One SQLite file. Copy it anywhere. No database server. No cloud account. Built for Astro.
A full CMS admin — standalone server on port 4322, glassmorphism UI, three themes.
A block-based editor built for real content — rich text, inline images, and layout controls without leaving the page.
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.
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.
Recent updates and improvements to Orbiter.
required, min, max, and regex. Drafts always save freely. Publish/Schedule shows an inline error banner. Server enforces the same rules via 422.orbiter encrypt/decrypt — AES-256-GCM with scrypt key derivation. Commit the .pod.enc to git, decrypt in CI with a secret.orbiter sync — rsync push/pull in one command. orbiter status — pod health in the terminal.@a83/orbiter-client opens the pod directly from any Node.js framework. <OrbiterImage> Astro component with auto lazy, alt, and dimensions.orbiterLoader() for build-time, orbiterLiveLoader() for SSR. Use getCollection() from astro:content instead of the custom virtual module. Auto Zod schema, hot reload on pod changes.suggestedPrompts. Manual ✦ Suggest button grouped with ✦ AI.orbiter publish generates HTML from terminal, orbiter backup creates timestamped pod copy..pod file or JSON export. Collections created automatically, skip or overwrite duplicates.⌘⇧S).string[][].⌘O) switches to a different content database and restarts instantly.⌘K or / opens a full-screen palette. Opens with recent entries pre-loaded. Type > to enter command mode: > ls, > go, > new, > search, > build, > export, > random, > = expr (math evaluator). Command history with ↑/↓.g then a letter to jump to any page: g d dashboard, g m media, g h HUD, g s settings, g b build, and more. Animated g › indicator in the status bar while waiting for the second key.g h or the dock button.⌘⇧F hides the dock and status bar for distraction-free writing. Persists across reloads. Toast hint on enter.? key or ? button in the status bar opens a two-column modal with every shortcut and palette command.locale column (not slug suffixes). Configure locales in Settings → Language; locale tabs appear in the editor automatically. getLocaleCollection() and getLocaleEntry() in orbiter:collections with automatic fallback to the default locale.publish_at date on any entry. A server-side scheduler auto-publishes and fires the build webhook. Also supports unpublish_at to revert published entries to draft at a future date._comments table, never mixed with entry data./orbiter/rss/[collection].xml and /orbiter/sitemap.xml injected automatically by the integration. No configuration needed.required in the schema block saves (non-autosave) until filled.getPreviewEntry() in orbiter:collections reads any draft directly from the pod, bypassing the published-only snapshot.orbiter-env.d.ts is auto-generated at build time with per-collection interfaces and typed overloads for all query functions.getCollection() output./note in the block picker to insert a tinted info/warning box inline with prose./tbl for an editable 2×2 table. Tab to navigate cells, toolbar to add/remove rows and columns.{slug} in Schema; an ↗ Preview button appears in the editor topbar..mp4 URL. The editor auto-embeds in a responsive 16:9 player./img and /vid shortcuts to insert media blocks from the keyboard.orbiter-core, orbiter-integration, orbiter-admin, orbiter-cli.getLocaleCollection(), locale fallback.Your entire CMS lives next to your source code — in one file.
npm install @a83/orbiter-admin
ORBITER_POD=$(pwd)/content.pod npm start import orbiter from '@a83/orbiter-integration';
export default defineConfig({
output: 'server',
integrations: [orbiter({ pod: './content.pod' })],
}); import { getCollection } from 'orbiter:collections';
const posts = await getCollection('posts'); A full CMS admin — standalone on port 4322. The Astro integration handles content at build time via orbiter:collections.
.pod extension). Copy it anywhere. Back it up with cp.astro.config.mjs gives you orbiter:collections — a Vite virtual module that snapshots your published content at build time. Zero runtime fetch.getCollection and getEntry — same shape as Astro's built-in content collections.orbiterLoader() plugs directly into Astro's Content Layer API. Use astro:content with auto-generated Zod schemas, incremental builds, and hot reload when the pod changes.GET /orbiter/api/[collection] — optional Bearer token. Plus auto-generated RSS 2.0 feeds and an XML sitemap. All injected, no config.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.publish_at date on any entry. The server auto-publishes and fires the build webhook at the right time. Set unpublish_at to expire content.⌘K fuzzy search across all content and navigation. Installable as a PWA on mobile and desktop.getLocaleCollection() and getLocaleEntry() with automatic fallback.⌘K), vim keyboard navigation, HUD panel, notification center, zen mode, and a full mobile tab-bar. Three themes × two colour schemes.getPreviewEntry() reads any draft directly from the pod, bypassing the published snapshot.POST /api/form/:formId. View, filter, reply by email, and mark as confirmed, rejected, or done — all from the admin UI.entry.seo.title, entry.seo.description, and entry.seo.ogImage.dist/ directly to any shared hosting via FTP or FTPS. Configure host, port, credentials, and remote path in Settings. One click to deploy — or trigger automatically after a build webhook.<head>, image rendering, getCollection, ticket buttons, RSS, and sitemap — dynamically adapted to your collection names.orbiter init scaffolds a new project with starter templates. orbiter status shows pod health. orbiter sync pushes/pulls via rsync. orbiter encrypt/decrypt wraps the pod in AES-256-GCM for git-safe storage.Every other CMS gives your content to a cloud. Orbiter gives it to you. A single POD — one SQLite 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.
cp content.pod backup.pod — that's your entire CMS. A 500-entry blog with images typically weighs under 50 MB.npm run dev on your laptop with no internet. Edit content on a plane. No API calls, no auth endpoints, no CDN.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 |
| Multilingual (i18n) | ✓ Locale column | No | ~ Manual | No | ✓ Built-in |
| Scheduled publishing | ✓ Built-in | No | No | No | ~ Plugin |
Orbiter is open source under the MIT License — free for personal and commercial use, forever. If it saves you time, consider supporting its development.
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.
Everything you need to know before getting started.
.pod extension. It contains all your content, media, users, and settings in one file. You can open it with any SQLite tool (TablePlus, DB Browser for SQLite, DBeaver) and inspect or query your content directly.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.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.orbiter:collections at build time. The admin runs as a separate server (@a83/orbiter-admin) independently of your Astro output mode.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 the right tool for small teams and content sites. Here's where it isn't.
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.
BaseLayout, Header, PostCard components. Blog listing, post detail, and About page — all wired to Orbiter content.
Posts, Authors, and Pages collections. Three seeded blog posts, an author, and an About page — ready to edit.
Login with admin / admin and start creating content immediately. Change schema, upload media, switch themes.
Three steps. No database. No cloud account. No configuration files.
Run npx @a83/orbiter-cli init my-site — it scaffolds a project, creates a .pod file with sample collections, and starts the admin. Open localhost:4322 and log in. Done.
The block editor handles text, inline images, video, and all your schema fields. Locale tabs appear automatically when you configure multiple languages in Settings — same slug, independent content per locale.
Set a build webhook URL in Settings. When you publish an entry, Orbiter fires it automatically — triggering your CI/CD on Railway, Netlify, or Vercel. Your static site rebuilds with fresh content.
A distinct layout for the admin — dark glassmorphism, floating magnification dock, command palette, vim keyboard navigation, notification center, HUD panel, zen mode, and a full mobile tab-bar. Switch in one click from Settings.
The dock becomes a native-feeling bottom tab bar. Stats stack to a 2×2 grid. Cards resize to fit. Same content, any screen.
One command scaffolds a new project with demo content — admin at localhost:4322, login with admin / admin.
npx @a83/orbiter-cli init my-site 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 aeon022/orbiter. Config is included.Advanced Web Architecture & Digital Systems Engineering — Less Noise. Nice Data. No Bloat.
abteilung83.at →The web is splitting — humans read stories, AI agents read structure. Orbiter is building for both with Dual Render: one POD, one build, two layers. Content for people and machines from a single source.