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.
- Open
http://localhost:3000in your browser - Enter a username and password on the setup page
- 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