Groselia

Des réseaux sociaux qui tournent tout seuls

Mon rôle

Cofondateur
Ingénierie
Design produit et de marque

Description

Groselia gère les réseaux sociaux des startups tech en priorité, et aussi d'entreprises d'autres secteurs et d'autres tailles : stratégie, design, publication, réponses aux commentaires et reporting, sur chaque réseau, depuis une seule plateforme.

Équipe

Danilo ParmegianiCofondateur
Pedro CritchiCofondateur

Contexte

J'ai lancé Groselia avec Pedro, à deux. Il s'occupe du marketing, des ventes et des opérations ; j'ai conçu la marque et le produit, et construit la plateforme sur laquelle tout tourne, de la base de données à la dernière animation. Quand elle était en libre-service, plus de 200 personnes s'y sont inscrites, et aujourd'hui elle gère le contenu et les réseaux sociaux de nos clients. En juin 2026, nous avons levé un pre-seed de R$100k auprès de Link Vector, l'accélérateur de Link School of Business, où j'ai fait mes études, et deux mois après le pivot vers un service, Groselia génère plus de R$15 000 par mois.

Outils

Codex
Claude Code
Figma
Adobe tools

Stack

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

Chronologie

2025–aujourd'hui

En chiffres

R$180k+
run rate annuel
200+
comptes créés
350
marques configurées
9,700+
commits
520+
pull requests
47
edge functions

Défi

Construire a cessé d'être le goulot d'étranglement. Être vu l'est devenu.

L'IA a effondré le coût de fabrication d'un logiciel. Un fondateur sans formation d'ingénieur peut aujourd'hui sortir un produit en un week-end, et tout le monde aussi. Ce qui n'est pas devenu moins cher, c'est d'amener qui que ce soit à le remarquer. La distribution est une opération continue, pas une tâche : publier chaque jour, sur huit réseaux qui veulent chacun un format différent, répondre à chaque commentaire, et lire des chiffres que chaque app remonte différemment.

Les startups le paient de l'une de trois façons. Elles embauchent une équipe qu'elles ne peuvent pas encore s'offrir, elles assemblent une dizaine d'outils qui règlent chacun une petite partie, ou elles ne publient rien et le paient en croissance. Groselia existe pour être la quatrième option.

Comment on en est arrivé là

Groselia a changé de forme quatre fois avant de trouver ce qu'elle est. Chaque virage a gardé ce qui marchait et laissé tomber le reste.

  1. Fin 2025 – févr. 2026

    Argibee

    Une plateforme de brand design par IA. Elle a commencé comme prototype fin 2025 et est devenue une vraie entreprise en février 2026. Elle n'a pas trouvé son marché, mais son moteur de brand kit est devenu la colonne vertébrale de tout ce qui a suivi.

  2. Avr. 2026

    Vidéo motion

    Groselia a commencé avec des vidéos de lancement façon Apple, faites à partir de templates After Effects. J'ai validé toute la chaîne à la main, puis j'ai vu qu'elle ne pouvait pas passer à l'échelle au niveau de qualité voulu.

  3. Juin 2026

    Pre-seed de Link Vector

    Nous avons rejoint la Startup School de Link School of Business, un programme de 100 jours pour fondateurs filmé comme une téléréalité (voir la saison). Il s'est terminé par un demo day où j'ai pitché Groselia sur scène, et par notre pre-seed de R$100k de Link Vector, l'accélérateur de Link School of Business, où j'ai fait mes études.

    Mon pitch au demo day
  4. Août 2026

    Le Lovable du marketing

    Une conversation au lieu d'un formulaire : décrivez la campagne, et Groselia la planifie, la rédige et la publie. Un agent de chat avec des outils, pas une armée de bots.

  5. Sept. 2026

    Un social media manager

    Les clients ne voulaient pas que l'IA crée leur contenu. Ils voulaient que leurs propres photos soient bien publiées et que leurs commentaires aient une réponse. Nous avons supprimé la génération et misé à fond sur la gestion des réseaux.

  6. Aujourd'hui

    Service as a software

    Nous vendons le travail, pas l'outil. Notre équipe gère les réseaux sociaux de chaque client sur la plateforme, ce qui permet à une seule personne de faire ce qui demandait une agence.

