Content

Blog with Comments

Public-read posts and comments, authenticated authors, owner-scoped edits.

authpublic-readfilescascade

What you get

Schema

Copy and apply with PUT /v1/schema or set_schema via MCP. MoonDB auto-creates 3 tables: users, posts, comments.

blog.schema.json
{
  "tables": {
    "users": {
      "auth_table": true,
      "columns": {
        "display_name": "string required max_length 80",
        "avatar": "file"
      }
    },
    "posts": {
      "columns": {
        "title": "string required max_length 200",
        "slug": "string required unique",
        "body": "text required",
        "cover_image": "file",
        "published": "bool default false",
        "user_id": "ref users required"
      },
      "owner_field": "user_id",
      "access": {
        "read": "public",
        "create": "auth",
        "update": "owner",
        "delete": "owner"
      }
    },
    "comments": {
      "columns": {
        "post_id": "ref posts required cascade",
        "body": "text required max_length 2000",
        "user_id": "ref users required"
      },
      "owner_field": "user_id",
      "access": {
        "read": "public",
        "create": "auth",
        "update": "owner",
        "delete": "owner"
      }
    }
  }
}

Auto-generated endpoints

The moment the schema applies, this REST surface is live (replace {project_id} with the id returned by POST /v1/projects):

live endpoints
GET    /api/users                  list/filter/sort/paginate
GET    /api/users/{id}             read one
POST   /api/users                  create
PATCH  /api/users/{id}             partial update
DELETE /api/users/{id}             delete
POST   /api/users/bulk             atomic bulk insert
POST   /auth/signup                 (from this auth_table)
POST   /auth/login                  (from this auth_table)
GET    /auth/me                     Bearer {token}

GET    /api/posts                  list/filter/sort/paginate
GET    /api/posts/{id}             read one
POST   /api/posts                  create
PATCH  /api/posts/{id}             partial update
DELETE /api/posts/{id}             delete
POST   /api/posts/bulk             atomic bulk insert

GET    /api/comments                  list/filter/sort/paginate
GET    /api/comments/{id}             read one
POST   /api/comments                  create
PATCH  /api/comments/{id}             partial update
DELETE /api/comments/{id}             delete
POST   /api/comments/bulk             atomic bulk insert

Plus auto-generated /v1/openapi.json (OpenAPI 3.0.3) and /v1/llm-context (machine-readable agent reference) for any client generator or coding agent.

Apply via REST

terminal
# 1. create the project
curl -X POST https://api.moondb.ai/v1/projects \
  -H "X-API-Key: mk_..." \
  -H "Content-Type: application/json" \
  -d '{"name":"blog"}'

# 2. apply the template schema
curl -X PUT https://api.moondb.ai/p/{project_id}/v1/schema \
  -H "X-Admin-Key: sk_..." \
  -H "Content-Type: application/json" \
  -d @blog.schema.json

Apply via MCP

If your agent has the MoonDB MCP server installed (see install), one tool call applies the template:

tools/call set_schema
# call set_schema via MCP (Cursor, Claude Code, Windsurf)
{ "jsonrpc": "2.0", "id": 1, "method": "tools/call",
  "params": { "name": "set_schema", "arguments": {
    "project_id": "...",
    "schema": {
        "tables": {
            "users": {
                "auth_table": true,
                "columns": {
                    "display_name": "string required max_length 80",
                    "avatar": "file"
                }
            },
            "posts": {
                "columns": {
                    "title": "string required max_length 200",
                    "slug": "string required unique",
                    "body": "text required",
                    "cover_image": "file",
                    "published": "bool default false",
                    "user_id": "ref users required"
                },
                "owner_field": "user_id",
                "access": {
                    "read": "public",
                    "create": "auth",
                    "update": "owner",
                    "delete": "owner"
                }
            },
            "comments": {
                "columns": {
                    "post_id": "ref posts required cascade",
                    "body": "text required max_length 2000",
                    "user_id": "ref users required"
                },
                "owner_field": "user_id",
                "access": {
                    "read": "public",
                    "create": "auth",
                    "update": "owner",
                    "delete": "owner"
                }
            }
        }
    }
  } } }

Prompt your agent

Or just paste this one-liner into Cursor / Claude Code / Lovable after the MoonDB prompt is in .cursorrules / CLAUDE.md:

prompt
Apply the MoonDB "Blog" template — users (auth_table) with avatar, posts (public read), comments (cascade on post delete), all owner-scoped writes.

Extending the template

Send the full updated schema (with your additions) to PUT /v1/schema — MoonDB diffs against the current version and auto-migrates. Destructive changes (dropping columns, narrowing enums, renaming) require "confirm_destructive": true in the body. Read more about schema updates →

Ship this in 30 seconds

Sign up free, create a project, paste the schema. The API is live before your kettle boils.

Get an API key

Related templates

Productivity

Todo App

Classic personal task list with auth, owner-scoped writes, and priority enums.

Productivity

Habit Tracker

Daily habits with composite-unique logs (one entry per habit per day).

Productivity

Bookmarks Manager

Single-table demo with JSON tags and per-user privacy.

Copied to clipboard