Groselia

Social media, które prowadzą się same

Moja rola

Współzałożyciel
Inżynieria
Projektowanie produktu i marki

Opis

Groselia prowadzi social media przede wszystkim dla startupów technologicznych, ale też dla firm z innych branż i różnej wielkości: strategia, design, publikacja, odpowiedzi na komentarze i raporty, na każdym kanale, z jednej platformy.

Zespół

Danilo ParmegianiWspółzałożyciel
Pedro CritchiWspółzałożyciel

Kontekst

Założyłem Groselię z Pedro, we dwóch. On odpowiada za marketing, sprzedaż i operacje; ja zaprojektowałem markę i produkt oraz zbudowałem platformę, na której to wszystko działa, od bazy danych po ostatnią animację. Kiedy produkt był self-serve, zarejestrowało się w nim ponad 200 osób, a dziś działają na nim treści i social media naszych klientów. W czerwcu 2026 roku zamknęliśmy rundę pre-seed na R$100k od Link Vector, akceleratora Link School of Business, którą ukończyłem, a dwa miesiące po pivocie w stronę usługi Groselia zarabia ponad R$15 000 miesięcznie.

Narzędzia

Codex
Claude Code
Figma
Adobe tools

Stack

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

Oś czasu

2025–obecnie

W liczbach

R$180k+
roczny run rate
200+
utworzonych kont
350
skonfigurowanych marek
9,700+
commits
520+
pull requestów
47
edge functions

Wyzwanie

Budowanie przestało być wąskim gardłem. Stała się nim widoczność.

AI zbiło koszt tworzenia oprogramowania. Założyciel bez technicznego zaplecza może dziś wypuścić produkt w weekend — i każdy inny też. Tańsze nie stało się jedno: sprawienie, żeby ktokolwiek go zauważył. Dystrybucja to ciągła operacja, nie zadanie: publikowanie codziennie, w ośmiu sieciach, z których każda chce innego formatu, odpowiadanie na każdy komentarz i czytanie liczb, które każda aplikacja podaje inaczej.

Startupy płacą za to na jeden z trzech sposobów. Zatrudniają zespół, na który jeszcze ich nie stać, sklejają tuzin narzędzi, z których każde rozwiązuje jeden kawałek, albo nic nie publikują i płacą wzrostem. Groselia istnieje, żeby być czwartą opcją.

Jak do tego doszło

Groselia czterokrotnie zmieniała kształt, zanim odnalazła to, czym jest. Każdy zwrot zachowywał to, co działało, a resztę odrzucał.

  1. Koniec 2025 – lut 2026

    Argibee

    Platforma AI do projektowania marek. Pod koniec 2025 roku powstała jako prototyp, a w lutym 2026 stała się prawdziwą firmą. Nie znalazła swojego rynku, ale jej silnik brand kitów stał się kręgosłupem wszystkiego, co przyszło potem.

  2. Kwi 2026

    Filmy motion design

    Groselia zaczynała od filmów premierowych w stylu Apple, robionych z szablonów After Effects. Ręcznie sprawdziłem cały pipeline, a potem zobaczyłem, że nie da się go skalować do wymaganej jakości.

  3. Cze 2026

    Pre-seed od Link Vector

    Dołączyliśmy do Startup School w Link School of Business, 100-dniowego programu dla założycieli kręconego jak reality show (zobacz sezon). Zakończył się demo day, na którym pitchowałem Groselię na scenie, i naszą rundą pre-seed na R$100k od Link Vector, akceleratora Link School of Business, którą ukończyłem.

    Mój pitch na demo day
  4. Sie 2026

    Lovable dla marketingu

    Jedna rozmowa zamiast formularza: opisz kampanię, a Groselia ją zaplanuje, napisze i opublikuje. Agent czatu z narzędziami, a nie zestaw botów.

  5. Wrz 2026

    Social media manager

    Klienci nie chcieli, żeby AI tworzyło im treści. Chcieli, żeby ich własne zdjęcia były dobrze publikowane, a komentarze miały odpowiedzi. Wycięliśmy generowanie i poszliśmy w głąb prowadzenia kanałów.

  6. Teraz

    Service as a software

    Sprzedajemy pracę, a nie narzędzie. Nasz zespół prowadzi social media każdego klienta na platformie, dzięki której jedna osoba ogarnia to, co kiedyś wymagało agencji.

