~/nouns

nouns

a REST API that builds REST APIs. and the UI for them.

you make API calls. nouns builds the backend, the JWT-protected end-user accounts, the OpenAPI spec, and a hosted, themable customer-facing site — all from JSON definitions you POST.

no migrations, no models, no deploys, no frontend build. define a noun, define a page, ship.

try it now see an example self-host


how it works

1. sign up. get a key.

# one customer = one developer account.
POST /customers/signup
{ "email": "you@example.com", "password": "..." }

# → token + your customer uuid (lives in your app's URLs).

2. make an app.

POST /apps
{ "slug": "todo" }

3. define a noun.

POST /apps/todo/nouns
{
  "name": "task",
  "fields": { "title": "string", "done": "bool", "priority": "int" },
  "enabled_actions": ["list", "create", "partial_update", "destroy"],
  "filterable_fields": ["done"]
}

4. you have a backend.

# end-users sign up here:
POST /<your_uuid>/todo/auth/signup

# they CRUD their tasks at:
POST   /<your_uuid>/todo/task         # create
GET    /<your_uuid>/todo/task         # list (?done=false works)
PATCH  /<your_uuid>/todo/task/<id>    # update
DELETE /<your_uuid>/todo/task/<id>    # delete

# live OpenAPI 3 spec + Scalar docs at:
GET /<your_uuid>/todo/openapi.json
GET /<your_uuid>/todo/docs

5. ship a UI for it.

# declare a few pages — table, cards, form, or detail layouts:
POST /apps/todo/pages
{
  "slug": "tasks",
  "title": "All Tasks",
  "layout": "table",
  "noun": "task",
  "columns": ["title", "done", "priority"],
  "actions": ["create", "edit", "delete"]
}

# wire them into a navigation block:
PUT /apps/todo/navigation
{ "items": [{"label": "Tasks", "page": "tasks"}] }

# (optional) brand it with three CSS knobs:
PUT /apps/todo/theme
{ "bg": "#1a0033", "fg": "#ff66cc", "accent": "#ffcc00" }

# your end-users land here, no frontend code required:
GET https://nouns-app.pages.dev/site/<your_uuid>/todo/tasks

that's the whole loop. tables are inline-editable, references auto-expand, m2m fields render as multi-selects, and your end-users sign in with the auth you got for free in step 4.

a runnable, fully-commented worked example — workout tracker — shows the entire flow in ~150 lines of bash.


what's in the box


what's not in the box (yet)

they show up when someone actually needs them.


get started

the easiest way: just sign up at the hosted admin, paste a mermaid ER diagram into /admin/import, and you have a live app in seconds. or follow the workout-tracker walkthrough end-to-end.

prefer to self-host?

git clone <repo> nouns
cd nouns/api
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python manage.py migrate
.venv/bin/python manage.py runserver 127.0.0.1:8766

then visit the CRUD client at localhost. full deploy walkthrough in DEPLOY.md.