Multi-tenant SaaS for residential buildings
Recebe Avisa
Receives, logs and notifies. On its own.
- Year
- 2026
- Role
- Product · Backend · Frontend · Infrastructure · Observability
- Status
- MVP in development
Private repository — this case study is the project's public record. A public demo is being prepared with an isolated environment and fictional data.
The problem
Package handling in residential buildings still runs on notebooks, spreadsheets and group chats. The doorman writes by hand at peak hours, the resident only learns a package arrived when they walk past the desk, and when something goes missing there is no record of who received it or who picked it up. The friction is daily and it lands on the front desk.
The solution
The doorman photographs the label straight from the phone's browser. The API reads the text with OCR, finds the resident through fuzzy search and fires the notification on their preferred channel — WhatsApp, Telegram or e-mail — falling back automatically if the first one fails. Pickup closes the loop and leaves an auditable record.
Technical decisions
- 01
OCR never blocks the record
The scan route always answers success. If OCR fails, comes back unreadable or low-confidence, the flow degrades: the label is recorded anyway and the doorman confirms the resident from ranked suggestions or manual search. A front desk at peak hour cannot stall over a crumpled label — and that is the difference between a system that gets used and one that gets abandoned in week one.
- 02
Fuzzy search instead of exact matching
The name printed on a label almost never matches the registry: it arrives abbreviated, under the buyer's name, without accents or misspelled by the sender. Matching uses trigram similarity plus per-resident aliases, returning ranked suggestions rather than a binary hit or miss.
- 03
Multi-tenant by column, filtered in every query
Every table carries the building identifier and no query ever crosses tenants — that's an architecture rule, not a convention. A building-management SaaS that leaks data between clients does not get a second commercial chance.
- 04
Personal data out of telemetry, with an automated gate
Telemetry is OpenTelemetry collected by an agent that strips PII inside the VM, before anything leaves it. A PII checker runs in CI and breaks the build if personal data shows up in a span, metric or log. The gate isn't theoretical: a real leak, caused by how the ORM interpolates values inside SQL, is what drove query normalization before they become span attributes.
- 05
Zero cost as an architectural requirement
The whole MVP runs on free tiers: an ARM VM on Oracle Cloud, a thousand OCR requests a month, WhatsApp Cloud API and free-tier observability. Managed queues and paid services only enter past fifty buildings. Declaring the cost constraint up front avoids the architecture that gets expensive before it has a customer.
What shipped
- API with role-based auth, resident registry with aliases, full intake and pickup flow, and a manager dashboard
- 27 automated tests over the API (Jest + supertest)
- Full CI/CD: ARM64 image published to the registry, deploy over a private network without opening a single new port, smoke test and automatic rollback
- Observability as code: versioned dashboards and 13 alerts, notified over Telegram
- Infrastructure in Terraform on Oracle Cloud, with 30-day object expiry and a budget alert
- Working front-desk app running in a test environment
Stack
- React 18
- Vite
- Node.js 20
- Express
- Sequelize
- PostgreSQL 15 · pg_trgm
- Cloud Vision OCR
- WhatsApp Cloud API
- Terraform · OCI
Other projects
Talk about a projectSuper Juice
The bartender's math, done in three taps.
Native Android app in Kotlin and Jetpack Compose that calculates citrus super juice: weigh the peels and it returns the exact grams of each acid and of water. Offline, no permissions, three languages.
- Kotlin
- Jetpack Compose
- Room
- DataStore
Veredito
What's worth your time today.
Streaming catalog ranked by rating, built on Next.js 14 with the API key kept server-side and a shared 24-hour cache.
- Next.js 14
- App Router
- React 18
- TMDB API
Triarquia
Save, invest, grow — in that order.
A product study in personal finance: a dashboard that unlocks the investing pillar only once debt is under control, with an AI advisor reasoning over backend-computed numbers. It exists as a personal-use prototype.
- React
- Vite
- Tailwind CSS
- Flask