Groselia

Social media die zichzelf runt

Mijn rol

Medeoprichter
Engineering
Product- en merkdesign

Beschrijving

Groselia verzorgt social media voor in de eerste plaats techstartups, maar ook voor bedrijven uit andere sectoren en van andere groottes: strategie, design, publiceren, reageren op comments en rapportages, op elk kanaal, vanuit één platform.

Team

Danilo ParmegianiMedeoprichter
Pedro CritchiMedeoprichter

Context

Ik begon Groselia met Pedro, met z'n tweeën. Hij doet marketing, sales en operations; ik ontwierp het merk en het product en bouwde het platform waarop het draait, van de database tot de laatste animatie. Toen het nog self-service was, meldden meer dan 200 mensen zich aan, en vandaag draaien de content en social media van onze klanten erop. In juni 2026 haalden we een pre-seed van R$100k op bij Link Vector, de accelerator van Link School of Business, waar ik ben afgestudeerd, en twee maanden na de pivot naar een dienst brengt Groselia meer dan R$15.000 per maand binnen.

Tools

Codex
Claude Code
Figma
Adobe tools

Stack

  • React
  • Next.js
  • TypeScript
  • Tailwind
  • Supabase
  • Frontier LLMs
  • Trigger.dev
  • Stripe
  • Vercel

Tijdlijn

2025–nu

In cijfers

R$180k+
jaarlijkse run rate
200+
accounts aangemaakt
350
merken ingericht
9,700+
commits
520+
pull requests
47
edge functions

Uitdaging

Bouwen was niet langer het knelpunt. Gezien worden werd het.

AI liet de kosten van software maken instorten. Een founder zonder technische achtergrond kan nu in een weekend een product lanceren, en iedereen anders ook. Wat niet goedkoper werd: zorgen dat iemand het opmerkt. Distributie is een doorlopend proces, geen taak: elke dag posten, op acht netwerken die elk een ander formaat willen, elke reactie beantwoorden, en cijfers lezen die elke app anders rapporteert.

Startups betalen daarvoor op een van drie manieren. Ze nemen een team aan dat ze nog niet kunnen betalen, ze plakken een dozijn tools aan elkaar die elk één stukje oplossen, of ze posten niets en betalen met groei. Groselia bestaat om de vierde optie te zijn.

Hoe het zo kwam

Groselia veranderde vier keer van vorm voordat het vond wat het is. Bij elke draai bleef wat werkte en verdween de rest.

  1. Eind 2025 – feb 2026

    Argibee

    Een AI-platform voor merkdesign. Het begon eind 2025 als prototype en werd in februari 2026 een echt bedrijf. Het vond zijn markt niet, maar de brand-kit-engine werd de ruggengraat van alles wat erna kwam.

  2. apr 2026

    Motion video

    Groselia begon als lanceringsvideo's in Apple-stijl, gemaakt met After Effects-templates. Ik valideerde de hele pipeline met de hand, en zag toen dat die niet kon opschalen naar de kwaliteit die we wilden.

  3. jun 2026

    Pre-seed van Link Vector

    We deden mee aan de Startup School van Link School of Business, een programma van 100 dagen voor founders, gefilmd als realityshow (bekijk het seizoen). Het eindigde met een demodag waarop ik Groselia op het podium pitchte, en met onze pre-seed van R$100k van Link Vector, de accelerator van Link School of Business, waar ik ben afgestudeerd.

    Mijn pitch op de demodag
  4. aug 2026

    Lovable voor marketing

    Eén gesprek in plaats van een formulier: beschrijf de campagne en Groselia plant, schrijft en publiceert hem. Een chatagent met tools, geen verzameling bots.

  5. sep 2026

    Een social media manager

    Klanten wilden niet dat AI hun content maakte. Ze wilden hun eigen foto's goed gepost en hun reacties beantwoord. We schrapten het genereren en gingen vol voor het runnen van de kanalen.

  6. Nu

    Service as a software

    We verkopen het werk, niet de tool. Ons team runt de social media van elke klant op het platform, waardoor één persoon kan doen waar vroeger een bureau voor nodig was.