Construit en public

Nous avons construit en public dès le départ. À l'époque d'Argibee, nous partagions l'aventure sur YouTube, du lancement de la liste d'attente d'Argibee à la première vidéo où nous montrions Groselia. La suite de l'histoire, vidéo après vidéo, est sur notre chaîne.

Le lancement de la liste d'attente d'Argibee
La première vidéo qui montre Groselia

Marque

Je voulais une marque Groselia audacieuse : quelque chose qui fasse s'arrêter les gens pour regarder, sur le site, dans l'app et dans chaque post sur nos réseaux. Partout où on la croise, elle devait impressionner, susciter un peu d'admiration, et donner envie de faire appel à nous grâce à ce qu'on vient de voir. Surtout, elle devait être superbe aux yeux des startups tech, l'écosystème dont nous faisons partie et les premiers clients pour qui nous construisons.

J'ai conçu toute la marque avec le plugin Figma dans Codex : le logo, la typographie et son assemblage avec le symbole dans les bonnes proportions, l'imagerie, la bibliothèque d'icônes SVG, les styles de texte et une palette de couleurs organisée. Chaque décision allait sur un seul board, mesurée, pour pouvoir la comparer et en débattre.

Codex à côté du fichier Groselia dans Figma : le système de logo, le logo sur chaque couleur de fond, le symbole décliné dans la palette et la palette de couleurs
Les boards de la marque, construits dans Figma avec le plugin Figma dans Codex.

Le symbole

Le symbole est venu en premier et il est resté. Trois pétales doux qui tournent autour d'un centre : il vient de la toute première version de l'entreprise, et le nouveau logo a été construit autour de lui plutôt que par-dessus. Sa géométrie a été copiée et mise à l'échelle, jamais redessinée.

Le logotype

Le logotype est en TT Commons Pro Bold, en minuscules, vectorisé pour s'afficher pareil partout. Avec son espacement naturel, il paraissait lâche à côté du symbole, alors je l'ai resserré à −4 % d'approche en décalant chaque lettre de 6,4 unités de plus vers la gauche à 160 px. Ça paraît minuscule ; le mot est passé de 564 à 520 unités de large et se lit désormais comme une seule forme.

Une grille en H

Tout est mesuré en H, la hauteur visible du logotype, sur une grille de H/10. Ainsi, le logo change d'échelle sans que personne ait à le régler à l'œil.

Pour le logo empilé, j'ai dessiné six options, trois tailles de symbole (1,50H, 1,75H, 2,00H) pour deux espacements (0,15H, 0,25H), et nous avons choisi B : un symbole de 1,75H, à 0,15H au-dessus du mot. Pour le logo horizontal, j'ai comparé des espacements de 0,20H à 0,35H et retenu un symbole de 1,10H avec un espacement de 0,35H.

1.75H0.15HH

Le logo empilé sur sa grille de construction. H est la hauteur du logotype ; la grille est en H/10.

Logo Groselia horizontal

Horizontal

Symbole 1,10H · espacement 0,35H

Logo Groselia empilé

Empilé

Symbole 1,75H · espacement 0,15H

Logo Groselia symbole

Symbole

Proportions d'origine, 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.

Typographie

TT Commons Pro fait tout : six graisses de Light à ExtraBold, une échelle de onze tailles de 12 à 96 px, et de vraies italiques. J'y ai migré les 688 calques de texte du fichier, pour que le brand book, l'app et le site parlent d'une seule voix.

Police principale

TT Commons
Pro

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

Icône de l'app

