Înfloresc
O aplicație de îngrijire de sine, construită ca o grădină care crește din zilele tale. Mai jos: cum am ales tonul, ce am lăsat deoparte și ce nu face încă.
Cum a fost construită
Aplicația a fost scrisă împreună cu un asistent AI (Claude Code), într-o sesiune de lucru dedicată doar ei. Eu am pus limita cea mai importantă — fără pedeapsă, fără scor — și am decis, pas cu pas, ce rămâne fidel ideii și ce se aruncă.
Mai jos sunt alegerile alea, nu o relatare despre cine a scris codul. Lucruri pe care asistentul le-a putut propune și care au rămas în afară sunt vizibile mai jos, la „o idee care n-a ajuns cod" și la „ce nu face încă".
- 6specii de floare
- 4teme de culoare
- ~4.600linii de cod
- 0pași de compilare
Cum arată
Optsprezece ecrane ale aplicației, pe telefon, dintr-un cont cu folosire îndelungată — 219 zile, o serie de 59 de zile la rând și toate cele patru repere atinse. Se pot derula lateral.
De la o seară, la un loc întreg
Prima variantă era o singură pagină, gândită ca un mic gest de seară: câteva mini-misiuni, o prăjitură cu răvaș și o pisică. E păstrată acum ca arhivă, la adresa de mai sus.
Extinderea într-o aplicație cu mai multe secțiuni a fost o decizie deliberată, nu o continuare firească. Am vrut o pagină principală adevărată, nu doar seara ca întreg site. De acolo a apărut ideea unui hub care ține laolaltă seara, jurnalul și respirația, în loc să rămână un singur ecran.
De ce o grădină, nu un meniu
Un meniu cu patru butoane e corect, dar rece — informează, nu spune nimic despre tine. O grădină care crește din zilele tale devine, în timp, un obiect al timpului trăit, nu doar o listă de linkuri.
Câștigi continuitate emoțională: motivația vine din acumulare, nu din bifat o listă. Pierzi puțin din claritatea imediată — la prima vedere, un meniu e mai ușor de „citit" decât o grădină, care cere o clipă să înțelegi ce reprezintă.
Absența pedepsei pentru o zi sărită e o alegere de fond, nu un detaliu: o aplicație de îngrijire de sine care te vinovățește când o ratezi lucrează exact împotriva scopului ei. Grădina pur și simplu nu crește în ziua aia — fără X roșu, fără serie „ruptă" afișată ca o pierdere, fără niciun mesaj de reproș nicăieri în aplicație.
Grădina, reinventată
Multă vreme, grădina era o simplă tulpină care creștea. A devenit între timp o plantă completă, desenată procedural pe nouă etape — de la sămânță la mugur, până la floarea deschisă — în șase specii diferite: roză, margaretă, floarea-soarelui, brândușă, clopoțel, lalea. Fiecare zi bună plantează una, vizibil, într-un ghiveci.
Când o floare se termină, se mută într-o parcelă de grădină, cu loc pentru șase flori. Parcele noi se deblochează pe măsură ce crești mai multe.
Cea mai mare schimbare structurală: grădina a primit propria ei pagină, nu mai e o fereastră peste pagina principală. E o scenă izometrică, cu parcele de pământ desenate organic, prin care te plimbi cu degetul și pe care le apropii sau le depărtezi. Pisica se plimbă și ea de-a lungul parcelelor, cu corp și coadă, nu doar un cap static ca înainte.
Pagina de „colecție" — lista clasică, fiecare floare cu data ei exactă — a rămas, una lângă alta cu grădina explorabilă. Una răspunde la „ce am făcut și când", cealaltă la „cât de mult a crescut".
Un singur obiect, pentru toate paginile
Totul stă într-un singur obiect, sub o singură cheie în memoria browserului, cu
două părți: days, o hartă cu o intrare pentru fiecare zi
calendaristică (stare, misiuni bifate, notița din jurnal, dacă ai hrănit
pisica), și settings, pentru lucruri care nu țin de o zi anume —
numele pisicii, tema aleasă.
Prima variantă, cu o singură pagină, avea o cheie separată doar pentru lista de seară. Când au apărut jurnalul și mozaicul stărilor, o cheie per funcție ar fi însemnat că fiecare pagină nouă inventează propriul spațiu de stocare, fără nicio legătură între ele — imposibil, de exemplu, să afli dacă ai scris în jurnal și ai bifat misiunile în aceeași zi.
Cu un singur obiect versionat, orice pagină citește și scrie aceeași zi prin două funcții simple, iar toate funcțiile care se uită în timp — mozaicul lunii, rezumatul lunar, seria de zile pentru pisică — citesc din aceeași sursă.
Pagini separate, nu o aplicație de o singură pagină
La început, patru fișiere HTML separate, cu CSS și JavaScript comune, nu o aplicație de tip SPA. De atunci au mai apărut pagini — grădina explorabilă, colecția, contul — dar principiul a rămas: fără pas de compilare, fără router, orice fișier se poate deschide și înțelege singur.
Ce s-a pierdut: tranzițiile între pagini sunt reîncărcări complete, nu animații line; fiecare fișier HTML repetă propriul antet (fonturi, legături); și — asta ne-a costat o sesiune întreagă de depanare — interacțiunea dintre navigarea reală de pagină și un service worker e mult mai fragilă decât ar fi fost cu un router de aplicație unică.
Bug-ul care m-a costat cel mai mult
După ce am adăugat modul offline (un service worker), navigarea între pagini s-a stricat — click pe „seară" din bara de jos ducea la o pagină complet albă.
- Prima diagnoză a fost greșită: am crezut că problema e o regulă din spec care interzice reutilizarea unei cereri de navigare, am construit o reparație pe baza asta, am publicat-o — și tot nu mergea.
- Cauza reală era alta: Cloudflare Pages redirectează automat
/pagina.htmlcătre/pagina, iar un răspuns rezultat dintr-un redirect nu poate fi folosit de service worker ca răspuns pentru o navigare — browserul îl refuză explicit. - Am găsit asta abia după ce am construit un server local de test care reproduce exact acel redirect; până atunci, testele locale treceau mereu, dându-mi o încredere falsă de două ori la rând.
- După ce am reparat redirectul, a apărut un al treilea bug, mai vizibil:
când o pagină nu se încărca, service worker-ul servea din greșeală
conținutul paginii principale sub adresa cerută — iar cum acea pagină avea
legături relative, fiecare click adăuga încă un
/pages/la adresă, într-o buclă vizibilă în bara de URL. Reparat prin trecerea tuturor legăturilor pe căi absolute.
Ce există acum
Aplicația e instalabilă (manifest și service worker) și merge parțial offline. Pisica are nume, ales o singură dată și păstrat. Export și import de date: un buton descarcă tot ce ai scris ca fișier, altul îl reîncarcă. Patru teme de culoare, inclusiv o temă de noapte reală, nu doar o paletă mai închisă.
Un calendar al stărilor există, dar în interiorul jurnalului, nu ca secțiune separată — un mozaic lunar colorat după starea zilei, cu detalii la click pe o zi.
Aplicația are acum și conturi opționale, prin Supabase (email și parolă), cu sincronizare automată a datelor — cine nu vrea cont, aplicația merge la fel ca înainte, complet local. Din Setări poți genera și o „grădină plină", fabricată dar plauzibilă, ca să arăți telefonul cuiva fără să-ți expui datele reale — cu un buton de revenire instant la datele tale. Grădina fabricată nu ajunge niciodată în contul real din cloud.
Mini-misiunile de seară au acum un pool personal: poți edita textul, șterge sau adăuga misiuni proprii. Butonul ↺ revine la textele implicite, dar nu șterge ce ai adăugat tu; istoricul de bife din zilele vechi rămâne neatins, iar o zi își păstrează setul de misiuni odată calculat. În pool-ul implicit au mai intrat câteva gesturi mici, concrete — praf de pe un obiect, un sertar, un bilet pentru mâine, o ceașcă în chiuvetă — fără să transforme pagina într-o listă de misiuni.
O idee care n-a ajuns cod
Cutia cu scrisori nu există — a fost doar o idee discutată, niciodată construită. O las aici ca să fie clar: dacă nu apare mai jos la „ce urmează", înseamnă că fie a fost aruncată, fie nu s-a decis încă.
Pisica
Doarme între 22:00 și 7:00 dimineața — ochii se închid, apare un mic „zZz", iar hrănirea e dezactivată cât timp doarme. Devine vizibil mai veselă (o coroniță mică deasupra ei) când ai trei zile la rând complete. Poate fi hrănită o dată pe zi.
A fost o decizie explicită, de la început, să nu moară niciodată și să nu certe niciodată — o aplicație de îngrijire de sine care îți pune încă un lucru de care să te temi (o pisică virtuală neglijată) lucrează direct împotriva scopului ei.
Ce nu face încă
Lipsește autentificarea prin Google pentru conturi — cea prin email și parolă, cu sincronizare automată între dispozitive, există deja. (Aici erau până de curând și sincronizarea între dispozitive, și adâncimea grădinii — amândouă rezolvate între timp: sincronizarea prin conturile opționale, iar grădina prin parcele și pagina ei explorabilă, descrise mai sus.)
Nu are notificări și nu are nimic social sau de partajare.
Stiva
HTML, CSS și JavaScript scrise de mână, fără niciun framework, fără pas de compilare, fără vreun manager de pachete. Fonturile Google (Fredoka pentru titluri, Quicksand pentru text) și, de curând, Supabase pentru conturile opționale și sincronizare. Găzduită pe Cloudflare Pages.
Undeva la ~4.600 de linii acum — aproape dublu față de ~2.370. Cea mai mare parte a creșterii vine din pagina nouă de grădină și colecție, și din extinderea celorlalte pagini (jurnal, respiră, setări, cont), fiecare cu propria logică.
Cod
- ~4.600 linii, în total
- mai multe pagini HTML
- CSS și JS comune
Servicii
- Cloudflare Pages
- Supabase (conturi opționale)
- Google Fonts (Fredoka, Quicksand)