Budowane publicznie

Od początku budowaliśmy publicznie. Jeszcze jako Argibee dzieliliśmy się tą drogą na YouTube, od startu listy oczekujących Argibee po pierwszy film, w którym pokazaliśmy Groselię. Resztę historii, film po filmie, znajdziesz na naszym kanale.

Start listy oczekujących Argibee
Pierwszy film z Groselią

Marka

Chciałem, żeby marka Groselii była odważna: taka, przy której ludzie się zatrzymują i patrzą — na stronie, w aplikacji i w każdym poście w naszych social mediach. Gdziekolwiek ktoś na nią trafi, ma zrobić wrażenie, wzbudzić odrobinę podziwu i sprawić, że będzie chciał nas zatrudnić przez to, co właśnie zobaczył. Przede wszystkim musiała świetnie wyglądać w oczach startupów technologicznych — ekosystemu, którego jesteśmy częścią, i klientów, dla których budujemy w pierwszej kolejności.

Całą markę zaprojektowałem za pomocą pluginu Figmy w Codex: logo, typografię i to, jak łączy się z symbolem we właściwych proporcjach, warstwę wizualną, bibliotekę ikon SVG, style tekstu i uporządkowaną paletę kolorów. Każda decyzja trafiała na jedną tablicę, zwymiarowana, żeby można ją było porównać i się o nią spierać.

Codex obok pliku Groselii w Figmie: system logo, logo na każdym kolorze tła, symbol w całej palecie i paleta kolorów
Tablice marki, zbudowane w Figmie za pomocą pluginu Figmy w Codex.

Symbol

Symbol był pierwszy i został. Trzy miękkie płatki obracające się wokół środka przeszły z pierwszej wersji firmy, a nowe logo zbudowano wokół niego, a nie na nim: jego geometrię kopiowano i skalowano, nigdy nie rysowano od nowa.

Logotyp

Logotyp to TT Commons Pro Bold, małymi literami, zamieniony na wektory, żeby wszędzie wyglądał tak samo. Przy naturalnych odstępach wydawał się luźny obok symbolu, więc zacisnąłem go do −4% trackingu, przesuwając każdą literę w lewo o dodatkowe 6,4 jednostki przy 160px. Brzmi jak drobiazg; słowo zwęziło się z 564 do 520 jednostek i zaczęło czytać się jak jeden kształt.

Siatka z H

Wszystko mierzy się w H, czyli widocznej wysokości logotypu, na siatce H/10. Dzięki temu logo się skaluje i nikt nie musi go znowu ustawiać na oko.

Do wersji pionowej narysowałem sześć opcji: trzy rozmiary symbolu (1.50H, 1.75H, 2.00H) na dwa odstępy (0.15H, 0.25H), i wybraliśmy B: symbol 1.75H, 0.15H nad słowem. Przy wersji poziomej porównałem odstępy od 0.20H do 0.35H i zostałem przy symbolu 1.10H z odstępem 0.35H.

1.75H0.15HH

Pionowe logo na siatce konstrukcyjnej. H to wysokość logotypu; siatka to H/10.

Logo Groselii: poziome

Poziome

Symbol 1.10H · odstęp 0.35H

Logo Groselii: pionowe

Pionowe

Symbol 1.75H · odstęp 0.15H

Logo Groselii: symbol

Symbol

Oryginalne proporcje, 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.

Typografia

TT Commons Pro robi wszystko: sześć grubości od Light do ExtraBold, jedenastostopniowa skala od 12 do 96px i prawdziwa kursywa. Przeniosłem na niego wszystkie 688 warstw tekstowych w pliku, więc brandbook, aplikacja i strona mówią teraz jednym głosem.

Font główny

TT Commons
Pro

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

Ikona aplikacji

