Person dossier aggregator from official sources
A system that keeps a dossier per person and, on request, queries official public and private sources over their APIs, then assembles what they return into one reviewed record.
§01 The case in detail
- Task
- Collect information about a person from official registries and sources in one place: the dossier is stored, refreshed on request, and every access is controlled and logged.
- Approach
- Celery and Redis, 9 queues; one source failing does not block the others, the reason for the skip is logged
- Sources: official public and private registries and sources, queried over their APIs
- A single person/company card with manual enrichment
- An audit log in its own database schema
- AES-256-GCM for stored reports, bcrypt, TOTP; secrets in a self-hosted vault; 7 roles
- Stack
- FastAPI · server-rendered admin + Telegram bot · PostgreSQL 16 behind two poolers · Celery + Redis, 9 queues · MinIO · Caddy
| Commits | 2,701 |
|---|---|
| Days | 123 |
| First commit | 12.05.2026 |
| Python incl. tests | ~222,000 lines |
| Tables | 78 |
| Tests | about 6,185 |
| Reviews | red/blue team reports |
Architecture
Architecture as text: who passes what to whom
Dossier request
- Operator ↔ Caddy: queries
- Caddy ↔ FastAPI: proxy
- FastAPI → Celery + Redis: enqueue
- Celery + Redis → Workers: dispatch
- Workers → Adapters: run lookups
- Adapters ↔ Official sources: query / records
- Workers → PostgreSQL: results
- PostgreSQL → FastAPI: dossier
Operator bot
- Telegram user → Telegram API: commands
- Telegram API → Operator bot: webhook
- Operator bot ↔ FastAPI: internal calls
- Operator bot → Telegram API: results
- Telegram API → Telegram user: messages
Report
- Workers ↔ LLM provider: text / summary
- Workers → MinIO: report, encrypted
Alerts + backup
- Workers → Telegram API: alerts
- Workers → Mail relay: invites, codes
- PostgreSQL → pgBackRest: WAL, base
- pgBackRest → Offsite copy: encrypted copy
§02 Public records aggregation: person dossier from official registries
- Problem
- Collect information about a person from official registries and sources in one place, with the dossier stored, refreshed on request, and every access controlled and logged.
- Approach
- On request the system queries official public and private sources over their APIs through per-source adapters on Celery and Redis (9 queues). A failing source does not block the others, and the reason for the skip is logged. Results are assembled into one person card with manual enrichment.
- Outcome
- One reviewed dossier per person, built from what the official sources return, with 7 roles, TOTP sign-in, encrypted stored reports and an audit log in its own database schema.
Short answers
- What is a person dossier aggregator?
- A system that keeps a dossier per person and, on request, queries official sources and assembles what they return into one reviewed record.
- Where does the data come from?
- From official public and private registries and sources, queried over their APIs on request.
- What happens when one source is unavailable?
- It does not block the others. The source is skipped and the reason is logged.
- How is access to a dossier controlled?
- By 7 roles and TOTP sign-in, and every access is recorded in an audit log kept in its own database schema.
- How are stored reports protected?
- Reports are stored with AES-256-GCM, passwords are hashed with bcrypt, and secrets live in a self-hosted vault.
- Can a dossier be corrected or extended by hand?
- Yes. Each person has a single card with manual enrichment, and the dossier is reviewed.
See also: Process and quality audit Approval system for financial requests.
§03 Related
- CRM for a network of martial-arts clubsWhatsApp funnels, reports, trainer pay
- Approval system for financial requestsPersonal project: rules as data, encryption, audit log
- Team forecasting systemDeterministic Monte Carlo, no LLM on the numbers
- LLM integration into working systemsWire a model into the POS, booking, CRM, messengers
- Process and quality auditA written list of fixes ordered by cost
Have a task like this? Write to me.
Send me a message
It goes straight to my Telegram. I reply to the address you leave.