Let's Go to the Movies: een simpele webapp en Android-app zonder maandelijkse kosten
Voor een vaste vriendengroep bouwde ik een kleine webapp met een Android-app: films voorstellen, datums kiezen en automatisch verwittigen, op gratis hostingtiers.
Een vaste vriendengroep gaat regelmatig samen naar de cinema. Wie wanneer kon, werd afgesproken in een groepschat: berichten raakten ondergesneeuwd, niemand had een overzicht en de organisator moest telkens zelf natellen wie er meeging.
Ik bouwde Let's Go to the Movies als oplossing: één plek waar datums voorgesteld worden en beschikbaarheid verzameld wordt, met een webapp en een Android-app die dezelfde backend delen. Het geheel draait op de gratis tiers van Vercel, Firebase en Cloudflare. De enige vaste kost is de domeinnaam.
Kern van de case: een kleine groep krijgt één plek om datums te kiezen en wordt automatisch verwittigd, met een webapp en Android-app die dezelfde backend delen en geen maandelijkse hostingkosten hebben.

De uitdaging: plannen via een groepschat schaalt niet
Op zich is het een klein probleem, maar het komt telkens terug. Een film komt uit, iemand stelt een paar avonden voor, en vanaf dan loopt alles door elkaar: wie kan op dinsdag, wie enkel in het weekend, zijn de tickets al besteld, hoe laat spreken ze af? De organisator houdt dat allemaal in zijn hoofd bij of scrolt terug door de chat.
Voor Let's Go to the Movies waren er drie concrete doelen:
- Één overzicht. Per film zien welke datums voorgesteld zijn en wie op welke datum kan, zonder te tellen.
- Minimale beheertijd. Een film toevoegen met poster en trailer moest snel gaan. De productbriefing mikte op minder dan één minuut.
- Geen vaste kosten. Het is een tool voor een handvol gebruikers. Een abonnement of server die maandelijks geld kost, is daarvoor niet te verantwoorden.
De oplossing: één backend, twee apps
De kern is een afgeschermde webapp waarin de organisator films toevoegt en datums voorstelt, en waarin de deelnemers met één klik aanduiden wanneer ze kunnen. Een dag na de webapp volgde een Android-app die precies dezelfde gegevens en API gebruikt. Die app voegt vooral één ding toe: pushmeldingen, zodat niemand nog moet komen kijken of er iets nieuws is.
Omdat alle logica op één plek zit, moet er maar één systeem onderhouden worden. En omdat elke laag op een gratis tier draait, kost het geheel niets zolang het gebruik klein blijft.
De stack bestaat uit zes onderdelen:
- Webapp en API: Next.js 16 met React 19 en Tailwind CSS, gehost op Vercel. Eén codebase levert zowel de schermen als de API-routes.
- Database en login: Firebase Firestore en Firebase Authentication, zonder eigen databaseserver om te beheren.
- Android-app: Flutter, die dezelfde API-routes op Vercel aanspreekt als de webapp.
- Pushmeldingen: Firebase Cloud Messaging, rechtstreeks verstuurd vanuit de Vercel-API.
- Filmgegevens: de TMDB-API (The Movie Database) voor titels, posters en trailers.
- Bestandsopslag: Cloudflare R2 voor profielfoto's en de Android-installatiebestanden.