Ikona aplikacji to jedyne miejsce, w którym marka staje się trójwymiarowa: symbol z porcelany, warstwowy, oświetlony z góry i lekko błyszczący. W późniejszym odświeżeniu zmniejszyłem symbol w środku o 10%, żeby miał więcej oddechu w kafelku. Ma też własne zestawienie z logotypem: kafelek w rozmiarze 1.5H.

Ikona aplikacji Groselia

Świat obiektów 3D

Wokół logo żyje obsada obiektów 3D: serce z ruchomymi oczkami, dymki czatu, hashtag, iskierki. To one są głosem marki na stronie i w naszych postach, i nigdy nie stoją w miejscu: unoszą się, a na stronie reagują na kursor. Te też: popchnij je albo odciągnij jeden i puść.

Neo doodles

Do wszystkiego, co płaskie, jest Neo, nasz zestaw ikon: grube czarne kontury, wypełnienia z palety i jeden biały odblask. Na stronie każda zaczyna jako zwykła ikona liniowa w białym kafelku i po najechaniu zamienia się w swój doodle, a jej części pojawiają się po kolei: dysk wyskakuje, paski opadają, odblask się rysuje. To oryginalne doodle i animacje ze strony, skopiowane jeden do jednego. Najedź na którąś.

Oficjalne połączenia
Bez twojego udziału
Pauza w każdej chwili
Wszystko zapisane
Dane zostają prywatne
Odejdź, kiedy chcesz
Odpowiedzi twoim głosem
Weryfikacja przez człowieka
Leady oznaczone
Płatne reklamy
Landing page
Redesign produktu
Rebranding
Iskra
Serce
Puchar

Produkt

Wszystko w Groselii robi się, pisząc w jednym czacie. Piszesz, co ma wyjść i kiedy, a ona to planuje, publikuje, odpowiada na komentarze i mówi ci, co zadziałało. Praca przychodzi jako jeden plan, który zatwierdza właściciel, a nie tuzin ekranów do obsługi.

Rozmowa, nie dashboard

Jak poszedł zeszły tydzień?

Najlepszy tydzień od czerwca.

  • Zasięg wzrósł o 38%, głównie dzięki rolce z latte artem (41 tys. wyświetleń na Instagramie, 64 tys. na TikToku).
  • Zapisów jest dwa razy więcej przy karuzeli o espresso. Ludzie zapisują przepisy.
  • Komentarze czekają. 14 pytań o dostawę i stopień zmielenia, większość bez odpowiedzi.

Wzór jest jasny: wideo między 17 a 19, zdjęcia rano. Trzymałbym się tego przez najbliższe dwa tygodnie.

2 dni temu

Dzień dobry! W tym tygodniu czekają na ciebie dwie rzeczy:

  • Zbiory z Carmo de Minas trafiają na półkę w piątek, a nic jeszcze pod nie nie zaplanowano.
  • 14 pytań czeka pod twoimi postami, głównie o dostawę.

Od czego chcesz zacząć?

Wybierz jedną
8 minut temu

Groselia zaczynała jako formularz: wybierz cel, wypełnij pola, dostań kampanię. Nikt nie chce wypełniać formularzy o własnym biznesie, więc teraz każda marka ma zamiast tego jedną rozmowę.

Otwierasz swoją markę i piszesz. Zapytaj, co opublikować w tym tygodniu, wrzuć zdjęcia z telefonu albo napisz „odpowiedz na wczorajsze komentarze”. Agent najpierw sprawdza, potem odpowiada: twój kalendarz, co się sprawdziło, pamięć marki.

Kiedy czegoś od ciebie potrzebuje, zadaje jedną krótką rundę pytań, na które odpowiadasz jednym dotknięciem. Potem proponuje jeden plan: posty z datami i godzinami, odpowiedzi, wszelkie zmiany. Edytujesz, co chcesz, akceptujesz i patrzysz, jak kalendarz się zapełnia.

Ta karta to prawdziwy czat, odtworzony w przeglądarce z tokenów samej aplikacji. Śmiało, wypróbuj go.

Zaprojektowane dwa razy: dla właścicieli, a potem dla nas

