Skip to content

Commit dec5b3b

Browse files
committed
chore: complete v3.0 Deck Builder Web milestone
Archive v3.0 milestone artifacts (roadmap, requirements, audit, phase directories) to milestones/. Evolve PROJECT.md with v3.0 validated requirements and key decisions. Reorganize ROADMAP.md with collapsed milestone grouping. Update RETROSPECTIVE.md with v3.0 section and cross-milestone trends. Clean STATE.md for next milestone. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 22d03ab commit dec5b3b

48 files changed

Lines changed: 554 additions & 192 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.planning/MILESTONES.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
11
# Milestones: Lumio
22

3+
## v3.0 Deck Builder Web (Shipped: 2026-03-13)
4+
5+
**Delivered:** React SPA deck builder at deck.lumio.toto-castaldi.com where authenticated users create decks and flashcards in markdown, committed via edge function to a shared Git repo, synced by Docora for AI question generation.
6+
7+
**Phases completed:** 36-40 (10 plans total)
8+
9+
**Key accomplishments:**
10+
11+
- Vite 7 + React 19 + Tailwind 4 SPA with Supabase dual-auth (Google OAuth + email/password), i18n IT/EN, and dark mode
12+
- deck-commit edge function with 8 GitHub API actions and UUID-prefix user path isolation
13+
- Deck management UI: sidebar list with inline create/rename, delete confirmation, localStorage-backed sort
14+
- Card authoring: markdown editor with live preview, 8-button toolbar, metadata form, frontmatter parse/serialize
15+
- Typed client API module for all edge function operations with centralized error handling
16+
- Production deploy at deck.lumio.toto-castaldi.com with SSL, Nginx SPA config, and CI/CD pipeline
17+
18+
**Stats:**
19+
20+
- 105 files changed (+17,984 / -1,722 lines)
21+
- ~28,600 lines of TypeScript/CSS in apps/deck-builder
22+
- 5 phases, 10 plans
23+
- 3 days (2026-03-11 to 2026-03-13)
24+
25+
**Git range:** `defb602``22d03ab` (66 commits)
26+
27+
**What's next:** v3.1 Deck Discovery (fulltext search for public repos/decks in mobile app)
28+
29+
---
30+
331
## v2.3 Dashboard Polish (Shipped: 2026-03-05)
432

533
**Delivered:** Compact, visually coherent dashboard with 2x2 stat card grid, verbose localized relative time, and circular icon-only study button.

.planning/PROJECT.md

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## What This Is
44

5-
Lumio è una piattaforma di studio basata su flashcard che sfrutta l'AI per trasformare concetti in sessioni di apprendimento interattive con ripetizione spaziata. App nativa Android (React Native/Expo) bilingue IT/EN con branding Lumio, ripetizione spaziata SM-2 (carte scadute prima, nuove dopo), sessioni di studio configurabili con cap RPC, dashboard compatta con griglia 2x2 stat cards e tempo relativo, pulsante studio circolare icon-only, navigazione carte nei repository, storico sessioni con conteggio carte, gestione errori sync con aggiornamento token in-app, autenticazione dual-mode (Google OAuth + email/password con verifica OTP), account linking bidirezionale (Google ↔ email), password reset via OTP, e landing page con versione dinamica per il download dell'APK. Il contenuto viene dai repository Git, le domande sono pre-generate dal sistema. Il versioning è derivato da STATE.md (GSD milestone) tramite CI pipeline.
5+
Lumio è una piattaforma di studio basata su flashcard che sfrutta l'AI per trasformare concetti in sessioni di apprendimento interattive con ripetizione spaziata. Due frontend: app nativa Android (React Native/Expo) per lo studio e web app React SPA (deck.lumio.toto-castaldi.com) per la creazione di deck e carte. L'app Android è bilingue IT/EN con branding Lumio, ripetizione spaziata SM-2, sessioni configurabili con cap RPC, dashboard compatta 2x2, card browse, storico sessioni, gestione errori sync, autenticazione dual-mode (Google OAuth + email/password), account linking bidirezionale, e password reset via OTP. Il deck builder web permette di creare/modificare deck e carte in markdown con editor live preview, committate via edge function su un repo Git condiviso. Il contenuto viene dai repository Git, le domande sono pre-generate dal sistema. Docora sincronizza e genera domande AI per entrambi i flussi (repo utente e repo condiviso).
66