L'icône de l'app est le seul endroit où la marque passe en 3D : le symbole en porcelaine, en couches, éclairé par le haut et un peu brillant. Lors d'une mise à jour, j'ai réduit le symbole de 10 % à l'intérieur pour qu'il respire dans sa tuile. Elle a aussi son propre assemblage avec le logotype, la tuile à 1,5H.

Icône de l'app Groselia

Un monde d'objets 3D

Autour du logo vit toute une bande d'objets 3D : un cœur avec des yeux qui roulent, des bulles de chat, un hashtag, des étincelles. Ils sont la voix de la marque sur le site et dans nos posts, et ils ne tiennent jamais en place : ils flottent, et sur le site ils réagissent au curseur. Ceux-ci aussi : bousculez-les, ou tirez-en un et lâchez-le.

Neo doodles

Pour tout ce qui est en aplat, il y a Neo, notre jeu d'icônes : contours noirs épais, remplissages tirés de la palette et un seul reflet blanc. Sur le site, chacune commence comme une simple icône au trait dans une pastille blanche, et devient son doodle au survol, ses éléments arrivant un par un : le disque surgit, les barres tombent, le reflet se dessine. Ce sont les doodles et l'animation du site, copiés tels quels. Survolez-en un.

Connexions officielles
Zéro effort
Pause à tout moment
Tout est enregistré
Vos données restent privées
Partez quand vous voulez
Des réponses avec votre ton
Validation humaine
Leads signalés
Publicité payante
Landing page
Refonte produit
Rebranding
Étincelle
Cœur
Trophée

Produit

Dans Groselia, tout se fait en écrivant dans un seul chat. Vous écrivez ce qui doit sortir et quand, et il le programme, le publie, répond aux commentaires et vous dit ce qui a marché. Le travail arrive sous la forme d'un seul plan que le propriétaire approuve, au lieu d'une dizaine d'écrans à manipuler.

Une conversation, pas un tableau de bord

Comment s'est passée la semaine dernière ?

Meilleure semaine depuis juin.

  • La portée est en hausse de 38 %, portée par le reel latte art (41K vues sur Instagram, 64K sur TikTok).
  • Les enregistrements ont doublé sur le carrousel espresso. Les gens gardent les recettes.
  • Des commentaires attendent. 14 questions sur la livraison et la mouture, la plupart sans réponse.

La tendance est claire : la vidéo entre 17 h et 19 h, les photos le matin. Je suivrais ça pour les deux prochaines semaines.

il y a 2 jours

Bonjour ! Deux choses vous attendent cette semaine :

  • La récolte Carmo de Minas arrive en rayon vendredi, et rien n'est encore prévu pour elle.
  • 14 questions attendent sous vos posts, surtout sur la livraison.

Par quoi voulez-vous commencer ?

Choisissez une option
il y a 8 minutes

Groselia a commencé comme un formulaire : choisir un objectif, remplir les champs, obtenir une campagne. Personne n'a envie de remplir des formulaires sur sa propre entreprise, alors maintenant chaque marque a une seule conversation à la place.

Vous ouvrez votre marque et vous écrivez. Demandez quoi publier cette semaine, déposez des photos depuis votre téléphone, ou écrivez « réponds aux commentaires d'hier ». L'agent regarde avant de répondre : votre calendrier, ce qui a performé, la mémoire de la marque.

Quand il a besoin de quelque chose de vous, il pose une courte série de questions auxquelles vous répondez d'un geste. Puis il propose un seul plan : les posts avec leurs dates et heures, les réponses, les changements éventuels. Vous modifiez ce que vous voulez, vous approuvez, et vous regardez le calendrier se remplir.

La carte ici, c'est le vrai chat, reconstruit dans le navigateur à partir des propres tokens de l'app. Allez-y, essayez-le.

Conçu deux fois : pour les propriétaires, puis pour nous

