/* eslint-disable */
/* YOUNYC portfolio v2 — Data + smaller components.
   Loaded BEFORE app.jsx so its exports are available globally. */

const VENTURES = [
  {
    id: 'contractorhub',
    n: '01',
    name: 'ContractorHubNYC',
    vertical: 'PropTech · Live SaaS',
    pitch: 'NYC permit data, refined into a personalized opportunity feed. Contractors stop scrolling DOB portals and start winning bids.',
    status: 'live',
    statusText: 'Live · paying users',
    weeks: 14,
    stack: ['React', 'Node.js', 'PostgreSQL', 'Drizzle', 'NYC DOB API'],
    screenshot: '../../assets/screenshots/contractorhub.png',
    deep: true,
    url: 'https://contractorhubnyc.com',
    thinking: {
      signal: "Contractors I met in NYC were spending their evenings scrolling a 30-year-old DOB portal looking for filings that mentioned their borough, their work type, their licence class. Most of them missed the projects they actually qualified for — the data was technically public, practically unusable.",
      bet: "The real product wasn't 'a search engine for permits'. It was 'a feed that quietly notices what's relevant to me and tells me when it changes.' Make the data feel like Twitter, not Excel. The first contractor who said 'this is my morning coffee app' would tell me I'd shipped the right thing.",
      constraint: "DOB data isn't a clean API — it's a patchwork. I had to build the daily sync, the dedupe, the canonical-address matching, and the scoring layer before the user ever saw a row. The hard part was making 14 messy NYC datasets feel like one product surface.",
      cut: "I cut the visualization layer entirely for V1. No maps, no charts, no 'analytics dashboard'. Contractors want a list of jobs and an alert when something changes. That's it. The map can come back when someone pays me to put it back.",
      proof: "Live at contractorhubnyc.com with paying contractors across all five boroughs. Daily DOB sync, sub-5-minute alert latency, ~10 hours/week of manual research replaced.",
    },
    receipts: [
      { n: '10+ hrs', l: 'Reclaimed weekly per contractor' },
      { n: '<5 min', l: 'Permit-status alert latency' },
      { n: '5 of 5', l: 'NYC boroughs covered' },
    ],
  },
  {
    id: 'proofclock',
    n: '02',
    name: 'ProofClock',
    vertical: 'HR Tech · Passwordless',
    pitch: 'Kill the password and the punch card. Staff clock in with a face or fingerprint and a single QR scan.',
    status: 'live',
    statusText: 'Live · in pilot at UmmahAcademy',
    weeks: 8,
    stack: ['Flask', 'PostgreSQL', 'WebAuthn', 'Passkeys'],
    screenshot: '../../assets/proofclock/passkey.png',
    deep: true,
    url: 'https://proofclock.com',
    thinking: {
      signal: "Every small organization I talked to was running attendance on shared logins, paper sheets, or a 'staff-app' that broke whenever someone swapped devices. The pain wasn't novel — but every existing tool either cost enterprise money or stored unhashed passwords like it was 2008.",
      bet: "FIDO2 passkeys had finally crossed the line where every modern phone supports them natively. So I bet that if I could get the kiosk → phone → server handshake to feel like nothing — single scan, biometric on-device — small orgs would never go back. Passwordless wasn't a feature, it was the entire pitch.",
      constraint: "Multi-tenant from day one was non-negotiable, but the cryptography under WebAuthn meant I had to think about device binding and recovery flows that most SaaS skips entirely. If a staff member loses a phone, the system has to be more graceful than 'contact admin'.",
      cut: "I cut geofencing, photo-verification, and 'time-clock with break tracking'. Every kitchen-sink HR tool builds those. I wanted ProofClock to do one thing — verify that this specific human is here, right now, securely — and refused to dilute it.",
      proof: "Live at proofclock.com with the first deployment running UmmahAcademy's daily attendance. Multi-tenant. Super-Admin portal. Sub-second clock-in.",
    },
    receipts: [
      { n: '0', l: 'Passwords to manage' },
      { n: '<1s', l: 'Clock-in to verified' },
      { n: '100%', l: 'Payroll calc accuracy' },
    ],
  },
  {
    id: 'datapulse',
    n: '03',
    name: 'DataPulse',
    vertical: 'Civic Tech · Open Data',
    pitch: 'Ask any open public dataset a question in plain English. Inspect the answer. Save the question as an alert that re-runs every time the source data refreshes.',
    status: 'shipped',
    statusText: 'Shipped · Telegram mini-app · datapulse.fyi',
    weeks: 8,
    stack: ['Telegram Mini-App', 'LLM', 'SoQL', 'NYC OpenData'],
    screenshot: null,
    deep: true,
    url: 'https://datapulse.fyi',
    thinking: {
      signal: "NYC publishes thousands of open datasets — 311 complaints, motor-vehicle collisions, DOB permits, restaurant inspections, parking tickets. Almost nobody outside a handful of journalists and analysts ever queries them. The data is open; the access is not. 'How many noise complaints in my district last week?' should be a sentence, not a SoQL query.",
      bet: "If a non-technical person could ask a public dataset a question in plain English, see exactly how it was answered, and save the question to re-run forever, open data would finally do what it was supposed to do. The bot wasn't the product — trust in the answer was. Confidence label, generated SoQL, assumptions, freshness, and source rows had to be first-class from day one.",
      constraint: "Hallucinated numbers are worse than no numbers. I constrained the model to a small set of curated NYC OpenData sources, forced it to return the exact SoQL query it ran, and made every answer show its assumptions ('Last 7 days = on or after 2026-05-11') and confidence. Slower to ship, but the only way the answer is ever inspectable.",
      cut: "I cut the 'bulk data export' surface and the 'build your own dashboard' surface. DataPulse is for questions, summaries, comparisons, trends, and alerts — not CSVs. And it lives inside Telegram, not in a new tab. Save the question, not another dashboard.",
      proof: "Live as a Telegram mini-app at datapulse.fyi, on five NYC OpenData sources (311, Collisions, DOB permits, DOHMH inspections, Parking Violations). Plain-English question → confidence-labeled answer → underlying SoQL → assumptions → save as daily/weekly/monthly alert with quiet hours and change-only sends.",
    },
    receipts: [
      { n: '5', l: 'NYC OpenData sources live' },
      { n: '100%', l: 'Answers show SoQL + assumptions' },
      { n: 'Telegram', l: 'Lives where the thread already is' },
    ],
  },
  {
    id: 'livepulse',
    n: '04',
    name: 'LivePulse',
    vertical: 'Real-Time Web · Events',
    pitch: 'A live Q&A and feedback platform for events and workshops. Participants submit on mobile, the moderator approves, audience upvotes — all in real time.',
    status: 'live',
    statusText: 'Live · used in workshops',
    weeks: 4,
    stack: ['React', 'Express', 'WebSockets', 'Drizzle', 'Neon Postgres'],
    screenshot: null,
    deep: true,
    url: null,
    thinking: {
      signal: "Every conference, workshop, or 'town hall' I attended had a moderation problem: how do you let 200 people submit a question without the screen filling with junk or repeats? The expensive answer was Slido or Mentimeter. The cheap answer was 'just use the chat' — which always failed.",
      bet: "The three roles in this product — presenter, moderator, participant — each need a completely different UI living on a completely different device. The trick is to ship them as three views of the same WebSocket-backed session, sharing nothing but state. If I get the moderator's queue right, the rest is decoration.",
      constraint: "Latency. If the presenter sees an approved question more than half a second after the moderator clicked approve, the moderator stops trusting the system. WebSocket plumbing has to be production-grade from day one.",
      cut: "I cut accounts, signups, persistent rooms. Every session is throwaway. Moderator clears the room when the session ends. Less code, more confidence — nothing to GDPR, nothing to monetize, nothing to onboard.",
      proof: "Live, used in real workshop sessions. Three URLs (`/`, `/admin`, `/mobile`) backed by one shared WebSocket — and that's the whole product.",
    },
    receipts: [
      { n: '3 URLs', l: 'One product, three roles' },
      { n: 'Instant', l: 'Real-time via WebSockets' },
      { n: '0', l: 'Accounts required' },
    ],
  },
];

