FlowBoard è una Kanban board interattiva con un assistente AI contestuale integrato. Permette di organizzare task in tre colonne (Todo, In Progress, Done) con supporto a priorità, tag, scadenze e drag & drop. L'AI assistant conosce in tempo reale lo stato della board e risponde in linguaggio naturale a domande come "quali task sono in ritardo?" o "scrivi una descrizione per questo task".
Problema che risolve rispetto a una Kanban classica: le board tradizionali richiedono di ricordare tutto. FlowBoard permette di interrogare direttamente la board e ottenere suggerimenti contestuali senza uscire dall'interfaccia.
| Tecnologia | Perché |
|---|---|
| Flask invece di Django | Django porta con sé ORM, admin, autenticazione e molto altro — qui non servono. Flask è un micro-framework: zero overhead, ideale per un'app senza database. |
| Groq + Llama 3 | API gratuita senza carta di credito, con latenza molto bassa grazie all'hardware LPU proprietario. Llama 3.1-8b è ottimo per task conversazionali brevi come rispondere a domande sulla board. |
| localStorage invece di un DB | Zero setup, zero migrazioni, portabilità totale. La board non è multi-utente, quindi la persistenza client-side è la scelta più semplice e corretta. |
| HTML5 Drag & Drop nativo | Dimostra padronanza diretta delle API del browser, senza dipendenze esterne (niente jQuery UI, SortableJS, ecc.). |
| JavaScript vanilla | L'app ha una complessità gestibile senza framework: controllo totale, nessun bundle step, nessun virtual DOM. |
Browser (client)
├── Rendering board → JS vanilla + DOM
├── Drag & Drop → HTML5 DnD API
├── Filtri / Ricerca → JS client-side (nessuna chiamata al server)
├── Persistenza → localStorage (aggiornato ad ogni modifica)
└── AI Assistant
└── POST /api/ask ──► Flask (proxy)
└── Groq API (llama-3.1-8b-instant)
└── risposta JSON ──► typing animation
Flusso board:
- L'utente aggiunge/modifica/sposta/elimina una card
- JS aggiorna l'array
cardsin memoria saveBoard()serializza inlocalStoragerenderBoard()ri-renderizza le tre colonne applicando i filtri attivi
Flusso AI Assistant:
- L'utente scrive una domanda e preme Invia
- JS chiama
getBoardSnapshot()→ oggetto JSON con lo stato attuale fetch('/api/ask', {body: {question, board}})→ Flask- Flask costruisce il prompt con stato board + data odierna → Groq
- Groq risponde → Flask restituisce
{answer: "..."} - JS mostra la risposta con animazione typing (12ms/carattere)
{
id: "k3x9f2ab", // uid() — timestamp + random
col: "todo", // "todo" | "wip" | "done"
title: "Titolo task",
desc: "Descrizione opzionale",
priority: "alta", // "alta" | "media" | "bassa"
tags: ["ux","api"], // max 3, no duplicati
due: "2024-03-15", // ISO date o stringa vuota
createdAt: 1710000000000 // timestamp unix ms
}dragstart: memorizza l'iddella card indraggedId, aggiunge classe.draggingdragoversulla colonna:e.preventDefault()abilita il drop, aggiunge.drag-overdragleave: rimuove.drag-oversolo se il cursore esce dalla colonna (checkcontains)drop: aggiornacard.col, chiamasaveBoard()+renderBoard()
system_prompt = f"""You are a productivity assistant...
The user's current board state is:
{board_json} # JSON con tutte le card
Today's date is: {today}
Answer concisely in the same language the user uses."""Il contesto completo va nel system message; la domanda va nel user message.
renderBoard() filtra cards in base ai tre filtri (testo, priorità, scadenza) — tutti in AND e tutti client-side — poi per ogni colonna chiama buildCardEl(card) che costruisce il DOM con innerHTML, usando escHtml() per prevenire XSS.
- Vai su console.groq.com
- Registrati con Google o GitHub (gratuito)
- API Keys → Create API Key
- Inserisci la chiave nel file
.env
Il tier gratuito include ~14.400 richieste/giorno — più che sufficiente per uso personale.
cd flowboard
cp .env.example .env
# Modifica .env e inserisci la tua GROQ_API_KEY
pip install -r requirements.txt
python app.pyApri il browser su http://localhost:5001.