Neil Camm
All projects

totalHOA

Multi-tenant SaaS for HOA community management.

Role
Founder & Developer
When
Since 2024
Stack
  • Laravel
  • Livewire
  • PostgreSQL
  • React
  • TypeScript
  • Stripe Connect
  • OpenAI

Boards get governance tools and day-to-day workflows, and residents get a portal branded as their own neighborhood. I started it in 2024 as a side project for the HOA I live in, while I was at Cardinal Financial. Twenty architecture tests hold rules across the codebase, like no AI model call leaving the app without being logged.

Nova

An AI assistant that answers residents and board members from the association's own documents.

  • It proposes, people decide. Every write is a proposal a person confirms.
  • It only sees what the resident can. Retrieval with pgvector in PostgreSQL, scoped to one community and that resident's access.
  • It would rather not answer than guess. It declines when nothing matches closely enough. I tune that against 92 questions, 41 of which it should refuse.
  • It has to show its work. An answer with no citation or tool call behind it becomes a refusal, so even a prompt injection that gets through shows the resident nothing.
A resident asks about a change to their home. Nova answers from the governing documents, then proposes the request and waits for a yes.

A resident asks about a change to their home. Nova answers from the governing documents, then proposes the request and waits for a yes.

Multi-tenancy

Every community shares one PostgreSQL database, and 262 of the app's 309 models are scoped to a community.

  • The scope fails closed. When the hostname doesn't name a community, reads come back empty and writes are refused.
  • A test walks the route table. An admin of one community with all 99 permissions requests another community's record on every signed-in page that loads one. Anything but a 403 or 404 fails.
  • New domains need no server config. The edge server issues a TLS certificate on the first visit, once the app confirms the domain. More in Three Servers, One Door, Zero Downtime.
An admin of one community, holding every permission, asks for another community's records by URL and is refused each time. The last line checks they can still open their own.

An admin of one community, holding every permission, asks for another community's records by URL and is refused each time. The last line checks they can still open their own.

Billing and collections

A ledger for each community's dues, from assessments and late fees to liens and collections.

  • Fees follow local rules. Late fees can be capped by jurisdiction, with presets for seven states, and a late fee is never charged on a late fee.
  • Bankruptcy changes the order. The ledger marks the filing date, and payments go to post-petition charges first.
  • The money never passes through totalHOA. Dues settle in the association's own Stripe account, and I hold no community's secret keys.
A home's transaction ledger. A yellow line marks a Chapter 7 bankruptcy filed Feb 1, 2026. Interest and late fees dated after it are marked written off.
One home's ledger after a Chapter 7 filing. The interest and late fees posted after the filing show as written off.
A home's transaction ledger. A yellow line marks a Chapter 7 bankruptcy filed Feb 1, 2026. Interest and late fees dated after it are marked written off.

One home's ledger after a Chapter 7 filing. The interest and late fees posted after the filing show as written off.

Meetings and elections

From the agenda to the approved minutes and the certified result.

  • Executive session stays private. Meetings are recorded in the browser and transcribed, and speech inside a closed session is dropped by its timestamp.
  • Minutes have a checklist. AI drafts them, and the call to order, attendance, quorum and every agenda item have to check out before they go for approval.
  • Secret ballots are secret in the database. The ballot records that the unit voted, and the choice has no link back to it.
The check between AI-drafted minutes and the board's vote. Each warning has to be acknowledged first.

The check between AI-drafted minutes and the board's vote. Each warning has to be acknowledged first.

Block editor

A drag-and-drop page builder, so each community runs its own branded website without code. The first version of this portfolio was built with it.

  • 86 block types. Each is a PHP class with its own schema and validation, and the same editor builds pages, forms and emails.
  • Stored as JSON, rendered by Blade. Pages render on the server, so they stay fast and easy to index.
The block editor. A library of blocks on the left, and an announcement open on the canvas with its text blurred.
Blocks on the left, the page on the right.
The block editor. A library of blocks on the left, and an announcement open on the canvas with its text blurred.

Blocks on the left, the page on the right.