Property inspections you actually own.
Raise a job against a unit, cost it, close it — and settle move-out damage with ingoing/outgoing inspection comparison instead of an argument.
PropFix runs as one binary and one SQLite file. A tablet, a laptop, an office NAS or a Raspberry Pi is a complete deployment. Costs are per door, not per ticket — every job belongs to a real unit, so "Flat 3A", "3A" and "flat 3a" are one door, not three rows fragmenting your reporting. Run an ingoing condition report at move-in and an outgoing one at move-out, and PropFix diffs them item by item — damage liability becomes evidence rather than a disagreement.
Two things ticketing tools don't do
Costs aggregate per real unit, and inspections compare — the two structural gaps in general-purpose maintenance software.
Costs per door
Every job belongs to a unit, and spend and labour aggregate per building and per unit. Units are real records with a normalised key.
Ingoing/outgoing comparison
PropFix diffs an ingoing and outgoing inspection item by item — unchanged, deteriorated, improved, or not captured on either side.
Append-only money
A job's cost is a sum over its ledger at read time, never a stored column. Two people costing the same job offline add rather than overwrite.
Peer-to-peer sync
No discovery, no hub. An operator enters a peer's URL; requests are mutually signed with Ed25519. A USB stick is a valid transport.
Building-as-authority
Whoever manages a building owns its jobs and inspections — the only contended decision has one legitimate writer, so there's no consensus protocol needed.
One binary, one file
The React frontend and docs are embedded via embed.FS. Copy the binary, run it — that's the whole install.
What it looks like
The jobs board, per-job costing, reports, and the move-out comparison view — captured from the real binary in demo mode.




Light and dark shots of every surface are in the docs. All are captured from the real binary in demo mode — nothing is mocked up.
Quick start
One binary, one SQLite file. No database server, no Docker requirement, no account.
git clone https://github.com/vul-os/propfix cd propfix npm install && npm run build bash scripts/build-embedded.sh # fully seeded demo, nothing written to disk ./backend/propfix --demo # open http://localhost:8080 # or, a real deployment ./backend/propfix --db /var/lib/propfix/propfix.db \ --addr 0.0.0.0:8080
- 1BuildThe frontend embeds into the Go binary — one file, deployable to a Pi, a NAS, or a VPS.
- 2Demo or real
--demoseeds an in-memory portfolio with no config; a real deployment points--dbat a volume you back up. - 3First runThe first account you register becomes the owner; registration then closes.
Honest about what's built
A feature that silently does nothing is worse than one that says it isn't built.
Built
Jobs, buildings and units, append-only cost/time ledgers, reports, inspections and ingoing/outgoing comparison, auth and org scoping, and peer sync are all built.
In progress
WRAP trades/v0 cross-organisation work orders — sending work to a contractor's own PropFix node with no platform in between.
Designed, not built
A tenant-facing portal, content-addressed photo replication, template versioning, recurring maintenance, and compliance certificates.
Part of VulOS
Vulos is a family of open, self-hostable apps. PropFix runs standalone, and also runs as an app hosted by the Vulos OS — the same binary, with the OS wiring identity and storage in front of it.
Explore Vulos →