{
  "name": "SaaS Maker",
  "schemaVersion": 1,
  "version": "1",
  "url": "https://sassmaker.com",
  "llms": "https://sassmaker.com/llms.txt",
  "llmsFull": "https://sassmaker.com/llms-full.txt",
  "sitemap": "https://sassmaker.com/sitemap.xml",
  "markdown": {
    "suffix": ".md",
    "negotiation": false
  },
  "canonical": "https://sassmaker.com",
  "sourceOfTruth": "SaaS Maker privacy-checked public product catalog",
  "studio": {
    "name": "SaaS Maker",
    "url": "https://sassmaker.com",
    "owner": {
      "name": "Sarthak Agrawal",
      "role": "Founder and builder",
      "url": "https://sarthakagrawal.dev"
    },
    "eyebrow": "Public directory · shared workshop",
    "headline": "The products. And the tools behind them.",
    "oneLine": "SaaS Maker is the public directory for Fleet products and the reusable packages, skills, templates, and feedback layer that help them ship.",
    "thesis": "SaaS Maker keeps the public product inventory inspectable and publishes the shared workshop used across it, without becoming the private Fleet control plane.",
    "ownerVoice": "I use AI as material, infrastructure, and a collaborator—but not as the identity of the work. The studio is about choosing useful problems, building the right product around them, and maintaining what earns its place.",
    "aiPosition": "AI belongs inside the craft: in the capability, the research, and the way the work gets built. It should make a product more useful or make a difficult workflow possible; it is not a substitute for product judgment.",
    "principles": [
      {
        "title": "Problem before category",
        "summary": "Work begins with a specific friction worth owning, not a fashionable market label or a feature looking for a product."
      },
      {
        "title": "AI is material, not the pitch",
        "summary": "Models are used where they create real leverage. The product still needs a reason to exist when the novelty disappears."
      },
      {
        "title": "Evidence over posture",
        "summary": "Real destinations, source, changelogs, and honest operating boundaries carry more weight than invented scale or broad claims."
      },
      {
        "title": "Each product keeps its shape",
        "summary": "The studio supplies standards and shared craft without flattening every product into one design, stack, or business model."
      }
    ],
    "boundaries": [
      "SaaS Maker is not presented as a large team or institution.",
      "The complete directory is an accountable inventory, not a claim that every experiment is equally active.",
      "Products keep their own identity, destination, support, and operational boundary.",
      "What is public is deliberate and verifiable; what is private stays outside the story."
    ],
    "representativeWork": [
      {
        "id": "codevetter",
        "name": "CodeVetter",
        "description": "Execution-backed verification for AI-written software changes — local-first and inspectable.",
        "makerNote": "I built CodeVetter to make reviewing AI-generated code rigorous without giving up a local-first workflow.",
        "profileUrl": "https://sassmaker.com/p/codevetter",
        "destinationUrl": "https://codevetter.com",
        "repositoryUrl": "https://github.com/Codevetter/codevetter",
        "studioSignal": "Higher confidence that an agent completed the requested change correctly and safely."
      },
      {
        "id": "pace",
        "name": "HeyPace",
        "description": "An experimental macOS voice-agent preview; installation and permission-dependent workflows are still being qualified.",
        "makerNote": "I wanted a fast, privacy-first Mac assistant that could understand what is on my screen while keeping the work local.",
        "profileUrl": "https://sassmaker.com/p/pace",
        "destinationUrl": "https://heypace.app",
        "repositoryUrl": "https://github.com/HeyPace/pace",
        "studioSignal": "Get useful help in the moment with less typing and less context switching."
      },
      {
        "id": "posttrainllm",
        "name": "PostTrainLLM",
        "description": "An experimental browser model playground: run small language models locally with visible generation metrics.",
        "makerNote": "I use PostTrainLLM to explore local model training and turn those experiments into repeatable recipes for specialist models.",
        "profileUrl": "https://sassmaker.com/p/posttrainllm",
        "destinationUrl": "https://posttrainllm.com",
        "repositoryUrl": "https://github.com/PostTrainLLM/posttrainllm",
        "studioSignal": "Train, evaluate, compare, and run specialist models with evidence about what worked and why."
      },
      {
        "id": "live",
        "name": "Live",
        "description": "Explore hobbies and possibilities, build a personal bucket list, and save your progress on this device or in your account.",
        "makerNote": "I wanted a product that helps people live more intentionally through goals, possibilities, and things worth anticipating.",
        "profileUrl": "https://sassmaker.com/p/live",
        "destinationUrl": "https://live.significanthobbies.com",
        "repositoryUrl": "https://github.com/Significant-Hobbies/live",
        "studioSignal": "Build a personal catalogue of things worth doing and keep moving from possibility toward lived experience."
      }
    ],
    "page": "https://sassmaker.com/studio",
    "markdown": "https://sassmaker.com/studio.md"
  },
  "surfaces": [
    {
      "id": "directory",
      "url": "https://sassmaker.com/",
      "md": "https://sassmaker.com/index.md",
      "kind": "collection",
      "description": "Software as a specialized service: a living studio of focused products"
    },
    {
      "id": "studio",
      "url": "https://sassmaker.com/studio",
      "md": "https://sassmaker.com/studio.md",
      "kind": "static",
      "description": "SaaS Maker is the public directory for Fleet products and the reusable packages, skills, templates, and feedback layer that help them ship."
    },
    {
      "id": "projects",
      "url": "https://sassmaker.com/projects",
      "md": "https://sassmaker.com/projects.md",
      "kind": "collection",
      "description": "Public directory of shareable Fleet projects and experiments"
    },
    {
      "id": "ideas",
      "url": "https://sassmaker.com/ideas",
      "md": "https://sassmaker.com/ideas.md",
      "kind": "collection",
      "description": "Scored decision ledger of tech-heavy product ideas"
    },
    {
      "id": "tools",
      "url": "https://sassmaker.com/tools",
      "md": "https://sassmaker.com/tools.md",
      "kind": "collection",
      "description": "Canonical public catalog of reusable Fleet capabilities"
    },
    {
      "id": "launchdesk",
      "url": "https://sassmaker.com/launchdesk",
      "md": "https://sassmaker.com/launchdesk.md",
      "kind": "collection",
      "description": "SaaS Maker launch-destination catalog with source-attributed metrics"
    },
    {
      "id": "launchkit",
      "url": "https://sassmaker.com/launchkit",
      "md": "https://sassmaker.com/launchkit.md",
      "kind": "static",
      "description": "Free agent-executable launch toolkit on the launchdesk catalog"
    },
    {
      "id": "funding",
      "url": "https://sassmaker.com/funding",
      "md": "https://sassmaker.com/funding.md",
      "kind": "collection",
      "description": "Funding and accelerator directory — 184 programs with per-row evidence grading"
    },
    {
      "id": "search",
      "url": "https://sassmaker.com/search",
      "md": "https://sassmaker.com/search.md",
      "kind": "collection",
      "description": "Unified search across every public SaaS Maker surface"
    },
    {
      "id": "ranks",
      "url": "https://sassmaker.com/ranks",
      "md": "https://sassmaker.com/ranks.md",
      "kind": "collection",
      "description": "Provider-reported Ahrefs DR board for all owned Fleet domains"
    },
    {
      "id": "privacy",
      "url": "https://sassmaker.com/privacy",
      "md": "https://sassmaker.com/privacy.md",
      "kind": "static",
      "description": "Privacy policy for the SaaS Maker product directory"
    },
    {
      "id": "terms",
      "url": "https://sassmaker.com/terms",
      "md": "https://sassmaker.com/terms.md",
      "kind": "static",
      "description": "Terms of use for the SaaS Maker product directory"
    },
    {
      "id": "changelog",
      "url": "https://sassmaker.com/changelog",
      "md": "https://sassmaker.com/changelog.md",
      "kind": "collection",
      "description": "Product-owned history of meaningful changes shipped by SaaS Maker"
    },
    {
      "id": "learnings",
      "url": "https://sassmaker.com/learnings",
      "md": "https://sassmaker.com/learnings.md",
      "kind": "collection",
      "description": "First-party builder notes and agent-tooling learnings"
    },
    {
      "id": "funding-doc-strategy",
      "url": "https://sassmaker.com/funding/docs/strategy",
      "md": "https://sassmaker.com/funding/docs/strategy.md",
      "kind": "article",
      "description": "Current priorities, preference logic, the action calendar, and the questions to answer before accepting any intensive program."
    },
    {
      "id": "funding-doc-materials",
      "url": "https://sassmaker.com/funding/docs/materials",
      "md": "https://sassmaker.com/funding/docs/materials.md",
      "kind": "article",
      "description": "The source-of-truth founder profile, reusable answers, and the evidence checklist behind every application."
    },
    {
      "id": "funding-doc-methodology",
      "url": "https://sassmaker.com/funding/docs/methodology",
      "md": "https://sassmaker.com/funding/docs/methodology.md",
      "kind": "article",
      "description": "What “exhaustive” means here: which fields are objective, how uncertain evidence is graded, and how the directory stays maintained."
    },
    {
      "id": "funding-doc-archive",
      "url": "https://sassmaker.com/funding/docs/archive",
      "md": "https://sassmaker.com/funding/docs/archive.md",
      "kind": "article",
      "description": "Original Stumble-era applications, raw lists, and unresolved artifacts — preserved as history, not current guidance."
    },
    {
      "id": "learning-a-structured-alternative-to-a-product-launch-spreadsheet",
      "url": "https://sassmaker.com/learnings/a-structured-alternative-to-a-product-launch-spreadsheet",
      "md": "https://sassmaker.com/learnings/a-structured-alternative-to-a-product-launch-spreadsheet.md",
      "kind": "article",
      "description": "Learn how to replace your stale product-launch spreadsheet with a structured, verifiable JSON dataset. Explore a scalable architecture for tracking launch directories, PR metrics, and link status."
    },
    {
      "id": "learning-data-quality-checks-for-a-launch-directory-catalog",
      "url": "https://sassmaker.com/learnings/data-quality-checks-for-a-launch-directory-catalog",
      "md": "https://sassmaker.com/learnings/data-quality-checks-for-a-launch-directory-catalog.md",
      "kind": "article",
      "description": "Discover a structural approach to catalog data quality. Learn how to separate private metadata from public directories and enforce strict schema checks without a traditional database."
    },
    {
      "id": "learning-free-vs-paid-product-directories-how-to-decide",
      "url": "https://sassmaker.com/learnings/free-vs-paid-product-directories-how-to-decide",
      "md": "https://sassmaker.com/learnings/free-vs-paid-product-directories-how-to-decide.md",
      "kind": "article",
      "description": "An evidence-based guide on evaluating free versus paid product directories for SaaS discovery, based on real portfolio management and catalog curation strategies."
    },
    {
      "id": "learning-how-to-identify-real-submission-routes-in-launch-directories",
      "url": "https://sassmaker.com/learnings/how-to-identify-real-submission-routes-in-launch-directories",
      "md": "https://sassmaker.com/learnings/how-to-identify-real-submission-routes-in-launch-directories.md",
      "kind": "article",
      "description": "Stop wasting time on dead links and scraped lists. Learn how to identify verified submission routes for SaaS launch directories."
    },
    {
      "id": "learning-how-to-plan-follow-up-dates-after-a-product-submission",
      "url": "https://sassmaker.com/learnings/how-to-plan-follow-up-dates-after-a-product-submission",
      "md": "https://sassmaker.com/learnings/how-to-plan-follow-up-dates-after-a-product-submission.md",
      "kind": "article",
      "description": "Learn how to establish actionable follow-up and verification plans after submitting a product to directories."
    },
    {
      "id": "learning-importing-and-exporting-a-launch-campaign-with-csv-and-json",
      "url": "https://sassmaker.com/learnings/importing-and-exporting-a-launch-campaign-with-csv-and-json",
      "md": "https://sassmaker.com/learnings/importing-and-exporting-a-launch-campaign-with-csv-and-json.md",
      "kind": "article",
      "description": "Learn how to manage your product launch campaign using standard formats like CSV and JSON, integrating structured data directly into your workflow."
    },
    {
      "id": "learning-keeping-a-launch-workspace-private-in-browser-local-storage",
      "url": "https://sassmaker.com/learnings/keeping-a-launch-workspace-private-in-browser-local-storage",
      "md": "https://sassmaker.com/learnings/keeping-a-launch-workspace-private-in-browser-local-storage.md",
      "kind": "article",
      "description": "Learn how to build a private, local-first launch workspace using browser local storage, with concrete examples from LaunchDesk."
    },
    {
      "id": "learning-matching-a-launch-channel-to-the-product-being-launched",
      "url": "https://sassmaker.com/learnings/matching-a-launch-channel-to-the-product-being-launched",
      "md": "https://sassmaker.com/learnings/matching-a-launch-channel-to-the-product-being-launched.md",
      "kind": "article",
      "description": "Learn how to match your product's architecture, audience, and goals to the right launch channel using concrete examples."
    },
    {
      "id": "learning-when-to-quarantine-a-dead-or-contradictory-launch-listing",
      "url": "https://sassmaker.com/learnings/when-to-quarantine-a-dead-or-contradictory-launch-listing",
      "md": "https://sassmaker.com/learnings/when-to-quarantine-a-dead-or-contradictory-launch-listing.md",
      "kind": "article",
      "description": "Learn how the quarantine pattern isolates suspect launch listings and conflicting metrics without silently erasing historical data."
    },
    {
      "id": "learning-why-every-launch-destination-needs-source-attribution",
      "url": "https://sassmaker.com/learnings/why-every-launch-destination-needs-source-attribution",
      "md": "https://sassmaker.com/learnings/why-every-launch-destination-needs-source-attribution.md",
      "kind": "article",
      "description": "Discover why provenance-honest source attribution is critical for evaluating SaaS launch destinations, and why explicit unknowns beat invented metrics."
    },
    {
      "id": "learning-why-launch-tracking-should-not-become-automated-submission-spam",
      "url": "https://sassmaker.com/learnings/why-launch-tracking-should-not-become-automated-submission-spam",
      "md": "https://sassmaker.com/learnings/why-launch-tracking-should-not-become-automated-submission-spam.md",
      "kind": "article",
      "description": "Discover why careful, manually tracked launch submissions using tools like LaunchDesk drastically outperform automated directory submission spam in SaaS."
    },
    {
      "id": "learning-skills-should-declare-capabilities-not-model-names",
      "url": "https://sassmaker.com/learnings/skills-should-declare-capabilities-not-model-names",
      "md": "https://sassmaker.com/learnings/skills-should-declare-capabilities-not-model-names.md",
      "kind": "article",
      "description": "Why portable agent skills need provider-neutral intelligence and reasoning requirements, and how Fleet is testing the idea."
    },
    {
      "id": "product-codevetter",
      "url": "https://sassmaker.com/p/codevetter",
      "md": "https://sassmaker.com/p/codevetter.md",
      "kind": "profile",
      "description": "Execution-backed verification for AI-written software changes — local-first and inspectable."
    },
    {
      "id": "product-pace",
      "url": "https://sassmaker.com/p/pace",
      "md": "https://sassmaker.com/p/pace.md",
      "kind": "profile",
      "description": "An experimental macOS voice-agent preview; installation and permission-dependent workflows are still being qualified."
    },
    {
      "id": "product-posttrainllm",
      "url": "https://sassmaker.com/p/posttrainllm",
      "md": "https://sassmaker.com/p/posttrainllm.md",
      "kind": "profile",
      "description": "An experimental browser model playground: run small language models locally with visible generation metrics."
    },
    {
      "id": "product-site-health",
      "url": "https://sassmaker.com/p/site-health",
      "md": "https://sassmaker.com/p/site-health.md",
      "kind": "profile",
      "description": "A local portfolio dashboard for domains, performance, search, and AI visibility evidence."
    },
    {
      "id": "product-live",
      "url": "https://sassmaker.com/p/live",
      "md": "https://sassmaker.com/p/live.md",
      "kind": "profile",
      "description": "Explore hobbies and possibilities, build a personal bucket list, and save your progress on this device or in your account."
    },
    {
      "id": "product-chatgpt-connections",
      "url": "https://sassmaker.com/p/chatgpt-connections",
      "md": "https://sassmaker.com/p/chatgpt-connections.md",
      "kind": "profile",
      "description": "A read-only MCP gateway that exposes selected public Fleet data to ChatGPT connections."
    },
    {
      "id": "product-fleet-social",
      "url": "https://sassmaker.com/p/fleet-social",
      "md": "https://sassmaker.com/p/fleet-social.md",
      "kind": "profile",
      "description": "Private video review, scheduling and delivery tracking for Fleet projects, with local Mashup exports."
    },
    {
      "id": "product-chatgpt-memory-insights",
      "url": "https://sassmaker.com/p/chatgpt-memory-insights",
      "md": "https://sassmaker.com/p/chatgpt-memory-insights.md",
      "kind": "profile",
      "description": "A browser-local experiment for importing a ChatGPT export, exploring semantic themes and search, and optionally saving analysis on your device."
    },
    {
      "id": "product-free-ai",
      "url": "https://sassmaker.com/p/free-ai",
      "md": "https://sassmaker.com/p/free-ai.md",
      "kind": "profile",
      "description": "An OpenAI-compatible free-tier model gateway with operator-provisioned project access."
    },
    {
      "id": "product-high-signal",
      "url": "https://sassmaker.com/p/high-signal",
      "md": "https://sassmaker.com/p/high-signal.md",
      "kind": "profile",
      "description": "Evidence-backed daily intelligence across technology, startups, finance, and public markets."
    },
    {
      "id": "product-knowledge-base",
      "url": "https://sassmaker.com/p/knowledge-base",
      "md": "https://sassmaker.com/p/knowledge-base.md",
      "kind": "profile",
      "description": "Private agent search over specialized corpora with ranked citations, provenance, and schema-aware retrieval."
    },
    {
      "id": "product-significanthobbies",
      "url": "https://sassmaker.com/p/significanthobbies",
      "md": "https://sassmaker.com/p/significanthobbies.md",
      "kind": "profile",
      "description": "The shared Hub for Live, Calorie, Setline, Kith, and Anchor, backed by one privacy-aware control plane."
    },
    {
      "id": "product-anime-list",
      "url": "https://sassmaker.com/p/anime-list",
      "md": "https://sassmaker.com/p/anime-list.md",
      "kind": "profile",
      "description": "Anime and manga discovery with multi-axis filtering and personal watchlists."
    },
    {
      "id": "product-looptv",
      "url": "https://sassmaker.com/p/looptv",
      "md": "https://sassmaker.com/p/looptv.md",
      "kind": "profile",
      "description": "An experimental lean-back queue of curated science and other videos."
    },
    {
      "id": "product-reader",
      "url": "https://sassmaker.com/p/reader",
      "md": "https://sassmaker.com/p/reader.md",
      "kind": "profile",
      "description": "A saved-link inbox for ChatGPT: save links, search them, track read state, and connect through MCP."
    },
    {
      "id": "product-swe-interview-prep",
      "url": "https://sassmaker.com/p/swe-interview-prep",
      "md": "https://sassmaker.com/p/swe-interview-prep.md",
      "kind": "profile",
      "description": "A learning OS for software-engineering interview practice."
    },
    {
      "id": "product-calorie",
      "url": "https://sassmaker.com/p/calorie",
      "md": "https://sassmaker.com/p/calorie.md",
      "kind": "profile",
      "description": "A private, local-first food, water, and weight journal with transparent timing guidance."
    },
    {
      "id": "product-setline",
      "url": "https://sassmaker.com/p/setline",
      "md": "https://sassmaker.com/p/setline.md",
      "kind": "profile",
      "description": "An iOS-native training tracker that runs a written strength, cardio and mobility programme one set at a time and measures each exercise against an authored target."
    },
    {
      "id": "product-kith",
      "url": "https://sassmaker.com/p/kith",
      "md": "https://sassmaker.com/p/kith.md",
      "kind": "profile",
      "description": "A private iPhone app for the people you actually want to stay close to — closeness-weighted constellation home, standing notes, and a chronological log per person."
    },
    {
      "id": "product-rolepatch",
      "url": "https://sassmaker.com/p/rolepatch",
      "md": "https://sassmaker.com/p/rolepatch.md",
      "kind": "profile",
      "description": "A guest resume-tailoring experiment with a reviewable diff and browser-local document exports."
    },
    {
      "id": "product-karte",
      "url": "https://sassmaker.com/p/karte",
      "md": "https://sassmaker.com/p/karte.md",
      "kind": "profile",
      "description": "A creator-owned public profile that answers visitor questions and preserves context for better inbound."
    },
    {
      "id": "product-starboard",
      "url": "https://sassmaker.com/p/starboard",
      "md": "https://sassmaker.com/p/starboard.md",
      "kind": "profile",
      "description": "Explore public GitHub repositories and related projects through a searchable discovery experiment."
    },
    {
      "id": "product-ai-game",
      "url": "https://sassmaker.com/p/ai-game",
      "md": "https://sassmaker.com/p/ai-game.md",
      "kind": "profile",
      "description": "Persistent AI world and multi-agent simulation experiments."
    },
    {
      "id": "product-app-health",
      "url": "https://sassmaker.com/p/app-health",
      "md": "https://sassmaker.com/p/app-health.md",
      "kind": "profile",
      "description": "Web analytics, product events, logs, and endpoint health in one workspace."
    },
    {
      "id": "product-motion",
      "url": "https://sassmaker.com/p/motion",
      "md": "https://sassmaker.com/p/motion.md",
      "kind": "profile",
      "description": "An unreleased iPhone motion-control game prototype that mirrors to a larger screen; physical-device control feel and gameplay remain unverified."
    },
    {
      "id": "product-web-playables",
      "url": "https://sassmaker.com/p/web-playables",
      "md": "https://sassmaker.com/p/web-playables.md",
      "kind": "profile",
      "description": "Small browser-playable game experiments."
    },
    {
      "id": "product-what-it-takes-to-win",
      "url": "https://sassmaker.com/p/what-it-takes-to-win",
      "md": "https://sassmaker.com/p/what-it-takes-to-win.md",
      "kind": "profile",
      "description": "Explore sourced career turning points with explicit survivorship and forecasting limits."
    },
    {
      "id": "product-sarthakagrawal-personal",
      "url": "https://sassmaker.com/p/sarthakagrawal-personal",
      "md": "https://sassmaker.com/p/sarthakagrawal-personal.md",
      "kind": "profile",
      "description": "Selected engineering case studies, technical writing and working project demonstrations."
    },
    {
      "id": "product-anchor",
      "url": "https://sassmaker.com/p/anchor",
      "md": "https://sassmaker.com/p/anchor.md",
      "kind": "profile",
      "description": "A local-first day planner and focus timer for Mac, iPhone, and Apple Watch that explains the gap between the schedule you planned and the day you lived."
    },
    {
      "id": "product-storagedaddy",
      "url": "https://sassmaker.com/p/storagedaddy",
      "md": "https://sassmaker.com/p/storagedaddy.md",
      "kind": "profile",
      "description": "An open-source native Mac storage analyzer for developer caches, builds, dependencies and AI session archives, with reviewed cleanup. Free during early access."
    },
    {
      "id": "product-browserdaddy",
      "url": "https://sassmaker.com/p/browserdaddy",
      "md": "https://sassmaker.com/p/browserdaddy.md",
      "kind": "profile",
      "description": "A local-first Mac browsing intelligence app for a unified history archive and real attention tracking."
    },
    {
      "id": "product-performancedaddy",
      "url": "https://sassmaker.com/p/performancedaddy",
      "md": "https://sassmaker.com/p/performancedaddy.md",
      "kind": "profile",
      "description": "A local Mac performance investigator for background apps, helpers and developer workloads, with measured evidence and reviewed actions."
    },
    {
      "id": "product-unified-portfolio",
      "url": "https://sassmaker.com/p/unified-portfolio",
      "md": "https://sassmaker.com/p/unified-portfolio.md",
      "kind": "profile",
      "description": "Private read-only investment observability."
    },
    {
      "id": "product-meme-lab",
      "url": "https://sassmaker.com/p/meme-lab",
      "md": "https://sassmaker.com/p/meme-lab.md",
      "kind": "profile",
      "description": "A public tool that ranks 3,000 reaction memes for a comment; its Anna review candidate also creates personal photo memes with private saves and PNG downloads."
    },
    {
      "id": "product-nutrition-formula-engine",
      "url": "https://sassmaker.com/p/nutrition-formula-engine",
      "md": "https://sassmaker.com/p/nutrition-formula-engine.md",
      "kind": "profile",
      "description": "A browser-first formulation tool that converts reviewed batch formulas into traceable theoretical composition reports."
    },
    {
      "id": "product-every-song-is-a-website",
      "url": "https://sassmaker.com/p/every-song-is-a-website",
      "md": "https://sassmaker.com/p/every-song-is-a-website.md",
      "kind": "profile",
      "description": "A playful static site where each of 143 songs gets its own interactive visual world — old desktop, picnic blanket, acid poster, neon night, or scrapbook page — with embedded video and licensed lyrics."
    },
    {
      "id": "product-contextdaddy",
      "url": "https://sassmaker.com/p/contextdaddy",
      "md": "https://sassmaker.com/p/contextdaddy.md",
      "kind": "profile",
      "description": "A native Mac workspace for coding-agent skills, context, usage and telemetry, with a unified skill library, explicit local changes, and recovery history."
    },
    {
      "id": "product-agent-inbox",
      "url": "https://sassmaker.com/p/agent-inbox",
      "md": "https://sassmaker.com/p/agent-inbox.md",
      "kind": "profile",
      "description": "A local inbox for coding-agent status, attention requests and verified conversation replies."
    },
    {
      "id": "product-techdata",
      "url": "https://sassmaker.com/p/techdata",
      "md": "https://sassmaker.com/p/techdata.md",
      "kind": "profile",
      "description": "A public, read-only data workbench: Nomad Atlas places, High Signal Podcasts claims, Reddit Insights, Research Papers and the full Product Hunt catalogue in one console with ⌘K search, filters, comparison and provenance-carrying exports."
    },
    {
      "id": "product-gitstat",
      "url": "https://sassmaker.com/p/gitstat",
      "md": "https://sassmaker.com/p/gitstat.md",
      "kind": "profile",
      "description": "An experimental public GitHub analysis tool for repository activity, contributions and code churn."
    },
    {
      "id": "product-reel-pipeline",
      "url": "https://sassmaker.com/p/reel-pipeline",
      "md": "https://sassmaker.com/p/reel-pipeline.md",
      "kind": "profile",
      "description": "A cost-bounded pipeline for planning, producing, and retaining short-form video artifacts."
    },
    {
      "id": "product-mobile-dev-cockpit",
      "url": "https://sassmaker.com/p/mobile-dev-cockpit",
      "md": "https://sassmaker.com/p/mobile-dev-cockpit.md",
      "kind": "profile",
      "description": "A parked mobile supervision client retained for possible future reactivation."
    },
    {
      "id": "product-drank",
      "url": "https://sassmaker.com/p/drank",
      "md": "https://sassmaker.com/p/drank.md",
      "kind": "profile",
      "description": "Domain Rating intelligence for product, SEO, and market research."
    },
    {
      "id": "product-email-manager",
      "url": "https://sassmaker.com/p/email-manager",
      "md": "https://sassmaker.com/p/email-manager.md",
      "kind": "profile",
      "description": "A private Gmail workspace for local semantic search, sender insights, and explicit unsubscribe workflows."
    },
    {
      "id": "product-psi-swarm",
      "url": "https://sassmaker.com/p/psi-swarm",
      "md": "https://sassmaker.com/p/psi-swarm.md",
      "kind": "profile",
      "description": "Source-installed local Lighthouse audits with saved history; use the documented source setup, not the older packaged release."
    },
    {
      "id": "product-on-record",
      "url": "https://sassmaker.com/p/on-record",
      "md": "https://sassmaker.com/p/on-record.md",
      "kind": "profile",
      "description": "Search evidenced podcast claims and follow links back to the original episode or publication."
    },
    {
      "id": "product-issue-pages",
      "url": "https://sassmaker.com/p/issue-pages",
      "md": "https://sassmaker.com/p/issue-pages.md",
      "kind": "profile",
      "description": "Read public GitHub issues as focused articles; publishing requires repository-owner access."
    },
    {
      "id": "product-everythingrated",
      "url": "https://sassmaker.com/p/everythingrated",
      "md": "https://sassmaker.com/p/everythingrated.md",
      "kind": "profile",
      "description": "A ratings experiment for comparing AI developer tools, with visible small-sample counts and shareable weighting."
    },
    {
      "id": "product-research-papers",
      "url": "https://sassmaker.com/p/research-papers",
      "md": "https://sassmaker.com/p/research-papers.md",
      "kind": "profile",
      "description": "Search academic papers and follow original sources; account-based research chat is not yet qualified."
    },
    {
      "id": "product-materia",
      "url": "https://sassmaker.com/p/materia",
      "md": "https://sassmaker.com/p/materia.md",
      "kind": "profile",
      "description": "An educational body-and-remedy reference with condition-specific research citations and explicit uncertainty."
    },
    {
      "id": "product-india-standards",
      "url": "https://sassmaker.com/p/india-standards",
      "md": "https://sassmaker.com/p/india-standards.md",
      "kind": "profile",
      "description": "A transparent India demographic standards calculator using aggregate PLFS data, explicit uncertainty ranges, and clear source limits."
    },
    {
      "id": "product-chess",
      "url": "https://sassmaker.com/p/chess",
      "md": "https://sassmaker.com/p/chess.md",
      "kind": "profile",
      "description": "Browser chess against Stockfish with optional AI move coaching."
    },
    {
      "id": "product-journal",
      "url": "https://sassmaker.com/p/journal",
      "md": "https://sassmaker.com/p/journal.md",
      "kind": "profile",
      "description": "A private iPhone journal for daily writing, reflection, and a personal archive that stays under the owner's control."
    },
    {
      "id": "product-ios-landings",
      "url": "https://sassmaker.com/p/ios-landings",
      "md": "https://sassmaker.com/p/ios-landings.md",
      "kind": "profile",
      "description": "Retained native-app landing and journal factory inside UI Library; product artwork, content, checks and existing deploy targets are preserved."
    },
    {
      "id": "product-protein-index",
      "url": "https://sassmaker.com/p/protein-index",
      "md": "https://sassmaker.com/p/protein-index.md",
      "kind": "profile",
      "description": "Explore dated nutrition records with original label links, observation dates and explicit verification limits."
    },
    {
      "id": "product-veg-protein-food",
      "url": "https://sassmaker.com/p/veg-protein-food",
      "md": "https://sassmaker.com/p/veg-protein-food.md",
      "kind": "profile",
      "description": "Search vegetarian recipes by protein and calories, with links to the original recipe publishers."
    },
    {
      "id": "product-mashup",
      "url": "https://sassmaker.com/p/mashup",
      "md": "https://sassmaker.com/p/mashup.md",
      "kind": "profile",
      "description": "Two playable examples of a local media-editing pipeline, with captions and inspectable source and approval receipts."
    },
    {
      "id": "product-truehire",
      "url": "https://sassmaker.com/p/truehire",
      "md": "https://sassmaker.com/p/truehire.md",
      "kind": "profile",
      "description": "Earlier resume and hiring workflow superseded by RolePatch."
    },
    {
      "id": "product-open-historia",
      "url": "https://sassmaker.com/p/open-historia",
      "md": "https://sassmaker.com/p/open-historia.md",
      "kind": "profile",
      "description": "Interactive historical storytelling and world simulation."
    },
    {
      "id": "product-ph-catalog",
      "url": "https://sassmaker.com/p/ph-catalog",
      "md": "https://sassmaker.com/p/ph-catalog.md",
      "kind": "profile",
      "description": "A resumable local Product Hunt catalogue and analytics experiment with a privacy-safe synthetic demo."
    },
    {
      "id": "product-companion-robot",
      "url": "https://sassmaker.com/p/companion-robot",
      "md": "https://sassmaker.com/p/companion-robot.md",
      "kind": "profile",
      "description": "Earlier companion robotics and embodied-agent exploration."
    },
    {
      "id": "product-forecast-lab",
      "url": "https://sassmaker.com/p/forecast-lab",
      "md": "https://sassmaker.com/p/forecast-lab.md",
      "kind": "profile",
      "description": "Forecasting experiments and evaluation tooling."
    },
    {
      "id": "product-agent-office",
      "url": "https://sassmaker.com/p/agent-office",
      "md": "https://sassmaker.com/p/agent-office.md",
      "kind": "profile",
      "description": "A local-first Mac workplace where named AI employees have bounded responsibilities and their work stays inspectable."
    },
    {
      "id": "product-local-ai-video-studio",
      "url": "https://sassmaker.com/p/local-ai-video-studio",
      "md": "https://sassmaker.com/p/local-ai-video-studio.md",
      "kind": "profile",
      "description": "A local-first Mac studio for comparing reproducible video-effect variants before export."
    },
    {
      "id": "product-field-track",
      "url": "https://sassmaker.com/p/field-track",
      "md": "https://sassmaker.com/p/field-track.md",
      "kind": "profile",
      "description": "A labelled synthetic field-team demo for exploring routes, visits and agent summaries; Android tracking is not qualified."
    },
    {
      "id": "product-reddit-insights",
      "url": "https://sassmaker.com/p/reddit-insights",
      "md": "https://sassmaker.com/p/reddit-insights.md",
      "kind": "profile",
      "description": "Search a dated snapshot of 93 Reddit communities in your browser, with links to original posts and explicit provenance limits."
    },
    {
      "id": "product-verified-bases",
      "url": "https://sassmaker.com/p/verified-bases",
      "md": "https://sassmaker.com/p/verified-bases.md",
      "kind": "profile",
      "description": "A retained research-data identity with no retained local Git history or standalone public destination."
    },
    {
      "id": "product-nomad-data-adventure",
      "url": "https://sassmaker.com/p/nomad-data-adventure",
      "md": "https://sassmaker.com/p/nomad-data-adventure.md",
      "kind": "profile",
      "description": "Nomad Atlas explores 1,374 terrestrial places with living-cost profiles, lifestyle filters, city comparisons and downloadable source data credited to Nomads.com."
    },
    {
      "id": "product-slow-serp",
      "url": "https://sassmaker.com/p/slow-serp",
      "md": "https://sassmaker.com/p/slow-serp.md",
      "kind": "profile",
      "description": "A private HTTP-first crawler and paced search service with bounded Chrome fallback."
    },
    {
      "id": "product-shoulders",
      "url": "https://sassmaker.com/p/shoulders",
      "md": "https://sassmaker.com/p/shoulders.md",
      "kind": "profile",
      "description": "An editorial exploration of software foundations. Cancelled local prototype."
    },
    {
      "id": "product-agent-testing",
      "url": "https://sassmaker.com/p/agent-testing",
      "md": "https://sassmaker.com/p/agent-testing.md",
      "kind": "profile",
      "description": "A completed local web and iOS experiment comparing browser-agent strategies with independent verification."
    },
    {
      "id": "product-scale",
      "url": "https://sassmaker.com/p/scale",
      "md": "https://sassmaker.com/p/scale.md",
      "kind": "profile",
      "description": "The original standalone Scale idle-game prototype, superseded by the game inside SWE Interview Prep."
    },
    {
      "id": "product-war-chest",
      "url": "https://sassmaker.com/p/war-chest",
      "md": "https://sassmaker.com/p/war-chest.md",
      "kind": "profile",
      "description": "An experimental local tactical war game."
    },
    {
      "id": "product-mentionpilot",
      "url": "https://sassmaker.com/p/mentionpilot",
      "md": "https://sassmaker.com/p/mentionpilot.md",
      "kind": "profile",
      "description": "Evidence-first visibility research across AI answers and selected community signals."
    },
    {
      "id": "product-daddyrad",
      "url": "https://sassmaker.com/p/daddyrad",
      "md": "https://sassmaker.com/p/daddyrad.md",
      "kind": "profile",
      "description": "Series home and a local read-only MCP source preview for performance, storage, browser rules and agent context."
    },
    {
      "id": "product-digital-life",
      "url": "https://sassmaker.com/p/digital-life",
      "md": "https://sassmaker.com/p/digital-life.md",
      "kind": "profile",
      "description": "A bounded experimental world of resource-conserving bytecode organisms."
    },
    {
      "id": "product-human-v2",
      "url": "https://sassmaker.com/p/human-v2",
      "md": "https://sassmaker.com/p/human-v2.md",
      "kind": "profile",
      "description": "One-page body experiments with a locally qualified coupled physiology engine, simultaneous mechanisms and explicit yearly/fatal prediction limits."
    },
    {
      "id": "product-ai-badges",
      "url": "https://sassmaker.com/p/ai-badges",
      "md": "https://sassmaker.com/p/ai-badges.md",
      "kind": "profile",
      "description": "Embeddable README badges for declaring AI contribution and welcoming AI-assisted pull requests."
    },
    {
      "id": "product-pinpoint",
      "url": "https://sassmaker.com/p/pinpoint",
      "md": "https://sassmaker.com/p/pinpoint.md",
      "kind": "profile",
      "description": "A local developer preview for selecting an app element, attaching a comment and handing context to a coding agent."
    },
    {
      "id": "product-port-whisperer",
      "url": "https://sassmaker.com/p/port-whisperer",
      "md": "https://sassmaker.com/p/port-whisperer.md",
      "kind": "profile",
      "description": "A command-line port scanner with framework detection and structured output for local development."
    },
    {
      "id": "product-society-relay",
      "url": "https://sassmaker.com/p/society-relay",
      "md": "https://sassmaker.com/p/society-relay.md",
      "kind": "profile",
      "description": "A fixture-driven community repair-planning experiment with human approval, work orders and calendar export."
    }
  ],
  "externalResources": [
    {
      "id": "feedback-package",
      "url": "https://www.npmjs.com/package/@saas-maker/feedback",
      "kind": "documentation",
      "description": "Published feedback package and hosted submission service"
    }
  ],
  "tooling": {
    "url": "https://sassmaker.com/tools",
    "json": "https://sassmaker.com/tools.json",
    "generatedFrom": "sass-maker/saas-maker/tooling",
    "capabilities": [
      {
        "id": "doc:agent-indexing-standard",
        "type": "doc",
        "name": "Fleet Agent Indexing Standard (GEO)",
        "summary": "Make every public fleet surface readable by AI agents without scrolling or running JavaScript. Classic SEO (titles, OG, H1) is out of scope here — see seo-audit for that. Landing copy rules stay in LANDINGSTANDARD.md.",
        "path": "docs/agent-indexing-standard.md"
      },
      {
        "id": "doc:agent-workspaces",
        "type": "doc",
        "name": "Agent workspaces",
        "summary": "Use fleet-workspace for Fleet writer checkouts, dependency installs and heavy commands. It is a local Node CLI with no dependencies; close can use optional read-only GitHub evidence through an already authenticated gh. Implementation tracking: SaaS Maker #179; lockfile-only follo",
        "path": "docs/agent-workspaces.md"
      },
      {
        "id": "doc:ahrefs-site-audit",
        "type": "doc",
        "name": "Canonical-root site audit",
        "summary": "The working path is a local sitemap crawl of Site Health's canonical roots, then source actions for 4xx pages, missing titles, and missing h1s. A report without remediation is incomplete.",
        "path": "docs/ahrefs-site-audit.md"
      },
      {
        "id": "doc:ai-client-standard",
        "type": "doc",
        "name": "Fleet AI client standard",
        "summary": "Status: ratified 2026-08-30 on issue #61; gateway policy revised 2026-10-04, superseding the 2026-08-29 no-gateway decision.",
        "path": "docs/ai-client-standard.md"
      },
      {
        "id": "doc:clarity-fleet-health",
        "type": "doc",
        "name": "Clarity fleet health",
        "summary": "Fleet keeps one Microsoft Clarity project per catalog identity. Two skills own different halves of that, and they must not be confused:",
        "path": "docs/clarity-fleet-health.md"
      },
      {
        "id": "doc:design-quality-policy",
        "type": "doc",
        "name": "Design and quality policy",
        "summary": "The owner-local catalog/projects.json is the source for Fleet design policy. Edit its top-level systems blocks and optional projects[].systems.ui cells. The public tooling manifests are generated projections, never editing inputs. This document explains their meaning and the evid",
        "path": "docs/design-quality-policy.md"
      },
      {
        "id": "doc:landing-surface-classification",
        "type": "doc",
        "name": "Landing-surface classification",
        "summary": "Recorded: 2026-08-30. Refs sass-maker/saas-maker#62.",
        "path": "docs/landing-surface-classification.md"
      },
      {
        "id": "doc:new-project-checklist",
        "type": "doc",
        "name": "Fleet product checklist",
        "summary": "Use this canonical checklist for initial readiness and ongoing product care. New projects require an explicit owner request. Each item points at its owning workflow; this is the index, not another tracker.",
        "path": "docs/new-project-checklist.md"
      },
      {
        "id": "doc:preserved-tooling",
        "type": "doc",
        "name": "Preserved tooling boundary",
        "summary": "The repository contains two intentionally different classes of tooling.",
        "path": "docs/preserved-tooling.md"
      },
      {
        "id": "doc:slop-score",
        "type": "doc",
        "name": "Local website slop scoring",
        "summary": "Selected on 2026-10-02: slop-detect, with Impeccable retained for source checks and wider design review. This is an advisory rendered-page fingerprint, not a design grade or authorship probability.",
        "path": "docs/slop-score.md"
      },
      {
        "id": "script:agent-stack",
        "type": "script",
        "name": "Agent Stack",
        "summary": "Fleet operator script: Agent Stack.",
        "path": "scripts/agent-stack.sh"
      },
      {
        "id": "script:apply-clarity-id",
        "type": "script",
        "name": "Apply Clarity Id",
        "summary": "apply-clarity-id.sh — replace CLARITY_PROJECT_ID placeholder with the real",
        "path": "scripts/apply-clarity-id.sh"
      },
      {
        "id": "script:audit",
        "type": "script",
        "name": "Audit",
        "summary": "Fleet operator script: Audit.",
        "path": "scripts/audit.mjs"
      },
      {
        "id": "script:check-github-actions-policy",
        "type": "script",
        "name": "Check Github Actions Policy",
        "summary": "Credential-free availability checks may run daily when explicitly reviewed.",
        "path": "scripts/check-github-actions-policy.mjs"
      },
      {
        "id": "script:fleet-capabilities",
        "type": "script",
        "name": "Fleet Capabilities",
        "summary": "Fleet operator script: Fleet Capabilities.",
        "path": "scripts/fleet-capabilities.mjs"
      },
      {
        "id": "script:fleet-workspace",
        "type": "script",
        "name": "Fleet Workspace",
        "summary": "Manage agent writer worktrees, pinned-pnpm installs and bounded commands.",
        "path": "scripts/fleet-workspace.mjs"
      },
      {
        "id": "script:git-health",
        "type": "script",
        "name": "Git Health",
        "summary": "Fleet operator script: Git Health.",
        "path": "scripts/git-health.sh"
      },
      {
        "id": "script:github-priority-queue",
        "type": "script",
        "name": "Github Priority Queue",
        "summary": "Fleet operator script: Github Priority Queue.",
        "path": "scripts/github-priority-queue.mjs"
      },
      {
        "id": "script:link-project-agent-assets",
        "type": "script",
        "name": "Link Project Agent Assets",
        "summary": "Fleet operator script: Link Project Agent Assets.",
        "path": "scripts/link-project-agent-assets.sh"
      },
      {
        "id": "script:slop-score",
        "type": "script",
        "name": "Slop Score",
        "summary": "Score rendered websites locally with pinned slop-detect rules and evidence.",
        "path": "scripts/slop-score.mjs"
      },
      {
        "id": "script:unlink-project-agent-assets",
        "type": "script",
        "name": "Unlink Project Agent Assets",
        "summary": "Fleet operator script: Unlink Project Agent Assets.",
        "path": "scripts/unlink-project-agent-assets.sh"
      },
      {
        "id": "script:validate-tooling",
        "type": "script",
        "name": "Validate Tooling",
        "summary": "Fleet operator script: Validate Tooling.",
        "path": "scripts/validate-tooling.mjs"
      },
      {
        "id": "script:verify-local",
        "type": "script",
        "name": "Verify Local",
        "summary": "scripts/verify-local.mjs",
        "path": "scripts/verify-local.mjs"
      },
      {
        "id": "skill:agent-ready",
        "type": "skill",
        "name": "agent-ready",
        "summary": "Subskill of site-health — AI/agent indexing audit (llms.txt, /api/ai, markdown negotiation, robots vs AI crawlers, SPA-fake detection). Route here from site-health for \"can AI read my site\" checks.",
        "path": "skills/agent-ready/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "degradation": "ask",
          "rationale": "Crawler and indexing evidence needs careful technical interpretation."
        }
      },
      {
        "id": "skill:agentic-seo",
        "type": "skill",
        "name": "agentic-seo",
        "summary": "Run an owner-scoped search and AI growth cycle for a Fleet product, from researched opportunities and briefs through writing, QA, publication evidence, conversion measurement and refreshes. Use for agentic SEO setup, recurring content operations, FirstIndex-style workflows or checking their readiness.",
        "path": "skills/agentic-seo/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "deny",
          "rationale": "Search intent, sourced claims, independent QA and attribution require evidence synthesis and product judgment."
        }
      },
      {
        "id": "skill:analyze-storage",
        "type": "skill",
        "name": "analyze-storage",
        "summary": "Create a read-only local disk-usage report whose scan JSON, classified evidence, and static HTML stay under Fleet Workspace. Use when the operator asks what is consuming storage, says a disk is full, wants storage or cache analysis, asks for cleanup candidates, or wants a storage report. Do not use for RAM or process-memory diagnosis.",
        "path": "skills/analyze-storage/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "Scanning and classification are deterministic; interpretation needs moderate context judgment."
        }
      },
      {
        "id": "skill:apple-native",
        "type": "skill",
        "name": "apple-native",
        "summary": "Build, review, test, and qualify Swift or SwiftUI applications across iOS, iPadOS, macOS, and watchOS. Covers Xcode and XcodeGen projects, platform boundaries, entitlements, simulator and physical-device QA, native accessibility, lifecycle, sync, and release preparation. Also the entry point for Apple work in general: it routes archive, signing, upload, TestFlight, App Store, and notarization work to apple-release.",
        "path": "skills/apple-native/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "ask",
          "rationale": "Native implementation work turns on judgment a weaker model gets wrong quietly: SwiftData and CloudKit schema edits are runtime compatibility changes that still compile, platform boundaries decide what is genuinely shared versus cramped into one screen model, and entitlements must not be weakened to make a local build pass. High reasoning is the floor because the failure mode is a passing build that breaks users at runtime."
        }
      },
      {
        "id": "skill:apple-release",
        "type": "skill",
        "name": "apple-release",
        "summary": "Qualify and deliver Apple applications end to end: Xcode archives, signing and entitlements, App Store Connect uploads, TestFlight internal and external testing, App Review submission, Mac App Store distribution, Developer ID signing, notarization, stapling, Gatekeeper checks, and Apple account/support diagnosis. Use when the user explicitly authorizes an Apple-side release action or asks for release readiness.",
        "path": "skills/apple-release/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "deny",
          "rationale": "Release actions are outward-facing and hard to reverse: App Store Connect uploads, TestFlight distribution, App Review submission, notarization, and stapling, all driven against real signing identities and credentials that must never be printed or copied. The skill is gate-based and keeps distribution channels and receipts separate. Degradation is denied rather than asked because a weaker model driving a signing or submission flow can take an irreversible action before anyone reviews it."
        }
      },
      {
        "id": "skill:astra-orchestrator",
        "type": "skill",
        "name": "astra-orchestrator",
        "summary": "Orchestrate Codex work with an Astra root and bounded Luna subagents when the user explicitly asks for agents, delegation, parallel work, or independent multi-agent review, or when current project instructions require it. Skip ordinary root-only work and tasks that cannot benefit from independent workstreams.",
        "path": "skills/astra-orchestrator/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "ask",
          "rationale": "The root must decompose work, preserve permissions and file ownership, reconcile independent evidence, and verify the integrated result."
        }
      },
      {
        "id": "skill:call-claude-code",
        "type": "skill",
        "name": "call-claude-code",
        "summary": "Delegate work to a fresh headless Claude Code instance as a teammate — a parallel worker in a worktree, a fresh-context review unbiased by the current conversation, or a run under the other profile (personal ~/.claude vs work ~/.claude-work, separate auth/config). Use when the user asks to call/delegate to claude or claude-work, or when you want an independent Claude with clean context.",
        "path": "skills/call-claude-code/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "The current runtime briefs and verifies a separately configured teammate."
        }
      },
      {
        "id": "skill:call-codex",
        "type": "skill",
        "name": "call-codex",
        "summary": "Delegate repo-local coding work to OpenAI Codex CLI as a teammate agent — scoped implementation, mechanical refactors, test-fix loops, or an independent second-opinion code review from a different model family. Use when the user asks to call/delegate to codex, wants a second opinion on a diff, or when a well-scoped implementation task can run in parallel (e.g. in a worktree) while you do other work. Not for strategy, taste-heavy UX, or vague requirements.",
        "path": "skills/call-codex/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "The current runtime briefs and verifies a separately configured teammate."
        }
      },
      {
        "id": "skill:call-cursor",
        "type": "skill",
        "name": "call-cursor",
        "summary": "Delegate coding work to Cursor Agent CLI (cursor-agent) as a teammate — fast scoped implementation with a clean JSON envelope, read-only plan/ask modes, or access to Cursor's model roster (GPT, Claude, Gemini variants) under a separate subscription quota. Use when the user asks to call/delegate to cursor, or as an implementation fallback when other teammates are quota-limited.",
        "path": "skills/call-cursor/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "The current runtime briefs and verifies a separately configured teammate."
        }
      },
      {
        "id": "skill:call-devin",
        "type": "skill",
        "name": "call-devin",
        "summary": "Optional proprietary Devin teammate. Use only when the user explicitly asks for Devin or approves the spend/lock-in tradeoff.",
        "path": "skills/call-devin/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "degradation": "ask",
          "rationale": "Paid external delegation needs precise scope, spend, permission, and verification judgment."
        }
      },
      {
        "id": "skill:call-grok",
        "type": "skill",
        "name": "call-grok",
        "summary": "Delegate coding work to Grok CLI (xAI's terminal agent) as a teammate — scoped implementation with native worktree isolation, best-of-N parallel attempts on hard tasks, or a cross-model second opinion. Use when the user asks to call/delegate to grok, wants N parallel attempts at one task, or wants an opinion from a non-Anthropic/non-OpenAI model family.",
        "path": "skills/call-grok/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "The current runtime briefs and verifies a separately configured teammate."
        }
      },
      {
        "id": "skill:call-teammate",
        "type": "skill",
        "name": "call-teammate",
        "summary": "Delegate work to Codex, Grok, Cursor, a fresh Claude Code instance, Hermes, or optional Devin. Use for independent review, parallel attempts, bounded specialist work, and explicit-spend external agent runs.",
        "path": "skills/call-teammate/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "low"
          },
          "degradation": "allow",
          "rationale": "This parent performs lightweight teammate routing before loading one provider-specific skill."
        }
      },
      {
        "id": "skill:catalog-freshness",
        "type": "skill",
        "name": "catalog-freshness",
        "summary": "Report on staleness and drift in the public catalogs — expired funding deadlines still marked open, launch destinations not verified recently, conflicting source claims, and (opt-in) live liveness probes that catch dead, parked, or hijacked domains. Use for \"what's gone stale\", \"which deadlines passed\", \"re-verify the launch catalog\", or scheduled refresh sweeps before updating launchdesk.json or funding.json.",
        "path": "skills/catalog-freshness/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "economy",
            "reasoning": "low"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "low"
          },
          "degradation": "allow",
          "rationale": "Deterministic date comparisons plus optional fetch-and-classify probes; verdicts are heuristic-flagged for operator review, no reasoning required."
        }
      },
      {
        "id": "skill:clarity-fleet-health",
        "type": "skill",
        "name": "clarity-fleet-health",
        "summary": "Audit Microsoft Clarity across every Fleet product, including project-ID integrity, source wiring, desired capability coverage, provider settings, cached aggregate traffic, and explicit live traffic refreshes. Use for Clarity counts, fleet-wide Clarity health, missing analytics, feature adoption, or requests to test Clarity on all applications; for project creation or source installation, follow its rollout reference.",
        "path": "skills/clarity-fleet-health/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "The deterministic collectors own execution; the agent interprets bounded per-project evidence and preserves privacy and quota boundaries."
        }
      },
      {
        "id": "skill:cloudflare-spend-guard",
        "type": "skill",
        "name": "cloudflare-spend-guard",
        "summary": "Audit Cloudflare costs, billable usage, free-tier or paid-plan exposure, quota exhaustion, project necessity, and safe optimization opportunities for Fleet. Use when the user asks whether Cloudflare is charging them, how likely a project is to cost real money, what is driving a bill, whether current Workers/Pages/D1/R2/KV/Queues/Durable Objects/AI usage is needed, which resources look wasteful, what can be optimized, or how to prevent surprise cloud spend.",
        "path": "skills/cloudflare-spend-guard/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "deny",
          "rationale": "Cost, quota, and provider evidence can drive consequential operational decisions."
        }
      },
      {
        "id": "skill:code-cleanup",
        "type": "skill",
        "name": "code-cleanup",
        "summary": "Run Fleet code cleanup, dependency health checks, and guarded package upgrades in one place. Use for unused code or packages, outdated or vulnerable dependencies, Knip, lint/typecheck/test/format-check orchestration, Bundlephobia evidence, package recommendations, manifest or lockfile edits, and Fleet-wide dependency checks.",
        "path": "skills/code-cleanup/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "degradation": "ask",
          "rationale": "Dependency and dead-code changes require repository judgment beyond mechanical scans."
        }
      },
      {
        "id": "skill:content-coverage",
        "type": "skill",
        "name": "content-coverage",
        "summary": "Audit whether a product has the SEO and search-intent pages expected in its category, find competitive content gaps, draft source-backed pages, and publish approved pages through the owning repository. Use for SEO article coverage, comparison/alternative/use-case/integration pages, content inventories, or requests to create missing durable search pages.",
        "path": "skills/content-coverage/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "deny",
          "rationale": "Competitive research, claims, information architecture, and public copy need strong judgment."
        }
      },
      {
        "id": "skill:design-workflow",
        "type": "skill",
        "name": "design-workflow",
        "summary": "Fleet's single design entry point for visual or frontend work, and for when the owner calls a design ugly, generic, bland, or template-like. Default lane is PRESERVE (keep the established look, do good work, check the rendered result). OVERHAUL (3-4 rendered directions, owner picks) only for a brand-new surface or an explicit redesign request. Also routes specialist design references (inspiration, slop check, evidence interfaces, components, effects, 3D, Tailwind/markup mechanics).",
        "path": "skills/design-workflow/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "ask",
          "rationale": "Product design requires taste, visual synthesis, and reliable multi-step review."
        }
      },
      {
        "id": "skill:distributed-brand-search",
        "type": "skill",
        "name": "distributed-brand-search",
        "summary": "Research and measure third-party brand profiles and original platform-native content for organic discovery and AI citations. Use for profile SEO, multi-platform search visibility, parasite SEO studies, indexing-service evaluation, or testing whether distribution improves citations; not a substitute for technical SEO or a launch campaign.",
        "path": "skills/distributed-brand-search/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "deny",
          "rationale": "Platform qualification, indexing evidence, public claims, and attribution require careful research and strong judgment."
        }
      },
      {
        "id": "skill:drank",
        "type": "skill",
        "name": "drank",
        "summary": "Look up and track Domain Rating (DR) for any domain, or report DR history for the owner's Fleet domains. Uses the public drank endpoint at domains.sassmaker.com — no API key, no signup. Use for \"what's the DR of X\", \"rank my domains by DR\", \"did codevetter.com's DR move\", or comparing a domain against the fleet board.",
        "path": "skills/drank/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "economy",
            "reasoning": "low"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "low"
          },
          "degradation": "allow",
          "rationale": "Single-endpoint GET lookups and snapshot sorting; no multi-step reasoning required."
        }
      },
      {
        "id": "skill:fleet-audit",
        "type": "skill",
        "name": "fleet-audit",
        "summary": "Audit the fleet — git/CI health, PROJECT_STATUS sync, or full recurring audit. Use when the user asks \"is the fleet healthy?\", \"what's the fleet status?\", \"what's everyone working on?\", \"audit the fleet\", \"check all projects\", \"what's broken?\", or wants a fleet-wide snapshot before a deploy or audit pass.",
        "path": "skills/fleet-audit/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "Most evidence is script-produced, with moderate reasoning needed for fleet triage."
        }
      },
      {
        "id": "skill:fleet-deploy-parity",
        "type": "skill",
        "name": "fleet-deploy-parity",
        "summary": "Check whether live Fleet products match origin/main (SHA-tagged Workers at 100% traffic, green current-main Actions), and gate a single project's deploy readiness. Use for \"is production in sync with main?\", \"what's not deployed?\", \"can I deploy X?\", or \"is X safe to deploy?\".",
        "path": "skills/fleet-deploy-parity/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "degradation": "ask",
          "rationale": "Cross-project deployment evidence needs precise reconciliation and honest unknowns."
        }
      },
      {
        "id": "skill:fleet-init",
        "type": "skill",
        "name": "fleet-init",
        "summary": "Scaffold a new fleet project — create the GitHub repo, AGENTS.md, PROJECT_STATUS.md, .gitignore, and CI workflow. Use only when the owner explicitly asks to create a new project (\"create a new project called X\", \"scaffold X\", \"init a new repo for X\"). Never propose or start a new project on your own.",
        "path": "skills/fleet-init/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "degradation": "ask",
          "rationale": "Project scaffolding changes several durable repository and registry surfaces."
        }
      },
      {
        "id": "skill:fleet-ops",
        "type": "skill",
        "name": "fleet-ops",
        "summary": "Route Fleet-wide audits, deploy checks, public-product smoke tests, spend reviews, project setup, and workspace decisions to the relevant subskill.",
        "path": "skills/fleet-ops/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "low"
          },
          "degradation": "allow",
          "rationale": "This parent performs lightweight intent routing before loading one specialist skill."
        }
      },
      {
        "id": "skill:fleet-workspace",
        "type": "skill",
        "name": "fleet-workspace",
        "summary": "Use when working across the Fleet workspace, deciding whether work belongs in a child project, Fleet policy, or project-local task tracking.",
        "path": "skills/fleet-workspace/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "ask",
          "rationale": "Cross-project ownership and policy decisions have broad repository consequences."
        }
      },
      {
        "id": "skill:flow-veo-browser",
        "type": "skill",
        "name": "flow-veo-browser",
        "summary": "Drive three experimental Google Ultra accounts in Flow (Nano Banana image generation + Veo video generation) via a browser agent, spending only included subscription Flow credits. Use when asked to generate images/videos with Flow or Veo, audit Flow credit balances, distribute generations across the Ultra accounts, batch creative briefs, or archive generated media. Never substitute paid APIs (Vertex/Gemini) for browser generation.",
        "path": "skills/flow-veo-browser/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "ask",
          "rationale": "Browser generation, credit safety, and provenance require careful multi-step verification."
        }
      },
      {
        "id": "skill:geo-observatory",
        "type": "skill",
        "name": "geo-observatory",
        "summary": "Subskill of site-health — recurring GEO/SEO outcome measurement: probe configured queries on live web search, classify A/B/C, append to the ledger, regenerate the trend report. Route here from site-health for \"did results move\" and scheduled weekly runs.",
        "path": "skills/geo-observatory/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "degradation": "ask",
          "rationale": "Visibility trends require cautious attribution across noisy search evidence."
        }
      },
      {
        "id": "skill:github-actions-health",
        "type": "skill",
        "name": "github-actions-health",
        "summary": "Audit GitHub Actions across Fleet or selected repositories when asked to check all workflows, CI failures, stuck runs, or scheduled automation health. Reports current failures separately from old runs, PR failures, and coverage gaps.",
        "path": "skills/github-actions-health/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "Read-only collection is mechanical; event, revision, schedule and owner-policy distinctions require careful judgment."
        }
      },
      {
        "id": "skill:jules-cloud-worker",
        "type": "skill",
        "name": "jules-cloud-worker",
        "summary": "Use a pool of three Google Ultra Jules API accounts as asynchronous coding workers, primarily for high-value test generation across repos. Use when asked to run a Jules test-sweep, dispatch bounded tasks to Jules, poll Jules sessions, review Jules PRs, or check Jules account usage/quota. Jules is a batch worker, never the primary interactive agent and never an auto-merger.",
        "path": "skills/jules-cloud-worker/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "ask",
          "rationale": "Bounded cloud-worker dispatch and independent PR review require careful guardrail and lifecycle reasoning."
        }
      },
      {
        "id": "skill:launch-campaign",
        "type": "skill",
        "name": "launch-campaign",
        "summary": "Plan and run a one-off launch for a new product or major feature, including honest directory-submission runs with the launchkit toolkit. Use when the owner asks to launch a product, submit to directories, plan a launch run, or runs /launchkit. Builds one exact plan, gets owner approval of it, then executes only the approved items.",
        "path": "skills/launch-campaign/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "deny",
          "rationale": "Positioning, public copy, channel eligibility, and external actions require strong judgment."
        }
      },
      {
        "id": "skill:local-ports-cleanup",
        "type": "skill",
        "name": "local-ports-cleanup",
        "summary": "Inspect, diagnose, and safely clean local listening ports and development-server processes with the installed `ports` CLI. Use when a local port is occupied, stale or orphaned dev processes should be stopped, a project's ports need clearing before restart, or an operator asks what is listening locally. Preserve healthy Docker, database, system, and unrelated project listeners unless explicitly named.",
        "path": "skills/local-ports-cleanup/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "deny",
          "rationale": "Local process termination is bounded but requires careful ownership and scope judgment."
        }
      },
      {
        "id": "skill:marketing",
        "type": "skill",
        "name": "marketing",
        "summary": "Develop evidence-backed positioning, customer research, marketing copy and launch plans for Fleet products. Use for messaging and distribution work, not deployment, visual design or technical SEO audits.",
        "path": "skills/marketing/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "Positioning and customer evidence benefit from strong synthesis; bounded drafting remains useful with clearly stated research limits."
        }
      },
      {
        "id": "skill:media-acquisition",
        "type": "skill",
        "name": "media-acquisition",
        "summary": "Inspect or acquire public audio, video, subtitles, thumbnails, and media metadata with yt-dlp for an explicit research, archival, or product workflow; not for playback, private content, DRM bypass, or account scraping.",
        "path": "skills/media-acquisition/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "Format selection is mechanical, while authorization, rate limits, and reproducible receipts require moderate judgment."
        }
      },
      {
        "id": "skill:mobile-task-control",
        "type": "skill",
        "name": "mobile-task-control",
        "summary": "Start, supervise, and report durable Fleet work requested from Telegram or another chat surface. Use when the operator asks to spin up work, run something in the background, show task status, or test mobile control.",
        "path": "skills/mobile-task-control/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "Durable task control is bounded but must preserve scope and truthful status."
        }
      },
      {
        "id": "skill:name-domains",
        "type": "skill",
        "name": "name-domains",
        "summary": "Generate tasteful, likely-available domain names for a startup idea. Orchestrated pipeline (run-pipeline.sh): taste scoring, collision scan, two-pass RDAP/DNS availability, markdown shortlist. Reads PROJECT_STATUS.md in fleet repos. Use for domain names, brandable domains, naming help, \"name my startup\", or /name-domains. No backend, no signup.",
        "path": "skills/name-domains/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "ask",
          "rationale": "Naming quality depends on taste, semantic judgment, and collision evidence."
        }
      },
      {
        "id": "skill:ping",
        "type": "skill",
        "name": "ping",
        "summary": "Wire a fleet app to App Health application logs (Slack-alertable events like signup, waitlist.join, payment.failed) or add a new alertable event. Use when asked to \"alert on X\", \"notify me when someone signs up\", \"add a ping/log\", or to add an app to the Logs tab.",
        "path": "skills/ping/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "low"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "low"
          },
          "degradation": "allow",
          "rationale": "Drop-in client copy plus a single auth-hook integration against documented App Health patterns; multi-app wiring is mechanical."
        }
      },
      {
        "id": "skill:public-product-smoke",
        "type": "skill",
        "name": "public-product-smoke",
        "summary": "Audit whether public websites actually work for users through bounded browser journeys. Use when the user asks to click around a site or the Fleet, verify guest usability, test each product's unique pages, find blank or broken routes, exercise search/detail/primary actions, or produce an actionable public-product repair queue. This is a read-only production audit, not SEO, performance measurement, native-app testing, or automatic repair.",
        "path": "skills/public-product-smoke/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "degradation": "ask",
          "rationale": "Browser journeys need reliable interpretation of product-specific behavior and failures."
        }
      },
      {
        "id": "skill:seo-audit",
        "type": "skill",
        "name": "seo-audit",
        "summary": "Subskill of site-health — on-page SEO audit (title/meta/canonical/OG/hreflang/JSON-LD/sitemap/headings/alt/SSR leaks) for any URL list. Route here from site-health for \"check my SEO\" requests.",
        "path": "skills/seo-audit/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "degradation": "ask",
          "rationale": "On-page evidence is partly mechanical but prioritization requires technical SEO judgment."
        }
      },
      {
        "id": "skill:seo-research",
        "type": "skill",
        "name": "seo-research",
        "summary": "Research keywords, search competitors, backlink prospects, and local-search opportunities with evidence and optional provider metrics; use for SEO market decisions, not technical on-page audits, Search Console collection, or content publication.",
        "path": "skills/seo-research/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "deny",
          "rationale": "Search intent, competitor identity, source quality, and provider estimates require strong evidence synthesis and product judgment."
        }
      },
      {
        "id": "skill:site-health",
        "type": "skill",
        "name": "site-health",
        "summary": "Route site health, Microsoft Clarity traffic, AI indexing, technical SEO, agentic growth cycles, competitive content coverage, performance, visibility trends, and public guest-journey audits to one relevant Fleet subskill.",
        "path": "skills/site-health/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "low"
          },
          "degradation": "allow",
          "rationale": "This parent routes a request to one health specialist and does not perform the audit itself."
        }
      },
      {
        "id": "skill:skills-validate",
        "type": "skill",
        "name": "skills-validate",
        "summary": "Validate a Fleet agent skill by clean-room testing: a fresh agent with no session history attempts real work (or a zero-cost plan) using only the skill's text, and the run is graded against a rubric so failures become specific edits to the skill. Use for \"validate this skill\", \"test the skill\", \"does this skill work\", \"skill QA\", or before merging a new or changed skill under tooling/skills. Not for validating product code.",
        "path": "skills/skills-validate/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "ask",
          "rationale": "Grading a transcript against a rubric and pinning each defect to the exact missing sentence is judgment work; a weak pass rubber-stamps broken skills."
        }
      },
      {
        "id": "skill:spec-driven",
        "type": "skill",
        "name": "spec-driven",
        "summary": "Opt-in spec workflow for large fleet features. Use only when the owner asks for spec-driven work, a spec, or a tracking issue, or when a feature is genuinely large or cross-repo. Writes the proposal, design, specs, and task checklist; creates a GitHub tracking issue only when the owner wants tracking. Small fixes and ordinary scoped changes skip it.",
        "path": "skills/spec-driven/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "high"
          },
          "degradation": "ask",
          "rationale": "Feature scoping and architectural decisions shape the entire implementation."
        }
      },
      {
        "id": "skill:test-quality",
        "type": "skill",
        "name": "test-quality",
        "summary": "Identify high-value regression tests, review assertion quality, diagnose flaky or low-signal suites, and design replayable adversarial workloads. Use for concrete test-quality work, not general code cleanup, startup readiness, or release approval.",
        "path": "skills/test-quality/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "frontier",
            "reasoning": "high"
          },
          "minimum": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "Fault mechanisms and test oracles require reasoning about behavior, not coverage alone."
        }
      },
      {
        "id": "skill:web-extraction",
        "type": "skill",
        "name": "web-extraction",
        "summary": "Extract structured public web content or build a bounded crawl when repeatable page data is needed; use for datasets and corpora, not ordinary web research, browser interaction, authenticated pages, or technical SEO audits.",
        "path": "skills/web-extraction/SKILL.md",
        "executionProfile": {
          "schema": "fleet.skill-execution-profile.v1",
          "recommended": {
            "intelligence": "balanced",
            "reasoning": "medium"
          },
          "minimum": {
            "intelligence": "economy",
            "reasoning": "medium"
          },
          "degradation": "allow",
          "rationale": "Backend choice and extraction validation need moderate judgment; bounded execution remains observable."
        }
      },
      {
        "id": "template:agent-surfaces/api-ai.example",
        "type": "template",
        "name": "Api Ai Example",
        "summary": "{ \"name\": \"example\", \"version\": \"1\", \"url\": \"https://example.com\", \"llms\": \"https://example.com/llms.txt\", \"llmsFull\": null, \"sitemap\": \"https://example.com/sitemap.xml\", \"markdown\": { \"suffix\": \".md\", \"negotiation\": true }, \"surfaces\": [ { \"id\": \"home\", \"url\": \"https://example.c",
        "path": "templates/agent-surfaces/api-ai.example.json"
      },
      {
        "id": "template:agent-surfaces/index.md",
        "type": "template",
        "name": "{{NAME}}",
        "summary": "{{SUMMARY}}",
        "path": "templates/agent-surfaces/index.md.tmpl"
      },
      {
        "id": "template:agent-surfaces/llms.txt",
        "type": "template",
        "name": "{{NAME}}",
        "summary": "> {{SUMMARY}}",
        "path": "templates/agent-surfaces/llms.txt.tmpl"
      },
      {
        "id": "template:agent-surfaces/robots-ai-snippet",
        "type": "template",
        "name": "Allow major AI crawlers on public content (agent-indexing standard).",
        "summary": "User-agent: ChatGPT-User Allow: /",
        "path": "templates/agent-surfaces/robots-ai-snippet.txt"
      },
      {
        "id": "template:api-timing",
        "type": "template",
        "name": "Api Timing",
        "summary": "/  Client-side API call timing via the Resource Timing API.   Polls performance.getEntriesByType('resource') for fetch/XHR entries,  groups them by normalized route, and emits apicalltiming events to  PostHog with p50/p90/max duration + TTFB. This captures the full  round-trip la",
        "path": "templates/api-timing.ts"
      },
      {
        "id": "template:biome.base",
        "type": "template",
        "name": "Biome Base",
        "summary": "{ \"$schema\": \"../../../nodemodules/@biomejs/biome/configurationschema.json\", \"root\": false, \"extends\": [\"ultracite/biome/core\"], \"vcs\": { \"enabled\": true, \"clientKind\": \"git\", \"useIgnoreFile\": true }, \"files\": { \"ignoreUnknown\": true, \"includes\": [ \"\", \"!!/nodemodules\", \"!!/.next",
        "path": "templates/biome.base.json"
      },
      {
        "id": "template:clarity-snippet",
        "type": "template",
        "name": "Clarity Snippet",
        "summary": "<!-- Microsoft Clarity snippet — session replay + heatmaps.",
        "path": "templates/clarity-snippet.html"
      },
      {
        "id": "template:design-review",
        "type": "template",
        "name": "Design Review",
        "summary": "{ \"$schema\": \"fleet.design-review.v2\", \"version\": 2, \"project\": \"replace-with-project-id\", \"target\": \"replace-with-reviewed-surface\", \"surfaceMode\": \"operate\", \"mode\": \"preserve\", \"register\": \"product\", \"context\": { \"product\": \"PRODUCT.md\", \"design\": \"DESIGN.md\" }, \"direction\": {",
        "path": "templates/design-review.json"
      },
      {
        "id": "template:ios-landing/deprecated",
        "type": "template",
        "name": "Retired: the copy-to-fork iOS landing template",
        "summary": "Status: retired 2026-08-30. This directory no longer contains a template. Do not copy anything from here.",
        "path": "templates/ios-landing/DEPRECATED.md"
      },
      {
        "id": "template:web-landing/astro.config",
        "type": "template",
        "name": "Astro Config",
        "summary": "import { defineConfig } from 'astro/config';",
        "path": "templates/web-landing/astro.config.mjs"
      },
      {
        "id": "template:web-landing/package",
        "type": "template",
        "name": "Package",
        "summary": "{ \"name\": \"web-product-landing\", \"private\": true, \"type\": \"module\", \"packageManager\": \"pnpm@10.33.2\", \"scripts\": { \"dev\": \"astro dev\", \"build\": \"astro build\" }, \"devDependencies\": { \"@astrojs/check\": \"0.9.10\", \"astro\": \"7.2.0\", \"typescript\": \"6.0.3\" }, \"pnpm\": { \"onlyBuiltDepende",
        "path": "templates/web-landing/package.json"
      },
      {
        "id": "template:web-landing/readme",
        "type": "template",
        "name": "Web product landing template",
        "summary": "This is the canonical starting point for a Fleet web landing page. Use it for a web product, developer tool, internal utility, or dashboard that needs a clear public first view without phone screenshots.",
        "path": "templates/web-landing/README.md"
      },
      {
        "id": "template:web-landing/src/layouts/sitelayout",
        "type": "template",
        "name": "SiteLayout",
        "summary": "<!doctype html> <html lang=\"en\"> <head> <meta charset=\"UTF-8\" /> <meta name=\"viewport\" content=\"width=device-width\" /> <meta name=\"description\" content={description} /> <link rel=\"canonical\" href={canonical} /> <meta property=\"og:type\" content=\"website\" /> <meta property=\"og:titl",
        "path": "templates/web-landing/src/layouts/SiteLayout.astro"
      },
      {
        "id": "template:web-landing/src/pages/index",
        "type": "template",
        "name": "Index",
        "summary": "<SiteLayout> <header class=\"shell nav\"> <a class=\"brand\" href=\"/\">{site.name}</a> <nav aria-label=\"Primary\"> <a href=\"#how\">How it works</a> <a class=\"nav-action\" href={site.primary.href}>{site.primary.label}</a> </nav> </header>",
        "path": "templates/web-landing/src/pages/index.astro"
      },
      {
        "id": "template:web-landing/src/site.config",
        "type": "template",
        "name": "Site Config",
        "summary": "export type SiteConfig = { name: string; projectId: string; url: string; title: string; description: string; eyebrow: string; headline: string; lede: string; primary: { label: string; href: string }; secondary?: { label: string; href: string }; artifact: { label: string; title: s",
        "path": "templates/web-landing/src/site.config.ts"
      },
      {
        "id": "template:web-landing/src/styles/global",
        "type": "template",
        "name": "Global",
        "summary": "@layer reset, base, components;",
        "path": "templates/web-landing/src/styles/global.css"
      },
      {
        "id": "template:web-landing/tsconfig",
        "type": "template",
        "name": "Tsconfig",
        "summary": "{ \"extends\": \"astro/tsconfigs/strict\" }",
        "path": "templates/web-landing/tsconfig.json"
      }
    ]
  },
  "auth": {
    "public": true,
    "notes": "Private Fleet controls are intentionally excluded."
  },
  "tokenImpact": {
    "name": "Tokens Spent for the World",
    "metric": "Verified provider-reported model tokens from contributing products",
    "schemaVersion": 1,
    "snapshotDate": "2026-08-09",
    "lastUpdatedAt": "2026-08-09T12:20:08.480796+00:00",
    "previousLifetimeTokens": 165379019338,
    "lifetimeTokens": 165444915616,
    "todayTokens": 65896278,
    "countriesServed": 0,
    "projectsContributing": 1,
    "coverage": "Verified CodeVetter usage baseline. Additional products join the cumulative total through authoritative daily seeds.",
    "pulses": []
  },
  "products": [
    {
      "id": "codevetter",
      "name": "CodeVetter",
      "description": "Execution-backed verification for AI-written software changes — local-first and inspectable.",
      "url": "https://codevetter.com",
      "tier": "core",
      "category": "utility",
      "priority": "P1",
      "spotlight": true,
      "lifecycle": "primary",
      "shareable": true,
      "maturity": "experiment",
      "changelogUrl": "https://codevetter.com/changelog",
      "repositoryUrl": "https://github.com/Codevetter/codevetter",
      "roadmapUrl": "https://github.com/Codevetter/codevetter/issues",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "CodeVetter verifies whether AI-written software changes actually satisfy their task, not merely whether the diff looks plausible.",
        "audience": "Developers and teams shipping code produced with AI agents.",
        "outcome": "Higher confidence that an agent completed the requested change correctly and safely.",
        "mechanism": "Local-first review combines repository context, executable checks, targeted evaluation, and inspectable verification receipts.",
        "proof": "Published macOS 1.16.6 is notarized: all public asset hashes match the release, and its bundled app passes strict signature, Gatekeeper and stapling checks. Thirteen packaged runtime modules match release source; 39 packaged provenance, coverage and source-snapshot checks pass on Node 24. An earlier bounded CLI fixture demonstrated real Codex review, pass/fail checks and persisted receipts.",
        "nextAction": "Try the current Mac release on a small local repository. Use the documented manual update path until in-app installation is qualified."
      },
      "footerArt": {
        "src": "/footer-art/codevetter.webp",
        "width": 2172,
        "height": 724,
        "alt": "Finely drawn dark verification bench with task and change folios, a central bounded execution chamber, and retained evidence to the right.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for CodeVetter",
        "sha256": "36588b9c1d0a02b0b04b0d8e9cbeb9661440b2927d7e9a12f7b6a0e176fae910"
      }
    },
    {
      "id": "posttrainllm",
      "name": "PostTrainLLM",
      "description": "An experimental browser model playground: run small language models locally with visible generation metrics.",
      "url": "https://posttrainllm.com",
      "tier": "core",
      "category": "utility",
      "priority": "P1",
      "spotlight": true,
      "lifecycle": "primary",
      "shareable": true,
      "maturity": "experiment",
      "changelogUrl": "https://posttrainllm.com/changelog",
      "repositoryUrl": "https://github.com/PostTrainLLM/posttrainllm",
      "roadmapUrl": "https://github.com/PostTrainLLM/posttrainllm/issues",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "PostTrainLLM turns local model-training experiments into measured, reproducible recipes for useful specialist language models.",
        "audience": "Practitioners learning or running post-training workflows on personal Apple hardware and in the browser.",
        "outcome": "Train, evaluate, compare, and run specialist models with evidence about what worked and why.",
        "mechanism": "A local factory joins datasets, training methods, evaluation, experiment tracking, and inference into repeatable recipes.",
        "proof": "The project contains working browser and Mac-local experiments, evaluation infrastructure, and reproducible training paths.",
        "nextAction": "Explore the measured recipes and follow new experiments as they produce reproducible proof rather than scale claims."
      },
      "footerArt": {
        "src": "/footer-art/posttrainllm.webp",
        "width": 2170,
        "height": 725,
        "alt": "PostTrainLLM: A specialist-model recipe atelier centers a measured recipe tray and paired comparison samples. Sorted local material enters a modest experimental apparatus; a comparison notebook and source cabinet remain distinct at the wings.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for PostTrainLLM",
        "sha256": "63c2514f2a3e4e225277cda029a8cc990836ca91c53e213b418b0f4a12040f7c"
      }
    },
    {
      "id": "anchor",
      "name": "Anchor",
      "description": "A local-first day planner and focus timer for Mac, iPhone, and Apple Watch that explains the gap between the schedule you planned and the day you lived.",
      "url": "https://anchor.significanthobbies.com",
      "tier": "active",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "in-progress",
      "changelogUrl": "https://anchor.significanthobbies.com/changelog",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "Anchor helps a person plan a realistic day, follow the current intention, and learn why the day lived differed from the day planned.",
        "audience": "A person moving between Mac, iPhone, and Apple Watch who wants a deliberate day rather than another task list.",
        "outcome": "Make more realistic plans, recover from interruptions, and protect activities that genuinely matter without moralizing imperfect adherence.",
        "mechanism": "Native apps combine schedule blocks, recurring routines, wall-clock focus sessions, interruption evidence, and an end-of-day divergence review.",
        "proof": "Public notarized Mac build 20 remains available; local build 25 has passed a bounded personal workflow but Gatekeeper rejects it as unnotarized, so it is not a public update.",
        "nextAction": "Use Anchor through a real day and review the divergence evidence; let repeated lived patterns decide the next change."
      },
      "footerArt": {
        "src": "/footer-art/anchor.webp",
        "width": 2171,
        "height": 724,
        "alt": "Anchor: A day-planning terrace centers the crossing between a planned stepping-stone path and a real-life detour. A pause bench, simple clock, task tokens and end-of-day notebook make interruptions ordinary.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Anchor",
        "sha256": "efcbdc055f2e6aa2fd4822868019c132a5bb27125ce90641cae8919954ef9926"
      }
    },
    {
      "id": "anime-list",
      "name": "Anime List",
      "description": "Anime and manga discovery with multi-axis filtering and personal watchlists.",
      "url": "https://anime.significanthobbies.com",
      "tier": "secondary",
      "category": "media",
      "priority": "P4",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "maintained",
      "changelogUrl": "https://anime.significanthobbies.com/changelog",
      "repositoryUrl": "https://github.com/Significant-Hobbies/anime-list",
      "roadmapUrl": "https://github.com/Significant-Hobbies/anime-list/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "Anime List helps anime and manga fans filter a large catalogue, discover what fits, and maintain a personal watchlist.",
        "audience": "Anime and manga fans who want more precise discovery than a standard catalogue provides.",
        "outcome": "Find suitable titles quickly and keep personal viewing or reading plans organized.",
        "mechanism": "Multi-field search, shareable filters, seasonal discovery, taste tools, schedules, and signed-in watchlists operate over a large synced catalogue.",
        "proof": "The production app serves roughly 35,000 titles and is frequently used; broader community features are intentionally out of scope.",
        "nextAction": "Search the catalogue or use the watchlist; maintenance focuses on data quality and core discovery reliability."
      },
      "footerArt": {
        "src": "/footer-art/anime-list.webp",
        "width": 2168,
        "height": 725,
        "alt": "Anime List: An original animation-club room centers a personal watch shelf and one invented illustrated story card. A projector, original abstract story panels and a seasonal moon-cycle window frame the scene.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Anime List",
        "sha256": "b2370994f1f05837bada8d4bd232dbdf8f809e06da6fa9bac3f5817c188c119e"
      }
    },
    {
      "id": "app-health",
      "name": "App Health",
      "description": "Web analytics, product events, logs, and endpoint health in one workspace.",
      "url": "https://health.sassmaker.com",
      "tier": "active",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "public-ready",
      "changelogUrl": "https://health.sassmaker.com/changelog",
      "repositoryUrl": "https://github.com/sass-maker/app-health",
      "roadmapUrl": "https://github.com/sass-maker/app-health/issues",
      "pillarId": "visibility",
      "purposeContract": {
        "purpose": "App Health helps product teams understand web traffic, intentional user actions, and application health across their projects.",
        "audience": "Product managers, founders, and product teams; developers connect the instrumentation.",
        "outcome": "See who is active as browser-session counts, which pages and named events are used, and whether backend failures explain product friction.",
        "mechanism": "A small browser tracker and explicit named events feed workspace-scoped analytics; service SDKs and OTLP add aggregate endpoint health in the same dashboard.",
        "proof": "Production Google signup, returning login, sign-out and project creation verified; own signup/project milestone logs remain exactly one each. Known analytics traffic returned 3 sessions, 4 page views and 2 named events without duplicate-batch inflation, with correct 1h/24h boundaries and referral sources. Public live page and revocation verified. JavaScript SDK 0.4.0 published and artifact integrity checked. See app-health/docs/release-2026-09-12.md; broader analytics parity and remotely published Swift package remain follow-up work.",
        "nextAction": "Sign in with Google, add a project and environment, then install only the analytics, endpoint, or logging capability you need."
      },
      "footerArt": {
        "src": "/footer-art/app-health.webp",
        "width": 2169,
        "height": 725,
        "alt": "App Health: A request-and-event relay station centers a single parcel at an inspection desk. Separate request rails and closed diagnostic drawers remain bounded, distinct from Site Health's whole-portfolio project inventory scene.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for App Health",
        "sha256": "d89c904afcbb6b379ecdb0aeb394609af83c63f1703f637dec6df5e5fde08886"
      }
    },
    {
      "id": "browserdaddy",
      "name": "BrowserDaddy",
      "description": "A local-first Mac browsing intelligence app for a unified history archive and real attention tracking.",
      "url": "https://browser.daddyrad.com/",
      "tier": "active",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "preview",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "BrowserDaddy helps people understand their browsing history and attention locally across browsers.",
        "audience": "Mac users who want a unified, inspectable record of browsing and attention.",
        "outcome": "Review browsing history and attention without sending the archive to a hosted service.",
        "mechanism": "A native local Mac app extracts browser archives, watches focus and classifies topics only after explicit opt-in.",
        "proof": "The public signed Sparkle feed and download serve notarized 0.3.1 build9 with matching DMG bytes. An isolated build4-to-6 Sparkle update and native journey were observed; build9 has not been installed for a new journey.",
        "nextAction": "Download the current public Mac build or use the signed update feed from an older public installation; private-window filtering remains unqualified."
      },
      "footerArt": {
        "src": "/footer-art/browserdaddy.webp",
        "width": 2170,
        "height": 725,
        "alt": "BrowserDaddy: An original tab-carrying guide centers a local archive folio along a history path. A distinct clock alcove represents measured attention separately, framed by quiet forest materials rather than another product's storage boxes.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for BrowserDaddy",
        "sha256": "78388a8f3fd4e4e92bc0860de3ce7d03fd231ef9527322912cfe14fa91edbf80"
      }
    },
    {
      "id": "calorie",
      "name": "Calorie",
      "description": "A private, local-first food, water, and weight journal with transparent timing guidance.",
      "url": "https://calorie.significanthobbies.com",
      "tier": "secondary",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "maintained",
      "changelogUrl": "https://calorie.significanthobbies.com/changelog",
      "repositoryUrl": "https://github.com/Significant-Hobbies/calorie",
      "roadmapUrl": "https://github.com/Significant-Hobbies/calorie/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "Calorie is a private food and body journal that turns lightweight logging into transparent daily and timing guidance.",
        "audience": "A person pursuing weight loss who logs food with one hand and checks progress in short daily moments.",
        "outcome": "Track intake, hydration, weight, and routines quickly, then understand practical training, fasting, and sleep timing.",
        "mechanism": "A local-first iPhone journal records food and four core nutrients, applies visible formulas, and offers optional private sync.",
        "proof": "The maintained app is functionally complete, connected to the Hub family, and designed so recommendations trace to visible rules.",
        "nextAction": "Log a meal or daily measurement in the app; change the product only when repeated use reveals a concrete gap."
      },
      "footerArt": {
        "src": "/footer-art/calorie.webp",
        "width": 2169,
        "height": 725,
        "alt": "Calorie: A modest food-journal table centers a fictional meal, transparent measuring vessel and blank daily notebook. Ordinary ingredients and a loose optional marker sit aside, making the journal useful without mandatory targets.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Calorie",
        "sha256": "4ecabb617faef59d62c87543ef02acce505f937eb8b6bf513c5b51b9e00ead74"
      }
    },
    {
      "id": "contextdaddy",
      "name": "ContextDaddy",
      "description": "A local Mac desk for agent context, skills, usage, and observed telemetry.",
      "url": "https://context.daddyrad.com/",
      "tier": "active",
      "category": "utility",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "beta",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "Help developers inspect coding-agent context, skill exposure, usage, and available local telemetry.",
        "audience": "Developers using multiple coding agents on a Mac.",
        "outcome": "Find actionable context and usage problems with evidence and explicit measurement limits.",
        "mechanism": "A native Mac app combines bounded discovery, previewed local skill management with recovery, offline usage history, and local OpenTelemetry views.",
        "proof": "Public 0.2.10 build 20 verified at https://context.daddyrad.com/download and GitHub release v0.2.10-20 (2026-10-09, source 95b88093e9f1f9786253bbdd6cbb3e66aa44fb6d). The live download SHA-256 51acdf9eb8a39f1b9555b702f4c9b498140dfd3f43445fd74bfa261e3d575bb2 matches the release asset and its live-publication receipt; the DMG and bundled ContextDaddy.app pass Gatekeeper as a notarized Developer ID build (notary status Accepted). Updates are delivered through the Sparkle appcast at https://context.daddyrad.com/updates/appcast.xml, which offers 0.2.10 build 20. Not installed or launched in this audit; in-app Sparkle installation remains unexercised. Discovery does not prove live prompt use and retains explicit entry/depth coverage limits.",
        "nextAction": "Download the signed 0.2.10 beta; open Skills and follow Guide. Later builds arrive through the in-app Sparkle update feed."
      },
      "footerArt": {
        "src": "/footer-art/contextdaddy.webp",
        "width": 2171,
        "height": 724,
        "alt": "ContextDaddy: An instruction-library workshop centers exposed skill cards in one rack and actual usage receipts in a separate ledger. A small window reveals incomplete observation; provenance tabs and a closed configuration drawer keep boundaries visible.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for ContextDaddy",
        "sha256": "81de7c1273d8b842a1456495296807b5310b3998d0f0be16d4a7616596365301"
      }
    },
    {
      "id": "free-ai",
      "name": "Free AI",
      "description": "An OpenAI-compatible free-tier model gateway with operator-provisioned project access.",
      "url": "https://ai-gateway.sassmaker.com",
      "tier": "active",
      "category": "utility",
      "priority": "P4",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "maintained",
      "changelogUrl": "https://ai-gateway.sassmaker.com/changelog",
      "repositoryUrl": "https://github.com/sass-maker/free-ai",
      "roadmapUrl": "https://github.com/sass-maker/free-ai/issues",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "Free AI makes useful free-tier language-model capacity available through one resilient, OpenAI-compatible interface.",
        "audience": "Fleet applications and developers who need low-cost model access without hard-coding one free provider.",
        "outcome": "Keep AI-dependent workflows available as provider limits, models, and free capacity change.",
        "mechanism": "A capability-aware gateway routes compatible requests across supported free-tier providers with fallback behavior.",
        "proof": "The gateway works for internal consumers and is maintained as shared infrastructure rather than an independent feature product.",
        "nextAction": "Use the compatible gateway from a named consumer; add providers only when they improve capability, reliability, or capacity."
      },
      "footerArt": {
        "src": "/footer-art/free-ai.webp",
        "width": 2172,
        "height": 724,
        "alt": "Free AI: A small routing junction centers one request parcel and a manual track switch. Several bounded tracks lead to modest endpoints; an obvious alternative bypasses one closed gate without promising unlimited throughput.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Free AI",
        "sha256": "26a88d2ef0d56bd1cd3a8f974faf4de0b73fc7a737242b22db53c45070f855a8"
      }
    },
    {
      "id": "pace",
      "name": "HeyPace",
      "description": "An experimental macOS voice-agent preview; installation and permission-dependent workflows are still being qualified.",
      "url": "https://heypace.app",
      "tier": "core",
      "category": "experimental",
      "priority": "P4",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "experiment",
      "changelogUrl": "https://heypace.app/changelog",
      "repositoryUrl": "https://github.com/HeyPace/pace",
      "roadmapUrl": "https://github.com/HeyPace/pace/issues",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "HeyPace is a private Mac assistant for fast voice-driven help grounded in what is currently on screen.",
        "audience": "A Mac user who wants contextual assistance without sending their desktop workflow to a hosted service.",
        "outcome": "Get useful help in the moment with less typing and less context switching.",
        "mechanism": "A local macOS agent combines voice interaction, screen context, and device-side tools.",
        "proof": "The public 0.3.19 preview is downloadable and the native implementation includes voice, screen context, local planning, and macOS actions; signed-release hardware smoke and sustained daily use remain unproven.",
        "nextAction": "Download the current Mac preview, test one recurring voice-and-screen workflow, and judge it against Pace's visible local and off-device trust boundary."
      },
      "footerArt": {
        "src": "/footer-art/pace.webp",
        "width": 2170,
        "height": 725,
        "alt": "HeyPace: A quiet personal voice-assistance desk centers a microphone beside an unbranded monitor and empty chair. A short blue physical ribbon links voice to the visible workspace; a lamp, folded note and small local tools complete the wings.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for HeyPace",
        "sha256": "bd1345b1c0e70d17bfa143564ccd89b21781185664dc1b90f9be1727908a9b8d"
      }
    },
    {
      "id": "high-signal",
      "name": "High Signal",
      "description": "Evidence-backed daily intelligence across technology, startups, finance, and public markets.",
      "url": "https://highsignal.app",
      "tier": "active",
      "category": "media",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "public-ready",
      "changelogUrl": "https://highsignal.app/changelog",
      "repositoryUrl": "https://github.com/High-Signal-App/high-signal",
      "roadmapUrl": "https://github.com/High-Signal-App/high-signal/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "High Signal turns scattered technology, startup, finance, and market sources into an evidence-backed daily intelligence brief.",
        "audience": "A curious operator who wants decision-relevant signals without reading every feed and article.",
        "outcome": "Understand what changed, why it may matter, and which source supports each signal.",
        "mechanism": "The product collects multiple sources, groups related events, and derives a concise brief with visible evidence.",
        "proof": "The product focus and daily-brief surface exist, but regular owner use has not yet validated what deserves continued investment.",
        "nextAction": "Read and dogfood the Daily Brief; resume feature work only when repeated use exposes a concrete deficiency."
      },
      "footerArt": {
        "src": "/footer-art/high-signal.webp",
        "width": 2171,
        "height": 724,
        "alt": "High Signal: A signal-watch desk centers one daily sheet whose physical source ribbons remain visible. Scattered public-source slips pass through a narrow sorting aperture; a restrained tuning instrument and loose paper occupy the wings.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for High Signal",
        "sha256": "073b92cd7e9d6e90a77f21c46aad762544406b606019fc4c40ecb898ae528bf2"
      }
    },
    {
      "id": "karte",
      "name": "Karte",
      "description": "A creator-owned public profile that answers visitor questions and preserves context for better inbound.",
      "url": "https://karte.cc",
      "tier": "secondary",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "public-ready",
      "changelogUrl": "https://karte.cc/changelog",
      "repositoryUrl": "https://github.com/Significant-Hobbies/karte",
      "roadmapUrl": "https://github.com/Significant-Hobbies/karte/issues",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "Karte gives a creator or independent operator a public profile that answers visitor questions and preserves context for better inbound.",
        "audience": "An individual or small company that wants visitors to understand and explore who they are through one compact page.",
        "outcome": "Help a visitor find relevant links, context, and answers instead of scanning an undifferentiated list.",
        "mechanism": "A designed profile combines greeting-card presentation, owner-published context, structured links, visitor questions, contact handoff, and a small grounded agent.",
        "proof": "The individual profile and conversational foundation are strong; company positioning and repeated company use remain the next validation.",
        "nextAction": "Explore the existing profile experience; company adoption should wait for a focused workflow and a real company test."
      },
      "footerArt": {
        "src": "/footer-art/karte.webp",
        "width": 2170,
        "height": 725,
        "alt": "Karte: A creator-owned welcome alcove centers a portfolio folio and visitor-question envelope. A restrained gold doorway opens toward public work while a closed drawer keeps private notes separate.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Karte",
        "sha256": "82a259b668d1e6507173483dd10368d0304b6923099a8afeb1b5d2850ca134fb"
      }
    },
    {
      "id": "kith",
      "name": "Kith",
      "description": "A private iPhone app for the people you actually want to stay close to — closeness-weighted constellation home, standing notes, and a chronological log per person.",
      "url": "https://kith.significanthobbies.com",
      "tier": "secondary",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "in-progress",
      "changelogUrl": "https://kith.significanthobbies.com/changelog",
      "repositoryUrl": "https://github.com/Significant-Hobbies/kith",
      "roadmapUrl": "https://github.com/Significant-Hobbies/kith/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "Kith helps a person remember the people they genuinely want to stay close to and act with more thoughtfulness.",
        "audience": "An iPhone user who values a small set of relationships and dislikes treating them like a sales CRM.",
        "outcome": "Retain meaningful context, notice who needs attention, and show up better in important relationships.",
        "mechanism": "A private constellation home organizes closeness, standing notes, and a chronological memory log for each person.",
        "proof": "The device-first native product is built around a distinctive constellation model and is in active personal use validation.",
        "nextAction": "Use Kith with real relationships and let recurring memory and follow-through needs guide improvements."
      },
      "footerArt": {
        "src": "/footer-art/kith.webp",
        "width": 2170,
        "height": 725,
        "alt": "Kith: A warm relationship courtyard centers a blank note and the nearest pair of chairs. Additional chosen chairs sit at different comfortable distances; discreet keepsake boxes suggest remembered moments without a social feed.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Kith",
        "sha256": "c765483ebe2957edea7c90b5abd7e3db585433e3b7895be8c983070474fd905f"
      }
    },
    {
      "id": "knowledge-base",
      "name": "Knowledge Base",
      "description": "Private agent search over specialized corpora with ranked citations, provenance, and schema-aware retrieval.",
      "url": "https://knowledgebase.sassmaker.com",
      "tier": "active",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "maintained",
      "changelogUrl": "https://knowledgebase.sassmaker.com/changelog",
      "repositoryUrl": "https://github.com/sass-maker/knowledge-base",
      "roadmapUrl": "https://github.com/sass-maker/knowledge-base/issues",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "Knowledge Base supplies private, cited retrieval over specialized corpora to other Fleet applications and agents.",
        "audience": "Named internal products and agents that need grounded answers from controlled source collections.",
        "outcome": "Retrieve relevant context with ranked citations, provenance, and a schema the consuming product can trust.",
        "mechanism": "A shared RAG service performs corpus-aware search, ranking, citation, and schema-constrained retrieval behind a private boundary.",
        "proof": "The service has healthy Fleet consumers and already operates as the shared cited-retrieval layer.",
        "nextAction": "Connect it only for a concrete consumer need; change the infrastructure when retrieval evidence shows a real failure."
      },
      "footerArt": {
        "src": "/footer-art/knowledge-base.webp",
        "width": 2169,
        "height": 725,
        "alt": "Knowledge Base: A private reading vault centers an index drawer retrieving one page while its provenance ribbon stays attached to the source volume. Closed specialist books sit behind a modest privacy partition in the wings.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Knowledge Base",
        "sha256": "418cd23e703c38e823c4f90fd48185ad7e87faeb8a512e9f0059085eaf4d39b2"
      }
    },
    {
      "id": "live",
      "name": "Live",
      "description": "Explore hobbies and possibilities, build a personal bucket list, and save your progress on this device or in your account.",
      "url": "https://live.significanthobbies.com",
      "tier": "active",
      "category": "media",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "experiment",
      "changelogUrl": "https://live.significanthobbies.com/changelog",
      "repositoryUrl": "https://github.com/Significant-Hobbies/live",
      "roadmapUrl": "https://github.com/Significant-Hobbies/live/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "Live helps a person turn passive wanting into a life they can deliberately imagine, plan, and experience.",
        "audience": "People who want meaningful goals, possibilities, and experiences to look forward to.",
        "outcome": "Build a personal catalogue of things worth doing and keep moving from possibility toward lived experience.",
        "mechanism": "The independent app combines a bucket list, goals, discovery, search, and suggestions around one private life catalogue.",
        "proof": "The product is independently owned, in active dogfooding, and retains its established data and authentication boundary.",
        "nextAction": "Open Live and use the catalogue, search, and suggestions to add or act on something you genuinely want to experience."
      },
      "footerArt": {
        "src": "/footer-art/live.webp",
        "width": 2170,
        "height": 725,
        "alt": "Live: An inhabited life atlas centers a reachable path junction beside an open blank possibility list. One chosen gold footpath leads toward modest activities: a garden, workshop and distant lookout. The illustration invites a next move without depicting completed achievements.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Live",
        "sha256": "3db0af1bc73641894adbaf7ca36fdd01c23a289abd70f31d9deddd024bbc95c0"
      }
    },
    {
      "id": "looptv",
      "name": "LoopTV",
      "description": "An experimental lean-back queue of curated science and other videos.",
      "url": "https://tv.significanthobbies.com",
      "tier": "secondary",
      "category": "media",
      "priority": "P4",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "experiment",
      "changelogUrl": "https://tv.significanthobbies.com/changelog",
      "repositoryUrl": "https://github.com/Significant-Hobbies/looptv",
      "roadmapUrl": "https://github.com/Significant-Hobbies/looptv/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "LoopTV turns curated YouTube channels into a calmer, lean-back television experience.",
        "audience": "Viewers who want intentional channel selection without YouTube’s endless recommendation feed.",
        "outcome": "Start watching something suitable quickly while retaining control over the available catalogue.",
        "mechanism": "A TV-like random player uses curated channels, focused search, and resilient handling of unavailable videos.",
        "proof": "The maintained product is complete for its intended viewing loop and already handles common catalogue failures.",
        "nextAction": "Open a curated channel and watch; future changes are limited to catalogue health or a proven viewing need."
      },
      "footerArt": {
        "src": "/footer-art/looptv.webp",
        "width": 2169,
        "height": 725,
        "alt": "LoopTV: A calm lean-back screening nook centers one comfortable chair facing a fictional abstract screen. A simple channel selector, unbranded reels and an empty alternate slot show deliberate simplicity and unavailable content without drama.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for LoopTV",
        "sha256": "647e371670bb62c6e39c8a843a714a9d2ff3f4001876719a9b63a7c380ba8cb5"
      }
    },
    {
      "id": "chatgpt-memory-insights",
      "name": "Memory Map",
      "description": "A browser-local experiment for importing a ChatGPT export, exploring semantic themes and search, and optionally saving analysis on your device.",
      "url": "https://chatgpt.significanthobbies.com",
      "tier": "secondary",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "experiment",
      "changelogUrl": "https://chatgpt.significanthobbies.com/changelog",
      "repositoryUrl": "https://github.com/sass-maker/saas-maker",
      "roadmapUrl": "https://github.com/sass-maker/saas-maker/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "Memory Map turns an exported AI conversation history into a private map of recurring themes, facts, emotions, and change.",
        "audience": "People curious about patterns across their own ChatGPT history who do not want to upload the archive to a service.",
        "outcome": "Recognize recurring concerns and how interests, language, and personal themes changed over time.",
        "mechanism": "The browser computes structured conversation analysis locally from an imported export and presents linked historical views.",
        "proof": "A useful browser-local dashboard exists today; deeper shift analysis and additional export sources remain active work.",
        "nextAction": "Import a ChatGPT export locally and explore the resulting private map; the source archive stays in the browser."
      },
      "footerArt": {
        "src": "/footer-art/chatgpt-memory-insights.webp",
        "width": 2171,
        "height": 724,
        "alt": "Memory Map: A cool cartography workshop centers an open transit-like atlas and a source slip physically connected to one route. A boxed conversation archive and folded map margins occupy the wings. It is analytical mapping rather than warm nostalgia stationery.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Memory Map",
        "sha256": "f546bcbf4be31048005badd75e8d9583df38a79dfcfab7c5c1d5f086808260b7"
      }
    },
    {
      "id": "what-it-takes-to-win",
      "name": "Paths",
      "description": "Explore sourced career turning points with explicit survivorship and forecasting limits.",
      "url": "https://paths.significanthobbies.com",
      "tier": "active",
      "category": "media",
      "priority": "P4",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "experiment",
      "changelogUrl": "https://paths.significanthobbies.com/changelog",
      "repositoryUrl": "https://github.com/Significant-Hobbies/what-it-takes-to-win",
      "roadmapUrl": "https://github.com/Significant-Hobbies/what-it-takes-to-win/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "Look Sideways shows why visible success cannot be reduced to a simple formula or a fair comparison with your own path.",
        "audience": "Readers who turn another person’s visible outcome into a judgment about their own pace, ability, or worth.",
        "outcome": "Replace flattened comparison with a more humane, evidence-bounded understanding of conditions, sequence, perseverance, and luck.",
        "mechanism": "A guided research exhibit connects source-linked life events and early-breakthrough paths through what people brought, were handed, and were surrounded by.",
        "proof": "The publication contains thousands of documented early-breakthrough paths, visible methodology, and ongoing source-linked profile coverage.",
        "nextAction": "Explore the finished experiment; no ongoing roadmap or maintenance promise."
      },
      "footerArt": {
        "src": "/footer-art/what-it-takes-to-win.webp",
        "width": 2170,
        "height": 725,
        "alt": "Paths: A landscape of unequal starting conditions centers a route fork and comparison folio. Paths from varied shelters meet obstacles and reach different ordinary vantage points; there is no crowned winner.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Paths",
        "sha256": "7d3ad09814045ad9fc23bec710750cbad0591721ee31d4ed1439d89ed965cff6"
      }
    },
    {
      "id": "performancedaddy",
      "name": "PerformanceDaddy",
      "description": "A local Mac performance investigator for background apps, helpers and developer workloads, with measured evidence and reviewed actions.",
      "url": "https://performance.daddyrad.com/",
      "tier": "active",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "preview",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "PerformanceDaddy helps developers inspect local processes, ports and measured slowdown signals before taking action.",
        "audience": "Developers running local servers, coding agents and other moving parts on a Mac.",
        "outcome": "Find the process or port evidence behind a slowdown and choose the next check deliberately.",
        "mechanism": "A native local Mac app records bounded CPU, memory, thermal, process and socket observations with reviewed stop controls.",
        "proof": "Public 0.2.16 build21 is signed, universal and notarized. The download matches the release checksum; the Sparkle feed, staple and local launch were verified on 2026-10-02. Full live-window acceptance and a 10x whole-app memory reduction remain unverified.",
        "nextAction": "Read the public landing and use the current GitHub release for a Mac install; review measured evidence before acting on a diagnosis."
      },
      "footerArt": {
        "src": "/footer-art/performancedaddy.webp",
        "width": 2170,
        "height": 725,
        "alt": "PerformanceDaddy: A calm local diagnostic bench centers one mechanical symptom specimen and an observation lens. Modest measured instruments, process-like gears and port sockets surround a deliberately untouched review-only action handle.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for PerformanceDaddy",
        "sha256": "74af2c7952c555a8737187a46fbd6393c7f58bfd2fb9124cbea5fec82909a8d8"
      }
    },
    {
      "id": "rolepatch",
      "name": "RolePatch",
      "description": "A guest resume-tailoring experiment with a reviewable diff and browser-local document exports.",
      "url": "https://rolepatch.com",
      "tier": "secondary",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "maintained",
      "changelogUrl": "https://rolepatch.com/changelog",
      "repositoryUrl": "https://github.com/Significant-Hobbies/rolepatch",
      "roadmapUrl": "https://github.com/Significant-Hobbies/rolepatch/issues",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "RolePatch tailors a resume and supporting application material to the evidence and language of a specific job.",
        "audience": "A job seeker preparing a serious application for a particular role.",
        "outcome": "Present relevant experience more clearly and prepare for the role without inventing qualifications.",
        "mechanism": "Paste a resume and job description, review the generated changes, save in the browser, and export the current document.",
        "proof": "The guest resume, tailoring, review, save/reload and local document-export path has been verified with synthetic examples. Account sync and broader application tools remain unqualified.",
        "nextAction": "Try the guest workflow for one job, review every proposed claim, and export the version you want to use."
      },
      "footerArt": {
        "src": "/footer-art/rolepatch.webp",
        "width": 2170,
        "height": 725,
        "alt": "RolePatch: A careful application-tailoring desk centers a plain resume sheet beside a job-description card, joined by removable revision strips. A source folder and separate review tray occupy the sides, making approval visible before action.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for RolePatch",
        "sha256": "0992326235de3d6c14e9f881f1725020f693924d790fb25689aaf181c7093c8b"
      }
    },
    {
      "id": "saas-maker",
      "name": "SaaS Maker",
      "description": "A public directory of working experiments, launch destinations, reference projects and reusable tooling.",
      "url": "https://sassmaker.com",
      "tier": "active",
      "category": "media",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "experiment",
      "changelogUrl": "https://sassmaker.com/changelog",
      "repositoryUrl": "https://github.com/sass-maker/saas-maker",
      "roadmapUrl": "https://github.com/sass-maker/saas-maker/issues",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "SaaS Maker is the public product studio and reusable tooling workshop for the Fleet portfolio.",
        "audience": "Visitors exploring Sarthak’s products and builders consuming the studio’s public packages, workflows, and evidence.",
        "outcome": "Understand the body of work, research source-attributed launch destinations, and reuse the tools that have earned a stable place across its products.",
        "mechanism": "A generated public directory and native launch-destination catalog sit beside shared feedback, UI, workflow, skill, and automation tooling maintained through real Fleet use.",
        "proof": "It publishes the canonical privacy-safe project directory, serves the provenance-bearing /launchdesk catalog, and houses packages and tooling used by multiple independent repositories.",
        "nextAction": "Explore the complete directory or open the public tooling catalogue; product-specific work continues in each owning repository."
      },
      "footerArt": {
        "src": "/footer-art/saas-maker.webp",
        "width": 2170,
        "height": 725,
        "alt": "SaaS Maker: A product studio courtyard centers an active craft table where small software-inspired models are made and inspected. Varied finished and unfinished models occupy a quiet exhibition shelf; useful tools remain on the outer workbenches.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for SaaS Maker",
        "sha256": "f2a322b87d983ad130458cf2bb1117fd4caa91aca7686988265eaf5d605ed528"
      }
    },
    {
      "id": "sarthakagrawal-personal",
      "name": "Sarthak Agrawal",
      "description": "Selected engineering case studies, technical writing and working project demonstrations.",
      "url": "https://sarthakagrawal.dev",
      "tier": "secondary",
      "category": "media",
      "priority": "P4",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "experiment",
      "changelogUrl": "https://sarthakagrawal.dev/changelog",
      "repositoryUrl": "https://github.com/sarthakagrawal927/portfolio",
      "roadmapUrl": "https://github.com/sarthakagrawal927/portfolio/issues",
      "pillarId": "personal",
      "purposeContract": {
        "purpose": "Sarthak Agrawal’s personal site is the durable public record of his work, writing, résumé, and professional identity.",
        "audience": "People evaluating Sarthak as an AI infrastructure and product engineer, collaborator, or builder.",
        "outcome": "Understand what he works on, what he has built, and how to verify or contact him.",
        "mechanism": "A maintained portfolio connects current positioning to selected projects, writing, résumé evidence, and public profiles.",
        "proof": "The public site is complete and satisfactory as the canonical professional record; updates follow changes in the underlying work.",
        "nextAction": "Explore the current work and résumé or use the listed contact paths; do not infer stale focus areas from older copy."
      },
      "footerArt": {
        "src": "/footer-art/sarthakagrawal-personal.webp",
        "width": 2171,
        "height": 724,
        "alt": "Sarthak Agrawal: A personal maker's workroom centers a selected-work folio and writing notebook. A few original project studies, a restrained bookshelf and useful craft tools show work without inventing a portrait or biography.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Sarthak Agrawal",
        "sha256": "cfb1f34a025880332ad02bbbb617ce8ccd427073391e203ac92bcb56d6d72462"
      }
    },
    {
      "id": "setline",
      "name": "Setline",
      "description": "An iOS-native training tracker that runs a written strength, cardio and mobility programme one set at a time and measures each exercise against an authored target.",
      "url": "https://setline.significanthobbies.com",
      "tier": "secondary",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "maintained",
      "changelogUrl": "https://setline.significanthobbies.com/changelog",
      "repositoryUrl": "https://github.com/Significant-Hobbies/setline",
      "roadmapUrl": "https://github.com/Significant-Hobbies/setline/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "Setline runs a written workout one set at a time and measures each exercise against its authored target.",
        "audience": "A person following a structured strength, cardio, or mobility programme during real sessions.",
        "outcome": "Stay focused on the current set, keep rest timing accurate, and understand performance against the plan.",
        "mechanism": "A native iOS workout player sequences exercises, timers, targets, and completed performance without turning the session into data entry.",
        "proof": "The focused workout loop is under active native development and is being validated through real sessions.",
        "nextAction": "Run an authored workout in Setline and let actual session friction determine the next product change."
      },
      "footerArt": {
        "src": "/footer-art/setline.webp",
        "width": 2172,
        "height": 724,
        "alt": "Setline: An empty training station centers an authored set card, dumbbell and simple rest timer. A second blank actual-result card remains separate on the bench; the space suggests one set at a time.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Setline",
        "sha256": "75f737ad788ed05fbfde4f0193096f358d959a07130fcab6025639f7fcb0bd64"
      }
    },
    {
      "id": "significanthobbies",
      "name": "Significant Hobbies",
      "description": "The shared Hub for Live, Calorie, Setline, Kith, and Anchor, backed by one privacy-aware control plane.",
      "url": "https://significanthobbies.com",
      "tier": "secondary",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "public-ready",
      "changelogUrl": "https://significanthobbies.com/changelog",
      "repositoryUrl": "https://github.com/Significant-Hobbies/significanthobbies",
      "roadmapUrl": "https://github.com/Significant-Hobbies/significanthobbies/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "Significant Hobbies is the shared home and privacy-aware control plane for five independently owned personal applications.",
        "audience": "One person using Live, Calorie, Setline, Kith, and Anchor as a connected personal system.",
        "outcome": "See and act across the five apps without collapsing their data ownership or product identities.",
        "mechanism": "A Hub, backend, and typed sync contracts exchange privacy-safe summaries and semantic actions while each app keeps its own source and data.",
        "proof": "The canonical Hub lists five maintained apps. Journal is removed from the product lineup; Journal and Habits source/data compatibility history remains retained. Private cross-app use still needs hosted qualification.",
        "nextAction": "Open the Hub to reach the five apps; current work focuses on unified authentication and safe cross-app summaries."
      },
      "footerArt": {
        "src": "/footer-art/significanthobbies.webp",
        "width": 2159,
        "height": 728,
        "alt": "Significant Hobbies: A shared courtyard centers a common path and table connecting five independent personal rooms. Each room retains a separate doorway and its own interior character; no room's contents flow into another.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Significant Hobbies",
        "sha256": "793590b059e352e9a8a381f3d0074b5994b64e9596cfbc8dde0e1268fc161f3d"
      }
    },
    {
      "id": "starboard",
      "name": "Starboard",
      "description": "Explore public GitHub repositories and related projects through a searchable discovery experiment.",
      "url": "https://starboard.codevetter.com",
      "tier": "secondary",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "experiment",
      "changelogUrl": "https://starboard.codevetter.com/changelog",
      "repositoryUrl": "https://github.com/Codevetter/starboard",
      "roadmapUrl": "https://github.com/Codevetter/starboard/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "Starboard makes a large GitHub Stars collection useful for personal exploration and project-aware tool discovery.",
        "audience": "Developers whose saved repositories have outgrown GitHub’s default starred-items interface.",
        "outcome": "Rediscover relevant tools, understand why they were saved, and connect them to current project needs.",
        "mechanism": "Synchronization, search, tags, lists, semantic retrieval, and project-aware recommendations operate over the user’s saved repositories.",
        "proof": "Core sync, search, organization, and project-aware discovery are largely complete and under focused active improvement.",
        "nextAction": "Connect or explore a Stars collection and use a current project question to drive discovery; avoid unrelated alert or reporting scope."
      },
      "footerArt": {
        "src": "/footer-art/starboard.webp",
        "width": 2169,
        "height": 725,
        "alt": "Starboard: A project-aware charting bench centers an unfinished vessel model beside one deliberately selected tool. A star-chart folio and organized tool cabinet fill the wings; unused tools remain visibly optional.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Starboard",
        "sha256": "69d07d109488dfbc3d3f589f9a880e0c6b4d5b337d895ce700e0b9dc6fccb9b9"
      }
    },
    {
      "id": "storagedaddy",
      "name": "storagedaddy",
      "description": "An open-source native Mac storage analyzer for developer caches, builds, dependencies and AI session archives, with reviewed cleanup. Free during early access.",
      "url": "https://storage.daddyrad.com/",
      "tier": "active",
      "category": "utility",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "beta",
      "pillarId": "build",
      "purposeContract": {
        "purpose": "storagedaddy helps developers understand and review local storage through a native visual scanner, developer classifications and verified, deliberate cleanup.",
        "audience": "Developers whose Mac builds, dependencies, caches and AI session histories consume storage.",
        "outcome": "Find large storage consumers and review what to archive or move to Trash.",
        "mechanism": "A local SwiftUI and AppKit scanner provides visual exploration, developer insights, reviewed cache cleanup and compact AI conversation exports. Sparkle provides signed macOS update checks.",
        "proof": "The public signed Sparkle feed and download serve notarized 0.1.3 build110 with matching DMG bytes. An isolated build106-to-108 Sparkle update and native scan were observed; build110 has not been installed for a new journey.",
        "nextAction": "Download during free early access at storage.daddyrad.com, scan a folder, and review what to archive or move to Trash."
      },
      "footerArt": {
        "src": "/footer-art/storagedaddy.webp",
        "width": 2171,
        "height": 724,
        "alt": "storagedaddy: A storage cartographer's attic centers a spatial map and magnifier. Developer project crates, ordinary storage parcels and generic build-artifact packages occupy the wings; a separate review basket remains untouched.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for storagedaddy",
        "sha256": "9164eb6b49796a5263e6741ca85d51ceec01b42fac68aeb5647f90eb3d3fa8c5"
      }
    },
    {
      "id": "swe-interview-prep",
      "name": "SWE Interview Prep",
      "description": "A learning OS for software-engineering interview practice.",
      "url": "https://learn.significanthobbies.com",
      "tier": "secondary",
      "category": "media",
      "priority": "P2",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "maturity": "maintained",
      "changelogUrl": "https://learn.significanthobbies.com/changelog",
      "repositoryUrl": "https://github.com/Significant-Hobbies/swe-interview-prep",
      "roadmapUrl": "https://github.com/Significant-Hobbies/swe-interview-prep/issues",
      "pillarId": "learn",
      "purposeContract": {
        "purpose": "SWE Interview Prep is a personal learning OS that turns software-engineering study into retained, artifact-backed understanding.",
        "audience": "Software engineers preparing for interviews or strengthening practical technical judgment through active study.",
        "outcome": "Build causal understanding that survives recall and can be demonstrated through code, diagrams, explanations, or projects.",
        "mechanism": "An evidence-gated Concept → Drill → Build → Review → Apply loop combines retrieval practice, Feynman explain-backs, roadmaps, and adaptive review.",
        "proof": "A fresh guest can complete a graded TypeScript drill and return to saved code in the same browser. Account sync and AI-graded mastery require sign-in and remain separately unqualified.",
        "nextAction": "Try a coding drill as a guest; progress stays in this browser. Use the issue tracker for account-sync qualification limits."
      },
      "footerArt": {
        "src": "/footer-art/swe-interview-prep.webp",
        "width": 2171,
        "height": 724,
        "alt": "SWE Interview Prep: A practical learning workshop centers a small built artifact and review notebook. Concept sketches, a drill jig and an application folio form a physical sequence in the wings; the journey ends with evidence rather than a trophy.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for SWE Interview Prep",
        "sha256": "af4490398f221a4b2d06931416938f53b49195dfc755c9bd22fdd4719b8de795"
      }
    },
    {
      "id": "web-playables",
      "name": "Web Playables",
      "description": "Small browser-playable game experiments.",
      "url": "https://idle.aliveville.com",
      "tier": "secondary",
      "category": "experimental",
      "priority": "P4",
      "spotlight": false,
      "lifecycle": "active",
      "shareable": true,
      "changelogUrl": "https://idle.aliveville.com/changelog",
      "repositoryUrl": "https://github.com/sarthakagrawal927/web-playables",
      "roadmapUrl": "https://github.com/sarthakagrawal927/web-playables/issues",
      "purposeContract": {
        "purpose": "Web Playables is a small laboratory for learning how browser and YouTube-ready games are designed, packaged, and distributed.",
        "audience": "A builder studying reusable HTML5 game mechanics and portable distribution constraints.",
        "outcome": "Prototype a mechanic once and ship it as a normal web game and a submission-ready playable package.",
        "mechanism": "A reusable gamekit supplies loops, saves, offline progress, platform adapters, and builds for a small games hub.",
        "proof": "The research goal produced a working gamekit, a live idle game, and YouTube-compatible packaging; the project is now parked.",
        "nextAction": "Preserved experiment; no current work or obligation to resume."
      },
      "footerArt": {
        "src": "/footer-art/web-playables.webp",
        "width": 2169,
        "height": 725,
        "alt": "Web Playables: A browser-game packaging workshop centers an original miniature level and save capsule. Distinct playable-world props sit in open frames beside an offline travel case and modest packaging tools.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Web Playables",
        "sha256": "75ee5d1549bebbc3507e5e945c3a93ad88befbdce46982bbee0c35d592ac9bc8"
      }
    }
  ],
  "directory": [
    {
      "id": "codevetter",
      "name": "CodeVetter",
      "description": "Execution-backed verification for AI-written software changes — local-first and inspectable.",
      "form": "Desktop app",
      "platforms": [
        "macOS"
      ],
      "technologies": [
        "Swift",
        "SwiftUI",
        "Rust",
        "SQLite"
      ],
      "group": "featured",
      "makerNote": "I built CodeVetter to make reviewing AI-generated code rigorous without giving up a local-first workflow.",
      "purposeContract": {
        "purpose": "CodeVetter verifies whether AI-written software changes actually satisfy their task, not merely whether the diff looks plausible.",
        "audience": "Developers and teams shipping code produced with AI agents.",
        "outcome": "Higher confidence that an agent completed the requested change correctly and safely.",
        "mechanism": "Local-first review combines repository context, executable checks, targeted evaluation, and inspectable verification receipts.",
        "proof": "Published macOS 1.16.6 is notarized: all public asset hashes match the release, and its bundled app passes strict signature, Gatekeeper and stapling checks. Thirteen packaged runtime modules match release source; 39 packaged provenance, coverage and source-snapshot checks pass on Node 24. An earlier bounded CLI fixture demonstrated real Codex review, pass/fail checks and persisted receipts.",
        "nextAction": "Try the current Mac release on a small local repository. Use the documented manual update path until in-app installation is qualified."
      },
      "footerArt": {
        "src": "/footer-art/codevetter.webp",
        "width": 2172,
        "height": 724,
        "alt": "Finely drawn dark verification bench with task and change folios, a central bounded execution chamber, and retained evidence to the right.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for CodeVetter",
        "sha256": "36588b9c1d0a02b0b04b0d8e9cbeb9661440b2927d7e9a12f7b6a0e176fae910"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "primary",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Cloudflare Workers"
      ],
      "domains": [
        "codevetter.com"
      ],
      "url": "https://codevetter.com",
      "repositoryUrl": "https://github.com/Codevetter/codevetter",
      "changelogUrl": "https://codevetter.com/changelog",
      "roadmapUrl": "https://github.com/Codevetter/codevetter/issues",
      "firstCommitAt": "2025-11-30",
      "latestCommitAt": "2026-09-23",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://codevetter.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "pace",
      "name": "HeyPace",
      "description": "An experimental macOS voice-agent preview; installation and permission-dependent workflows are still being qualified.",
      "form": "macOS app",
      "platforms": [
        "macOS",
        "Web"
      ],
      "technologies": [
        "Swift",
        "SwiftUI",
        "Astro",
        "Cloudflare Pages"
      ],
      "group": "current",
      "makerNote": "I wanted a fast, privacy-first Mac assistant that could understand what is on my screen while keeping the work local.",
      "purposeContract": {
        "purpose": "HeyPace is a private Mac assistant for fast voice-driven help grounded in what is currently on screen.",
        "audience": "A Mac user who wants contextual assistance without sending their desktop workflow to a hosted service.",
        "outcome": "Get useful help in the moment with less typing and less context switching.",
        "mechanism": "A local macOS agent combines voice interaction, screen context, and device-side tools.",
        "proof": "The public 0.3.19 preview is downloadable and the native implementation includes voice, screen context, local planning, and macOS actions; signed-release hardware smoke and sustained daily use remain unproven.",
        "nextAction": "Download the current Mac preview, test one recurring voice-and-screen workflow, and judge it against Pace's visible local and off-device trust boundary."
      },
      "footerArt": {
        "src": "/footer-art/pace.webp",
        "width": 2170,
        "height": 725,
        "alt": "HeyPace: A quiet personal voice-assistance desk centers a microphone beside an unbranded monitor and empty chair. A short blue physical ribbon links voice to the visible workspace; a lamp, folded note and small local tools complete the wings.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for HeyPace",
        "sha256": "bd1345b1c0e70d17bfa143564ccd89b21781185664dc1b90f9be1727908a9b8d"
      },
      "kind": "product",
      "category": "experimental",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages"
      ],
      "domains": [
        "heypace.app"
      ],
      "url": "https://heypace.app",
      "repositoryUrl": "https://github.com/HeyPace/pace",
      "changelogUrl": "https://heypace.app/changelog",
      "roadmapUrl": "https://github.com/HeyPace/pace/issues",
      "firstCommitAt": "2026-07-13",
      "latestCommitAt": "2026-09-18",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://heypace.app",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "posttrainllm",
      "name": "PostTrainLLM",
      "description": "An experimental browser model playground: run small language models locally with visible generation metrics.",
      "form": "Research platform",
      "platforms": [
        "Web",
        "Local"
      ],
      "technologies": [
        "Astro",
        "Python",
        "Rust",
        "Cloudflare Pages"
      ],
      "group": "featured",
      "makerNote": "I use PostTrainLLM to explore local model training and turn those experiments into repeatable recipes for specialist models.",
      "purposeContract": {
        "purpose": "PostTrainLLM turns local model-training experiments into measured, reproducible recipes for useful specialist language models.",
        "audience": "Practitioners learning or running post-training workflows on personal Apple hardware and in the browser.",
        "outcome": "Train, evaluate, compare, and run specialist models with evidence about what worked and why.",
        "mechanism": "A local factory joins datasets, training methods, evaluation, experiment tracking, and inference into repeatable recipes.",
        "proof": "The project contains working browser and Mac-local experiments, evaluation infrastructure, and reproducible training paths.",
        "nextAction": "Explore the measured recipes and follow new experiments as they produce reproducible proof rather than scale claims."
      },
      "footerArt": {
        "src": "/footer-art/posttrainllm.webp",
        "width": 2170,
        "height": 725,
        "alt": "PostTrainLLM: A specialist-model recipe atelier centers a measured recipe tray and paired comparison samples. Sorted local material enters a modest experimental apparatus; a comparison notebook and source cabinet remain distinct at the wings.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for PostTrainLLM",
        "sha256": "63c2514f2a3e4e225277cda029a8cc990836ca91c53e213b418b0f4a12040f7c"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "primary",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages"
      ],
      "domains": [
        "posttrainllm.com"
      ],
      "url": "https://posttrainllm.com",
      "repositoryUrl": "https://github.com/PostTrainLLM/posttrainllm",
      "changelogUrl": "https://posttrainllm.com/changelog",
      "roadmapUrl": "https://github.com/PostTrainLLM/posttrainllm/issues",
      "firstCommitAt": "2026-05-21",
      "latestCommitAt": "2026-09-23",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://posttrainllm.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "site-health",
      "name": "Site Health",
      "description": "A local portfolio dashboard for domains, performance, search, and AI visibility evidence.",
      "form": "Local dashboard",
      "platforms": [
        "Web",
        "Local"
      ],
      "technologies": [
        "Astro",
        "TypeScript",
        "Node.js"
      ],
      "group": "current",
      "makerNote": "I built Site Health because I needed one clear view of Fleet’s domains, performance, search visibility, and AI visibility.",
      "purposeContract": {
        "purpose": "Site Health gives the Fleet owner one private, evidence-backed view of portfolio inventory and public-surface health.",
        "audience": "The owner operating a large portfolio of independent software projects.",
        "outcome": "Know what exists, what is live, and where domains, performance, search, or AI visibility need attention.",
        "mechanism": "A local five-area dashboard joins the canonical catalog with provider, repository, performance, search, and visibility evidence."
      },
      "roster": "current",
      "availability": "internal-private"
    },
    {
      "id": "live",
      "name": "Live",
      "description": "Explore hobbies and possibilities, build a personal bucket list, and save your progress on this device or in your account.",
      "form": "Web app",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Next.js",
        "TypeScript",
        "Cloudflare Workers",
        "D1"
      ],
      "group": "current",
      "makerNote": "I wanted a product that helps people live more intentionally through goals, possibilities, and things worth anticipating.",
      "purposeContract": {
        "purpose": "Live helps a person turn passive wanting into a life they can deliberately imagine, plan, and experience.",
        "audience": "People who want meaningful goals, possibilities, and experiences to look forward to.",
        "outcome": "Build a personal catalogue of things worth doing and keep moving from possibility toward lived experience.",
        "mechanism": "The independent app combines a bucket list, goals, discovery, search, and suggestions around one private life catalogue.",
        "proof": "The product is independently owned, in active dogfooding, and retains its established data and authentication boundary.",
        "nextAction": "Open Live and use the catalogue, search, and suggestions to add or act on something you genuinely want to experience."
      },
      "footerArt": {
        "src": "/footer-art/live.webp",
        "width": 2170,
        "height": 725,
        "alt": "Live: An inhabited life atlas centers a reachable path junction beside an open blank possibility list. One chosen gold footpath leads toward modest activities: a garden, workshop and distant lookout. The illustration invites a next move without depicting completed achievements.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Live",
        "sha256": "3db0af1bc73641894adbaf7ca36fdd01c23a289abd70f31d9deddd024bbc95c0"
      },
      "kind": "product",
      "category": "media",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Workers"
      ],
      "domains": [
        "live.significanthobbies.com"
      ],
      "url": "https://live.significanthobbies.com",
      "repositoryUrl": "https://github.com/Significant-Hobbies/live",
      "changelogUrl": "https://live.significanthobbies.com/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/live/issues",
      "firstCommitAt": "2026-03-01",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://live.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "chatgpt-connections",
      "name": "ChatGPT Connections",
      "description": "A read-only MCP gateway that exposes selected public Fleet data to ChatGPT connections.",
      "form": "MCP service",
      "platforms": [
        "API",
        "ChatGPT"
      ],
      "technologies": [
        "TypeScript",
        "Cloudflare Workers",
        "MCP"
      ],
      "group": "current",
      "makerNote": "I had many projects but no solid way to connect them to ChatGPT, so I built a selective gateway for that.",
      "purposeContract": {
        "purpose": "ChatGPT Connections lets ChatGPT read selected Fleet product data through one bounded gateway.",
        "audience": "The Fleet owner and approved ChatGPT conversations that need specific project context.",
        "outcome": "Ask useful cross-project questions without exposing the private portfolio catalog or granting write access.",
        "mechanism": "A read-only MCP gateway publishes explicit, privacy-filtered resources for named consumers."
      },
      "roster": "current",
      "availability": "internal-private"
    },
    {
      "id": "saas-maker",
      "name": "SaaS Maker",
      "description": "A public directory of working experiments, launch destinations, reference projects and reusable tooling.",
      "form": "Web directory and service",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "Astro",
        "Cloudflare",
        "D1",
        "IssuePages"
      ],
      "group": "current",
      "makerNote": "I use SaaS Maker as the public home for Fleet and as a workshop for launch research, reusable feedback, workflow, and automation tools.",
      "purposeContract": {
        "purpose": "SaaS Maker is the public product studio and reusable tooling workshop for the Fleet portfolio.",
        "audience": "Visitors exploring Sarthak’s products and builders consuming the studio’s public packages, workflows, and evidence.",
        "outcome": "Understand the body of work, research source-attributed launch destinations, and reuse the tools that have earned a stable place across its products.",
        "mechanism": "A generated public directory and native launch-destination catalog sit beside shared feedback, UI, workflow, skill, and automation tooling maintained through real Fleet use.",
        "proof": "It publishes the canonical privacy-safe project directory, serves the provenance-bearing /launchdesk catalog, and houses packages and tooling used by multiple independent repositories.",
        "nextAction": "Explore the complete directory or open the public tooling catalogue; product-specific work continues in each owning repository."
      },
      "footerArt": {
        "src": "/footer-art/saas-maker.webp",
        "width": 2170,
        "height": 725,
        "alt": "SaaS Maker: A product studio courtyard centers an active craft table where small software-inspired models are made and inspected. Varied finished and unfinished models occupy a quiet exhibition shelf; useful tools remain on the outer workbenches.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for SaaS Maker",
        "sha256": "f2a322b87d983ad130458cf2bb1117fd4caa91aca7686988265eaf5d605ed528"
      },
      "kind": "product",
      "category": "media",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Cloudflare Workers"
      ],
      "domains": [
        "sassmaker.com"
      ],
      "url": "https://sassmaker.com",
      "repositoryUrl": "https://github.com/sass-maker/saas-maker",
      "changelogUrl": "https://sassmaker.com/changelog",
      "roadmapUrl": "https://github.com/sass-maker/saas-maker/issues",
      "firstCommitAt": "2026-02-26",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://sassmaker.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "fleet-social",
      "name": "Fleet Social",
      "description": "Private video review, scheduling and delivery tracking for Fleet projects, with local Mashup exports.",
      "form": "Private web app",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "SvelteKit",
        "Cloudflare Workers",
        "D1",
        "R2",
        "Cloudflare Pages"
      ],
      "group": "current",
      "makerNote": "I wanted one reviewable social publishing place for Fleet projects.",
      "purposeContract": {
        "purpose": "Fleet Social is a private social publishing hub for Fleet projects.",
        "audience": "The Fleet owner and internal product feeds.",
        "outcome": "Prepare, approve, schedule, and account for project posts from one place.",
        "mechanism": "Project-attributed drafts pass through owner review before per-account publishing and receipt tracking."
      },
      "roster": "current",
      "availability": "internal-private"
    },
    {
      "id": "chatgpt-memory-insights",
      "name": "Memory Map",
      "description": "A browser-local experiment for importing a ChatGPT export, exploring semantic themes and search, and optionally saving analysis on your device.",
      "form": "Web app",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Astro",
        "TypeScript",
        "Cloudflare Pages"
      ],
      "group": "current",
      "makerNote": "I wanted to learn what my exported AI conversations reveal about my themes, emotions, memory, and personal change.",
      "purposeContract": {
        "purpose": "Memory Map turns an exported AI conversation history into a private map of recurring themes, facts, emotions, and change.",
        "audience": "People curious about patterns across their own ChatGPT history who do not want to upload the archive to a service.",
        "outcome": "Recognize recurring concerns and how interests, language, and personal themes changed over time.",
        "mechanism": "The browser computes structured conversation analysis locally from an imported export and presents linked historical views.",
        "proof": "A useful browser-local dashboard exists today; deeper shift analysis and additional export sources remain active work.",
        "nextAction": "Import a ChatGPT export locally and explore the resulting private map; the source archive stays in the browser."
      },
      "footerArt": {
        "src": "/footer-art/chatgpt-memory-insights.webp",
        "width": 2171,
        "height": 724,
        "alt": "Memory Map: A cool cartography workshop centers an open transit-like atlas and a source slip physically connected to one route. A boxed conversation archive and folded map margins occupy the wings. It is analytical mapping rather than warm nostalgia stationery.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Memory Map",
        "sha256": "f546bcbf4be31048005badd75e8d9583df38a79dfcfab7c5c1d5f086808260b7"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages"
      ],
      "domains": [
        "chatgpt.significanthobbies.com"
      ],
      "url": "https://chatgpt.significanthobbies.com",
      "repositoryUrl": "https://github.com/sass-maker/saas-maker",
      "changelogUrl": "https://chatgpt.significanthobbies.com/changelog",
      "roadmapUrl": "https://github.com/sass-maker/saas-maker/issues",
      "firstCommitAt": "2026-07-28",
      "latestCommitAt": "2026-09-19",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://chatgpt.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "free-ai",
      "name": "Free AI",
      "description": "An OpenAI-compatible free-tier model gateway with operator-provisioned project access.",
      "form": "API gateway",
      "platforms": [
        "API",
        "Web"
      ],
      "technologies": [
        "Hono",
        "TypeScript",
        "Cloudflare Workers",
        "D1"
      ],
      "group": "current",
      "makerNote": "I built Free AI to make genuinely useful free model capacity easier to discover and use through one resilient interface.",
      "purposeContract": {
        "purpose": "Free AI makes useful free-tier language-model capacity available through one resilient, OpenAI-compatible interface.",
        "audience": "Fleet applications and developers who need low-cost model access without hard-coding one free provider.",
        "outcome": "Keep AI-dependent workflows available as provider limits, models, and free capacity change.",
        "mechanism": "A capability-aware gateway routes compatible requests across supported free-tier providers with fallback behavior.",
        "proof": "The gateway works for internal consumers and is maintained as shared infrastructure rather than an independent feature product.",
        "nextAction": "Use the compatible gateway from a named consumer; add providers only when they improve capability, reliability, or capacity."
      },
      "footerArt": {
        "src": "/footer-art/free-ai.webp",
        "width": 2172,
        "height": 724,
        "alt": "Free AI: A small routing junction centers one request parcel and a manual track switch. Several bounded tracks lead to modest endpoints; an obvious alternative bypasses one closed gate without promising unlimited throughput.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Free AI",
        "sha256": "26a88d2ef0d56bd1cd3a8f974faf4de0b73fc7a737242b22db53c45070f855a8"
      },
      "kind": "platform",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Workers"
      ],
      "domains": [
        "ai-gateway.sassmaker.com"
      ],
      "url": "https://ai-gateway.sassmaker.com",
      "repositoryUrl": "https://github.com/sass-maker/free-ai",
      "changelogUrl": "https://ai-gateway.sassmaker.com/changelog",
      "roadmapUrl": "https://github.com/sass-maker/free-ai/issues",
      "firstCommitAt": "2026-02-15",
      "latestCommitAt": "2026-09-20",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://ai-gateway.sassmaker.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "high-signal",
      "name": "High Signal",
      "description": "Evidence-backed daily intelligence across technology, startups, finance, and public markets.",
      "form": "Intelligence web app",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "Next.js",
        "React",
        "Hono",
        "Cloudflare"
      ],
      "group": "current",
      "makerNote": "I built High Signal to combine scattered news and data sources and extract the signals that are actually useful.",
      "purposeContract": {
        "purpose": "High Signal turns scattered technology, startup, finance, and market sources into an evidence-backed daily intelligence brief.",
        "audience": "A curious operator who wants decision-relevant signals without reading every feed and article.",
        "outcome": "Understand what changed, why it may matter, and which source supports each signal.",
        "mechanism": "The product collects multiple sources, groups related events, and derives a concise brief with visible evidence.",
        "proof": "The product focus and daily-brief surface exist, but regular owner use has not yet validated what deserves continued investment.",
        "nextAction": "Read and dogfood the Daily Brief; resume feature work only when repeated use exposes a concrete deficiency."
      },
      "footerArt": {
        "src": "/footer-art/high-signal.webp",
        "width": 2171,
        "height": 724,
        "alt": "High Signal: A signal-watch desk centers one daily sheet whose physical source ribbons remain visible. Scattered public-source slips pass through a narrow sorting aperture; a restrained tuning instrument and loose paper occupy the wings.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for High Signal",
        "sha256": "073b92cd7e9d6e90a77f21c46aad762544406b606019fc4c40ecb898ae528bf2"
      },
      "kind": "product",
      "category": "media",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Workers"
      ],
      "domains": [
        "highsignal.app"
      ],
      "url": "https://highsignal.app",
      "repositoryUrl": "https://github.com/High-Signal-App/high-signal",
      "changelogUrl": "https://highsignal.app/changelog",
      "roadmapUrl": "https://github.com/High-Signal-App/high-signal/issues",
      "firstCommitAt": "2026-04-25",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://highsignal.app",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "knowledge-base",
      "name": "Knowledge Base",
      "description": "Private agent search over specialized corpora with ranked citations, provenance, and schema-aware retrieval.",
      "form": "Knowledge platform",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "Astro",
        "Hono",
        "Cloudflare Workers",
        "D1"
      ],
      "group": "current",
      "makerNote": "I built Knowledge Base as the private, cited retrieval layer that other Fleet applications can rely on.",
      "purposeContract": {
        "purpose": "Knowledge Base supplies private, cited retrieval over specialized corpora to other Fleet applications and agents.",
        "audience": "Named internal products and agents that need grounded answers from controlled source collections.",
        "outcome": "Retrieve relevant context with ranked citations, provenance, and a schema the consuming product can trust.",
        "mechanism": "A shared RAG service performs corpus-aware search, ranking, citation, and schema-constrained retrieval behind a private boundary.",
        "proof": "The service has healthy Fleet consumers and already operates as the shared cited-retrieval layer.",
        "nextAction": "Connect it only for a concrete consumer need; change the infrastructure when retrieval evidence shows a real failure."
      },
      "footerArt": {
        "src": "/footer-art/knowledge-base.webp",
        "width": 2169,
        "height": 725,
        "alt": "Knowledge Base: A private reading vault centers an index drawer retrieving one page while its provenance ribbon stays attached to the source volume. Closed specialist books sit behind a modest privacy partition in the wings.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Knowledge Base",
        "sha256": "418cd23e703c38e823c4f90fd48185ad7e87faeb8a512e9f0059085eaf4d39b2"
      },
      "kind": "platform",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Cloudflare Workers"
      ],
      "domains": [
        "knowledgebase.sassmaker.com",
        "search.sassmaker.com"
      ],
      "url": "https://knowledgebase.sassmaker.com",
      "repositoryUrl": "https://github.com/sass-maker/knowledge-base",
      "changelogUrl": "https://knowledgebase.sassmaker.com/changelog",
      "roadmapUrl": "https://github.com/sass-maker/knowledge-base/issues",
      "firstCommitAt": "2026-05-27",
      "latestCommitAt": "2026-09-19",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://knowledgebase.sassmaker.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "significanthobbies",
      "name": "Significant Hobbies",
      "description": "The shared Hub for Live, Calorie, Setline, Kith, and Anchor, backed by one privacy-aware control plane.",
      "form": "Personal-app Hub",
      "platforms": [
        "Web",
        "API",
        "Swift package"
      ],
      "technologies": [
        "TypeScript",
        "Cloudflare Workers",
        "D1",
        "Swift"
      ],
      "group": "current",
      "makerNote": "I wanted one Hub for my maintained personal apps while letting every app keep ownership of its own data.",
      "purposeContract": {
        "purpose": "Significant Hobbies is the shared home and privacy-aware control plane for five independently owned personal applications.",
        "audience": "One person using Live, Calorie, Setline, Kith, and Anchor as a connected personal system.",
        "outcome": "See and act across the five apps without collapsing their data ownership or product identities.",
        "mechanism": "A Hub, backend, and typed sync contracts exchange privacy-safe summaries and semantic actions while each app keeps its own source and data.",
        "proof": "The canonical Hub lists five maintained apps. Journal is removed from the product lineup; Journal and Habits source/data compatibility history remains retained. Private cross-app use still needs hosted qualification.",
        "nextAction": "Open the Hub to reach the five apps; current work focuses on unified authentication and safe cross-app summaries."
      },
      "footerArt": {
        "src": "/footer-art/significanthobbies.webp",
        "width": 2159,
        "height": 728,
        "alt": "Significant Hobbies: A shared courtyard centers a common path and table connecting five independent personal rooms. Each room retains a separate doorway and its own interior character; no room's contents flow into another.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Significant Hobbies",
        "sha256": "793590b059e352e9a8a381f3d0074b5994b64e9596cfbc8dde0e1268fc161f3d"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Workers"
      ],
      "domains": [
        "significanthobbies.com"
      ],
      "url": "https://significanthobbies.com",
      "repositoryUrl": "https://github.com/Significant-Hobbies/significanthobbies",
      "changelogUrl": "https://significanthobbies.com/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/significanthobbies/issues",
      "firstCommitAt": "2026-03-01",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "anime-list",
      "name": "Anime List",
      "description": "Anime and manga discovery with multi-axis filtering and personal watchlists.",
      "form": "Web app",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "React",
        "Vite",
        "Hono",
        "Cloudflare"
      ],
      "group": "current",
      "makerNote": "I wanted better anime filtering and discovery than the standard catalog experience, with a watchlist that works for me.",
      "purposeContract": {
        "purpose": "Anime List helps anime and manga fans filter a large catalogue, discover what fits, and maintain a personal watchlist.",
        "audience": "Anime and manga fans who want more precise discovery than a standard catalogue provides.",
        "outcome": "Find suitable titles quickly and keep personal viewing or reading plans organized.",
        "mechanism": "Multi-field search, shareable filters, seasonal discovery, taste tools, schedules, and signed-in watchlists operate over a large synced catalogue.",
        "proof": "The production app serves roughly 35,000 titles and is frequently used; broader community features are intentionally out of scope.",
        "nextAction": "Search the catalogue or use the watchlist; maintenance focuses on data quality and core discovery reliability."
      },
      "footerArt": {
        "src": "/footer-art/anime-list.webp",
        "width": 2168,
        "height": 725,
        "alt": "Anime List: An original animation-club room centers a personal watch shelf and one invented illustrated story card. A projector, original abstract story panels and a seasonal moon-cycle window frame the scene.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Anime List",
        "sha256": "b2370994f1f05837bada8d4bd232dbdf8f809e06da6fa9bac3f5817c188c119e"
      },
      "kind": "product",
      "category": "media",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Cloudflare Workers"
      ],
      "domains": [
        "anime.significanthobbies.com"
      ],
      "url": "https://anime.significanthobbies.com",
      "repositoryUrl": "https://github.com/Significant-Hobbies/anime-list",
      "changelogUrl": "https://anime.significanthobbies.com/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/anime-list/issues",
      "firstCommitAt": "2025-02-16",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://anime.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "looptv",
      "name": "LoopTV",
      "description": "An experimental lean-back queue of curated science and other videos.",
      "form": "Web app",
      "platforms": [
        "Web",
        "TV"
      ],
      "technologies": [
        "Astro",
        "React",
        "Vite",
        "Cloudflare Pages"
      ],
      "group": "current",
      "makerNote": "I wanted a more controlled and curated way to watch YouTube, shaped like television rather than an endless feed.",
      "purposeContract": {
        "purpose": "LoopTV turns curated YouTube channels into a calmer, lean-back television experience.",
        "audience": "Viewers who want intentional channel selection without YouTube’s endless recommendation feed.",
        "outcome": "Start watching something suitable quickly while retaining control over the available catalogue.",
        "mechanism": "A TV-like random player uses curated channels, focused search, and resilient handling of unavailable videos.",
        "proof": "The maintained product is complete for its intended viewing loop and already handles common catalogue failures.",
        "nextAction": "Open a curated channel and watch; future changes are limited to catalogue health or a proven viewing need."
      },
      "footerArt": {
        "src": "/footer-art/looptv.webp",
        "width": 2169,
        "height": 725,
        "alt": "LoopTV: A calm lean-back screening nook centers one comfortable chair facing a fictional abstract screen. A simple channel selector, unbranded reels and an empty alternate slot show deliberate simplicity and unavailable content without drama.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for LoopTV",
        "sha256": "647e371670bb62c6e39c8a843a714a9d2ff3f4001876719a9b63a7c380ba8cb5"
      },
      "kind": "product",
      "category": "media",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages"
      ],
      "domains": [
        "tv.significanthobbies.com"
      ],
      "url": "https://tv.significanthobbies.com",
      "repositoryUrl": "https://github.com/Significant-Hobbies/looptv",
      "changelogUrl": "https://tv.significanthobbies.com/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/looptv/issues",
      "firstCommitAt": "2026-04-04",
      "latestCommitAt": "2026-09-07",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://tv.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "reader",
      "name": "Reader",
      "description": "A saved-link inbox for ChatGPT: save links, search them, track read state, and connect through MCP.",
      "form": "Saved-link inbox web app",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "React",
        "Hono",
        "Cloudflare Workers",
        "D1"
      ],
      "group": "current",
      "makerNote": "I wanted any article or PDF to become a focused reading and research surface instead of another forgotten browser tab.",
      "purposeContract": {
        "purpose": "Reader is a saved-link inbox for use with ChatGPT: save a link, search it later, keep read state, and let ChatGPT find and fetch it over MCP.",
        "audience": "People who save serious reading but lose it among browser tabs and undifferentiated bookmarks.",
        "outcome": "Move from saved links to ChatGPT-assisted retrieval of what was saved, with read and unread state kept in one place.",
        "mechanism": "A web app and Chrome extension capture links; a Hono Worker on D1 stores them and exposes search, fetch, and set_read tools over an MCP endpoint."
      },
      "roster": "current",
      "availability": "preview-not-qualified",
      "publicUrl": "https://read.significanthobbies.com",
      "publicUrlLabel": "Preview site"
    },
    {
      "id": "swe-interview-prep",
      "name": "SWE Interview Prep",
      "description": "A learning OS for software-engineering interview practice.",
      "form": "Learning web app",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "React",
        "Vite",
        "TypeScript",
        "Cloudflare Pages"
      ],
      "group": "current",
      "makerNote": "I built this as a learning-by-doing system that combines Pomodoro, Feynman, retrieval practice, and practical roadmaps.",
      "purposeContract": {
        "purpose": "SWE Interview Prep is a personal learning OS that turns software-engineering study into retained, artifact-backed understanding.",
        "audience": "Software engineers preparing for interviews or strengthening practical technical judgment through active study.",
        "outcome": "Build causal understanding that survives recall and can be demonstrated through code, diagrams, explanations, or projects.",
        "mechanism": "An evidence-gated Concept → Drill → Build → Review → Apply loop combines retrieval practice, Feynman explain-backs, roadmaps, and adaptive review.",
        "proof": "A fresh guest can complete a graded TypeScript drill and return to saved code in the same browser. Account sync and AI-graded mastery require sign-in and remain separately unqualified.",
        "nextAction": "Try a coding drill as a guest; progress stays in this browser. Use the issue tracker for account-sync qualification limits."
      },
      "footerArt": {
        "src": "/footer-art/swe-interview-prep.webp",
        "width": 2171,
        "height": 724,
        "alt": "SWE Interview Prep: A practical learning workshop centers a small built artifact and review notebook. Concept sketches, a drill jig and an application folio form a physical sequence in the wings; the journey ends with evidence rather than a trophy.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for SWE Interview Prep",
        "sha256": "af4490398f221a4b2d06931416938f53b49195dfc755c9bd22fdd4719b8de795"
      },
      "kind": "product",
      "category": "media",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Cloudflare Workers"
      ],
      "domains": [
        "learn.significanthobbies.com"
      ],
      "url": "https://learn.significanthobbies.com",
      "repositoryUrl": "https://github.com/Significant-Hobbies/swe-interview-prep",
      "changelogUrl": "https://learn.significanthobbies.com/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/swe-interview-prep/issues",
      "firstCommitAt": "2026-02-08",
      "latestCommitAt": "2026-09-20",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://learn.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "calorie",
      "name": "Calorie",
      "description": "A private, local-first food, water, and weight journal with transparent timing guidance.",
      "form": "iOS app",
      "platforms": [
        "iOS",
        "API"
      ],
      "technologies": [
        "SwiftUI",
        "Hono",
        "Cloudflare Workers",
        "D1"
      ],
      "group": "current",
      "makerNote": "I wanted one personal system for weight loss that connects food logging, fasting, exercise timing, and daily performance.",
      "logoUrl": "/images/project-icons/calorie.png",
      "purposeContract": {
        "purpose": "Calorie is a private food and body journal that turns lightweight logging into transparent daily and timing guidance.",
        "audience": "A person pursuing weight loss who logs food with one hand and checks progress in short daily moments.",
        "outcome": "Track intake, hydration, weight, and routines quickly, then understand practical training, fasting, and sleep timing.",
        "mechanism": "A local-first iPhone journal records food and four core nutrients, applies visible formulas, and offers optional private sync.",
        "proof": "The maintained app is functionally complete, connected to the Hub family, and designed so recommendations trace to visible rules.",
        "nextAction": "Log a meal or daily measurement in the app; change the product only when repeated use reveals a concrete gap."
      },
      "footerArt": {
        "src": "/footer-art/calorie.webp",
        "width": 2169,
        "height": 725,
        "alt": "Calorie: A modest food-journal table centers a fictional meal, transparent measuring vessel and blank daily notebook. Ordinary ingredients and a loose optional marker sit aside, making the journal useful without mandatory targets.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Calorie",
        "sha256": "4ecabb617faef59d62c87543ef02acce505f937eb8b6bf513c5b51b9e00ead74"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Workers",
        "Apple App Store Connect"
      ],
      "domains": [
        "calorie.significanthobbies.com"
      ],
      "url": "https://calorie.significanthobbies.com",
      "repositoryUrl": "https://github.com/Significant-Hobbies/calorie",
      "changelogUrl": "https://calorie.significanthobbies.com/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/calorie/issues",
      "firstCommitAt": "2026-07-25",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://calorie.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "setline",
      "name": "Setline",
      "description": "An iOS-native training tracker that runs a written strength, cardio and mobility programme one set at a time and measures each exercise against an authored target.",
      "form": "iOS app",
      "platforms": [
        "iOS"
      ],
      "technologies": [
        "SwiftUI",
        "CloudKit",
        "PersonalSyncKit"
      ],
      "group": "current",
      "makerNote": "I built Setline to make workouts easier to execute one set at a time, with timing and performance kept accurate.",
      "logoUrl": "/images/project-icons/setline.png",
      "purposeContract": {
        "purpose": "Setline runs a written workout one set at a time and measures each exercise against its authored target.",
        "audience": "A person following a structured strength, cardio, or mobility programme during real sessions.",
        "outcome": "Stay focused on the current set, keep rest timing accurate, and understand performance against the plan.",
        "mechanism": "A native iOS workout player sequences exercises, timers, targets, and completed performance without turning the session into data entry.",
        "proof": "The focused workout loop is under active native development and is being validated through real sessions.",
        "nextAction": "Run an authored workout in Setline and let actual session friction determine the next product change."
      },
      "footerArt": {
        "src": "/footer-art/setline.webp",
        "width": 2172,
        "height": 724,
        "alt": "Setline: An empty training station centers an authored set card, dumbbell and simple rest timer. A second blank actual-result card remains separate on the bench; the space suggests one set at a time.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Setline",
        "sha256": "75f737ad788ed05fbfde4f0193096f358d959a07130fcab6025639f7fcb0bd64"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Apple App Store Connect"
      ],
      "domains": [
        "setline.significanthobbies.com"
      ],
      "url": "https://setline.significanthobbies.com",
      "repositoryUrl": "https://github.com/Significant-Hobbies/setline",
      "changelogUrl": "https://setline.significanthobbies.com/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/setline/issues",
      "firstCommitAt": "2026-07-27",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://setline.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "kith",
      "name": "Kith",
      "description": "A private iPhone app for the people you actually want to stay close to — closeness-weighted constellation home, standing notes, and a chronological log per person.",
      "form": "iOS app",
      "platforms": [
        "iOS"
      ],
      "technologies": [
        "SwiftUI",
        "CloudKit",
        "PersonalSyncKit"
      ],
      "group": "current",
      "makerNote": "I wanted a beautiful personal relationship-memory app that helps me stay more thoughtful about the people in my life.",
      "logoUrl": "/images/project-icons/kith.png",
      "purposeContract": {
        "purpose": "Kith helps a person remember the people they genuinely want to stay close to and act with more thoughtfulness.",
        "audience": "An iPhone user who values a small set of relationships and dislikes treating them like a sales CRM.",
        "outcome": "Retain meaningful context, notice who needs attention, and show up better in important relationships.",
        "mechanism": "A private constellation home organizes closeness, standing notes, and a chronological memory log for each person.",
        "proof": "The device-first native product is built around a distinctive constellation model and is in active personal use validation.",
        "nextAction": "Use Kith with real relationships and let recurring memory and follow-through needs guide improvements."
      },
      "footerArt": {
        "src": "/footer-art/kith.webp",
        "width": 2170,
        "height": 725,
        "alt": "Kith: A warm relationship courtyard centers a blank note and the nearest pair of chairs. Additional chosen chairs sit at different comfortable distances; discreet keepsake boxes suggest remembered moments without a social feed.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Kith",
        "sha256": "c765483ebe2957edea7c90b5abd7e3db585433e3b7895be8c983070474fd905f"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Apple App Store Connect"
      ],
      "domains": [
        "kith.significanthobbies.com"
      ],
      "url": "https://kith.significanthobbies.com",
      "repositoryUrl": "https://github.com/Significant-Hobbies/kith",
      "changelogUrl": "https://kith.significanthobbies.com/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/kith/issues",
      "firstCommitAt": "2026-08-16",
      "latestCommitAt": "2026-09-19",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://kith.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "rolepatch",
      "name": "RolePatch",
      "description": "A guest resume-tailoring experiment with a reviewable diff and browser-local document exports.",
      "form": "Web app",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "Next.js",
        "React",
        "Cloudflare Workers",
        "D1"
      ],
      "group": "current",
      "makerNote": "I wanted a focused way to tailor a resume and its supporting material to the actual job description.",
      "purposeContract": {
        "purpose": "RolePatch tailors a resume and supporting application material to the evidence and language of a specific job.",
        "audience": "A job seeker preparing a serious application for a particular role.",
        "outcome": "Present relevant experience more clearly and prepare for the role without inventing qualifications.",
        "mechanism": "Paste a resume and job description, review the generated changes, save in the browser, and export the current document.",
        "proof": "The guest resume, tailoring, review, save/reload and local document-export path has been verified with synthetic examples. Account sync and broader application tools remain unqualified.",
        "nextAction": "Try the guest workflow for one job, review every proposed claim, and export the version you want to use."
      },
      "footerArt": {
        "src": "/footer-art/rolepatch.webp",
        "width": 2170,
        "height": 725,
        "alt": "RolePatch: A careful application-tailoring desk centers a plain resume sheet beside a job-description card, joined by removable revision strips. A source folder and separate review tray occupy the sides, making approval visible before action.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for RolePatch",
        "sha256": "0992326235de3d6c14e9f881f1725020f693924d790fb25689aaf181c7093c8b"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Workers"
      ],
      "domains": [
        "rolepatch.com"
      ],
      "url": "https://rolepatch.com",
      "repositoryUrl": "https://github.com/Significant-Hobbies/rolepatch",
      "changelogUrl": "https://rolepatch.com/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/rolepatch/issues",
      "firstCommitAt": "2026-02-23",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://rolepatch.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "karte",
      "name": "Karte",
      "description": "A creator-owned public profile that answers visitor questions and preserves context for better inbound.",
      "form": "Web app",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "Next.js",
        "React",
        "Cloudflare Workers",
        "D1"
      ],
      "group": "current",
      "makerNote": "I wanted a link-in-bio surface that could grow into something more personal: a greeting card, profile, and small agent.",
      "purposeContract": {
        "purpose": "Karte gives a creator or independent operator a public profile that answers visitor questions and preserves context for better inbound.",
        "audience": "An individual or small company that wants visitors to understand and explore who they are through one compact page.",
        "outcome": "Help a visitor find relevant links, context, and answers instead of scanning an undifferentiated list.",
        "mechanism": "A designed profile combines greeting-card presentation, owner-published context, structured links, visitor questions, contact handoff, and a small grounded agent.",
        "proof": "The individual profile and conversational foundation are strong; company positioning and repeated company use remain the next validation.",
        "nextAction": "Explore the existing profile experience; company adoption should wait for a focused workflow and a real company test."
      },
      "footerArt": {
        "src": "/footer-art/karte.webp",
        "width": 2170,
        "height": 725,
        "alt": "Karte: A creator-owned welcome alcove centers a portfolio folio and visitor-question envelope. A restrained gold doorway opens toward public work while a closed drawer keeps private notes separate.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Karte",
        "sha256": "82a259b668d1e6507173483dd10368d0304b6923099a8afeb1b5d2850ca134fb"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Workers",
        "Cloudflare Email Workers"
      ],
      "domains": [
        "karte.cc"
      ],
      "url": "https://karte.cc",
      "repositoryUrl": "https://github.com/Significant-Hobbies/karte",
      "changelogUrl": "https://karte.cc/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/karte/issues",
      "firstCommitAt": "2026-03-05",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://karte.cc",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "starboard",
      "name": "Starboard",
      "description": "Explore public GitHub repositories and related projects through a searchable discovery experiment.",
      "form": "Web app",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "Next.js",
        "React",
        "Cloudflare Workers",
        "D1"
      ],
      "group": "current",
      "makerNote": "GitHub Stars stopped working for me at scale, so I built a better personal interface for exploring what I had saved.",
      "purposeContract": {
        "purpose": "Starboard makes a large GitHub Stars collection useful for personal exploration and project-aware tool discovery.",
        "audience": "Developers whose saved repositories have outgrown GitHub’s default starred-items interface.",
        "outcome": "Rediscover relevant tools, understand why they were saved, and connect them to current project needs.",
        "mechanism": "Synchronization, search, tags, lists, semantic retrieval, and project-aware recommendations operate over the user’s saved repositories.",
        "proof": "Core sync, search, organization, and project-aware discovery are largely complete and under focused active improvement.",
        "nextAction": "Connect or explore a Stars collection and use a current project question to drive discovery; avoid unrelated alert or reporting scope."
      },
      "footerArt": {
        "src": "/footer-art/starboard.webp",
        "width": 2169,
        "height": 725,
        "alt": "Starboard: A project-aware charting bench centers an unfinished vessel model beside one deliberately selected tool. A star-chart folio and organized tool cabinet fill the wings; unused tools remain visibly optional.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Starboard",
        "sha256": "69d07d109488dfbc3d3f589f9a880e0c6b4d5b337d895ce700e0b9dc6fccb9b9"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Workers"
      ],
      "domains": [
        "starboard.codevetter.com"
      ],
      "url": "https://starboard.codevetter.com",
      "repositoryUrl": "https://github.com/Codevetter/starboard",
      "changelogUrl": "https://starboard.codevetter.com/changelog",
      "roadmapUrl": "https://github.com/Codevetter/starboard/issues",
      "firstCommitAt": "2026-02-22",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://starboard.codevetter.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "ai-game",
      "name": "AliveVille",
      "description": "Persistent AI world and multi-agent simulation experiments.",
      "form": "Web game",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "React",
        "Vite",
        "Three.js",
        "Cloudflare"
      ],
      "group": "current",
      "makerNote": "I wanted to create a long-running world where AI characters remember, form grudges, make choices, and live through open-ended conflict.",
      "purposeContract": {
        "purpose": "AliveVille explores a playable world where AI characters remember, form relationships and grudges, and act through persistent conflict.",
        "audience": "Players drawn to open-ended agent worlds rather than a demonstration of model APIs.",
        "outcome": "Feel that a small town and its characters remain alive, consequential, and worth returning to.",
        "mechanism": "A persistent simulation combines autonomous NPC memory, quests, dialogue, combat, and a browser-playable 3D town."
      },
      "roster": "current",
      "availability": "preview-not-qualified",
      "publicUrl": "https://aliveville.com",
      "publicUrlLabel": "Preview site"
    },
    {
      "id": "app-health",
      "name": "App Health",
      "description": "Web analytics, product events, logs, and endpoint health in one workspace.",
      "form": "Product analytics and monitoring service",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "React",
        "shadcn/ui",
        "Cloudflare Workers",
        "Swift"
      ],
      "group": "current",
      "makerNote": "I built App Health because checking Sentry, PostHog, Slack, and cloud consoles separately made basic product health too fragmented.",
      "purposeContract": {
        "purpose": "App Health helps product teams understand web traffic, intentional user actions, and application health across their projects.",
        "audience": "Product managers, founders, and product teams; developers connect the instrumentation.",
        "outcome": "See who is active as browser-session counts, which pages and named events are used, and whether backend failures explain product friction.",
        "mechanism": "A small browser tracker and explicit named events feed workspace-scoped analytics; service SDKs and OTLP add aggregate endpoint health in the same dashboard.",
        "proof": "Production Google signup, returning login, sign-out and project creation verified; own signup/project milestone logs remain exactly one each. Known analytics traffic returned 3 sessions, 4 page views and 2 named events without duplicate-batch inflation, with correct 1h/24h boundaries and referral sources. Public live page and revocation verified. JavaScript SDK 0.4.0 published and artifact integrity checked. See app-health/docs/release-2026-09-12.md; broader analytics parity and remotely published Swift package remain follow-up work.",
        "nextAction": "Sign in with Google, add a project and environment, then install only the analytics, endpoint, or logging capability you need."
      },
      "footerArt": {
        "src": "/footer-art/app-health.webp",
        "width": 2169,
        "height": 725,
        "alt": "App Health: A request-and-event relay station centers a single parcel at an inspection desk. Separate request rails and closed diagnostic drawers remain bounded, distinct from Site Health's whole-portfolio project inventory scene.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for App Health",
        "sha256": "d89c904afcbb6b379ecdb0aeb394609af83c63f1703f637dec6df5e5fde08886"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Workers"
      ],
      "domains": [
        "health.sassmaker.com",
        "ingest.sassmaker.com"
      ],
      "url": "https://health.sassmaker.com",
      "repositoryUrl": "https://github.com/sass-maker/app-health",
      "changelogUrl": "https://health.sassmaker.com/changelog",
      "roadmapUrl": "https://github.com/sass-maker/app-health/issues",
      "firstCommitAt": "2026-07-20",
      "latestCommitAt": "2026-09-19",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://health.sassmaker.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "motion",
      "name": "Motion",
      "description": "An unreleased iPhone motion-control game prototype that mirrors to a larger screen; physical-device control feel and gameplay remain unverified.",
      "form": "iOS game",
      "platforms": [
        "iOS",
        "iPadOS",
        "Web"
      ],
      "technologies": [
        "SwiftUI",
        "Apple Vision",
        "Vite",
        "TypeScript"
      ],
      "group": "current",
      "makerNote": "I wanted body movement captured by a phone to become playful games on a television—and a workout without feeling like one.",
      "purposeContract": {
        "purpose": "Motion turns body movement seen by an iPhone into the controls for playful games on a larger screen.",
        "audience": "People who want active, social play without buying a dedicated motion-console system.",
        "outcome": "Move, play, and exercise through a game that responds directly to the body.",
        "mechanism": "The iPhone performs body tracking and hosts the game while mirroring the experience to a television or larger display."
      },
      "roster": "current",
      "availability": "unreleased-prototype",
      "publicUrl": "https://motion.significanthobbies.com",
      "publicUrlLabel": "Landing page"
    },
    {
      "id": "web-playables",
      "name": "Web Playables",
      "description": "Small browser-playable game experiments.",
      "form": "Game collection",
      "platforms": [
        "Web",
        "YouTube Playables"
      ],
      "technologies": [
        "TypeScript",
        "Vite",
        "Cloudflare Pages",
        "Cloudflare Workers"
      ],
      "group": "current",
      "makerNote": "I built this laboratory to understand how idle and HTML-based games are designed, shipped, and distributed.",
      "purposeContract": {
        "purpose": "Web Playables is a small laboratory for learning how browser and YouTube-ready games are designed, packaged, and distributed.",
        "audience": "A builder studying reusable HTML5 game mechanics and portable distribution constraints.",
        "outcome": "Prototype a mechanic once and ship it as a normal web game and a submission-ready playable package.",
        "mechanism": "A reusable gamekit supplies loops, saves, offline progress, platform adapters, and builds for a small games hub.",
        "proof": "The research goal produced a working gamekit, a live idle game, and YouTube-compatible packaging; the project is now parked.",
        "nextAction": "Preserved experiment; no current work or obligation to resume."
      },
      "footerArt": {
        "src": "/footer-art/web-playables.webp",
        "width": 2169,
        "height": 725,
        "alt": "Web Playables: A browser-game packaging workshop centers an original miniature level and save capsule. Distinct playable-world props sit in open frames beside an offline travel case and modest packaging tools.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Web Playables",
        "sha256": "75ee5d1549bebbc3507e5e945c3a93ad88befbdce46982bbee0c35d592ac9bc8"
      },
      "kind": "experiment",
      "category": "experimental",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Cloudflare Workers"
      ],
      "domains": [
        "idle.aliveville.com",
        "historia.aliveville.com"
      ],
      "url": "https://idle.aliveville.com",
      "repositoryUrl": "https://github.com/sarthakagrawal927/web-playables",
      "changelogUrl": "https://idle.aliveville.com/changelog",
      "roadmapUrl": "https://github.com/sarthakagrawal927/web-playables/issues",
      "firstCommitAt": "2026-07-10",
      "latestCommitAt": "2026-09-07",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://idle.aliveville.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "what-it-takes-to-win",
      "name": "Paths",
      "description": "Explore sourced career turning points with explicit survivorship and forecasting limits.",
      "form": "Research publication",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Astro",
        "TypeScript",
        "Cloudflare Pages"
      ],
      "group": "current",
      "makerNote": "I wanted to study the real advantages behind success and replace unhelpful comparison with evidence-based understanding.",
      "purposeContract": {
        "purpose": "Look Sideways shows why visible success cannot be reduced to a simple formula or a fair comparison with your own path.",
        "audience": "Readers who turn another person’s visible outcome into a judgment about their own pace, ability, or worth.",
        "outcome": "Replace flattened comparison with a more humane, evidence-bounded understanding of conditions, sequence, perseverance, and luck.",
        "mechanism": "A guided research exhibit connects source-linked life events and early-breakthrough paths through what people brought, were handed, and were surrounded by.",
        "proof": "The publication contains thousands of documented early-breakthrough paths, visible methodology, and ongoing source-linked profile coverage.",
        "nextAction": "Explore the finished experiment; no ongoing roadmap or maintenance promise."
      },
      "footerArt": {
        "src": "/footer-art/what-it-takes-to-win.webp",
        "width": 2170,
        "height": 725,
        "alt": "Paths: A landscape of unequal starting conditions centers a route fork and comparison folio. Paths from varied shelters meet obstacles and reach different ordinary vantage points; there is no crowned winner.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Paths",
        "sha256": "7d3ad09814045ad9fc23bec710750cbad0591721ee31d4ed1439d89ed965cff6"
      },
      "kind": "product",
      "category": "media",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages"
      ],
      "domains": [
        "paths.significanthobbies.com"
      ],
      "url": "https://paths.significanthobbies.com",
      "repositoryUrl": "https://github.com/Significant-Hobbies/what-it-takes-to-win",
      "changelogUrl": "https://paths.significanthobbies.com/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/what-it-takes-to-win/issues",
      "firstCommitAt": "2026-07-21",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://paths.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "sarthakagrawal-personal",
      "name": "Sarthak Agrawal",
      "description": "Selected engineering case studies, technical writing and working project demonstrations.",
      "form": "Portfolio website",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Astro",
        "React",
        "Cloudflare Pages",
        "IssuePages"
      ],
      "group": "current",
      "makerNote": "I maintain a personal website because I need one durable, accurate public record of my work and professional identity.",
      "purposeContract": {
        "purpose": "Sarthak Agrawal’s personal site is the durable public record of his work, writing, résumé, and professional identity.",
        "audience": "People evaluating Sarthak as an AI infrastructure and product engineer, collaborator, or builder.",
        "outcome": "Understand what he works on, what he has built, and how to verify or contact him.",
        "mechanism": "A maintained portfolio connects current positioning to selected projects, writing, résumé evidence, and public profiles.",
        "proof": "The public site is complete and satisfactory as the canonical professional record; updates follow changes in the underlying work.",
        "nextAction": "Explore the current work and résumé or use the listed contact paths; do not infer stale focus areas from older copy."
      },
      "footerArt": {
        "src": "/footer-art/sarthakagrawal-personal.webp",
        "width": 2171,
        "height": 724,
        "alt": "Sarthak Agrawal: A personal maker's workroom centers a selected-work folio and writing notebook. A few original project studies, a restrained bookshelf and useful craft tools show work without inventing a portrait or biography.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Sarthak Agrawal",
        "sha256": "cfb1f34a025880332ad02bbbb617ce8ccd427073391e203ac92bcb56d6d72462"
      },
      "kind": "product",
      "category": "media",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages"
      ],
      "domains": [
        "sarthakagrawal.dev"
      ],
      "url": "https://sarthakagrawal.dev",
      "repositoryUrl": "https://github.com/sarthakagrawal927/portfolio",
      "changelogUrl": "https://sarthakagrawal.dev/changelog",
      "roadmapUrl": "https://github.com/sarthakagrawal927/portfolio/issues",
      "firstCommitAt": "2026-05-22",
      "latestCommitAt": "2026-09-19",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://sarthakagrawal.dev",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "anchor",
      "name": "Anchor",
      "description": "A local-first day planner and focus timer for Mac, iPhone, and Apple Watch that explains the gap between the schedule you planned and the day you lived.",
      "form": "Apple app",
      "platforms": [
        "macOS",
        "iOS",
        "watchOS",
        "Web"
      ],
      "technologies": [
        "SwiftUI",
        "SwiftData",
        "CloudKit",
        "Foundation Models"
      ],
      "group": "current",
      "makerNote": "I wanted a realistic daily planner that could help me follow the day and explain why the lived plan diverged from the intended one.",
      "logoUrl": "/images/project-icons/anchor.png",
      "purposeContract": {
        "purpose": "Anchor helps a person plan a realistic day, follow the current intention, and learn why the day lived differed from the day planned.",
        "audience": "A person moving between Mac, iPhone, and Apple Watch who wants a deliberate day rather than another task list.",
        "outcome": "Make more realistic plans, recover from interruptions, and protect activities that genuinely matter without moralizing imperfect adherence.",
        "mechanism": "Native apps combine schedule blocks, recurring routines, wall-clock focus sessions, interruption evidence, and an end-of-day divergence review.",
        "proof": "Public notarized Mac build 20 remains available; local build 25 has passed a bounded personal workflow but Gatekeeper rejects it as unnotarized, so it is not a public update.",
        "nextAction": "Use Anchor through a real day and review the divergence evidence; let repeated lived patterns decide the next change."
      },
      "footerArt": {
        "src": "/footer-art/anchor.webp",
        "width": 2171,
        "height": 724,
        "alt": "Anchor: A day-planning terrace centers the crossing between a planned stepping-stone path and a real-life detour. A pause bench, simple clock, task tokens and end-of-day notebook make interruptions ordinary.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for Anchor",
        "sha256": "efcbdc055f2e6aa2fd4822868019c132a5bb27125ce90641cae8919954ef9926"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Apple App Store Connect"
      ],
      "domains": [
        "anchor.significanthobbies.com"
      ],
      "url": "https://anchor.significanthobbies.com",
      "repositoryUrl": "https://github.com/Significant-Hobbies/anchor",
      "changelogUrl": "https://anchor.significanthobbies.com/changelog",
      "roadmapUrl": "https://github.com/Significant-Hobbies/anchor/issues",
      "firstCommitAt": "2026-08-16",
      "latestCommitAt": "2026-09-18",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://anchor.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "storagedaddy",
      "name": "storagedaddy",
      "description": "An open-source native Mac storage analyzer for developer caches, builds, dependencies and AI session archives, with reviewed cleanup. Free during early access.",
      "form": "macOS app",
      "platforms": [
        "macOS",
        "Web"
      ],
      "technologies": [
        "SwiftUI",
        "Rust",
        "Cloudflare Workers",
        "Sparkle",
        "Astro"
      ],
      "group": "current",
      "makerNote": "I am building a native Mac storage analyzer that makes disk usage clear and cleanup easy to review.",
      "purposeContract": {
        "purpose": "storagedaddy helps developers understand and review local storage through a native visual scanner, developer classifications and verified, deliberate cleanup.",
        "audience": "Developers whose Mac builds, dependencies, caches and AI session histories consume storage.",
        "outcome": "Find large storage consumers and review what to archive or move to Trash.",
        "mechanism": "A local SwiftUI and AppKit scanner provides visual exploration, developer insights, reviewed cache cleanup and compact AI conversation exports. Sparkle provides signed macOS update checks.",
        "proof": "The public signed Sparkle feed and download serve notarized 0.1.3 build110 with matching DMG bytes. An isolated build106-to-108 Sparkle update and native scan were observed; build110 has not been installed for a new journey.",
        "nextAction": "Download during free early access at storage.daddyrad.com, scan a folder, and review what to archive or move to Trash."
      },
      "footerArt": {
        "src": "/footer-art/storagedaddy.webp",
        "width": 2171,
        "height": 724,
        "alt": "storagedaddy: A storage cartographer's attic centers a spatial map and magnifier. Developer project crates, ordinary storage parcels and generic build-artifact packages occupy the wings; a separate review basket remains untouched.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for storagedaddy",
        "sha256": "9164eb6b49796a5263e6741ca85d51ceec01b42fac68aeb5647f90eb3d3fa8c5"
      },
      "kind": "experiment",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Workers"
      ],
      "domains": [
        "storage.daddyrad.com",
        "storagedaddy.significanthobbies.com"
      ],
      "url": "https://storage.daddyrad.com/",
      "repositoryUrl": "https://github.com/Significant-Hobbies/storagedaddy",
      "roadmapUrl": "https://github.com/Significant-Hobbies/storagedaddy/issues",
      "firstCommitAt": "2026-09-13",
      "latestCommitAt": "2026-09-20",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://storage.daddyrad.com/",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "browserdaddy",
      "name": "BrowserDaddy",
      "description": "A local-first Mac browsing intelligence app for a unified history archive and real attention tracking.",
      "form": "macOS app",
      "platforms": [
        "macOS",
        "Web"
      ],
      "technologies": [
        "SwiftUI",
        "SQLite",
        "Astro",
        "Cloudflare Workers",
        "Sparkle"
      ],
      "group": "current",
      "makerNote": "I am building a local-first Mac browsing intelligence app that turns browser history and attention into an inspectable archive.",
      "purposeContract": {
        "purpose": "BrowserDaddy helps people understand their browsing history and attention locally across browsers.",
        "audience": "Mac users who want a unified, inspectable record of browsing and attention.",
        "outcome": "Review browsing history and attention without sending the archive to a hosted service.",
        "mechanism": "A native local Mac app extracts browser archives, watches focus and classifies topics only after explicit opt-in.",
        "proof": "The public signed Sparkle feed and download serve notarized 0.3.1 build9 with matching DMG bytes. An isolated build4-to-6 Sparkle update and native journey were observed; build9 has not been installed for a new journey.",
        "nextAction": "Download the current public Mac build or use the signed update feed from an older public installation; private-window filtering remains unqualified."
      },
      "footerArt": {
        "src": "/footer-art/browserdaddy.webp",
        "width": 2170,
        "height": 725,
        "alt": "BrowserDaddy: An original tab-carrying guide centers a local archive folio along a history path. A distinct clock alcove represents measured attention separately, framed by quiet forest materials rather than another product's storage boxes.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for BrowserDaddy",
        "sha256": "78388a8f3fd4e4e92bc0860de3ce7d03fd231ef9527322912cfe14fa91edbf80"
      },
      "kind": "experiment",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Cloudflare Workers"
      ],
      "domains": [
        "browser.daddyrad.com",
        "browserdaddy.significanthobbies.com"
      ],
      "url": "https://browser.daddyrad.com/",
      "repositoryUrl": "https://github.com/Significant-Hobbies/browserdaddy",
      "roadmapUrl": "https://github.com/Significant-Hobbies/browserdaddy/issues",
      "firstCommitAt": "2026-09-19",
      "latestCommitAt": "2026-09-22",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://browser.daddyrad.com/",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "performancedaddy",
      "name": "PerformanceDaddy",
      "description": "A local Mac performance investigator for background apps, helpers and developer workloads, with measured evidence and reviewed actions.",
      "form": "macOS app",
      "platforms": [
        "macOS",
        "Web"
      ],
      "technologies": [
        "SwiftUI",
        "AppKit",
        "Astro",
        "Cloudflare Workers",
        "Sparkle"
      ],
      "group": "current",
      "makerNote": "I am building a local Mac performance investigator that makes process, port and slowdown evidence easier to review.",
      "purposeContract": {
        "purpose": "PerformanceDaddy helps developers inspect local processes, ports and measured slowdown signals before taking action.",
        "audience": "Developers running local servers, coding agents and other moving parts on a Mac.",
        "outcome": "Find the process or port evidence behind a slowdown and choose the next check deliberately.",
        "mechanism": "A native local Mac app records bounded CPU, memory, thermal, process and socket observations with reviewed stop controls.",
        "proof": "Public 0.2.16 build21 is signed, universal and notarized. The download matches the release checksum; the Sparkle feed, staple and local launch were verified on 2026-10-02. Full live-window acceptance and a 10x whole-app memory reduction remain unverified.",
        "nextAction": "Read the public landing and use the current GitHub release for a Mac install; review measured evidence before acting on a diagnosis."
      },
      "footerArt": {
        "src": "/footer-art/performancedaddy.webp",
        "width": 2170,
        "height": 725,
        "alt": "PerformanceDaddy: A calm local diagnostic bench centers one mechanical symptom specimen and an observation lens. Modest measured instruments, process-like gears and port sockets surround a deliberately untouched review-only action handle.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for PerformanceDaddy",
        "sha256": "74af2c7952c555a8737187a46fbd6393c7f58bfd2fb9124cbea5fec82909a8d8"
      },
      "kind": "experiment",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Cloudflare Workers"
      ],
      "domains": [
        "performance.daddyrad.com",
        "performancedaddy.significanthobbies.com"
      ],
      "url": "https://performance.daddyrad.com/",
      "repositoryUrl": "https://github.com/Significant-Hobbies/performancedaddy",
      "roadmapUrl": "https://github.com/Significant-Hobbies/performancedaddy/issues",
      "firstCommitAt": "2026-09-20",
      "latestCommitAt": "2026-09-23",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://performance.daddyrad.com/",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "unified-portfolio",
      "name": "Unified Portfolio",
      "description": "Private read-only investment observability.",
      "form": "Web app with private user workspaces",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Cloudflare Workers",
        "D1",
        "Next.js / vinext",
        "MCP"
      ],
      "group": "current",
      "makerNote": "my private normalized view of personal investments across brokers.",
      "purposeContract": {
        "purpose": "Unified Portfolio helps people understand their own investments through an isolated read-only portfolio.",
        "audience": "People signed in with Google, each accessing only their own investments.",
        "outcome": "Understand holdings, allocation, portfolio history and connection freshness without trading.",
        "mechanism": "Official broker adapters and an INDmoney MCP client feed immutable normalized snapshots shared by the web dashboard and read-only MCP tools."
      },
      "roster": "current",
      "availability": "internal-private"
    },
    {
      "id": "meme-lab",
      "name": "Meme Lab",
      "description": "A public tool that ranks 3,000 reaction memes for a comment; its Anna review candidate also creates personal photo memes with private saves and PNG downloads.",
      "form": "Local experiment, Worker playground and Anna review candidate",
      "platforms": [
        "Web",
        "Local"
      ],
      "technologies": [
        "Cloudflare Workers",
        "Workers AI",
        "Vectorize",
        "D1",
        "Anna SDK"
      ],
      "group": "current",
      "makerNote": "I built Meme Lab to test whether a model can pick the right reaction meme for a comment, with a public playground for feedback.",
      "purposeContract": {
        "purpose": "Turn one pasted comment or situation into a useful meme immediately.",
        "audience": "People selecting reactions for everyday conversations; the owner evaluates selection quality.",
        "outcome": "Return the best meme first, with four scored alternatives across distinct perspectives when available.",
        "mechanism": "A corrected 3,000-reference catalogue uses dual-view BGE embeddings and Vectorize to retrieve 30 candidates, then Jev rates tone, social fit, and distinct perspectives. GIF results load their full animated asset while the searchable collection uses lightweight still previews. The Anna review candidate uses the same shortlist with Anna-hosted contextual ranking and private saved reactions; it shares stable reference links without submitted situations. Anna version 1.2.0 adds user-supplied static templates and identity photos, one host image request, paired review, private generated-output storage and host PNG downloads."
      },
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://memes.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "nutrition-formula-engine",
      "name": "Formula Composition Engine",
      "description": "A browser-first formulation tool that converts reviewed batch formulas into traceable theoretical composition reports.",
      "form": "Formulation analysis web app",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Python",
        "Cloudflare Workers",
        "Cloudflare D1",
        "Vite",
        "Tesseract.js"
      ],
      "group": "current",
      "makerNote": "I built this to turn mixed-format batch formulas into traceable composition drafts while keeping uncertain ingredient identities visible and correctable.",
      "purposeContract": {
        "purpose": "Formula Composition Engine converts reviewed manufacturing formulas into theoretical macro, micronutrient, active-moiety, preservative, and missing-evidence reports.",
        "audience": "Food, nutraceutical, supplement, and medicinal-product formulation teams preparing composition work before label and regulatory review.",
        "outcome": "Recover a mixed-format formula, correct ambiguous rows and identities, and export a traceable non-zero composition report.",
        "mechanism": "Browser-local parsing and OCR feed a mandatory review step, then a Decimal-based Worker resolves versioned ingredient profiles, calculates normalized totals, ranges, coverage, and assumptions, and stores explicit saves in one public D1 history shared by every device."
      },
      "roster": "current",
      "availability": "internal-private"
    },
    {
      "id": "every-song-is-a-website",
      "name": "Every Song Is a Website",
      "description": "A playful static site where each of 143 songs gets its own interactive visual world — old desktop, picnic blanket, acid poster, neon night, or scrapbook page — with embedded video and licensed lyrics.",
      "form": "Static website",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "HTML",
        "CSS",
        "JavaScript",
        "Cloudflare Workers"
      ],
      "group": "current",
      "makerNote": "Built as a visual experiment: a composition system of themes, artifacts, and behaviours where each song becomes a tiny interactive world.",
      "purposeContract": {
        "purpose": "Every Song Is a Website gives each song a curated visual world — a shareable URL with embedded video, licensed lyrics, and playful interactions.",
        "audience": "Anyone who loves music and the web.",
        "outcome": "Browse 143 songs as interactive themed worlds.",
        "mechanism": "Static registry + theme skins (desktop, picnic, kinetic) + seeded layouts; YouTube and Genius embeds supply media and lyrics."
      },
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://music.significanthobbies.com",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "contextdaddy",
      "name": "ContextDaddy",
      "description": "A native Mac workspace for coding-agent skills, context, usage and telemetry, with a unified skill library, explicit local changes, and recovery history.",
      "form": "macOS app",
      "platforms": [
        "macOS",
        "Web"
      ],
      "technologies": [
        "SwiftUI",
        "Astro",
        "Cloudflare Workers"
      ],
      "group": "current",
      "makerNote": "ContextDaddy is supposed to handle all things AI agents locally (context, skills, usage, otel etc) to help debug/speed up",
      "purposeContract": {
        "purpose": "Help developers inspect coding-agent context, skill exposure, usage, and available local telemetry.",
        "audience": "Developers using multiple coding agents on a Mac.",
        "outcome": "Find actionable context and usage problems with evidence and explicit measurement limits.",
        "mechanism": "A native Mac app combines bounded discovery, previewed local skill management with recovery, offline usage history, and local OpenTelemetry views.",
        "proof": "Public 0.2.10 build 20 verified at https://context.daddyrad.com/download and GitHub release v0.2.10-20 (2026-10-09, source 95b88093e9f1f9786253bbdd6cbb3e66aa44fb6d). The live download SHA-256 51acdf9eb8a39f1b9555b702f4c9b498140dfd3f43445fd74bfa261e3d575bb2 matches the release asset and its live-publication receipt; the DMG and bundled ContextDaddy.app pass Gatekeeper as a notarized Developer ID build (notary status Accepted). Updates are delivered through the Sparkle appcast at https://context.daddyrad.com/updates/appcast.xml, which offers 0.2.10 build 20. Not installed or launched in this audit; in-app Sparkle installation remains unexercised. Discovery does not prove live prompt use and retains explicit entry/depth coverage limits.",
        "nextAction": "Download the signed 0.2.10 beta; open Skills and follow Guide. Later builds arrive through the in-app Sparkle update feed."
      },
      "footerArt": {
        "src": "/footer-art/contextdaddy.webp",
        "width": 2171,
        "height": 724,
        "alt": "ContextDaddy: An instruction-library workshop centers exposed skill cards in one rack and actual usage receipts in a separate ledger. A small window reveals incomplete observation; provenance tabs and a closed configuration drawer keep boundaries visible.",
        "focalX": 50,
        "focalY": 50,
        "credit": "Original illustration for ContextDaddy",
        "sha256": "81de7c1273d8b842a1456495296807b5310b3998d0f0be16d4a7616596365301"
      },
      "kind": "product",
      "category": "utility",
      "lifecycle": "active",
      "shareable": true,
      "deployed": true,
      "deploymentProviders": [
        "Cloudflare Pages",
        "Cloudflare Workers"
      ],
      "domains": [
        "context.daddyrad.com"
      ],
      "url": "https://context.daddyrad.com/",
      "repositoryUrl": "https://github.com/Significant-Hobbies/contextdaddy",
      "roadmapUrl": "https://github.com/Significant-Hobbies/contextdaddy/issues",
      "firstCommitAt": "2026-09-13",
      "latestCommitAt": "2026-09-26",
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://context.daddyrad.com/",
      "publicUrlLabel": "Visit website"
    },
    {
      "id": "agent-inbox",
      "name": "Agent Inbox",
      "description": "A local inbox for coding-agent status, attention requests and verified conversation replies.",
      "form": "Local macOS app",
      "platforms": [
        "macOS",
        "Local"
      ],
      "technologies": [
        "Electron",
        "TypeScript",
        "Swift"
      ],
      "group": "current",
      "makerNote": "I want a local inbox that shows which coding agents need me and lets me reach the correct conversation.",
      "purposeContract": {
        "purpose": "Notice local coding-agent work that needs attention and reply through a verified connection.",
        "audience": "The owner running local Claude Code and Codex conversations.",
        "outcome": "Find the correct live conversation, review its status and respond to requests without confusing transcripts with live sessions.",
        "mechanism": "A local inbox, floating pill and bounded lifecycle metadata connect observed agents to verified conversation transports or host-app handoff."
      },
      "roster": "current",
      "availability": "internal-private"
    },
    {
      "id": "techdata",
      "name": "techdata",
      "description": "A public, read-only data workbench: Nomad Atlas places, High Signal Podcasts claims, Reddit Insights, Research Papers and the full Product Hunt catalogue in one console with ⌘K search, filters, comparison and provenance-carrying exports.",
      "form": "Public data workbench",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Astro",
        "React",
        "Cloudflare Workers",
        "Hono",
        "SaaS Maker UI"
      ],
      "group": "current",
      "makerNote": "A public, read-only data workbench: Nomad Atlas places, High Signal Podcasts claims, Reddit Insights, Research Papers and the full Product Hunt catalogue in one console with ⌘K search, filters, comparison and provenance-carrying exports.",
      "purposeContract": {
        "purpose": "One public, indexable entry point to browse, search and export the owner's data collections with source provenance; content duplicates the five source sites, which stay live until the owner retires them.",
        "audience": "Anyone browsing these public datasets.",
        "outcome": "Answer questions across the data collections from one console without losing source provenance.",
        "mechanism": "Astro and React islands on one Worker with Hono /api routes and one read-only adapter per collection; every response carries provenance."
      },
      "roster": "current",
      "availability": "public-link",
      "publicUrl": "https://data.highsignal.app",
      "publicUrlLabel": "Visit website"
    }
  ],
  "archivedDirectory": [
    {
      "id": "gitstat",
      "name": "GitStat",
      "description": "An experimental public GitHub analysis tool for repository activity, contributions and code churn.",
      "form": "Web app",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "React",
        "Vite",
        "TypeScript",
        "Cloudflare Pages"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/gitstat"
    },
    {
      "id": "reel-pipeline",
      "name": "Reel Pipeline",
      "description": "A cost-bounded pipeline for planning, producing, and retaining short-form video artifacts.",
      "form": "Video pipeline",
      "platforms": [
        "CLI",
        "API",
        "Local"
      ],
      "technologies": [
        "Python",
        "Rust",
        "Cloudflare Workers",
        "R2"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/reel-pipeline"
    },
    {
      "id": "mobile-dev-cockpit",
      "name": "Mobile Dev Cockpit",
      "description": "A parked mobile supervision client retained for possible future reactivation.",
      "form": "Mobile app",
      "platforms": [
        "iOS",
        "Android"
      ],
      "technologies": [
        "React Native",
        "TypeScript"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/mobile-dev-cockpit"
    },
    {
      "id": "drank",
      "name": "DRank",
      "description": "Domain Rating intelligence for product, SEO, and market research.",
      "form": "Web tool",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Next.js",
        "React",
        "TypeScript",
        "Cloudflare Pages"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/drank"
    },
    {
      "id": "email-manager",
      "name": "Kinetic",
      "description": "A private Gmail workspace for local semantic search, sender insights, and explicit unsubscribe workflows.",
      "form": "Web app",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "React",
        "Hono",
        "Cloudflare Workers",
        "D1"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/email-manager"
    },
    {
      "id": "psi-swarm",
      "name": "PSI Swarm",
      "description": "Source-installed local Lighthouse audits with saved history; use the documented source setup, not the older packaged release.",
      "form": "Local performance tool",
      "platforms": [
        "Web",
        "CLI"
      ],
      "technologies": [
        "TypeScript",
        "Lighthouse",
        "SQLite",
        "Astro"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/psi-swarm"
    },
    {
      "id": "on-record",
      "name": "High Signal Podcasts",
      "description": "Search evidenced podcast claims and follow links back to the original episode or publication.",
      "form": "Podcast intelligence web app",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "Astro",
        "Hono",
        "Cloudflare Workers",
        "D1"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/on-record"
    },
    {
      "id": "issue-pages",
      "name": "IssuePages",
      "description": "Read public GitHub issues as focused articles; publishing requires repository-owner access.",
      "form": "Issue-backed publishing website",
      "platforms": [
        "Web",
        "GitHub"
      ],
      "technologies": [
        "Hono",
        "TypeScript",
        "Cloudflare Workers",
        "D1"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/issue-pages"
    },
    {
      "id": "everythingrated",
      "name": "EverythingRated",
      "description": "A ratings experiment for comparing AI developer tools, with visible small-sample counts and shareable weighting.",
      "form": "Ratings experiment",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Astro",
        "Next.js",
        "Cloudflare Workers",
        "D1"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/everythingrated"
    },
    {
      "id": "research-papers",
      "name": "Research Papers",
      "description": "Search academic papers and follow original sources; account-based research chat is not yet qualified.",
      "form": "Research library",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Astro",
        "Python",
        "React",
        "TypeScript"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/research-papers"
    },
    {
      "id": "materia",
      "name": "Materia",
      "description": "An educational body-and-remedy reference with condition-specific research citations and explicit uncertainty.",
      "form": "Interactive experiment",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Astro",
        "React",
        "Three.js",
        "Cloudflare Pages"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/materia"
    },
    {
      "id": "india-standards",
      "name": "India Standards",
      "description": "A transparent India demographic standards calculator using aggregate PLFS data, explicit uncertainty ranges, and clear source limits.",
      "form": "Reference web app",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "Next.js",
        "React",
        "TypeScript",
        "Cloudflare Workers"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/india-standards"
    },
    {
      "id": "chess",
      "name": "Chess Coach",
      "description": "Browser chess against Stockfish with optional AI move coaching.",
      "form": "Web game",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Astro",
        "React",
        "Vite",
        "Cloudflare Pages"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/chess"
    },
    {
      "id": "journal",
      "name": "Journal",
      "description": "A private iPhone journal for daily writing, reflection, and a personal archive that stays under the owner's control.",
      "form": "iOS app",
      "platforms": [
        "iOS",
        "Web"
      ],
      "technologies": [
        "SwiftUI",
        "Swift",
        "XcodeGen",
        "Astro"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/journal"
    },
    {
      "id": "ios-landings",
      "name": "iOS landings",
      "description": "Retained native-app landing and journal factory inside UI Library; product artwork, content, checks and existing deploy targets are preserved.",
      "form": "Retained landing factory inside UI Library",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Astro",
        "SaaS Maker UI",
        "Cloudflare Pages"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/ios-landings"
    },
    {
      "id": "protein-index",
      "name": "Protein Index",
      "description": "Explore dated nutrition records with original label links, observation dates and explicit verification limits.",
      "form": "Data API and web app",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "React",
        "Hono",
        "Cloudflare Workers",
        "D1"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/protein-index"
    },
    {
      "id": "veg-protein-food",
      "name": "Recipe Index",
      "description": "Search vegetarian recipes by protein and calories, with links to the original recipe publishers.",
      "form": "Food directory",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Astro",
        "Cloudflare Pages"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/veg-protein-food"
    },
    {
      "id": "mashup",
      "name": "Mashup",
      "description": "Two playable examples of a local media-editing pipeline, with captions and inspectable source and approval receipts.",
      "form": "Local media tool with public proof",
      "platforms": [
        "Web",
        "CLI",
        "Local"
      ],
      "technologies": [
        "Python",
        "FFmpeg",
        "Astro",
        "Cloudflare Pages"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/mashup"
    },
    {
      "id": "truehire",
      "name": "TrueHire",
      "description": "Earlier resume and hiring workflow superseded by RolePatch.",
      "form": "Hiring experiment",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Next.js",
        "React",
        "TypeScript",
        "Cloudflare"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/truehire"
    },
    {
      "id": "open-historia",
      "name": "Open Historia",
      "description": "Interactive historical storytelling and world simulation.",
      "form": "Strategy web game",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "React",
        "Vite",
        "Hono",
        "Cloudflare Workers"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/open-historia"
    },
    {
      "id": "ph-catalog",
      "name": "PH Catalog",
      "description": "A resumable local Product Hunt catalogue and analytics experiment with a privacy-safe synthetic demo.",
      "form": "Local catalogue and analytics toolkit",
      "platforms": [
        "CLI",
        "Local",
        "Web"
      ],
      "technologies": [
        "Python",
        "DuckDB",
        "Parquet"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/ph-catalog"
    },
    {
      "id": "companion-robot",
      "name": "Companion Robot",
      "description": "Earlier companion robotics and embodied-agent exploration.",
      "form": "Hardware experiment",
      "platforms": [
        "iOS",
        "macOS",
        "ESP32"
      ],
      "technologies": [
        "Swift",
        "Apple Vision",
        "ESP32",
        "Local AI"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/companion-robot"
    },
    {
      "id": "forecast-lab",
      "name": "Forecast Lab",
      "description": "Forecasting experiments and evaluation tooling.",
      "form": "Research toolkit",
      "platforms": [
        "CLI",
        "Web"
      ],
      "technologies": [
        "Rust",
        "Python",
        "PyTorch",
        "React",
        "Vite"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/forecast-lab"
    },
    {
      "id": "agent-office",
      "name": "Office OS",
      "description": "A local-first Mac workplace where named AI employees have bounded responsibilities and their work stays inspectable.",
      "form": "macOS app",
      "platforms": [
        "macOS",
        "Local"
      ],
      "technologies": [
        "SwiftUI",
        "SpriteKit",
        "Codex CLI"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/agent-office"
    },
    {
      "id": "local-ai-video-studio",
      "name": "Local AI Video Studio",
      "description": "A local-first Mac studio for comparing reproducible video-effect variants before export.",
      "form": "macOS app",
      "platforms": [
        "macOS",
        "Local"
      ],
      "technologies": [
        "SwiftUI",
        "AVFoundation",
        "Core Image",
        "VideoToolbox"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/local-ai-video-studio"
    },
    {
      "id": "field-track",
      "name": "Field Track",
      "description": "A labelled synthetic field-team demo for exploring routes, visits and agent summaries; Android tracking is not qualified.",
      "form": "Android app and dashboard",
      "platforms": [
        "Android",
        "Web",
        "API"
      ],
      "technologies": [
        "React Native",
        "MapLibre",
        "Cloudflare Workers",
        "D1"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/field-track"
    },
    {
      "id": "reddit-insights",
      "name": "Reddit Insights",
      "description": "Search a dated snapshot of 93 Reddit communities in your browser, with links to original posts and explicit provenance limits.",
      "form": "Research collector",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "TypeScript",
        "Cloudflare Workers",
        "R2"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/reddit-insights"
    },
    {
      "id": "verified-bases",
      "name": "Verified Bases",
      "description": "A retained research-data identity with no retained local Git history or standalone public destination.",
      "form": "Research dataset",
      "platforms": [
        "GitHub"
      ],
      "technologies": [
        "Markdown",
        "Git"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/verified-bases"
    },
    {
      "id": "nomad-data-adventure",
      "name": "Nomad Data Adventure",
      "description": "Nomad Atlas explores 1,374 terrestrial places with living-cost profiles, lifestyle filters, city comparisons and downloadable source data credited to Nomads.com.",
      "form": "Static city explorer",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Cloudflare Pages",
        "JavaScript",
        "HTML",
        "CSS"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/nomad-data-adventure"
    },
    {
      "id": "slow-serp",
      "name": "Slow SERP",
      "description": "A private HTTP-first crawler and paced search service with bounded Chrome fallback.",
      "form": "Local service and CLI",
      "platforms": [
        "macOS",
        "Local"
      ],
      "technologies": [
        "Node.js",
        "Cheerio",
        "Playwright"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/slow-serp"
    },
    {
      "id": "shoulders",
      "name": "Shoulders",
      "description": "An editorial exploration of software foundations. Cancelled local prototype.",
      "form": "Static technical explainer",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "Astro",
        "TypeScript"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/shoulders"
    },
    {
      "id": "agent-testing",
      "name": "Browser Agent Testing",
      "description": "A completed local web and iOS experiment comparing browser-agent strategies with independent verification.",
      "form": "Completed benchmark and static guide",
      "platforms": [
        "Web",
        "iOS",
        "CLI"
      ],
      "technologies": [
        "Node.js",
        "Cloudflare Workers",
        "Playwright",
        "Maestro"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/agent-testing"
    },
    {
      "id": "scale",
      "name": "Scale",
      "description": "The original standalone Scale idle-game prototype, superseded by the game inside SWE Interview Prep.",
      "form": "Idle game prototype",
      "platforms": [
        "Web",
        "Local"
      ],
      "technologies": [
        "Vite",
        "TypeScript"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/scale"
    },
    {
      "id": "war-chest",
      "name": "War Chest",
      "description": "An experimental local tactical war game.",
      "form": "Local macOS game",
      "platforms": [
        "macOS",
        "Local"
      ],
      "technologies": [
        "Godot",
        "GDScript"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/war-chest"
    },
    {
      "id": "mentionpilot",
      "name": "MentionPilot",
      "description": "Evidence-first visibility research across AI answers and selected community signals.",
      "form": "Web intelligence workspace",
      "platforms": [
        "Web",
        "API"
      ],
      "technologies": [
        "Next.js",
        "Cloudflare Workers",
        "D1",
        "Drizzle",
        "Better Auth"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/mentionpilot"
    },
    {
      "id": "daddyrad",
      "name": "DaddyRad",
      "description": "Series home and a local read-only MCP source preview for performance, storage, browser rules and agent context.",
      "form": "website",
      "platforms": [
        "Web",
        "macOS"
      ],
      "technologies": [
        "Swift",
        "MCP",
        "Cloudflare Workers"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/daddyrad"
    },
    {
      "id": "digital-life",
      "name": "Digital Life",
      "description": "A bounded experimental world of resource-conserving bytecode organisms.",
      "form": "Local research sandbox",
      "platforms": [
        "Node.js",
        "Web"
      ],
      "technologies": [
        "JavaScript",
        "Node.js"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/digital-life"
    },
    {
      "id": "human-v2",
      "name": "Human V2",
      "description": "One-page body experiments with a locally qualified coupled physiology engine, simultaneous mechanisms and explicit yearly/fatal prediction limits.",
      "form": "Browser optimization arena",
      "platforms": [
        "Web"
      ],
      "technologies": [
        "React",
        "TypeScript",
        "Pulse Physiology Engine",
        "Node.js"
      ],
      "roster": "archived",
      "availability": "archived",
      "profileUrl": "https://sassmaker.com/p/human-v2"
    }
  ],
  "historySemantics": "firstCommitAt and latestCommitAt are dates from the currently retained Git history. They are not incorporation, launch, or retirement dates.",
  "pastProjects": [
    {
      "id": "ai-badges",
      "name": "AI Badges",
      "description": "Embeddable README badges for declaring AI contribution and welcoming AI-assisted pull requests.",
      "category": "utility",
      "shareable": true,
      "repositoryUrl": "https://github.com/sarthakagrawal927/ai-badges",
      "purposeContract": {
        "purpose": "Embeddable README badges for declaring AI contribution and welcoming AI-assisted pull requests.",
        "audience": "Maintainers who want visible AI-use declarations in repository READMEs.",
        "outcome": "Embed a badge representing an explicit AI-use declaration.",
        "mechanism": "Public HTTP endpoints render the requested declaration as SVG.",
        "proof": "The public homepage and documented percentage and AI-PR SVG endpoints returned successful responses.",
        "nextAction": "Copy a documented badge example into a README."
      },
      "lifecycle": "inactive"
    },
    {
      "id": "pinpoint",
      "name": "Pinpoint",
      "description": "A local developer preview for selecting an app element, attaching a comment and handing context to a coding agent.",
      "category": "utility",
      "shareable": true,
      "repositoryUrl": "https://github.com/sarthakagrawal927/pinpoint",
      "purposeContract": {
        "purpose": "A local developer preview for selecting an app element, attaching a comment and handing context to a coding agent.",
        "audience": "Developers giving UI-specific feedback to coding agents.",
        "outcome": "Attach feedback to a selected element in a running demo.",
        "mechanism": "A browser feedback surface connects element context with a local development workflow.",
        "proof": "16 tests pass and the documented local demo serves successfully; broad framework support is not claimed.",
        "nextAction": "Install the repository dependencies and run the documented demo."
      },
      "lifecycle": "inactive"
    },
    {
      "id": "port-whisperer",
      "name": "Port Whisperer",
      "description": "A command-line port scanner with framework detection and structured output for local development.",
      "category": "utility",
      "shareable": true,
      "repositoryUrl": "https://github.com/sarthakagrawal927/port-whisperer",
      "purposeContract": {
        "purpose": "A command-line port scanner with framework detection and structured output for local development.",
        "audience": "Developers identifying services listening on their own machine.",
        "outcome": "Inspect listening ports and retrieve structured service information.",
        "mechanism": "A Rust command-line scanner produces human-readable and JSON port data.",
        "proof": "62 tests pass and the JSON command produced live local port data.",
        "nextAction": "Follow the README installation instructions and run a local scan."
      },
      "lifecycle": "inactive"
    },
    {
      "id": "society-relay",
      "name": "Society Relay",
      "description": "A fixture-driven community repair-planning experiment with human approval, work orders and calendar export.",
      "category": "experimental",
      "shareable": true,
      "repositoryUrl": "https://github.com/sarthakagrawal927/society-relay",
      "purposeContract": {
        "purpose": "A fixture-driven community repair-planning experiment with human approval, work orders and calendar export.",
        "audience": "Builders exploring human-approved coordination for apartment communities.",
        "outcome": "Walk a fixture repair request through approval, a work order and calendar export.",
        "mechanism": "A Strands agent coordinates the workflow with explicit human approval steps.",
        "proof": "55 tests and fixture-mode end-to-end approval, work-order and calendar export checks passed.",
        "nextAction": "Run the documented fixture demo from the public repository."
      },
      "lifecycle": "inactive"
    }
  ],
  "learnings": [
    {
      "slug": "a-structured-alternative-to-a-product-launch-spreadsheet",
      "title": "A structured alternative to a product-launch spreadsheet",
      "description": "Learn how to replace your stale product-launch spreadsheet with a structured, verifiable JSON dataset. Explore a scalable architecture for tracking launch directories, PR metrics, and link status.",
      "publishedAt": "2026-09-20",
      "publishedLabel": "September 20, 2026",
      "readingTime": "7 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/a-structured-alternative-to-a-product-launch-spreadsheet",
      "markdown": "# A structured alternative to a product-launch spreadsheet\n\n- Published: 2026-09-20\n- Author: Sarthak Agrawal\n- Reading time: 7 min read\n- Canonical HTML: https://sassmaker.com/learnings/a-structured-alternative-to-a-product-launch-spreadsheet\n\n## Introduction: The decay of the launch spreadsheet\n\nWhen preparing to launch a new product or service, makers and marketing teams routinely compile a \"product-launch spreadsheet.\" This document typically starts as a pristine list of directories, review sites, communities, and press outlets. It includes columns for the platform's name, domain, submission link, and perhaps some metrics like monthly traffic or Domain Rating (DR) to prioritize effort.\n\nInitially, this spreadsheet is a powerful asset. It serves as the master checklist for release day. However, spreadsheets are inherently static, manual documents. Over time, the data within them begins to rot. A directory that offered free, \"do-follow\" links last year might now charge a premium or append \"no-follow\" tags to all outbound links. A submission URL might 404, or the platform itself might pivot or shut down entirely.\n\nBecause updating a spreadsheet requires manual verification of dozens or hundreds of rows, the task is almost never done thoroughly. The result is a degraded asset. When the next product is ready to launch, the team relies on stale data, wasting hours submitting to dead links or low-value directories that no longer provide SEO or acquisition benefits.\n\nA structured alternative is required. By treating launch data not as an informal list but as a rigorously structured, machine-readable dataset, teams can programmatically verify links, track conflicting metrics, and generate native user interfaces that always reflect the current state of the landscape.\n\n## From spreadsheet to structured dataset\n\nThe fundamental flaw of the launch spreadsheet is that it mixes data storage with presentation and lacks any schema enforcement. A cell meant to contain a Domain Rating integer might instead contain the string \"N/A\" or \"Maybe 50?\". A cell meant for a URL might just have the word \"Email them.\"\n\nMoving to a structured dataset—such as a JSON file—forces rigor. It requires defining exactly what constitutes a valid launch destination. In a structured system, the dataset becomes the single source of truth, decoupled from how it is viewed. You can render it as an internal dashboard, a public directory, or consume it via automated scripts that periodically check if submission URLs still return a 200 OK HTTP status.\n\nThis approach aligns with modern software engineering practices: data as code. When your launch directory is a JSON file checked into version control, every change is tracked. If a team member updates the pricing model for a directory from \"free\" to \"paid,\" that change is visible in a commit history, complete with a timestamp and author.\n\nFurthermore, this architecture allows for a \"generated dataset\" model. The raw source might live in a private repository or a dedicated workspace, and a sanitized, filtered version is synchronized into the public or production environment. This prevents sensitive notes or unverified research from accidentally leaking, while ensuring the production application always has the latest approved data.\n\n## Anatomy of a launch destination record\n\nTo understand the power of a structured alternative, we must examine the anatomy of a well-designed launch destination record. Rather than a flat row of unconstrained text, a structured record captures the nuanced reality of dealing with third-party platforms.\n\nConsider the following core attributes that define a robust launch destination schema:\n\n**Identity and Routing:**\nEvery record needs a `name`, a base `domain`, and a primary `website` URL. Crucially, it also needs a `submissionUrl`. Separating the homepage from the actual form or page where a submission occurs saves significant time during the launch process. If a platform does not have a direct submission form but requires email outreach or research, the dataset can explicitly capture this state (e.g., setting `submissionUrl` to null and assigning a specific `route` like \"needs-research\").\n\n**Categorization and Cost:**\nNot all launch platforms serve the same purpose. A `category` field (such as \"Directory\", \"Press\", \"AI\", \"Marketplace\", or \"Review\") allows teams to filter the dataset based on their current objective. A `pricing` field (with enforced values like \"free\", \"freemium\", \"paid\", or \"unknown\") prevents the frustrating experience of filling out a lengthy form only to be hit with an unexpected paywall at the end.\n\n**SEO Metrics:**\nFor many makers, the secondary benefit of launching is acquiring backlinks. A structured record must capture the Domain Rating (`dr`) and the `link` attribute type (\"follow\", \"nofollow\", or \"unknown\"). Because SEO metrics are often aggregated from various lists, the dataset should also record the `provider` of that metric (e.g., \"Ahrefs\") and the date it was `retrieved`.\n\n**Eligibility and Constraints:**\nMany directories have strict rules. A marketplace might only accept operating businesses for sale, while another site only lists native mobile apps. An `eligibility` string allows the curator to attach specific constraints, ensuring time isn't wasted applying to platforms where the product does not fit.\n\n## Verifying claims and managing data rot\n\nThe most significant advantage of a structured dataset over a spreadsheet is the ability to handle uncertainty and conflicting information gracefully. In the real world, data about third-party sites is often messy and contradictory.\n\nA spreadsheet forces you to pick one number for a Domain Rating. A structured dataset allows you to record an array of `claims`. For example, one source list might claim a directory has a DR of 34 and provides a \"nofollow\" link, while another source claims a DR of 39 and an \"unknown\" link status. By storing these claims as an array of objects within the record, you preserve the history and the conflict.\n\nThis leads to the implementation of `flags`. A structured system can programmatically analyze the claims and append flags to the record, such as \"DR sources disagree\" or \"Link sources disagree.\" Other flags can indicate structural issues, like \"Source path requires review\" or \"Submission path may be truncated.\" These flags serve as a built-in to-do list for data maintenance, highlighting exactly which records require human verification.\n\nWhen a record is deemed too unreliable—perhaps the source data is highly suspect or the domain is consistently failing to resolve—it can be marked with a `quarantined` boolean. Quarantined records are preserved in the dataset so the team knows they have been evaluated and rejected, but they can be automatically filtered out of any active launch views or automated tasks.\n\nThis concept of data provenance—recording the `sourceUrl` where a destination was discovered—transforms a random list of links into an auditable database.\n\n## Integrating the dataset into your workflow\n\nOnce the data is structured, it can be integrated directly into the product ecosystem. Instead of a standalone file that people forget to check, the dataset becomes a native part of the team's tooling.\n\nFor instance, a structured launch dataset can be rendered as a dedicated section within a product showcase or portfolio site. By reading the JSON natively, the frontend can provide instantaneous filtering by category, pricing, and link type. It can render compact, accessible UI components that display the purpose, platform, and prominent tools associated with each launch destination.\n\nBecause the data is separate from the presentation, it can be consumed by multiple surfaces. The same JSON file that powers a visual directory can be exposed as an API endpoint, made available as a downloadable Markdown file, or served to AI agents via a machine-readable JSON contract.\n\nIn a mature architecture, the raw source of this data is carefully guarded. It lives in a primary, owner-local environment where edits are validated against the schema. When the team is ready to publish an update, a synchronization script projects the public-facing fields into a checked-in, generated dataset (e.g., `launchdesk.json`). The public application only ever reads this generated projection, ensuring that internal notes, unverified routes, or private API keys are never exposed to the client at runtime.\n\nThis workflow guarantees that the launch data is treated with the same respect and architectural rigor as the core product code. When the dataset changes, it triggers continuous integration checks. If someone accidentally introduces a formatting error or a schema violation, the build fails before the error reaches production.\n\n## A practical next action\n\nIf you are currently relying on a manual spreadsheet to track your product launches, the first step toward a structured alternative is to define your schema.\n\nDo not try to migrate all your data at once. Start by creating a simple JSON file and modeling a single launch destination. Define the absolute minimum fields you need: `name`, `website`, `submissionUrl`, `category`, and `pricing`.\n\nWrite a small script—perhaps in Node.js or Python—that reads your existing CSV or spreadsheet and maps the columns to your new JSON schema. As you run the script, you will immediately notice the inconsistencies in your legacy data: missing URLs, mixed casing, and non-standard categories.\n\nCommit this JSON file to a repository. From there, you can begin writing simple validation scripts to check for required fields, or a small frontend component to render the data beautifully. By taking this first step, you move away from static, decaying documents and toward a living, maintainable system for your launch strategy.\n",
      "url": "https://sassmaker.com/learnings/a-structured-alternative-to-a-product-launch-spreadsheet"
    },
    {
      "slug": "data-quality-checks-for-a-launch-directory-catalog",
      "title": "Data-Quality Checks for a Launch-Directory Catalog",
      "description": "Discover a structural approach to catalog data quality. Learn how to separate private metadata from public directories and enforce strict schema checks without a traditional database.",
      "publishedAt": "2026-09-17",
      "publishedLabel": "September 17, 2026",
      "readingTime": "6 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/data-quality-checks-for-a-launch-directory-catalog",
      "markdown": "# Data-Quality Checks for a Launch-Directory Catalog\n\n- Published: 2026-09-20\n- Author: Sarthak Agrawal\n- Reading time: 6 min read\n- Canonical HTML: https://sassmaker.com/learnings/data-quality-checks-for-a-launch-directory-catalog\n\nWhen managing a software product directory, launch catalog, or portfolio register, the most pervasive risk is not downtime or styling errors, but data drift. Across dozens of application identities—some active, some parked, some strictly internal—metadata naturally fractures. If public-facing presentation logic is allowed to read directly from a complex, messy data layer, the presentation itself becomes fragile. Worse, if a human maintains the public-facing directory by hand-editing its source JSON, they risk inadvertently breaking links, corrupting platform metadata, or exposing internal notes intended only for the builder.\n\nThe alternative to a fragile hand-edited catalog is a generated projection backed by strict, automated data-quality checks. By treating the directory as a strict transformation pipeline, teams can maintain absolute control over the structural integrity of the catalog. The following principles explore how to establish a durable, check-driven environment for a multi-product launch directory, utilizing explicit schema boundaries and non-destructive transformations.\n\n### The Single Source of Truth: A Private JSON Source\n\nThe foundation of robust catalog data quality is separating the owner’s raw domain metadata from what the public consumes. A directory’s raw truth must live in a private, owner-local source. It should act as an authoritative map of product identities, containing internal fields—such as financial purpose, lifecycle priority, operational state, or raw owner narratives—that are vital for internal maintenance but inappropriate for public audiences.\n\nEstablishing a versioned schema—such as a defined “Schema Version 2”—ensures that any application or script parsing the catalog understands exactly how to interpret the structures. The source file becomes a rigid database table represented as plain text.\n\nRather than hand-editing a public directory array and hoping the properties align, an operator modifies this private source. The separation guarantees that public-facing pages never parse raw Fleet operations data. The public site will only ever consume a carefully projected export. This immediately isolates sensitive state—such as API endpoints, infrastructure dependencies, or unlaunched experiments—from the deployed directory.\n\n### Lossless Mapping and Retention Strategies\n\nData transformations often fail silently by discarding properties they don’t recognize. In a living directory, removing an unrecognized metadata field simply because a new script hasn't mapped it can destroy historical context.\n\nA resilient catalog mapping script employs a lossless storage philosophy. It reads the raw metadata and maps known fields into their corresponding structured homes: moving a raw “portfolio.futureForm” to a “classification.futureForm” structure, or aligning “portfolio.status” under “lifecycle.portfolioStatus”.\n\nCrucially, rather than discarding unmapped properties, the transformation script explicitly retains them. By creating an isolated “retainedFields” payload, all unmapped fields—be they legacy product flags or misnamed infrastructure keys—are kept verbatim.\n\nWhen generating compatibility catalogs for other consumers, this mapping works in reverse. It ensures that an unknown or legacy field is preserved byte-for-byte. A robust script guarantees that if an inverse transformation is run, the final output matches the exact pre-migration snapshot. This approach turns a fragile data-migration step into a rigorous, verifiable action that protects owner decisions from silent deletion.\n\n### Validating Data Integrity with Structural Scripts\n\nHaving a lossless mapping is powerful, but enforcing it requires structural quality scripts. The maintenance of a launch directory relies on a suite of discrete, executable checks designed to validate the catalog before any consumer—public or internal—ever sees it.\n\nA well-architected repository relies on specific check scripts rather than monolithic testing frameworks to enforce boundaries:\n\n- **Source Integrity Checks**: A script (e.g., `check-catalog-source.mjs`) is responsible for reading the raw, private JSON and verifying that it conforms precisely to the required versioned schema. If the script detects that a field is placed incorrectly or that a required project ID is missing, the check fails immediately. It actively rejects fields that would be silently lost during generation.\n- **Schema Testing**: Dedicated tests (e.g., `catalog-schema.test.mjs`) validate the field mapping logic itself. They verify that when the catalog schema is transformed, known legacy fields land in the correct structured objects, and unknown fields are reliably tucked into the retained payload.\n- **Operations Compatibility Verification**: To support secondary systems—like internal health checkers or dashboard endpoints—the catalog must often be represented in a compatibility view. A script generates this view and explicitly blocks duplicate directory metadata or conflicting retained fields.\n\nBy utilizing plain JavaScript or Node.js scripts for validation, the directory pipeline avoids relying on external ORMs or heavy database validation layers, making it highly portable and exceptionally fast.\n\n### Protecting the Public Export\n\nThe most critical operation in managing a launch directory is projecting the public export. The public build pipeline must never be permitted to access or parse the private source catalog.\n\nInstead, a synchronizing script acts as a one-way valve. It reads the authoritative private data and explicitly constructs a filtered, privacy-safe projection. This script enforces owner-level decisions: if a project's `sharing.shareable` flag is false, or if it represents a hidden operational boundary, the record is deliberately omitted from the export.\n\nThe public export only receives the fields necessary to render the directory—such as canonical public domains, presentation metadata, prominent tools, and curated changelog locations. Once generated, this filtered JSON acts as the sole data boundary for the public website.\n\nBecause the generation script handles the redaction, the front-end code of the launch directory remains remarkably simple. It doesn't need to check privacy flags or filter out unlaunched apps at runtime, significantly reducing the risk of a bug accidentally leaking internal details. The generated file is checked into version control, meaning the public site can be built and deployed securely without runtime access to the private state.\n\n### Continuous Integration and Deploy Guardrails\n\nAutomated checks are only useful if they act as hard guardrails. The entire data-quality pipeline is enforced by the project’s Continuous Integration (CI) and build lifecycle.\n\nRather than relying on human diligence to run validation scripts, a dedicated command (e.g., a \"deploy guard\") acts as a gatekeeper. Before the launch directory can be built or deployed, the deployment script executes a complete synchronization and validation pass. It triggers the schema tests, checks the source integrity, verifies the operations map, and ensures the generated public projection perfectly reflects the current source state.\n\nIf the owner has manually modified the public projection, or if an edit to the private source introduces a malformed record, the checks fail and block the deployment. CI is configured to require exact-source successful execution. This ensures that what reaches production is an explicitly authorized, structurally sound, and privacy-filtered map of the builder’s portfolio.\n\n### Conclusion\n\nMaintaining a dynamic launch directory without a traditional database is not only possible but, when governed by strict data-quality checks, highly resilient. By completely separating private, owner-local source truth from a generated public projection, developers protect sensitive operational context.\n\nRelying on lossless schema mapping ensures historical data is never discarded accidentally, while explicit validation scripts—from schema testing to structural source checks—catch errors before they propagate. Bound together by continuous integration guardrails, these principles ensure that the public directory remains a predictable, living record of product identities, free from data drift and manual editing mistakes.\n\n---\n\n### Practical Next Action\nReview your current public launch directory or catalog. Identify if public front-ends are querying data that contains private or internal-only fields. If so, draft a simple Node script to generate a stripped-down, privacy-filtered JSON projection, and configure your site to read solely from that output.\n",
      "url": "https://sassmaker.com/learnings/data-quality-checks-for-a-launch-directory-catalog"
    },
    {
      "slug": "free-vs-paid-product-directories-how-to-decide",
      "title": "Free vs paid product directories: how to decide",
      "description": "An evidence-based guide on evaluating free versus paid product directories for SaaS discovery, based on real portfolio management and catalog curation strategies.",
      "publishedAt": "2026-09-14",
      "publishedLabel": "September 14, 2026",
      "readingTime": "6 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/free-vs-paid-product-directories-how-to-decide",
      "markdown": "# Free vs paid product directories: how to decide\n\n- Published: 2026-09-20\n- Author: Sarthak Agrawal\n- Reading time: 6 min read\n- Canonical HTML: https://sassmaker.com/learnings/free-vs-paid-product-directories-how-to-decide\n\nWhen launching a new SaaS product, developers and founders face an immediate distribution challenge: getting early discovery without spending heavily on acquisition channels before validating the market. Product directories represent a critical early distribution strategy, but founders quickly encounter a choice between free and paid directory listings.\n\nThis guide provides an evidence-based framework for deciding when to use free directories, when to consider paid listings, and how to build a lasting distribution footprint. This framework is informed by building and curating **SaaS Maker**, a public product directory and portfolio tool managing 50+ real product identities.\n\n## The role of product directories in early SaaS distribution\n\nProduct directories serve three distinct purposes for early-stage software:\n1. **Initial discovery and traffic:** Directories provide a centralized hub for early adopters searching for new tools within specific categories.\n2. **Backlink authority:** Listings from established directories often provide domain authority that signals trust to search engines.\n3. **Structured validation:** Categorized listings force founders to distill their positioning into clear formats—defining purpose, audience, and prominent technologies.\n\nWhile building the **SaaS Maker** directory, we synthesized these requirements into a \"privacy-safe synthetic-demo profile\" and structured data models. A well-constructed directory listing doesn't merely point a link; it clearly establishes the product's taxonomy, such as its application form (e.g., Desktop app, Web application), platform support, and the key problem it solves.\n\n## Evaluating free product directories\n\nFree product directories form the foundation of most SaaS launch strategies. They typically require an application or a structured submission but do not charge a monetary fee for inclusion.\n\n### Strengths\n\nThe primary strength of free directories is their accessibility. They allow founders to run multiple product experiments without financial risk. By submitting to free directories, a maker can test different positioning statements, screenshots, and feature highlights to see which resonate most effectively with early audiences.\n\nFurthermore, many reputable, highly trafficked directories are structurally free. They curate based on product quality, novelty, or specific technological stacks rather than payment.\n\n### Strategic application\n\nTo leverage free directories effectively, founders should prioritize curation over volume. Rather than submitting to hundreds of low-quality link farms, focus on directories that maintain high editorial standards. A directory that carefully reviews entries and structures its data (similar to the way SaaS Maker enforces valid JSON schema for its `projects.json` and public exports) is more likely to provide durable value.\n\nWhen using free directories, the quality of the submitted metadata is the primary variable the founder controls. A directory entry is only as effective as its clarity.\n\n### Concrete examples from the SaaS Maker ecosystem\n\nConsider how SaaS Maker categorizes the product **CodeVetter**. Its listing isn't simply a name and a link. It is categorized structurally:\n- **Category:** utility\n- **Form:** Desktop app\n- **Platforms:** macOS\n- **Prominent tools:** Swift, SwiftUI, Rust, SQLite\n\nA free directory that allows for this level of structured indexing provides significantly more discovery surface area than one that only accepts a generic description. By submitting highly structured, accurate metadata to free directories, founders ensure their products surface in precise, intent-driven searches.\n\nAdditionally, SaaS Maker incorporates a specific `purposeContract` that outlines the outcome (\"Higher confidence that an agent completed the requested change correctly and safely\") and the mechanism (\"Local-first review combines repository context...\"). Free directories that prompt founders for this level of detail often deliver higher-intent traffic.\n\n## Evaluating paid product directories\n\nPaid directories typically guarantee listing placement, faster review times, or specialized newsletter promotions in exchange for a fee.\n\n### Potential advantages\n\nFor established products with validated conversion rates, paid directories can function as a direct acquisition channel. If a founder knows that every 100 visitors from a specific directory category yields three paying customers, paying for a premium placement becomes a simple arithmetic decision.\n\nPaid directories can also be useful for products operating in highly competitive, commoditized spaces where organic visibility in free directories is quickly buried under hundreds of daily submissions.\n\n### Risks and diminishing returns\n\nThe primary risk of paid directories for early-stage SaaS is paying for vanity metrics rather than validated distribution. If a product hasn't proven its core value proposition, driving paid traffic to it will only accelerate burn rate without generating meaningful learnings.\n\nFurthermore, many low-tier paid directories offer inflated promises of SEO benefits that fail to materialize. Search engines increasingly devalue links from directories that exist solely to sell placements, prioritizing instead directories with genuine curation and organic traffic.\n\n## An evidence-backed framework for making the decision\n\nBased on the operational realities of managing a portfolio directory, founders should adopt a staged approach to directory submission.\n\n### Stage-based decision making\n\n**Stage 1: Validation (Free Only)**\nDuring the initial launch phase, focus entirely on free, highly curated directories. Use this stage to test positioning. If your product is a macOS utility like CodeVetter, target directories specifically focused on native Apple tools or developer utilities. Do not pay for placement until you have verified that your application actually functions as described and converts organic traffic.\n\n**Stage 2: Growth (Selective Paid)**\nOnce you have established a baseline conversion rate from organic directory traffic, identify the top two or three directories that currently drive your best users. If those specific directories offer paid acceleration (such as a featured placement or newsletter inclusion), carefully experiment with a small budget. Measure the direct ROI of the placement against your established baseline.\n\n**Stage 3: Portfolio Management (Internal Directory)**\nAs your portfolio grows, external directories become less critical than controlling your own distribution. This is the model demonstrated by **SaaS Maker**. By building an owned directory (e.g., `sassmaker.com/projects`), a maker transitions from relying on third-party platforms to building an internal audience. The SaaS Maker architecture uses a single, owner-local `catalog/projects.json` to generate a static, public-facing directory of 50+ validated products. This ensures that the founder controls the canonical destination for their entire body of work.\n\n### Controlling the canonical destination\n\nWhether using free or paid external directories, the ultimate goal should be to drive users back to an owned, canonical destination. The directory listing is merely a routing mechanism.\n\nIn the SaaS Maker ecosystem, this principle is strictly enforced. The internal catalog uses rigorous schema validation to project data to the public directory, ensuring that all public links and deployment evidence point to the correct, actively maintained destination. When evaluating any external directory (free or paid), verify that it allows you to clearly specify and update your canonical product URL.\n\n## Practical next action\n\nBefore submitting to any new directory—free or paid—audit your existing product metadata. Ensure you have defined a clear, structured \"Purpose Contract\" for your application:\n1. What is the explicit purpose?\n2. Who is the target audience?\n3. What is the intended outcome?\n4. What is the technical mechanism?\n\nUse this structured contract to evaluate potential directories. If a directory (free or paid) does not allow you to articulate this contract clearly, it is likely not worth your time or money. Once your metadata is solid, begin with high-quality free submissions to validate your messaging before committing budget to paid placements.\n",
      "url": "https://sassmaker.com/learnings/free-vs-paid-product-directories-how-to-decide"
    },
    {
      "slug": "how-to-identify-real-submission-routes-in-launch-directories",
      "title": "How to identify real submission routes in launch directories",
      "description": "Stop wasting time on dead links and scraped lists. Learn how to identify verified submission routes for SaaS launch directories.",
      "publishedAt": "2026-09-11",
      "publishedLabel": "September 11, 2026",
      "readingTime": "7 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/how-to-identify-real-submission-routes-in-launch-directories",
      "markdown": "# How to identify real submission routes in launch directories\n\n- Published: 2026-09-20\n- Author: Sarthak Agrawal\n- Reading time: 7 min read\n- Canonical HTML: https://sassmaker.com/learnings/how-to-identify-real-submission-routes-in-launch-directories\n\nWhen marketing a new software product, submitting it to launch directories is often step one. However, the ecosystem of software directories is heavily polluted. Most founders rely on massive spreadsheets or GitHub repositories promising hundreds of high-authority sites. The reality is that the vast majority of these lists contain outdated information, missing submission routes, or fundamentally mismatched intents.\n\nIf you attempt to systematically submit to these directories without evaluating their real submission paths, you will lose hours navigating dead links, deceptive \"pay-to-play\" funnels, and domains that no longer accept new products. To efficiently place your product where it belongs, you must learn to identify and verify real submission routes before you begin the labor of data entry.\n\nThis guide details a methodology for evaluating launch directories, spotting broken links, and confirming active submission paths, avoiding the trap of unverified aggregate lists.\n\n## The Problem with Aggregated Directory Data\n\nMany widespread lists of launch directories suffer from severe data decay. They are assembled by scraping other lists, leading to a compounding effect of outdated information. A domain might change ownership, drop its submission form, or alter its focus, but the directory entry in the aggregate list remains static.\n\nConsider a typical dataset of over a thousand directories. In a recent analysis of a large aggregate file, out of 1004 recorded destinations, a staggering 687 were flagged as \"needs-research\" regarding their actual submission route. Only 317 had a \"source-reported\" submission URL. This means that over 68% of the directories listed in a typical raw compilation lack an immediately actionable path for submission.\n\nFurthermore, simply having a `submissionUrl` listed is no guarantee of success.\n\n### Case Study: Mismatched Intent\n\nAggregated lists often fail to distinguish between the core purpose of a directory. For example, a list might include \"acquire.com\" with a submission URL of `https://acquire.com/sellers`. While technically a valid submission route, it is entirely inappropriate for a new SaaS product launch. Acquire.com is a marketplace for selling operating businesses, not a directory for discovering newly launched tools.\n\nTreating this entry as a standard launch directory wastes time and effort. You must always verify the directory's intent aligns with your goal: early-stage product discovery.\n\n## Classifying and Verifying Submission Routes\n\nTo navigate this landscape efficiently, you need a system for classifying the directories you find. A practical approach is to divide them into distinct queues based on the quality of the available data.\n\n### 1. The \"Source-Reported\" Queue\n\nDirectories in this queue have an explicit, recorded submission URL. However, \"source-reported\" does not mean \"verified.\" It simply means the list you are consulting claims this URL exists.\n\nTake, for instance, `1000.tools`. An aggregate list might provide the submission URL `https://1000.tools/my/tools/create`. Before you prepare your product descriptions and images, you must test this link. Does it redirect to a 404 page? Does it demand immediate payment? Does it require an account creation process that ultimately leads nowhere?\n\nAnother example is `a1.gallery`, which might be listed with the submission URL `https://www.a1.gallery/submit`. The source reporting this link might not have verified the current acceptance requirements or pricing. The link exists, but the viability of the submission is unknown until manually checked.\n\n**How to verify:**\n1.  **Direct Navigation:** Click the link. Does it load a form?\n2.  **Authentication Gate:** Many directories require you to create an account before you can see the submission form. Create a burner account to verify the form actually exists behind the login screen.\n3.  **Hidden Paywalls:** Progress through the first few steps of the form. Sometimes directories hide a mandatory payment step at the very end of a lengthy submission process.\n\n### 2. The \"Needs-Research\" Queue\n\nThe majority of directories you encounter in large lists will fall into this category. The domain is provided, but the specific path to submit a product is missing (`null`).\n\nFor example, a directory like `10 Words` (10words.io) might appear on a list with no submission URL provided. You cannot assume the directory is closed; you must investigate.\n\n**How to investigate missing routes:**\n1.  **The Footer Hunt:** The most common location for a submission link is in the website's footer. Look for terms like \"Submit,\" \"Add Tool,\" \"Add Product,\" \"Submit SaaS,\" or \"For Founders.\"\n2.  **Navigation Menus:** Check the primary header navigation. Some directories prominently feature a \"Submit\" button to encourage contributions.\n3.  **\"Claim Your Profile\" Links:** If the directory aggressively scrapes data, your product might already be listed. Search the directory for your domain. If you find a placeholder page, look for a \"Claim this profile\" or \"Update information\" link. This is often the de facto submission route.\n4.  **Google Site Search:** If manual navigation fails, use Google. Search `site:domain.com \"submit\"` or `site:domain.com \"add tool\"`. This can surface hidden or deprecated forms that are still functional.\n\n## Pricing Flags and Their Implications\n\nThe cost of submission is directly tied to the validity of the route. Directories generally fall into three pricing categories: Free, Freemium (free with paid upgrades like faster review or featured placement), and Paid.\n\nThe most dangerous category, however, is \"Unknown.\" In our analysis of the 1004 directories, 722 were listed with an \"unknown\" pricing structure.\n\n\"Unknown\" pricing is a significant red flag. It frequently indicates one of two scenarios:\n1.  **The directory is abandoned:** No one is maintaining the site, and any submissions go into a void.\n2.  **The \"Enterprise\" Trap:** The directory requires you to fill out a lengthy \"contact us\" form, only to respond days later with a massive, four-figure sponsorship proposal.\n\nWhen encountering a directory with unknown pricing, prioritize discovering the cost immediately. If the site does not transparently list pricing on its submission page or in an FAQ, it is usually safest to move on. The return on time invested is rarely positive.\n\n## Evaluating Domain Authority (DR) Claims\n\nMany aggregate lists prominently feature Domain Rating (DR) or Domain Authority (DA) scores to imply value. Higher DR is presumed to mean a better backlink.\n\nYou must treat these numbers with extreme skepticism. DR scores are often scraped once and never updated. Furthermore, different SEO tools (Ahrefs, Moz, Semrush) calculate these metrics differently.\n\nA list might claim a directory has a DR of 34, but cross-referencing with another tool might show a much lower score. In some cases, datasets even explicitly note when \"DR sources disagree.\" For example, the `1000.tools` directory discussed earlier might carry a flag indicating conflicting DR reports.\n\nDo not base your submission strategy solely on a listed DR number. A verified, active, free submission route on a DR 20 site is infinitely more valuable than a broken link on a claimed DR 60 site. Focus on finding functional routes first; evaluate SEO metrics second.\n\n## The Myth of the Automated Blast\n\nBecause finding real submission routes is tedious, founders are often tempted by services that promise to submit a product to hundreds of directories automatically.\n\nThese services are almost universally ineffective.\n\nDirectories frequently change their HTML structure, add CAPTCHAs, or alter their login flows specifically to block automated submissions. A script that worked last month will likely fail today.\n\nFurthermore, automated submissions cannot handle nuanced categories, required product screenshots of specific dimensions, or custom review questions. They inevitably result in poorly formatted, incomplete profiles that provide zero marketing value and often look like spam.\n\nIdentifying real routes and manually (or semi-manually) submitting your product is the only reliable method to ensure a high-quality presence in launch directories.\n\n## Building Your Own Verified List\n\nInstead of relying on sprawling, unverified spreadsheets, your goal should be to build a smaller, curated list of confirmed directories.\n\nStart with a well-known list, but immediately discard any entry that lacks a clear domain or looks like a spam operation. For the remaining entries, perform the verification steps outlined above.\n\nWhen you find a functional route, record the exact URL, the required steps (e.g., \"requires Twitter login,\" \"needs 1024x768 image\"), and the confirmed pricing. This curated list becomes a reusable asset for future launches, saving you the immense frustration of navigating dead links all over again.\n\n## Conclusion\n\nThe vast majority of launch directory lists are filled with decaying data, missing routes, and mismatched intent. Blindly following these lists is a profound waste of marketing effort.\n\nBy actively classifying submission routes, aggressively investigating missing paths, remaining skeptical of \"unknown\" pricing, and building your own verified dataset, you can transform directory submissions from a frustrating chore into an efficient and effective component of your launch strategy. Stop trusting the aggregate data, and start validating the paths yourself.\n\n---\n\n### Practical next action\nOpen a popular GitHub repository of SaaS directories. Select ten random entries and attempt to locate their actual submission forms using the techniques described in this article. Record how many are immediately actionable versus how many require significant research or lead to dead ends.\n",
      "url": "https://sassmaker.com/learnings/how-to-identify-real-submission-routes-in-launch-directories"
    },
    {
      "slug": "how-to-plan-follow-up-dates-after-a-product-submission",
      "title": "How to plan follow-up dates after a product submission",
      "description": "Learn how to establish actionable follow-up and verification plans after submitting a product to directories.",
      "publishedAt": "2026-09-08",
      "publishedLabel": "September 8, 2026",
      "readingTime": "7 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/how-to-plan-follow-up-dates-after-a-product-submission",
      "markdown": "# How to plan follow-up dates after a product submission\n\n- Published: 2026-09-20\n- Author: Sarthak Agrawal\n- Reading time: 7 min read\n- Canonical HTML: https://sassmaker.com/learnings/how-to-plan-follow-up-dates-after-a-product-submission\n\nSubmitting your SaaS application to directories, aggregators, and launch platforms feels like a milestone. You fill out forms, tweak descriptions, attach screenshots, and click submit. But the reality is that submission does not guarantee placement. A submission is merely a request for consideration. To turn those requests into measurable search visibility, referral traffic, and brand authority, you must establish a rigorous, evidence-backed follow-up plan.\n\nThis guide details how to plan follow-up dates, verify live placements, correct stale details, and analyze the true return on investment (ROI) of your submission efforts, drawing directly from live operational data.\n\n## 1. Why Tracking Follow-Up Matters\n\nWhen you submit a product, you are often firing into a black box. Some platforms approve submissions immediately, others take weeks, and many silently reject or ignore them. Without a robust follow-up mechanism, your marketing metrics become polluted by false positives. It is dangerous to assume a listing is live and passing SEO value simply because the submission form was successfully submitted.\n\nThe core reason to schedule follow-up dates is **verification**. You need to confirm multiple operational realities:\n- Is the listing actually published on a live, accessible page?\n- Is it accurately reflecting the current product features, name, and pricing?\n- Is the backlink a valuable `dofollow` or a restricted `nofollow`?\n- Is the host domain still resolving correctly?\n\nRelying on submission logs alone leads to phantom metrics. You might think you have secured 100 backlinks, but a post-submission audit could reveal far fewer actual live placements. This gap between submission intent and live reality can severely skew your understanding of acquisition channels. By scheduling explicit follow-up dates, you transition from hoping for results to managing concrete, verifiable data.\n\n## 2. When and How to Verify Live Placements\n\nThe timing of your follow-up depends heavily on the destination platform. High-quality, curated directories (like Product Hunt or Smol Launch) have defined cadences, while long-tail submission sites vary wildly in their review times and publication processes.\n\n### Setting the Follow-Up Cadence\n\nA sensible verification schedule looks like this:\n\n- **Immediate (Day 0):** For sites with instant publication, verify the URL immediately. Check for exact title matches, ensure your product description is not truncated, and inspect the HTML source for `rel=\"nofollow\"` attributes on your backlink.\n- **Short-Term (Days 3-7):** Check platforms that advertise short editorial reviews. Look for acceptance emails in your inbox or search the target site directly for your product name. If you do not see a listing within a week, you need to mark it for medium-term review.\n- **Medium-Term (Days 14-30):** This is the primary audit window for automated or long-tail submissions. If a listing isn't live after a full month, it is highly likely safe to mark it as unconfirmed, rejected, or simply lost in the queue.\n\n### The Mechanism of Verification\n\nDo not rely on the directory's built-in search function alone, as it can be highly misleading and lead to false confirmations. A concrete example from our internal `authority-2026-09` campaign data highlights this exact risk. When our team was auditing submissions to platforms like Paggu, Insidr, and TheStartupInc, our automated probes searched for our product terms (e.g., \"codevetter\"). The search appeared successful, returning several results. However, a control search using a complete nonsense term (\"zzqqxnonsense7788\") returned the exact same number of hits.\n\nThis proved that the search function was simply echoing the query back onto the page rather than returning valid product listings. The conclusion? Automated submissions to `thestartupinc` and others yielded 0 live hits, despite appearing successful on the surface. True verification requires confirming the presence of a distinct, dedicated product page, not just seeing your brand name echoed in a search results template.\n\n## 3. Correcting Stale Product Details\n\nProducts evolve rapidly. Names change, domains migrate to better top-level domains, and the core focus shifts. A listing that was perfectly accurate when submitted in July might be completely stale by September. Your follow-up plan must include a clear strategy for auditing and correcting live data across the web.\n\n### Identifying Discrepancies\n\nDuring a routine follow-up audit, you must cross-reference the originally submitted data against your canonical internal records and the live production URLs.\n\nConsider a scenario from our recent entity reconciliation campaign. A July submission payload contained a product named \"SaaS Maker Docs\" located at the URL `docs.sassmaker.com`. By September, a follow-up check revealed a critical issue: the host `docs.sassmaker.com` did not resolve at all, returning an NXDOMAIN error. Any directory that had actually accepted the July submission was now pointing its users and search engines to a dead link, harming both user experience and our own SEO authority.\n\nOther common discrepancies uncovered during the same audit included:\n- **Name Mismatches:** The submitted name was \"Foundry (SaaS Maker)\", but the live product had been simplified and rebranded to just \"SaaS Maker\".\n- **URL Migrations:** A product submitted as \"Pace\" on a temporary `.pages.dev` host had migrated to its canonical production domain, `heypace.app`.\n- **Product Rebranding:** An application initially submitted as \"Email Manager\" at `mail.sassmaker.com` was later rebranded to \"Kinetic\" and moved to a different domain, `mail.significanthobbies.com`. This resulted in a disagreement between the live product, the catalog, and the external directory listings.\n\n### The Correction Workflow\n\nWhen you find these errors, you cannot simply update your tracking spreadsheet. You must issue correction requests.\n\n1. **Determine the Canonical Truth:** Before reaching out, you must solidify your internal catalog. If \"Email Manager\" is now officially \"Kinetic,\" ensure your central `projects.json` reflects this single source of truth and that teams agree on the canonical naming.\n2. **Target Confirmed Listings Only:** Do not send correction requests for listings you cannot definitively verify are live. Our audit showed that many automated submissions never landed on destination sites. Issuing a correction request for an unconfirmed listing means you are asserting a change for a record the destination platform does not even hold, which wastes time and credibility.\n3. **Execute the Request:** Use the platform's support forms, update mechanisms, or direct contact emails. Provide the exact URL of the stale listing, clearly state the old data that needs changing, and provide the canonical new data.\n\n## 4. Analyzing ROI: Manual Curated vs. Automated Submissions\n\nA robust follow-up process does more than just fix broken links; it provides the hard data necessary to evaluate your entire submission strategy. You will quickly find that the method of submission heavily influences the success rate and the overall return on investment.\n\n### The Case for Curated, Manual Submissions\n\nReviewing our `directories.json` strategy file, the operational preference is explicit: \"Quality over spam. Prefer free dofollow / curated launch sites.\" Platforms like Product Hunt, Smol Launch, and G2 require significant manual effort. You must create accounts, carefully craft engagement posts, and sometimes navigate review moats.\n\nHowever, the follow-up for these curated platforms is straightforward because they typically notify you of publication, and the resulting links are often high-value, bringing in targeted traffic. The effort invested upfront correlates strongly with verifiable, positive outcomes.\n\n### The Reality of Automated Submissions\n\nAutomation promises incredible scale, but the verification data gathered during follow-up audits often paints a grim picture. While it is tempting to use scripts and tools to blast a product submission to hundreds of long-tail directories, the follow-up audits frequently reveal that these submissions simply vanish into the void.\n\nAs seen clearly in our `authority-2026-09` data, automated bulk submissions to certain directories resulted in exactly zero observable live listings two months later. The ROI on this effort, despite the very low upfront cost of automation, is negligible. The follow-up process proves conclusively that investing time in a few high-quality, manual submissions yields vastly better, verifiable results than blind automated blasting.\n\n## 5. Practical Next Actions\n\nTo move from theory to practice and ensure your submission efforts actually yield results, take the following concrete steps immediately after your next product launch:\n\n1. **Log the Submission:** Record the exact product name, the specific URL submitted, the target directory, and the date of submission in a central tracker.\n2. **Set a Verification Date:** Schedule a calendar reminder for 14 to 30 days post-submission to manually verify the listing.\n3. **Automate the Simple Checks:** Write a basic script to periodically ping the URLs you submitted (e.g., `docs.sassmaker.com`) to ensure they consistently return a 200 OK status. If you detect an NXDOMAIN or a 404 Not Found, trigger an alert.\n4. **Reconcile Your Catalog:** If a product name or URL changes internally, update your central catalog first. Then, generate a list of confirmed external listings and initiate outreach to correct the stale data.\n\nFollowing up is not just administrative overhead; it is the critical final step in turning a launch effort into durable marketing equity. By planning your follow-up dates and executing verifications rigorously, you ensure that your product submissions translate into real, measurable growth.\n\n***\n",
      "url": "https://sassmaker.com/learnings/how-to-plan-follow-up-dates-after-a-product-submission"
    },
    {
      "slug": "importing-and-exporting-a-launch-campaign-with-csv-and-json",
      "title": "Importing and exporting a launch campaign with CSV and JSON",
      "description": "Learn how to manage your product launch campaign using standard formats like CSV and JSON, integrating structured data directly into your workflow.",
      "publishedAt": "2026-09-05",
      "publishedLabel": "September 5, 2026",
      "readingTime": "4 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/importing-and-exporting-a-launch-campaign-with-csv-and-json",
      "markdown": "# Importing and exporting a launch campaign with CSV and JSON\n\n- Published: 2026-09-20\n- Author: Sarthak Agrawal\n- Reading time: 4 min read\n- Canonical HTML: https://sassmaker.com/learnings/importing-and-exporting-a-launch-campaign-with-csv-and-json\n\n## Introduction\n\nProduct launches require coordinating dozens of directory submissions, press outreach targets, and community announcements. While many teams default to a sprawling spreadsheet or a paid SaaS tool that locks their data into a proprietary dashboard, managing a launch campaign via standard, structured formats like CSV and JSON offers significant benefits. By owning your launch dataset, you gain the freedom to build custom filters, automate syncing across different internal tools, and integrate launch readiness checks directly into your CI/CD pipelines.\n\nWhen launch data is treated as code, a dataset is not just a reference document—it can natively power your public-facing catalog or internal product-health dashboards. In this guide, we will explore the architecture of a launch campaign structured around CSV and JSON imports, using real-world schemas that enable lossless synchronization, validation, and curation.\n\n## The JSON Model: A Lossless Launch Dataset\n\nFor developers and system automation, JSON provides a robust way to model launch data natively. An effective launch dataset in JSON does more than list URLs; it encapsulates domain authority, tracking flags, and categorized claims that dictate where a product can be launched and how successful that launch might be.\n\nA mature JSON schema allows your team to map out each launch destination in granular detail. Let's examine a typical JSON structure that represents a launch directory entry:\n\n```json\n{\n  \"name\": \"AlternativeTo\",\n  \"domain\": \"alternativeto.net\",\n  \"website\": \"https://alternativeto.net/\",\n  \"submissionUrl\": \"https://alternativeto.net/software/add/\",\n  \"category\": \"Directory\",\n  \"pricing\": \"free\",\n  \"dr\": 77,\n  \"link\": \"nofollow\",\n  \"eligibility\": \"Product must have distinct features and fit into an existing or new alternative software category.\",\n  \"flags\": [],\n  \"route\": \"source-reported\",\n  \"provider\": \"Ahrefs (source-reported)\",\n  \"sourceUrl\": \"https://github.com/alvinunreal/awesome-submitlist/blob/main/data/destinations.json\",\n  \"retrieved\": \"2026-09-18\",\n  \"measured\": null,\n  \"quarantined\": false,\n  \"claims\": [\n    {\n      \"source\": \"submitlist\",\n      \"dr\": 77,\n      \"link\": \"nofollow\",\n      \"pricing\": \"free\"\n    }\n  ]\n}\n```\n\nIn this architecture, every launch destination is captured with precise attributes. The `dr` (Domain Rating) and `link` type (e.g., `nofollow` vs. `follow`) provide instant clarity on SEO value. The `category` and `pricing` fields enable quick filtering.\n\nMore importantly, notice the `claims` array and `quarantined` flag. Instead of blindly accepting data from an external source, a robust JSON dataset records *where* the claim came from (the `sourceUrl`) and allows you to quarantine entries that require further research or contain suspect source data. This prevents bad or unverified directories from automatically surfacing in your active launch queues.\n\n## Working with CSV: A Bridge for Marketers and External Data\n\nWhile JSON is perfect for runtime usage and automated pipelines, it is not always the best format for data entry, especially when collaborating with marketing team members who are comfortable in tools like Excel or Google Sheets. CSV remains the universal standard for moving tabular data between systems.\n\nA successful launch workflow often involves ingesting raw CSV files sourced from public GitHub repositories or independent SEO research tools. For instance, you might download a CSV containing hundreds of potential directories.\n\nThe import process must translate this flat CSV structure into the rich JSON model shown above. When designing an import script, you should map CSV headers to your internal schema. For example, a CSV might have columns for `Name`, `Website`, and `Domain Authority`. The import script parses these, assigns a default `route` like `\"needs-research\"`, and flags any entries missing critical data.\n\nBy maintaining this separation—using CSV for broad ingestion and JSON for canonical storage—you enable marketers to source vast amounts of prospect data without compromising the structured integrity required by the presentation layer.\n\n## Data Syncing: Establishing a Canonical Source of Truth\n\nWhen dealing with imported data from various CSVs and compiled JSON files, establishing a clear source of truth is critical. A common pitfall is editing generated files directly.\n\nConsider a scenario where your public-facing catalog or launch desk renders directly from a dataset like `apps/showcase/src/data/launchdesk.json`. If a team member hand-edits this JSON file to fix a typo or update a Domain Rating, those changes will be overwritten the next time the sync script runs.\n\nTo prevent this, the architecture should strictly separate the *source* dataset from the *generated* projection. In modern portfolio operations, the raw source data often lives in a private, local repository (or an independent checkout like a `launchdesk` repository) where it can be managed, reviewed, and validated.\n\nWhen the launch data is ready for the presentation layer, an automated command—such as `pnpm sync:launchdesk`—pulls the verified source data, projects it into the required schema, and outputs the generated JSON file consumed by the application frontend. This one-way synchronization ensures that the public build uses only allowlisted, validated data and that all edits go through a structured review process in the canonical source.\n\n## Practical Next Action\n\nNow that you understand the relationship between CSV ingestion and JSON canonicalization for launch campaigns, you can start building custom views on top of your data.\n\nYour practical next step: Build a simple HTML/JS filter against your generated JSON file. Create a view that filters out all `quarantined` entries and sorts the remaining directories by `dr` (Domain Rating). This small exercise will demonstrate the power of treating your launch campaign as a structured dataset, giving you a custom, high-priority launch list without relying on a paid subscription.\n",
      "url": "https://sassmaker.com/learnings/importing-and-exporting-a-launch-campaign-with-csv-and-json"
    },
    {
      "slug": "keeping-a-launch-workspace-private-in-browser-local-storage",
      "title": "Keeping a launch workspace private in browser local storage",
      "description": "Learn how to build a private, local-first launch workspace using browser local storage, with concrete examples from LaunchDesk.",
      "publishedAt": "2026-09-02",
      "publishedLabel": "September 2, 2026",
      "readingTime": "6 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/keeping-a-launch-workspace-private-in-browser-local-storage",
      "markdown": "# Keeping a launch workspace private in browser local storage\n\n- Published: 2026-09-20\n- Author: Sarthak Agrawal\n- Reading time: 6 min read\n- Canonical HTML: https://sassmaker.com/learnings/keeping-a-launch-workspace-private-in-browser-local-storage\n\n## Introduction\n\nIn the modern landscape of software development, makers are frequently overwhelmed by the sheer volume of directories, communities, and launch platforms. Managing a successful product launch often requires evaluating hundreds of potential submission destinations and tracking the status of each. Traditionally, this process involves utilizing SaaS products that store user data on remote servers, demanding persistent network connections and implicitly trading privacy for convenience. However, a significant shift is occurring toward local-first architecture, where the user's browser becomes the primary database.\n\nBuilding a launch workspace directly in the browser using local storage offers unparalleled privacy, lightning-fast performance, and offline capability. This approach empowers makers to maintain a provenance-honest catalog of launch destinations—comparing metrics like domain rating, link type, and pricing—without exposing their unreleased strategic pipeline to third-party databases. By keeping the workspace strictly confined to the client side, developers can offer a robust application experience that respects user sovereignty.\n\nThis article explores the technical foundations of building a local-first launch workspace using browser local storage. We will examine the architecture, provide concrete implementation examples, and address the inherent challenges of client-side data management.\n\n## Why Browser Local Storage?\n\nWhen designing a launch workspace, the choice of storage mechanism dictates the fundamental architecture of the application. Browser local storage (`localStorage`) provides a simple, synchronous key-value store that persists across browser sessions. It is an ideal candidate for a private launch workspace for several reasons.\n\nFirst is privacy. In a local-first application, the mutable state—such as per-product submission queues and tracking metrics—never leaves the user's device unless explicitly exported. There is no central database to secure, no accounts to manage, and no risk of a data breach compromising a maker's unreleased product strategy. The workspace is inherently private because the data simply does not exist anywhere else.\n\nSecond is performance. `localStorage` operations are synchronous and resolve in microseconds. There is no network latency, no waiting for API responses, and no loading spinners when saving a submission status. The application feels instantaneous, which is critical when rapidly processing a list of hundreds of launch destinations.\n\nThird is operational simplicity. By eliminating the backend database, developers reduce the surface area for bugs, lower infrastructure costs, and simplify deployment. The application can be served as a collection of static assets, heavily cached by CDNs, making it highly resilient.\n\n## Designing a Provenance-Bearing Catalog\n\nA private launch workspace requires two distinct types of data: the immutable catalog of destinations and the mutable user state. The catalog—a curated list of directories and press contacts—should be provenance-bearing, meaning each entry clearly states its source, reported metrics, and eligibility requirements.\n\nIn a well-architected local-first application, this catalog is not stored in `localStorage`. Instead, it is shipped as a static dataset, such as a JSON file, fetched once and cached by the browser. For example, consider a workspace that provides a catalog of 966 submission destinations. The JSON structure might look like this:\n\n```json\n[\n  {\n    \"name\": \"AlternativeTo\",\n    \"domain\": \"alternativeto.net\",\n    \"website\": \"https://alternativeto.net/\",\n    \"submissionUrl\": \"https://alternativeto.net/software/new/\",\n    \"category\": \"Directory\",\n    \"pricing\": \"free\",\n    \"dr\": 82,\n    \"link\": \"nofollow\",\n    \"eligibility\": \"Requires a distinct software product with features, not a generic service page.\",\n    \"flags\": [],\n    \"route\": \"source-reported\",\n    \"claims\": [\n      {\n        \"source\": \"submitlist\",\n        \"dr\": 82,\n        \"link\": \"nofollow\",\n        \"pricing\": \"free\"\n      }\n    ]\n  }\n]\n```\n\nThis structure explicitly shows where the metrics came from, ensuring the catalog remains honest. When a user interacts with the workspace—for instance, by adding \"AlternativeTo\" to their queue—the application does not duplicate this static data. It only stores a reference (the domain) and the user's specific state in `localStorage`.\n\n## Implementing Per-Product Queues\n\nThe core functionality of the workspace is managing per-product queues. A maker might be launching multiple products simultaneously, each with its own list of targeted destinations and submission statuses (e.g., \"planned\", \"submitted\", \"accepted\").\n\nTo implement this using `localStorage`, we must design a data schema that is both flexible and efficient. Because `localStorage` only supports strings, we use `JSON.stringify` and `JSON.parse` for serialization.\n\nHere is a concrete example of a service class that manages these per-product queues:\n\n```javascript\nclass LaunchWorkspaceService {\n  constructor(storageKey = 'launchdesk_workspace_state') {\n    this.storageKey = storageKey;\n    this.state = this.loadState();\n  }\n\n  loadState() {\n    try {\n      const stored = localStorage.getItem(this.storageKey);\n      if (stored) return JSON.parse(stored);\n    } catch (error) {\n      console.error('Failed to parse workspace state', error);\n    }\n\n    // Default initial state\n    return {\n      version: 1,\n      products: {},\n      queues: {},\n      lastUpdated: new Date().toISOString()\n    };\n  }\n\n  saveState() {\n    this.state.lastUpdated = new Date().toISOString();\n    try {\n      localStorage.setItem(this.storageKey, JSON.stringify(this.state));\n    } catch (error) {\n      if (this.isQuotaExceeded(error)) {\n        console.error('Local storage quota exceeded. Please export and clear data.');\n      }\n    }\n  }\n\n  addProduct(productId, name) {\n    if (!this.state.products[productId]) {\n      this.state.products[productId] = { name, createdAt: new Date().toISOString() };\n      this.state.queues[productId] = {};\n      this.saveState();\n    }\n  }\n\n  updateDestinationStatus(productId, destinationDomain, status, notes = '') {\n    if (!this.state.queues[productId]) {\n      this.addProduct(productId, productId);\n    }\n\n    this.state.queues[productId][destinationDomain] = {\n      status,\n      notes,\n      updatedAt: new Date().toISOString()\n    };\n\n    this.saveState();\n  }\n\n  isQuotaExceeded(e) {\n    let quotaExceeded = false;\n    if (e) {\n      if (e.code) {\n        switch (e.code) {\n          case 22: quotaExceeded = true; break;\n          case 1014: if (e.name === 'NS_ERROR_DOM_QUOTA_REACHED') quotaExceeded = true; break;\n        }\n      }\n    }\n    return quotaExceeded;\n  }\n}\n```\n\nIn this example, the state is normalized. The `products` object holds metadata about the product being launched, while the `queues` object maps a product ID to a dictionary of destination statuses. When a maker marks a destination as \"submitted,\" the application updates the specific entry and persists the entire state back to `localStorage`.\n\n## Maintaining Data Integrity\n\nRelying on the client's browser introduces challenges regarding data integrity. Unlike a managed database, developers cannot run migration scripts directly on the server. Schema versioning is paramount.\n\nThe initial state in the example includes a `version: 1` property. As the application evolves, the structure of the state will change. The application must include migration logic that intercepts older versions during the `loadState` process and upgrades them.\n\n```javascript\n  migrateState(state) {\n    if (!state.version) state.version = 1;\n\n    if (state.version === 1) {\n      // Upgrade logic for version 2\n      state.version = 2;\n    }\n\n    return state;\n  }\n```\n\nAnother critical challenge is storage limits. Browsers typically cap `localStorage` at around 5MB per origin. While 5MB is substantial for JSON data, the application must gracefully handle `QuotaExceededError` exceptions. Providing makers with UI controls to export their workspace to a `.json` file and subsequently clear completed campaigns is essential for long-term usability.\n\n## Security and Privacy Considerations\n\nA local-first architecture provides excellent privacy guarantees, but developers must remain vigilant against vectors that compromise this isolation. The primary directive is that the workspace state must never be transmitted over the network unless explicitly initiated by the user.\n\nWhen integrating scripts such as error tracking, extreme care must be taken to sanitize the evidence envelope. A robust implementation ensures that `localStorage` watched state, credentials, or user-identifying information is strictly redacted before any telemetry is sent.\n\nFor instance, an error reporting module should scrub the local state dump before transmission:\n\n```javascript\nfunction captureSanitizedError(error, localState) {\n  const sanitizedState = { ...localState };\n  // Redact private categories\n  delete sanitizedState.queues;\n  delete sanitizedState.products;\n\n  const payload = {\n    message: error.message,\n    stack: error.stack,\n    hasLocalState: !!localState,\n    redacted: true\n  };\n\n  // Transmit payload safely\n}\n```\n\nFurthermore, the static catalog should be served over HTTPS, and a strong Content Security Policy (CSP) should be enforced to mitigate Cross-Site Scripting (XSS) attacks. Because the workspace data lives in `localStorage`, any malicious script executing on the origin has full access to the user's launch strategy. A strict CSP prevents the execution of unauthorized scripts, thereby securing the local data.\n\n## Practical Next Action\n\nIf you are planning an upcoming product launch, start by evaluating your current tracking mechanisms. Open the [LaunchDesk catalog](https://sassmaker.com/launchdesk), filter the destinations based on your product's category and required domain rating, and begin curating your private submission queue directly in your browser. Experience the speed and privacy of managing your strategy locally.\n",
      "url": "https://sassmaker.com/learnings/keeping-a-launch-workspace-private-in-browser-local-storage"
    },
    {
      "slug": "matching-a-launch-channel-to-the-product-being-launched",
      "title": "Matching a Launch Channel to the Product Being Launched",
      "description": "Learn how to match your product's architecture, audience, and goals to the right launch channel using concrete examples.",
      "publishedAt": "2026-08-30",
      "publishedLabel": "August 30, 2026",
      "readingTime": "7 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/matching-a-launch-channel-to-the-product-being-launched",
      "markdown": "# Matching a Launch Channel to the Product Being Launched\n\n- Published: 2026-09-20\n- Author: Sarthak Agrawal\n- Reading time: 7 min read\n- Canonical HTML: https://sassmaker.com/learnings/matching-a-launch-channel-to-the-product-being-launched\n\n## Introduction\n\nA common pitfall in software distribution is defaulting to the exact same launch channel for every release, regardless of what is actually being shipped. Whether a team is releasing a consumer-facing application, a backend API, a shared UI component, or an internal operational tool, the instinct is often to draft a universal announcement and push it to the broadest possible audience on platforms like Product Hunt or X.\n\nHowever, this one-size-fits-all approach ignores the fundamental reality of product distribution: the nature of the product dictates the optimal venue for its introduction. A product’s architecture, its operational boundary, its intended audience, and its privacy requirements all play a critical role in determining where and how it should be launched. When you mismatch the channel to the product, you risk reaching an audience that cannot use the tool, confusing your existing users, or worse, exposing internal systems to unnecessary public scrutiny.\n\nThis article explores the concept of \"architecture-channel fit.\" By examining concrete examples of distinct product types—ranging from public directories to backend-free React packages and private operational inboxes—we can establish a framework for matching a launch channel to the specific characteristics of the product being launched.\n\n## The Architecture-Channel Fit\n\nThe foundational step in choosing a launch channel is understanding the operational and architectural boundaries of your product. Not all software is meant to be consumed in the same way.\n\nConsider a portfolio of products that includes a public product directory, a private feedback inbox, a set of shared automation scripts, and a public feedback API. Each of these surfaces has a radically different technical footprint and serves a distinct user base.\n\nThe architecture of a product often defines its constraints. For example, a backend-free user interface package designed to be embedded in host applications has no direct infrastructure footprint of its own. It relies on the host environment to function. Launching such a package on a consumer directory would be entirely ineffective because consumers cannot \"install\" a code package without a host application. Conversely, launching a general-interest public directory on a deeply technical forum dedicated to system administration might yield a high bounce rate.\n\nUnderstanding architecture-channel fit means categorizing your release into one of several archetypes (e.g., developer tool, public consumer surface, internal operational service, or API infrastructure) and tailoring the launch strategy accordingly.\n\n## Launching Developer Tools and Packages\n\nWhen the product being launched is a developer tool, a software development kit (SDK), or a runtime package, the target audience consists of engineers, builders, and technical architects.\n\nFor these products, the ideal launch channels are package registries (such as npm), technical developer communities (like Hacker News or DEV), GitHub, and specialized technical newsletters. The messaging in these channels must prioritize clarity, integration speed, and technical constraints over marketing hyperbole. Developers evaluating a new package want to know its peer dependencies, its impact on bundle size, and its operational boundary.\n\nConsider the launch of backend-free runtime packages like `@saas-maker/portfolio-project-strip` or `@saas-maker/ai-chat-footer`. These are React components designed to provide accessible project discovery and AI assistant links without requiring the host application to pull complex product code into a central foundry.\n\nLaunching these packages requires a focus on developer experience. The launch event is a clean npm publication, comprehensive README documentation, and verified continuous integration checks (such as passing a `pnpm check:shared-packages` step). The channel is the registry itself and the technical documentation hub. The evidence of a successful launch is a smooth, error-free integration into consumer applications.\n\nIn this context, the launch material should include concrete examples of usage, clear notes on peer runtimes (like React 18 or 19 compatibility), and explicit boundaries indicating what the package does not do (e.g., that it is backend-free and requires no hosted service).\n\n## Launching Public Directories\n\nWhen the product is a consumer-facing surface or a broad-interest application, the goal is often widespread discoverability and top-of-funnel acquisition.\n\nFor these releases, public launch channels like Product Hunt, Indie Hackers, social media platforms, and SEO-driven content strategies are highly effective. The audience consists of early adopters, founders, and general users looking for solutions to common problems or seeking inspiration.\n\nTake, for example, the launch of a public product directory or a scored product-idea decision ledger (such as the surfaces found at `sassmaker.com` and `sassmaker.com/ideas`). These are public gateways designed to showcase a portfolio of work or curate a dataset of software ideas.\n\nLaunching these surfaces requires careful attention to the public projection of data. A successful launch ensures that the directory is deterministic and privacy-filtered. It must never expose private fleet state or owner-local data at runtime. The launch messaging should focus on the value provided to the end-user—such as the ability to browse compact product anatomies, filter by platforms or form families, and view prominent tools used in development.\n\nIn these channels, visual presentation matters significantly. The application of a cohesive design system and the inclusion of expanded, human-readable profiles with first-person maker notes can significantly enhance the reception of the launch. The product must deliver a compelling, accessible experience immediately upon arrival.\n\n## Launching APIs and Internal Tools\n\nNot all products are meant for the public eye. Many crucial pieces of software are built to serve an internal ecosystem, streamline operations, or provide reusable automation for a specific team or fleet of applications.\n\nFor internal tooling, ecosystem services, and shared automation, traditional public launch channels are not just ineffective; they are entirely inappropriate. The target audience is internal operators, maintainers, and specific authorized agents.\n\nThe launch channels for these products include internal team meetings, operational changelogs, private documentation hubs, and cross-promotion within the specific developer ecosystem. The goal of the launch is operational adoption and cutover, not public acclaim.\n\nConsider a suite of shared automation scripts, workflows, and templates (such as those maintained in a `tooling/` directory). These might include CI deploy guards, SEO research skills, or fleet-health audits.\n\nThe launch of these capabilities involves updating an internal directory (e.g., `sassmaker.com/tools`), verifying exact-SHA continuous integration, and ensuring that no unauthorized provider mutations occur. The announcement is a technical receipt confirming that the new skill is credential-free, operates within an explicit source boundary, and has passed its production smoke tests. The success of the launch is measured by the seamless adoption of the tooling by the target applications without regressions or security incidents.\n\nSimilarly, an API designed to handle feedback submissions and manage project keys (like `api.sassmaker.com`) or a private cross-product feedback inbox (such as `app.sassmaker.com`) requires a specialized launch. The API needs robust OpenAPI contracts, and the internal inbox requires secure authentication and workflow communication for internal operators.\n\n## Post-Launch Feedback\n\nRegardless of the channel chosen, a critical component of any launch is the mechanism established to collect and act upon post-launch feedback. The channel itself often dictates the type and volume of feedback you will receive.\n\nIntegrating a specialized feedback mechanism directly into the launched product can bridge the gap between the channel and the development team. For example, deploying a React feedback widget (such as `@saas-maker/feedback`) allows teams to collect structured bug, feature, and general feedback directly from the user's context. By capturing optional screenshots and page-element anchoring, the team can receive high-fidelity, actionable data that transcends the noise often found in public launch channel comment sections.\n\nMatching the launch channel to the product is only the first half of the equation; aligning the feedback collection mechanism to the audience's context completes the cycle.\n\n## Practical Next Action\n\nBefore your next release, conduct an architecture-channel fit assessment.\n\n1. Define the primary architectural boundary of the product (e.g., backend-free package, hosted API, consumer web surface, internal script).\n2. Identify the core audience (e.g., peer developers, general consumers, internal operators).\n3. Select a launch channel that aligns with these constraints rather than defaulting to a generic public announcement.\n4. Ensure your post-launch feedback mechanisms are properly configured to capture the specific type of response expected from that channel.\n",
      "url": "https://sassmaker.com/learnings/matching-a-launch-channel-to-the-product-being-launched"
    },
    {
      "slug": "when-to-quarantine-a-dead-or-contradictory-launch-listing",
      "title": "When to Quarantine a Dead or Contradictory Launch Listing",
      "description": "Learn how the quarantine pattern isolates suspect launch listings and conflicting metrics without silently erasing historical data.",
      "publishedAt": "2026-08-27",
      "publishedLabel": "August 27, 2026",
      "readingTime": "7 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/when-to-quarantine-a-dead-or-contradictory-launch-listing",
      "markdown": "# When to Quarantine a Dead or Contradictory Launch Listing\n\n- Published: 2026-09-20\n- Author: Sarthak Agrawal\n- Reading time: 7 min read\n- Canonical HTML: https://sassmaker.com/learnings/when-to-quarantine-a-dead-or-contradictory-launch-listing\n\n## Introduction\n\nMaintaining an accurate catalog of launch destinations requires confronting data decay. Directories, review sites, and lists are volatile. Domains expire, products pivot, metrics fluctuate, and crowdsourced lists are abandoned. When managing a curated list of launch destinations, teams inevitably encounter data that is either verifiably dead or contradictory.\n\nThe traditional response to bad data is to delete the row. However, in data ecosystems where multiple tools and public projections depend on a single source of truth, silent deletion is a dangerous anti-pattern. Instead, software engineers must understand when to quarantine a dead or contradictory launch listing. Quarantining preserves the historical record, maintains data lineage, and provides a clear audit trail without exposing users to unreliable information.\n\n## The Deletion Anti-Pattern\n\nWhen an automated pipeline or human curator discovers that a launch destination is no longer viable, the instinct is often to drop the record. This deletion anti-pattern creates downstream risks.\n\nFirst, deletion destroys context. If a record is erased from the primary data source, subsequent audits or automated data runs may re-discover the same bad data and re-insert it. The system learns nothing from the discovery of the dead listing. There is no memory of the evaluation process that determined the data was invalid.\n\nSecond, in architectures that separate a private source from a generated public projection, silent deletion complicates debugging. If an expected destination vanishes from the public directory, operators must distinguish between an intentional removal, a parsing error, or an accidental deletion. A missing row provides no telemetry.\n\nFinally, maintaining a record of rejected listings is critical for the integrity of automated systems. As organizations deploy agentic workflows and automated data extraction skills to evaluate destinations, these tools need explicit boundaries. A deleted record cannot be marked as a known bad source, forcing the automation to continually waste resources re-evaluating dead ends.\n\n## The Quarantine Strategy\n\nThe quarantine strategy offers a resilient alternative to deletion. Rather than erasing the offending record, the system updates the record's state to explicitly mark it as quarantined. The data remains in the canonical, private data store, but it is explicitly filtered out of public projections, active processing queues, and automated evaluations.\n\nIn a JSON-based catalog system, this is implemented as a simple boolean flag, such as `\"quarantined\": true`, combined with metadata fields that explain the quarantine's justification. These fields might include an array of `\"flags\"` (e.g., `[\"Suspect source data\"]`), an explicit routing status, and an array of `\"claims\"` that detail the specific metrics that triggered the quarantine.\n\nBy isolating the record instead of erasing it, the system preserves the complete schema and historical context. When the static site generator or API layer builds the public-facing directory, it simply ignores any record where the quarantine flag is active. The data is isolated, but the knowledge is retained. The system effectively builds an immune response to known bad data, preventing re-insertion and providing operators with a clear, auditable ledger of rejected destinations.\n\n## Trigger 1: Suspect Source Data\n\nOne of the primary scenarios requiring a quarantine is the discovery of suspect source data. Launch directory catalogs aggregate information from multiple third-party sources, GitHub repositories, and crowdsourced lists. These sources report metrics like Domain Rating (DR), link attributes, and pricing models.\n\nContradictions arise when multiple sources make wildly different claims about the same destination, or when a source asserts a high metric that cannot be independently verified. For example, a list might claim a destination has a DR of 93 and offers \"dofollow\" links, but the data is unverified and the provider metric is unknown.\n\nIf the system blindly accepts this data, it compromises the integrity of the directory. However, if the system deletes the record, it loses the connection to the original source URL. By quarantining the record, the team can log the exact source URL, the unverified claims, and the date the data was retrieved. The listing is removed from active consideration, but the engineering team retains the raw data necessary to investigate the discrepancy later or to explicitly block that specific third-party source.\n\n## Trigger 2: The Dead Destination\n\nThe second major trigger for quarantining a listing is the discovery of a dead destination. Launch directories shut down, change their primary domain, or alter their business model, rendering them useless for product submissions.\n\nA destination might return a persistent HTTP error, redirect to a parked domain, or replace its submission form with a generic contact page. While these destinations are no longer active, the historical fact that they *were* part of the catalog is valuable.\n\nQuarantining a dead destination serves as a permanent tombstone. It prevents automated link checkers from continually testing a dead URL. If a separate automated process or human contributor attempts to re-add the destination based on an outdated list, the system can cross-reference the incoming data against the quarantined ledger and reject the duplicate. The quarantine flag states, \"We know about this destination, we have evaluated it, and we have determined it is no longer viable.\"\n\n## A Concrete Example from LaunchDesk\n\nTo illustrate the quarantine strategy in practice, we examine a concrete example of a JSON record from a launch destination catalog. Consider a scenario where a destination is imported from an external repository, but the metric provider is unverified and the data appears suspect.\n\n```json\n{\n  \"name\": \"Sample Directory\",\n  \"dr\": 93,\n  \"link\": \"nofollow\",\n  \"eligibility\": null,\n  \"flags\": [\n    \"Suspect source data\"\n  ],\n  \"route\": \"needs-research\",\n  \"provider\": \"Unverified; source describes Ahrefs-style DR\",\n  \"sourceUrl\": \"https://github.com/example/directories/blob/main/list.csv\",\n  \"retrieved\": \"2026-09-18\",\n  \"measured\": null,\n  \"quarantined\": true,\n  \"claims\": [\n    {\n      \"source\": \"brandfactory\",\n      \"dr\": 93,\n      \"link\": \"nofollow\",\n      \"pricing\": \"unknown\"\n    }\n  ]\n}\n```\n\nIn this architecture, the `\"quarantined\": true` flag is the primary isolation mechanism. The `\"flags\"` array provides human-readable context (`\"Suspect source data\"`), while the `\"route\"` field classifies the operational state (`\"needs-research\"`). Crucially, the `\"claims\"` array preserves the exact assertions made by the external source, allowing operators to see exactly why the record was flagged without allowing unverified metrics to leak into the public directory.\n\nThis record exists in the private, checked-in dataset. It provides a complete diagnostic snapshot, yet it will never be rendered on the public-facing platform.\n\n## Architecting the Quarantine Implementation\n\nImplementing a quarantine pattern requires a strict architectural boundary between the raw, private data source and the public projection.\n\nIn a robust implementation, the primary catalog is maintained as an owner-local JSON file or a private database table. This raw source contains all records, including those that are quarantined, parked, or historically retired. This file acts as the single source of truth for the entire ecosystem.\n\nDuring the build process or data synchronization phase, a deterministic projection script reads the raw data and generates a privacy-filtered public export. This script explicitly drops any record where the quarantine flag is active. The public-facing applications—whether they are static site generators, APIs, or edge workers—only consume this filtered export.\n\nThis architecture guarantees that public surfaces never read private state at runtime. The quarantine boundary is enforced at the build step, providing confidence that dead or contradictory listings will not accidentally surface to users, while ensuring that the private catalog remains a lossless, auditable ledger of all historical data.\n\n## Operational Rules for Quarantined Records\n\nFor the quarantine strategy to be effective, it must be respected across the entire operational ecosystem. This includes continuous integration (CI) tests, automated validation skills, and shared tooling.\n\n1. **Test Suite Health:** Automated test suites should verify the structural integrity of quarantined records, ensuring they adhere to the schema, but tests must explicitly ignore quarantined records when validating active metrics or checking live URLs. Do not quarantine, disable, delete, or rewrite tests themselves during diagnosis; instead, update the underlying data record to reflect its quarantined status.\n2. **Automated Skills:** Any automated skills, such as SEO research pipelines or media acquisition scripts, must be programmed to skip records marked as quarantined. Attempting to run validation routines against known dead listings wastes resources and pollutes operational telemetry.\n3. **Manual Curation:** When operators sync data from upstream sources, the synchronization scripts must preserve existing quarantine flags. If an upstream source updates a listing that the local system has quarantined, the script should log the conflict for manual review rather than automatically overwriting the quarantine status.\n\nBy establishing strict operational rules, teams ensure that the quarantine pattern provides durable protection against data decay without creating friction for automated systems.\n\n## Practical Next Action\n\nEngineering teams looking to stabilize their data catalogs should begin by implementing a non-destructive audit.\n\n1. Review your current data schema and add a boolean `\"quarantined\"` field to your primary entity model.\n2. Update your build scripts or API layers to filter out any records where this flag is true.\n3. Identify records that are currently known to be dead, contradictory, or suspect, and update their status to quarantined.\n4. Deploy the changes and verify that the public projection successfully drops the records while the private source retains their historical context.\n\nBy moving from a deletion mindset to a quarantine strategy, teams build more resilient, auditable, and reliable architectures.\n",
      "url": "https://sassmaker.com/learnings/when-to-quarantine-a-dead-or-contradictory-launch-listing"
    },
    {
      "slug": "why-every-launch-destination-needs-source-attribution",
      "title": "Why every launch destination needs source attribution",
      "description": "Discover why provenance-honest source attribution is critical for evaluating SaaS launch destinations, and why explicit unknowns beat invented metrics.",
      "publishedAt": "2026-08-24",
      "publishedLabel": "August 24, 2026",
      "readingTime": "6 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/why-every-launch-destination-needs-source-attribution",
      "markdown": "# Why every launch destination needs source attribution\n\n- Published: 2026-09-20\n- Author: Sarthak Agrawal\n- Reading time: 6 min read\n- Canonical HTML: https://sassmaker.com/learnings/why-every-launch-destination-needs-source-attribution\n\n## The Reality of Launch Destination Data\n\nWhen independent developers, founders, and studio operators prepare to introduce a new software product to the market, they are often directed toward lists of hundreds of potential launch destinations. These destinations encompass software directories, startup aggregators, community forums, and specialized review platforms. The standard practice involves consulting a sprawling spreadsheet or an uncurated webpage that lists these domains alongside an array of compelling but often unsourced metrics.\n\nThe core issue within this ecosystem is not a lack of available destinations, but a systemic deficit of data provenance. A directory might be listed with a Domain Rating of 65 and a \"dofollow\" link status. However, without source attribution, the operator cannot verify when that metric was captured, who captured it, or whether the destination's underlying architecture has since changed. As software launch strategies increasingly depend on precise targeting rather than indiscriminate submission, the absence of verifiable source attribution transforms launch planning from a calculated investment into an exercise in blind trust.\n\nLaunch destinations are fundamentally working material. They require the same level of scrutiny as any other operational dependency. When the provenance of a metric is unknown, the metric itself ceases to be a reliable indicator of value. The software industry routinely demands strict dependency auditing for source code, yet frequently accepts unverified, static numbers when evaluating distribution channels.\n\n## The Flaws of Invented Metrics\n\nThe drive to present a comprehensive, attractive database of launch destinations frequently leads aggregators to populate missing data fields with invented, extrapolated, or outdated metrics. If a specific directory's traffic or link equity is unknown, the pressure to deliver a complete row in a table often overrides the commitment to accuracy.\n\nThis reliance on invented metrics introduces structural risks into the launch process. For example, if a list claims a specific destination provides a \"dofollow\" backlink and a high Domain Rating, an operator might prioritize crafting a custom submission for that site. If those metrics were hallucinated, scraped from a defunct cache, or simply guessed, the operator's time is misallocated. The opportunity cost is significant: hours spent submitting to a platform with invented authority could have been spent engaging with a smaller, highly relevant community where the metrics are modest but verified.\n\nFurthermore, invented metrics obscure the actual state of the internet. Directories frequently alter their policies, implement \"nofollow\" tags on outgoing links, or shift behind authentication walls. A static list that presents an unverified \"DR 70\" without a retrieval date or a source URL is actively misleading. It creates a false consensus about the value of a platform. Evaluating destinations based on these fictions leads to bloated launch campaigns that fail to deliver expected outcomes.\n\n## Defining Provenance-Honest Source Attribution\n\nProvenance-honest source attribution explicitly connects every claim about a launch destination to its specific origin, complete with the retrieval context. It requires moving away from flat lists of unquestioned facts and moving toward a model where every data point is treated as a claim made by a specific observer at a specific time.\n\nIn a system built on source attribution, a launch destination record does not simply state \"DR 15.\" Instead, it records that a specific provider (such as an SEO tool API or a curated dataset like \"brandfactory\") reported a Domain Rating of 15 on a precise date. If multiple sources provide conflicting information about the same destination, provenance-honest architecture captures those conflicting claims rather than quietly averaging them.\n\nThis approach requires specific data structures. A robust destination record should include fields for the provider's identity, the exact source URL where the claim was found, the date the information was retrieved, and the date the destination was actually measured. By preserving this source history, operators are empowered to make their own judgments. Source attribution shifts the burden of trust from the aggregator to the evidence itself.\n\n## The Case for Explicit Unknowns\n\nA direct consequence of implementing strict source attribution is the inevitable discovery of data gaps. When invented metrics are prohibited and unverified claims are stripped away, many fields will naturally turn up empty. This is where the principle of \"explicit unknowns\" becomes essential.\n\nIn a provenance-honest system, an unknown value is not a failure; it is an accurate reflection of the available evidence. Recording a pricing model or a Domain Rating as explicitly \"unknown\" or `null` is far more valuable than populating the field with a generic estimate. An explicit unknown signals to the operator that research is required before committing resources.\n\nFor example, a destination record might identify the domain and the category, but leave the Domain Rating as an explicit unknown, flagging the route as \"needs-research.\" This structural honesty prevents operators from building strategies on fragile foundations. Embracing explicit unknowns forces a change in how launch catalogs are presented. The value is no longer derived from scrolling a massive, fully populated wall of links. Instead, the value lies in comparing the provenance of the data and making informed tradeoffs.\n\n## Concrete Implementation: The LaunchDesk Approach\n\nThe principles of source attribution and explicit unknowns are not merely theoretical; they dictate the architecture of rigorously maintained launch directories. A concrete example can be observed in how SaaS Maker structures its LaunchDesk catalog, which operates as an operator ledger rather than a conventional marketing list.\n\nThe LaunchDesk dataset encompasses 966 destinations, but its primary distinguishing feature is its commitment to provenance. As detailed in the public catalog's proof statements, the system relies on \"source attribution in data/sources, and explicit unknowns rather than invented metrics.\"\n\nAt the data layer, individual destination records are not flat arrays of facts. They are structured to accommodate the messy reality of sourcing. A record for a destination like \"10 Words\" (10words.io) captures the domain, website, and category, but crucially, it isolates the metrics into a specific `claims` array. The record explicitly notes that the Domain Rating of 15 and the \"follow\" link status are claims attributed to the source \"brandfactory.\" Furthermore, the record documents that the provider is \"Unverified; source describes Ahrefs-style DR,\" and links directly to the GitHub repository CSV where the data was retrieved.\n\nThis level of detail is rendered natively into the operator ledger view. The user interface is designed to reflect the working nature of the data. It does not present an unblemished wall of perfect information; it surfaces the source history for each row. Users can see the honest headline numbers, narrow their focus by route, link status, or category, and read the specific claims before trusting the metrics. The LaunchDesk page itself asserts its thesis clearly: \"Launch destinations are working material, like the idea ledger — the value is comparing provenance and tradeoffs, not scrolling a wall of links.\"\n\nBy surfacing the origin of every claim and proudly displaying explicit unknowns, this architecture allows makers to evaluate launch destinations with the same analytical rigor they apply to their own codebases.\n\n## Practical Next Action\n\nBefore initiating your next product launch, audit your existing list of intended submission destinations. For every destination on your list, attempt to identify the specific source and the retrieval date for its claimed metrics (such as Domain Rating, traffic, or link status). If you cannot confidently trace a metric to a verifiable source, mark that metric as an explicit unknown. Recalculate your submission priorities based solely on the destinations where the data provenance is clear, or where the explicit unknowns justify a targeted, manual research effort.\n",
      "url": "https://sassmaker.com/learnings/why-every-launch-destination-needs-source-attribution"
    },
    {
      "slug": "why-launch-tracking-should-not-become-automated-submission-spam",
      "title": "Why launch tracking should not become automated submission spam",
      "description": "Discover why careful, manually tracked launch submissions using tools like LaunchDesk drastically outperform automated directory submission spam in SaaS.",
      "publishedAt": "2026-08-21",
      "publishedLabel": "August 21, 2026",
      "readingTime": "5 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/why-launch-tracking-should-not-become-automated-submission-spam",
      "markdown": "# Why launch tracking should not become automated submission spam\n\n- Published: 2026-09-20\n- Author: Sarthak Agrawal\n- Reading time: 5 min read\n- Canonical HTML: https://sassmaker.com/learnings/why-launch-tracking-should-not-become-automated-submission-spam\n\nThe siren song of the \"launch everywhere\" button is hard for early-stage software founders to resist. In the initial push to acquire users, get backlinks, and generate buzz, the idea of blasting a product to 500 directories simultaneously sounds like a growth hack waiting to be exploited. But the reality of software launches is far more nuanced. What begins as a desire for visibility quickly devolves into automated submission spam—a strategy that not only yields diminishing returns but can actively harm your brand and domain authority.\n\nEffective launch tracking is a strategic, measured, and highly deliberate process. It relies on curated destinations, verified metrics, and careful attribution, rather than throwing a single generic pitch at the wall and hoping it sticks.\n\n## The Problem with Automated Submission Spam\n\nAutomated directory submission is a relic of early-2000s SEO tactics, rebranded for the modern SaaS era. These tools promise to distribute your application to hundreds of endpoints with a single click. However, the architecture of these platforms often betrays their inherent flaws.\n\nFirst, automated submissions lack context. Every directory, review site, or community platform has its own audience, tone, and submission guidelines. Product Hunt requires a maker's narrative; a developer tool directory might demand API documentation links; a B2B SaaS review site needs pricing tier details. An automated blast forces a generic, lowest-common-denominator profile across all these distinct environments. The result is a listing that looks algorithmic and fails to resonate with the specific audience of that platform.\n\nSecond, the pursuit of volume inevitably leads to low-quality destinations. To boast \"500+ submissions,\" automated tools must scrape the bottom of the barrel, submitting to link farms, abandoned WordPress installations, and directories with zero organic traffic. Search engines are sophisticated enough to recognize these low-quality backlink profiles. Instead of boosting your Domain Rating (DR), you risk diluting your domain authority or, worse, triggering spam flags.\n\nFinally, the \"spray and pray\" approach provides zero actionable intelligence. When you submit everywhere simultaneously, you lose the ability to measure which channels actually convert. If you get a spike in traffic, you cannot accurately attribute it to a specific directory. You have traded strategic insight for sheer noise.\n\n## What Real Launch Tracking Looks Like\n\nIf automated submission is the antithesis of strategy, what does an effective launch tracking methodology look like? It is fundamentally an attribution-focused endeavor.\n\nReal launch tracking treats every directory, community, and platform as a distinct acquisition channel that requires measurement. It involves managing a carefully curated destination catalog where every endpoint is evaluated for its potential return on investment.\n\nInstead of asking, \"How many places can I submit to?\" the strategic founder asks:\n- \"What is the verified Domain Rating (DR) of this directory?\"\n- \"Are the backlinks provided follow or nofollow?\"\n- \"Does this platform have active, organic traffic relevant to my niche?\"\n- \"Is the submission process gated, paid, or open?\"\n\nA structured approach requires tracking the lifecycle of a launch at each destination. A destination starts as \"needs-research,\" moves to \"source-reported\" once metrics are identified, and is eventually \"measured\" when traffic and conversions can be attributed back to that specific listing. Crucially, a robust system also includes a \"quarantined\" state for directories that exhibit suspicious behavior or unverified claims.\n\n## Concrete Examples: The LaunchDesk Approach\n\nWe can see the contrast between automated spam and strategic tracking by examining how a curated catalog operates. Consider the architecture behind SaaS Maker's LaunchDesk.\n\nLaunchDesk is not an automated submission engine. It is a launch-destination catalog with source-attributed metrics. It is rendered natively from a generated dataset, reflecting a deliberate, manual process of evaluating endpoints.\n\nFor example, when evaluating a directory like \"10 Words\" or \"1000.tools\", LaunchDesk doesn't just blindly fire off an API request. The system tracks the directory's domain, the submission URL, its category, and its pricing model. More importantly, it tracks the Domain Rating (DR) and the link type (follow vs. nofollow).\n\nIf a source claims a directory has a DR of 34, but independent research shows conflicting data, that destination is flagged with warnings like \"DR sources disagree.\" This level of scrutiny is impossible with automated tools.\n\nFurthermore, a strategic system like LaunchDesk relies on a local app to add per-product queues, submission tracking, and link checking. This means that a submission is treated as a distinct project task, handled in a dedicated workbench, rather than an anonymous background process. By explicitly separating the *catalog of destinations* from the *act of submission*, founders are forced to approach each launch thoughtfully.\n\n## Why Manual Submissions Win in the Long Run\n\nThe argument against automated submission spam is not merely a philosophical preference for craftsmanship; it is a pragmatic reality of how modern digital marketing works.\n\nWhen you submit manually (or use a tracked, queue-based system), you retain the ability to tailor your pitch. You can write a custom maker's comment for Product Hunt, adjust your screenshots for a mobile-focused directory, and tweak your copy to highlight the specific features most relevant to a niche community. This tailored approach drastically increases the likelihood of an engaged response.\n\nMoreover, deliberate tracking allows you to establish real relationships. When you treat a directory as an acquisition channel, you pay attention to the traffic it drives. You can engage with users who leave comments, update your listing as your product evolves, and understand the conversion rates associated with different platforms.\n\nAutomated spam treats the internet as a dumping ground. Strategic launch tracking treats it as an ecosystem. By protecting your domain from low-quality link farms and focusing your energy on verified, measured destinations, you build a sustainable foundation for growth. The goal is not to be everywhere; the goal is to be exactly where your target audience is looking, and to measure the impact of being there.\n\n## Practical Next Action\nInstead of looking for an automated submission tool, start by building a small, curated list of the top 10 highest-value directories in your specific niche. Evaluate their Domain Rating and audience relevance, and create a custom, manual submission for each one, tracking the traffic they generate over the next 30 days.\n",
      "url": "https://sassmaker.com/learnings/why-launch-tracking-should-not-become-automated-submission-spam"
    },
    {
      "slug": "skills-should-declare-capabilities-not-model-names",
      "title": "Skills should declare capabilities, not model names",
      "description": "Why portable agent skills need provider-neutral intelligence and reasoning requirements, and how Fleet is testing the idea.",
      "publishedAt": "2026-07-28",
      "publishedLabel": "July 28, 2026",
      "readingTime": "7 min read",
      "author": "Sarthak Agrawal",
      "href": "/learnings/skills-should-declare-capabilities-not-model-names",
      "markdown": "# Skills should declare capabilities, not model names\n\nAgents choose models. Skills should say what they need.\n\nA working method applied across 28 Fleet-owned skills.\n\n- Published: 2026-07-28\n- Author: Sarthak Agrawal\n- Reading time: 7 min read\n- Canonical HTML: https://sassmaker.com/learnings/skills-should-declare-capabilities-not-model-names\n\n~~~json\n{\n  \"recommended\": {\n    \"intelligence\": \"frontier\",\n    \"reasoning\": \"high\"\n  },\n  \"minimum\": {\n    \"intelligence\": \"balanced\",\n    \"reasoning\": \"high\"\n  },\n  \"degradation\": \"deny\"\n}\n~~~\n\nOnce a skill library grows past a handful of prompts, model selection becomes part of skill design whether you acknowledge it or not. Some skills mostly retrieve facts and format results. Others make product decisions, validate claims, or act in public.\n\nI ran into this while building two marketing skills. One audits search coverage and publishes missing pages. The other plans a launch, writes the campaign, and can carry an approved plan into public channels. Giving every step the strongest model would waste money. Letting an underpowered model handle claims or submissions would be careless.\n\nThe obvious answer is to put a model name in each skill. It is also the wrong abstraction for a portable skill. The better method is small, practical, and not especially revolutionary: let the skill declare the capability it needs, then let the host decide how to provide it.\n\n## Is a skill an agent?\n\nNo. This distinction matters more than it first appears.\n\nAn agent is the active runtime. It has a model, tools, permissions, context, and an execution loop. A skill is a package of instructions and resources that the runtime loads when a job calls for it.\n\nThe agent decides and acts. The skill changes how it approaches one class of work. If a skill hard-codes a model, it starts taking over a decision that usually belongs to the host.\n\n## Has anyone already done this?\n\nYes, at least part of it.\n\nClaude Code supports `model` and `effort` directly in skill frontmatter. That is the clearest version of the idea I found, and it is useful. The [Claude Code documentation](https://code.claude.com/docs/en/slash-commands#frontmatter-reference) says the model override lasts for the current turn.\n\nAgent frameworks make the same choice one layer higher. The [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/models/) supports model selection per agent or run. LangChain's [skills pattern](https://docs.langchain.com/oss/python/langchain/multi-agent/skills) loads specialized prompts into an agent whose model is configured separately.\n\nSo model-aware execution is not new. The portable part is still awkward.\n\n## What is missing?\n\nThe open [Agent Skills specification](https://agentskills.io/specification) defines the portable package. Its standard fields cover identity, description, compatibility, metadata, and allowed tools. It does not define model or reasoning requirements.\n\nA literal model field would not fully solve that problem. A model name can be absent on another host, blocked by company policy, too expensive for the current run, or replaced next month. Even reasoning controls use different names across providers.\n\nThe skill knows the quality of work it needs. The host knows which runtimes are available. The contract should connect those two facts without pretending they are the same fact.\n\n> Declare the need, set a floor, choose what degradation means, and leave model mapping to the host.\n\n## What is the methodology?\n\nA useful skill execution profile answers four questions:\n\n1. **Need:** What quality would I choose when the work matters?\n2. **Floor:** What is the lowest capability that can do the job responsibly?\n3. **Degrade:** May the runtime degrade quietly, must it ask, or should it refuse?\n4. **Map:** Why does this skill need that level?\n\nThe profile should not name the current favorite model. It should describe stable capabilities in a vocabulary the host can map to its own providers.\n\nIn Fleet, intelligence is `economy`, `balanced`, or `frontier`. Reasoning runs from `low` to `very_high`. Degradation is `allow`, `ask`, or `deny`. The vocabulary is intentionally plain.\n\nI applied the method to every Fleet-owned skill. There are 28 today. Each has an `execution-profile.json` beside its instructions. The metadata catalog can read that profile before it loads the skill body.\n\n~~~text\nfleet-capabilities execution \\\n  skill:launch-campaign \\\n  --runtime balanced:high\n\n# compatible\n# action: continue\n~~~\n\nThe compatibility check returns recommended, compatible, degraded, approval required, or re-dispatch required. It never picks a provider or invokes a model. A host maps `frontier:high` to whatever meets its cost, availability, and policy rules.\n\n## Where does it fall short?\n\nThe tiers are subjective. Hosts still need a mapping table, and two models labelled \"frontier\" may be good at very different things. A whole-skill profile also ignores mixed workloads. The research stage of a campaign and the final browser submission do not necessarily need the same runtime.\n\nI considered stage-specific profiles and a larger capability vocabulary. I left both out. There is no evidence yet that the extra machinery would improve our work.\n\nThis is a working method in one skill library, not a proposed standard. The schema is small enough to change or delete when usage proves part of it wrong.\n\n## What is the useful idea?\n\nIt is not the model switch. Claude Code already has one.\n\nThe useful idea is execution hygiene. A portable skill should be honest about the quality it requires without taking routing away from the host. A deployment guard and a directory listing should not silently receive the same treatment.\n\nI do not know whether this belongs in the Agent Skills standard. I do think mature skill libraries need some version of the methodology. Our own skills are clearer now because they can say what they need, what they will tolerate, and when they should refuse to run.\n\nThe operating rule is simple: skills state their needs; hosts choose the machinery.\n\n## Sources and implementation\n\n- [Agent Skills specification](https://agentskills.io/specification)\n- [Claude Code skill frontmatter](https://code.claude.com/docs/en/slash-commands#frontmatter-reference)\n- [OpenAI Agents SDK model configuration](https://openai.github.io/openai-agents-python/models/)\n- [LangChain skills pattern](https://docs.langchain.com/oss/python/langchain/multi-agent/skills)\n",
      "url": "https://sassmaker.com/learnings/skills-should-declare-capabilities-not-model-names"
    }
  ]
}