In het openbaar gebouwd

We bouwden vanaf het begin in het openbaar. Toen het nog Argibee heette, deelden we de reis op YouTube, van de lancering van de wachtlijst van Argibee tot de eerste video waarin we Groselia lieten zien. De rest van het verhaal, video voor video, staat op ons kanaal.

De lancering van de wachtlijst van Argibee
De eerste video waarin we Groselia laten zien

Merk

Ik wilde dat het merk van Groselia gedurfd was: iets waarbij mensen stoppen en kijken, op de website, in de app en in elke post op onze social media. Waar iemand het ook tegenkomt, het moet indruk maken, een beetje bewondering oproepen en zin geven om ons in te huren door wat ze net zagen. Vooral moest het er geweldig uitzien voor techstartups: het ecosysteem waar we deel van uitmaken en de klanten voor wie we als eerste bouwen.

Ik heb het hele merk ontworpen met de Figma-plugin in Codex: het logo, de typografie en hoe die in de juiste verhoudingen met het symbool samengaat, de beeldtaal, de SVG-iconenbibliotheek, de tekststijlen en een geordend kleurenpalet. Elke beslissing kwam op één bord, uitgemeten, zodat je ze kon vergelijken en erover kon discussiëren.

Codex naast het Groselia-bestand in Figma: het logosysteem, het logo op elke achtergrondkleur, het symbool in het hele palet en het kleurenpalet
De merkborden, gemaakt in Figma met de Figma-plugin in Codex.

Het symbool

Het symbool kwam eerst en bleef. Drie zachte bloemblaadjes die om een middelpunt draaien; het stamt uit de allereerste versie van het bedrijf, en het nieuwe logo is eromheen gebouwd in plaats van eroverheen: de geometrie werd gekopieerd en geschaald, nooit opnieuw getekend.

Het woordmerk

Het woordmerk is TT Commons Pro Bold, in kleine letters, omgezet naar vectoren zodat het overal hetzelfde wordt weergegeven. Met de natuurlijke spatiëring voelde het los naast het symbool, dus heb ik het strakker gezet naar −4% tracking door elke letter bij 160px nog 6,4 eenheden naar links te schuiven. Klinkt piepklein; het woord ging van 564 naar 520 eenheden breed en leest nu als één vorm.

Een grid van H

Alles wordt gemeten in H, de zichtbare hoogte van het woordmerk, op een grid van H/10. Zo schaalt het logo zonder dat iemand het ooit nog op het oog hoeft af te stellen.

Voor het gestapelde logo tekende ik zes opties, drie symboolformaten (1,50H, 1,75H, 2,00H) tegen twee tussenruimtes (0,15H, 0,25H), en we kozen B: een symbool van 1,75H, 0,15H boven het woord. Voor het horizontale vergeleek ik tussenruimtes van 0,20H tot 0,35H en koos ik een symbool van 1,10H met 0,35H tussenruimte.

1.75H0.15HH

Het gestapelde logo op zijn constructiegrid. H is de hoogte van het woordmerk; het grid is H/10.

Groselia-logo horizontaal

Horizontaal

Symbool 1,10H · tussenruimte 0,35H

Groselia-logo gestapeld

Gestapeld

Symbool 1,75H · tussenruimte 0,15H

Groselia-logo symbool

Symbool

Oorspronkelijke verhouding, 0,93 : 1

Colour

The palette is fifteen colours, loud on purpose. But the logo only ever comes in four treatments: blue symbol with black text, blue with white, all black and all white. The other colours are grounds, never the symbol.

To prove that, I put the symbol and both lockups on twelve backgrounds, 24 studies each, and kept the ones where its silhouette survives. On blue grounds the symbol goes monochrome. Click a colour to copy it.

Typografie

TT Commons Pro doet alles: zes gewichten van Light tot ExtraBold, een schaal van elf stappen van 12 tot 96px, en echte cursieven. Ik heb alle 688 tekstlagen in het bestand ernaar omgezet, zodat het brandbook, de app en de website nu met één stem spreken.