Hoe het gebouwd is
De architectuur is bewust klein gehouden. De Next.js-app draait op Vercel en bevat naast de schermen ook alle API-routes. Zowel de webapp als de Android-app praten met die routes. De routes controleren bij elke aanvraag het Firebase-loginticket van de gebruiker en lezen of schrijven daarna in Firestore. Beheeracties zijn extra afgeschermd voor accounts met beheerrechten.
Het project is gebouwd met AI als primaire bouwpartner. De productbriefing, API-afspraken en het designsysteem werden eerst als documenten uitgeschreven, waarna de code met AI-ondersteuning werd gebouwd en door een mens getest, bijgestuurd en vrijgegeven. De eerste commit dateert van 29 mei 2026, de eerste Android-versie van 30 mei.
Belangrijke bouwkeuzes:
- Gebruikersnaam in plaats van e-mail: deelnemers loggen in met een gebruikersnaam en wachtwoord. Achter de schermen wordt dat gekoppeld aan een intern e-mailadres in Firebase Authentication, zodat niemand zijn e-mailadres moet afgeven. Er is geen publieke registratie: de beheerder maakt accounts aan en de gebruiker moet bij de eerste login zijn tijdelijk wachtwoord wijzigen.
- Schrijven gebeurt via de server: de Firestore-beveiligingsregels laten deelnemers enkel hun eigen beschikbaarheid, interesse en pushtoken aanpassen. Al de rest, zoals films, datums en gebruikers, verloopt via de server met de Firebase Admin SDK.
- Geheime sleutels blijven op de server: de TMDB-sleutel staat enkel op Vercel. De Android-app vraagt filmgegevens op via dezelfde API-routes en bevat dus zelf geen sleutels.
- Geen betalende functies: pushmeldingen worden verstuurd vanuit de bestaande Vercel-routes in plaats van via Firebase Cloud Functions. Zo blijft het project volledig op de gratis tiers.
Firestore: de gedeelde gegevenslaag
Firestore is de enige databron voor beide apps. Alles wat een gebruiker in de webapp aanduidt, staat meteen ook in de Android-app, en omgekeerd.
Dit systeem beheert onder andere:
- gebruikers, met beheerrechten, profielfoto en pushtoken;
- films, met poster, voorgestelde datums, trailer, besteldeadline voor tickets en afspraakuur;
- per film en per gebruiker de gekozen datums;
- interesse voor films die nog geen datum hebben ("Upcoming").
Voor de gebruiker betekent dat één account en één stand van zaken, ongeacht of hij op zijn laptop of op zijn telefoon kijkt.

Beheer: alles wat de organisator nodig heeft op één scherm
Het beheergedeelte bestaat uit vier tabbladen: films, aanwezigheid, gebruikers en app-versie. De organisator zoekt een film via TMDB, de app vult poster en trailer automatisch in, en daarna kiest hij de datums in een kalender. Bij elke film staan knoppen om te bewerken, te verwijderen of een herinnering te sturen.
In het aanwezigheidsoverzicht ziet hij per film en per datum wie meegaat. Hij kan daar ook zelf iemand toevoegen of verwijderen, bijvoorbeeld wanneer iemand zijn beschikbaarheid mondeling doorgaf.

Pushmeldingen: automatisch verwittigen vanuit de server
De belangrijkste toevoeging van de Android-app zijn de pushmeldingen, verstuurd met Firebase Cloud Messaging. De app vraagt bij het opstarten toestemming voor meldingen, bewaart het pushtoken van het toestel in Firestore en opent bij een tik op een melding meteen de juiste film.
In mensentaal ziet het proces er zo uit:
- De organisator voegt een film toe, via de webapp of de Android-app.
- De server bewaart de film: de Vercel-route schrijft de film weg in Firestore.
- De server zoekt de ontvangers: alle pushtokens van gebruikers worden opgehaald, of bij een herinnering enkel die van wie interesse toonde of een datum koos.
- De melding vertrekt in groepen van maximaal 500 toestellen tegelijk, met de filmposter als afbeelding en de tekst "Film in de cinema. Wil je mee?".
- De gebruiker tikt en kiest: de melding opent rechtstreeks de filmpagina, waar hij zijn datums aanvinkt.
Dezelfde aanpak wordt gebruikt voor drie andere momenten: wanneer een aangekondigde film zijn eerste datum krijgt, wanneer de organisator het afspraakuur instelt of wijzigt, en wanneer hij manueel een herinnering stuurt dat de tickets binnenkort besteld worden. Die herinnering is dus geen automatische timer: de organisator beslist zelf wanneer ze vertrekt.


Automatisch onderhoud en app-updates
Twee kleine automatismen houden het systeem netjes zonder dat iemand eraan moet denken:
- Opruimen van voorbije datums: elke nacht om 02:00 draait een geplande taak op Vercel die verlopen datums verwijdert. Zijn alle datums van een film voorbij, dan verdwijnt de film samen met de bijhorende beschikbaarheden. De organisator kan dezelfde opruiming ook manueel starten.
- Verplichte update van de Android-app: de app wordt niet via de Play Store verspreid, maar als installatiebestand op Cloudflare R2. Publiceert de beheerder een nieuwe versie, dan krijgt wie een oudere versie opent een scherm dat de update vraagt. Een vast downloadadres verwijst altijd naar de laatst gepubliceerde versie.

