Django-style model admin
@admin.register, list_display, list_filter, search_fields, ordering, actions. Every name is checked against the model when the admin is built, so a typo is a start-up error listing all of them — not a 500 the first time somebody opens that page.
Deletes you can trust
The confirmation walks the graph before anything is written and counts what actually goes: rows that cascade, rows kept with the link cleared, and rows that block the delete outright — refused with a sentence rather than a constraint violation.
A UI you will not want to replace
Light and dark, brand colour from one number, ⌘K command palette, full keyboard navigation and a real mobile layout. Every control works with JavaScript switched off; the script upgrades them and gets out of the way.
Production-grade auth
Argon2id hashing, JWT access and refresh, token rotation with reuse detection, login lockout with a growing delay, CSRF on every form, and a CSP that starts at default-src 'none'.
Every column type
Text, money, durations, UUIDs, JSON, hstore, arrays, enums, ranges and multiranges, inet/cidr/macaddr, bit strings — each with a real control, real validation and a filter where one makes sense. register_type adds your own.
PostGIS, drawn and edited
All seven geometry kinds on a hand-rolled slippy map — point, line, polygon with holes, and the multi-shapes. Spatial filters: within, intersects, and “5 km from here”, in metres on a geography column.
Vector search
pgvector columns ranked by similarity. ?embedding__near=[…] with cosine, L2, L1 or inner product, a neighbour count and a distance bound — an ordering that beats whatever else the page was asked for.
Eleven languages, shipped
English, Uzbek, Russian, Turkish, German, French, Spanish, Chinese, Japanese, Korean and Arabic — the last right-to-left, which turns the whole layout around from one attribute. The catalogues are in the wheel; there is nothing to configure.
Export and import
The current view out as CSV, Excel or JSON with filters and ordering intact — and back in again through the same parsers the form uses, every bad cell reported at once with its line number, and nothing written unless the whole file parses.
Two ORMs, one admin
SQLAlchemy 2.0 and Tortoise behind one adapter contract, with a conformance suite that asks both the same questions over identical models — so “the second one behaves the same” is a test rather than a claim.
A CLI that matters
createsuperuser, so a fresh install has a way in. check --deploy, which exits non-zero on a configuration that is not safe to expose. generate-secret, which prints and never writes.
No Node.js. None.
The CSS and JavaScript are hand-written files inside the package, served Brotli-compressed with a gzip fallback. 24 KB of CSS and 29 KB of script on the wire, and a size budget in the test suite that fails when it grows.