// sections.jsx — Sinatra Labs site sections const { useEffect: _useEffect, useRef: _useRef, useState: _useState } = React; /* ---------- Process ---------- */ const PROCESS_STAGES = [ { n: "01", name: "Discovery", weeks: "Scope", blurb: "We sit with the team that owns the problem. Read the playbook. Watch the failure modes. Leave with a one-page brief and a number we'll be measured against.", items: [ "Problem framing", "Success metric & eval set", "Data & systems audit", "Risk register", "Build vs. buy call", ], }, { n: "02", name: "Design", weeks: "System design", blurb: "We design the system before we write it. Surfaces, agent boundaries, evals, fallbacks. The document that comes out becomes the plan we work from — and the one we'll keep refining as the work gets sharper.", items: [ "Surface & agent map", "Eval harness", "Tool & API contracts", "Latency & cost budget", "Rollback plan", ], }, { n: "03", name: "Build", weeks: "Implementation", blurb: "Senior engineers, in your repo, on your standup. Pairs of two. Daily PRs. Evals run on every commit. Nothing is delivered as a slide; everything is delivered as a merge.", items: [ "Agent loop & tools", "Eval-driven development", "Observability & traces", "Guardrails & policies", "Code review with your team", ], }, { n: "04", name: "Activate", weeks: "Activation", blurb: "We don't celebrate the demo. We focus on adoption. Canaries first, then a percentage, then everyone. Your on-call rotation, your dashboards, your runbook — handed off, not hovered over.", items: [ "Gradual rollout", "Production runbook", "On-call handoff", "Eval thresholds in CI", "Live tuning", ], }, { n: "05", name: "Compound", weeks: "Optimization", blurb: "Most of the value shows up in live use, not the first reveal. We stay on a retainer or step back entirely — your call. Either way, the system is yours, the code is yours, the evals are yours.", items: [ "Regular model upgrades", "Eval drift monitoring", "Second-system planning", "Team enablement", "Optional retainer", ], }, ]; function Process() { const containerRef = _useRef(null); const graphRef = _useRef(null); const pathRef = _useRef(null); const dotRef = _useRef(null); const [progress, setProgress] = _useState(0); const [pathLength, setPathLength] = _useState(0); const [curvePoint, setCurvePoint] = _useState({ x: 0, y: 160 }); _useEffect(() => { const onScroll = () => { const vh = window.innerHeight; const graphEl = graphRef.current; if (graphEl) { const graphRect = graphEl.getBoundingClientRect(); if (graphRect.height > 24) { const start = vh * 0.9; const end = vh * 0.18; const p = Math.max(0, Math.min(1, (start - graphRect.top) / (start - end))); setProgress(p); return; } } const el = containerRef.current; if (!el) return; const r = el.getBoundingClientRect(); const total = r.height + vh * 0.35; const seen = vh * 0.9 - r.top; const p = Math.max(0, Math.min(1, seen / total)); setProgress(p); }; onScroll(); window.addEventListener("scroll", onScroll, { passive: true }); window.addEventListener("resize", onScroll); return () => { window.removeEventListener("scroll", onScroll); window.removeEventListener("resize", onScroll); }; }, []); _useEffect(() => { const path = pathRef.current; if (!path || !path.getTotalLength) return; const measure = () => setPathLength(path.getTotalLength()); measure(); window.addEventListener("resize", measure); return () => { window.removeEventListener("resize", measure); }; }, []); _useEffect(() => { const path = pathRef.current; if (!path || !path.getTotalLength || !pathLength) return; const pt = path.getPointAtLength(pathLength * progress); setCurvePoint({ x: pt.x, y: pt.y }); }, [progress, pathLength]); const path = "M 0 160 " + "C 60 158, 90 152, 120 140 " + "S 240 110, 300 105 " + "S 440 95, 500 88 " + "S 640 78, 700 70 " + "S 840 50, 900 36 " + "S 980 20, 1000 14"; return (

Five stages. One growth curve.

); } /* ---------- Team ---------- */ function Team() { const onTeamPage = typeof isTeamPagePath === "function" && isTeamPagePath(); const HeadingTag = onTeamPage ? "h1" : "h2"; if (onTeamPage) { return (
Team

Sinatra Labs is founder-led. Every engagement is run by Nick directly, the same person who will scope the work, design the system, and work with your solution. Nick brings a manufacturing mindset, systems engineering background, and Anthropic certifications to secure, enterprise-ready AI delivery.

Schedule a Working Session
); } return (
Team
{/* Column A — Portrait */}
PORTRAIT
{/* Column B — Identity, pull quote, credentials */}
{member.name}
{member.role}
{[ { n: "SD", label: "San Diego, CA" }, ].map((s) => (
{s.n} {s.label}
))}
{/* Column C — Bio */}

From production floors to production systems.

A background in enterprise technology, Systems Engineering, Operations and Delivery. I understand the systems that run businesses not just the models that can transform them.

No subcontractors. No junior handoffs. No decks.

); } function TeamPageCTA() { return (
Schedule a Working Session
); } /* ---------- Contact ---------- */ function Contact() { const [form, setForm] = _useState({ name: "", email: "", company: "", message: "" }); const [sent, setSent] = _useState(false); const set = (k) => (e) => setForm((f) => ({ ...f, [k]: e.target.value })); const handleSubmit = (e) => { e.preventDefault(); if (!form.name || !form.email) return; setSent(true); const bookingUrl = new URL("https://calendly.com/nick-sinatralabs/30min"); bookingUrl.searchParams.set("name", form.name); bookingUrl.searchParams.set("email", form.email); const notes = [form.company && `Company: ${form.company}`, form.message].filter(Boolean).join("\n\n"); if (notes) bookingUrl.searchParams.set("a1", notes); if (window.openBooking) { window.openBooking({ url: bookingUrl.toString() }); } else { window.open(bookingUrl.toString(), "_blank", "noopener"); } }; return (

{"Let's Build Something."}

We keep our client list intentionally small. If you have a workflow you're certain AI could run but no team to bring it to life, tell us about it below. Twenty minutes. You'll talk to a founder.

Nick@sinatralabs.com
{sent ? (

Got it, {form.name.split(" ")[0]}. Pick a time that works for you.

) : (