Primair lettertype

TT Commons
Pro

TT Commons ProDisplay · 01
→Groselia@
Reels → Posts
Nº 128⅝ e

App-icoon

Het app-icoon is de enige plek waar het merk 3D wordt: het symbool in porselein, gelaagd, van bovenaf belicht en een tikje glanzend. Bij een latere opfrisbeurt heb ik het symbool erin 10% kleiner gemaakt, zodat het ruimte heeft in zijn tegel. Het krijgt ook een eigen lockup met het woordmerk, de tegel op 1,5H.

App-icoon van Groselia

Een wereld van 3D-objecten

Rond het logo woont een hele cast van 3D-objecten: een hartje met wiebeloogjes, tekstballonnen, een hashtag, sterretjes. Ze zijn de stem van het merk op de website en in onze posts, en ze staan nooit stil: ze zweven, en op de site reageren ze op de cursor. Deze hier ook: geef ze een duw, of trek er een terug en laat los.

Neo-doodles

Voor alles wat plat is, is er Neo, onze iconenset: dikke zwarte contouren, vullingen uit het palet en één witte glans. Op de website begint elk icoon als een simpel lijnicoon in een wit chipje en verandert het in zijn doodle als je eroverheen beweegt, onderdeel voor onderdeel: de schijf ploept, de balken vallen, de glans tekent zich. Dit zijn de doodles en animaties van de website zelf, ongewijzigd overgenomen. Beweeg over eentje.

Officiële koppelingen
Zonder omkijken
Altijd te pauzeren
Alles vastgelegd
Data blijft privé
Altijd opzegbaar
Antwoorden in jouw stem
Menselijke controle
Leads gemarkeerd
Betaalde advertenties
Landingspagina
Productredesign
Rebranding
Vonk
Hart
Trofee

Product

Alles in Groselia gebeurt door te typen in één chat. Je schrijft wat er online moet en wanneer, en Groselia plant het in, publiceert het, beantwoordt de reacties en vertelt je wat werkte. Het werk komt binnen als één plan dat de eigenaar goedkeurt, in plaats van een dozijn schermen om te bedienen.

Een gesprek, geen dashboard

Hoe ging vorige week?

De beste week sinds juni.

  • Het bereik is 38% gestegen, dankzij de latte-art-reel (41K weergaven op Instagram, 64K op TikTok).
  • Het aantal saves is verdubbeld op de espresso-carrousel. Mensen bewaren recepten.
  • Er liggen reacties te wachten. 14 vragen over bezorging en maalgraad, de meeste onbeantwoord.

Het patroon is duidelijk: video tussen 17.00 en 19.00 uur, foto's 's ochtends. Dat zou ik de komende twee weken aanhouden.

2 dagen geleden

Goedemorgen! Twee dingen hebben deze week je aandacht nodig:

  • De oogst uit Carmo de Minas ligt vrijdag in het schap, en er is nog niets voor gepland.
  • 14 vragen wachten onder je posts, vooral over bezorging.

Waar wil je beginnen?

Kies er een
8 minuten geleden

Groselia begon als formulier: kies een doel, vul de velden in, krijg een campagne. Niemand wil formulieren over zijn eigen bedrijf invullen, dus nu heeft elk merk in plaats daarvan één gesprek.

Je opent je merk en typt. Vraag wat je deze week moet posten, sleep foto's van je telefoon erin, of schrijf ‘beantwoord de reacties van gisteren’. De agent kijkt eerst voordat hij antwoordt: je kalender, wat goed presteerde, het geheugen van het merk.

Als hij iets van je nodig heeft, stelt hij één korte ronde vragen die je met een tik beantwoordt. Daarna stelt hij één plan voor: de posts met hun datum en tijd, de antwoorden, eventuele wijzigingen. Je past aan wat je wilt, keurt het goed en ziet de kalender vollopen.

De kaart hier is de echte chat, in de browser nagebouwd met de eigen tokens van de app. Probeer hem gerust.

Twee keer ontworpen: voor eigenaren, daarna voor ons