// Quick-scan ventures — shown in the Wall but not in the Thinking deep-dive
const QUICK_VENTURES = [
  {
    id: 'tipadvisor', n: '05', name: 'Your Tip Advisor', vertical: 'Consumer · PWA',
    status: 'shipped', statusText: 'Shipped',
    pitch: 'Gemini-powered chat that tells you exactly what to tip, in local currency, anywhere in the world.',
    stack: 'React · Gemini · PWA',
  },
  {
    id: 'ummah', n: '06', name: 'UmmahAcademy', vertical: 'Education · Site',
    status: 'live', statusText: 'Live',
    pitch: 'The official site for the academy that also pilots ProofClock — flagship implementation.',
    stack: 'HTML · CMS',
  },
  {
    id: 'asreng', n: '07', name: 'ASR Engineering', vertical: 'Services · Site',
    status: 'live', statusText: 'Live',
    pitch: 'Marketing site for an NYC engineering firm — the design vocabulary the verticals system was built from.',
    stack: 'Static · Tailwind',
  },
];

const RECEIPTS = [
  { num: '7', label: 'Live products', meta: 'Across PropTech, hospitality, civic tech, and education' },
  { num: '<6', sup: 'wk', label: 'Median V1', meta: 'From first conversation to live URL' },
  { num: '1', label: 'Founder · 0 PMs', meta: 'You talk to the person writing the code' },
  { num: 'NYC', label: 'Built where I live', meta: 'Local problems, local products, local users' },
];

const STEPS = [
  { n: '01', t: 'Strategy session', s: 'Free 30 min. You walk through the problem. I walk through what I\'d build and why. You leave with a roadmap — whether we work together or not.', time: 'Same week' },
  { n: '02', t: 'AI-assisted design', s: 'Wireframes and prototypes generated, reviewed, and iterated in days, not weeks. You see the product before you commit to a sprint.', time: 'Week 1' },
  { n: '03', t: 'Build sprint', s: 'Direct line to the person writing the code. Daily progress, weekly demos. No coordination tax, no waterfall ceremony.', time: 'Weeks 2–5' },
  { n: '04', t: 'Launch & iterate', s: 'Deploy, monitor, learn from real users. The build doesn\'t end at the demo — it ends when you don\'t need me anymore.', time: 'Week 6+' },
];

const TAPE = [
  'Ship the cut, not the wishlist',
  'Talk to the person writing the code',
  'Demos beat decks',
  'AI in the build, not on the screen',
  'Public data, private workflows',
  'NYC-rooted, open to anywhere',
  'Roadmap before the quote',
  'Org charts are tax',
];

window.YNData = { VENTURES, QUICK_VENTURES, RECEIPTS, STEPS, TAPE };
