Ik bouwde de ene tool die mijn studio nodig had. Nu wordt het een product.
Millstream is de gedeelde werkplek waar je team, je klanten en de studio's waarmee je samenwerkt werken vanuit dezelfde projecten, bestanden en gesprekken. Het begon als 'Maximized Portal', de interne tool waar mijn studio op draaide. Vandaag is het een multi-tenant product in besloten bèta op millstream.app.
Het probleem
Een studio runnen betekent klanten, projecten, tickets, tijd, reizen en content beheren. Ik deed dat allemaal in een lappendeken aan tools, en iedereen met wie ik werkte zag een andere versie van de waarheid.
Tools overal, niets verbonden
Klantgegevens stonden in een spreadsheet. Taken in Jira. Notities in Notion. Tijdregistratie in alweer een andere app. Elke tool had z'n eigen login, z'n eigen data-silo en z'n eigen werkwijze.
Handmatig schakelen tussen systemen
Tijd boeken op een ticket betekende drie apps naast elkaar openen. Een klant factureren betekende data uit vijf plekken bij elkaar trekken. Niets stond met elkaar in verbinding.
Iedereen op een andere versie
Briefings stonden in e-mail. Feedback lag verspreid over DM's en reactiethreads. Vroeg een klant om een status-update, dan moest ik die bij elkaar puzzelen uit losse tools. Geen enkele plek vertelde het volledige verhaal.
De visie
Het begon simpel. Ik wilde een plek waar klanten bestanden konden bekijken, feedback achterlaten en verzoeken indienen, een gedeeld portaal tussen ons. Feedback werd tickets. Tickets vroegen om sprint planning. Sprints om tijdregistratie. Tijdregistratie om facturatie. En ineens was ik iets veel groters aan het bouwen.
Millstream groeide organisch vanuit echte behoeften. Elke module bestaat omdat de studio 'm nodig had, niet omdat een feature-lijstje het voorschreef. Wat eruit kwam is een werkplek waarin alles met elkaar verbonden is: een ticket linkt aan een project, dat linkt aan een klant, en aan die klant hangen geboekte tijd, reizen, bestanden, goedkeuringen en een gespreksthread. Alles ligt op één klik afstand, voor iedereen met wie jij het wilt delen.
Het dashboard
De meeste tools openen op een lijst en laten jou uitzoeken wat er toe doet. Millstream opent op wat jou nodig heeft. Een set regels leest bij elke laadbeurt de werkruimte uit en maakt van ruwe status een korte, gerangschikte feed: wat over tijd is, wat op jouw beoordeling wacht, wat stilletjes is blijven liggen.

Aandacht nodig, op volgorde
Bevindingen worden gegroepeerd in kritiek, waarschuwingen en ter info, elk inklapbaar met een eigen teller. Een ticket over de deadline, een kaartje zonder update in vijf dagen, een sprint die de resterende punten niet gaat halen, een project dat een maand stil is. Elke regel linkt direct naar de plek waar je het oplost.
Een grid dat je zelf indeelt
Widgets kun je vergroten, verslepen en uitzetten. Alleen de widgets die je aanhoudt halen data op, en die queries lopen parallel, dus een uitgedund dashboard is meteen een sneller dashboard.
Goedkeuringen die zichzelf melden
Bestanden die op akkoord wachten, plus tijdboekingen en reizen die jij moet nakijken, staan op het dashboard in plaats van in een wachtrij die je moet onthouden te openen.
Live activiteit in de werkruimte
Een gedeelde feed van alles wat er is veranderd, zodat je een project weer oppakt zonder iemand te hoeven vragen wat je gemist hebt.
Tickets, sprints en releases
Klantfeedback wordt een ticket. Tickets staan op een bord dat je zelf vormgeeft: lanes, labels en kleuren zijn per werkruimte in plaats van vastgezet. Van daaruit rollen ze op in sprints, epics en releases, en omdat elk ticket gekoppeld is aan een project en een klant, weet de rest van het systeem het zodra je een kaartje verplaatst.