De eerste doelgroep waren eigenaren van kleine bedrijven die hun eigen social media doen. Ze denken niet in campagnes, funnels of postritmes; ze denken ‘wat post ik deze week?’. Het moeilijke was dus de machinerie verbergen: onboarding in vier vragen, een brand kit die zich vult vanuit een link, een kalender waarin je kunt slepen, elk scherm in zeventien talen en bruikbaar op een telefoon.

Toen leerden we dat klanten helemaal geen tool wilden bedienen, hoe simpel ook. Ze wilden dat het werk gedaan werd. Dus werden wij de belangrijkste gebruikers. Eén persoon in ons team runt veel merken, en dezelfde app moest workspaces met meerdere merken krijgen, cycli die openen met een meeting en sluiten met een rapport, een goedkeuringsstap bij elke post en één inbox voor elk netwerk. Klanten loggen nog steeds in, maar nu kijken ze in de app hoe het werk gebeurt, in plaats van het zelf te doen.

november 2026

ma
103
di
113
wo
123
do
133
vr
143
za
152
zo
162
8:00

Waarom we 40% boven de marktprijs betalen

Geïmporteerd
6
Nieuwe oogst
49:00

Nieuwe oogst: Carmo de Minas

Gepubliceerd
5
Achter de schermen
17:30

POV: eerste dienst in de branderij

Gepubliceerd
Recepten
9:00

Zo stellen we de espresso af

Gepubliceerd
12:00

Impopulaire mening over donker gebrande koffie

Gepubliceerd
Mislukt
Achter de schermen
1218:00

We beoordelen de bestellingen van onze vaste klanten

Gepubliceerd
8:30

Tijd voor croissants

Ingepland
3
Vacatures
11:00

Maak kennis met Ana, onze head barista

Handmatig
ReceptenNieuwe oogst+1
17:00

Latte art in slow motion

Ingepland
9:00

Wat 1 kg groene koffie wordt

Ingepland
7
Achter de schermen
11:00

De branderij van binnen, van begin tot eind

Ingepland
Recepten
18:30

Cold brew in 60 seconden

Concept
Video ontbreekt
Nieuwe oogstPromo
9:00

De nieuwe oogst ligt in het schap

Ingepland
Concept
Vacatures
10:00

We zoeken een head roaster

Ingepland
17:00

Iced latte, van begin tot eind

Concept
Promo
10:00

Jouw zaterdagtafel

Ingepland
15:00

Het espresso-tonicseizoen is begonnen

Concept
Recepten
11:00

De pour-overgids van 4 minuten

Ingepland
Promo
18:00

Maak kennis met de Oakline-zak

Concept
4

Gebouwd om door agents gelezen te worden

Steeds vaker is de eerste lezer van een merk of een webpagina een AI. Daarom is alles in Groselia net zo goed voor agents geschreven als voor mensen. Het geheugen van een merk is een set eenvoudige Markdown-documenten, met voorkeuren, do's en don'ts en merkfeiten, die de agent voor elk antwoord leest en zelf bewerkt met vier tools, zoals AI-assistenten hun eigen geheugen bijhouden. Mensen openen en bewerken precies dezelfde documenten in de brand kit.

Insights lopen via één gedeelde kern die zowel het dashboard als de agent leest, dus als je vraagt ‘wat werkt er?’, komt het antwoord uit de cijfers die je ziet. En de website doet hetzelfde voor de assistenten die mensen over ons vragen: groselia.com serveert een llms.txt, een langere llms-full.txt en een vergelijkingsbestand, allemaal gegenereerd uit één bron van feiten in de code, zodat wat een AI over onze prijzen of beveiliging zegt niet kan afwijken van de site.

Engagement door de tijd

Per week, laatste 30 dagen, op publicatiedatum

Eng.ratio7,69%

