Initial scaffold: an AI-first property management monorepo

2026-03-29

First commit of anything substantial on honest-cam. The shape of the project is a monorepo with Python for the data and AI pipelines and a TypeScript slot reserved for a future API and UI. The first real piece of code is a document reorganization engine that can take the prior management company's 958-PDF mess and sort it into a clean canonical layout without any manual fiddling.

What's in the box

  • Monorepo scaffold. packages/py/ for all Python work (ingest, CLI, eventually portal); space carved out for packages/ts/ later.
  • Document reorganization enginepropco reorg bamboo-house. Reads a YAML mapping file that specifies old-folder → new-canonical-folder rules, walks the inbox, and classifies every PDF.
  • SHA-256 idempotency. Every copied file is hashed; re-running the command is a no-op because existing destinations are detected and skipped. Duplicates in the source are flagged but not re-copied.
  • Bamboo House property configproperties/bamboo-house/property.yaml with account numbers, utility providers, DBPR info extracted from filenames the old PM used. properties/bamboo-house/mapping.yaml holds the old→new folder rules.
  • CI — Ruff lint + pytest on every push. 32 unit tests covering classification, folder matching (including trailing-space gotchas in real-world folder names), hashing, and the dry-run / execute split.

First real-dataset run

Found 958 files in inbox
  To copy:        941
  Already exist:  0
  Duplicates:     17
  Uncategorized:  0
Copied 941 files.

Zero Uncategorized is the stat I care about most — it means the YAML mapping covers every folder the old PM actually used, no files falling through. Seventeen duplicate SHA-256s also seems plausible for a hand-managed archive.

Re-run, same inbox:

  To copy:        0
  Already exist:  958
  Duplicates:     0

Idempotency proven. That matters because the reorganize step is the entry to the whole pipeline — every later stage (OCR, field extraction, Xero sync) will run on the output of this, and I need to be able to re-run without fear.

Key files

FilePurpose
packages/py/src/propco/ingest/reorganize.pyCore reorganization engine
packages/py/src/propco/cli.pyTyper CLI entrypoint
packages/py/src/propco/config.pySettings, property registry, path resolution
properties/bamboo-house/mapping.yamlOld → new folder mapping rules
properties/bamboo-house/property.yamlProperty metadata
logs/bamboo-house/reorganize-2026-03-28.mdAudit log from first run

What comes next

The next thing to land is the OCR pipeline that reads each categorized PDF and pulls structured fields out into JSON sidecars. Then a Xero sync so the extracted invoices actually turn into bookkeeping entries. The project is called "propco" for now — that name won't survive — but the shape is already clear: ingest, enrich, sync, report.


PR: https://github.com/StevieIsmagic/honest-cam/pull/1