diff --git a/README.md b/README.md index 6c2d88b..f78fa41 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ Sitio de Dylan Mazzei, Founder & Operator. HTML estático generado con un script ``` src/layout.mjs Layout compartido:
, nav, footer, iconos y helpers src/pages/*.mjs Una página por archivo (texto literal del documento de contenido) +src/service.mjs Bloques compartidos de las páginas de servicios de Consulting static/ Se copia tal cual a dist/ (CSS, JS, imágenes, favicon) build.mjs Genera dist/ + sitemap.xml + robots.txt + 404.html ``` @@ -19,6 +20,11 @@ build.mjs Genera dist/ + sitemap.xml + robots.txt + 404.html | `/consulting/` | `src/pages/consulting.mjs` | | `/consulting/marketing/` | `src/pages/marketing.mjs` | | `/consulting/business-setup/` | `src/pages/business-setup.mjs` | +| `/consulting/business-optimization/` | `src/pages/business-optimization.mjs` | +| `/consulting/supply-chain/` | `src/pages/supply-chain.mjs` | +| `/consulting/cybersecurity/` | `src/pages/cybersecurity.mjs` | +| `/consulting/education/` | `src/pages/education.mjs` | +| `/consulting/fractional/` | `src/pages/fractional.mjs` | | `/contact/` | `src/pages/contact.mjs` | | `/press/` | `src/pages/press.mjs` | @@ -36,6 +42,6 @@ Importa el repo en Vercel. `vercel.json` ya define el build (`npm run build`), l ## Pendientes de contenido - **Press:** confirmar el titular exacto del artículo de Gulf Magazine y su URL (`FEATURE` en `src/pages/press.mjs`). -- **Páginas fuera del alcance actual:** Playbook, Poetry, Fractional Roles, Business Optimization, Supply Chain, Cybersecurity y Education no forman parte del sitio. Sus secciones se muestran sin botón; si se crean esas páginas, se añade el botón con su texto original del documento. +- **Páginas fuera del alcance actual:** Playbook y Poetry no forman parte del sitio. Sus secciones se muestran sin botón; si se crean esas páginas, se añade el botón con su texto original del documento. - **Calendario:** poner el link real de agenda en `SITE.calendar`. - **Formulario de contacto:** hoy abre el cliente de correo con el mensaje prellenado. Para recibirlo directo hay que conectar un servicio (Formspree, Resend, etc.). diff --git a/build.mjs b/build.mjs index f62d166..815054a 100644 --- a/build.mjs +++ b/build.mjs @@ -7,7 +7,7 @@ import { page, eyebrow, btn } from './src/layout.mjs'; const root = dirname(fileURLToPath(import.meta.url)); const out = join(root, 'dist'); -const pages = ['home', 'about', 'portfolio', 'consulting', 'marketing', 'business-setup', 'contact', 'press']; +const pages = ['home', 'about', 'portfolio', 'consulting', 'marketing', 'business-setup', 'business-optimization', 'supply-chain', 'cybersecurity', 'education', 'fractional', 'contact', 'press']; await rm(out, { recursive: true, force: true }); await mkdir(out, { recursive: true }); diff --git a/src/layout.mjs b/src/layout.mjs index f28c72e..172b849 100644 --- a/src/layout.mjs +++ b/src/layout.mjs @@ -95,6 +95,11 @@ const NAV = [ { label: 'Consulting', desc: 'Find the Real Problem. Then Fix the Right One.', href: '/consulting/', icon: 'compass' }, { label: 'Marketing & AI Search', desc: 'Get Found Where Attention Is Moving.', href: '/consulting/marketing/', icon: 'search' }, { label: 'Business Setup', desc: 'Start With Fewer Expensive Mistakes.', href: '/consulting/business-setup/', icon: 'building' }, + { label: 'Business Optimization', desc: 'Find What Growth Made Messy.', href: '/consulting/business-optimization/', icon: 'gauge' }, + { label: 'Supply Chain', desc: 'Know What Happens Before It Reaches the Customer.', href: '/consulting/supply-chain/', icon: 'truck' }, + { label: 'Cybersecurity', desc: 'Find the Exposure Before Someone Else Does.', href: '/consulting/cybersecurity/', icon: 'shield' }, + { label: 'Education', desc: 'Make the Strategy Survive the Classroom.', href: '/consulting/education/', icon: 'edu' }, + { label: 'Fractional Leadership', desc: 'When the Business Needs an Owner, Not Another Recommendation.', href: '/consulting/fractional/', icon: 'users' }, ], }, { label: 'Press', href: '/press/' }, @@ -160,6 +165,11 @@ function footer() {$ find the friction→ time→ margin→ visibility→ unnecessary founder attention$ prioritise the fixes✓ what deserves attention first✓ what can wait$ make it lighter`; + +export default { + path: '/consulting/business-optimization/', + title: 'Business Optimisation Consulting | Dylan Mazzei', + description: 'Business optimisation consulting for founders focused on margins, processes, team structure, AI automation, reporting, and operational efficiency.', + schema: [faqSchema(faqs)], + body: + heroBlock({ + id: 'bo-hero', + crumb: 'Business Optimization', + kicker: 'BUSINESS OPTIMIZATION CONSULTING', + h1: 'Better Operations Create Better Businesses.', + lead: 'Revenue can grow while margins tighten, processes multiply, teams get harder to manage, and the founder somehow ends up with more on their plate.', + paras: [ + '*That doesn’t always mean the business needs more sales.', + 'Sometimes it needs a closer look at where the money, time, people, and decisions are going.', + 'My teams and I find the friction, determine what is actually creating it, and make the business easier to operate as it grows.', + ], + visual, + }).replace('
The details change.
I can step into the business as a fractional CMO, COO, CISO, or Chief AI Officer, bringing the same operator mindset that shapes my current ventures into a defined leadership role.
Strategy gets more useful when someone owns what happens next.
+Can a teacher use it without creating more work?
Can students understand it?
Can the institution support it?
Does it fit into the day instead of fighting against it?
Consulting can tell you what should happen next.
+Fractional leadership goes further. I become part of the company's operating rhythm and take responsibility for moving that part of the business forward.
+That can mean leading the existing team, setting priorities, managing vendors, establishing KPIs, improving systems, and making sure strategy turns into actual work.
+The role is fractional.
+Every engagement puts me directly in the executive role.
+Behind me are specialist teams across the businesses I operate, giving the engagement access to execution capabilities beyond one person’s calendar.
+${s.backed}
+ ${s.cta ? btn(s.cta[0], s.cta[1], 'ghost') : ''} +Engagements begin with a minimum three-month commitment and include a 30-day notice period.
Fractional seats are intentionally limited to three concurrent engagements across all roles.

I care about the number that matters after all of that.
${t.slice(1)}
` : `${t}
`); +const prose = (arr, inkCls) => `${lead}
+ ${prose(paras)} +${t.slice(1)}
` : `${t}
`)).join('')}${t.replace(/^\*/, '')}
`).join('')}