diff --git a/javascript/12_Progetti/blog/README.md b/javascript/12_Progetti/blog/README.md
new file mode 100644
index 0000000..f006810
--- /dev/null
+++ b/javascript/12_Progetti/blog/README.md
@@ -0,0 +1,190 @@
+# Blog Dashboard
+
+Questo è il progetto finale del corso JavaScript.
+Dovrai creare un mini-blog con **due pagine**: una per visualizzare i post e una per crearne di nuovi, usando l'API locale (`server-api`).
+
+## Funzionalità da implementare
+
+Le funzionalità sono divise in 3 fasi:
+
+### Fase 1 — Visualizzare i Post
+1. **Recuperare i post** — `GET /api/posts` per ottenere tutti i post
+2. **Recuperare gli utenti** — `GET /api/users` per mostrare il nome dell'autore accanto a ogni post
+3. **Mostrare i post in una tabella** — con autore, titolo, contenuto (troncato), likes, data
+
+### Fase 2 — Filtri
+4. **Ricerca per titolo** — un input per cercare post per titolo
+5. **Filtro per autore** — un dropdown per mostrare solo i post di un certo autore
+6. I filtri devono lavorare **insieme**
+
+### Fase 3 — Creare ed Eliminare
+7. **Pagina "Nuovo Post"** — Form con titolo, contenuto e autore (dropdown) + validazione
+8. **Creare un post** — `POST /api/posts` per salvare il nuovo post
+9. **Eliminare un post** — `DELETE /api/posts/:id` con conferma
+
+
+## Struttura del Progetto
+
+```
+blog/
+├── index.html ← Pagina lista post (con filtri e pulsante elimina)
+├── index.js ← JS per la pagina lista (GET + DELETE + filtri)
+├── nuovo.html ← Pagina creazione nuovo post (form)
+├── nuovo.js ← JS per la pagina creazione (GET utenti + POST)
+├── style.css ← CSS condiviso tra le due pagine
+└── README.md ← Questo file
+```
+
+
+## Come Iniziare
+
+### Prerequisiti
+1. Assicurati che il `server-api` sia in esecuzione: dalla cartella `server-api`, esegui `npm start`
+2. Oppure chiedi al docente di avviare il server
+3. Verifica che l'API risponda: apri `http://localhost:5000/api` o il link del docente nel browser
+
+### Setup del Progetto
+1. Crea una nuova repository `BlogDashboard` su GitHub
+2. Clona la repo e apri la cartella in VSCode
+3. Copia tutti i file del progetto nella repo
+4. Fai il primo commit: `"Setup iniziale progetto Blog Dashboard"`
+
+Oppure fai una fork del progetto già creato dal docente e clonalo, così avrai già tutto pronto e potrai concentrarti solo sul codice.
+
+### Workflow Git
+Dopo **ogni funzionalità**, fai un commit:
+```
+"Fase 1: caricamento e visualizzazione post in tabella"
+"Fase 1: aggiunto nome autore con join utenti"
+"Fase 2: aggiunto filtro ricerca per titolo"
+"Fase 2: aggiunto filtro dropdown per autore"
+"Fase 3: form creazione nuovo post con validazione"
+"Fase 3: implementata eliminazione post"
+```
+
+
+## API Reference
+
+### URL Base
+```
+http://localhost:5000/api
+```
+
+### Posts — `/api/posts`
+| Metodo | URL | Descrizione |
+|--------|-----|-------------|
+| `GET` | `/api/posts` | Tutti i post |
+| `POST` | `/api/posts` | Crea un nuovo post |
+| `DELETE` | `/api/posts/:id` | Elimina un post |
+
+**Struttura di un post:**
+```json
+{
+ "id": 1,
+ "userId": 3,
+ "titolo": "Titolo del Post",
+ "contenuto": "Il contenuto completo del post...",
+ "likes": 12,
+ "data": "2024-01-15"
+}
+```
+
+### Users — `/api/users`
+| Metodo | URL | Descrizione |
+|--------|-----|-------------|
+| `GET` | `/api/users` | Tutti gli utenti |
+
+**Struttura di un utente:**
+```json
+{
+ "id": 1,
+ "nome": "Mario",
+ "cognome": "Rossi",
+ "avatar": "https://ui-avatars.com/api/?name=Mario+Rossi&..."
+}
+```
+
+
+## Esempi di Codice
+
+### Fetch GET (leggere dati)
+```javascript
+const response = await fetch("http://localhost:5000/api/posts");
+const posts = await response.json();
+console.log(posts); // array di oggetti post
+```
+
+### Fetch POST (creare un post)
+```javascript
+const nuovoPost = {
+ userId: 3,
+ titolo: "Il mio primo post",
+ contenuto: "Ciao mondo!",
+ likes: 0,
+ data: new Date().toISOString().split("T")[0]
+};
+
+const response = await fetch("http://localhost:5000/api/posts", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(nuovoPost)
+});
+
+const postCreato = await response.json();
+```
+
+### Fetch DELETE (eliminare un post)
+```javascript
+const response = await fetch("http://localhost:5000/api/posts/1", {
+ method: "DELETE"
+});
+```
+
+### Trovare il nome dell'autore (join)
+```javascript
+const autore = utenti.find(u => u.id === post.userId);
+const nomeAutore = autore ? autore.nome + " " + autore.cognome : "Sconosciuto";
+```
+
+### Troncare il testo
+```javascript
+const testoCorto = post.contenuto.substring(0, 50) + "...";
+```
+
+### Filtrare un array
+```javascript
+const risultati = posts.filter(post => {
+ return post.titolo.toLowerCase().includes(testoCercato.toLowerCase());
+});
+```
+
+
+## 💡 Suggerimenti
+
+1. **Ordine di lavoro nella Fase 1**: prima carica gli utenti, poi i post. Ti servono gli utenti già pronti in memoria per poter mostrare il nome dell'autore quando crei le righe della tabella.
+
+2. **Variabili globali**: salva utenti e post in variabili `let` globali. Così puoi riusarli nelle funzioni di filtro senza ricaricarli.
+
+3. **Il dropdown autore (Fase 2)**: il `value` di una `
per ogni autore al dropdown
+ * - Crea una funzione "filtraPosts()" che legge i valori dei filtri e filtra l'array completo dei post (la variabile globale) in base a quei valori, poi chiama mostraPosts() con il NUOVO array filtrato
+ * - Aggiungi gli event listener per i filtri: sull'input di ricerca (evento "input") e sul dropdown autore (evento "change") → entrambi chiamano filtraPosts()
+ * - Per il filtro autore, ricorda che il value del dropdown è una stringa, mentre l'userId nei post è un numero → usa parseInt() per confrontarli correttamente
+ * - I due filtri devono lavorare insieme, quindi filtraPosts() deve applicare entrambi i filtri all'array completo dei post
+ */
+
+
+
+
+
+
+
+
+
+
+/**
+ * =============================================
+ * FASE 3 — ELIMINARE UN POST
+ * =============================================
+ *
+ * 1. Aggiungi un pulsante "Elimina" per ogni post nella tabella (colonna Azioni) se non fatto già prima
+ * 2. Quando l'utente clicca su "Elimina", chiedi conferma con confirm("Sei sicuro?") o simile
+ * 3. Se l'utente conferma, fai un fetch DELETE a /api/posts/{id} per eliminare il post
+ * 4. Se l'eliminazione ha successo, ricarica i post
+ *
+ * Suggerimenti per l'implementazione:
+ * - Crea una funzione "eliminaPost(postId)" che fa un fetch DELETE a /api/posts/{postId} e ricarica tutti i post
+ * - Usa confirm() per chiedere conferma all'utente prima di eliminare (ovvero all'inizio della funzione)
+ * - Usa try/catch per gestire eventuali errori di rete durante l'eliminazione
+ * - MODIFICA la funzione mostraPosts() per aggiungere un event listener al nuovo pulsante "Elimina" di ogni post, che chiama eliminaPost() con l'id del post da eliminare
+ */
+
+
+
+
+
+
+
+
+
diff --git a/javascript/12_Progetti/blog/nuovo.html b/javascript/12_Progetti/blog/nuovo.html
new file mode 100644
index 0000000..1d717af
--- /dev/null
+++ b/javascript/12_Progetti/blog/nuovo.html
@@ -0,0 +1,52 @@
+
+
+
+
+
+ Nuovo Post - Blog Dashboard
+
+
+
+
+
+
📝 Blog Dashboard
+
Crea un nuovo post per il blog
+
+
+
+
+
+
Crea un Nuovo Post
+
+
+
+
+
+
+
+
+
+
diff --git a/javascript/12_Progetti/blog/nuovo.js b/javascript/12_Progetti/blog/nuovo.js
new file mode 100644
index 0000000..92124db
--- /dev/null
+++ b/javascript/12_Progetti/blog/nuovo.js
@@ -0,0 +1,34 @@
+/**
+ * Progetto JS - Blog Dashboard (Pagina Nuovo Post)
+ *
+ * API Base URL: http://localhost:5000/api
+ * Risorse usate: /posts, /users
+ *
+ * In questa pagina si usa:
+ * - GET → Caricare la lista utenti per il dropdown autore
+ * - POST → Creare un nuovo post
+ *
+ * =============================================
+ * FASE 3 — CREARE UN POST
+ * =============================================
+ *
+ * 1. Al caricamento della pagina, recupera gli utenti dall'API e popola il dropdown autore (#postAutore)
+ * con un