Service as Code

Define your backend in JSON. Ship in minutes.

Shiprock turns a JSON schema into a production backend — database, REST + GraphQL APIs, auth, billing, jobs, and 12 more modules. No boilerplate. No vendor lock-in. Just ship.

No spam. Just a heads-up when it ships.

12+
Modules
0
Migration files
100+
Computed functions
1
Command to deploy

How it works

From schema to running backend in three steps.

01

Define your schema

Collections, fields, validation, computed values, security policies. Your schema is the single source of truth.

{
 "collections": {
  "posts": {
   "schema": {
    "properties": {
     "title":  { "type": "string" },
     "status": {
      "enum": ["draft", "published"]
     }
    }
   }
  }
 }
}
02

Pick your modules

Auth, billing, storage, jobs, realtime, email, webhooks, admin. Each module is independent and production-ready.

# shiprock.yaml
auth:
  enabled: true
  providers: [google, github]

billing:
  enabled: true
  provider: stripe

storage:
  enabled: true
  backend: s3
03

Ship

One command. Database tables, REST + GraphQL APIs, OpenAPI docs, admin dashboard, and hypermedia links. All generated.

$ shiprock dev

Shiprock v2.0

collections
  posts    /api/posts  (5 endpoints)

modules
  auth     /auth
  billing  /billing
  storage  /storage

services
  docs     /_docs
  graphql  /graphql
  admin    /_admin

Listening on http://localhost:8080

One schema. Complete backend.

Computed fields, security policies, and API configuration — all declared in JSON. Shiprock generates the database, endpoints, validation, and documentation.

schema.json
{
  "name": "Blog Service",
  "settings": { "basePath": "/api" },
  "collections": {
    "posts": {
      "schema": {
        "properties": {
          "title":   { "type": "string", "minLength": 1 },
          "content": { "type": "string" },
          "slug":    { "compute": "slugify(title)" },
          "excerpt": { "compute": "truncate(content, 200)" },
          "status":  {
            "enum": ["draft", "published", "archived"],
            "default": "draft"
          }
        },
        "required": ["title", "content"]
      },
      "api": { "rest": true, "path": "/posts" },
      "rls": { "enabled": true, "ownerField": "authorId" }
    }
  }
}
what you get
// REST + GraphQL APIs, zero code

GET    /api/posts          List, filter, search
GET    /api/posts/:id     Read one
POST   /api/posts          Create
PATCH  /api/posts/:id     Update
DELETE /api/posts/:id     Delete
POST   /graphql           Full GraphQL API

// Automatic from your schema

slug           computed from title, cached
excerpt        computed from content, cached
RLS            owner-only access enforced in DB
Validation     from JSON Schema constraints
Pagination     ?page=2&limit=20
Full-text      ?q=search+terms
Migrations     auto-generated, auto-run
OpenAPI        /_docs (interactive)
HATEOAS        _links + _forms in responses

Business logic without code

Declarative hooks chain actions together. Create records, send emails, call external APIs, trigger jobs — all from JSON.

hooks -- when a post is created
{
  "hooks": {
    "afterCreate": [
      {
        "action": "create",
        "collection": "activity",
        "data": {
          "type": "post_created",
          "userId": "{{ context.userId }}"
        }
      },
      {
        "action": "email",
        "to": "{{ doc.authorEmail }}",
        "template": "post-published"
      },
      {
        "action": "webhook",
        "url": "https://api.slack.com/notify",
        "body": { "text": "New post: {{ doc.title }}" }
      }
    ]
  }
}

No handler code. No controller files. No middleware chain.

Modules

Production-grade services. Each independent, each opt-in. Enable in one line of YAML.

Auth

JWT, OAuth, sessions, user management.

Billing

Stripe subscriptions, metering, entitlements.

Storage

File uploads with S3, GCS, or local backends.

Jobs

Persistent queues, cron, retries with backoff.

Realtime

WebSocket, presence, live data subscriptions.

Email

SMTP, SES, SendGrid. Templates and delivery tracking.

Webhooks

Outgoing delivery with retry, circuit breakers, HMAC.

Admin

Auto-generated dashboard. Browse data, manage users.

Analytics

Event tracking, funnels, A/B testing, alerts.

Wiki

Versioned pages with markdown and full-text search.

Vector

Embeddings and semantic search over collections.

Functions

Serverless handlers in Go, Node.js, or Python.

What you don't have to build

Every feature below is generated from your schema or enabled with one config flag. Zero application code required.

Computed Fields

100+ built-in functions: slugify, markdown, truncate, date math, aggregations. Cached with automatic invalidation.

Declarative Hooks

Multi-step workflows in JSON. Create records, send emails, call APIs, trigger jobs -- no code required.

Auto Migrations

Schema changes automatically migrate the database. No migration files. No downtime during dev.

Row-Level Security

Per-user data isolation enforced at the database layer. Define policies in your schema, forget about them.

GraphQL + REST

Both APIs auto-generated from your schema. Filtering, pagination, sorting, introspection included.

Batch Operations

Atomic or independent. Up to 100 ops per request in a single transaction.

Document Versioning

Full change history per record. Revert, compare, audit. Git for your data.

Denormalization

Aggregated counts, sums, and lookups that stay in sync automatically. No N+1 queries.

Multi-Tenant

Tenant routing, isolated data, per-org billing, feature flags. SaaS infrastructure out of the box.

Hot Reload

Schema changes apply instantly. No server restart. Database migrates, routes regenerate, connections refresh.

Self-Documenting

Every instance serves OpenAPI docs, interactive explorer, and a unified discovery endpoint.

One-Command Deploy

shiprock deploy fly generates Dockerfile, provisions Postgres, and deploys. Also supports Railway, Render, k8s.

Deploy anywhere

One command generates infrastructure, provisions a database, and deploys.

$ shiprock deploy fly

Creating app          shiprock-blog
Provisioning Postgres shiprock-blog-db
Generating Dockerfile done
Deploying             v1

https://shiprock-blog.fly.dev is live

Also supports Railway, Render, Coolify, Kubernetes, Docker, and raw binaries.

Stop wiring plumbing.
Start shipping product.

Shiprock is under active development. Get notified when early access opens.

No spam. No vendor lock-in. Just a better way to build backends.