[{"data":1,"prerenderedAt":324},["ShallowReactive",2],{"work-it-room-n14":3},{"id":4,"title":5,"body":6,"category":303,"description":72,"extension":304,"featured":305,"links":306,"meta":308,"navigation":305,"order":295,"path":309,"period":310,"role":311,"seo":312,"slug":313,"stack":314,"stem":320,"subtitle":321,"summary":322,"__hash__":323},"projects_it\u002Fprojects\u002Fit\u002Froom-n14.md","Room N14",{"type":7,"value":8,"toc":294},"minimark",[9,14,23,45,48,52,55,59,65,76,79,83,89,119,131,164,170,196,207,225,231,241,245,283,287],[10,11,13],"h2",{"id":12},"il-problema","Il problema",[15,16,17,18,22],"p",{},"Una piccola struttura ricettiva italiana vive o muore di ",[19,20,21],"strong",{},"prenotazioni dirette",". Ogni notte prenotata via OTA (Booking, Airbnb) lascia 15-20% di commissione sul tavolo. Per intercettare il traffico organico servono tre cose insieme:",[24,25,26,33,39],"ul",{},[27,28,29,32],"li",{},[19,30,31],{},"velocità"," (Core Web Vitals decenti, mobile-first)",[27,34,35,38],{},[19,36,37],{},"SEO locale serio"," (structured data + hreflang + copy in più lingue)",[27,40,41,44],{},[19,42,43],{},"estetica credibile"," a budget ristretto, senza CMS da patchare",[15,46,47],{},"Nessun WordPress da manutenere, nessun server da riavviare, nessun plugin che si rompe la settimana della stagione alta.",[10,49,51],{"id":50},"perché-lho-costruito","Perché l'ho costruito",[15,53,54],{},"Gestisco un piccolo B&B e volevo il controllo completo sul canale diretto. La vetrina era la porta d'ingresso naturale per il traffico organico — e una scusa perfetta per costruire tutto dallo zero con gli strumenti giusti.",[10,56,58],{"id":57},"architettura","Architettura",[15,60,61,64],{},[19,62,63],{},"Nuxt 3 in modalità SSG puro"," → output HTML+CSS+JS, nessun runtime server-side, hosting su CDN globale gratuito.",[66,67,73],"pre",{"className":68,"code":70,"language":71,"meta":72},[69],"language-text","5 pagine           ← home, servizi, posizione, galleria, contatti\n4 componenti       ← navbar (con language switcher), footer,\n                     ContactIcon (canali prenotazione), PoiIcon (punti d'interesse)\n1 layout           ← default, con JSON-LD LodgingBusiness dinamico\n4 locali           ← IT (default), EN, ES, FR\n","text","",[74,75,70],"code",{"__ignoreMap":72},[15,77,78],{},"Niente Pinia, niente store, niente data-fetching: 5 pagine di contenuto, stato minimo (lingua corrente in cookie).",[10,80,82],{"id":81},"decisioni-tecniche-chiave","Decisioni tecniche chiave",[15,84,85,88],{},[19,86,87],{},"1. Structured data esaustivo, non decorativo."," Ogni pagina emette JSON-LD mirato:",[24,90,91,101,107,113],{},[27,92,93,96,97,100],{},[74,94,95],{},"WebSite"," + ",[74,98,99],{},"Organization"," sulla home",[27,102,103,106],{},[74,104,105],{},"LodgingBusiness"," su ogni pagina (indirizzo, coordinate geo, amenities, check-in\u002Fout, fascia prezzo)",[27,108,109,112],{},[74,110,111],{},"FAQPage"," sulla pagina servizi (ogni amenity è una Q&A)",[27,114,115,118],{},[74,116,117],{},"BreadcrumbList"," su ogni sottopagina",[15,120,121,122,126,127,130],{},"Google interpreta la pagina senza doverlo inferire dal copy. Ranking locale e rich results ",[123,124,125],"em",{},"molto"," più solidi di \"compilo ",[74,128,129],{},"meta description"," e spero\".",[15,132,133,136,137,140,141,144,145,144,148,151,152,155,156,159,160,163],{},[19,134,135],{},"2. Multi-lingua a costo zero."," 4 locale, ",[19,138,139],{},"una sola URL per pagina",": lo switcher in navbar cambia il contenuto lato client via cookie. Niente ",[74,142,143],{},"\u002Fen\u002F",", ",[74,146,147],{},"\u002Fes\u002F",[74,149,150],{},"\u002Ffr\u002F"," che raddoppiano le URL da mantenere. Tag ",[74,153,154],{},"hreflang"," puntano tutti alla stessa canonical + un ",[74,157,158],{},"x-default",". Pro: manutenzione sitemap più semplice, copy centralizzato in ",[74,161,162],{},"locales\u002F*.json",". Contro: nessun boost da URL localizzate — trade-off accettato volontariamente per una struttura di 5 pagine.",[15,165,166,169],{},[19,167,168],{},"3. Ottimizzazione immagini come build step."," Script custom (Sharp):",[24,171,172,175,182,189],{},[27,173,174],{},"resize a max 1920px (hero 2000px per non perdere impatto)",[27,176,177,178,181],{},"compressione ",[123,179,180],{},"mozjpeg"," quality 78-82 (82 sugli hero)",[27,183,184,185,188],{},"generazione ",[74,186,187],{},".webp"," parallela per ogni sorgente",[27,190,191,192,195],{},"backup ",[74,193,194],{},".orig"," prima di sovrascrivere — idempotente, eseguibile più volte",[15,197,198,199,202,203,206],{},"Cartella immagini totale ",[19,200,201],{},"~11 MB",", singole immagini sotto 300 KB anche sugli hero. Niente CDN immagini esterno, niente ",[74,204,205],{},"@nuxt\u002Fimage",": uno script che gira in build è sufficiente per questa scala.",[15,208,209,212,213,216,217,220,221,224],{},[19,210,211],{},"4. Favicon automation."," Uno script produce la suite completa partendo da un template SVG parametrizzato: ",[74,214,215],{},"favicon.ico"," multi-resolution (16\u002F32\u002F48), ",[74,218,219],{},"apple-touch-icon"," 180, Android Chrome 192\u002F512, ",[74,222,223],{},"site.webmanifest",", SVG scalabile. Cambiare il colore del brand = modifica in un punto solo.",[15,226,227,230],{},[19,228,229],{},"5. LodgingBusiness JSON-LD centralizzato."," Dati della struttura (nome, indirizzo, coordinate, amenities, orari, range prezzo) in un singolo file config. Il layout serializza il JSON-LD una volta in build, tutte le pagine lo ereditano. Zero duplicazione, un solo punto di verità.",[15,232,233,236,237,240],{},[19,234,235],{},"6. Nessun backend, nessun form-engine."," La pagina contatti usa ",[19,238,239],{},"mailto + WhatsApp + link diretti ai canali OTA + Instagram",". Niente form che salva in un DB, niente serverless function per l'invio. Meno superficie d'attacco, meno cose che si rompono, zero GDPR su form-submission.",[10,242,244],{"id":243},"numeri","Numeri",[24,246,247,253,265,271,277],{},[27,248,249,252],{},[19,250,251],{},"~1.500 LOC"," totali",[27,254,255,258,259,258,262],{},[19,256,257],{},"5 pagine"," · ",[19,260,261],{},"4 componenti",[19,263,264],{},"1 layout",[27,266,267,270],{},[19,268,269],{},"4 locali"," sincronizzate (IT · EN · ES · FR)",[27,272,273,276],{},[19,274,275],{},"~30 asset immagine"," (14 sorgenti + 16 derivate e favicon)",[27,278,279,282],{},[19,280,281],{},"5 schema"," JSON-LD emessi in totale",[10,284,286],{"id":285},"lezioni","Lezioni",[15,288,289,290,293],{},"Un sito statico fatto bene batte un CMS fatto male nove volte su dieci, specie per piccole realtà dove il contenuto cambia due volte all'anno. Il vincolo ",[123,291,292],{},"\"nessun runtime\""," spinge a decisioni di design più semplici, non più povere. Un Lighthouse a 100 non è un vanto — è una conseguenza naturale del non avere nulla di superfluo da eseguire.",{"title":72,"searchDepth":295,"depth":295,"links":296},2,[297,298,299,300,301,302],{"id":12,"depth":295,"text":13},{"id":50,"depth":295,"text":51},{"id":57,"depth":295,"text":58},{"id":81,"depth":295,"text":82},{"id":243,"depth":295,"text":244},{"id":285,"depth":295,"text":286},"work","md",true,{"live":307},"https:\u002F\u002Froomn14.it",{},"\u002Fprojects\u002Fit\u002Froom-n14","2025","Design · full-stack · SEO",{"title":5,"description":72},"room-n14",[315,316,317,318,319],"Nuxt 3 (SSG)","Tailwind CSS","Sharp","JSON-LD","Multi-lingua (4 locale)","projects\u002Fit\u002Froom-n14","Sito vetrina per una piccola struttura ricettiva italiana. Nuxt SSG multilingue, structured data esaustivo, immagini ottimizzate in build — zero runtime.",null,"2Vdqe1okSzpa3lwgxxUlcKq94oK14VMYm-X_i5wJ93c",1781346783287]