Pierwszymi odbiorcami byli właściciele małych firm, którzy sami prowadzą swoje social media. Nie myślą kampaniami, lejkami ani częstotliwością publikacji; myślą: „co wrzucić w tym tygodniu?”. Najtrudniejsze było więc ukrycie maszynerii: onboarding w czterech pytaniach, brand kit wypełniany z linku, kalendarz z przeciąganiem, każdy ekran w siedemnastu językach i wygodny na telefonie.

Potem zrozumieliśmy, że klienci nie chcą obsługiwać żadnego narzędzia, nawet najprostszego. Chcieli, żeby praca była zrobiona. Więc to my staliśmy się głównymi użytkownikami. Jedna osoba z naszego zespołu prowadzi wiele marek, a ta sama aplikacja musiała dorobić się workspace’ów z wieloma markami, cykli, które otwiera spotkanie, a zamyka raport, kroku akceptacji przy każdym poście i jednej skrzynki dla wszystkich sieci. Klienci nadal się logują, ale teraz aplikacja jest miejscem, gdzie oglądają pracę, a nie ją wykonują.

listopad 2026

Pon
103
Wt
113
Śr
123
Czw
133
Pt
143
Sob
152
Nd
162
8:00

Dlaczego płacimy 40% powyżej rynku

Zaimportowany
6
Nowe zbiory
49:00

Nowe zbiory: Carmo de Minas

Opublikowany
5
Za kulisami
17:30

POV: pierwsza zmiana w palarni

Opublikowany
Przepisy
9:00

Jak ustawiamy espresso

Opublikowany
12:00

Niepopularna opinia o ciemnym paleniu

Opublikowany
Niepowodzenie
Za kulisami
1218:00

Oceniamy zamówienia naszych stałych gości

Opublikowany
8:30

Pora na croissanta

Zaplanowany
3
Rekrutacja
11:00

Poznajcie Anę, naszą szefową baristów

Ręcznie
PrzepisyNowe zbiory+1
17:00

Latte art w zwolnionym tempie

Zaplanowany
9:00

Czym staje się 1 kg zielonej kawy

Zaplanowany
7
Za kulisami
11:00

Palarnia od środka, od początku do końca

Zaplanowany
Przepisy
18:30

Cold brew w 60 sekund

Szkic
Brak wideo
Nowe zbioryPromocja
9:00

Nowe zbiory już na półce

Zaplanowany
Szkic
Rekrutacja
10:00

Szukamy szefa palarni

Zaplanowany
17:00

Iced latte od początku do końca

Szkic
Promocja
10:00

Twój sobotni stolik

Zaplanowany
15:00

Sezon na espresso tonic otwarty

Szkic
Przepisy
11:00

Drip w 4 minuty: poradnik

Zaplanowany
Promocja
18:00

Poznajcie torebkę Oakline

Szkic
4

Zbudowane tak, żeby czytały je agenty

Coraz częściej pierwszym czytelnikiem marki czy strony internetowej jest AI. Dlatego wszystko w Groselii jest napisane w równym stopniu dla agentów, co dla ludzi. Pamięć marki to zestaw zwykłych dokumentów w Markdownie — preferencje, co wolno, a czego nie, fakty o marce — które agent czyta przed każdą odpowiedzią i sam edytuje czterema narzędziami, tak jak asystenci AI prowadzą własną pamięć. Ludzie otwierają i edytują dokładnie te same dokumenty w brand kicie.

Insights działają przez jeden wspólny rdzeń, który czytają i dashboard, i agent, więc gdy pytasz „co działa?”, odpowiedź pochodzi z liczb, które widzisz. A strona robi to samo dla asystentów, których ludzie pytają o nas: groselia.com serwuje llms.txt, dłuższy llms-full.txt i plik z porównaniem, wszystkie generowane z jednego źródła faktów w kodzie, więc to, co AI mówi o naszych cenach czy bezpieczeństwie, nie może rozjechać się ze stroną.

Zaangażowanie w czasie

Tygodniowo, ostatnie 30 dni, według daty publikacji

Wsk. zaang.7,69%