Le premier public, c'était les propriétaires de petites entreprises qui gèrent eux-mêmes leurs réseaux sociaux. Ils ne pensent pas en campagnes, en tunnels ou en fréquences de publication ; ils pensent « qu'est-ce que je publie cette semaine ? ». Le plus dur était donc de cacher la machinerie : un onboarding en quatre questions, un brand kit rempli à partir d'un lien, un calendrier qu'on peut glisser-déposer, chaque écran en dix-sept langues et utilisable sur téléphone.

Puis nous avons compris que les clients ne voulaient piloter aucun outil, aussi simple soit-il. Ils voulaient que le travail soit fait. Alors nous sommes devenus les principaux utilisateurs. Une personne de notre équipe gère de nombreuses marques, et la même app a dû s'enrichir d'espaces de travail multi-marques, de cycles qui s'ouvrent par une réunion et se ferment par un rapport, d'une étape de validation sur chaque post et d'une seule boîte de réception pour tous les réseaux. Les clients se connectent toujours, mais l'app est désormais l'endroit où ils regardent le travail se faire, pas celui où ils le font.

novembre 2026

Lun
103
Mar
113
Mer
123
Jeu
133
Ven
143
Sam
152
Dim
162
8:00

Pourquoi nous payons 40 % au-dessus du marché

Importé
6
Nouvelle récolte
49:00

Nouvelle récolte : Carmo de Minas

Publié
5
Coulisses
17:30

POV : premier service à la brûlerie

Publié
Recettes
9:00

Comment on règle l'espresso

Publié
12:00

Avis impopulaire sur la torréfaction foncée

Publié
Échec
Coulisses
1218:00

On note les commandes de nos habitués

Publié
8:30

L'heure du croissant

Planifié
3
Recrutement
11:00

Voici Ana, notre cheffe barista

À la main
RecettesNouvelle récolte+1
17:00

Latte art au ralenti

Planifié
9:00

Ce que devient 1 kg de café vert

Planifié
7
Coulisses
11:00

Dans la brûlerie, du début à la fin

Planifié
Recettes
18:30

Cold brew en 60 secondes

Brouillon
Vidéo manquante
Nouvelle récoltePromo
9:00

La nouvelle récolte est en rayon

Planifié
Brouillon
Recrutement
10:00

Nous recrutons un chef torréfacteur

Planifié
17:00

Latte glacé, du début à la fin

Brouillon
Promo
10:00

Votre table du samedi

Planifié
15:00

La saison de l'espresso tonic est là

Brouillon
Recettes
11:00

Le guide du pour-over en 4 minutes

Planifié
Promo
18:00

Voici le paquet Oakline

Brouillon
4

Conçu pour être lu par des agents

De plus en plus, le premier lecteur d'une marque ou d'une page web est une IA. Alors tout, dans Groselia, est écrit autant pour les agents que pour les humains. La mémoire d'une marque est un ensemble de simples documents Markdown, préférences, choses à faire et à éviter, faits sur la marque, que l'agent lit avant chaque réponse et modifie lui-même avec quatre outils, comme les assistants IA gèrent leur propre mémoire. Les gens ouvrent et modifient exactement les mêmes documents dans le brand kit.

Les Insights passent par un seul cœur partagé, lu à la fois par le tableau de bord et par l'agent, donc quand vous demandez « qu'est-ce qui marche ? », la réponse vient des chiffres que vous voyez. Et le site fait la même chose pour les assistants à qui les gens posent des questions sur nous : groselia.com sert un llms.txt, un llms-full.txt plus long et un fichier comparatif, tous générés à partir d'une seule source de faits dans le code, pour que ce qu'une IA dit de nos prix ou de notre sécurité ne puisse pas s'éloigner du site.

Engagement dans le temps

Par semaine, 30 derniers jours, par date de publication

Taux d'eng.7,69%

