Personal project

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.

← Back to the portfolio