FH-Room Checker V2

FH-Room Checker answers one question for students: which room is free right now and where do I go if this one isn't? It started as a semester class project. The first version was validated with 25+ student testers, and their feedback shaped it. Now app grew, from a single poster in the Design Faculty to around 200 regular users.

Created

Created

2026

Industry

Industry

App Development

Team

Seymur Mammadov

This page covers the Version 2 update.

Want the full development and testing story behind the original build? Read the Version 1 case study

Version 1

What Makes It Different

We kept the core trick from v1: turn every "busy" event into a complete FREE/BUSY timeline for each room, so you see what's open now, what frees up soon, and the rest of the day at a glance. Version 2 is a ground-up re-architecture: the same product and the same validated idea, moved off a Laravel + Firebase + Ionic prototype onto one modern Supabase + Next.js system, so the times load fast, stay accurate, and read the same everywhere.

Challenge

V1 worked, but it was multiple systems bolted together: a Laravel/PHP for the Database and Backend. Using different servers for the room API and frontend. Firebase for feedback and analytics, and an Ionic front end on top. The rebuild had to collapse that into one coherent, reliable platform without changing what students see. Two parts were genuinely hard:


-Getting the data right. We reverse-engineered the entire Laravel backend into a written spec, then ported the fetch → parse → free/busy-inversion pipeline to a Deno/TypeScript Supabase Edge Function — preserving the exact field contract the frontend already relied on, so the move was invisible to anyone using it.


-Making it hold up under load. The first full run exposed real failures. The largest building (~11,500 events) crashed the Edge Function on a memory/CPU limit, and a hash-ordering bug could leave a building *permanently* un-synced. Both are fixed: bounded, 14-day-chunked materialization with an atomic replace; a per-date timezone-offset cache to kill a CPU hotspot; and a "write the hash last" commit marker, so any mid-sync crash self-heals on the next run. The inversion logic is covered by 28 passing Deno unit tests at ~99% line coverage.

Results

V2 runs as one platform instead of three. The Next.js frontend reads Postgres *directly* through row-level security — there's no custom API server to maintain and no secrets to leak — and a 2-hourly `pg_cron` job keeps ~150,000 schedule slots across ten campus buildings current, short-circuiting in under a second when a feed hasn't changed. The client is calmer, too: TanStack Query buckets live updates to the minute and keeps the current view on screen while the next loads, so the room list ticks down smoothly instead of flashing a loading skeleton. And V2 adds the most-requested feature — a Teacher Finder that searches ~1,450 cleaned-up lecturer names and shows where any of them is teaching, across every building.

Stack

- Frontend: Next.js 16 (App Router, Turbopack), React 19, TypeScript, Tailwind v4, shadcn/ui, TanStack Query v5. Vercel Deployment

- Backend: Supabase — Postgres 15, Deno/TypeScript Edge Functions, `pg_cron` + `pg_net` scheduling, row-level security

- Data model: materialized FREE/BUSY slots; business logic in a SQL view + RPC with DST-safe Vienna time math

- Quality & security: Vitest + Deno tests, read-only RLS, INSERT-only feedback (no PII read-back), HSTS / CSP / clickjacking + MIME protections, consent-based analytics (Consent Mode v2)

- Migrated from (v1): Laravel 12 / PHP 8.2 API · Ionic/Angular · Firebase (Firestore, App Check, Analytics)

Current Solution

Wireframe

Lo-Fi

Changes We Made

Product

Stack

Project Access

* click to on the icon to open the project

Conclusion

V1 proved the idea; V2 is the version built to last. The interesting work was never the interface — it was the invisible parts: inverting a messy public feed into reliable availability, getting timezones and DST right, designing a read model that's safe to expose straight to the browser, and hardening a sync pipeline until it recovers from its own failures. It's the same FH-Room Checker students rely on between classes — now on a foundation I'd be comfortable putting in front of ten times as many of them.

Curious about what we can create together? Let’s bring something extraordinary to life!

© 2026 All rights reserved.

Curious about what we can create together? Let’s bring something extraordinary to life!

© 2026 All rights reserved.

Curious about what we can create together? Let’s bring something extraordinary to life!

© 2026 All rights reserved.

Create a free website with Framer, the website builder loved by startups, designers and agencies.