Stato corrente del progetto. Milestone reali, non wishlist. Aggiornata insieme al codice.
Ultimo aggiornamento: 2026-06-01
simonesalerno.it è un portfolio personale (SvelteKit 2 + Svelte 5 + TS strict +
Tailwind 4) su Cloudflare Workers, con contenuti file-based JSON validati con Zod,
i18n hand-rolled (EN/IT) e immagini OG. È in produzione.
L'overhaul di qualità in 6 fasi (nato da un audit completo: sicurezza,
correttezza, performance, manutenibilità) è completato su tutte le milestone.
Vedi docs/CYCLES.md per il log dettagliato del lavoro svolto.
- Redirect i18n in
hooks.server.tsusano la slug map leggera (niente più load all-lingue per richiesta). featuredImagePlaceholderallineato abooleansu type + schema runtime + build; rimosso il campo orfanotypewriter.- CSP (via SvelteKit) + header di sicurezza (
X-Content-Type-Options,Referrer-Policy,X-Frame-Options,Permissions-Policy). - Vulnerabilità transitive risolte via pnpm overrides (
cookie,rollup) →pnpm audita zero;compatibility_datewrangler aggiornata.
- Vitest (unit) + Playwright (E2E) configurati da zero.
- Unit test su
ContentLoader(tutti i metodi), schemi Zod su tutti i contenuti reali, slug map, OG html-generator + escape,getLanguageUrl, util SEO. - 10 E2E: redirect i18n, traduzione route, 404, sitemap+hreflang, render dettaglio EN/IT, og:image servita.
getLanguageUrlestratto in util puro testabile.
- OG generate a build time (satori + resvg + sharp via vite-node), 57 PNG statici
in
static/og/. Rimossi gli endpoint runtime/api/oge/api/og-previewe la dipendenzaworkers-og. Escape HTML su title/excerpt.
<link rel="canonical">+<link rel="alternate" hreflang>(en/it + x-default) calcolati per pagina da un util puro (src/lib/utils/seo.ts).- JSON-LD:
WebSite+Personin home,BlogPostingsugli articoli,CreativeWorksui progetti. SceltoPersoninvece diOrganization: il sito è un portfolio personale, quindiPersonè l'entità schema.org corretta. robots.txtripulito; skip-to-content link localizzato;prefers-reduced-motionche azzera animazioni/transizioni.- Note:
<html lang>era già corretto (non un gap); il focus trap nei Dropdown era già implementato (frecce, Escape, ritorno focus); l'auditaltnon ha trovato immagini senza testo alternativo.
Promise.allnei load del layout; sort di progetti/articoli per stringa ISO (niente più costruzione diDate);Cache-Controledge sulle pagine HTML 2xx.OptimizedImage: dimensione dei gruppi srcset derivata dal conteggio reale invece che hardcodata.- Rimosso
noise-original.png(576KB, non referenziato). - Note: la sitemap era già per-lingua con hreflang;
noise.pngnon ri-ottimizzato (texture ad alta entropia, rischio di regressione visiva per pochi KB); i logo PNG risultavano tutti in uso (animazioneLogo+FloatingNav), quindi non rimossi (l'item era un'assunzione errata dell'audit).
ContentLoader: estrattoloadCollection<T>generico, eliminata la duplicazione projects/articles (i due metodi pubblici sono ora wrapper sottili)..editorconfigallineato a prettier.CLAUDE.mddi progetto +docs/ARCHITECTURE.md; README aggiornato.- Note: nessun rename di massa per "consistenza naming" (churn non giustificato),
la consistenza è migliorata dal refactor
loadCollection. Una CI GitHub Actions era stata aggiunta e poi rimossa: con deploy via Cloudflare Workers Builds e gate locale prima del push sarebbe stata solo informativa e scollegata dal deploy.
- La slug map non è più un file pre-generato e committato ma un indice DERIVATO a
runtime dai contenuti, memoizzato per isolate. Gli slug vivono solo nelle
traduzioni: eliminata la duplicazione materializzata e quindi ogni possibilità di
drift. Rimossi script, file e step di build relativi. Dettagli in
docs/CYCLES.md(Ciclo 3).
- Logica di routing i18n (validazione lingua, route -> chiave logica, traduzione
route, sezione) estratta in funzioni pure condivise (
src/lib/utils/i18n.ts), unica fonte usata da layout, hooks egetLanguageUrl: eliminate le reimplementazioni inline sparse. - Rimosso codice morto dal
ContentLoader(4 metodi mai usati +getAvailableLanguages) e il campoavailableLanguagesdiDetailPageData, che nessun componente leggeva. Dettagli indocs/CYCLES.md(Ciclo 4).
- Root
/sceglie la lingua daAccept-Language(fallback en) invece di rimandare sempre a/en; redirect "smart" portati a un solo hop (niente trailing slash spurio). - Sitemap: aggiunto
x-default(coerenza hreflang con l'HTML) elastmodderivato dai contenuti invece che dalla data di build. - OG: noise applicato da sharp dopo il render (2 passaggi, output full-color): generazione ~10x più rapida (~8min -> ~1min) e niente banding del gradiente.
- Cache HTML controllata da codice (
Cache-Controllato worker) dopo aver impostato "Respect Existing Headers" su Cloudflare. Dettagli indocs/CYCLES.md(Ciclo 5).
- Badge di stato sulle card progetto, feed RSS per-lingua, tempo di lettura + stima
token sugli articoli, sezione "articoli simili", tag cliccabili sui dettagli verso
la listing filtrata. Dettagli in
docs/CYCLES.md(Ciclo 5).
Tutte le milestone (M1-M10) sono pushate su main. Il deploy avviene via Cloudflare
Workers Builds al push (build ~11s con le OG ottimizzate).