KampanYES
Overname & beveiliging
In deze case laat ik zien hoe ik een live folder-app van een vorig team heb overgenomen, beveiligd en verder ontwikkel.
KampanYES bundelt de digitale folders en aanbiedingen van winkels bij jou in de buurt in één app voor iOS en Android.

- Type
- Mobiele appAdmin-dashboardBackend-API
- Mijn rol
- Software-architectFull-stack developerSecurityCI/CDOnderhoud & doorontwikkeling
- Tijdlijn
- 2026 – heden
- Opdrachtgever
- KampanYES
Uitdagingen en doelen
KampanYES stond al live in de App Store en de Play Store toen ik het project overnam van een vorig ontwikkelteam. De app, het admin-panel en de API waren door verschillende ontwikkelaars gebouwd, met weinig documentatie en zonder de sleutels die nodig zijn om een app-update te publiceren.
Een security-review liet zien dat er meerdere problemen waren die binnen de OWASP Top 10 en bekende CVE's vielen. Die heb ik op ernst gerangschikt en als eerste opgelost, nog vóór nieuwe features.
Het doel: een veilig platform waar winkeliers en gebruikers op kunnen vertrouwen, en een stevige basis om weer rustig op door te bouwen.

Architectuur
De architectuur is opgebouwd rond een aantal uitgangspunten:
- 01Één centrale API
- 02Toegang per rol
- 03Veilig als standaard
- 04Beheer los van de app
De mobiele app en het admin-panel praten allebei met één REST API, die de data in MongoDB bewaart en pushmeldingen via Firebase verstuurt. Elke route controleert eerst wie je bent en welke rol je hebt, zodat beheerfuncties alleen voor beheerders bereikbaar zijn.

Technieken
De backend is een REST API in Node.js en TypeScript, gebouwd met Express en MongoDB via Mongoose.
Inloggen gaat met JWT-tokens en per route wordt de rol gecontroleerd; pushmeldingen lopen via Firebase Cloud Messaging.
De app is gebouwd in Flutter, zodat iOS en Android uit één codebase komen, met Google Maps om je stad te kiezen.
Het admin-panel is een React- en TypeScript-applicatie met TanStack Query, Ant Design en Tailwind CSS, inclusief drag-and-drop om folders en categorieën te ordenen.
Flutter
Dart
GetX
Firebase
Google Maps
React
TypeScript
Vite
TanStack Query
Ant Design
Tailwind CSS
Node.js
Express
MongoDB
Mongoose
JSON Web Tokens
PM2
GitHub Actions
Biome
Agile / Scrum
Ontwikkelproces
Ik pak het werk per onderdeel aan: eerst de overdracht op orde, daarna de beveiligingsproblemen in volgorde van ernst en pas dan nieuwe features.
Elke bevinding kreeg een eigen plan met een testscenario, zodat ik na de fix kon aantonen dat het probleem echt verholpen was.
Beveiliging ging bewust vóór nieuwe functionaliteit. Nu die basis staat, is er weer ruimte voor doorontwikkeling, zoals een betere categorie-navigatie in de app.
- Planning
- Analyseren
- Ontwerpen
- Implementeren
- Testen
- Onderhouden
Implementatie
Elke fix is als kleine, losse wijziging doorgevoerd, per bevinding te herleiden en apart te testen. Zo bleef de live app gewoon werken terwijl de API stap voor stap strenger werd.
Beheeracties zoals het versturen van pushmeldingen zijn nu alleen nog bereikbaar voor ingelogde beheerders.


Testen
Het admin-panel wordt bij elke push en pull request automatisch gebouwd in GitHub Actions, zodat een kapotte build nooit live gaat.
Voor elke beveiligingsfix is een vast testscenario uitgewerkt, waarmee ik controleer dat een oude aanvalsroute echt dicht is. Geautomatiseerde unit- en integratietesten voor de API staan als volgende stap op de planning.
Continuous development & integration
Iedere push en pull request op het admin-panel start een build in GitHub Actions. Wijzigingen op de main-branch worden daarna automatisch via SSH naar de server uitgerold. Zo gaat een fix live zonder handmatige stappen.
De API wordt met een deploy-script op de VPS bijgewerkt en draait onder PM2, dat het proces automatisch herstart als het onverwacht stopt. De mobiele app gaat via de App Store en de Play Store, waar elke update eerst door de review van Apple en Google gaat.

01 / 03
Screenshots
Gebruikers zien de actuele folders in hun stad en bladeren er met één veeg doorheen.

Verder kijken
Meer case studies
Een goed begin
Heb jij een digitaal vraagstuk dat verder mag?
Vertel me waar je aan werkt. Dan verken ik samen met jou wat er technisch nodig is om vooruit te komen.
Plan een kennismaking

