// Versioned app state
SkyState

Versioned JSON state for apps: public state anyone can read, plus user state after hosted sign-in.

  • Hosted public stateRuntime settings, flags, and banners. No state server to build.
  • Code-drivenState reads with built-in fallbacks.
  • Versioned, safe promotionEvery write versioned. Diff environments, promote deliberately, stale writes rejected.
  • Hosted user sign-inHosted OAuth sign-in for apps that need user state.
skystate · code-driven
02 / SDK

Code
driven

  • Wrap once with the provider
    <SkyStateProvider account project environment>
  • Read public state with a hook
    usePublicState('banner', fallback) → { value }
  • User state, scoped to each identity
    useUserState('theme', 'light') → { value, set, draft }
  • Framework-agnostic core
    createSkyStateClient(...).publicState.get()
SDK docs →
app.tsxTSX · UTF-8
React@skystate/react
<SkyStateProvider account="acc_xyz" project="my-app" environment="production">
<App/>
</SkyStateProvider>
 
const { value: banner } = usePublicState('banner', { enabled: false })
const { value: theme, set, draft } = useUserState('theme', 'light')
Core@skystate/core · framework-agnostic
const client = createSkyStateClient({
account: 'acc_xyz',
project: 'my-app',
environment: 'production'
})
await client.init()
 
const banner = client.publicState.get('banner', { enabled: false })
03 / CONSOLE

Start in
the console

Sign in, name a project, and edit public state per environment. Every save creates a version.

  • Public-state editor for every environment
  • Version history with prior-version diffs
  • Conflict-aware saves, stale writes detected
  • API keys, end-user auth settings, billing in one place
Open console →
console.skystate.io / my-app
State
Public config and user state for the selected project.
{ }

Public

Versioned state readable through the SDK, API, or CLI.

v12
DevelopmentStagingProduction
{
  "featureFlags": {
    "darkMode": true,
    "newCheckout": false,
    "maxUploadMb": 25
  },
  "banner": {
    "enabled": true,
    "text": "Widget Pro 2.4 is here!"
  }
}
@

User

User state, scoped to each signed-in identity.

example
JDuser_123sample
AMuser_456sample

Or jump
to the CLI

04 / CLI
~/my-app — sky
# two lines from nothing to running — no infra to stand up
$ npm i -g skystate
added 1 package in 1.8s
 
$ sky onboarding
✓ Guided — picks a project, configures starter snippets, can create API keys
✓ Ready · jane@widget.io · my-app
# push a JSON file as the new public state for an environment
$ sky state public push --file flags.json --project my-app --env staging
✓ Pushed staging · v7 · 2 keys changed
 
$ sky state public show --project my-app --env staging
{ "banner": { "enabled": true }, "limits": { "maxItems": 50 } }
$ sky state public diff --from stg --to prod --project my-app
staging (v7) → production (v12) · 2 updated
"banner": {
- "enabled": false,
+ "enabled": true,
"limits": {
- "maxItems": 25,
+ "maxItems": 50,
# promote the known-good version; stale writes are refused
$ sky state public promote --from staging --to production --project my-app
✓ Promoted → production · v12
 
$ sky state public patch /banner/enabled true --expect-version 9 --project my-app --env prod
✗ Rejected: production is at v12, expected v9
Every step scriptable with project API keys · version-guarded writesCLI reference →
sdk underneath · rest api
05 / REST API

REST API

Use our REST API directly. Authenticated writes use If-Match, and RFC 6902 JSON Patch lets you update exactly the fields you need.

API reference →
GET[01]
Anonymous public read
/v1/readonly/:acc/projects/:slug/public-state/:env
KEY[02]
Project-scoped API key
Authorization: ApiKey sky_…
BEARER[03]
Developer bearer token
Authorization: Bearer <jwt> · account-scoped
PATCH[04]
Partial writes, no redundant payload
RFC 6902 JSON Patch (application/json-patch+json)
412[05]
Writes gated by If-Match
If-Match: "<version>"412 on mismatch, version bumps
PUT[06]
Full-document replace
PUT + If-Match · whole-state write

Simple
pricing

07 / PRICING
Free
€0
  • 3 projects
  • 3 environments / project
  • 25,000 API requests / mo
  • 100 stored users
  • No state history
  • 3 business day support target
Get started
Hobby
€7 /mo
excluding tax
  • 7 projects
  • 3 environments / project
  • 250,000 API requests / mo
  • 1,000 stored users
  • 5 days state history
  • 3 business day support target
Get started
Pro
€22 /mo
excluding tax
  • 15 projects
  • 3 environments / project
  • 2,000,000 API requests / mo
  • 10,000 stored users
  • 30 days state history
  • Priority support
Get started

Payments are processed by Creem, our merchant of record.