Rent Tracker
Rent Tracker is a rent-management web app built with a teammate for a full-stack module at HWR Berlin. It covers the everyday admin of a small landlord — apartments, tenants, agreements and per-month payments — and layers on a reminder system that computes which rents are still outstanding and pushes them out over Telegram or email on a schedule each user sets.
- Role
- Co-developer (team of 2)
- Year
- 2025
- Status
- Completed
- Category
- Software Engineering
- Tools & technologies
- PythonFlaskJinja2SQLiteAPSchedulerpython-telegram-botSendGrid
- Links
- GitHubDocumentation
The problem
Small private landlords track rent in spreadsheets or memory and lose sight of which tenant has paid which month. Rent Tracker centralises that record and turns “did they pay?” into an automatic monthly reminder.
Context
A Full-Stack Web Development module at HWR Berlin, summer semester 2025 (the project ran April–July 2025). The two of us split the work fairly evenly across routes, the reminder service, and the integrations.
Process
Computing what’s outstanding
The core logic isolates reminder computation in a single service: the unpaid-rent window is computed over a rolling range of months and cross-referenced against a set of already-paid (apartment, month) pairs for fast lookups. A nightly job then fans out to each user’s chosen channels.
- CRUD for apartments, tenants, agreements and payments, scoped per user
- Signed, time-limited tokens for email confirmation and password reset
- Per-user reminder day and Telegram/email channel toggles
Key decisions
Channel-agnostic reminders
Delivery is driven by per-user flags (use_email / use_telegram) and a reminder-day field, so the same nightly job can fan out to either or both channels. A standalone Telegram bot polls a token-authenticated JSON API for users due today.
Outcomes
- Delivered a working two-integration app (Telegram bot + SendGrid email) on a Flask/SQLite stack, with auth, email confirmation and token-based password reset.
- Completed and submitted on deadline with substantial documentation — architecture, data model, design decisions, three rounds of Figma iterations, and a user evaluation.
Lessons learned
- The persistence layer ended up split between SQLAlchemy for the user model and a hand-written raw-SQLite layer for everything else — convenient at the time, but an inconsistency I’d unify if I revisited it.
- Coursework scope meant shipping without an automated test suite or CI, which I’d treat as non-optional next time.
Related work

Room of Horror
A VR “room of horrors” where nursing trainees hunt for care errors in a virtual hospital room, while an instructor configures and monitors each session live from the browser.

AOG Moldova
A production landing site for 24/7 emergency aviation-parts logistics in Moldova, with a trilingual interface and a serverless quote form that routes urgent requests straight to the ops team.