77
## Core Value
88

@@ -93,22 +93,18 @@ Gli utenti studiano concetti tramite quiz generati dall'AI — il contenuto vien
9393
- ✓ Tempo relativo localizzato IT/EN su "Ultimo studio" ("ieri", "2 giorni fa", "yesterday", "2 days ago") — v2.3
9494
- ✓ "Ultimo studio" non navigabile (rimosso tap → storico sessioni) — v2.3
9595
- ✓ Pulsante studio circolare centrato con sola icona play (60px, nessun testo) — v2.3
96+
- ✓ Web app React SPA con auth Supabase condivisa (Google OAuth + email/password) — v3.0
97+
- ✓ Layout responsive con sidebar deck list e area editor principale — v3.0
98+
- ✓ Dark mode e i18n IT/EN nel deck builder web — v3.0
99+
- ✓ CRUD deck (crea, rinomina, elimina con conferma) — v3.0
100+
- ✓ CRUD carte con editor markdown, live preview, toolbar, metadata form — v3.0
101+
- ✓ Edge function deck-commit con 8 azioni GitHub API e isolamento path utente — v3.0
102+
- ✓ Docora sync repo condiviso per generazione AI — v3.0
103+
- ✓ Deploy produzione deck.lumio.toto-castaldi.com con SSL e CI/CD — v3.0
96104

97105
### Active
98106

99-
(Defining requirements for v3.0)
100-
101-
## Current Milestone: v3.0 Deck Builder Web
102-
103-
**Goal:** Web app React SPA su deck.lumio.toto-castaldi.com dove utenti autenticati creano deck e carte in markdown, committate via edge function su un repo Git Lumio condiviso, sincronizzate da Docora per generazione AI.
104-
105-
**Target features:**
106-
- React SPA con auth Supabase condivisa (Google OAuth + email/password)
107-
- CRUD deck e carte con editor markdown nel browser
108-
- Salvataggio via edge function → GitHub API commit su repo condiviso Lumio
109-
- Struttura repo: `/{user_id}/{deck_name}/` — ogni utente gestisce solo i suoi contenuti
110-
- Docora sincronizza e genera domande AI come per i repo normali
111-
- Deploy su deck.lumio.toto-castaldi.com
107+
(Defining requirements for next milestone)
112108

113109
**Future milestones:**
114110
- v3.1: Deck Discovery — ricerca fulltext repo/deck pubblici nell'app mobile
@@ -140,33 +136,36 @@ Gli utenti studiano concetti tramite quiz generati dall'AI — il contenuto vien
140136
- Custom password policy (oltre default Supabase) — 6 char minimo sufficiente per app studio personale
141137
- Bilingual email templates — Supabase invia un template per tipo; EN singola lingua accettabile
142138
- SMTP configuration — config dashboard produzione, non codice
139+
- Studio/quiz nel browser — l'app mobile è l'esperienza di studio, nessuna duplicazione
140+
- Editor WYSIWYG — conflitto con code blocks e math; markdown + preview è consolidato
141+
- Collaborazione real-time — singolo sviluppatore, uso personale
142+
- Upload immagini nelle carte — complessità Git binari; URL esterni supportati
143+
- UI versioning carte — Git fornisce lo storico; costruire UI è complesso e raramente necessario
144+
- Autosave — save manuale prima; autosave aggiunge complessità commit
145+
- Ricerca fulltext carte — scala non lo richiede; navigazione gerarchica sufficiente
143146

144147
## Context
145148

