{"_meta":{"schema_version":"1.3","source":"shippedwork.com","profile_url":"https://shippedwork.com/@david","generated_at":"2026-05-03T09:41:44.980Z"},"identity":{"display_name":"David Meehan","username":"david","primary_role":"Product Manager","domain":"Consumer","headline":"Building ShippedWork | Product @ SupplierKit","short_bio":"Glad you're enjoying the site!\n\nSubmit an idea or request a feature at the bottom of the page.","positioning_statement":"I’m building ShippedWork as a place for builders to share what they’ve made and the thinking behind it. It gives your work more context from the start, whether you’re trying to stand out to a hiring team, find collaborators, or simply show people what you’re capable of.","location":"New York, New York","avatar_url":"https://jpvxechbqrimpnpishqc.supabase.co/storage/v1/object/public/media/52194da1-7a3b-428e-ab99-50f0321f0b72/avatar.png","open_to":"hiring"},"shipped_work":[{"name":"Satsang","category":"side_project","confidentiality":"public","company":"Hunter Green","role":"Solo developer, cofounder with industry expert","artifact_url":"https://shippedwork.com/@david/satsang","description":"A calm, AI-guided conversation space for parents to recover their regulated presence and discover the tools to show up as the parents they know they can be.","tech_stack":"React, TypeScript, Vite, Tailwind CSS, React Router, Supabase (Auth, Postgres, Edge Functions), Vercel AI Gateway, Anthropic Claude Sonnet, Zod, Vercel Serverless Functions","live_url":"https://talk.satsangcoach.com/","date_launched":"2026-03-26","target_users":"I built Satsang for people who want a calmer, more reflective place to work\nthrough what's on their mind — not another productivity tool and not a\nclinical therapy app. The people I have in mind are adults navigating\neveryday stress, hard moments, and quiet questions about how they want to live. They might journal occasionally, have tried meditation apps, and want\nsomething that meets them where they are: a private space to talk things\nthrough, get grounded with a quick regulation tool, and turn an insight\ninto a small, doable plan. It's especially aimed at people who find blank\njournals intimidating and find chatbots either too clinical or too chatty.\n","problem_solved":"Before Satsang, the options for \"I'm having a hard moment and I want to\nthink out loud\" were fragmented and uncomfortable. Generic chatbots feel\ntransactional and push you toward answers. Meditation apps offer canned\nsessions but no way to talk through what you're actually feeling.\nJournaling apps stare at you with a blank page. Therapy is essential but\nisn't available at 11pm on a Tuesday when something small but real is\nknotting you up. The pain point I kept seeing — in myself and friends —\nwas the gap between \"I notice I'm not okay\" and \"I have a useful next\nstep.\" Satsang collapses that gap: a warm conversation surface, a 60-second\nreset when things feel hot, support tools you can reach for, and lightweight\nplans you can actually follow without it turning into another to-do list.\n","why_built":"I built Satsang because I wanted the thing to exist for myself. I'm new to\ncoding and worked through this project as a way to learn while making\nsomething I'd actually open at the end of a long day. I cared about the\nfeel of it more than the feature count — the typography, the pace of the\nstreamed responses, the breathing room around the input. I kept the\ncollaboration model with my AI coding assistant strict and minimal-diff\n(see AGENTS.md) because I wanted to understand every change. Each iteration\nwas driven by a real moment where the previous version felt off: a\nreset that looped, a save button that appeared too early, an onboarding\nstep that didn't carry intention forward. Building it taught me product\njudgment as much as it taught me React.\n","how_it_works":"You land on a single calm conversational page with a warm headline, an input area, and\nthree starter prompts. As soon as you start typing, the same column fades\ninto the conversation itself, so there's no jarring screen change. Behind\nthe input, /api/llm/chat streams a response from Claude Sonnet via the\nVercel AI Gateway, and the assistant's text appears progressively rather\nthan landing in one block. From the conversation you can save a script\nfor later, take a 60-second reset in a focused modal (no more text\ninjected into chat), or pivot into Support Tools, Plans, or You. New\nusers go through a short onboarding flow that captures a 30-day vision\nand turns it into an editable practice goal that gets carried into\nstep 5 instead of starting from a blank box. Plans, Saved, Journal, and\nResources are all reachable from the bottom nav, and an Admin route is\ngated for me. Auth, profiles, and persistence run on Supabase, and an\nUpgrade sheet handles soft quota gates without breaking the calm.\n","design_decisions":"The biggest decision was to keep the home surface to a single calm column\ninstead of a dashboard. The previous version had triage cards and dual\naction rows, and they made arrival feel like work. I removed them and\npushed the still-useful flows behind a SupportDrawer and dedicated routes\n— the cost is one more tap, the win is that \"/\" stops shouting at you.\nI picked Vite + React + Tailwind for fast iteration and Supabase to avoid\nbuilding auth, a database, and edge functions from scratch as a beginner.\nFor the LLM layer I went through the Vercel AI Gateway so the same code\npaths can fall back to mock streamed responses when no key is set, which\nkeeps local dev unblocked. I wrote contract tests against the gateway\nruntime instead of mocking the UI so I'd catch shape changes early.\nOn the conversation UX, I learned the hard way that injecting a\n\"60-second reset\" message into chat caused consent loops, so I replaced\nit with a local modal countdown that doesn't post anything back. I moved\nSave Script outside individual assistant bubbles into a panel-level\naction row tied to the latest fully streamed message, so it never\nappears prematurely. I lazy-load every non-home route to keep the first\npaint quiet, and the whole codebase is held to a strict minimal-diff\ncollaboration contract (AGENTS.md) so the surface area stays\nunderstandable to a learning developer.\n"},{"name":"SupplierKit","category":"professional","confidentiality":"public","company":"SupplierKit","role":"Lead product & engineering","artifact_url":"https://shippedwork.com/@david/supplierkit","description":"Supplier compliance automation for travel operator teams managing large supplier networks.","tech_stack":"Next.js 14, TypeScript, React, Tailwind CSS, Prisma, PostgreSQL, Supabase, Stripe, Resend, Anthropic Claude API, Google Document AI, Vercel","live_url":"https://supplierkit.com","date_launched":"2026-03-30","target_users":"Operations coordinators at travel operator companies managing 50+ suppliers — tour operators, DMCs, and activity providers who are responsible for keeping insurance certificates, permits, health and safety records, and attestations current across a distributed network of suppliers, but don't have a dedicated legal, procurement, or compliance function to lean on.","problem_solved":"Travel operator teams drown in supplier compliance busywork. A single coordinator might chase dozens of suppliers every month for expiring insurance certificates, permits, and attestations — tracking it in spreadsheets, chasing over email and WhatsApp, and manually comparing values against internal thresholds. Records go stale, audits become fire drills, and nobody has a clean current view of which suppliers are actually usable. Existing vendor-compliance tools are priced for enterprise procurement teams and assume a legal function operators don't have.","why_built":"I kept seeing the same pattern across travel operators: smart ops teams burning hours on supplier chasing work that should be automated, while the enterprise compliance tools on the market were either priced out of reach or built for a buyer profile that doesn't exist in this industry. I wanted to build the tool I'd want if I were running ops at a 50-supplier travel company — opinionated workflow templates, a supplier portal that actually gets used, and pricing that makes sense against a coordinator's salary rather than a Fortune 500 procurement budget.","how_it_works":"An operator picks a preset compliance requirement (e.g. public liability insurance with a coverage threshold), attaches it to suppliers, and SupplierKit takes over the chase. Suppliers receive outreach with a link to a branded portal where they upload documents and enter key values. SupplierKit compares submitted values against the operator's thresholds and routes anything ambiguous into a human review queue. Approved records update the supplier's compliance state; rejected ones trigger a re-chase. The dashboard shows which suppliers are current, which are expiring, and which are blocked, with a preserved audit trail of every request, submission, and decision.","design_decisions":"I made a few opinionated calls. First, humans approve everything in v1 — no automated compliance decisions — because the liability surface of auto-approving insurance is not something I want to own, and operators trust the system more when they're the final signer. Second, I split the product into two Next.js apps (auth.supplierkit.com and app.supplierkit.com) sharing one Supabase project, so auth/billing can evolve independently from the core product without a painful rewrite. Third, I leaned on Prisma with service-role Postgres for most API routes but kept Supabase RLS enabled as defense-in-depth on all 73 tables, so a bug in app-level auth can't leak cross-org data. Fourth, I narrowed the ICP hard to travel operators with 50+ suppliers — earlier plans included travel advisers and contract-analysis-first positioning, but willingness to pay wasn't there, so the chase engine became the wedge and contracts became just one document type in the system."},{"name":"Voice Widget","category":"side_project","confidentiality":"public","company":null,"role":"Solo developer","artifact_url":"https://shippedwork.com/@david/voice-widget","description":"A white-label Next.js app for configuring, previewing, and embedding ElevenLabs-powered voice chat widgets on any website.","tech_stack":"Next.js 16, React 19, TypeScript, Tailwind CSS 4, Three.js, React Three Fiber, ElevenLabs React SDK, Radix UI, Lucide React","live_url":"https://voice-widget-inky.vercel.app/","date_launched":"2025-12-30","target_users":"Website owners and developers who want to add a voice-powered conversational interface to their site without building one from scratch. Think SaaS founders adding a support agent, agencies white-labeling a chat widget for clients, or customer support teams wanting a branded voice assistant embedded on their help pages.","problem_solved":"Integrating a voice AI agent into a website is surprisingly painful. You need to handle microphone permissions, manage WebSocket audio streams, build a chat UI, style it to match your brand, and figure out how to embed it cleanly. ElevenLabs provides the voice agent backend, but there was no turnkey way to configure, customize, and embed their widget with your own branding — you had to build the entire frontend yourself.","why_built":"I wanted a drop-in solution for deploying ElevenLabs voice agents that anyone could customize without touching code. The goal was to go from 'I have an ElevenLabs Agent ID' to 'I have a branded voice widget embedded on my site' in under five minutes.","how_it_works":"You start on the configure page and paste your ElevenLabs Agent ID. Then you customize the widget appearance — choose voice-only or voice-plus-chat mode, set colors, labels, border radius, avatar image, and layout. A live preview updates as you tweak settings. When you're happy, the app generates an embed URL and a ready-to-paste iframe snippet. Drop that snippet into any webpage and your visitors get a fully branded voice chat experience. Configuration is stored in the URL parameters, so each embed can have its own look without a database.","design_decisions":"I chose to store all configuration in URL query parameters rather than a database. This means zero backend infrastructure — the whole app is a static Next.js deployment — and each embed URL is fully self-contained. The trade-off is longer URLs, but it eliminates auth, databases, and API layers entirely. For the 3D avatar, I used React Three Fiber to render an animated orb as the default, with the option to swap in a static image. This gives the widget a polished, alive feel out of the box while keeping the custom avatar path simple. I went with localStorage as a secondary config layer so returning users don't lose their settings, but query params always take priority to keep embeds deterministic."}],"summary":{"total_artifacts":3,"professional_count":1,"side_project_count":2,"member_since":"2026-03-14T13:18:49.011932+00:00","last_updated":"2026-04-24T01:20:36.589464+00:00"},"builder_practice":{"what_i_build":"Enterprise ops/compliance workflows, loyalty and personalization martech architecture, governance systems for emotionally sensitive conversational experiences","problems_i_solve":"How to translate cool tech innovation ideas into reliable, slightly more realistic operational tools","how_i_contribute":"Product thinker, small team leadership, and hands-on full stack builder. ","preferred_tools":"React, Tailwind, and Supabase, the AI dev trifecta","what_i_optimize_for":"Evidence of repeat user engagement to achieve a tightly-defined outcome"},"values":{"statement":null},"ai_discovery":{"problem_solving":"I start by turning ambiguity into explicit constraints, metrics, and a testable workflow. I build small, instrumented prototypes, define eval criteria (binary safety checks plus graded quality), and iterate using real usage signals. I debug by tracing data and decision paths end to end, then tightening grounding, templates, and guardrails to reduce variance while keeping latency and cost predictable.","collaboration_style":"I collaborate by creating shared artifacts that let teams move together: crisp PRDs, decision logs, eval rubrics, rollout plans, and clear ownership. I thrive in cross-functional settings and can coordinate large dependency graphs without breaking changes. I like tight feedback loops with design and engineering, and I mentor by giving people frameworks, examples, and review checkpoints that raise quality without slowing delivery.","communication":"I communicate with structured, audit-friendly documentation: goals, constraints, success metrics, risks, and next steps. I explain complex systems by mapping inputs, tools, outputs, and human checkpoints in plain language, then adding technical detail only where needed. I favor decision-ready writing like opportunity briefs and PRDs that connect customer pain, measurable impact, and delivery sequencing.","product_sense":"I design for real operators, not demos. I bias toward workflows that reduce time-to-value, minimize cognitive load, and make compliance and quality visible. I integrate feedback through measurable pilots and instrumentation, then refine UX and guardrails based on where users stall or lose trust. I make deliberate tradeoffs like strict templating when reliability and adoption matter more than flexibility.","motivation":"I’m driven by building systems people can rely on in high-stakes environments. I like turning messy, under-documented reality into products that feel simple, safe, and usable. I’m motivated by shipping, learning fast, and seeing workflows move from manual and error-prone to measurable and repeatable.","learning":"I learn by building: I pick a real workflow, implement it end to end, instrument it, and pressure-test it with eval sets and governance constraints. Recently I’ve gone deep on conversational agents, evaluation at scale, cost controls, entitlements, and tool-grounded workflows across enterprise systems. I also actively learn by partnering with domain experts and codifying their rules into product constraints.","culture":"I thrive on teams that are curious, direct, and outcome-driven, where quality and governance are taken seriously. I value high ownership, clear decision-making, and fast iteration with accountability. I prefer environments where product, engineering, and stakeholders work as one system, and where we talk openly about tradeoffs, risks, and what the data is actually saying.","initiative":"I routinely identify leverage points where automation or better workflows unlock disproportionate impact, then build the pilot plan and artifacts to make it real. I’ve led 0→1 platform builds to pilot-ready, created governance and evaluation systems for internal agents, and built pro-bono workflows to prove hands-on capability. I look for opportunities where trust, cost, and reliability are the real product.","strengths":"I ship governed, measurable systems. I led a loyalty rollout reaching ~5M members in ~18 months and coordinated delivery across ~20 enterprise teams. I reduced a monthly store audit workflow from ~10 hours to ~5 minutes for ~600 leaders via Copilot automation. I built an n8n pipeline that compressed PM scoping from weeks to 2–3 days. I fine-tuned a BERT classifier on ~40k tickets to 95% human acceptance and automated routing and documentation.","ideal_role":"I’m looking for a senior PM role owning conversational AI products, preferably voice, where the work is real enterprise deployment: integrations, governance, evaluation, and adoption. I want to lead teams building agent systems that are safe, instrumented, and cost-bounded, and to drive products from pilot through scale in environments where trust, compliance, and measurable outcomes matter."},"links":{"websites":[{"url":"https://www.shippedwork.com/","label":"ShippedWork"},{"url":"https://www.supplierkit.com/","label":"SupplierKit"},{"url":"https://talk.satsangcoach.com/","label":"Satsang"}],"github_repos":[{"url":"https://github.com/dmeehan45/design_systems","label":"Design Systems"}],"linkedin":"https://www.linkedin.com/in/davidfmeehan/","instagram":null,"x":null},"testing":{"account_type":"builder","open_to_testing":false,"domains":[],"expertise":null},"presentation":{"share_mode":"default","most_relevant_for":null,"target_role":null}}