[{"data":1,"prerenderedAt":723},["ShallowReactive",2],{"directus:site":3,"directus:pages":36,"directus:case-study:tvit":513},{"id":4,"name":5,"available":6,"email":7,"pec":8,"street":9,"postal_code":10,"city":11,"province":12,"vat":13,"rea":14,"sdi":15,"github":16,"linkedin":17,"translations":18},1,"Leica Florian Robert",true,"info@leicaflorianrobert.dev","florian.leica@pec.it","Via Pozza Maraschin, 44\u002FB","36015","Schio","VI","04329800249","VI - 396256","M5UXCR1","https:\u002F\u002Fgithub.com\u002Fleicaflorian","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fflorian-robert-leica\u002F",[19,24,30],{"id":4,"site_id":4,"languages_code":20,"role":21,"profession":21,"tagline":22,"cv_profile":23},"it","Sviluppatore Web & Mobile","Sviluppatore Web & Mobile. Da {years} anni trasformo idee in prodotti digitali.","Sviluppatore full stack da {years} anni: ho cominciato da autodidatta e oggi porto siti, app e piattaforme SaaS dall'idea al server, curando architettura, interfacce e infrastruttura. Sono stato CTO di un'agenzia e docente principale di un corso Full Stack, dove ho formato decine di studenti. Lavoro soprattutto con TypeScript, Vue e Nuxt, Laravel e Directus. Resto curioso: sperimento nuove tecnologie, AI compresa, e cerco sempre il modo più semplice e solido per risolvere un problema.",{"id":25,"site_id":4,"languages_code":26,"role":27,"profession":27,"tagline":28,"cv_profile":29},2,"en","Web & Mobile Developer","Web & Mobile Developer. For {years} years I have been turning ideas into digital products.","Full stack developer for {years} years: I started out self-taught and today I take websites, apps and SaaS platforms from idea to server, looking after architecture, interfaces and infrastructure. I have been the CTO of an agency and the lead teacher of a Full Stack course, where I trained dozens of students. I work mostly with TypeScript, Vue and Nuxt, Laravel and Directus. I stay curious: I experiment with new technologies, AI included, and always look for the simplest, most solid way to solve a problem.",{"id":31,"site_id":4,"languages_code":32,"role":33,"profession":33,"tagline":34,"cv_profile":35},3,"ro","Dezvoltator Web & Mobile","Dezvoltator Web & Mobile. De {years} ani transform idei în produse digitale.","Dezvoltator full stack de {years} ani: am început ca autodidact, iar astăzi duc site-uri, aplicații și platforme SaaS de la idee la server, ocupându-mă de arhitectură, interfețe și infrastructură. Am fost CTO-ul unei agenții și profesorul principal al unui curs Full Stack, unde am format zeci de studenți. Lucrez mai ales cu TypeScript, Vue și Nuxt, Laravel și Directus. Rămân curios: experimentez tehnologii noi, inclusiv AI, și caut mereu cea mai simplă și solidă cale de a rezolva o problemă.",[37,126,232,320,371],{"id":4,"sort":4,"key":38,"in_menu":6,"children":39,"translations":40,"sections":53},"home","none",[41,46,49],{"id":4,"pages_id":4,"languages_code":20,"slug":42,"title":43,"seo_title":44,"description":45},"","Home","Dall'idea al server: siti, app e SaaS che arrivano online e ci restano","Sviluppatore Web & Mobile a Schio (Vicenza): siti, app e SaaS che arrivano online e ci restano. {years} anni tra sviluppo, design e infrastruttura.",{"id":25,"pages_id":4,"languages_code":26,"slug":42,"title":43,"seo_title":47,"description":48},"From idea to server: websites, apps and SaaS that go live and stay live","Web & Mobile Developer in Schio (Vicenza, Italy): websites, apps and SaaS that go live and stay live. {years} years across development, design and infrastructure.",{"id":31,"pages_id":4,"languages_code":32,"slug":42,"title":50,"seo_title":51,"description":52},"Acasă","De la idee la server: site-uri, aplicații și SaaS care ajung online și rămân acolo","Dezvoltator Web & Mobile în Schio (Vicenza, Italia): site-uri, aplicații și SaaS care ajung online și rămân acolo. {years} ani între dezvoltare, design și infrastructură.",[54,74,90,104],{"id":4,"collection":55,"sort":4,"item":56},"block_hero_home",{"id":4,"engines":57,"translations":58},"both",[59,64,69],{"id":4,"block_hero_home_id":4,"languages_code":20,"title":60,"title_accent":61,"text":62,"legacy_text":63},"Dall'idea","al server","Siti, app e SaaS che arrivano online e ci restano. {years} anni tra sviluppo, design e infrastruttura.","Da {years} anni trasformo idee in siti, app e interfacce che funzionano davvero. Questa pagina è servita dal vecchio DOM: testo, link blu e tabelle.",{"id":25,"block_hero_home_id":4,"languages_code":26,"title":65,"title_accent":66,"text":67,"legacy_text":68},"From idea","to server","Websites, apps and SaaS that go live and stay live. {years} years across development, design and infrastructure.","For {years} years I have been turning ideas into websites, apps and interfaces that actually work. This page is served by the old DOM: text, blue links and tables.",{"id":31,"block_hero_home_id":4,"languages_code":32,"title":70,"title_accent":71,"text":72,"legacy_text":73},"De la idee","la server","Site-uri, aplicații și SaaS care ajung online și rămân acolo. {years} ani între dezvoltare, design și infrastructură.","De {years} ani transform idei în site-uri, aplicații și interfețe care chiar funcționează. Această pagină este servită de vechiul DOM: text, linkuri albastre și tabele.",{"id":25,"collection":75,"sort":25,"item":76},"block_services",{"id":4,"engines":57,"translations":77},[78,82,86],{"id":4,"block_services_id":4,"languages_code":20,"label":79,"title":80,"text":81},"servizi","Cosa posso fare per te?","Che ti serva un sito, un'app o un'interfaccia che non faccia scappare gli utenti, ecco come posso aiutarti:",{"id":25,"block_services_id":4,"languages_code":26,"label":83,"title":84,"text":85},"services","What can I do for you?","Whether you need a website, an app or an interface that doesn't scare users away, here's how I can help:",{"id":31,"block_services_id":4,"languages_code":32,"label":87,"title":88,"text":89},"servicii","Ce pot face pentru tine?","Fie că ai nevoie de un site, de o aplicație sau de o interfață care să nu-i alunge pe utilizatori, iată cum te pot ajuta:",{"id":31,"collection":91,"sort":31,"item":92},"block_projects",{"id":4,"engines":57,"show":38,"kind":93,"all_link":6,"translations":94},"all",[95,98,101],{"id":4,"block_projects_id":4,"languages_code":20,"label":96,"title":97},"progetti","Lavori selezionati",{"id":25,"block_projects_id":4,"languages_code":26,"label":99,"title":100},"projects","Selected work",{"id":31,"block_projects_id":4,"languages_code":32,"label":102,"title":103},"proiecte","Lucrări selectate",{"id":105,"collection":106,"sort":105,"item":107},4,"block_contact_form",{"id":4,"engines":57,"translations":108},[109,115,121],{"id":4,"block_contact_form_id":4,"languages_code":20,"label":110,"title":111,"text":112,"steps_title":113,"steps":114},"contatti","Parliamone","Hai un progetto, un problema o solo un dubbio tecnico? Scrivimi: ti dico onestamente cosa farei, senza giri di parole.","Come funziona","Mi scrivi (anche due righe vanno bene)\nTi rispondo entro 1–2 giorni lavorativi e, se serve, ci sentiamo in una call di 30 minuti\nTi mando una proposta chiara: tempi, costi, cosa è incluso",{"id":25,"block_contact_form_id":4,"languages_code":26,"label":116,"title":117,"text":118,"steps_title":119,"steps":120},"contact","Let's talk","Got a project, a problem or just a technical question? Write to me: I'll tell you honestly what I'd do, no beating around the bush.","How it works","You write to me (two lines are enough)\nI reply within 1–2 working days and, if needed, we have a 30-minute call\nI send you a clear proposal: timing, costs, what's included",{"id":31,"block_contact_form_id":4,"languages_code":32,"label":116,"title":122,"text":123,"steps_title":124,"steps":125},"Hai să vorbim","Ai un proiect, o problemă sau doar o nelămurire tehnică? Scrie-mi: îți spun sincer ce aș face, fără ocolișuri.","Cum funcționează","Îmi scrii (sunt de ajuns două rânduri)\nÎți răspund în 1–2 zile lucrătoare și, dacă e nevoie, vorbim într-un call de 30 de minute\nÎți trimit o propunere clară: termene, costuri, ce este inclus",{"id":25,"sort":25,"key":127,"in_menu":6,"children":39,"translations":128,"sections":143},"about",[129,134,138],{"id":105,"pages_id":25,"languages_code":20,"slug":130,"title":131,"seo_title":132,"description":133},"chi-sono","Chi sono",null,"Sono Leica Florian Robert, sviluppatore Web & Mobile: sviluppo full stack, progetto interfacce (UI e UX) e insegno tecnologie web.",{"id":135,"pages_id":25,"languages_code":26,"slug":127,"title":136,"seo_title":132,"description":137},5,"About me","I'm Leica Florian Robert, a Web & Mobile Developer: I build full stack, design interfaces (UI and UX) and teach web technologies.",{"id":139,"pages_id":25,"languages_code":32,"slug":140,"title":141,"seo_title":132,"description":142},6,"despre-mine","Despre mine","Sunt Leica Florian Robert, dezvoltator Web & Mobile: dezvolt full stack, proiectez interfețe (UI și UX) și predau tehnologii web.",[144,160,184,201,213],{"id":135,"collection":145,"sort":4,"item":146},"block_page_header",{"id":4,"engines":57,"variant":127,"cv_button":6,"translations":147},[148,152,156],{"id":4,"block_page_header_id":4,"languages_code":20,"label":149,"title":150,"intro":151},"\u002F\u002F su di me","Ciao, piacere","Sono Leica Florian Robert, sviluppatore Web & Mobile: sviluppo full stack, progetto interfacce (UI e UX) e insegno tecnologie web. Sono un grande appassionato d'informatica e di tecnologia.",{"id":25,"block_page_header_id":4,"languages_code":26,"label":153,"title":154,"intro":155},"\u002F\u002F about me","Hi, nice to meet you","I'm Leica Florian Robert, a Web & Mobile Developer: I build full stack, design interfaces (UI and UX) and teach web technologies. I'm a big fan of computing and technology.",{"id":31,"block_page_header_id":4,"languages_code":32,"label":157,"title":158,"intro":159},"\u002F\u002F despre mine","Salut, încântat de cunoștință","Sunt Leica Florian Robert, dezvoltator Web & Mobile: dezvolt full stack, proiectez interfețe (UI și UX) și predau tehnologii web. Sunt un mare pasionat de informatică și tehnologie.",{"id":139,"collection":161,"sort":25,"item":162},"block_text",{"id":4,"engines":57,"widgets":163,"translations":168},[164,165,166,167],"web","editor","lesson","agent",[169,174,179],{"id":4,"block_text_id":4,"languages_code":20,"label":170,"title":171,"text":172,"steps":173},"storia","Da autodidatta a sviluppatore","Ho cominciato a programmare da autodidatta, a 20 anni, nel 2009, con un'applicazione in Visual Basic per l'Ordine degli Ingegneri della Provincia di Potenza, sviluppata per Tecnobit. Nessun corso, solo qualche dritta da un amico: per il resto documentazione, tentativi ed errori. Volevo capire come funziona il web e, prima o poi, farne parte.\n\nUn tassello alla volta, quella curiosità è diventata un mestiere. Mi sono messo alla prova su progetti sempre più grandi, fino a co-fondare una software house e a guidare, da CTO, la parte tecnica di una web agency: backend in Laravel e Node.js, interfacce in Vue e Nuxt, app mobile. Mi è capitato di sbagliare, e ogni errore mi ha insegnato qualcosa che un manuale non spiega.\n\nHo imparato da solo, e per questo so quanto conta avere qualcuno che ti spiega le cose bene. Per quasi tre anni, dal 2021 al 2024, ho formato programmatori Full Stack con Boolean Careers, insegnando loro quello che serve per lavorare davvero. Spiegare mi ha costretto a capire ogni cosa fino in fondo, e mi ha reso uno sviluppatore migliore.\n\nOggi lavoro come sviluppatore e continuo a guardare dove sta andando la tecnologia. Soprattutto l'AI, che sta cambiando il modo di lavorare in molti settori. Per me è uno strumento come gli altri, e come ogni buon strumento semplifica molte cose: la uso ogni giorno come un collega instancabile, che scrive e verifica codice sotto la mia direzione. Questo sito ne è la prova, e lo racconto nel suo case study.","l'inizio\nla crescita\ninsegnare\noggi",{"id":25,"block_text_id":4,"languages_code":26,"label":175,"title":176,"text":177,"steps":178},"story","From self-taught to developer","I started programming self-taught at 20, in 2009, with a Visual Basic application for the Order of Engineers of the Province of Potenza, built for Tecnobit. No courses, just a few tips from a friend: the rest was documentation, trial and error. I wanted to understand how the web works and, sooner or later, be part of it.\n\nPiece by piece, that curiosity became a trade. I tested myself on bigger and bigger projects, up to co-founding a software house and leading, as CTO, the technical side of a web agency: Laravel and Node.js backends, Vue and Nuxt interfaces, mobile apps. I made mistakes along the way, and every one taught me something no manual explains.\n\nI learned on my own, and that's why I know how much it matters to have someone who explains things well. For almost three years, from 2021 to 2024, I trained Full Stack developers at Boolean Careers, teaching them what they need to really do the job. Explaining forced me to understand everything all the way down, and made me a better developer.\n\nToday I work as a developer and keep watching where technology is going. Above all AI, which is changing how people work in many fields. To me it's a tool like any other, and like every good tool it makes many things simpler: I use it every day like a tireless colleague that writes and checks code under my direction. This site is the proof, and I tell the story in its case study.","the start\ngrowing\nteaching\ntoday",{"id":31,"block_text_id":4,"languages_code":32,"label":180,"title":181,"text":182,"steps":183},"poveste","De la autodidact la dezvoltator","Am început să programez ca autodidact la 20 de ani, în 2009, cu o aplicație în Visual Basic pentru Ordinul Inginerilor din Provincia Potenza, dezvoltată pentru Tecnobit. Niciun curs, doar câteva sfaturi de la un prieten: în rest, documentație, încercări și greșeli. Voiam să înțeleg cum funcționează web-ul și, mai devreme sau mai târziu, să fac parte din el.\n\nPas cu pas, acea curiozitate a devenit o meserie. M-am pus la încercare pe proiecte tot mai mari, până la a co-fonda o software house și a conduce, ca CTO, partea tehnică a unei agenții web: backend în Laravel și Node.js, interfețe în Vue și Nuxt, aplicații mobile. Mi s-a întâmplat să greșesc, iar fiecare greșeală m-a învățat ceva ce niciun manual nu explică.\n\nAm învățat singur și de aceea știu cât contează să ai pe cineva care îți explică bine lucrurile. Timp de aproape trei ani, din 2021 până în 2024, am format programatori Full Stack la Boolean Careers, învățându-i ce le trebuie ca să lucreze cu adevărat. Să explic m-a obligat să înțeleg totul până la capăt și m-a făcut un dezvoltator mai bun.\n\nAstăzi lucrez ca dezvoltator și continui să urmăresc încotro merge tehnologia. Mai ales AI-ul, care schimbă felul în care se lucrează în multe domenii. Pentru mine e un instrument ca oricare altul și, ca orice instrument bun, simplifică multe lucruri: îl folosesc zilnic ca pe un coleg neobosit, care scrie și verifică cod sub îndrumarea mea. Acest site este dovada, iar povestea o spun în studiul lui de caz.","începutul\ncreșterea\npredarea\nazi",{"id":185,"collection":186,"sort":31,"item":187},7,"block_experiences",{"id":4,"engines":57,"translations":188},[189,193,197],{"id":4,"block_experiences_id":4,"languages_code":20,"label":190,"title":191,"text":192},"esperienze","Ecco alcune esperienze","Queste sono alcune delle esperienze più significative che ho avuto nel corso della mia carriera. Ci sono stati molti altri progetti e collaborazioni, e tutte queste esperienze mi hanno permesso di crescere professionalmente, ma sicuramente queste sono le più importanti.",{"id":25,"block_experiences_id":4,"languages_code":26,"label":194,"title":195,"text":196},"experience","Some of my experience","These are some of the most significant experiences of my career. There have been many other projects and collaborations, and all of them helped me grow professionally, but these are certainly the most important.",{"id":31,"block_experiences_id":4,"languages_code":32,"label":198,"title":199,"text":200},"experiență","Câteva dintre experiențele mele","Acestea sunt câteva dintre cele mai semnificative experiențe din cariera mea. Au mai fost multe alte proiecte și colaborări, iar toate m-au ajutat să cresc profesional, dar acestea sunt cu siguranță cele mai importante.",{"id":202,"collection":203,"sort":105,"item":204},8,"block_stack",{"id":4,"engines":57,"translations":205},[206,209,211],{"id":4,"block_stack_id":4,"languages_code":20,"label":207,"title":208},"stack","Tecnologie e linguaggi",{"id":25,"block_stack_id":4,"languages_code":26,"label":207,"title":210},"Technologies and languages",{"id":31,"block_stack_id":4,"languages_code":32,"label":207,"title":212},"Tehnologii și limbaje",{"id":214,"collection":215,"sort":135,"item":216},9,"block_cta",{"id":4,"engines":217,"variant":218,"translations":219},"native","banner",[220,224,228],{"id":4,"block_cta_id":4,"languages_code":20,"label":132,"title":221,"title_accent":222,"text":223},"Ora sai qualcosa in più,","scrivimi","Se hai bisogno di un sito web, di un'applicazione mobile, di un logo o di un'identità visiva, o se hai semplicemente bisogno di un consiglio, non esitare a contattarmi! Sono sempre alla ricerca di nuove sfide, nuovi entusiasmanti progetti e nuove opportunità per migliorare come persona e come professionista.",{"id":25,"block_cta_id":4,"languages_code":26,"label":132,"title":225,"title_accent":226,"text":227},"Now you know a bit more,","drop me a line","If you need a website, a mobile app, a logo or a visual identity, or if you simply need some advice, don't hesitate to get in touch! I'm always looking for new challenges, exciting new projects and new opportunities to grow as a person and as a professional.",{"id":31,"block_cta_id":4,"languages_code":32,"label":132,"title":229,"title_accent":230,"text":231},"Acum știi ceva mai mult,","scrie-mi","Dacă ai nevoie de un site web, de o aplicație mobilă, de un logo sau de o identitate vizuală, sau dacă ai nevoie pur și simplu de un sfat, nu ezita să mă contactezi! Sunt mereu în căutarea unor noi provocări, a unor proiecte noi și interesante și a unor noi oportunități de a mă dezvolta ca om și ca profesionist.",{"id":31,"sort":31,"key":99,"in_menu":6,"children":99,"translations":233,"sections":243},[234,237,240],{"id":185,"pages_id":31,"languages_code":20,"slug":96,"title":235,"seo_title":132,"description":236},"Progetti","Alcuni dei progetti che ho realizzato: siti, web app, app mobile ed esperimenti.",{"id":202,"pages_id":31,"languages_code":26,"slug":99,"title":238,"seo_title":132,"description":239},"Projects","Some of the projects I've built: websites, web apps, mobile apps and experiments.",{"id":214,"pages_id":31,"languages_code":32,"slug":102,"title":241,"seo_title":132,"description":242},"Proiecte","Câteva dintre proiectele pe care le-am realizat: site-uri, aplicații web, aplicații mobile și experimente.",[244,258,268,283,298,311],{"id":245,"collection":145,"sort":4,"item":246},10,{"id":25,"engines":57,"variant":99,"cv_button":247,"translations":248},false,[249,252,255],{"id":105,"block_page_header_id":25,"languages_code":20,"label":250,"title":235,"intro":251},"\u002F\u002F {n} progetti","Siti, piattaforme, app, infrastrutture: qui sotto una parte di quello che ho costruito, per clienti e per me. Oggi lavoro anche con l'AI, che mi fa andare più veloce, mentre decisioni, architettura e qualità restano mie. Hai qualcosa di diverso in mente? Scrivimi.",{"id":135,"block_page_header_id":25,"languages_code":26,"label":253,"title":238,"intro":254},"\u002F\u002F {n} projects","Websites, platforms, apps, infrastructure: below is part of what I've built, for clients and for myself. Today I also work with AI, which makes me faster, while the decisions, the architecture and the quality stay mine. Have something different in mind? Write to me.",{"id":139,"block_page_header_id":25,"languages_code":32,"label":256,"title":241,"intro":257},"\u002F\u002F {n} proiecte","Site-uri, platforme, aplicații, infrastructuri: mai jos e o parte din ce am construit, pentru clienți și pentru mine. Astăzi lucrez și cu AI, care mă face mai rapid, în timp ce deciziile, arhitectura și calitatea rămân ale mele. Ai altceva în minte? Scrie-mi.",{"id":259,"collection":91,"sort":25,"item":260},11,{"id":25,"engines":57,"show":261,"kind":93,"all_link":247,"translations":262},"featured",[263,265,266],{"id":105,"block_projects_id":25,"languages_code":20,"label":264,"title":132},"in evidenza",{"id":135,"block_projects_id":25,"languages_code":26,"label":261,"title":132},{"id":139,"block_projects_id":25,"languages_code":32,"label":267,"title":132},"în evidență",{"id":269,"collection":91,"sort":31,"item":270},12,{"id":31,"engines":57,"show":271,"kind":272,"all_link":247,"translations":273},"archive","direct",[274,277,280],{"id":185,"block_projects_id":31,"languages_code":20,"label":275,"title":276},"clienti","Lavori per i clienti",{"id":202,"block_projects_id":31,"languages_code":26,"label":278,"title":279},"clients","Client work",{"id":214,"block_projects_id":31,"languages_code":32,"label":281,"title":282},"clienți","Lucrări pentru clienți",{"id":284,"collection":91,"sort":105,"item":285},13,{"id":105,"engines":57,"show":286,"kind":287,"all_link":247,"translations":288},"grouped","agency",[289,292,295],{"id":245,"block_projects_id":105,"languages_code":20,"label":290,"title":291},"agenzie","Tramite agenzia",{"id":259,"block_projects_id":105,"languages_code":26,"label":293,"title":294},"agencies","Through agencies",{"id":269,"block_projects_id":105,"languages_code":32,"label":296,"title":297},"agenții","Prin agenții",{"id":299,"collection":91,"sort":135,"item":300},14,{"id":135,"engines":57,"show":271,"kind":301,"all_link":247,"translations":302},"personal",[303,306,308],{"id":284,"block_projects_id":135,"languages_code":20,"label":304,"title":305},"lab","Progetti personali",{"id":299,"block_projects_id":135,"languages_code":26,"label":304,"title":307},"Personal projects",{"id":309,"block_projects_id":135,"languages_code":32,"label":304,"title":310},15,"Proiecte personale",{"id":309,"collection":215,"sort":139,"item":312},{"id":25,"engines":217,"variant":218,"translations":313},[314,316,318],{"id":105,"block_cta_id":25,"languages_code":20,"label":132,"title":221,"title_accent":222,"text":315},"Sia che tu stia cercando di creare un sito web aziendale, un e-commerce, un blog o qualsiasi altra soluzione web, sono qui per aiutarti. Contattami oggi stesso per scoprire come possiamo collaborare e creare un sito web straordinario insieme!",{"id":135,"block_cta_id":25,"languages_code":26,"label":132,"title":225,"title_accent":226,"text":317},"Whether you want to build a company website, an online shop, a blog or any other web solution, I'm here to help. Get in touch today to find out how we can work together and build an outstanding website!",{"id":139,"block_cta_id":25,"languages_code":32,"label":132,"title":229,"title_accent":230,"text":319},"Fie că vrei să creezi un site de prezentare, un magazin online, un blog sau orice altă soluție web, sunt aici să te ajut. Contactează-mă chiar azi ca să vedem cum putem colabora și crea împreună un site extraordinar!",{"id":105,"sort":105,"key":116,"in_menu":6,"children":39,"translations":321,"sections":330},[322,325,328],{"id":245,"pages_id":105,"languages_code":20,"slug":110,"title":323,"seo_title":132,"description":324},"Contatti","Sito, app, consulenza o solo un parere tecnico — scrivimi e vediamo insieme come darti una mano.",{"id":259,"pages_id":105,"languages_code":26,"slug":116,"title":326,"seo_title":132,"description":327},"Contact","A website, an app, consulting or just a technical opinion — write to me and let's figure out together how I can help.",{"id":269,"pages_id":105,"languages_code":32,"slug":116,"title":326,"seo_title":132,"description":329},"Site, aplicație, consultanță sau doar o părere tehnică — scrie-mi și vedem împreună cum te pot ajuta.",[331,341,350,358],{"id":332,"collection":145,"sort":4,"item":333},16,{"id":31,"engines":57,"variant":116,"cv_button":247,"translations":334},[335,337,339],{"id":185,"block_page_header_id":31,"languages_code":20,"label":132,"title":323,"intro":336},"Raccontami cosa hai in mente, anche se è solo un'idea abbozzata. Nessun impegno.",{"id":202,"block_page_header_id":31,"languages_code":26,"label":132,"title":326,"intro":338},"Tell me what you have in mind, even if it's just a rough idea. No commitment.",{"id":214,"block_page_header_id":31,"languages_code":32,"label":132,"title":326,"intro":340},"Povestește-mi ce ai în minte, chiar dacă e doar o idee schițată. Fără niciun angajament.",{"id":342,"collection":343,"sort":25,"item":344},17,"block_contact_info",{"id":4,"engines":345,"cv_button":6,"translations":346},"legacy",[347,348,349],{"id":4,"block_contact_info_id":4,"languages_code":20,"label":132,"title":132},{"id":25,"block_contact_info_id":4,"languages_code":26,"label":132,"title":132},{"id":31,"block_contact_info_id":4,"languages_code":32,"label":132,"title":132},{"id":351,"collection":106,"sort":31,"item":352},18,{"id":25,"engines":57,"translations":353},[354,355,357],{"id":105,"block_contact_form_id":25,"languages_code":20,"label":222,"title":111,"text":132,"steps_title":113,"steps":114},{"id":135,"block_contact_form_id":25,"languages_code":26,"label":356,"title":117,"text":132,"steps_title":119,"steps":120},"write to me",{"id":139,"block_contact_form_id":25,"languages_code":32,"label":230,"title":122,"text":132,"steps_title":124,"steps":125},{"id":359,"collection":343,"sort":105,"item":360},19,{"id":25,"engines":217,"cv_button":6,"translations":361},[362,365,368],{"id":105,"block_contact_info_id":25,"languages_code":20,"label":363,"title":364},"recapiti","Dove trovarmi",{"id":135,"block_contact_info_id":25,"languages_code":26,"label":366,"title":367},"details","Where to find me",{"id":139,"block_contact_info_id":25,"languages_code":32,"label":369,"title":370},"date de contact","Unde mă găsești",{"id":135,"sort":135,"key":372,"in_menu":247,"children":39,"translations":373,"sections":383},"privacy",[374,377,379],{"id":284,"pages_id":135,"languages_code":20,"slug":372,"title":375,"seo_title":132,"description":376},"Privacy","Come tratto i dati che mi lasci quando mi scrivi dal modulo di contatto di questo sito.",{"id":299,"pages_id":135,"languages_code":26,"slug":372,"title":375,"seo_title":132,"description":378},"How I handle the data you leave me when you write to me through this site's contact form.",{"id":309,"pages_id":135,"languages_code":32,"slug":380,"title":381,"seo_title":132,"description":382},"confidentialitate","Confidențialitate","Cum folosesc datele pe care mi le lași când îmi scrii prin formularul de contact al acestui site.",[384,395,408,421,434,447,460,473,486,499],{"id":385,"collection":145,"sort":4,"item":386},20,{"id":105,"engines":57,"variant":387,"cv_button":247,"translations":388},"plain",[389,391,393],{"id":245,"block_page_header_id":105,"languages_code":20,"label":132,"title":390,"intro":376},"Informativa privacy",{"id":259,"block_page_header_id":105,"languages_code":26,"label":132,"title":392,"intro":378},"Privacy policy",{"id":269,"block_page_header_id":105,"languages_code":32,"label":132,"title":394,"intro":382},"Politica de confidențialitate",{"id":396,"collection":161,"sort":25,"item":397},21,{"id":25,"engines":57,"widgets":132,"translations":398},[399,402,405],{"id":105,"block_text_id":25,"languages_code":20,"label":132,"title":400,"text":401,"steps":132},"Titolare del trattamento","Il titolare è **Leica Florian Robert**, ditta individuale con sede a Schio (VI), P. IVA 04329800249. Per qualsiasi domanda sui tuoi dati scrivimi a info@leicaflorianrobert.dev.",{"id":135,"block_text_id":25,"languages_code":26,"label":132,"title":403,"text":404,"steps":132},"Data controller","The controller is **Leica Florian Robert**, a sole proprietorship based in Schio (VI), Italy, VAT no. 04329800249. For any question about your data, write to me at info@leicaflorianrobert.dev.",{"id":139,"block_text_id":25,"languages_code":32,"label":132,"title":406,"text":407,"steps":132},"Operatorul de date","Operatorul este **Leica Florian Robert**, întreprindere individuală cu sediul în Schio (VI), Italia, cod TVA 04329800249. Pentru orice întrebare despre datele tale, scrie-mi la info@leicaflorianrobert.dev.",{"id":409,"collection":161,"sort":31,"item":410},22,{"id":31,"engines":57,"widgets":132,"translations":411},[412,415,418],{"id":185,"block_text_id":31,"languages_code":20,"label":132,"title":413,"text":414,"steps":132},"Quali dati raccolgo","Dal modulo di contatto: nome, indirizzo email e messaggio e, se li scegli, tipo di progetto, budget e tempistiche, oltre alla lingua della pagina da cui scrivi. Nome, email e messaggio servono per risponderti: senza, non posso farlo; il resto è facoltativo.\n\nCome ogni sito, il server registra inoltre nei log tecnici l'indirizzo IP e i dati delle richieste, solo per farlo funzionare e tenerlo sicuro.\n\nNon ti chiedo dati particolari (sulla salute, giudiziari e simili): ti chiedo di non inserirli nel messaggio.",{"id":202,"block_text_id":31,"languages_code":26,"label":132,"title":416,"text":417,"steps":132},"What data I collect","From the contact form: name, email address and message and, if you pick them, project type, budget and timing, plus the language of the page you write from. I need your name, email and message to reply to you: without them I can't; the rest is optional.\n\nLike any website, the server also records the IP address and the details of each request in its technical logs, only to keep the site running and secure.\n\nI don't ask for special categories of data (health, criminal records and the like): please don't put them in the message.",{"id":214,"block_text_id":31,"languages_code":32,"label":132,"title":419,"text":420,"steps":132},"Ce date colectez","Din formularul de contact: numele, adresa de email și mesajul și, dacă le alegi, tipul de proiect, bugetul și termenele, plus limba paginii din care scrii. Numele, emailul și mesajul îmi trebuie ca să-ți răspund: fără ele nu pot; restul este opțional.\n\nCa orice site, serverul înregistrează în plus în jurnalele tehnice adresa IP și datele cererilor, doar ca să funcționeze și să rămână sigur.\n\nNu îți cer date speciale (despre sănătate, cazier și altele asemenea): te rog să nu le scrii în mesaj.",{"id":422,"collection":161,"sort":105,"item":423},23,{"id":105,"engines":57,"widgets":132,"translations":424},[425,428,431],{"id":245,"block_text_id":105,"languages_code":20,"label":132,"title":426,"text":427,"steps":132},"Perché li uso","Solo per risponderti e, se ne nasce una collaborazione, per prepararti una proposta. La base giuridica è l'esecuzione di misure precontrattuali richieste da te (art. 6, par. 1, lett. b del GDPR); per i log tecnici è il mio legittimo interesse a tenere il sito sicuro (art. 6, par. 1, lett. f).\n\nNon uso i dati per newsletter o marketing, e non li vendo né li comunico a terzi, salvo i fornitori tecnici indicati più sotto.",{"id":259,"block_text_id":105,"languages_code":26,"label":132,"title":429,"text":430,"steps":132},"Why I use it","Only to reply to you and, if we end up working together, to prepare a proposal. The legal basis is taking steps at your request before entering into a contract (Art. 6(1)(b) GDPR); for the technical logs, it's my legitimate interest in keeping the site secure (Art. 6(1)(f)).\n\nI don't use the data for newsletters or marketing, and I don't sell it or pass it on to third parties, apart from the technical providers listed below.",{"id":269,"block_text_id":105,"languages_code":32,"label":132,"title":432,"text":433,"steps":132},"De ce le folosesc","Doar ca să-ți răspund și, dacă ajungem să colaborăm, ca să-ți pregătesc o propunere. Temeiul legal este efectuarea unor demersuri la cererea ta înainte de încheierea unui contract (art. 6 alin. (1) lit. b din GDPR); pentru jurnalele tehnice este interesul meu legitim de a ține site-ul în siguranță (art. 6 alin. (1) lit. f).\n\nNu folosesc datele pentru newslettere sau marketing, nu le vând și nu le transmit terților, în afară de furnizorii tehnici de mai jos.",{"id":435,"collection":161,"sort":135,"item":436},24,{"id":135,"engines":57,"widgets":132,"translations":437},[438,441,444],{"id":284,"block_text_id":135,"languages_code":20,"label":132,"title":439,"text":440,"steps":132},"Dove sono e per quanto tempo","Il messaggio viene salvato nel sistema che gestisce i contenuti del sito e mi arriva per email. Lo conservo per il tempo necessario a gestire la richiesta, e comunque non oltre 24 mesi dall'ultimo contatto; se nasce un rapporto di lavoro, valgono i tempi di conservazione previsti dalla legge per i documenti fiscali. I log tecnici vengono cancellati dopo poco tempo.",{"id":299,"block_text_id":135,"languages_code":26,"label":132,"title":442,"text":443,"steps":132},"Where it is and for how long","The message is saved in the system that manages the site's content and reaches me by email. I keep it as long as needed to handle the request, and in any case no longer than 24 months after our last contact; if we end up working together, the retention periods required by law for tax records apply. The technical logs are deleted after a short time.",{"id":309,"block_text_id":135,"languages_code":32,"label":132,"title":445,"text":446,"steps":132},"Unde sunt și cât timp","Mesajul este salvat în sistemul care gestionează conținutul site-ului și îmi ajunge pe email. Îl păstrez cât timp e nevoie pentru a gestiona cererea și, oricum, nu mai mult de 24 de luni de la ultimul contact; dacă ajungem să colaborăm, se aplică termenele de păstrare prevăzute de lege pentru documentele fiscale. Jurnalele tehnice se șterg după scurt timp.",{"id":448,"collection":161,"sort":139,"item":449},25,{"id":139,"engines":57,"widgets":132,"translations":450},[451,454,457],{"id":332,"block_text_id":139,"languages_code":20,"label":132,"title":452,"text":453,"steps":132},"Chi li tratta per me","Il sito e il sistema che salva i messaggi sono ospitati da **DigitalOcean** su un server ad Amsterdam, nei Paesi Bassi. DigitalOcean è un'azienda statunitense: i dati restano nell'Unione europea, ma un eventuale accesso dagli Stati Uniti è coperto dalle clausole contrattuali standard e dal Data Privacy Framework.\n\nLa posta elettronica, con cui mi arrivano i messaggi, è gestita da **Hostinger**.\n\nEntrambi trattano i dati solo per conto mio, come responsabili del trattamento (art. 28 del GDPR).",{"id":342,"block_text_id":139,"languages_code":26,"label":132,"title":455,"text":456,"steps":132},"Who processes it for me","The site and the system that saves the messages are hosted by **DigitalOcean** on a server in Amsterdam, the Netherlands. DigitalOcean is a US company: the data stays in the European Union, but any access from the United States is covered by the standard contractual clauses and the Data Privacy Framework.\n\nThe email, through which the messages reach me, is handled by **Hostinger**.\n\nBoth process the data only on my behalf, as processors (Art. 28 GDPR).",{"id":351,"block_text_id":139,"languages_code":32,"label":132,"title":458,"text":459,"steps":132},"Cine le prelucrează pentru mine","Site-ul și sistemul care salvează mesajele sunt găzduite de **DigitalOcean** pe un server din Amsterdam, Țările de Jos. DigitalOcean este o companie americană: datele rămân în Uniunea Europeană, dar un eventual acces din Statele Unite este acoperit de clauzele contractuale standard și de Data Privacy Framework.\n\nEmailul, prin care îmi ajung mesajele, este gestionat de **Hostinger**.\n\nAmândoi prelucrează datele doar în numele meu, ca persoane împuternicite (art. 28 din GDPR).",{"id":461,"collection":161,"sort":185,"item":462},26,{"id":185,"engines":57,"widgets":132,"translations":463},[464,467,470],{"id":359,"block_text_id":185,"languages_code":20,"label":132,"title":465,"text":466,"steps":132},"Protezione dallo spam","Per proteggere il modulo dallo spam, nella pagina che lo contiene uso **Google reCAPTCHA v3**, che analizza alcune informazioni sul dispositivo e sull'uso della pagina e può impostare dei cookie. La base giuridica è il mio legittimo interesse a tenere il modulo libero dallo spam (art. 6, par. 1, lett. f del GDPR).\n\nQuesti dati sono trattati da Google secondo la propria informativa (policies.google.com\u002Fprivacy) e possono essere trasferiti negli Stati Uniti, sulla base del Data Privacy Framework.",{"id":385,"block_text_id":185,"languages_code":26,"label":132,"title":468,"text":469,"steps":132},"Spam protection","To protect the form from spam, on the page that contains it I use **Google reCAPTCHA v3**, which analyses some information about the device and how the page is used, and may set cookies. The legal basis is my legitimate interest in keeping the form free of spam (Art. 6(1)(f) GDPR).\n\nThis data is processed by Google under its own policy (policies.google.com\u002Fprivacy) and may be transferred to the United States, under the Data Privacy Framework.",{"id":396,"block_text_id":185,"languages_code":32,"label":132,"title":471,"text":472,"steps":132},"Protecția împotriva spamului","Ca să protejez formularul de spam, pe pagina care îl conține folosesc **Google reCAPTCHA v3**, care analizează unele informații despre dispozitiv și despre folosirea paginii și poate seta cookie-uri. Temeiul legal este interesul meu legitim de a feri formularul de spam (art. 6 alin. (1) lit. f din GDPR).\n\nAceste date sunt prelucrate de Google conform propriei politici (policies.google.com\u002Fprivacy) și pot fi transferate în Statele Unite, în baza Data Privacy Framework.",{"id":474,"collection":161,"sort":202,"item":475},27,{"id":202,"engines":57,"widgets":132,"translations":476},[477,480,483],{"id":409,"block_text_id":202,"languages_code":20,"label":132,"title":478,"text":479,"steps":132},"Cookie e preferenze","Il sito non usa cookie di profilazione né strumenti di statistica. Salva nel tuo browser solo la scelta tra la versione legacy e quella nativa, per ricordarla alla prossima visita.",{"id":422,"block_text_id":202,"languages_code":26,"label":132,"title":481,"text":482,"steps":132},"Cookies and preferences","The site uses no profiling cookies and no analytics. It only saves in your browser your choice between the legacy and the native version, to remember it on your next visit.",{"id":435,"block_text_id":202,"languages_code":32,"label":132,"title":484,"text":485,"steps":132},"Cookie-uri și preferințe","Site-ul nu folosește cookie-uri de profilare și nici instrumente de statistică. Salvează în browserul tău doar alegerea dintre versiunea legacy și cea nativă, ca s-o țină minte la următoarea vizită.",{"id":487,"collection":161,"sort":214,"item":488},28,{"id":214,"engines":57,"widgets":132,"translations":489},[490,493,496],{"id":448,"block_text_id":214,"languages_code":20,"label":132,"title":491,"text":492,"steps":132},"I tuoi diritti","Puoi chiedermi in ogni momento di accedere ai tuoi dati, correggerli, cancellarli, limitarne il trattamento, opporti al trattamento o riceverli in un formato leggibile (artt. 15–22 del GDPR), scrivendo all'email qui sopra.\n\nSe ritieni che il trattamento non sia corretto, puoi presentare reclamo al Garante per la protezione dei dati personali (garanteprivacy.it).",{"id":461,"block_text_id":214,"languages_code":26,"label":132,"title":494,"text":495,"steps":132},"Your rights","You can ask me at any time to access, correct or delete your data, restrict or object to its processing, or receive it in a readable format (Art. 15–22 GDPR), by writing to the email above.\n\nIf you believe the processing isn't lawful, you can lodge a complaint with the Italian data protection authority, the Garante per la protezione dei dati personali (garanteprivacy.it).",{"id":474,"block_text_id":214,"languages_code":32,"label":132,"title":497,"text":498,"steps":132},"Drepturile tale","Îmi poți cere oricând să ai acces la datele tale, să le corectez sau să le șterg, să le restricționez prelucrarea, să te opui prelucrării sau să le primești într-un format ușor de citit (art. 15–22 din GDPR), scriindu-mi la adresa de email de mai sus.\n\nDacă crezi că prelucrarea nu este corectă, poți depune o plângere la autoritatea italiană pentru protecția datelor, Garante per la protezione dei dati personali (garanteprivacy.it).",{"id":500,"collection":161,"sort":245,"item":501},29,{"id":245,"engines":57,"widgets":132,"translations":502},[503,506,509],{"id":487,"block_text_id":245,"languages_code":20,"label":132,"title":504,"text":505,"steps":132},"Modifiche","Se cambia il modo in cui tratto i dati, aggiorno questa pagina. Ultimo aggiornamento: 18 ottobre 2026.",{"id":500,"block_text_id":245,"languages_code":26,"label":132,"title":507,"text":508,"steps":132},"Changes","If the way I handle data changes, I update this page. Last updated: 18 October 2026.",{"id":510,"block_text_id":245,"languages_code":32,"label":132,"title":511,"text":512,"steps":132},30,"Modificări","Dacă se schimbă felul în care prelucrez datele, actualizez această pagină. Ultima actualizare: 18 octombrie 2026.",[514],{"id":214,"sort":214,"status":515,"slug":516,"url":517,"kind":301,"category":132,"featured":247,"mockup":39,"on_home":247,"case_study":6,"branch":132,"image":518,"typographic":247,"logo":519,"logo_plate":247,"visual":132,"year":520,"cover":132,"translations":521,"sections":539},"published","tvit","https:\u002F\u002Ftvit.leicaflorianrobert.dev\u002Fchannels","802f4d47-f65f-4d45-897d-7bba4df34447","a8c8dc4f-768f-49f3-a29c-5521a52079d0",2022,[522,529,534],{"id":448,"projects_id":214,"languages_code":20,"name":523,"note":524,"subtitle":132,"intro":525,"role":526,"type":527,"stack":528,"award":132},"TvIt","65 stelle su GitHub, lista e guida TV che si aggiornano da sole","Un progetto personale nato da un'esigenza mia: una lista IPTV con i canali TV italiani in chiaro, letti dalle fonti delle emittenti, e la guida TV. Da guardare con qualsiasi player o direttamente nel browser.","Ideazione e sviluppo","Progetto personale","Laravel, Vue, Inertia, Docker",{"id":461,"projects_id":214,"languages_code":26,"name":523,"note":530,"subtitle":132,"intro":531,"role":532,"type":533,"stack":528,"award":132},"65 stars on GitHub, a list and TV guide that update themselves","A personal project born from a need of my own: an IPTV list of the free-to-air Italian TV channels, read from the broadcasters' own sources, with the TV guide. To watch with any player or straight in the browser.","Concept and development","Personal project",{"id":474,"projects_id":214,"languages_code":32,"name":523,"note":535,"subtitle":132,"intro":536,"role":537,"type":538,"stack":528,"award":132},"65 de stele pe GitHub, listă și ghid TV care se actualizează singure","Un proiect personal născut dintr-o nevoie a mea: o listă IPTV cu canalele TV italiene gratuite, citite din sursele televiziunilor, și ghidul TV. De urmărit cu orice player sau direct în browser.","Concepție și dezvoltare","Proiect personal",[540,560,580,611,643,672,688,707],{"id":541,"collection":161,"sort":4,"item":542},118,{"id":543,"engines":57,"widgets":132,"translations":544},41,[545,550,555],{"id":546,"block_text_id":543,"languages_code":20,"label":547,"title":548,"text":549,"steps":132},121,"punto di partenza","Una lista che non c'era","Tutto è cominciato in salotto. Guardavo la TV con una **Nvidia Shield TV**, un box Android, e con un'app IPTV: mi serviva solo una lista dei canali italiani che funzionasse. Quelle che trovavo smettevano di andare dopo pochi giorni, o non andavano affatto.\n\nNon trovandone una affidabile, ho deciso di scriverla io.\n\nNessun contenuto privato: solo i canali che le emittenti trasmettono già pubblicamente sui loro siti.",{"id":551,"block_text_id":543,"languages_code":26,"label":552,"title":553,"text":554,"steps":132},122,"starting point","A list that didn't exist","It all started in the living room. I watched TV with an **Nvidia Shield TV**, an Android box, and an IPTV app: all I needed was a list of Italian channels that worked. The ones I found stopped working after a few days, or never worked at all.\n\nUnable to find a reliable one, I decided to write it myself.\n\nNo private content: only the channels the broadcasters already stream publicly on their websites.",{"id":556,"block_text_id":543,"languages_code":32,"label":557,"title":558,"text":559,"steps":132},123,"punct de plecare","O listă care nu exista","Totul a început în sufragerie. Mă uitam la televizor cu un **Nvidia Shield TV**, un box Android, și cu o aplicație IPTV: îmi trebuia doar o listă de canale italiene care să funcționeze. Cele pe care le găseam nu mai mergeau după câteva zile sau nu mergeau deloc.\n\nNegăsind una de încredere, am decis s-o scriu eu.\n\nNiciun conținut privat: doar canalele pe care televiziunile le transmit deja public pe site-urile lor.",{"id":561,"collection":161,"sort":25,"item":562},119,{"id":563,"engines":57,"widgets":132,"translations":564},42,[565,570,575],{"id":566,"block_text_id":563,"languages_code":20,"label":567,"title":568,"text":569,"steps":132},124,"evoluzione","Da hometv a TvIt","La prima versione, nel 2019, si chiamava **hometv** ed era scritta in TypeScript. Faceva il suo lavoro, ma con il tempo i casi particolari si moltiplicavano: canali che cambiavano indirizzo, sorgenti che rispondevano in modo diverso, controlli da ripetere ogni notte.\n\nNel 2022 l'ho riscritta da zero in **Laravel**: più veloce, e con code, pianificazione dei lavori, client HTTP e test già pronti, proprio quello che serviva per gestire bene ogni eccezione. È nata così TvIt.",{"id":571,"block_text_id":563,"languages_code":26,"label":572,"title":573,"text":574,"steps":132},125,"evolution","From hometv to TvIt","The first version, in 2019, was called **hometv** and was written in TypeScript. It did its job, but over time the special cases multiplied: channels changing address, sources answering in different ways, checks to repeat every night.\n\nIn 2022 I rewrote it from scratch in **Laravel**: faster, and with queues, job scheduling, an HTTP client and tests out of the box, exactly what I needed to handle every exception properly. That's how TvIt was born.",{"id":576,"block_text_id":563,"languages_code":32,"label":577,"title":578,"text":579,"steps":132},126,"evoluție","De la hometv la TvIt","Prima versiune, în 2019, se numea **hometv** și era scrisă în TypeScript. Își făcea treaba, dar cu timpul cazurile speciale se înmulțeau: canale care își schimbau adresa, surse care răspundeau diferit, verificări de repetat în fiecare noapte.\n\nÎn 2022 am rescris-o de la zero în **Laravel**: mai rapidă și cu cozi, planificarea sarcinilor, client HTTP și teste deja pregătite, exact ce îmi trebuia ca să tratez bine fiecare excepție. Așa s-a născut TvIt.",{"id":581,"collection":582,"sort":31,"item":583},120,"block_gallery",{"id":448,"engines":57,"translations":584,"images":610},[585,594,602],{"id":586,"block_gallery_id":448,"languages_code":20,"label":587,"title":588,"text":589,"captions":590,"items":132,"localized_images":591},73,"reverse engineering","Come fanno le emittenti","All'inizio non sapevo nulla di come funzionasse lo streaming di una diretta TV. Per capirlo ho fatto un po' di reverse engineering: ho aperto i siti delle emittenti con gli strumenti per sviluppatori del browser e ho seguito, una per una, le richieste dei loro player.\n\nHo scoperto che nella pagina l'indirizzo del video non c'è. Il player chiede prima a un servizio dell'emittente dove si trova la diretta, e ottiene un indirizzo temporaneo, con un token che scade dopo poco, verso la CDN che distribuisce il video. Il video stesso non è un file unico, ma una playlist **.m3u8** di piccoli segmenti di pochi secondi, che il player scarica uno dopo l'altro (HLS).\n\nUna volta capito il meccanismo, l'ho replicato. Nella lista ogni canale punta a TvIt; quando un player lo apre, TvIt fa la stessa richiesta che farebbe il player dell'emittente e lo rimanda all'indirizzo appena ottenuto. Il video arriva **direttamente dalla CDN dell'emittente**, senza passare dal mio server.\n\nC'è un vantaggio in più: siccome la lista punta a TvIt e non alle emittenti, quando un'emittente cambia qualcosa basta correggere TvIt, e la lista salvata nei player continua a funzionare.","Il percorso di un canale, dal player alla CDN dell'emittente",[592],{"directus_files_id":593,"sort":4},"75840bc3-caae-46c3-965c-3a2d737f0d6e",{"id":595,"block_gallery_id":448,"languages_code":26,"label":587,"title":596,"text":597,"captions":598,"items":132,"localized_images":599},74,"How the broadcasters do it","At first I knew nothing about how a live TV stream works. To find out I did a bit of reverse engineering: I opened the broadcasters' websites with the browser's developer tools and followed, one by one, the requests of their players.\n\nI found out that the video address isn't in the page. The player first asks a broadcaster's service where the live stream is, and gets a temporary address, with a token that expires shortly, pointing to the CDN that serves the video. The video itself isn't a single file but an **.m3u8** playlist of small segments a few seconds long, which the player downloads one after the other (HLS).\n\nOnce I understood the mechanism, I replicated it. In the list every channel points to TvIt; when a player opens it, TvIt makes the same request the broadcaster's player would make and redirects it to the address it just got. The video comes **straight from the broadcaster's CDN**, without going through my server.\n\nThere's one more advantage: since the list points to TvIt and not to the broadcasters, when a broadcaster changes something it's enough to fix TvIt, and the list saved in the players keeps working.","The path of a channel, from the player to the broadcaster's CDN",[600],{"directus_files_id":601,"sort":4},"62c8fccc-f9c1-48af-89b7-d5bd016fb800",{"id":603,"block_gallery_id":448,"languages_code":32,"label":587,"title":604,"text":605,"captions":606,"items":132,"localized_images":607},75,"Cum fac televiziunile","La început nu știam nimic despre cum funcționează streamingul unei transmisii TV în direct. Ca să înțeleg, am făcut puțin reverse engineering: am deschis site-urile televiziunilor cu instrumentele pentru dezvoltatori ale browserului și am urmărit, una câte una, cererile playerelor lor.\n\nAm descoperit că adresa video-ului nu se află în pagină. Playerul întreabă mai întâi un serviciu al televiziunii unde se află transmisia și primește o adresă temporară, cu un token care expiră repede, către CDN-ul care distribuie video-ul. Video-ul în sine nu este un singur fișier, ci un playlist **.m3u8** de segmente mici, de câteva secunde, pe care playerul le descarcă unul după altul (HLS).\n\nDupă ce am înțeles mecanismul, l-am replicat. În listă fiecare canal trimite la TvIt; când un player îl deschide, TvIt face aceeași cerere pe care ar face-o playerul televiziunii și îl redirecționează la adresa tocmai obținută. Video-ul vine **direct din CDN-ul televiziunii**, fără să treacă prin serverul meu.\n\nMai e un avantaj: pentru că lista trimite la TvIt și nu la televiziuni, când o televiziune schimbă ceva e suficient să corectez TvIt, iar lista salvată în playere continuă să funcționeze.","Drumul unui canal, de la player la CDN-ul televiziunii",[608],{"directus_files_id":609,"sort":4},"8aee03e4-a50d-4892-924a-1d85df7fb3e0",[],{"id":546,"collection":582,"sort":105,"item":612},{"id":461,"engines":57,"translations":613,"images":638},[614,622,630],{"id":615,"block_gallery_id":461,"languages_code":20,"label":616,"title":617,"text":618,"captions":619,"items":620,"localized_images":621},76,"le sfide","Dalla lista al sito","L'idea iniziale era solo la lista. Poi ho voluto un sito per guardare i canali dal browser, con la guida TV accanto, ed è lì che sono arrivati i problemi veri.\n\nLi ho risolti uno alla volta, con passione e pazienza, e mi sono divertito a farlo.","La pagina dei canali\nIl player nel browser","**CORS.** Alcuni servizi delle emittenti non permettono al browser di leggere le loro risposte da un altro sito. TvIt fa la richiesta al posto del browser e gli passa solo l'indirizzo finale della CDN, che il browser può aprire.\n**Il server è fuori dall'Italia.** Alcune emittenti bloccano le richieste dall'estero, e il mio server non è in Italia. Per questo TvIt quasi sempre non scarica il video ma rimanda il player all'emittente, che lo serve a chi guarda; i canali disponibili solo in Italia sono segnati sul sito con una bandierina.\n**Indirizzi che scadono.** Per alcuni canali l'indirizzo dura pochi minuti: TvIt lo chiede di nuovo a ogni avvio, invece di scriverlo una volta per tutte.\n**Emittenti che cambiano.** CDN, indirizzi e pagine cambiano senza preavviso. Ogni volta si torna agli strumenti per sviluppatori, si ritrova la richiesta giusta e si aggiorna TvIt.",[],{"id":623,"block_gallery_id":461,"languages_code":26,"label":624,"title":625,"text":626,"captions":627,"items":628,"localized_images":629},77,"the challenges","From the list to the website","The original idea was just the list. Then I wanted a website to watch the channels in the browser, with the TV guide next to them, and that's where the real problems came in.\n\nI solved them one at a time, with passion and patience, and enjoyed doing it.","The channels page\nThe player in the browser","**CORS.** Some broadcaster services don't let the browser read their responses from another site. TvIt makes the request in the browser's place and passes on only the final CDN address, which the browser can open.\n**The server is outside Italy.** Some broadcasters block requests from abroad, and my server isn't in Italy. That's why TvIt almost never downloads the video but sends the player back to the broadcaster, which serves it to the viewer; channels available only in Italy are marked on the site with a small flag.\n**Addresses that expire.** For some channels the address lasts a few minutes: TvIt asks for it again at every start, instead of writing it down once and for all.\n**Broadcasters that change.** CDNs, addresses and pages change without notice. Each time it's back to the developer tools, finding the right request again and updating TvIt.",[],{"id":631,"block_gallery_id":461,"languages_code":32,"label":632,"title":633,"text":634,"captions":635,"items":636,"localized_images":637},78,"provocările","De la listă la site","Ideea inițială era doar lista. Apoi am vrut un site ca să urmăresc canalele din browser, cu ghidul TV alături, și abia atunci au apărut problemele adevărate.\n\nLe-am rezolvat pe rând, cu pasiune și răbdare, și m-am distrat făcând asta.","Pagina canalelor\nPlayerul în browser","**CORS.** Unele servicii ale televiziunilor nu permit browserului să le citească răspunsurile de pe alt site. TvIt face cererea în locul browserului și îi transmite doar adresa finală din CDN, pe care browserul o poate deschide.\n**Serverul este în afara Italiei.** Unele televiziuni blochează cererile din străinătate, iar serverul meu nu este în Italia. De aceea TvIt aproape niciodată nu descarcă video-ul, ci trimite playerul înapoi la televiziune, care îl servește celui care se uită; canalele disponibile doar în Italia sunt marcate pe site cu un steguleț.\n**Adrese care expiră.** Pentru unele canale adresa durează câteva minute: TvIt o cere din nou la fiecare pornire, în loc s-o scrie o dată pentru totdeauna.\n**Televiziuni care se schimbă.** CDN-uri, adrese și pagini se schimbă fără avertisment. De fiecare dată te întorci la instrumentele pentru dezvoltatori, găsești din nou cererea potrivită și actualizezi TvIt.",[],[639,641],{"directus_files_id":640,"sort":4},"055ad006-87e9-4621-b3f2-e65e3e5440c6",{"directus_files_id":642,"sort":25},"8d8920ba-ea8a-48ce-b78c-b424646820fa",{"id":551,"collection":582,"sort":135,"item":644},{"id":474,"engines":57,"translations":645,"images":667},[646,653,660],{"id":647,"block_gallery_id":474,"languages_code":20,"label":648,"title":649,"text":650,"captions":651,"items":132,"localized_images":652},79,"guida TV","La guida, scritta a mano","La guida dei programmi (EPG) non arriva da un'API: si legge dalle pagine dei palinsesti, canale per canale, ogni notte alle 3. Lo scraper l'ho scritto a mano, senza AI, studiando il codice delle pagine e decidendo cosa prendere: orari, titolo, categoria, descrizione e immagine.\n\nLe pagine dei palinsesti cambiano struttura ogni tanto. Per questo, se lo scraper non trova più nessun programma, si ferma e lo segnala, invece di lasciare la guida vuota senza che nessuno se ne accorga.","La guida TV sul sito\nLa lista M3U pronta per i player",[],{"id":654,"block_gallery_id":474,"languages_code":26,"label":655,"title":656,"text":657,"captions":658,"items":132,"localized_images":659},80,"TV guide","The guide, written by hand","The programme guide (EPG) doesn't come from an API: it's read from the schedule pages, channel by channel, every night at 3. I wrote the scraper by hand, without AI, studying the code of the pages and deciding what to take: times, title, category, description and image.\n\nThe schedule pages change their structure every now and then. That's why, if the scraper no longer finds any programme, it stops and reports it, instead of leaving the guide empty without anyone noticing.","The TV guide on the website\nThe M3U list, ready for the players",[],{"id":661,"block_gallery_id":474,"languages_code":32,"label":662,"title":663,"text":664,"captions":665,"items":132,"localized_images":666},81,"ghid TV","Ghidul, scris de mână","Ghidul programelor (EPG) nu vine dintr-un API: se citește din paginile cu grila de programe, canal cu canal, în fiecare noapte la ora 3. Scraperul l-am scris de mână, fără AI, studiind codul paginilor și decizând ce să iau: ore, titlu, categorie, descriere și imagine.\n\nPaginile cu grila de programe își schimbă structura din când în când. De aceea, dacă scraperul nu mai găsește niciun program, se oprește și semnalează asta, în loc să lase ghidul gol fără ca nimeni să observe.","Ghidul TV pe site\nLista M3U gata pentru playere",[],[668,670],{"directus_files_id":669,"sort":4},"53b405ef-0a51-4153-bc12-736aa6d996bc",{"directus_files_id":671,"sort":25},"b9cb1e5d-d74c-4839-9cca-d2c05a233712",{"id":556,"collection":673,"sort":139,"item":674},"block_list",{"id":563,"engines":57,"translations":675},[676,680,684],{"id":566,"block_list_id":563,"languages_code":20,"label":677,"title":678,"items":679},"risultati","Usata anche da altri","**65 stelle e 4 fork su GitHub**: il mio repository più seguito, segno che la lista la usano in molti.\n**Più stabile di altre liste**: quando un canale smette di andare, lo si corregge in un punto solo, e tutti i player tornano a vederlo.\n**Il player web**, comodo quando si è in viaggio e non si ha il proprio player a portata di mano.\n**Lista e guida si aggiornano da sole**, senza interventi a mano.",{"id":571,"block_list_id":563,"languages_code":26,"label":681,"title":682,"items":683},"results","Used by others too","**65 stars and 4 forks on GitHub**: my most followed repository, a sign that many people use the list.\n**More stable than other lists**: when a channel stops working, it's fixed in one place, and every player can watch it again.\n**The web player**, handy when travelling without your own player at hand.\n**The list and the guide update themselves**, with no manual work.",{"id":576,"block_list_id":563,"languages_code":32,"label":685,"title":686,"items":687},"rezultate","Folosită și de alții","**65 de stele și 4 fork-uri pe GitHub**: repository-ul meu cel mai urmărit, semn că lista o folosesc mulți.\n**Mai stabilă decât alte liste**: când un canal nu mai merge, se corectează într-un singur loc, iar toate playerele îl pot urmări din nou.\n**Playerul web**, comod când ești pe drum și nu ai playerul tău la îndemână.\n**Lista și ghidul se actualizează singure**, fără intervenții manuale.",{"id":566,"collection":161,"sort":185,"item":689},{"id":690,"engines":57,"widgets":132,"translations":691},43,[692,697,702],{"id":693,"block_text_id":690,"languages_code":20,"label":694,"title":695,"text":696,"steps":132},127,"bilancio","Cosa mi ha lasciato","TvIt è un side project, e lo è sempre stato. Eppure mi ha dato grandi soddisfazioni: il risultato più grande non sono le stelle, ma essermi divertito a costruirlo, aver scoperto come funziona davvero lo streaming e aver superato, uno dopo l'altro, ostacoli che all'inizio non sapevo nemmeno di avere davanti.",{"id":698,"block_text_id":690,"languages_code":26,"label":699,"title":700,"text":701,"steps":132},128,"looking back","What it left me","TvIt is a side project, and it always has been. Yet it has given me great satisfaction: the biggest result isn't the stars, but having fun building it, discovering how streaming really works and getting past, one after the other, obstacles I didn't even know were ahead of me at the start.",{"id":703,"block_text_id":690,"languages_code":32,"label":704,"title":705,"text":706,"steps":132},129,"bilanț","Ce mi-a lăsat","TvIt este un side project și a fost mereu. Și totuși mi-a adus mari satisfacții: cel mai mare rezultat nu sunt stelele, ci faptul că m-am distrat construindu-l, am descoperit cum funcționează cu adevărat streamingul și am trecut, unul după altul, peste obstacole despre care la început nici nu știam că le am în față.",{"id":571,"collection":215,"sort":202,"item":708},{"id":422,"engines":217,"variant":709,"translations":710},"split",[711,715,719],{"id":712,"block_cta_id":422,"languages_code":20,"label":713,"title":714,"title_accent":132,"text":132},67,"\u002F\u002F prossimo passo","Hai un progetto simile in mente?",{"id":716,"block_cta_id":422,"languages_code":26,"label":717,"title":718,"title_accent":132,"text":132},68,"\u002F\u002F next step","Got a similar project in mind?",{"id":720,"block_cta_id":422,"languages_code":32,"label":721,"title":722,"title_accent":132,"text":132},69,"\u002F\u002F pasul următor","Ai un proiect asemănător în minte?",1792388667701]