Domus
A household management system.
Overview
Domus is where I keep household records. Today that's an inventory of the stuff we own and a filing cabinet for family documents. More may come; the name is broader than the current scope on purpose.
Inventory replaces homebox. Documents replace paperless-ngx. Both do more than I need, and I want to keep only the parts I'll actually use.
Scope is one household. No multi-tenancy, no public sharing, no login screen — and no authentication in the app at all. The only way in is over my Tailscale network, so access control lives entirely at the network layer.
Domain model
Tags
Any entity in the system can have tags. A tag is a short label — "garage," "kitchen," "pending." Tags also support a key:value form — "location:garage," "status:sold," "year:2023" — where the key names a dimension and the value qualifies it. Plain and key-value tags coexist freely on the same entity.
Key-value tags make it possible to group and filter by structured dimensions without dedicated schema fields. "location:garage" is both the label "garage" and a statement that the relevant dimension is "location."
Assets
An asset is something I own worth tracking. Each asset has:
- a markdown description, with the first line as the display name
- tags, primarily for location
- purchase information: where I bought it, when, how much, optional receipt
- a maintenance log for things that need periodic attention
Purchase dates are fuzzy. Some receipts are decades old, and forcing an exact day when I only remember the year is friction I don't want. A purchase date can be a year, a year and month, or a full date.
Documents
A document is any file the household wants to keep findable — tax returns, school records, contracts, warranties, manuals, medical paperwork. Supported file types include PDFs and images. Documents don't have to relate to the home itself; the inventory is one source of documents, not the only one. Documents have tags. OCR comes later.
Where a document does relate to an asset (a receipt, a manual), the two cross-reference each other.
Stack
Same shape as ketchup: Roda for routing, Sequel and SQLite for persistence, Phlex for views, Alpine.js on the client, Puma serving it.
Status
Early. No code yet — this README is the design sketch.