146-
**Stato attuale (post v2.3):**
147-
- Monorepo pnpm: apps/android (Expo/React Native), apps/landing (static HTML), packages/core, packages/shared
148-
- Backend Supabase: auth (Google OAuth + email/password), DB, storage, edge functions, Docora webhook + study_sessions + card_review_schedule tables
149-
- Tech stack: Expo SDK 54, React Native 0.81, react-navigation, @lumio/core, i18n-js, react-native-marked, supermemo@2.0.23, vitest@4.0.18
150-
- CI/CD: lint → build-apk → deploy-landing → deploy-migrations → deploy-functions (version from STATE.md)
149+
**Stato attuale (post v3.0):**
150+
- Monorepo pnpm: apps/android (Expo/React Native), apps/deck-builder (Vite/React SPA), apps/landing (static HTML), packages/core, packages/shared
151+
- Backend Supabase: auth (Google OAuth + email/password), DB, storage, edge functions (deck-commit con 8 azioni GitHub API), Docora webhook + study_sessions + card_review_schedule tables
152+
- Tech stack Android: Expo SDK 54, React Native 0.81, react-navigation, @lumio/core, i18n-js, react-native-marked, supermemo@2.0.23
153+
- Tech stack Deck Builder: Vite 7, React 19, react-router 7, Tailwind 4, @uiw/react-md-editor 4, vitest
154+
- CI/CD: lint-and-typecheck → build-apk → deploy-landing → deploy-deck-builder → deploy-migrations → deploy-functions
151155
- Versioning: STATE.md milestone → extract-version.cjs → version.ts, APK versionName, landing page, edge function
152-
- Auth: dual-mode Google OAuth + email/password con OTP verification, password reset, account linking bidirezionale
153-
- App bilingue IT/EN con branding Lumio, ripetizione spaziata SM-2, sessioni configurabili con cap RPC, dashboard compatta 2x2 con tempo relativo e pulsante circolare, card browse, study history con conteggio carte, studio forward-only, sync error handling con token update in-app
154-
- ~20,600 LOC (TS/TSX/SQL)
155-
- 11 milestones shipped: v1.1 (native app), v1.2 (polish & i18n), v1.3 (bugfix & UX), v1.4 (card browse & stats), v1.5 (study UX fixes), v1.6 (sync error handling), v1.7 (GSD versioning), v2.0 (spaced repetition), v2.1 (email auth), v2.2 (session limits), v2.3 (dashboard polish)
156-
157-
**v3.0 planning context:**
158-
- Nuova app web React SPA in `apps/deck-builder` nel monorepo
159-
- Stesso progetto Supabase (auth condivisa, stesse tabelle)
160-
- Edge function per commit su repo GitHub condiviso tramite GitHub API
161-
- Docora gestisce sync/generazione AI anche per il repo condiviso
162-
- Deploy separato su deck.lumio.toto-castaldi.com
156+
- Auth condivisa: dual-mode Google OAuth + email/password, OTP verification, password reset, account linking bidirezionale
157+
- App Android bilingue IT/EN con branding Lumio, SM-2, sessioni configurabili, dashboard 2x2, card browse, study history, sync error handling
158+
- Deck builder web bilingue IT/EN con dark mode, deck CRUD, card authoring con markdown editor, live preview, toolbar
159+
- ~49,200 LOC (TS/TSX/CSS/SQL) — ~20,600 Android + ~28,600 deck-builder
160+
- 12 milestones shipped: v1.1 → v2.3 (mobile), v3.0 (deck builder web)
163161

164162
## Constraints
165163

166-
- **Platform**: Solo Android
167-
- **Distribution**: APK diretto via GitHub Releases
164+
- **Platform**: Android (studio) + Web (deck authoring)
165+
- **Distribution**: APK diretto via GitHub Releases, web app via CI/CD SCP
168166
- **Backend**: Supabase (auth, DB, storage, edge functions)
169-
- **Build**: Expo prebuild + Gradle (no EAS Build)
167+
- **Build Android**: Expo prebuild + Gradle (no EAS Build)
168+
- **Build Web**: Vite 7 production build
170169
- **Auth**: Google OAuth + email/password (no social login beyond Google)
171170