Fonctionnalités clés

  • Un brand kit à partir d'un lien

    Collez un site web et connectez vos comptes. Groselia analyse le site, lit vos anciens posts et remplit tout seul le logo, les couleurs, les polices, le ton et l'audience.

  • Une seule conversation

    Un agent IA doté de 41 outils légende vos médias, choisit les horaires à partir de vos propres données d'engagement, lit les métriques et rédige les réponses, puis rassemble le tout dans un plan.

  • Un calendrier pour huit réseaux

    Instagram, LinkedIn, TikTok, YouTube, X, Facebook, Threads et Reddit, chacun dans son format natif, avec les anciens posts importés pour que le calendrier ne soit jamais vide.

  • Chaque commentaire a sa réponse

    Les commentaires et DM de tous les réseaux dans une seule boîte de réception, avec des réponses rédigées avec le ton de la marque et tout ce qui est sensible gardé pour un humain.

  • Des Insights en langage clair

    Portée, vues et engagement sur tous les comptes, avec honnêteté sur ce que chaque plateforme remonte ou non, et une réponse à « qu'est-ce qui marche ? ».

  • Cycles et validations

    Le travail avance par cycles. Chacun s'ouvre par une réunion, se ferme par un rapport que l'IA rédige à partir des chiffres, et chaque post peut attendre la validation du client.

Construit avec des agents IA

J'ai construit Groselia avec des agents IA comme équipe d'ingénierie. Codex et Claude Code écrivaient le code, chaque changement sur sa propre branche, pendant que je le concevais, relisais chaque pull request et décidais de ce qui partait en production.

Et j'ai dicté la plupart de mes prompts au lieu de les taper, avec Wispr Flow. Un bon prompt, c'est un brief long et détaillé, et parler me permettait d'en donner un aussi vite que je le pensais.

  • Codex

    Agent de code

  • Claude Code

    Agent de code

  • Wispr Flow

    Dictée vocale

Site web

Le site, c'est là que la marque monte le son. Je l'ai conçu et développé en Next.js. Il existe en dix-sept langues, et il transmet la langue de chaque visiteur à l'app au moment de l'inscription.

Un hero avec lequel jouer

Le logo tourne pendant le chargement de la page, puis vient le hero : des objets 3D qui flottent, s'inclinent avec la souris et se font bousculer par le curseur, et une scène au scroll qui se termine sur « Made for you ».

groselia.com
Le hero de groselia.com : « We run your socials. You run your business. », avec les objets 3D autour du cœur

La vraie app, reconstruite

« Inside your Groselia » montre la plateforme telle qu'elle est, reconstruite en code à partir des propres écrans de l'app, avec une marque de démo.

groselia.com
« Inside your Groselia » : l'écran de connexion des réseaux de la plateforme

Un blog

Des notes sur la gestion des réseaux sociaux. Les articles sont de simples fichiers MDX, un par langue, sans CMS, et chacun a son propre flux et ses données structurées pour que les moteurs de recherche et les assistants IA le lisent correctement.

groselia.com
Le blog de groselia.com, le premier article mis en avant sous le curseur et d'autres articles en dessous

Un formulaire qui qualifie les leads

Chaque « Book a call » ouvre un court formulaire avant le calendrier : qui vous êtes, où vous publiez, ce dont vous avez besoin et votre budget. Chaque étape est enregistrée dans notre base de données au fur et à mesure, donc nous voyons même les réponses à moitié remplies, et un formulaire terminé prévient notre équipe sur Slack.

groselia.com
La page de réservation : « Let's talk about your social media. », avec le formulaire à côté des trois étapes

Responsive, toujours

Chaque page est aussi pensée pour le téléphone, pas juste rétrécie. Là où il n'y a pas de survol, les sections s'animent quand elles arrivent au milieu de l'écran.

La page d'accueil sur un téléphone
« Always in sync with your team » sur un téléphone, sa première carte animée
Le formulaire de réservation sur un téléphone, à l'étape qui demande vos besoins et votre budget mensuel