Resultaat: een vaste planningsplek zonder vaste kosten
Er zijn geen gebruiksstatistieken bijgehouden, dus deze case geeft geen cijfers. Wat wel vaststaat, is wat de groep vandaag kan dat vroeger niet kon: de planning loopt via de app, niet meer via de groepschat. Op het moment van schrijven staan er negen films in het systeem, elk met hun eigen datums en deelnemers, en worden ze ook effectief gepland: bij twee films staat de status "tickets besteld".
Het project levert op:
- Één overzicht in plaats van terugscrollen: per film en per datum is meteen zichtbaar wie meegaat.
- Minder werk voor de organisator: een film toevoegen is een zoekopdracht en een klik. Poster en trailer komen automatisch uit TMDB, oude datums ruimen zichzelf op.
- Iedereen tijdig verwittigd: nieuwe films, nieuwe datums, afspraakuren en herinneringen komen als pushmelding binnen en openen meteen de juiste pagina.
- Geen maandelijkse hostingkosten: Vercel, Firebase, Cloudflare R2 en TMDB draaien op hun gratis tiers. Enkel de domeinnaam kost geld.
- Eén systeem om te onderhouden: de webapp en de Android-app delen dezelfde database en API. Een nieuwe functie in de backend is meteen voor beide beschikbaar.

Waarom dit relevant is voor bedrijven
Een filmavond plannen lijkt ver af te staan van een KMO, maar het onderliggende patroon komt in bedrijven voortdurend terug: iemand stelt opties voor, een kleine groep geeft aan wat past, en de organisator wil een overzicht en wil mensen verwittigen zonder ze één voor één te contacteren. Vandaag gebeurt dat vaak in WhatsApp, in e-mailthreads of in een gedeelde spreadsheet.
Hetzelfde patroon kan bijvoorbeeld gebruikt worden voor:
- Bouw en installatie: ploegen laten aangeven op welke dagen ze beschikbaar zijn voor een werf, met een melding zodra een nieuwe opdracht ingepland wordt.
- Horeca en retail: flexwerkers of jobstudenten hun beschikbaarheid laten doorgeven voor shiften, zonder duur roosterpakket.
- Opleidingen en workshops: deelnemers laten kiezen uit een paar sessiedatums en een herinnering sturen kort voor de start.
- Verenigingen en sportclubs: vrijwilligers inplannen voor evenementen of wedstrijden, met één overzicht voor de coördinator.
De les uit deze case: een kleine interne tool die precies één terugkerend probleem oplost, hoeft geen duur softwarepakket te zijn en hoeft maandelijks niets te kosten.
Hoe zo'n systeem voor jouw organisatie kan werken
Een vergelijkbaar systeem start met vijf vragen:
- Welke input bestaat vandaag al?
- Welke output moet daar telkens uit voortkomen?
- Welke stappen zijn repetitief?
- Waar moet een mens controleren of goedkeuren?
- Waar moet het eindresultaat gepubliceerd of opgeslagen worden?
Bij Let's Go to the Movies waren de antwoorden eenvoudig: een filmtitel en een paar datums als input, een lijst van wie wanneer meegaat als output, en een organisator die beslist wanneer er herinneringen vertrekken en wanneer de tickets besteld worden. Leeft er in jouw organisatie een planningsvraag in een chatgroep of spreadsheet, dan is dat vaak een goed vertrekpunt voor een eigen, eenvoudige interne app.
Ook zo'n kleine tool voor jouw groep of organisatie?
Stuur me een korte beschrijving van je proces via [email protected]. Ik kijk waar een eenvoudige app tijd kan winnen en hoe dat betaalbaar blijft.
Korte conclusie
Let's Go to the Movies toont dat een simpele goedkope interne webapp genoeg kan zijn om een terugkerend organisatieprobleem op te lossen. Een webapp en een Android-app delen één backend, deelnemers kiezen hun datums met één klik en worden automatisch verwittigd.
De winst voor de groep is concreet: de organisator moet niet meer najagen en natellen, en het geheel brengt geen maandelijkse kosten mee.
Wil je zoiets in jouw zaak?
Ik bouw kleine AI-automatiseringen voor eenmanszaken en kleine KMO's, in korte projecten met een snelle oplevering.