Belangrijkste functies

  • Een brand kit vanuit een link

    Plak een website en koppel je accounts. Groselia scrapet de site, leest je eerdere posts en vult zelf logo, kleuren, lettertypes, stem en doelgroep in.

  • Eén gesprek

    Een AI-agent met 41 tools schrijft captions bij je media, kiest tijden op basis van je eigen engagementdata, leest cijfers en schrijft conceptantwoorden, en bundelt dat allemaal in een plan.

  • Een kalender voor acht netwerken

    Instagram, LinkedIn, TikTok, YouTube, X, Facebook, Threads en Reddit, elk in zijn eigen formaat, met eerdere posts geïmporteerd zodat de kalender nooit leeg is.

  • Elke reactie beantwoord

    Reacties en DM's van elk netwerk in één inbox, met conceptantwoorden in de stem van het merk; alles wat gevoelig ligt, wordt voor een mens apart gehouden.

  • Insights in gewone taal

    Bereik, weergaven en engagement over elk account, eerlijk over wat elk platform wel en niet rapporteert, en een antwoord op ‘wat werkt er?’.

  • Cycli en goedkeuringen

    Het werk loopt in cycli. Elke cyclus opent met een meeting en sluit met een rapport dat de AI uit de cijfers schrijft, en elke post kan wachten op de goedkeuring van de klant.

Gebouwd met AI-agents

Ik heb Groselia gebouwd met AI-agents als mijn engineeringteam. Codex en Claude Code schreven de code, elke wijziging op een eigen branch, terwijl ik het ontwierp, elke pull request reviewde en besliste wat er live ging.

En de meeste prompts sprak ik in in plaats van ze te typen, met Wispr Flow. Een goede prompt is een lange, gedetailleerde briefing, en door te praten kon ik die geven zo snel als ik dacht.

  • Codex

    Coding-agent

  • Claude Code

    Coding-agent

  • Wispr Flow

    Spraakdictatie

Website

Op de website wordt het merk luid. Ik heb hem ontworpen en gebouwd in Next.js. Hij is er in zeventien talen, en geeft de taal van elke bezoeker door aan de app wanneer die zich aanmeldt.

Een hero om mee te spelen

Het logo draait in beeld terwijl de pagina laadt, dan de hero: 3D-objecten die zweven, meebewegen met de muis en door de cursor worden weggeduwd, en een scrollscène die eindigt in ‘Made for you’.

groselia.com
De hero van groselia.com: ‘We run your socials. You run your business.’, met de 3D-objecten rond het hart

De echte app, nagebouwd

‘Inside your Groselia’ laat het platform zien zoals het is, in code nagebouwd vanuit de eigen schermen van de app, met een demomerk.

groselia.com
‘Inside your Groselia’: het scherm van het platform voor het koppelen van kanalen

Een blog

Notities over het runnen van social media. Berichten zijn simpele MDX-bestanden, één per taal, zonder CMS, en elk krijgt een eigen feed en gestructureerde data zodat zoekmachines en AI-assistenten ze goed lezen.

groselia.com
De blog van groselia.com, het eerste bericht uitgelicht onder de cursor en meer berichten eronder

Een formulier dat leads kwalificeert

Elke ‘Book a call’ opent vóór de agenda een kort formulier: wie je bent, waar je post, wat je nodig hebt en je budget. Elke stap wordt meteen in onze database opgeslagen, zodat we zelfs half ingevulde antwoorden zien, en een ingevuld formulier pingt ons team op Slack.

groselia.com
De boekingspagina: ‘Let's talk about your social media.’, met het formulier naast de drie stappen

Altijd responsive

Elke pagina is ook voor telefoons ontworpen, niet alleen kleiner gemaakt. Waar je niet kunt hoveren, komen de secties tot leven zodra ze het midden van het scherm bereiken.

De homepage op een telefoon
‘Always in sync with your team’ op een telefoon, de eerste kaart actief
Het boekingsformulier op een telefoon, bij de stap die vraagt wat je nodig hebt en wat je maandbudget is

Engineering

Architectuur

Ik heb het platform zelf gebouwd, met AI als mijn pair. De app is React en Vite, de landingspagina Next.js, en beide draaien op één Supabase-project: Postgres met row-level security, auth, realtime en storage, en 47 edge functions. Alles wat traag of ingepland is, draait op Trigger.dev, de sociale netwerken lopen via één publicatie-API, en Stripe regelt abonnementen, kaarten en de Braziliaanse boleto.