Najważniejsze funkcje

  • Brand kit z jednego linku

    Wklej adres strony i połącz konta. Groselia zbiera dane ze strony, czyta twoje wcześniejsze posty i sama uzupełnia logo, kolory, fonty, głos i grupę docelową.

  • Jedna rozmowa

    Agent AI z 41 narzędziami pisze opisy do twoich mediów, dobiera godziny na podstawie twoich własnych danych o zaangażowaniu, czyta metryki i szkicuje odpowiedzi, a potem łączy wszystko w plan.

  • Kalendarz dla ośmiu sieci

    Instagram, LinkedIn, TikTok, YouTube, X, Facebook, Threads i Reddit, każda w swoim natywnym formacie, z zaimportowanymi wcześniejszymi postami, więc kalendarz nigdy nie jest pusty.

  • Odpowiedź na każdy komentarz

    Komentarze i wiadomości ze wszystkich sieci w jednej skrzynce, ze szkicami odpowiedzi głosem marki, a wszystko, co drażliwe, czeka na człowieka.

  • Statystyki prostym językiem

    Zasięg, wyświetlenia i zaangażowanie na wszystkich kontach, uczciwie pokazujące, co każda platforma raportuje, a czego nie, i odpowiedź na pytanie „co działa?”.

  • Cykle i akceptacje

    Praca idzie w cyklach. Każdy otwiera spotkanie, a zamyka raport, który AI pisze na podstawie liczb, a każdy post może czekać na akceptację klienta.

Zbudowane z agentami AI

Zbudowałem Groselię z agentami AI jako moim zespołem inżynierskim. Codex i Claude Code pisały kod, każdą zmianę na osobnym branchu, a ja go projektowałem, przeglądałem każdy pull request i decydowałem, co trafia na produkcję.

Większość promptów nie pisałem, tylko mówiłem, z Wispr Flow. Dobry prompt to długi, szczegółowy brief, a mówienie pozwalało mi go podać tak szybko, jak myślałem.

  • Codex

    Agent do kodowania

  • Claude Code

    Agent do kodowania

  • Wispr Flow

    Dyktowanie głosowe

Strona

Strona to miejsce, gdzie marka jest najgłośniejsza. Zaprojektowałem i zbudowałem ją w Next.js. Jest w siedemnastu językach i przy rejestracji przekazuje język każdego odwiedzającego do aplikacji.

Hero, którym można się bawić

Podczas ładowania strony obraca się logo, a potem pojawia się hero: obiekty 3D, które unoszą się, przechylają za myszą i rozpychają kursorem, oraz scena przewijania, która kończy się hasłem „Made for you”.

groselia.com
Hero groselia.com: „We run your socials. You run your business.” z obiektami 3D wokół serca

Prawdziwa aplikacja, odtworzona

„Inside your Groselia” pokazuje platformę taką, jaka jest, odtworzoną w kodzie z ekranów samej aplikacji, z marką demo.

groselia.com
„Inside your Groselia”: ekran łączenia kanałów na platformie

Blog

Notatki o prowadzeniu social mediów. Posty to zwykłe pliki MDX, po jednym na język, bez CMS-a, a każdy ma własny feed i dane strukturalne, żeby wyszukiwarki i asystenci AI dobrze go czytali.

groselia.com
Blog groselia.com, pierwszy post podświetlony pod kursorem, a niżej kolejne

Formularz, który kwalifikuje leady

Każde „Book a call” otwiera przed kalendarzem krótki formularz: kim jesteś, gdzie publikujesz, czego potrzebujesz i jaki masz budżet. Każdy krok zapisuje się w naszej bazie na bieżąco, więc widzimy nawet niedokończone odpowiedzi, a wypełniony formularz daje znać naszemu zespołowi na Slacku.

groselia.com
Strona rezerwacji: „Let's talk about your social media.” z formularzem obok trzech kroków

Zawsze responsywna

Każda strona jest zaprojektowana także pod telefony, a nie tylko zmniejszona, żeby się zmieściła. Tam, gdzie nie ma hovera, sekcje budzą się, gdy docierają do środka ekranu.

Strona główna na telefonie
„Always in sync with your team” na telefonie, z aktywną pierwszą kartą
Formularz rezerwacji na telefonie, na kroku z pytaniem, czego potrzebujesz i jaki masz miesięczny budżet

Inżynieria

Architektura