Borden die jij bepaalt
Meerdere borden per werkruimte met eigen lanes, kleuren en regels voor stilgevallen kaartjes, plus kant-en-klare presets om mee te beginnen. De volgorde draait op lexorank, dus één sleepbeweging hernummert nooit de hele kolom.
Sprints met echte capaciteit
Puntinschattingen komen samen met de beschikbaarheid van het team. De planner laat zien wat past, wat niet past, en hoe de openstaande punten zich verhouden tot wat recente sprints echt afmaakten.
Epics en releases
Groepeer tickets in epics voor scope en in releases voor uitlevering. Release notes worden gegenereerd uit de tickets die erin zaten.
Focus mode
Een toetsenbordgedreven weergave die één kaartje tegelijk toont, voor de dagen waarop een bord met tweehonderd tickets het verkeerde gereedschap is.
CRM
Het CRM is de ruggengraat. Elke andere module komt hier op uit. Open je een klant, dan zie je hun projecten, tickets, geboekte tijd, reizen, bestanden, afspraken en gesprekken op één plek, samen met de tarieven die er een factuur van maken.
Bedrijfsbeheer
Volg klanten met logo's, status en eigen uurtarieven. Elk bedrijf is het ankerpunt voor de rest.
Contacten per bedrijf
Beheer contacten per bedrijf met een primair contact als hoofdpersoon, zodat de juiste persoon altijd één klik verderop zit.
Drielaags tariefstructuur
Tarieven cascaderen: klantstandaard, project-override, per-boeking-override. Flexibel zonder ingewikkeld te worden, en hetzelfde patroon geldt voor kilometertarieven.
Een tijdlijn van elke interactie
Telefoontjes, meetings, mails en afspraken per klant vastgelegd. De volledige historie van een relatie in één feed.
Gebouwd voor samenwerking
Wat de interne tool in Millstream veranderde was één terugkerende vraag: waarom moet de klant mij hiervoor mailen? Het antwoord werd het product. Één bron van waarheid, gedeeld met de drie kringen waarmee je werkt: je team, je klanten en de studio's waarmee je partnert.
Klanten doen mee als externe leden, en die rol wordt afgedwongen in Postgres via row-level security, niet weggemoffeld in de interface. Ze beoordelen bestanden, volgen het bord en dienen verzoeken in, terwijl tarieven, het CRM en interne borden buiten bereik blijven. Partnerstudio's en freelancers werken met je mee in gedeelde projectruimtes zonder je hele werkruimte in handen te krijgen. En realtime gesprekken leven op elke werkruimte, elk project, elk bestand en elk ticket, met mentions en systeemberichten, zodat feedback landt waar het werk is.
De nieuwste laag is een AI-inbox die meekijkt terwijl het werk gebeurt. Hij leest een gespreksverslag en stelt een ticket voor. Hij ziet twee uur aan commits en stelt een tijdboeking voor. Hij merkt dat een offerte de deur uit is en stelt voor de deal een fase verder te zetten. Elk voorstel is goedkeuren of afwijzen, dus jij houdt de regie.
Tech stack
Gebouwd op dezelfde stack die ik gebruik voor klantwerk. Modern, typed, production-grade.
Next.js
App Router met Server Components, Server Actions en route handlers.
React
React 19 voor de complete interactieve UI-laag.
Supabase
PostgreSQL, Auth, Storage, Realtime en Row-Level Security.
Tailwind CSS
Utility-first styling met Tailwind CSS 4, in een lichte en een donkere modus.
Vercel
Hosting, preview-deploys en de cronjobs achter de herinneringen.
Uitdagingen
Het zwaarst was nooit één specifieke feature. Het was de boel simpel houden en tegelijk flexibel genoeg maken voor andere teams.
Ik bouwde de eerste versie rond de workflow van mijn eigen studio. Zodra andere teams aanhaakten, werd elke aanname onder druk gezet. Hun projecten lopen anders. Hun teamstructuur is anders. Hun permissies moeten anders zijn. En hun klanten horen precies genoeg te zien, en niets meer.
Het permissiemodel is waar die spanning het duidelijkst werd. Het begon als een raster met vinkjes per module per gebruiker. Dat klonk flexibel, maar bleek vooral onderhoudswerk: elke nieuwe pagina vroeg om weer een vinkje, en niemand kon in één oogopslag zeggen wat iemand nou echt kon zien. Het is ingedikt tot drie rollen, admin, teamlid en extern, afgedwongen in de database via row-level security. Minder in te stellen, veel meer zekerheid over wie wat ziet.
Scope was de andere constante strijd, en schrappen was daarvan de moeilijkste helft. Elke module verbindt zich met al het andere, dus een "simpele" reizenfeature had alsnog klantkoppeling, projectkoppeling, ticketkoppeling, tariefberekeningen, locatie-autocomplete en permission-checks nodig. De social planner was een compleet eigen onderdeel, totdat ik 'm oploste in wat er al was: de content ging naar de bestandsbibliotheek, de workflow naar een bord, de review naar het generieke goedkeuringssysteem. Door 'm te schrappen werd het product kleiner en beter.
Resultaten
Millstream is live, in dagelijks gebruik en onboardt zijn eerste externe teams. Wat begon als feedbacktool voor klanten werd het besturingssysteem van mijn studio, en wordt dat nu ook voor andere studio's.
12 verbonden modules
Dashboard, gesprekken, CRM, goedkeuringen, bestanden, projecten, tickets, releases, tijdlijn, registratie, agenda en een AI-inbox, plus een live activiteitenfeed en een command palette over het geheel.
Multi-tenant in productie
Echte werkruimtes met volledige data-isolatie via row-level security, drie rollen afgedwongen in de database, klanten die meedoen als externe leden, en een gratis en een premium tier.
Dagelijks gebruik, nu in besloten bèta
Dit is geen demo. Het is de tool waar mijn studio elke dag op draait, en de eerste teams werken er nu in via de besloten bèta op millstream.app.
Solo end-to-end gebouwd
Design, frontend, backend, database-schema, RLS-policies, AI-integratie, Nederlandse en Engelse vertalingen, PWA en pushmeldingen, deployment. Allemaal door één persoon.

