VNTP Location
Rental management for landlords, furnished lets included, with a tenant space.
- Role
- Founder, solo full-stack design and development
- Period
- Dec 2025 – ongoing · VNTP
- Stack
- PHP 8.5
- Symfony 8
- Doctrine ORM 3
- PostgreSQL
- Claude API
- INSEE API
- Stripe
- Symfony Voters
- Web Push
- ClamAV
- FrankenPHP
- PHPUnit
Context
Managing a few flats yourself is a series of repetitive tasks full of pitfalls: computing the rent review, sending receipts, splitting building charges, preparing the furnished-let (LMNP) tax return. I first built it for myself, then opened it to other landlords.
Features
- Properties, leases and tenants; rent, payments and receipts sent by e-mail.
- Annual rent review: the reference rent index (IRL) is fetched automatically from INSEE's open API, and the new rent computed and proposed to the landlord.
- Building service-charge calls read by AI: the landlord uploads the PDF, even a scan. The Claude API extracts every line (provisions, special charges, works fund, voted works, adjustment) into schema-constrained JSON, which the landlord checks before import.
- Expenses and LMNP tax summary, with an export for the return.
- Tenant space: shared documents, receipts, Web Push notifications.
- Stripe subscription per flat, with a trial period.
Architecture and security
- Shares the technical foundation of VNTP Facturation: Symfony 8, PHP 8.5, FrankenPHP, Messenger.
- Three roles (tenant, owner, admin): every access goes through Symfony Voters and an owner context. An owner only ever sees their own properties, and tests cover it.
- Documents stored outside the web root, antivirus-scanned on upload, served only after an access check.
- AI reading can be turned off: with no key configured, input stays manual and nothing goes to a third party.
Technical challenges
- Making LLM extraction reliable on heterogeneous documents (every managing agent has its own layout): precise domain instructions (never the building's budget or shares, tell the previous balance apart from the period's call), schema-constrained output, and human review before anything is saved.
- The calculation rules for the rent review and adjustments, tested with a frozen clock.