172171
## Key Decisions
@@ -244,6 +243,16 @@ Gli utenti studiano concetti tramite quiz generati dall'AI — il contenuto vien
244243
| Always relative time (no absolute date fallback) | Simpler code, consistent UX — even "years ago" is relative | ✓ Good — v2.3 |
245244
| 60px circular play button (borderRadius 30) | Middle of 56-64 range, visually prominent centered CTA | ✓ Good — v2.3 |
246245
| Removed unused i18n keys after button text removal | Clean codebase, no orphaned translations | ✓ Good — v2.3 |
246+
| Vite 7 + React 19 + Tailwind 4 for deck builder | Modern stack, fast builds, Tailwind utility-first CSS | ✓ Good — v3.0 |
247+
| Shared Supabase project for web and mobile | Single auth, single DB, no user sync complexity | ✓ Good — v3.0 |
248+
| Edge function for GitHub commits (not direct API) | Server-side path isolation, API key protection | ✓ Good — v3.0 |
249+
| UUID prefix path isolation in shared repo | User can only write to `/{user_id}/` directory | ✓ Good — v3.0 |
250+
| .gitkeep for empty deck directories | Git doesn't track empty dirs; .gitkeep creates presence | ✓ Good — v3.0 |
251+
| localStorage-backed timestamps for deck sort | GitHub API has no directory timestamps; client-side proxy | ✓ Good — v3.0 |
252+
| yaml package over gray-matter for browser | gray-matter requires Buffer polyfill in browser | ✓ Good — v3.0 |
253+
| Responsive MDEditor: split desktop, toggle mobile | Optimal UX per viewport via matchMedia | ✓ Good — v3.0 |
254+
| HTTP-only Nginx template, Certbot adds SSL on server | SSL config is server-specific, not repo-portable | ✓ Good — v3.0 |
255+
| deploy-deck-builder parallels deploy-landing in CI | Independent apps, no build dependency between them | ✓ Good — v3.0 |
247256

248257
---
249-
*Last updated: 2026-03-11 after v3.0 milestone start*
258+
*Last updated: 2026-03-13 after v3.0 milestone*

.planning/RETROSPECTIVE.md

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,55 @@
164164

165165
---
166166