Ingénierie

Architecture

J'ai construit la plateforme moi-même, avec l'IA comme binôme. L'app est en React et Vite, la landing en Next.js, et toutes les deux reposent sur un seul projet Supabase : Postgres avec sécurité au niveau des lignes, auth, realtime et storage, et 47 edge functions. Tout ce qui est lent ou planifié tourne sur Trigger.dev, les réseaux sociaux passent par une seule API de publication, et Stripe gère les abonnements, les cartes et le boleto brésilien.

Il y a aussi un serveur MCP et un plugin Codex, pour qu'on puisse utiliser Groselia depuis un agent IA : les mêmes marques, posts et brouillons, sous forme d'outils.

Où on l'utilise

Le cœur

Supabase

En coulisses

L'app, le site web et le serveur MCP sont hébergés sur Vercel.

Survolez ou touchez un bloc pour voir ce qu'il fait et avec quoi il communique.

Le trajet d'un post

Le meilleur moyen de voir comment les pièces s'emboîtent, c'est de suivre un post, d'une phrase dans le chat jusqu'à ses chiffres dans Insights. Cliquez sur les étapes, ou laissez-les défiler.

App web

Le propriétaire demande

« Publie les photos de la récolte vendredi, sur Instagram et LinkedIn. » Le message part vers l'edge function de l'agent, qui renvoie sa réponse en streaming.

ReactStream SSE

L'agent

L'agent tourne sur les meilleurs modèles du marché, d'Anthropic, d'OpenAI et d'autres fournisseurs, sous la forme d'une seule edge function en streaming avec une boucle d'outils. Le modèle dispose de 41 outils à lui, plus la recherche et la lecture web, jusqu'à huit étapes par tour. Le plus dur n'a jamais été le modèle. C'était de s'assurer que l'agent sache toujours ce qui est vrai à l'instant présent.

Alors à chaque tour, avant que le modèle ne voie le message, la fonction reconstruit le contexte depuis la base de données : la date et l'heure dans le fuseau du propriétaire, les documents de mémoire de la marque, le calendrier en direct, les plans ouverts, les documents importés et un résumé glissant des anciens messages. La partie stable du prompt est mise en cache pendant une heure ; celle-ci ne l'est jamais, pour qu'elle ne puisse pas devenir obsolète.

Deux règles ont façonné le reste. Tout ce qui est public ou irréversible passe par un plan que le propriétaire approuve, jamais directement. Et un post n'existe que si un outil l'a créé pendant ce tour, ce qui a mis fin à l'époque où l'agent décrivait un travail qu'il n'avait pas fait. Et l'agent n'est pas lié à un seul modèle : quand un modèle plus petit et moins cher est devenu assez bon, j'y ai passé le chat, pour réduire le coût par conversation.

Le contexte, reconstruit à chaque tour

Instructions et outilsen cache pendant une heure
Date et heurele fuseau horaire du propriétaire
Documents de mémoirepréférences, à faire et à éviter
Calendrier en directchaque post et son statut
Plans ouvertsproposés et approuvés
L'histoire jusqu'iciun résumé glissant
→Le LLMModèles de pointe · jusqu'à 8 étapes→

Appels d'outils

✓get_posting_times
✓get_insights
✓propose_plan

Plan en attente de validation

Semaine de la récolte : 3 posts, 4 réponses

L'agent, qui construit son contexte
// 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')
}

Modèle de données

Environ 55 tables, en quelques groupes clairs. Un espace de travail a des membres et des marques ; tout le reste est rattaché à la marque, pour que la sécurité au niveau des lignes puisse répondre partout à une seule question : cette personne est-elle membre de cette marque ?

Qui

  • Espaces de travail
  • Membres
  • Rôles par marque
  • Profils

La marque

  • Marques
  • Couleurs, polices, logos
  • Produits et personnes
  • Documents de mémoire
  • Documents de marque

