Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Getting Started

Build from source

Substrukt requires Rust nightly (2026-01-05 or later).

git clone https://github.com/wavefunk/substrukt.git
cd substrukt
cargo build --release

The binary is at ./target/release/substrukt.

Run it

./target/release/substrukt serve

Or during development:

cargo run -- serve

The server starts on http://localhost:3000 by default.

First-run setup

On your first visit, Substrukt redirects you to /setup where you create an admin account. This only happens once – when there are no users in the database.

  1. Open http://localhost:3000 in your browser
  2. Enter a username and password on the setup page
  3. You are logged in and redirected to the dashboard

Create your first schema

Navigate to Schemas in the sidebar and click New Schema. Paste in a JSON Schema definition:

{
  "x-substrukt": {
    "title": "Blog Posts",
    "slug": "blog-posts",
    "storage": "directory"
  },
  "type": "object",
  "properties": {
    "title": { "type": "string", "title": "Title" },
    "body": { "type": "string", "format": "textarea", "title": "Body" },
    "published": { "type": "boolean", "title": "Published" }
  },
  "required": ["title"]
}

Click Save. The new content type appears in the sidebar.

Create content

Click Blog Posts in the sidebar. Click New Entry. Fill in the form fields that were generated from your schema and save. The entry is stored as a JSON file at data/content/blog-posts/<id>.json.

Access via API

Create an API token in Settings > API Tokens. Use it to fetch content:

curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost:3000/api/v1/content/blog-posts