# Milestone v1: MVP Content Marketing Automation **Status:** SHIPPED 2026-03-09 **Phases:** 1-4 **Total Plans:** 10 ## Overview PostGenerator trasforma framework strategici di content marketing (Persuasion Nurturing + livelli Schwartz) in caroselli Instagram pronti per Canva Bulk Create. Il percorso di sviluppo segue una logica precisa: prima costruire la pipeline di generazione end-to-end funzionante (Fase 1), poi dare il controllo sulla qualita' dell'output tramite editor di prompt e anteprima (Fase 2), poi aggiungere gli strumenti organizzativi per un workflow sostenibile (Fase 3), infine arricchire con integrazioni opzionali (Fase 4). Ogni fase consegna un sistema verificabile e utilizzabile indipendentemente dalla successiva. ## Phases ### Phase 1: Core Generation Pipeline **Goal**: L'utente puo' generare un calendario di 13 caroselli completi e scaricare un CSV valido per Canva Bulk Create con un click dalla Web UI deployata su VPS. **Depends on**: Nothing (first phase) **Requirements**: INF-01..06, CAL-01..07, FMT-01..02, LLM-01..06, PRM-01..04, CSV-01..04, IMG-01, IMG-04, UI-01..04, UI-07, UI-08 **Plans**: 4 plans Plans: - [x] 01-01: Infrastructure setup — FastAPI skeleton + React SPA + Docker multi-stage build + subpath /postgenerator/ (19 files, 6 min) - [x] 01-02: Core services — CalendarService + FormatSelector + PromptService + costanti dominio + 7 prompt italiani (16 files, 9 min) - [x] 01-03: LLM pipeline — LLMService + CSVBuilder + GenerationPipeline + API routers (9 files, 8 min) - [x] 01-04: Web UI — Dashboard + Genera Calendario + Output Review + Genera Singolo + Settings (16 files, 10 min) **Completed**: 2026-03-08 --- ### Phase 2: Prompt Control + Output Review **Goal**: L'utente puo' modificare i prompt direttamente dalla Web UI senza toccare il codice, rigenerare singoli post insoddisfacenti, e rivedere l'anteprima completa di ogni carosello prima di esportare il CSV. **Depends on**: Phase 1 **Requirements**: PRM-05, UI-05 **Plans**: 2 plans Plans: - [x] 02-01: Prompt Editor — backend prompts router CRUD + frontend pagina PromptEditor con lista, textarea, variabili, badge modificato/default (7 files, 5 min) - [x] 02-02: Per-item regeneration — bottone Rigenera con popover inline, badge rigenerato, summary counter (2 files, 4 min) **Completed**: 2026-03-08 --- ### Phase 3: Organization Layer **Goal**: L'utente puo' salvare rapidamente idee e topic interessanti in un Swipe File consultabile, e ritrovare e ri-scaricare calendari generati in sessioni precedenti. **Depends on**: Phase 1 **Requirements**: SWP-01..04, UI-06 **Plans**: 2 plans Plans: - [x] 03-01: SwipeService CRUD — backend + Pydantic schemas + FastAPI router + pagina SwipeFile UI (9 files, 5 min) - [x] 03-02: Swipe-to-calendar integration — topic_overrides in CalendarRequest + picker Swipe File nel form Genera Calendario (5 files, 3 min) **Completed**: 2026-03-09 --- ### Phase 4: Enrichment **Goal**: L'utente con API key Unsplash configurata vede URL immagini reali nel CSV invece di placeholder; l'utente puo' passare voci dello Swipe File come contesto durante la generazione topic per risultati piu' aderenti alle proprie osservazioni. **Depends on**: Phase 3 **Requirements**: IMG-02, IMG-03 **Plans**: 2 plans Plans: - [x] 04-01: UnsplashService backend — cache disco + traduzione IT->EN + integrazione pipeline/CSV (6 files, 5 min) - [x] 04-02: Frontend Unsplash UI — campo API key in Settings, thumbnail cover in PostCard, hint OutputReview (4 files, 3 min) **Completed**: 2026-03-09 --- ## Milestone Summary **Key Decisions:** - Claude API come LLM provider (familiarita' ecosistema, qualita' output italiano) - FastAPI + React (separazione, UI ricca, coerenza con VPS echosystem) - File system storage senza DB (semplicita' MVP, prompt e config editabili) - root_path SOLO via Uvicorn --root-path (mai nel costruttore FastAPI) - CSV encoding utf-8-sig (BOM) per compatibilita' Excel/Windows - CANVA_FIELDS 33 colonne locked con assert a load-time - Pipeline singleton con fallback da disco per persistenza job - Design stone/amber B2B (non gradienti viola generici) - Risoluzione Unsplash UNA SOLA VOLTA dopo batch LLM - Dizionario statico IT->EN (~30 keyword B2B) per traduzione keyword Unsplash **Issues Resolved:** - Slot-merge gap (result.slot undefined in PostCard) risolto in Phase 2 - PromptService lazy init per sincronizzazione con lifespan FastAPI - Import mancante apiFetch in hooks.ts - .gitignore troppo aggressivo su backend/data/ **Technical Debt Incurred:** - Pipeline singleton non invalidato quando API key cambia (routers/generate.py) - Campo campagna inviato nel POST /export ma ignorato dal backend (hooks.ts) - brand_name hardcoded in generation_pipeline.py - Job interrotti durante restart container non recuperabili --- _For current project status, see .planning/ROADMAP.md_