Getting started
From sign-up to first published entry in roughly ten minutes. The path covers four steps: sign up, install the CLI, push a schema, fetch through the SDK.
1. Sign up
Pick a preset on the pricing page. Stripe takes you to checkout; on success you land in the Studio with an empty workspace. Magic-link sign-in works out of the box; passkeys can be registered from /settings.
The default workspace ships with one space called default. The control plane provisions everything in EU (Frankfurt) unless you bought a country-specific residency module — Belgian, Luxembourgish, Swiss, etc.
2. Install the CLI
In the customer repo where your schemas will live:
pnpm add -D @estokad/cli @estokad/schema
pnpm estokad init
estokad init scaffolds:
estokad.config.ts # workspace, region, apiUrl, paths
schemas/index.ts # re-export entry point
schemas/site-settings.ts # tiny singleton, smoke test the loop
.estokad/.gitignore
The config file:
export default {
workspace: 'your-workspace-slug',
apiUrl: 'https://api.estokad.com',
region: 'eu-fra-1',
}
3. Push a schema
Issue a management API key from /settings/api-keys in the Studio. Set it in your shell:
export ESTOKAD_API_KEY='estk_…'
Then push:
pnpm estokad push
Expected output:
✓ loaded 1 definitions from ./schemas
✓ compiled to JSON IR (1 types)
✓ pushed to your-workspace@eu-fra-1 (1 types)
✓ state saved to ./.estokad/schema-state.json
The state file maps type/field names to UUIDs across runs — commit it so renames stay stable for your team.
Open the Studio: the siteSettings type now appears in the Library. Create a draft, fill in siteName, publish.
4. Fetch the entry
Install the framework-agnostic SDK or the Next.js adapter:
pnpm add @estokad/sdk
# or
pnpm add @estokad/next
Issue a read API key (/settings/api-keys, scope read) and use it as a public client token:
import { createClient } from '@estokad/sdk'
const cms = createClient({
workspace: 'your-workspace-slug',
apiUrl: 'https://api.estokad.com',
apiKey: process.env.ESTOKAD_PUBLIC_KEY,
})
const settings = await cms.singleton('siteSettings').fetch()
console.log(settings.siteName)
In a Next.js App Router page:
import { getEstokad } from '@estokad/next'
export default async function Page() {
const cms = getEstokad()
const settings = await cms.singleton('siteSettings').fetch()
return <h1>{settings.siteName}</h1>
}
That is the full loop. Schema in code → push → publish → fetch.
Where to go next
For deeper schema work, see defineType(). For the editor experience and live preview, see Visual edit. For locking down access, see Auth & RBAC.