Er is ook een MCP-server en een Codex-plugin, zodat Groselia vanuit een AI-agent te gebruiken is: dezelfde merken, posts en concepten, als tools.

Waar het gebruikt wordt

De kern

Supabase

Erachter

De app, de website en de MCP-server draaien op Vercel.

Beweeg over een vak of tik erop om te zien wat het doet en waarmee het praat.

De reis van een post

De beste manier om te zien hoe de onderdelen in elkaar passen, is één post volgen, van een zin in de chat tot zijn cijfers in Insights. Klik door de stappen, of laat ze afspelen.

Webapp

De eigenaar vraagt

‘Post de oogstfoto's op vrijdag, op Instagram en LinkedIn.’ Het bericht gaat naar de edge function van de agent, die zijn antwoord terugstreamt.

ReactSSE-stream

De agent

De agent draait op de beste modellen op de markt, van Anthropic, OpenAI en andere aanbieders, als één streamende edge function met een toolloop. Het model krijgt 41 eigen tools plus web search en web fetch, tot acht stappen per beurt. Het moeilijke was nooit het model. Het was zorgen dat de agent altijd weet wat er op dit moment waar is.

Dus bij elke beurt, voordat het model het bericht ziet, bouwt de functie de context opnieuw op uit de database: de datum en tijd in de tijdzone van de eigenaar, de geheugendocumenten van het merk, de live kalender, de open plannen, geüploade documenten en een doorlopende samenvatting van oudere berichten. Het stabiele deel van de prompt wordt een uur gecachet; dit deel nooit, zodat het niet kan verouderen.

Twee regels bepaalden de rest. Alles wat openbaar of onomkeerbaar is, gaat in een plan dat de eigenaar goedkeurt, nooit rechtstreeks naar buiten. En een post bestaat alleen als een tool hem in deze beurt heeft aangemaakt, wat een einde maakte aan de tijd dat de agent werk beschreef dat hij niet had gedaan. En de agent zit niet vast aan één model: toen een kleiner, goedkoper model goed genoeg werd, zette ik de chat daarop over, om de kosten per gesprek te verlagen.

Context, elke beurt opnieuw opgebouwd

Instructies en toolseen uur gecachet
Datum en tijdde tijdzone van de eigenaar
Geheugendocumentenvoorkeuren, do's en don'ts
Live kalenderelke post en zijn status
Open plannenvoorgesteld en goedgekeurd
Het verhaal tot nu toeeen doorlopende samenvatting
→Het LLMTopmodellen · tot 8 stappen→

Toolaanroepen

✓get_posting_times
✓get_insights
✓propose_plan

Plan, wacht op goedkeuring

Oogstweek: 3 posts, 4 antwoorden

De agent bouwt zijn context op
// Volatile block: time + memory + live calendar + active plans + rolling summary.
// Rebuilt each turn (never cached) so the agent always sees current state.
const volatileSystem = () => {
  const parts = [
    nowBlock,
    renderMemories(memories),
    renderCalendar(calendar, todayISO),
    renderPlans(plans),
  ]
  if (documents.length) parts.push(renderDocuments(documents))
  if (rollingSummary) parts.push(`STORY SO FAR (summary of earlier messages in THIS conversation):\n${rollingSummary}`)
  // … then a line for each of the brand's other conversations
  return parts.join('\n\n')
}

Datamodel

Zo'n 55 tabellen, in een paar duidelijke groepen. Een workspace heeft leden en merken; al het andere hangt aan het merk, zodat row-level security overal één vraag kan beantwoorden: is deze persoon lid van dit merk?

Wie

  • Workspaces
  • Leden
  • Merkrollen
  • Profielen

Het merk

  • Merken
  • Kleuren, lettertypes, logo's
  • Producten en mensen
  • Geheugendocumenten
  • Merkdocumenten

Chat

  • Gesprekken
  • Berichten
  • Plannen
  • Planonderdelen