Platformę zbudowałem sam, z AI jako partnerem. Aplikacja to React i Vite, landing to Next.js, a obie stoją na jednym projekcie Supabase: Postgres z row-level security, logowanie, realtime i storage oraz 47 edge functions. Wszystko, co wolne albo zaplanowane, działa na Trigger.dev, sieci społecznościowe przychodzą przez jedno API publikacji, a Stripe obsługuje plany, karty i brazylijskie boleto.

Jest też serwer MCP i plugin do Codex, więc z Groselii można korzystać z poziomu agenta AI: te same marki, posty i szkice, jako narzędzia.

Gdzie jest używane

Rdzeń

Supabase

Pod spodem

Aplikacja, strona i serwer MCP są hostowane na Vercel.

Najedź na pole lub je dotknij, żeby zobaczyć, co robi i z czym się łączy.

Droga posta

Najlepiej zobaczyć, jak części do siebie pasują, śledząc jeden post — od zdania na czacie po jego liczby w Insights. Przeklikaj kroki albo pozwól im się odtworzyć.

Aplikacja webowa

Właściciel prosi

„Wrzuć zdjęcia zbiorów w piątek, na Instagram i LinkedIn”. Wiadomość trafia do edge function agenta, która streamuje odpowiedź z powrotem.

ReactStrumień SSE

Agent

Agent działa na najlepszych modelach na rynku, od Anthropic, OpenAI i innych dostawców, jako jedna streamingowa edge function z pętlą narzędzi. Model dostaje 41 własnych narzędzi plus wyszukiwanie i pobieranie stron, do ośmiu kroków na turę. Trudną częścią nigdy nie był model. Było nią to, żeby agent zawsze wiedział, co jest prawdą w tej chwili.

Dlatego w każdej turze, zanim model zobaczy wiadomość, funkcja od nowa buduje kontekst z bazy danych: datę i godzinę w strefie czasowej właściciela, dokumenty pamięci marki, kalendarz na żywo, otwarte plany, wgrane dokumenty i bieżące podsumowanie starszych wiadomości. Stała część promptu jest w cache przez godzinę; ta nigdy nie trafia do cache, więc nie może się zdezaktualizować.

Resztę ukształtowały dwie zasady. Wszystko, co publiczne albo nieodwracalne, trafia do planu, który zatwierdza właściciel, nigdy prosto na zewnątrz. A post istnieje tylko wtedy, gdy w tej turze utworzyło go narzędzie — to skończyło czasy, kiedy agent opisywał pracę, której nie wykonał. Agent nie jest też przywiązany do jednego modelu: kiedy mniejszy, tańszy model stał się wystarczająco dobry, przeniosłem na niego czat, żeby obniżyć koszt rozmowy.

Kontekst, budowany od nowa w każdej turze

Instrukcje i narzędziaw cache przez godzinę
Data i godzinastrefa czasowa właściciela
Dokumenty pamięcipreferencje, co wolno, a czego nie
Kalendarz na żywokażdy post i jego status
Otwarte planyzaproponowane i zaakceptowane
Dotychczasowa historiabieżące podsumowanie
→LLMNajlepsze modele · do 8 kroków→

Wywołania narzędzi

✓get_posting_times
✓get_insights
✓propose_plan

Plan czeka na akceptację

Tydzień zbiorów: 3 posty, 4 odpowiedzi

Agent buduje swój kontekst
// 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')
}

Model danych

Około 55 tabel w kilku czytelnych grupach. Workspace ma członków i marki; wszystko inne wisi na marce, więc row-level security wszędzie może odpowiadać na jedno pytanie: czy ta osoba jest członkiem tej marki?

Kto

  • Workspace’y
  • Członkowie
  • Role w markach
  • Profile

Marka

  • Marki
  • Kolory, fonty, logo
  • Produkty i ludzie
  • Dokumenty pamięci
  • Dokumenty marki

Czat

  • Rozmowy
  • Wiadomości
  • Plany
  • Pozycje planu

Kalendarz

  • Posty
  • Po jednym na sieć
  • Metryki postów
  • Komentarze pod postami