Chat

  • Conversations
  • Messages
  • Plans
  • Éléments du plan

Le calendrier

  • Posts
  • Un par réseau
  • Métriques des posts
  • Commentaires des posts

Réseaux

  • Comptes connectés
  • Métriques quotidiennes des comptes
  • Réglages des réseaux

Boîte de réception et cycles

  • Fils de la boîte de réception
  • Messages de la boîte de réception
  • Brouillons de réponses
  • Cycles
  • Rapports de cycle

Tout ce qui est sous « Qui » porte un identifiant de marque ; la sécurité au niveau des lignes le vérifie à chaque lecture et à chaque écriture.

Fiabilité et sécurité

Groselia publie sur de vrais comptes, donc les pannes qui coûtent cher, c'est un post qui part deux fois, ou un post qui ne part jamais sans prévenir. L'essentiel de l'ingénierie est là.

1Approuver deux fois n'exécute qu'une fois

Le plan runner réserve le plan, puis chaque élément, avec une mise à jour conditionnelle, et chaque clé d'idempotence vient de l'identifiant de l'élément lui-même. Un double clic ou une nouvelle tentative rejoue au lieu de republier.

2Webhooks signés et rejoués

Chaque envoi de l'API de publication doit porter une signature HMAC valide. Les handlers sont idempotents parce qu'un même envoi peut arriver plusieurs fois, et une tâche rejoue tout événement manqué toutes les dix minutes.

3Refuser avant de mettre en file

Un seul fichier de règles partagé dit ce que chaque réseau accepte (Instagram exige un média, YouTube une vidéo, pas de mélange sur Facebook). Le planificateur le vérifie avant toute mise en file, et un post refusé revient en Échec, avec la raison, au lieu de rester sur le calendrier en Planifié.

4Accès vérifié à chaque appel

Sécurité au niveau des lignes dans Postgres, contrôle de rôle dans chaque edge function, et accès MCP via OAuth avec PKCE, limité par marque et par action, révocable depuis une seule page.

Pendant un temps, mon app locale et celle en ligne partageaient une seule base de données de production, et une migration passée avant un déploiement a un jour vidé la page Brand Kits en ligne. Depuis, le travail backend se fait d'abord sur une branche Supabase et fusionne en production avec le code qui en a besoin.

Qualité et workflow

Environ 1 000 cas de test répartis dans 140 fichiers couvrent l'app, le serveur MCP et les edge functions. Certains contrôles existent parce que quelque chose a cassé une fois : un test de parité fait échouer le build s'il manque une clé dans l'une des 17 langues, et les suites de base de données du MCP tournent sur des données synthétiques et font un rollback à la fin.

L'agent a ses propres evals. L'une pose à l'agent en production une série fixe de questions sur les performances d'une marque, chacune dans une nouvelle conversation, et vérifie qu'il a lu Insights sur la bonne période et que sa réponse donne les mêmes chiffres que la page Insights.

Une seule personne a livré plus de 520 pull requests en traitant les agents IA comme une équipe. Chaque changement a sa propre branche dans son propre worktree git, pour que Claude Code et Codex puissent travailler sur plusieurs choses à la fois sans se marcher dessus. Chacun lance ses tests et ses vérifications de types, ouvre une petite pull request, et rien n'est fusionné avant que je l'aie lu.

Un changement→Son propre worktree→Claude Code ou Codex→Tests et types→Une petite PR→Ma relecture→Merge et déploiement

Défis techniques

Chacun ressemblait à un bug d'interface et s'est révélé plus profond : la forme d'un stream, un horodatage, ce qu'un réseau remonte vraiment, une horloge.

Rendre la génération vivante · Realtime

Générer un mois de posts, c'était un spinner, puis douze posts qui apparaissaient d'un coup. Ça paraissait lent, mais le modèle n'était pas le problème. La granularité, si.