De kalender

  • Posts
  • Eén per netwerk
  • Postcijfers
  • Reacties op posts

Kanalen

  • Gekoppelde accounts
  • Dagelijkse accountcijfers
  • Kanaalinstellingen

Inbox en cycli

  • Inboxthreads
  • Inboxberichten
  • Conceptantwoorden
  • Cycli
  • Cyclusrapporten

Alles onder ‘Wie’ draagt een merk-id; row-level security controleert die bij elke lees- en schrijfactie.

Betrouwbaarheid en beveiliging

Groselia publiceert op echte accounts, dus de dure fouten zijn een post die twee keer online gaat, of een post die stilletjes nooit online gaat. Daar zit het meeste engineeringwerk.

1Twee keer goedkeuren draait één keer

De planrunner claimt het plan, en daarna elk onderdeel, met een voorwaardelijke update, en elke idempotency key komt uit het eigen id van het onderdeel. Een dubbele klik of een retry speelt opnieuw af in plaats van opnieuw te posten.

2Webhooks zijn ondertekend en worden opnieuw afgespeeld

Elke levering van de publicatie-API moet een geldige HMAC-handtekening hebben. Handlers zijn idempotent omdat leveringen vaker dan eens kunnen binnenkomen, en een taak speelt elke tien minuten gemiste events opnieuw af.

3Weigeren voor het in de wachtrij gaat

Eén gedeeld regelbestand bepaalt wat elk netwerk accepteert (Instagram heeft media nodig, YouTube video, geen mix op Facebook). De planner checkt het voordat er iets in de wachtrij komt, en een geweigerde post komt terug als Mislukt, met de reden, in plaats van als Ingepland op de kalender te blijven staan.

4Toegang gecontroleerd bij elke aanroep

Row-level security in Postgres, een rolcheck in elke edge function, en MCP-toegang via OAuth met PKCE, afgebakend per merk en per actie, intrekbaar vanaf één pagina.

Een tijdlang deelden mijn lokale app en de live app één productiedatabase, en een migratie die vóór een deploy draaide, maakte ooit de live pagina met Brand Kits leeg. Sindsdien gebeurt backendwerk eerst op een Supabase-branch en wordt het samen met de code die het nodig heeft naar productie gemerged.

Kwaliteit en workflow

Zo'n 1.000 testcases in 140 testbestanden dekken de app, de MCP-server en de edge functions. Sommige checks bestaan omdat er ooit iets stukging: een pariteitstest laat de build falen als een van de 17 talen een key mist, en de databasesuites voor de MCP draaien op synthetische data en rollen aan het eind terug.

De agent heeft zijn eigen evals. Eén stelt de live agent een vaste reeks vragen over de prestaties van een merk, elke vraag in een nieuw gesprek, en checkt of hij Insights met de juiste periode heeft gelezen en of zijn antwoord dezelfde cijfers bevat als de Insights-pagina.

Eén persoon leverde meer dan 520 pull requests op door AI-agents als een team te behandelen. Elke wijziging krijgt een eigen branch in een eigen git-worktree, zodat Claude Code en Codex aan meerdere dingen tegelijk kunnen werken zonder elkaar in de weg te zitten. Elke agent draait zijn tests en typechecks, opent een kleine pull request, en niets wordt gemerged voordat ik het heb gelezen.

Een wijziging→Een eigen worktree→Claude Code of Codex→Tests en types→Een kleine PR→Mijn review→Mergen en deployen

Technische uitdagingen

Elk ervan leek een bug in de interface en bleek iets diepers te zijn: de vorm van een stream, een tijdstempel, wat een netwerk echt rapporteert, een klok.

Genereren dat live aanvoelt · Realtime

Een maand aan posts genereren betekende een laadicoontje en dan twaalf posts die tegelijk verschenen. Het voelde traag, maar het model was het probleem niet. De granulariteit wel.

Ik zette de output van het model om naar JSON Lines en streamde die, waarbij elke post werd ingevoegd zodra zijn regel klaar was. De kalender abonneert zich via Supabase Realtime op Postgres-wijzigingen en tekent eerst placeholders, zodat de posts zichzelf één voor één intypen.

