Introduction

Inkform is a content platform for changelogs, blogs, and documentation. You write in a web editor; the content is committed as MDX to your own GitHub repository; your site reads it back — either by rendering the files directly with the open-source framework, or by fetching them over the HTTP API.

The one idea worth knowing

GitHub is the database. Published content lives as MDX files in a repo you own. Inkform's database holds the things a repo can't: workspaces, projects, subscribers, analytics, and API keys.

That has two consequences worth planning around:

  • Your content survives Inkform. Cancel your account and the MDX is still sitting in your repo, renderable by the framework with no platform account at all.
  • Writes go through a commit. A post created via the dashboard or the API becomes a real commit in your repo, which is why write endpoints need a connected repository.

The pieces

PieceWhat it is
WorkspaceBilling and membership boundary. Owns projects, subscribers, API usage.
ProjectOne content source — a blog, a docs site, or a changelog — bound to one repo path. Everything is scoped to a project ID.
Framework@inkform/framework, the open-source Next.js + MDX renderer. Usable standalone, with or without an account.
Platform API/api/v1/* on api.inkform.dev — read published content, manage subscribers, create posts.
NewsletterDouble opt-in subscribers, campaign sends, open/click tracking, one-click unsubscribe.

Where things live

The platform is one deployment split across subdomains by host:

HostServes
app.inkform.devDashboard, editor, sign-in
api.inkform.dev/api/v1/*, newsletter subscribe/confirm/unsubscribe, tracking
www.inkform.devMarketing pages, public blog and changelog
docs.inkform.devThis site

Point API calls at api.inkform.dev. The apex and www. serve public content only: https://inkform.dev/api/v1/... gets a 308 to www.inkform.dev, which in turn 307s to app.inkform.dev — a redirect chain that carries no CORS headers, so a browser call dies on it and a server call ends up somewhere that won't answer.

Where to go next