J'ai fait passer la sortie du modèle en JSON Lines et je l'ai streamée, en insérant chaque post dès que sa ligne se fermait. Le calendrier s'abonne aux changements de Postgres via Supabase Realtime et affiche d'abord des emplacements vides, si bien que les posts s'écrivent un par un.

La même attente donne maintenant l'impression de regarder quelqu'un travailler.

Deux horodatages qui ne correspondaient jamais · Données

Supabase nous a prévenus que la base de données allait manquer d'IO disque. Les lectures allaient bien. Quelque chose réécrivait les mêmes lignes : 344k insertions pour stocker 83k messages.

La synchro de la boîte de réception comparait l'horodatage enregistré avec celui relu. Postgres le renvoyait en +00:00 et nous l'écrivions en Z, donc chaque conversation semblait modifiée et chaque passage la retéléchargeait. Comparer des instants plutôt que des chaînes a réglé le problème.

Comparer deux horodatages
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;
}

Insertions pour stocker 83k messages

344k→une par nouveau message

Conversations relues à chaque passage

toutes→celles qui ont changé

Les écritures inutiles se sont arrêtées, et des historiques de boîte de réception qui n'aboutissaient jamais se sont synchronisés pour la première fois.

Un zéro n'est pas toujours un zéro · Analytics

Notre fournisseur d'analytics renvoie le même format pour tous les réseaux et remplit avec 0 tout ce qu'un réseau ne remonte pas. Instagram « avait » zéro clic sur chaque post. Les graphiques mentaient poliment.

Un registre de métriques par plateforme, qui note ce que chaque réseau remonte vraiment, met le reste à null à l'ingestion, et laisse chaque graphique afficher, dégrader ou masquer une métrique en toute honnêteté.

Des Insights sur huit réseaux qui n'affichent jamais un chiffre que personne n'a mesuré.

Déconnecté par une horloge en avance · Auth

Mon cofondateur était déconnecté à l'instant même où il se connectait : quinze rafraîchissements de token par seconde, puis une limite de débit. Personne d'autre n'arrivait à le reproduire.

L'horloge de son ordinateur avait plus d'une heure d'avance, donc chaque token tout neuf semblait expiré. J'ai enveloppé le stockage de session pour recaler l'expiration sur l'horloge locale à chaque écriture de session.

Rafraîchissements de token par seconde

15→0

La connexion marche quelle que soit l'horloge de l'appareil, et la console signale quand elle est décalée.

À retenir

Le goût est le rempart

Quand l'IA rend la construction bon marché, tout le monde peut livrer, et la plupart des choses se ressemblent. Ce qui reste rare, c'est le jugement : savoir quoi laisser de côté, quel ressenti doit donner un écran, quand une animation est de trop. Pour une équipe de deux qui ne peut dépenser plus que personne, le goût est ce qui fait que Groselia a l'air et fonctionne comme quelque chose de bien plus grand, et c'est la seule partie que je ne confierais jamais à un modèle.

Vendre le résultat, pas l'outil

Personne ne voulait piloter un logiciel de marketing, aussi bon soit-il. Les gens voulaient être vus. Vendre le travail plutôt que l'app a rendu le produit plus important, pas moins : il est devenu le moteur qu'on fait tourner chaque jour, donc chaque aspérité a été corrigée.

Le contexte bat l'astuce

L'agent s'est amélioré quand il en savait plus, pas quand le prompt devenait plus malin. Lui donner à chaque tour le calendrier en direct, la mémoire et les plans ouverts, et le faire demander avant d'agir, a fait plus que n'importe quelle mise à niveau du modèle.

L'IA change la taille de l'équipe

Avec des agents qui écrivent l'essentiel du code en parallèle, mon travail est devenu : décider quoi construire, relire chaque changement et garder la barre haute. Une seule personne peut désormais faire tourner ce qui demandait une équipe, tant qu'elle reste l'éditeur.

Projet suivant

Tous les projets