Five commands, all against a module:attribute target — the same spelling ASGI
servers use.
warder check app.admin:adminwarder create-admin app.admin:adminwarder users app.admin:adminwarder permissions app.admin:adminwarder routes app.admin:admin$ warder check app:adminRidgeway College: 13 resources, 2 pages, 53 permissions. Every reference resolves.Resolves every declaration against its models, exactly as mount() does, and
exits non-zero on the first problem — so a misspelled column fails in CI rather
than in production. No server, no port, no database connection; only the models
importable.
$ warder check app:adminResource(Post).list column 'titel' is not a field of Post. Did you mean 'title'? Declared at app.py:292--all reports every problem rather than stopping at the first.
create-admin
Section titled “create-admin”$ warder create-admin app:adminEmail: head@ridgeway.eduUsername [head]:Password:Password again:Created superuser head@ridgeway.edu (username head).Sign in at /admin/loginWrites wherever the admin authenticates from: the column the sign-in form asks
for, only the flags the model actually has, hashed through sillo.hashing. It
prompts only at a terminal — in a script it says which flag to pass rather
than waiting forever for an answer nobody will give.
warder create-admin app:admin --email a@b.c --password "…" --staffwarder create-admin app:admin --email a@b.c --password "…" --set department=4It refuses up front, naming what to do, when:
- the user model is not registered with the ORM — Tortoise’s own answer,
default_connection … cannot be None, says nothing about what to do; - its table has not been migrated in;
- the model cannot hash a password, or has no column matching
Login(field=…); - the model needs a column Warder cannot know about —
--setfills those in.
It writes to the database the application already configured, rather than asking for a second copy of the URL that is a second thing to get wrong.
$ warder users app:adminEMAIL USERNAME ROLE ACTIVE LAST SIGN-INhead@ridgeway.edu head superuser yes 2026-09-02 13:49bursar@ridgeway.edu bursar staff yes neverpermissions
Section titled “permissions”$ warder permissions app:adminattendance.addattendance.change…What the site declares, derived from what is registered — so it is how you seed a fixtures file or write a role against what exists rather than what you remember.
routes
Section titled “routes”$ warder routes app:adminGET,HEAD,POST /admin/login warder.loginGET,HEAD /admin/student warder.student.indexGET,HEAD /admin/student/{id}/edit warder.student.edit…Every URL mounting the admin added — nine per resource, plus pages, the asset mount and login.