{
  "_comment": "Generated by job-radar/tools/build-portfolio-content.mjs - do not edit. Figures are facts-ledger values under their ids; Meta Ads figures only in `verifying`.",
  "person": {
    "name": "Andrew Rocha",
    "role": "Marketing Operations & AI Automation Specialist",
    "location": "Fort Worth, Texas",
    "languages": "English and Spanish (professional working proficiency)",
    "email": "rocha@yahwaylove.com",
    "website": "https://resume.andrew-rocha.here.now",
    "linkedin": "https://www.linkedin.com/in/andrew-rocha-805531134/",
    "summary": "Marketing operations and AI automation specialist. Builds the systems behind lead generation and client websites — Meta Ads campaign structure and reporting, attribution and link tracking, landing pages and brand sites — and automates the repetitive half with Python, Claude Code and AI-assisted workflows, keeping a human approval gate on anything that publishes. Data operations is the foundation: every number is cleaned, reconciled against its source and verified before anyone acts on it. Owner-operator of YAHWAYLOVE LLC, taking contract work and open to remote W-2 roles in marketing operations, automation and data operations, including records, compliance, and claims and admissions processing. Works independently and async. Professional working proficiency in Spanish, including bilingual documentation."
  },
  "primaryAction": {
    "label": "Email Andrew",
    "href": "mailto:rocha@yahwaylove.com"
  },
  "hooks": [
    {
      "text": "2,495 commits across eight systems, every figure sourced",
      "facts": [
        "traffic.commits",
        "client.commits",
        "journal.commits",
        "docpipe.commits",
        "jobsearch.commits",
        "vault.commits",
        "opsboard.commits",
        "widgets.commits"
      ]
    },
    {
      "text": "A 949-test document generator and a 451-test daily job-data pipeline",
      "facts": [
        "docpipe.tests",
        "jobsearch.tests"
      ]
    },
    {
      "text": "56 projects on one status board, rebuilt from source every morning",
      "facts": [
        "opsboard.projects"
      ]
    }
  ],
  "projects": [
    {
      "slug": "traffic-attribution-system",
      "title": "Traffic & Attribution System",
      "stage": "G",
      "context": "Client engagement · YAHWAYLOVE LLC",
      "role": "Growth Operations & Automation",
      "outcome": "The tracking rig is the invoice",
      "description": "External traffic partner for an AI SaaS product with no access to the client’s analytics, ad accounts or billing, so attribution was built in-house. The rig: tagged outbound links, a weekly sweep, QA and metrics loop that ranks what worked, a frame check that rejects dead footage before it reaches a posting slate, and an approval gate that creates every post as a draft and reads it back from the server before anything is scheduled. 285 commits.",
      "stack": [
        "Python",
        "PowerShell",
        "Attribution",
        "Approval gate"
      ],
      "figures": [
        {
          "id": "traffic.commits",
          "value": 285,
          "unit": "commits",
          "measured_at": "2026-09-28"
        }
      ],
      "dates": {
        "first": "2026-08-26",
        "last": "2026-10-02"
      }
    },
    {
      "slug": "client-partnership",
      "title": "Client Ministry-Tech Partnership",
      "stage": "S",
      "context": "Client engagement · YAHWAYLOVE LLC",
      "role": "Data Operations & Automation",
      "outcome": "Their files stay in sync without anyone remembering to sync them",
      "description": "Ongoing client work for a ministry: an AI proxy holding every API key server-side, a Dropbox-to-library autosync watcher on a scheduled task, research and hub packs, and a site remodel. A CRM data-quality audit across 2,029 contacts took customer records out of version control and added a check so they cannot return. Ships behind a definition-of-done gate that has to pass before anything is called finished. 625 commits, 1,034 tracked files.",
      "stack": [
        "Node",
        "Vercel",
        "Scheduled tasks",
        "Dropbox API",
        "Verification gate"
      ],
      "figures": [
        {
          "id": "client.commits",
          "value": 625,
          "unit": "commits",
          "measured_at": "2026-09-28"
        },
        {
          "id": "client.files",
          "value": 1034,
          "unit": "tracked files",
          "measured_at": "2026-09-28"
        },
        {
          "id": "client.contacts",
          "value": 2029,
          "unit": "contacts",
          "measured_at": "2026-09-17"
        },
        {
          "id": "client.students",
          "value": 231,
          "unit": "students",
          "measured_at": "2026-10-01"
        },
        {
          "id": "client.course_price",
          "value": 69,
          "unit": "usd",
          "measured_at": "2026-10-01"
        },
        {
          "id": "client.thinkific_yearly",
          "value": 1200,
          "unit": "usd per year",
          "measured_at": "2026-10-01"
        },
        {
          "id": "client.mailchimp_yearly",
          "value": 732,
          "unit": "usd per year",
          "measured_at": "2026-10-01"
        }
      ],
      "dates": {
        "first": "2026-07-10",
        "last": "2026-10-02"
      }
    },
    {
      "slug": "offline-journal-app",
      "title": "Offline-First Pregnancy Journal App",
      "stage": "B",
      "context": "Own product",
      "role": "Product / Web App",
      "outcome": "Private by design: no login, data stays on the device",
      "description": "A faith-based pregnancy journal and family keepsake app I own and ship: offline-first, no login, every entry stored on the device in IndexedDB, live on Cloudflare Pages. Includes an OWASP ASVS 5 security review with a tracked remediation plan. 460 commits.",
      "stack": [
        "Hono",
        "JavaScript",
        "IndexedDB",
        "Cloudflare Pages"
      ],
      "figures": [
        {
          "id": "journal.commits",
          "value": 460,
          "unit": "commits",
          "measured_at": "2026-09-28"
        }
      ],
      "dates": {
        "first": "2026-03-08",
        "last": "2026-09-24"
      }
    },
    {
      "slug": "document-generation-pipeline",
      "title": "Document Generation Pipeline",
      "stage": "D",
      "context": "Solo build",
      "role": "Pipeline / Document Generation",
      "outcome": "Structured inputs in, a finished 16-page document out",
      "description": "A document pipeline that takes structured inputs — a person's details, written testimony, source references and authorised context from an existing database and document corpus — and assembles an illustrated 16-page PDF from them. A versioned data schema sits under change control, with purge-and-rollback tests for sensitive records. 290 commits and 949 passing tests, because a generator that silently drops an input is worse than no generator.",
      "stack": [
        "Node",
        "TypeScript",
        "React",
        "SQLite",
        "949 tests"
      ],
      "figures": [
        {
          "id": "docpipe.commits",
          "value": 290,
          "unit": "commits",
          "measured_at": "2026-09-28"
        },
        {
          "id": "docpipe.tests",
          "value": 949,
          "unit": "tests",
          "measured_at": "2026-09-26"
        }
      ],
      "dates": {
        "first": "2026-07-13",
        "last": "2026-10-02"
      }
    },
    {
      "slug": "job-search-data-pipeline",
      "title": "Automated Job-Search Data Pipeline",
      "stage": "F",
      "context": "Solo build",
      "role": "Data Operations",
      "outcome": "A bad run refuses to publish itself",
      "description": "A daily job pipeline: 16 source families scanned into SQLite, run through a hard requirements gate, scored, and rendered into a self-contained dashboard. 315 commits behind three gates — a 451-test pytest suite, an offline pipeline smoke run, and a real-browser harness across three viewports that exits non-zero on accessibility violations, console errors, layout overflow, or a dead interaction.",
      "stack": [
        "Python",
        "SQLite",
        "pytest",
        "Cloudflare Workers",
        "Playwright"
      ],
      "figures": [
        {
          "id": "jobsearch.commits",
          "value": 315,
          "unit": "commits",
          "measured_at": "2026-09-28"
        },
        {
          "id": "jobsearch.tests",
          "value": 451,
          "unit": "tests",
          "measured_at": "2026-09-28"
        },
        {
          "id": "jobsearch.sources",
          "value": 16,
          "unit": "source families",
          "measured_at": "2026-09-26"
        }
      ],
      "dates": {
        "first": "2026-06-13",
        "last": "2026-10-02"
      }
    },
    {
      "slug": "school-data-vault",
      "title": "School-Data Vault Platform",
      "stage": "R",
      "context": "Solo build",
      "role": "Data Operations",
      "outcome": "A year of records that outlives the system holding them",
      "description": "A complete private archive of a year of coursework, built so the data survives losing access to the system it came from: 30 courses and 268 lesson pages, with grades, files, video transcripts and email pulled out of a hosted LMS, normalised, and stored somewhere retrievable. A watcher checks 13 source syllabus documents every 30 minutes and flags any change for review instead of applying it. 407 commits, 759 tracked files. This is records management as a migration problem — get it all, keep it faithful to the source, and make it findable afterwards.",
      "stack": [
        "Python",
        "TypeScript",
        "Structured extraction",
        "Archival integrity"
      ],
      "figures": [
        {
          "id": "vault.commits",
          "value": 407,
          "unit": "commits",
          "measured_at": "2026-09-28"
        },
        {
          "id": "vault.files",
          "value": 759,
          "unit": "tracked files",
          "measured_at": "2026-09-28"
        },
        {
          "id": "vault.courses",
          "value": 30,
          "unit": "courses",
          "measured_at": "2026-09-26"
        },
        {
          "id": "vault.lessons",
          "value": 268,
          "unit": "lesson pages",
          "measured_at": "2026-09-26"
        },
        {
          "id": "vault.watched",
          "value": 13,
          "unit": "source documents",
          "measured_at": "2026-09-26"
        }
      ],
      "dates": {
        "first": "2026-06-13",
        "last": "2026-09-26"
      }
    },
    {
      "slug": "operations-status-board",
      "title": "Operations Status Board",
      "stage": "O",
      "context": "Solo build",
      "role": "Reporting / Automation",
      "outcome": "A report with no state of its own cannot drift",
      "description": "A status board covering 56 projects and the client engagements at once, rebuilt from source every morning by a scheduled task: ledgers, git state and workflow registers are read fresh each run and nothing is stored in between, so the board cannot disagree with the work. 62 commits; 125 tests across 4 test files.",
      "stack": [
        "Node",
        "Scheduled tasks",
        "125 tests"
      ],
      "figures": [
        {
          "id": "opsboard.commits",
          "value": 62,
          "unit": "commits",
          "measured_at": "2026-09-28"
        },
        {
          "id": "opsboard.tests",
          "value": 125,
          "unit": "tests",
          "measured_at": "2026-09-28"
        },
        {
          "id": "opsboard.testfiles",
          "value": 4,
          "unit": "test files",
          "measured_at": "2026-09-28"
        },
        {
          "id": "opsboard.projects",
          "value": 56,
          "unit": "projects",
          "measured_at": "2026-09-26"
        }
      ],
      "dates": {
        "first": "2026-08-13",
        "last": "2026-09-30"
      }
    },
    {
      "slug": "widget-embed-platform",
      "title": "Widget & Embed Platform",
      "stage": "W",
      "context": "Solo build",
      "role": "Platform / Front-end",
      "outcome": "A site gains a widget without gaining a subscription",
      "description": "A private widget platform: a password-gated builder plus a public embed runtime, so a marketing site adds a form or gallery without a subscription or a third-party CDN. 51 commits and 44 test files; the embed ships as self-contained output because an embed that phones home is a dependency nobody audited.",
      "stack": [
        "Node",
        "TypeScript",
        "Embed runtime",
        "44 test files"
      ],
      "figures": [
        {
          "id": "widgets.commits",
          "value": 51,
          "unit": "commits",
          "measured_at": "2026-09-28"
        },
        {
          "id": "widgets.testfiles",
          "value": 44,
          "unit": "test files",
          "measured_at": "2026-09-28"
        }
      ],
      "dates": {
        "first": "2026-08-01",
        "last": "2026-08-31"
      }
    },
    {
      "slug": "spreadsheet-cleanup-service",
      "title": "Spreadsheet Cleanup & Validation Service",
      "stage": "C",
      "context": "Solo build",
      "role": "Data Operations",
      "outcome": "The proof ships with the data",
      "description": "A productized spreadsheet-rescue service: messy client data in, cleaned and deduplicated data out, plus a validation report showing exactly what changed and why. The report is the deliverable; the guarantee is proof, not a promise.",
      "stack": [
        "Python",
        "Excel",
        "Google Sheets",
        "validation reporting"
      ],
      "figures": []
    },
    {
      "slug": "browser-qa-gate",
      "title": "Automated Browser QA Gate",
      "stage": "V",
      "context": "Solo build",
      "role": "Verification",
      "outcome": "A green suite stopped being enough",
      "description": "A verification gate that made a green test suite mean something. Drives a real browser at three viewports and fails the build on accessibility violations, console errors, sideways scroll, undersized tap targets, or a page that rendered nothing, the last one because an empty page used to score perfectly.",
      "stack": [
        "Node",
        "Playwright",
        "axe-core"
      ],
      "figures": []
    }
  ],
  "pillars": [
    {
      "n": "01",
      "title": "Clean Inputs",
      "summary": "Nothing downstream is trusted more than the record it came from. Ingestion, deduplication, validation and reconciliation against a source of truth, with every value traceable back to something that can be re-checked.",
      "workflows": [
        "Define the target",
        "Account intelligence crawl",
        "Source-of-truth reconciliation"
      ]
    },
    {
      "n": "02",
      "title": "Repeatable Systems",
      "summary": "Work that runs the same way twice without supervision. Bounded scheduled loops, hard requirement gates, human-in-the-loop review on anything that writes, and an SOP written before the process is handed off.",
      "workflows": [
        "Daily scheduled scan",
        "Drafting with a grounding pass",
        "Human-in-the-loop form fill",
        "SOP documentation"
      ]
    },
    {
      "n": "03",
      "title": "Proof It Works",
      "summary": "A result nobody verified is not a result. Test suites, offline smoke runs, freshness gates, real-browser verification, and a validation report shipped beside the data as the evidence.",
      "workflows": [
        "Validation reporting",
        "Verification harness"
      ]
    }
  ],
  "operatingLayer": {
    "lead": "The through-line under all of it: I design the system and hold the judgment, and the machine does the volume. That is why the same person can run a Meta Ads account, a client website and a data pipeline — in each, the intensive work is automated and my job is the structure, the standards and the gate.",
    "items": [
      {
        "name": "Claude Code + custom skills",
        "note": "My working environment. I author my own skills and workflows there and harden each one against a failing test before it ships, so a process I run once becomes a process anything can run."
      },
      {
        "name": "Multi-model review",
        "note": "Claude, Codex, Gemini and Grok wired to cross-check each other's work, because one model agreeing with itself is not verification."
      },
      {
        "name": "Generative media",
        "note": "Higgsfield and Midjourney for AI video and image production, and text-to-speech where narration is needed — volume without a shoot."
      },
      {
        "name": "Clip pipeline",
        "note": "GPU Whisper transcription and captioning through a tuned OpenShorts build, scheduled out via Postiz, with a person approving every post."
      },
      {
        "name": "Automation plumbing",
        "note": "Python and CLI glue, MCP servers, and a Cloudflare Worker fronting a model API so the AI half runs as infrastructure rather than as a browser tab."
      },
      {
        "name": "Verification",
        "note": "Playwright and axe gates, offline smoke runs and pytest suites. AI writing more of the work is only safe if the checking got stronger at the same time."
      }
    ]
  },
  "sites": [
    {
      "id": "brand",
      "kind": "resume-site",
      "name": "Brand résumé",
      "url": "https://andrew-rocha-resume.pages.dev/",
      "what": "The one to send.",
      "captures": {
        "desktop": "assets/brand-1440.webp",
        "phone": "assets/brand-390.webp"
      }
    },
    {
      "id": "generated",
      "kind": "resume-site",
      "name": "Generated résumé",
      "url": "https://resume.andrew-rocha.here.now/",
      "what": "Machine-readable, with every figure's source.",
      "captures": {
        "desktop": "assets/generated-1440.webp",
        "phone": "assets/generated-390.webp"
      }
    },
    {
      "id": "play",
      "kind": "resume-site",
      "name": "Playground",
      "url": "https://play.andrew-rocha.here.now/",
      "what": "The scrapbook version.",
      "captures": {
        "desktop": "assets/play-1440.webp",
        "phone": "assets/play-390.webp",
        "map": "assets/play-map-1440.webp"
      },
      "pressWhat": "The scrapbook résumé: an interactive journey map, a terminal you can type in and a pop-up storybook."
    },
    {
      "id": "services",
      "kind": "resume-site",
      "name": "Hire Andrew",
      "url": "https://andrew-rocha-ai-services.pages.dev/",
      "what": "Services, a free scope call, and a live cleanup demo.",
      "captures": {
        "desktop": "assets/services-1440.webp",
        "phone": "assets/services-390.webp"
      }
    }
  ],
  "work": [
    {
      "id": "kevin",
      "kind": "case-study",
      "order": 1,
      "name": "Kevin Dedmon Ministries",
      "ledgerProject": "client-partnership",
      "url": "https://kevindedmon.com/",
      "liveSince": "2026-08-12",
      "what": "A ministry's whole platform, rebuilt and run by YAHWAYLOVE LLC: one WordPress and WooCommerce site in place of a Squarespace site, a separate course platform and a separate email service.",
      "before": {
        "label": "Before: the Squarespace site, July 2026",
        "captures": {
          "desktop": "assets/kevin-before-home-1440.webp",
          "phone": "assets/kevin-before-home-390.webp",
          "shop": "assets/kevin-before-shop-1440.webp",
          "tall": "assets/kevin-before-home-tall.webp"
        }
      },
      "after": {
        "label": "After: live since 12 August 2026",
        "captures": {
          "desktop": "assets/kevin-after-home-1440.webp",
          "phone": "assets/kevin-after-home-390.webp",
          "store": "assets/kevin-after-store-1440.webp",
          "ecourse": "assets/kevin-after-ecourse-1440.webp",
          "album": "assets/kevin-after-album-1440.webp"
        }
      },
      "parts": [
        {
          "name": "FireStarters e-course",
          "what": "Moved off its old course platform onto the site: video lessons, fill-in blanks that save, reflections and a journal, open only to students who bought it.",
          "facts": [
            "client.students"
          ]
        },
        {
          "name": "Store",
          "what": "A WooCommerce store with Stripe checkout and digital downloads, including the album Rockin' Jesus Country.",
          "facts": []
        },
        {
          "name": "Email",
          "what": "The paid email service was replaced by a CRM on the site itself, with the subscriber list carried over.",
          "facts": [
            "client.contacts"
          ]
        }
      ],
      "approval": "Draft wording: Kevin approves it before anything goes live.",
      "figures": [
        {
          "id": "client.commits",
          "value": 625,
          "unit": "commits",
          "measured_at": "2026-09-28"
        },
        {
          "id": "client.files",
          "value": 1034,
          "unit": "tracked files",
          "measured_at": "2026-09-28"
        },
        {
          "id": "client.contacts",
          "value": 2029,
          "unit": "contacts",
          "measured_at": "2026-09-17"
        },
        {
          "id": "client.students",
          "value": 231,
          "unit": "students",
          "measured_at": "2026-10-01"
        },
        {
          "id": "client.course_price",
          "value": 69,
          "unit": "usd",
          "measured_at": "2026-10-01"
        },
        {
          "id": "client.thinkific_yearly",
          "value": 1200,
          "unit": "usd per year",
          "measured_at": "2026-10-01"
        },
        {
          "id": "client.mailchimp_yearly",
          "value": 732,
          "unit": "usd per year",
          "measured_at": "2026-10-01"
        }
      ]
    },
    {
      "id": "battle-plan",
      "kind": "case-study",
      "order": 2,
      "name": "Battle Plan",
      "ledgerProject": "document-generation-pipeline",
      "url": null,
      "what": "A web app for Bible-school students: a student's name, the words spoken over them and the Scriptures that stand out become a private, illustrated 16-page Battle Plan, with a daily practice of putting on each piece of the armor.",
      "status": "Being built: the daily screen, designed as five worlds. One will be chosen.",
      "captures": {
        "desktop": "assets/battleplan-worlds-1440.webp",
        "phone": "assets/battleplan-world-codex.webp",
        "worlds": [
          {
            "name": "Purple Codex",
            "src": "assets/battleplan-world-codex.webp"
          },
          {
            "name": "The Temper",
            "src": "assets/battleplan-world-temper.webp"
          },
          {
            "name": "Shield of Hours",
            "src": "assets/battleplan-world-shield.webp"
          },
          {
            "name": "The War Table",
            "src": "assets/battleplan-world-table.webp"
          },
          {
            "name": "The Armory Rack",
            "src": "assets/battleplan-world-armory.webp"
          }
        ]
      },
      "note": "Shown from the five design worlds' stills (example content); no student data.",
      "figures": [
        {
          "id": "docpipe.commits",
          "value": 290,
          "unit": "commits",
          "measured_at": "2026-09-28"
        },
        {
          "id": "docpipe.tests",
          "value": 949,
          "unit": "tests",
          "measured_at": "2026-09-26"
        }
      ]
    },
    {
      "id": "job-radar",
      "kind": "case-study",
      "order": 3,
      "name": "Job Radar",
      "ledgerProject": "job-search-data-pipeline",
      "url": null,
      "what": "A daily job pipeline: it scans hiring sources every morning, runs each role through hard requirement gates, scores the fit against the résumé and serves a dashboard with AI tailoring for the roles worth applying to.",
      "captures": {
        "desktop": "assets/jobradar-1440.webp"
      },
      "note": "The dashboard itself is password-gated; this capture is cropped to its header.",
      "figures": [
        {
          "id": "jobsearch.commits",
          "value": 315,
          "unit": "commits",
          "measured_at": "2026-09-28"
        },
        {
          "id": "jobsearch.tests",
          "value": 451,
          "unit": "tests",
          "measured_at": "2026-09-28"
        },
        {
          "id": "jobsearch.sources",
          "value": 16,
          "unit": "source families",
          "measured_at": "2026-09-26"
        }
      ]
    },
    {
      "id": "widgets",
      "kind": "case-study",
      "order": 4,
      "name": "Widgets Catalog",
      "ledgerProject": "widget-embed-platform",
      "url": null,
      "what": "A self-hosted clone of the Elfsight widget dashboard (dash.elfsight.com), built to replace a monthly widget subscription: a builder plus a self-contained embed runtime with no third-party CDN, now serving a reviews widget on a client's live site.",
      "captures": {
        "reviews": "assets/widgets-amazon-reviews.webp",
        "slider": "assets/widgets-before-and-after-slider.webp",
        "original": "assets/widgets-elfsight-editor.webp",
        "clone": "assets/widgets-clone-catalog.webp"
      },
      "note": "The builder is password-gated; these are its own sample posters.",
      "originalUrl": "https://dash.elfsight.com/",
      "figures": [
        {
          "id": "widgets.commits",
          "value": 51,
          "unit": "commits",
          "measured_at": "2026-09-28"
        },
        {
          "id": "widgets.testfiles",
          "value": 44,
          "unit": "test files",
          "measured_at": "2026-09-28"
        }
      ]
    },
    {
      "id": "clipping",
      "kind": "case-study",
      "order": 5,
      "name": "Clipping Pipeline",
      "ledgerProject": "clipping-pipeline",
      "url": null,
      "what": "Watch, clip, approve, post: a self-hosted pipeline that finds the strongest moments in long videos, cuts captioned vertical shorts and waits for a person's approval before anything posts. A second layer adds B-roll and text cards and checks every variant before it reaches the gallery.",
      "status": "Built through the publish step; nothing has been published yet.",
      "steps": [
        "Watch the channels",
        "Transcribe and pick the moments",
        "Cut 9:16 with captions",
        "Add B-roll and text cards",
        "Check every variant",
        "A person approves",
        "Post with attribution"
      ],
      "captures": null,
      "figures": [
        {
          "id": "clip.variants",
          "value": 178,
          "unit": "variants",
          "measured_at": "2026-10-01"
        },
        {
          "id": "clip.variants_passed",
          "value": 137,
          "unit": "variants",
          "measured_at": "2026-10-01"
        }
      ]
    },
    {
      "id": "journey",
      "kind": "case-study",
      "order": 6,
      "name": "The Road We're On",
      "url": "https://andrew-hailey-journey.pages.dev/",
      "what": "A scroll-story site for Andrew and Hailey's Bible-school years in Fort Worth, with a painted sketchbook companion and a code-drawn paper pop-up book of the same journey.",
      "captures": {
        "desktop": "assets/journey-1440.webp",
        "phone": "assets/journey-390.webp",
        "book": "assets/journey-book-1440.webp",
        "popup": "assets/journey-popup-1440.webp"
      },
      "approval": "Shown with Hailey's OK; money figures and giving links stay out.",
      "popupUrl": "https://aware-mullet-rftn.here.now/"
    },
    {
      "id": "journal",
      "kind": "work",
      "name": "Blessed Beginnings",
      "ledgerProject": "offline-journal-app",
      "url": "https://blessed-beginnings.pages.dev/",
      "what": "An offline-first pregnancy journal: no login, and every entry stays on the device.",
      "captures": {
        "desktop": "assets/journal-1440.webp",
        "phone": "assets/journal-390.webp"
      },
      "figures": [
        {
          "id": "journal.commits",
          "value": 460,
          "unit": "commits",
          "measured_at": "2026-09-28"
        }
      ]
    },
    {
      "id": "handpan",
      "kind": "work",
      "name": "Sacred Handpan",
      "url": "https://sonic-kayak-zfjd.here.now/",
      "what": "An installable handpan instrument that works offline: a 3D instrument you tap to play, with recordings, songs and a daily journey.",
      "captures": {
        "desktop": "assets/handpan-1440.webp",
        "phone": "assets/handpan-390.webp"
      }
    },
    {
      "id": "studio",
      "kind": "work",
      "name": "Design Studio",
      "url": "https://vowful-lichen-5fcs.here.now/",
      "what": "The design-reference library behind these sites: every kept reference circles a 3D orbit that turns to face you as you read.",
      "note": "Link the studio itself; its 14-builds page holds other creators' builds.",
      "captures": {
        "desktop": "assets/studio-1440.webp",
        "phone": "assets/studio-390.webp"
      }
    },
    {
      "id": "lovelab",
      "kind": "work",
      "name": "LOVE Lab",
      "url": "https://hello-world-ebon-beta.vercel.app/",
      "what": "A faith-based AI music studio (LOVE Studio Pro): describe a song in one line and get a finished master, with lyrics, vocals, a full arrangement and cover art. Worship starters turn scripture, hymns and sermon themes into original songs.",
      "captures": {
        "desktop": "assets/lovelab-1440.webp",
        "phone": "assets/lovelab-390.webp"
      },
      "note": "A free worship gift, never sold.",
      "urlLabel": "Open LOVE Studio"
    },
    {
      "id": "attribution",
      "kind": "work",
      "name": "Traffic & Attribution System",
      "ledgerProject": "traffic-attribution-system",
      "url": null,
      "what": "External traffic partner for an AI SaaS product: attribution built in-house with tagged links, a weekly sweep, and an approval gate before anything posts.",
      "captures": null,
      "figures": [
        {
          "id": "traffic.commits",
          "value": 285,
          "unit": "commits",
          "measured_at": "2026-09-28"
        }
      ]
    }
  ],
  "ledgerCaught": [
    {
      "what": "Tracked files claimed on the School-Data Vault card",
      "claimed": 908,
      "caught": "2026-09-27",
      "ledger": {
        "id": "vault.files",
        "value": 759,
        "unit": "tracked files",
        "measured_at": "2026-09-28"
      }
    },
    {
      "what": "The job-search pipeline's commit count, printed on the Document Generation Pipeline card",
      "claimed": 315,
      "caught": "2026-09-27",
      "ledger": {
        "id": "docpipe.commits",
        "value": 290,
        "unit": "commits",
        "measured_at": "2026-09-28"
      }
    }
  ],
  "verifying": {
    "label": "Figures being verified",
    "note": "These figures are under review against the ad account. Shown only here until they are reconciled.",
    "project": {
      "slug": "meta-ads-lead-system",
      "title": "Meta Ads Lead-Generation System",
      "stage": "M",
      "context": "414 Creative · college client",
      "role": "Paid Social & Reporting",
      "outcome": "856 leads at $4.22 from an account with no pixel",
      "description": "A two-campaign Meta Ads system: Campaign 1 buys cold attention cheaply with video-first creative, Campaign 2 converts only the people Campaign 1 already warmed up. Over 90 days for a college client: 487,000 impressions at $0.47 CPC, 856 leads at $4.22 each, and 127 applications at $28.43 each, from an account with no prior advertising and no pixel installed. Full case study at ads.andrew-rocha.here.now.",
      "stack": [
        "Meta Ads Manager",
        "Pixel & retargeting",
        "Campaign reporting"
      ],
      "link": "https://ads.andrew-rocha.here.now/",
      "figures": [
        {
          "id": "ads.impressions",
          "value": 487000,
          "unit": "impressions",
          "measured_at": "2026-08-06"
        },
        {
          "id": "ads.leads",
          "value": 856,
          "unit": "leads",
          "measured_at": "2026-08-06"
        },
        {
          "id": "ads.applications",
          "value": 127,
          "unit": "applications",
          "measured_at": "2026-08-06"
        },
        {
          "id": "ads.cpl",
          "value": 4.22,
          "unit": "usd",
          "measured_at": "2026-08-06"
        },
        {
          "id": "ads.cpa",
          "value": 28.43,
          "unit": "usd",
          "measured_at": "2026-08-06"
        },
        {
          "id": "ads.cpc",
          "value": 0.47,
          "unit": "usd",
          "measured_at": "2026-08-06"
        }
      ]
    },
    "sites": [
      {
        "id": "ads",
        "kind": "resume-site",
        "name": "Meta Ads case study",
        "verifying": true,
        "url": "https://ads.andrew-rocha.here.now/",
        "what": "A two-campaign Meta Ads system with a 'feel the split' budget explainer. Its figures are being verified.",
        "captures": {
          "desktop": "assets/ads-1440.webp",
          "phone": "assets/ads-390.webp"
        }
      }
    ]
  }
}