Kanały

  • Połączone konta
  • Dzienne metryki kont
  • Ustawienia kanałów

Skrzynka i cykle

  • Wątki w skrzynce
  • Wiadomości w skrzynce
  • Szkice odpowiedzi
  • Cykle
  • Raporty z cykli

Wszystko poniżej „Kto” ma id marki; row-level security sprawdza je przy każdym odczycie i zapisie.

Niezawodność i bezpieczeństwo

Groselia publikuje na prawdziwych kontach, więc najdroższe awarie to post, który wychodzi dwa razy, albo post, który po cichu nigdy nie wychodzi. Tam idzie większość pracy inżynierskiej.

1Dwukrotna akceptacja działa raz

Wykonawca planów przejmuje plan, a potem każdą pozycję, warunkową aktualizacją, a każdy klucz idempotencji pochodzi z id samej pozycji. Podwójne kliknięcie albo ponowna próba jest powtórzeniem, a nie kolejną publikacją.

2Webhooki są podpisane i odtwarzane

Każda dostawa z API publikacji musi mieć poprawny podpis HMAC. Handlery są idempotentne, bo dostawy mogą przychodzić więcej niż raz, a osobne zadanie co dziesięć minut odtwarza każde pominięte zdarzenie.

3Odmowa przed kolejką

Jeden wspólny plik reguł mówi, co przyjmuje każda sieć (Instagram potrzebuje mediów, YouTube wideo, na Facebooku bez mieszania). Planer sprawdza go, zanim cokolwiek trafi do kolejki, a odrzucony post wraca jako Niepowodzenie, z powodem, zamiast wisieć w kalendarzu jako Zaplanowany.

4Dostęp sprawdzany przy każdym wywołaniu

Row-level security w Postgresie, sprawdzenie roli w każdej edge function i dostęp do MCP przez OAuth z PKCE, ograniczony do marki i akcji, do odwołania z jednej strony.

Przez jakiś czas moja lokalna aplikacja i ta produkcyjna dzieliły jedną bazę produkcyjną, a migracja puszczona przed deployem raz wyczyściła działającą stronę Brand Kits. Od tamtej pory praca nad backendem odbywa się najpierw na branchu Supabase i trafia na produkcję razem z kodem, który jej potrzebuje.

Jakość i workflow

Około 1000 przypadków testowych w 140 plikach testów pokrywa aplikację, serwer MCP i edge functions. Niektóre testy są tam, bo coś raz się zepsuło: test parytetu wywala build, jeśli w którymś z 17 języków brakuje klucza, a zestawy testów bazy dla MCP działają na danych syntetycznych i na koniec robią rollback.

Agent ma własne ewaluacje. Jedna zadaje działającemu agentowi stały zestaw pytań o wyniki marki, każde w nowej rozmowie, i sprawdza, czy odczytał Insights za właściwy okres i czy jego odpowiedź ma te same liczby, które pokazuje strona Insights.

Jedna osoba wypuściła ponad 520 pull requestów, traktując agentów AI jak zespół. Każda zmiana dostaje własny branch we własnym git worktree, więc Claude Code i Codex mogą pracować nad kilkoma rzeczami naraz, nie wchodząc sobie w drogę. Każdy odpala testy i sprawdzanie typów, otwiera mały pull request i nic nie jest mergowane, zanim tego nie przeczytam.

Zmiana→Własny worktree→Claude Code lub Codex→Testy i typy→Mały PR→Moje review→Merge i deploy

Wyzwania techniczne

Każdy wyglądał jak błąd w interfejsie, a okazywał się czymś głębszym: kształtem strumienia, znacznikiem czasu, tym, co sieć naprawdę raportuje, zegarem.

Generowanie, które czuć na żywo · Realtime

Generowanie miesiąca postów oznaczało spinner, a potem dwanaście postów naraz. Wydawało się wolne, ale problemem nie był model. Była nim granularność.

Przestawiłem wyjście modelu na JSON Lines i streamowałem je, wstawiając każdy post w chwili, gdy zamykała się jego linia. Kalendarz subskrybuje zmiany w Postgresie przez Supabase Realtime i najpierw rysuje placeholdery, więc posty wpisują się same, jeden po drugim.

