Case study · 03 / 03

Project overview
A planned SaaS tool for building managers: residents report faults by QR code, voice or e-mail, contractors work from a link, and every job ends with a PDF protocol and acceptance. Only the foundation exists so far.
- Status
- In development
- Source
- Private repository
Problem
A building manager receives a report, has to pass it to a contractor, follow the case and later show that the repair was done. Today that happens across phone calls, e-mails and spreadsheets. obiekt.io is meant to keep the whole path, from report to acceptance, in one place.
Product and users
For: building managers, their contractors and the people who report faults. The intended product (a goal, not a working feature):
- Report a fault by scanning a QR code, by voice or by e-mail, with no account and no app
- Send the job to a contractor as a link, with the exact location and entry route
- Follow the case through blocks, a completion form and a PDF protocol
- Accept the repair, or send it back, and keep the history of the building
- See a monthly report, shareable with a residents’ board by link
What is coming
The repository is at the end of its foundation stage. Most of the work is still ahead, and this is the order it is planned in. Nothing below the first line exists yet.
- Done · Foundation
- Three service skeletons (a web page in three languages, a Spring Modulith core with 15 modules, a FastAPI service), initial API contracts, a local Docker Compose environment and the engineering rules.
- Next · Core flow
- Organizations and roles, buildings with exact locations and QR labels, tickets and work orders, assignment, and the contractor link with SMS verification.
- Next · Completion
- The completion form, versioned PDF protocols, acceptance by the manager, notifications and the entry-code vault.
- Later · Channels and AI
- The voice assistant, e-mail intake, AI classification with Polish, English and Ukrainian translation, and the danger-alert path.
- Later · First pilot
- Monthly reports, monitoring, backup and restore drills, a security review and a first pilot with a residential property manager.
- Later · After the pilot
- An office-building profile (zones, tenants, on-site teams), connectors to property-management software and a searchable knowledge base per building.
Architecture
A planned modular monolith: one Spring Boot core owns permissions, state changes and background jobs, a separate FastAPI service only returns AI proposals, and PostgreSQL keeps the facts with every row tied to an organization. Voice runs on ElevenLabs and calls back into the core through a few narrow tools.
Next.js 16 · React 19
Public pages · panels · contractor link
Next.js 16
Pages · panels
ElevenLabs
Intake by voice, tools back into the core
ElevenLabs
Voice intake
Spring Boot 4.1 · Modulith
15 modules · permissions · jobs
Spring Boot 4.1
15 modules
FastAPI · Python
Classification · translation
FastAPI
AI proposals
Facts, jobs and audit
Isolated per organization
+ pgvector
Per-org rows
S3-compatible
Photos and PDF protocols
S3-compatible
Photos · PDFs
The core decides everything that has consequences: who may see what, which state a job may move to, what a contractor may read. The AI service never writes to the database, and the voice agent can only call a handful of core tools.
Engineering challenges ahead
Isolation between organizations
Every row belongs to one organization and the database enforces it with row-level security. Tests generated from the API check that one customer never reads another’s data.
Entry codes for contractors
Codes are encrypted, shown only to a verified phone on the right job, and never copied into logs, AI prompts, documents or the browser cache.
Voice intake that cannot lose a report
The draft is saved while the call is running, the case number is given only after saving, and a tool call and the final webhook must never create two tickets.
Jobs that survive restarts
State changes and events are saved together, background jobs retry safely, and reminders still fire once after a restart.
Technical decisions and trade-offs
| Decision | Why | Trade-off |
|---|---|---|
| Contractors work through links, not accounts | No passwords or installs: a link opens one job, and the phone is verified by SMS before codes appear. | A link can be forwarded. The SMS check, a limit of three phone numbers and the end of access at acceptance contain that. |
| Costs stay outside the app | Prices, quotes and invoices are agreed between manager and contractor. The app only records that consent was given and lists the work done. | No cost reporting at first. Invoice import is a later step. |
| A modular monolith with module boundaries checked by a test | One deployable core is simpler to run, and an architecture test fails the build when a module reaches into another. | Most business modules are still empty and will be filled task by task. |
| API contracts as the single source of truth | OpenAPI and JSON Schema generate the TypeScript and Python models, so web, core and AI service share one definition. | Only initial contracts exist so far; the internal definitions have no paths yet. |
Stack
Application skeletons (built)
- Next.js 16
- React 19
- TypeScript
- Java 25
- Spring Boot 4.1
- Spring Modulith
- Python
- FastAPI
Platform (planned)
- PostgreSQL + pgvector
- Row-level security
- S3-compatible storage
- Keycloak (OIDC)
- OpenAPI contracts
- Docker Compose
Integrations (planned)
- ElevenLabs voice agents
- E-mail in and out
- SMS
- LLM provider (to be chosen)
- PDF generation
Testing and quality
What is checked so far is recorded in dated local reports in the repository. No passing CI run is claimed yet.
- Checked so far
- The core architecture test over 15 modules, the web build with a Playwright smoke test and accessibility scan, and a health test for the AI service.
- Planned checks
- Isolation tests for every endpoint, a canary test for entry codes, voice and AI evaluation sets, load tests and a restore drill before the pilot.
- Evidence limits
- Local runs on one machine. No CI result, no business endpoints or tables, no full login and no AI features yet.
Screenshots
Pinned screenshots from a local run of the project. It is not deployed, so there is no live demo.

Source code
No public link.
igorkadziela.dev/projects/obiekt-io