Publishing These Docs
These pages are written as portable Markdown with YAML frontmatter
(title + description on every page). That frontmatter is understood by every
mainstream documentation engine, so you can render this folder with whatever you
choose later without rewriting content. This page records the recommendation and
gives you drop-in navigation config for the most common engines.
Recommendation: Starlight on Astro
For AnvilBase specifically, Starlight on Astro is the best fit:
| Requirement | How Starlight meets it |
|---|---|
| Full-text page index / search | Ships Pagefind out of the box — a static, zero-infra search index generated at build time. This is exactly the “pageindex” capability you asked for. |
| Markdown + MDX | Renders .md and .mdx natively; our frontmatter (title, description) maps directly to Starlight’s schema. |
| Tabbed multi-language code samples | <Tabs> / <TabItem> components — ideal for our curl / TS / Python / Dart snippets. |
| Auto-generated sidebar | Can auto-derive the sidebar from the folder tree, or use the explicit config below. |
| Self-hostable, no SaaS | Static output — deploys to any static host (Netlify, Cloudflare Pages, S3+CDN, nginx). Matches AnvilBase’s self-host ethos. |
| Versioned docs | Via the community starlight-versions plugin when you start shipping breaking changes. |
| License/cost | MIT, free. |
Alternatives, depending on your priorities:
- Mintlify — hosted, beautiful defaults, great API playground. Best if you
want a managed service and an interactive “try it” console. Uses
docs.json. - Docusaurus — React-based, huge plugin ecosystem, Algolia DocSearch. Heavier but extremely extensible.
- Docsify — zero-build, renders Markdown at runtime in the browser. Lowest effort; weaker search and no SSG/SEO.
- README.com — if you specifically want the ReadMe platform, import this folder; the frontmatter and relative links transfer cleanly.
If you have no strong reason to pick something else, use Starlight.
Quickstart: render this folder with Starlight
# Scaffold a Starlight site next to your reponpm create astro@latest anvilbase-docs -- --template starlight --typescript strict --no-installcd anvilbase-docsnpm install
# Point Starlight at this docs folder (symlink or copy)ln -s ../anvilbase/docs src/content/docsnpm run dev # http://localhost:4321npm run build # static site in ./dist (Pagefind index included)Then paste the sidebar config below into astro.config.mjs.
Starlight sidebar (astro.config.mjs)
import { defineConfig } from 'astro/config';import starlight from '@astrojs/starlight';
export default defineConfig({ integrations: [ starlight({ title: 'AnvilBase', tagline: 'Forged for your infrastructure.', social: { github: 'https://github.com/paxtone-studio/anvilbase' }, sidebar: [ { label: 'Introduction', autogenerate: { directory: 'introduction' } }, { label: 'Getting Started', autogenerate: { directory: 'getting-started' } }, { label: 'Database', autogenerate: { directory: 'database' } }, { label: 'REST API', autogenerate: { directory: 'rest-api' } }, { label: 'Auth', autogenerate: { directory: 'auth' } }, { label: 'Realtime', autogenerate: { directory: 'realtime' } }, { label: 'Storage', autogenerate: { directory: 'storage' } }, { label: 'Edge Functions', autogenerate: { directory: 'functions' } }, { label: 'Platform Features', autogenerate: { directory: 'guides' } }, { label: 'Security', autogenerate: { directory: 'security' } }, { label: 'eIDAS 2.0', autogenerate: { directory: 'eidas' } }, { label: 'Self-Hosting', autogenerate: { directory: 'self-hosting' } }, { label: 'CLI', autogenerate: { directory: 'cli' } }, { label: 'Tools', autogenerate: { directory: 'tools' } }, { label: 'Reference', autogenerate: { directory: 'reference' } }, ], }), ],});Ordering tip: Starlight orders auto-generated pages alphabetically unless you add a
sidebar: { order: N }key to each page’s frontmatter. The pages in this repo are deliberately named so that the natural reading order is close to alphabetical within each section; add explicitordervalues if you want exact control.
Mintlify (docs.json navigation)
{ "name": "AnvilBase", "navigation": { "groups": [ { "group": "Introduction", "pages": ["introduction/overview", "introduction/why-anvilbase", "introduction/architecture", "introduction/concepts"] }, { "group": "Getting Started", "pages": ["getting-started/installation", "getting-started/quickstart", "getting-started/first-project", "getting-started/connect-your-app"] }, { "group": "Database", "pages": ["database/overview", "database/tables-and-schema", "database/sql-editor", "database/extensions", "database/vector-search", "database/migrations"] }, { "group": "REST API", "pages": ["rest-api/overview", "rest-api/reading-data", "rest-api/modifying-data", "rest-api/rpc"] }, { "group": "Auth", "pages": ["auth/overview", "auth/users-and-sessions", "auth/oauth-providers", "auth/email-and-templates"] }, { "group": "Realtime", "pages": ["realtime/overview", "realtime/postgres-changes", "realtime/broadcast-and-presence"] }, { "group": "Storage", "pages": ["storage/overview", "storage/working-with-objects", "storage/image-transformations"] }, { "group": "Edge Functions", "pages": ["functions/overview", "functions/writing-and-deploying"] }, { "group": "Platform Features", "pages": ["guides/queues", "guides/cache", "guides/cron-and-scheduling", "guides/webhooks", "guides/secrets"] }, { "group": "Security", "pages": ["security/overview", "security/row-level-security", "security/api-keys-and-scopes", "security/multi-tenancy", "security/rbac-and-team", "security/encryption", "security/audit-logs", "security/network-security"] }, { "group": "eIDAS 2.0", "pages": ["eidas/overview", "eidas/verifier", "eidas/issuer"] }, { "group": "Self-Hosting", "pages": ["self-hosting/overview", "self-hosting/docker-compose", "self-hosting/kubernetes", "self-hosting/configuration", "self-hosting/production-checklist", "self-hosting/backups-and-restore", "self-hosting/point-in-time-recovery", "self-hosting/monitoring", "self-hosting/scaling", "self-hosting/upgrades", "self-hosting/disaster-recovery"] }, { "group": "CLI", "pages": ["cli/reference"] }, { "group": "Tools", "pages": ["tools/mcp", "tools/sdk-compatibility", "tools/migrate-from-supabase"] }, { "group": "Reference", "pages": ["reference/management-api", "reference/data-plane-api", "reference/rest-query-syntax", "reference/configuration", "reference/ports", "reference/error-codes", "reference/glossary"] } ] }}Docusaurus / Docsify
- Docusaurus — drop the folders into
docs/, enable@docusaurus/preset-classicwithdocs.routeBasePath: '/', and either let it auto-generate the sidebar (sidebars: [{type: 'autogenerated', dirName: '.'}]) or transcribe the groups above. Use@docusaurus/theme-search-algoliaor the local@easyops-cn/docusaurus-search-localplugin for the page index. - Docsify — add an
_sidebar.mdmirroring the documentation map, setloadSidebar: true, and enable the search plugin for client-side indexing.
Authoring conventions to preserve portability
If you keep extending these docs, stay engine-agnostic:
- Every page starts with frontmatter containing
titleanddescription. - Use relative links between pages (
../auth/overview.md) — they resolve in every engine and on GitHub. - Keep code fences language-tagged (
```ts,```python,```bash) so syntax highlighting and Pagefind code search work everywhere. - Prefer plain Markdown tables and admonition-style blockquotes over
engine-specific components in the body. If you adopt Starlight and want its
:::noteasides or<Tabs>, add them as an enhancement layer — the plain Markdown still renders fine if you switch engines later.