167+
## Milestone: v3.0 — Deck Builder Web
168+
169+
**Shipped:** 2026-03-13
170+
**Phases:** 5 | **Plans:** 10 | **Sessions:** ~5
171+
172+
### What Was Built
173+
- React SPA deck builder at deck.lumio.toto-castaldi.com (Vite 7 + React 19 + Tailwind 4)
174+
- Supabase dual-auth (Google OAuth + email/password) with responsive layout, i18n IT/EN, dark mode
175+
- deck-commit edge function with 8 GitHub API actions and UUID-prefix user path isolation
176+
- Deck management UI: sidebar list with inline create/rename, delete confirmation, localStorage-backed sort
177+
- Card authoring: markdown editor with live preview, 8-button toolbar, metadata form, frontmatter parse/serialize
178+
- Production deploy with SSL, Nginx SPA config, and CI/CD pipeline
179+
180+
### What Worked
181+
- Shared Supabase project between web and mobile eliminated auth/user sync complexity
182+
- Phase structure (scaffold → backend → deck CRUD → card CRUD → deploy) was clean sequential dependency chain with no rework
183+
- Edge function consolidation: single `deck-commit` function handles all 8 actions — simpler deployment than multiple functions
184+
- Typed client API module (`invoke<T>` helper) centralized error handling — zero per-call boilerplate
185+
- Research-first phase approach caught gray-matter browser incompatibility before it became a blocker
186+
- 3-day execution for 5 phases — fastest multi-phase milestone per plan count
187+
188+
### What Was Inefficient
189+
- gray-matter initially used in Phase 39-01 had to be replaced with yaml package in 39-02 (Buffer not available in browser) — could have been caught in research
190+
- localStorage as proxy for deck timestamps is a workaround for GitHub API not tracking directory timestamps — works but adds client-side state management
191+
- Traceability table in REQUIREMENTS.md had stale "In Progress" status for AUTH-01 through AUTH-05 even after Phase 36 was complete
192+
193+
### Patterns Established
194+
- Edge function action pattern: single function with `action` field dispatching to handlers (vs. separate functions per operation)
195+
- `invoke<T>` typed helper for Supabase edge function calls with centralized error handling
196+
- Provider nesting order for web: ThemeProvider > I18nProvider > AuthProvider > RouterProvider > DeckProvider > CardProvider
197+
- VS Code-style inline rename pattern: pencil icon → editable input → Enter/Escape/blur to confirm/cancel
198+
- Responsive MDEditor: split-pane desktop / toggle-tab mobile via matchMedia
199+
- .gitkeep files for empty Git directories (Git doesn't track empty dirs)
200+
- HTTP-only Nginx template in repo; Certbot adds SSL on production server
201+
202+
### Key Lessons
203+
1. Shared backend (same Supabase project) across web and mobile dramatically simplifies auth and data sharing — one project, no sync
204+
2. Single edge function with action routing is cleaner than multiple functions when actions share auth/validation logic
205+
3. Browser compatibility for npm packages must be verified during research — gray-matter's Buffer dependency was a mid-phase surprise
206+
4. localStorage-backed metadata (timestamps, sort order) works well enough as a client-side proxy when the API doesn't provide metadata
207+
5. 5-phase sequential dependency chain executed in 3 days with zero deviations — clean scope definition is the biggest velocity multiplier
208+
209+
### Cost Observations
210+
- Model mix: 80% opus, 20% sonnet (quality profile)
211+
- Sessions: ~5 (3 days of development)
212+
- Notable: 5 phases, 10 plans, ~28,600 LOC — second-largest milestone after v1.1, cleanest execution of any multi-phase milestone
213+
214+
---
215+
167216
## Cross-Milestone Trends
168217

169218
### Process Evolution
@@ -174,6 +223,7 @@
174223
| v2.1 | ~5 | 5 | Largest since v1.1; post-ship quick fixes revealed UAT gaps |
175224
| v2.2 | ~2 | 2 | Cleanest milestone — zero deviations, zero issues |
176225
| v2.3 | ~1 | 2 | Fastest milestone — pure UI polish, same-day ship |
226+
| v3.0 | ~5 | 5 | First web app milestone; new platform (Vite/React SPA); clean sequential chain |
177227

178228
### Cumulative Quality
179229

@@ -183,12 +233,15 @@
183233
| v2.1 || Auth flows (manual) ||
184234
| v2.2 || Session limit (manual) ||
185235
| v2.3 || UI polish (UAT) ||
236+
| v3.0 | 38+ (auth/theme/i18n/validation) | Lib layer | Vite 7, React 19, Tailwind 4, @uiw/react-md-editor, katex, yaml |
186237

187238
### Top Lessons (Verified Across Milestones)
188239

189-
1. Research-first planning pays off — prevents mid-milestone pivots (validated v1.1 through v2.0)
190-
2. Server-side computation for stateful operations avoids race conditions and simplifies client code (v2.0, v2.2)
240+
1. Research-first planning pays off — prevents mid-milestone pivots (validated v1.1 through v3.0)
241+
2. Server-side computation for stateful operations avoids race conditions and simplifies client code (v2.0, v2.2, v3.0)
191242
3. Small gap closure plans are more efficient than trying to get everything right in the first pass (v2.0)
192243
4. Small, focused milestones execute cleanly with near-zero overhead (v2.2)
193-
5. Reusing patterns across phases in the same milestone accelerates development (v2.2)
244+
5. Reusing patterns across phases in the same milestone accelerates development (v2.2, v3.0)
194245
6. Pure UI polish milestones are fast, low-risk, and benefit most from UAT (v2.3)
246+
7. Shared backend across multiple frontends is a massive complexity reducer — one auth, one DB, no sync (v3.0)
247+
8. Browser compatibility for npm packages must be verified during research, not mid-implementation (v3.0)

0 commit comments

Comments
 (0)