// content.jsx — bilingual copy + shared building blocks for all three directions. // Centralised so we only translate once and so palette/font swaps via Tweaks // can target a single source. const COPY = { it: { nav: ['Lavoro', 'Filosofia', 'Servizi', 'FAQ', 'Contatti'], role: 'Fractional CTO', location: 'Remote · ovunque', heroEyebrow: 'Fractional CTO', heroHello: 'Ciao, sono', heroHelloName: 'Bartolomeo Tiralongo', heroLine1: 'Costruisco i prodotti tech', heroLine2: 'da zero a fatturato.', heroLine3: 'di un CTO', heroLine4: 'senza il costo', heroLine5: 'di assumerne uno.', heroSub: 'Strategia di prodotto, architettura che regge, primi hire. La guida tecnica di un CTO senza il costo di assumerne uno.', heroSubShort: 'Strategia di prodotto, architettura che regge, primi hire.', cta: 'Scrivimi cosa stai costruendo', ctaSub: 'ti rispondo il più presto possibile', numbers: [ { v: '150k', l: 'download app', sub: 'rating 4.5★ · BRUM Patenti' }, { v: '50k', l: 'utenti attivi/mese', sub: 'BRUM, oggi' }, { v: '2', l: 'mesi concept → MVP', sub: 'in store' }, { v: '~10', l: 'anni in tech', sub: 'Ferrari → oggi' }, ], philosophyKicker: '01 — Filosofia', philosophyTitle: 'Vengo da un mondo dove se il sistema sbaglia, si ferma qualcosa di vero. Non da slide.', philosophyP1: 'Ho iniziato in Ferrari sui controlli powertrain, ISO 26262, sicurezza funzionale. Poi RINA, Industria 4.0. Poi prodotto, scale-up, team da zero. Adesso costruisco prodotti dove il bug non spegne un motore ma fa perdere un cliente — e per me è la stessa cosa.', philosophyP2: 'Non vendo ore di codice. Vendo decisioni che non pagherai per cinque anni: lo stack giusto, l\'architettura che regge la prossima ondata, l\'assunzione che non rimpiangi, il "no" detto al momento giusto.', processKicker: '02 — Come funziona', processIntro: 'Part-time. A milestones. Sempre dentro il team.', phasesTitle: 'Dal capire al', phasesTitleAccent: 'consegnare', phasesSub: 'Niente template. Adatto la cadenza al punto in cui sei: che serva un parere a freddo, una guida operativa o un partner per scalare.', phases: [ { when: 'Week 1', t: 'Capire', d: 'Due call, niente slide. Leggo prodotto, team e vincoli reali. Ti restituisco una mappa onesta dei rischi tecnici.', bullets: [ 'Diagnosi tecnica e organizzativa', 'Punti caldi e fast win', 'Report scritto, non slide', ], }, { when: 'Week 2–3', t: 'Decidere', d: 'Mettiamo per iscritto stack, roadmap e i sì/no dei prossimi 90 giorni. Ogni decisione ha un perché e un costo dichiarato.', bullets: [ 'Roadmap a 90 giorni', 'Stack scelto con un motivo', 'Decisioni con costo dichiarato', ], }, { when: 'Month 1–3', t: 'Costruire', d: 'Sono dentro il team 1.5 giorni a settimana. Sblocco, faccio code review, parlo con i fornitori, assumo chi serve.', bullets: [ 'Architettura messa a terra', 'Ritmo di delivery costante', 'Hire critici fatti bene', ], }, { when: 'Month 3+', t: 'Lasciare', d: 'Quando il team cammina da solo, esco. Resta una fondazione che non si rompe al prossimo bivio.', bullets: [ 'Team autonomo', 'Documentazione viva', 'Continuità senza dipendenza', ], }, ], howKicker: 'Come funziona un Fractional CTO', howIntro: 'Una giornata e mezza a settimana, dentro il team, con obiettivi misurabili ogni 30 giorni.', howBullets: [ { k: '1.5 g / settimana', d: 'Lunedì allineamento, mercoledì esecuzione. Sono nei vostri canali Slack/Linear ogni giorno, non solo nelle ore fatturate.' }, { k: 'Milestone 30 / 60 / 90', d: 'Ogni 30 giorni una milestone scritta: cosa esce, cosa si misura, cosa cambia. Niente fatturazione a vuoto.' }, { k: 'Contratto a 3 mesi', d: 'Rinnovo mensile dopo il primo trimestre. Se non servo più, esco — è il successo, non il fallimento.' }, { k: 'Costo dichiarato', d: 'Tariffa fissa mensile. Niente sorprese, niente ore di codice da rendicontare.' }, ], steps: [ { n: '01', t: 'Ascolto', d: 'Due call. Capisco il prodotto, il team, i numeri, le bugie che ti racconti. Restituisco una mappa onesta del rischio tecnico.' }, { n: '02', t: 'Decido con te', d: 'Roadmap a 90 giorni, stack, primi hire, integrazioni critiche. Documenti scritti, non slide. Ogni decisione ha un perché e un costo dichiarato.' }, { n: '03', t: 'Eseguo accanto', d: 'Una giornata e mezza a settimana dentro il team. Sblocco, faccio code review, parlo con i fornitori, assumo chi serve. Quando non servo più, esco.' }, ], servicesKicker: '03 — Servizi', servicesIntro: 'Tre pilastri. Cinque modi di lavorare insieme.', servicePillars: [ { label: 'Decisioni', gloss: 'Cosa fare, in che ordine, perché — e cosa non fare.', services: [ { t: 'Fractional CTO', p: 'da definire', d: 'Guida tecnica continuativa per startup pre-seed e seed. 1.5 giorni a settimana, dentro il team, milestone scritte ogni 30 giorni.' }, { t: 'Tech Advisory', p: 'da definire', d: 'Sparring partner per founder. Call quindicinali, review architetturale, presenza nei momenti che contano.' }, ], }, { label: 'Architettura', gloss: 'Sistemi che reggono la prossima ondata. E quelli vecchi che vanno raddrizzati.', services: [ { t: 'Technical Audit', p: 'da definire', d: 'Due settimane dentro al codice e al team. Output: report scritto, roadmap di risanamento, ranking dei rischi tecnici.' }, { t: 'Automazione & AI nei processi', p: 'da definire', d: 'Workflow operativi tagliati e ricuciti con LLM, integrazioni, pipeline. Il lavoro noioso fatto fare alle macchine — in modo affidabile.' }, ], }, { label: 'Esecuzione', gloss: 'Dal piano al ship. Le persone giuste, al ritmo giusto.', services: [ { t: 'Product Management', p: 'da definire', d: 'Roadmap di prodotto, prioritizzazione, discovery con utenti, definizione di cosa esce e cosa no. Il prodotto in mano a chi lo costruisce.' }, { t: 'Project Management', p: 'da definire', d: 'Delivery sotto controllo: milestone, ritmo settimanale, gestione rischi e dipendenze. Il piano che resta vivo, non quello che ammuffisce in Notion.' }, ], }, ], services: [ { t: 'Fractional CTO', p: 'da definire', d: 'Guida tecnica continuativa per startup pre-seed e seed. 1–2 giorni a settimana, dentro il team.' }, { t: 'Tech Advisory', p: 'da definire', d: 'Sparring partner per founder. Call quindicinali, review architetturale, presenza nei momenti che contano.' }, { t: 'Technical Audit', p: 'da definire', d: 'Due settimane dentro al codice e al team. Output: report scritto, roadmap di risanamento, ranking dei rischi.' }, { t: 'Hiring Tech', p: 'da definire', d: 'Disegno del primo team tech. Job description, screening, interview loop, offerta. Ti tengo lontano dagli errori da € 100k.' }, ], pathKicker: 'Dove ho costruito', pathLogos: [ { name: 'GaiaGo', sub: '’19 — ’21' }, { name: 'Fiscozen', sub: '’21 — ’22' }, { name: 'GoVolt', sub: '’22 — ’24' }, { name: 'BRUM', sub: '’25 — oggi' }, { name: 'Plug and Play', sub: 'mentor' }, ], contactDrawerTitle: 'Da dove vuoi partire?', contactDrawerBody: 'Scegli un canale, ti rispondo entro 48 ore.', contactMailLabel: 'Scrivimi una mail', contactMailSub: 'bart@bartofactory.com · risposta in 48h', contactCalLabel: 'Prenota una call', contactCalSub: '30 min · niente pitch · Calendly', contactClose: 'chiudi', workKicker: '04 — Lavoro', workIntro: 'Cose costruite, non slide presentate. Specialità: zero → fatturato.', cases: [ { client: 'Tana della Tartaruga', role: 'Fractional CTO · 2024 — oggi', title: 'CRM custom · bot Telegram · email marketing automatizzato.', body: 'Disegno e build di un CRM su misura, integrato con bot Telegram e pipeline email automatizzata. Da Excel a dati strutturati, segmentazione automatica dei clienti.', stat1: '1', stat1l: 'CRM custom', stat2: 'Telegram', stat2l: 'bot integrato', stat3: 'auto', stat3l: 'email segmentate', }, { client: 'BRUM Patenti', role: 'CTO · 2025 — oggi', title: 'Dal concept al primo MVP in store in 2 mesi. Oggi 150k download a 4.5★, 50k attivi/mese.', body: 'Roadmap di prodotto, app live in 2 mesi, iterazione continua ascoltando utenti reali. Piattaforma web+mobile (quiz, teoria, upload documenti, pagamenti, referral), integrazione col Portale dell\'Automobilista.', stat1: '150k', stat1l: 'download', stat2: '4.5★', stat2l: 'rating store', stat3: '2 mesi', stat3l: 'concept → MVP', }, { client: 'eWibe', role: 'Fractional CTO · 2024 — oggi', title: 'Refactoring strutturale e stabilizzazione di una piattaforma già live.', body: 'Allineamento tra aspettative di prodotto, founder e debito tecnico. Performance, manutenibilità, stabilità. La parte difficile: dire di no quando serve.', stat1: '⤴', stat1l: 'stabilità', stat2: '−40%', stat2l: 'tempo deploy', stat3: '✓', stat3l: 'roadmap allineata', }, { client: 'GoVolt Mobility', role: 'Eng Manager · 2022 — 2024', title: 'Team di ingegneria remoto costruito da zero (6+), infrastruttura cloud GCP, microservizi scalabili per la logistica. Da strategia a esecuzione.', body: 'Architettura a microservizi per pianificazione, swap batterie, manutenzione e analytics. 6+ ingegneri assunti e gestiti in remoto. Pipeline ETL e dashboard operative.', stat1: '6+', stat1l: 'ingegneri assunti', stat2: 'GCP', stat2l: 'microservizi', stat3: '0→1', stat3l: 'team da zero', }, ], testimonialsKicker: '05 — Cosa dicono', testimonials: [ { quote: '[Frase concreta sul risultato sbloccato — da raccogliere dal founder eWibe]', author: 'Founder', role: 'CEO', company: 'eWibe', placeholder: true, }, { quote: '[Frase concreta su team building e infrastruttura — da raccogliere dal CEO GoVolt]', author: 'CEO', role: 'Founder', company: 'GoVolt Mobility', placeholder: true, }, { quote: '[Frase concreta sul CRM e impatto operativo — da raccogliere da Federico]', author: 'Federico Ronzoni', role: 'Founder', company: 'Tana della Tartaruga', placeholder: true, }, ], faqKicker: '07 — FAQ', faqIntro: 'Le domande che mi fanno tutti.', faqs: [ { q: 'Come funziona concretamente?', a: 'Una giornata e mezza a settimana dentro il team, con milestone scritte ogni 30 giorni. Contratto iniziale di 3 mesi, rinnovo mensile dopo il primo trimestre. Tariffa fissa mensile, niente ore di codice da rendicontare. Sono nei vostri canali Slack/Linear ogni giorno, non solo nelle ore fatturate.', }, { q: 'Cosa vuol dire Fractional CTO?', a: 'Un CTO part-time, dentro il team con un mandato chiaro a milestone. Paghi per decisioni e direzione — architettura, hire, roadmap — non per ore di codice.', }, { q: 'Con quante startup lavori in parallelo?', a: 'Poche, per scelta. La qualità del mio lavoro dipende dal non spalmarmi. Preferisco dire di no che fare il consulente a metà.', }, { q: 'Scrivi anche codice?', a: 'Sì, quando serve sbloccare o per fare scelte architetturali con le mani sporche. Non è il mestiere quotidiano: il valore sta a monte (decisioni, hire, architettura).', }, { q: 'Ti interfacci anche con investitori e due diligence?', a: 'Sì. Tech DD, call con VC, pitch tecnici. Una parte importante del lavoro è raccontare bene la tech a chi non la fa.', }, { q: 'Quanto dura un ingaggio tipico?', a: 'Contratto iniziale di 3 mesi, poi rinnovo mensile. Engagement medio: 4–8 mesi. Quando non servo più, esco — è il successo, non il fallimento.', }, ], footerAvailability: 'Lavoro con poche startup alla volta. Se c\'è spazio te lo dico subito.', timelineKicker: 'Da dove vengo', timeline: [ { y: '2013', t: 'Ferrari', d: 'Controllo powertrain · ISO 26262' }, { y: '2017', t: 'RINA', d: 'Architettura innovazione · Industria 4.0' }, { y: '2019', t: 'GaiaGo', d: 'Tech Lead · team 10' }, { y: '2021', t: 'Fiscozen', d: 'Product Manager · fintech regolata' }, { y: '2022', t: 'GoVolt', d: 'Acting CTO · team da zero' }, { y: '2024', t: 'bartofactory', d: 'Fractional CTO · independent' }, { y: '2025', t: 'BRUM', d: 'CTO · 200k utenti' }, ], stackKicker: '05 — Stack', stackIntro: 'Pragmatico. Scelgo cose noiose che funzionano. Niente hype.', stackGroups: [ { g: 'Backend', items: ['Node', 'Python', 'Go', 'Postgres', 'Redis'] }, { g: 'Frontend', items: ['React', 'Next.js', 'React Native', 'TypeScript'] }, { g: 'Cloud', items: ['GCP', 'AWS', 'Cloudflare', 'Vercel'] }, { g: 'Data', items: ['BigQuery', 'dbt', 'Airflow', 'Metabase'] }, { g: 'Pratica', items: ['Linear', 'Notion', 'GitHub', 'Sentry'] }, ], ctaKicker: '08 — Sentiamoci', ctaTitle: 'Scrivimi cosa stai costruendo.', ctaBody: 'Una mail, una nota vocale, un link al prodotto. In 48 ore ti rispondo onestamente: è una cosa in cui posso essere utile, oppure no.', ctaButton: 'Scrivimi una mail', ctaAlt: 'oppure prenota una call su', footerLine: 'bartofactory · P.IVA IT12345670123 · ', madeIn: 'fatto a mano · Italia', }, en: { nav: ['Work', 'Philosophy', 'Services', 'FAQ', 'Contact'], role: 'Fractional CTO', location: 'Remote · anywhere', heroEyebrow: 'Fractional CTO', heroHello: 'Hi, I’m', heroHelloName: 'Bartolomeo Tiralongo', heroLine1: 'I build tech products', heroLine2: 'from zero to revenue.', heroLine3: 'of a CTO', heroLine4: 'without the cost', heroLine5: 'of hiring one.', heroSub: 'Product strategy, architecture that holds, first hires. The technical lead of a CTO without the cost of hiring one.', heroSubShort: 'Product strategy, architecture that holds, first hires.', cta: 'Tell me what you\'re building', ctaSub: 'I’ll get back to you as soon as possible', numbers: [ { v: '150k', l: 'app downloads', sub: 'rating 4.5★ · BRUM Patenti' }, { v: '50k', l: 'active users/month', sub: 'BRUM, today' }, { v: '2', l: 'months concept → MVP', sub: 'in store' }, { v: '~10', l: 'years in tech', sub: 'Ferrari → today' }, ], philosophyKicker: '01 — Philosophy', philosophyTitle: 'I come from a world where if the system fails, something real stops. Not from slides.', philosophyP1: 'I started at Ferrari, on powertrain controls, ISO 26262, functional safety. Then RINA, Industry 4.0. Then product, scale-ups, teams from scratch. Now I build products where the bug doesn\'t kill an engine but loses a customer — and to me, it\'s the same thing.', philosophyP2: 'I don\'t sell hours of code. I sell decisions you won\'t pay for in five years: the right stack, an architecture that survives the next wave, a hire you won\'t regret, the "no" said at the right moment.', processKicker: '02 — How it works', processIntro: 'Part-time. Milestone-driven. Always inside the team.', phasesTitle: 'From understanding to', phasesTitleAccent: 'shipping', phasesSub: 'No templates. The pace adapts to where you are — whether you need a cold-eye reading, a hands-on lead, or a partner to scale.', phases: [ { when: 'Week 1', t: 'Understand', d: 'Two calls, no slides. I read the product, the team, the real constraints. You get back an honest map of technical risk.', bullets: [ 'Technical & organizational diagnosis', 'Hot spots and fast wins', 'Written report, not slides', ], }, { when: 'Week 2–3', t: 'Decide', d: 'We commit to stack, roadmap and the 90-day yes/no in writing. Every decision has a reason and a stated cost.', bullets: [ '90-day roadmap', 'Stack chosen with a reason', 'Decisions with a stated cost', ], }, { when: 'Month 1–3', t: 'Build', d: 'Inside the team, 1.5 days a week. I unblock, review code, talk to vendors, hire who\'s needed.', bullets: [ 'Architecture put down', 'Steady delivery cadence', 'Critical hires done well', ], }, { when: 'Month 3+', t: 'Leave', d: 'When the team walks on its own, I leave. What stays is a foundation that doesn\'t crack at the next fork.', bullets: [ 'Autonomous team', 'Living documentation', 'Continuity without dependency', ], }, ], howKicker: 'How a Fractional CTO actually works', howIntro: 'A day and a half a week, inside the team, with measurable milestones every 30 days.', howBullets: [ { k: '1.5 days / week', d: 'Monday alignment, Wednesday execution. I\'m in your Slack/Linear every day, not just billable hours.' }, { k: 'Milestones 30 / 60 / 90', d: 'Every 30 days a written milestone: what ships, what we measure, what changes. No empty invoices.' }, { k: '3-month contract', d: 'Monthly renewal after the first quarter. If I\'m no longer needed, I leave — that\'s the success, not the failure.' }, { k: 'Flat fee', d: 'Fixed monthly rate. No surprises, no hours to account for.' }, ], steps: [ { n: '01', t: 'Listen', d: 'Two calls. I understand the product, the team, the numbers, the lies you tell yourself. I give you back an honest map of technical risk.' }, { n: '02', t: 'Decide with you', d: '90-day roadmap, stack, first hires, critical integrations. Written documents, not slides. Every decision has a why and a stated cost.' }, { n: '03', t: 'Execute alongside', d: 'A day and a half a week inside the team. I unblock, review code, talk to vendors, hire who\'s needed. When I\'m no longer needed, I leave.' }, ], servicesKicker: '03 — Services', servicesIntro: 'Three pillars. Five ways to work together.', servicePillars: [ { label: 'Decisions', gloss: 'What to do, in what order, why — and what not to do.', services: [ { t: 'Fractional CTO', p: 'to define', d: 'Continuous technical lead for pre-seed and seed startups. 1.5 days a week, inside the team, written milestones every 30 days.' }, { t: 'Tech Advisory', p: 'to define', d: 'Sparring partner for founders. Bi-weekly calls, architecture review, presence in moments that matter.' }, ], }, { label: 'Architecture', gloss: 'Systems that survive the next wave. And old ones that need straightening.', services: [ { t: 'Technical Audit', p: 'to define', d: 'Two weeks inside the code and the team. Output: written report, remediation roadmap, ranked risks.' }, { t: 'Automation & AI in operations', p: 'to define', d: 'Operational workflows cut and re-stitched with LLMs, integrations, pipelines. The boring work done by machines — reliably.' }, ], }, { label: 'Execution', gloss: 'From the plan to the ship. The right people, at the right pace.', services: [ { t: 'Product Management', p: 'to define', d: 'Product roadmap, prioritization, user discovery, deciding what ships and what doesn\'t. Product in the hands of the people who build it.' }, { t: 'Project Management', p: 'to define', d: 'Delivery under control: milestones, weekly cadence, risk and dependency management. The plan that stays alive — not the one that rots in Notion.' }, ], }, ], services: [ { t: 'Fractional CTO', p: 'to define', d: 'Continuous technical lead for pre-seed and seed startups. 1–2 days a week, inside the team.' }, { t: 'Tech Advisory', p: 'to define', d: 'Sparring partner for founders. Bi-weekly calls, architecture review, presence in moments that matter.' }, { t: 'Technical Audit', p: 'to define', d: 'Two weeks inside the code and the team. Output: written report, remediation roadmap, ranked risks.' }, { t: 'Tech Hiring', p: 'to define', d: 'Design of your first tech team. Job description, screening, interview loop, offer. I keep you away from €100k mistakes.' }, ], pathKicker: 'Where I built', pathLogos: [ { name: 'GaiaGo', sub: '’19 — ’21' }, { name: 'Fiscozen', sub: '’21 — ’22' }, { name: 'GoVolt', sub: '’22 — ’24' }, { name: 'BRUM', sub: '’25 — today' }, { name: 'Plug and Play', sub: 'mentor' }, ], contactDrawerTitle: 'Where do we start?', contactDrawerBody: 'Pick a channel, I reply within 48 hours.', contactMailLabel: 'Send me an email', contactMailSub: 'bart@bartofactory.com · reply in 48h', contactCalLabel: 'Book a call', contactCalSub: '30 min · no pitch · Calendly', contactClose: 'close', workKicker: '04 — Work', workIntro: 'Things built, not slides presented. Specialty: zero → revenue.', cases: [ { client: 'Tana della Tartaruga', role: 'Fractional CTO · 2024 — present', title: 'Custom CRM · Telegram bot · automated email marketing.', body: 'Design and build of a custom CRM, integrated with a Telegram bot and an automated email pipeline. From Excel to structured data with automatic customer segmentation.', stat1: '1', stat1l: 'custom CRM', stat2: 'Telegram', stat2l: 'bot integrated', stat3: 'auto', stat3l: 'segmented emails', }, { client: 'BRUM Patenti', role: 'CTO · 2025 — present', title: 'From concept to first MVP in store in 2 months. Today 150k downloads at 4.5★, 50k active/month.', body: 'Product roadmap, app live in 2 months, continuous iteration listening to real users. Web+mobile platform (quizzes, theory, document upload, payments, referral), integration with the Italian public driving portal.', stat1: '150k', stat1l: 'downloads', stat2: '4.5★', stat2l: 'store rating', stat3: '2 mo', stat3l: 'concept → MVP', }, { client: 'eWibe', role: 'Fractional CTO · 2024 — present', title: 'Structural refactoring and stabilization of a live platform.', body: 'Alignment between product expectations, founders and technical debt. Performance, maintainability, stability. The hard part: saying no when needed.', stat1: '⤴', stat1l: 'stability', stat2: '−40%', stat2l: 'deploy time', stat3: '✓', stat3l: 'roadmap aligned', }, { client: 'GoVolt Mobility', role: 'Eng Manager · 2022 — 2024', title: 'Remote engineering team built from zero (6+), GCP cloud infrastructure, scalable microservices for logistics. From strategy to execution.', body: 'Microservice architecture for routing, battery swap, maintenance and analytics. 6+ engineers hired and managed remote. ETL pipelines and operational dashboards.', stat1: '6+', stat1l: 'engineers hired', stat2: 'GCP', stat2l: 'microservices', stat3: '0→1', stat3l: 'team from zero', }, ], testimonialsKicker: '05 — What they say', testimonials: [ { quote: '[Concrete sentence on what got unblocked — to collect from eWibe founder]', author: 'Founder', role: 'CEO', company: 'eWibe', placeholder: true, }, { quote: '[Concrete sentence on team building and infrastructure — to collect from GoVolt CEO]', author: 'CEO', role: 'Founder', company: 'GoVolt Mobility', placeholder: true, }, { quote: '[Concrete sentence on CRM and operational impact — to collect from Federico]', author: 'Federico Ronzoni', role: 'Founder', company: 'Tana della Tartaruga', placeholder: true, }, ], faqKicker: '07 — FAQ', faqIntro: 'The questions I always get.', faqs: [ { q: 'How does it work concretely?', a: 'A day and a half a week inside the team, with written milestones every 30 days. Initial 3-month contract, monthly renewal after the first quarter. Flat monthly rate, no hours of code to account for. I\'m in your Slack/Linear every day, not just billable hours.', }, { q: 'What does Fractional CTO actually mean?', a: 'A part-time CTO, inside the team with a clear milestone-driven mandate. You pay for decisions and direction — architecture, hires, roadmap — not for hours of code.', }, { q: 'How many startups do you work with at once?', a: 'Few, by choice. The quality of my work depends on not spreading thin. I\'d rather say no than be a half-consultant.', }, { q: 'Do you also write code?', a: 'Yes, when needed to unblock or to make architecture choices with my hands dirty. It\'s not the day job: the value is upstream (decisions, hires, architecture).', }, { q: 'Do you also handle investors and due diligence?', a: 'Yes. Tech DD, calls with VCs, technical pitches. A big part of the job is telling tech well to people who don\'t build it.', }, { q: 'How long does a typical engagement last?', a: 'Initial 3-month contract, then monthly renewal. Average engagement: 4–8 months. When I\'m no longer needed, I leave — that\'s the success, not the failure.', }, ], footerAvailability: 'I work with a few startups at a time. If there\'s room, I\'ll tell you right away.', timelineKicker: 'Where I come from', timeline: [ { y: '2013', t: 'Ferrari', d: 'Powertrain control · ISO 26262' }, { y: '2017', t: 'RINA', d: 'Innovation architecture · Industry 4.0' }, { y: '2019', t: 'GaiaGo', d: 'Tech Lead · team of 10' }, { y: '2021', t: 'Fiscozen', d: 'Product Manager · regulated fintech' }, { y: '2022', t: 'GoVolt', d: 'Acting CTO · team from zero' }, { y: '2024', t: 'bartofactory', d: 'Fractional CTO · independent' }, { y: '2025', t: 'BRUM', d: 'CTO · 200k users' }, ], stackKicker: '05 — Stack', stackIntro: 'Pragmatic. I pick boring things that work. No hype.', stackGroups: [ { g: 'Backend', items: ['Node', 'Python', 'Go', 'Postgres', 'Redis'] }, { g: 'Frontend', items: ['React', 'Next.js', 'React Native', 'TypeScript'] }, { g: 'Cloud', items: ['GCP', 'AWS', 'Cloudflare', 'Vercel'] }, { g: 'Data', items: ['BigQuery', 'dbt', 'Airflow', 'Metabase'] }, { g: 'Practice', items: ['Linear', 'Notion', 'GitHub', 'Sentry'] }, ], ctaKicker: '08 — Let\'s talk', ctaTitle: 'Tell me what you\'re building.', ctaBody: 'An email, a voice note, a link to the product. In 48 hours I\'ll reply honestly: it\'s something I can help with, or not.', ctaButton: 'Send me an email', ctaAlt: 'or book a call on', footerLine: 'bartofactory · VAT IT12345670123 · ', madeIn: 'handmade · Italy', }, }; // ───────────────────────────────────────────────────────────── // Custom cursor — scoped to an artboard. Tracks pointer relative to // the artboard root; shows a dot + ring that grows over hoverable // elements (.hoverable). No-op when pointer is outside the artboard. // ───────────────────────────────────────────────────────────── function useArtboardCursor(rootRef, { color = '#111', mixBlend = 'normal' } = {}) { const dotRef = React.useRef(null); const ringRef = React.useRef(null); const [hovering, setHovering] = React.useState(false); const [enlarged, setEnlarged] = React.useState(false); const [label, setLabel] = React.useState(''); React.useEffect(() => { const root = rootRef.current; if (!root) return undefined; let raf = 0; let tx = 0, ty = 0; let dx = 0, dy = 0; const onMove = (e) => { const r = root.getBoundingClientRect(); // ratio handles the canvas zoom level const ratio = r.width / root.offsetWidth || 1; tx = (e.clientX - r.left) / ratio; ty = (e.clientY - r.top) / ratio; const hit = e.target.closest('.hoverable'); setEnlarged(!!hit); setLabel(hit ? (hit.dataset.cursorLabel || '') : ''); if (!raf) raf = requestAnimationFrame(tick); }; const tick = () => { raf = 0; dx += (tx - dx) * 0.35; dy += (ty - dy) * 0.35; if (dotRef.current) dotRef.current.style.transform = `translate(${tx}px, ${ty}px)`; if (ringRef.current) ringRef.current.style.transform = `translate(${dx}px, ${dy}px)`; if (Math.abs(tx - dx) > 0.3 || Math.abs(ty - dy) > 0.3) raf = requestAnimationFrame(tick); }; const onEnter = () => setHovering(true); const onLeave = () => { setHovering(false); setEnlarged(false); }; root.addEventListener('pointermove', onMove); root.addEventListener('pointerenter', onEnter); root.addEventListener('pointerleave', onLeave); return () => { cancelAnimationFrame(raf); root.removeEventListener('pointermove', onMove); root.removeEventListener('pointerenter', onEnter); root.removeEventListener('pointerleave', onLeave); }; }, []); const Cursor = () => (
); return Cursor; } // ───────────────────────────────────────────────────────────── // Lang switch — segmented control IT/EN // ───────────────────────────────────────────────────────────── function LangSwitch({ lang, setLang, color = '#111', activeBg, activeColor = '#fff' }) { return (
{['it', 'en'].map((k) => ( ))}
); } // Marquee — infinite horizontal scroller function Marquee({ children, speed = 30, color = '#000', bg = 'transparent' }) { return (
{Array.from({ length: 8 }).map((_, i) => ( {children} ))}
); } Object.assign(window, { COPY, useArtboardCursor, LangSwitch, Marquee });