Hetzelfde wachten voelt nu als iemand aan het werk zien.

Twee tijdstempels die nooit overeenkwamen · Data

Supabase waarschuwde dat de database bijna door zijn disk-IO heen was. Lezen ging prima. Iets herschreef steeds dezelfde rijen: 344k inserts om 83k berichten op te slaan.

De inboxsync vergeleek de opgeslagen tijdstempel met die hij teruglas. Postgres gaf hem terug als +00:00 en wij schreven hem als Z, dus elk gesprek leek gewijzigd en werd bij elke ronde opnieuw gedownload. Tijdstippen vergelijken in plaats van strings loste het op.

Twee tijdstempels vergelijken
export function sameInstant(a: string | null | undefined, b: string | null | undefined): boolean {
  if (a == null && b == null) return true;
  if (a == null || b == null) return false;
  if (a === b) return true;
  const ta = Date.parse(a);
  const tb = Date.parse(b);
  return Number.isFinite(ta) && Number.isFinite(tb) && ta === tb;
}

Inserts om 83k berichten op te slaan

344k→één per nieuw bericht

Gesprekken die elke ronde opnieuw gelezen worden

allemaal→alleen de gewijzigde

Het eindeloze herschrijven stopte, en inboxgeschiedenissen die nooit klaar raakten, werden voor het eerst volledig gesynchroniseerd.

Een nul is niet altijd een nul · Analytics

Onze analyticsaanbieder geeft voor elk netwerk dezelfde vorm terug en vult alles wat een netwerk niet rapporteert met 0. Instagram ‘had’ nul klikken op elke post. De grafieken logen beleefd.

Een metriekregister per platform dat vastlegt wat elk netwerk echt rapporteert, de rest bij het inladen op null zet, en elke grafiek een metriek eerlijk laat tonen, afzwakken of verbergen.

Insights over acht netwerken die nooit een getal tonen dat niemand heeft gemeten.

Uitgelogd door een klok die voorliep · Auth

Mijn medeoprichter werd uitgelogd op het moment dat hij inlogde: vijftien tokenrefreshes per seconde, en dan een rate limit. Niemand anders kon het reproduceren.

De klok van zijn computer liep meer dan een uur voor, dus elke verse token leek verlopen. Ik heb de sessieopslag zo ingepakt dat de vervaltijd bij het wegschrijven van een sessie opnieuw wordt afgestemd op de lokale klok.

Tokenrefreshes per seconde

15→0

Inloggen werkt met elke apparaatklok, en de console meldt het als er een verkeerd staat.

Lessen

Smaak is de slotgracht

Als AI bouwen goedkoop maakt, kan iedereen opleveren, en het meeste lijkt op elkaar. Wat schaars blijft, is oordeelsvermogen: weten wat je weglaat, hoe een scherm moet voelen, wanneer een animatie er één te veel is. Voor een team van twee dat niemand kan overbieden, is smaak wat Groselia eruit laat zien en laat werken als iets veel groters, en het is het enige deel dat ik nooit aan een model zou overlaten.

Verkoop het resultaat, niet de tool

Niemand wilde marketingsoftware bedienen, hoe goed ook. Ze wilden gezien worden. Het werk verkopen in plaats van de app maakte het product belangrijker, niet minder belangrijk: het werd de motor waar we elke dag mee draaien, dus elk ruw randje werd gladgestreken.

Context wint van slimheid

De agent werd beter toen hij meer wist, niet toen de prompt slimmer werd. Hem elke beurt de live kalender, het geheugen en de open plannen geven, en hem laten vragen voordat hij handelt, deed meer dan welke modelupgrade ook.

AI verandert de omvang van het team

Nu agents het meeste code parallel schrijven, is mijn werk verschoven naar beslissen wat we bouwen, elke wijziging reviewen en de lat hoog houden. Eén persoon kan nu runnen waar vroeger een team voor nodig was, zolang die persoon de eindredacteur blijft.

Volgend project

Alle projecten