To samo czekanie przypomina teraz patrzenie, jak ktoś pracuje.

Dwa znaczniki czasu, które nigdy się nie zgadzały · Dane

Supabase ostrzegł, że bazie zaraz skończy się dyskowe IO. Odczyty były w porządku. Coś nadpisywało te same wiersze: 344 tys. insertów, żeby zapisać 83 tys. wiadomości.

Synchronizacja skrzynki porównywała zapisany znacznik czasu z tym, który odczytywała z powrotem. Postgres zwracał go jako +00:00, a my zapisywaliśmy jako Z, więc każda rozmowa wyglądała na zmienioną i przy każdym przebiegu pobierała się od nowa. Porównywanie momentów w czasie zamiast napisów to naprawiło.

Porównanie dwóch znaczników czasu
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;
}

Insertów, żeby zapisać 83 tys. wiadomości

344 tys.→jeden na nową wiadomość

Rozmów czytanych od nowa przy każdym przebiegu

wszystkie→tylko zmienione

Niepotrzebne zapisy ustały, a historie skrzynek, które nigdy się nie kończyły, po raz pierwszy zsynchronizowały się w całości.

Zero to nie zawsze zero · Analityka

Nasz dostawca analityki zwraca jeden kształt danych dla każdej sieci i wypełnia zerem wszystko, czego dana sieć nie raportuje. Instagram „miał” zero kliknięć przy każdym poście. Wykresy uprzejmie kłamały.

Rejestr metryk dla każdej platformy, który zapisuje, co dana sieć naprawdę raportuje, resztę przy imporcie zamienia na null i pozwala każdemu wykresowi uczciwie pokazać, uprościć albo ukryć metrykę.

Statystyki z ośmiu sieci, które nigdy nie pokazują liczby, której nikt nie zmierzył.

Wylogowany przez spieszący się zegar · Logowanie

Mojego współzałożyciela wylogowywało w chwili, gdy się zalogował: piętnaście odświeżeń tokena na sekundę, a potem limit zapytań. Nikt inny nie umiał tego odtworzyć.

Zegar w jego komputerze spieszył się o ponad godzinę, więc każdy świeży token wyglądał na wygasły. Opakowałem storage sesji tak, żeby przy zapisie sesji przeliczał czas wygaśnięcia względem lokalnego zegara.

Odświeżeń tokena na sekundę

15→0

Logowanie działa przy każdym zegarze urządzenia, a konsola mówi, kiedy któryś się rozjeżdża.

Wnioski

Gust to fosa

Kiedy AI sprawia, że budowanie jest tanie, każdy może wypuszczać produkty, a większość z nich wygląda tak samo. Rzadkie pozostaje wyczucie: wiedza, co pominąć, jak ekran powinien się czuć, kiedy animacja jest o jedną za dużo. Dla dwuosobowego zespołu, który nikogo nie przelicytuje budżetem, gust sprawia, że Groselia wygląda i działa jak coś dużo większego, i to jedyna część, której nigdy nie oddałbym modelowi.

Sprzedawaj efekt, nie narzędzie

Nikt nie chciał obsługiwać oprogramowania marketingowego, nawet najlepszego. Chcieli być widoczni. Sprzedawanie pracy zamiast aplikacji sprawiło, że produkt zaczął znaczyć więcej, a nie mniej: stał się silnikiem, na którym pracujemy codziennie, więc każda niedoróbka została poprawiona.

Kontekst wygrywa ze sprytem

Agent był lepszy, kiedy wiedział więcej, a nie kiedy prompt był mądrzejszy. Dawanie mu w każdej turze kalendarza na żywo, pamięci i otwartych planów oraz to, że pyta, zanim zadziała, dało więcej niż jakakolwiek zmiana modelu.

AI zmienia wielkość zespołu

Gdy agenci równolegle piszą większość kodu, moja praca przesunęła się na decydowanie, co budować, przeglądanie każdej zmiany i trzymanie wysokiej poprzeczki. Jedna osoba może dziś prowadzić to, co kiedyś wymagało zespołu, o ile pozostaje redaktorem.

Następny projekt

Wszystkie projekty