{
  "updated": "https://faqtualhub.pages.dev",
  "products": [
    {
      "id": "rental-saas",
      "title": "Rental Property Management SaaS",
      "tagline": "The whole rent cycle for landlords — leases, bills, payments and expenses — in one workspace.",
      "status": "live",
      "visibility": "private",
      "markets": [
        "saas",
        "ai"
      ],
      "page": "/apps/rental-saas/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "Most of the code was generated through Hatchable’s AI builder from my step-by-step specifications, then reviewed and corrected.",
        "Not yet done: two-account isolation (IDOR) testing, a configured payment provider, and verification of the MCP tools with a real AI client.",
        "The source repository is private."
      ],
      "related": [
        "rental-mcp",
        "ai-job-agent",
        "careersync-ai"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "prospectpilot",
      "title": "ProspectPilot AI",
      "tagline": "An evidence-first sales agent that finds companies who need what you sell — and shows you the proof.",
      "status": "in-development",
      "visibility": "private",
      "markets": [
        "agents",
        "ai",
        "tools"
      ],
      "page": "/apps/prospectpilot/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "In development. The live pipeline has been run on real domains via a domain list; the Google Places and Brave adapters and a full Claude run with a real key are not yet verified.",
        "Arabic drafts have not yet had a native Gulf-Arabic review.",
        "“ProspectPilot” is a working product name. Source is private while the competition is running."
      ],
      "related": [
        "ai-job-agent",
        "rental-mcp",
        "local-agent-lab"
      ],
      "agent": {
        "objective": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence.",
        "input": "A business setup (website, services, geography) turned into an ICP you approve; a run is then queued as a background job.",
        "reasoning": "A planner proposes one step at a time (a source plus a query), sees how many new companies it produced and proposes the next — stopping at the company limit, when every industry/city pair is tried, or after 10 planning steps. The code validates every proposal.",
        "execution": "A Postgres-backed job queue and a separate worker run a persistent state machine (plan → find → research → score → draft). Every planning decision and tool call is logged and streamed to the run page; runs can be cancelled and retried.",
        "safety": "Human approval for every external action and no sending integration. SSRF guard (private ranges, encoded IPs, redirects, DNS rebinding), prompt-injection handling, public business data only — no LinkedIn scraping, no guessed or personal emails, suppression lists and data deletion. Per-run and per-workspace-month cost caps enforced in code."
      },
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        },
        {
          "name": "places_search",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence."
        },
        {
          "name": "search_companies",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence."
        },
        {
          "name": "exhibitor list fetcher",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence."
        },
        {
          "name": "CSV / domain import",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence."
        },
        {
          "name": "safe page fetcher",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence."
        },
        {
          "name": "PageSpeed Insights",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence."
        },
        {
          "name": "tech detection",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence."
        },
        {
          "name": "fact extraction",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence."
        },
        {
          "name": "need detection",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence."
        },
        {
          "name": "scoring",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence."
        },
        {
          "name": "drafting",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find companies that match your ideal customer profile and have an evidenced problem your services fix, then draft outreach that cites that evidence."
        }
      ]
    },
    {
      "id": "rental-mcp",
      "title": "Rental SaaS MCP Server",
      "tagline": "Lets an authorised AI client ask a landlord’s own rental data questions — read-only.",
      "status": "live",
      "visibility": "private",
      "markets": [
        "agents",
        "ai"
      ],
      "page": "/apps/rental-mcp/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "The tools have not yet been fully verified end to end with a real MCP client — treat this as working but unproven."
      ],
      "related": [
        "rental-saas",
        "ai-job-agent",
        "careeros"
      ],
      "agent": {
        "objective": "Answer an owner’s questions about their portfolio from inside an MCP-compatible AI client.",
        "input": "The AI client decides to call a tool while answering the owner; the call arrives at the /mcp endpoint.",
        "reasoning": "The client’s model chooses which tool to call. The server holds no model — it only executes tools.",
        "execution": "Each tool resolves the owner from the authenticated identity, runs the same owner-scoped queries as the app, and returns structured results.",
        "safety": "Every tool is read-only and requires project-member access. If the owner can’t be resolved unambiguously, the call fails rather than guessing."
      },
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        },
        {
          "name": "get_properties",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Answer an owner’s questions about their portfolio from inside an MCP-compatible AI client."
        },
        {
          "name": "get_units",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Answer an owner’s questions about their portfolio from inside an MCP-compatible AI client."
        },
        {
          "name": "get_tenants",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Answer an owner’s questions about their portfolio from inside an MCP-compatible AI client."
        },
        {
          "name": "get_active_leases",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Answer an owner’s questions about their portfolio from inside an MCP-compatible AI client."
        },
        {
          "name": "get_monthly_billing_summary",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Answer an owner’s questions about their portfolio from inside an MCP-compatible AI client."
        },
        {
          "name": "get_outstanding_rent",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Answer an owner’s questions about their portfolio from inside an MCP-compatible AI client."
        },
        {
          "name": "get_payment_history",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Answer an owner’s questions about their portfolio from inside an MCP-compatible AI client."
        },
        {
          "name": "get_expenses",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Answer an owner’s questions about their portfolio from inside an MCP-compatible AI client."
        },
        {
          "name": "get_financial_summary",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Answer an owner’s questions about their portfolio from inside an MCP-compatible AI client."
        },
        {
          "name": "get_outstanding_aging",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Answer an owner’s questions about their portfolio from inside an MCP-compatible AI client."
        }
      ]
    },
    {
      "id": "ai-job-agent",
      "title": "AI Job Agent",
      "tagline": "A local-first agent that finds jobs, ranks them against your CV and explains every match with quotes.",
      "status": "in-development",
      "visibility": "public",
      "markets": [
        "agents",
        "ai",
        "tools"
      ],
      "page": "/apps/ai-job-agent/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "local-agent-lab",
        "careersync-ai",
        "careeros"
      ],
      "agent": {
        "objective": "Find relevant roles and explain, with evidence, how well your CV fits each one.",
        "input": "A chat message on the Agent page, or a background job (search, analysis, CV processing) picked up by the worker from a queue.",
        "reasoning": "A hand-written loop over native tool calling (Anthropic tool_use / Ollama tool_calls). It stops on a step limit, a deadline, an exhausted budget, a refusal or cancellation.",
        "execution": "Tasks are durable: leased, reconciled, retried and cancellable, with every step recorded and shown on the Activity page. Analysis output is validated — quotes must match the source text exactly.",
        "safety": "Each tool declares its side effect (none, internal write, external read, external write, irreversible); the executor uses that to decide when a policy check or approval is required. No AI call runs without consent, a key and budget. It never logs in, scrapes behind sign-in, or submits anything."
      },
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        },
        {
          "name": "get_my_profile",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find relevant roles and explain, with evidence, how well your CV fits each one."
        },
        {
          "name": "get_my_verified_answers",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find relevant roles and explain, with evidence, how well your CV fits each one."
        },
        {
          "name": "get_primary_cv_text",
          "permission": "owner.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find relevant roles and explain, with evidence, how well your CV fits each one."
        },
        {
          "name": "save_job_posting",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find relevant roles and explain, with evidence, how well your CV fits each one."
        },
        {
          "name": "list_saved_jobs",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find relevant roles and explain, with evidence, how well your CV fits each one."
        },
        {
          "name": "analyze_job_match",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Find relevant roles and explain, with evidence, how well your CV fits each one."
        }
      ]
    },
    {
      "id": "careersync-ai",
      "title": "CareerSync AI",
      "tagline": "Upload a CV once, review every extracted change, then sync it to job portals and your portfolio.",
      "status": "prototype",
      "visibility": "private",
      "markets": [
        "agents",
        "ai",
        "tools"
      ],
      "page": "/apps/careersync-ai/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "Runs locally; there is no public demo or repository."
      ],
      "related": [
        "ai-job-agent",
        "careeros",
        "rental-saas"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "careeros",
      "title": "CareerOS",
      "tagline": "A local command centre that runs an open-source job-search agent’s workflows safely from the browser.",
      "status": "prototype",
      "visibility": "private",
      "markets": [
        "agents",
        "tools"
      ],
      "page": "/apps/careeros/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "The career-ops engine is third-party open source (MIT). Only the CareerOS UI and server described here are my work, and they are not published."
      ],
      "related": [
        "ai-job-agent",
        "local-agent-lab",
        "careersync-ai"
      ],
      "agent": {
        "objective": "Run job-search workflows (evaluations, tracking, drafts) without touching a terminal.",
        "input": "A button in the UI sends an action id to the local server.",
        "reasoning": "The underlying engine’s modes run through the Claude Code CLI (other CLIs are detected); CareerOS orchestrates rather than reasons.",
        "execution": "Child processes run with shell disabled; output streams to the browser over Server-Sent Events and is persisted by the engine’s own scripts.",
        "safety": "Server bound to 127.0.0.1. Allowlisted actions only. Destructive operations need confirmation, tracker tools offer a dry-run preview, and nothing is ever submitted or sent — drafts are for you to copy."
      },
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        },
        {
          "name": "Allowlisted engine scripts",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Run job-search workflows (evaluations, tracking, drafts) without touching a terminal."
        },
        {
          "name": "Claude Code CLI with Write, Edit and Bash denied",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Run job-search workflows (evaluations, tracking, drafts) without touching a terminal."
        }
      ]
    },
    {
      "id": "local-agent-lab",
      "title": "Local AI Agent Lab",
      "tagline": "Learning how agents work by building one by hand — no framework, local model only.",
      "status": "learning",
      "visibility": "public",
      "markets": [
        "agents"
      ],
      "page": "/apps/local-agent-lab/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "ai-job-agent",
        "careeros",
        "expense-tracker"
      ],
      "agent": {
        "objective": "Understand each part of an agent by implementing it explicitly.",
        "input": "Planned: a task from a local dashboard.",
        "reasoning": "Planned loop: build context → call the model → parse its decision → validate tool arguments with Zod → policy check (allow / require approval / deny).",
        "execution": "Planned: execute, observe, verify, persist to SQLite.",
        "safety": "Designed in from the start: an approval manager that waits for a human decision, and file tools confined to a workspace folder."
      },
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        },
        {
          "name": "Planned: calculator",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Understand each part of an agent by implementing it explicitly."
        },
        {
          "name": "Planned: workspace read & search",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Understand each part of an agent by implementing it explicitly."
        },
        {
          "name": "Planned: notes",
          "permission": "public.read",
          "executable": false,
          "readOnly": true,
          "reason": "Declared on the product. This static site does not hold that product’s credentials, so the call fails closed.",
          "description": "Understand each part of an agent by implementing it explicitly."
        }
      ]
    },
    {
      "id": "boring-doc",
      "title": "Boring Doc",
      "tagline": "We read the boring docs so you don’t have to — Flutter docs turned into short, evidence-backed explanations.",
      "status": "live",
      "visibility": "private",
      "markets": [
        "ai",
        "tools"
      ],
      "page": "/apps/boring-doc/",
      "openUrl": "https://fresh-doc.vercel.app/",
      "publiclyOpenable": true,
      "price": null,
      "pricePublished": false,
      "notes": [
        "Flutter is the only ecosystem built so far; the others are listed as planned.",
        "Boring Doc is independent and not affiliated with Google. Upstream docs stay under their own licences (flutter/website text CC BY 3.0)."
      ],
      "related": [
        "portfolio-guide",
        "ai-job-agent",
        "expense-tracker"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "glowfit-ai",
      "title": "GlowFit AI",
      "tagline": "One selfie in, a confident look out — skin analysis, virtual try-on and a score for which look suits you.",
      "status": "live",
      "visibility": "public",
      "markets": [
        "ai",
        "tools"
      ],
      "page": "/apps/glowfit-ai/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "expense-tracker",
        "face-detection",
        "portfolio-guide"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "expense-tracker",
      "title": "AI Smart Expense Tracker",
      "tagline": "Type how you spent money — even in Hinglish — and get structured expense cards back.",
      "status": "learning",
      "visibility": "public",
      "markets": [
        "apps",
        "ai"
      ],
      "page": "/apps/expense-tracker/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "The AI response is simulated in this version — the project demonstrates the hook pattern and UI states, not LLM accuracy."
      ],
      "related": [
        "glowfit-ai",
        "local-agent-lab",
        "pregnancy-tracker"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "portfolio-guide",
      "title": "AI Portfolio Guide",
      "tagline": "A recruiter-facing chat on my portfolio that answers only from verified facts — and says so when it can’t.",
      "status": "live",
      "visibility": "public",
      "markets": [
        "ai",
        "tools"
      ],
      "page": "/apps/portfolio-guide/",
      "openUrl": "https://afaquejaya.github.io/",
      "publiclyOpenable": true,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "portfolio-site",
        "glowfit-ai",
        "rental-mcp"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "face-detection",
      "title": "Face Detection",
      "tagline": "Pick a photo; the app finds every face and reads age, emotion, hair, glasses and head pose.",
      "status": "learning",
      "visibility": "public",
      "markets": [
        "apps",
        "ai"
      ],
      "page": "/apps/face-detection/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "glowfit-ai",
        "social-app",
        "video-calling"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "jeeb",
      "title": "Jeeb — Grocery & Logistics Platform",
      "tagline": "A 0→1 grocery e-commerce and delivery platform for Qatar, fully in Arabic.",
      "status": "shipped",
      "visibility": "internal",
      "markets": [
        "apps"
      ],
      "page": "/apps/jeeb/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "Employer product. The store listings are no longer public, so there are no app links or screenshots here."
      ],
      "related": [
        "pass-delivery",
        "tbay",
        "evv"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "pass-delivery",
      "title": "Pass Delivery & Operations Apps",
      "tagline": "On-demand delivery in Qatar — customer, Driver, Collector and Storekeeper apps.",
      "status": "shipped",
      "visibility": "internal",
      "markets": [
        "apps"
      ],
      "page": "/apps/pass-delivery/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "The Play Store listing is no longer public."
      ],
      "related": [
        "jeeb",
        "tbay",
        "evv"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "tbay",
      "title": "Tbay",
      "tagline": "A gift-card marketplace for Nigeria and Ghana — escrow-protected trades, live rates, fast payouts.",
      "status": "live",
      "visibility": "public",
      "markets": [
        "apps"
      ],
      "page": "/apps/tbay/",
      "openUrl": "https://play.google.com/store/apps/details?id=com.gonglian.tbay",
      "publiclyOpenable": true,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "vivakard",
        "timucard",
        "bitowi"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "vivakard",
      "title": "VivaKard",
      "tagline": "Turns gift cards into naira with transparent rates — plus referrals, check-ins and a leaderboard.",
      "status": "live",
      "visibility": "public",
      "markets": [
        "apps"
      ],
      "page": "/apps/vivakard/",
      "openUrl": "https://play.google.com/store/apps/details?id=com.gift.vivakard&hl=en",
      "publiclyOpenable": true,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "tbay",
        "timucard",
        "bitowi"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "timucard",
      "title": "TimuCard",
      "tagline": "Gift cards to instant payouts — then pay electricity, cable, airtime and data bills from the balance.",
      "status": "live",
      "visibility": "public",
      "markets": [
        "apps"
      ],
      "page": "/apps/timucard/",
      "openUrl": "https://play.google.com/store/apps/details?id=com.timucard.gift&hl=en",
      "publiclyOpenable": true,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "tbay",
        "vivakard",
        "bitowi"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "bitowi",
      "title": "BitOwi",
      "tagline": "A crypto wallet — store, send and receive crypto with balances and history in one place.",
      "status": "live",
      "visibility": "public",
      "markets": [
        "apps"
      ],
      "page": "/apps/bitowi/",
      "openUrl": "https://play.google.com/store/apps/details?id=com.bitowi.app&hl=en_US",
      "publiclyOpenable": true,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "tbay",
        "vivakard",
        "timucard"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "evv",
      "title": "eVV 2.0",
      "tagline": "Jharkhand’s school-education platform — enrolment, biometric attendance, teachers and schemes in one app.",
      "status": "live",
      "visibility": "public",
      "markets": [
        "apps"
      ],
      "page": "/apps/evv/",
      "openUrl": "https://play.google.com/store/apps/details?id=com.evidyavahini.app",
      "publiclyOpenable": true,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "digischool",
        "jmr",
        "ecampuslink"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "digischool",
      "title": "DigiSchool",
      "tagline": "E-learning for state-government schools during COVID-19.",
      "status": "shipped",
      "visibility": "internal",
      "markets": [
        "apps"
      ],
      "page": "/apps/digischool/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "The store listing is no longer public."
      ],
      "related": [
        "evv",
        "jmr",
        "ecampuslink"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "jmr",
      "title": "JMR — Vendor Register App",
      "tagline": "A native app that replaced paper vendor registers at a Tata Steel company.",
      "status": "shipped",
      "visibility": "internal",
      "markets": [
        "apps"
      ],
      "page": "/apps/jmr/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "The store listing is no longer public."
      ],
      "related": [
        "ecampuslink",
        "tgs-dashboard",
        "evv"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "ecampuslink",
      "title": "e-CampusLink",
      "tagline": "Cross-platform web and mobile school apps built on .NET and Xamarin.",
      "status": "shipped",
      "visibility": "internal",
      "markets": [
        "apps"
      ],
      "page": "/apps/ecampuslink/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "The store listing is no longer public."
      ],
      "related": [
        "jmr",
        "evv",
        "digischool"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "pregnancy-tracker",
      "title": "Pregnancy Tracker",
      "tagline": "A calm, offline week-by-week companion — with today’s week on the home screen.",
      "status": "prototype",
      "visibility": "private",
      "markets": [
        "apps"
      ],
      "page": "/apps/pregnancy-tracker/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [
        "Not published on Google Play; distributed as a test APK. The source repository is private."
      ],
      "related": [
        "expense-tracker",
        "social-app",
        "face-detection"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "portfolio-site",
      "title": "afaquejaya.github.io",
      "tagline": "My hand-built portfolio — no framework, no build step, no templates.",
      "status": "live",
      "visibility": "public",
      "markets": [
        "tools"
      ],
      "page": "/apps/portfolio-site/",
      "openUrl": "https://afaquejaya.github.io/",
      "publiclyOpenable": true,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "portfolio-guide",
        "glowfit-ai",
        "rental-saas"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "tgs-dashboard",
      "title": "IoT Monitoring Dashboard",
      "tagline": "A Windows dashboard monitoring 100+ IoT devices.",
      "status": "shipped",
      "visibility": "internal",
      "markets": [
        "tools"
      ],
      "page": "/apps/tgs-dashboard/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "jmr",
        "ecampuslink",
        "rental-saas"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "social-app",
      "title": "Social Media App",
      "tagline": "Posts, likes, comments, friends, chat and calls — a full social app on Android.",
      "status": "learning",
      "visibility": "public",
      "markets": [
        "apps"
      ],
      "page": "/apps/social-app/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "video-calling",
        "face-detection",
        "pregnancy-tracker"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    },
    {
      "id": "video-calling",
      "title": "Video Calling App",
      "tagline": "One-to-one video and voice calls plus single-channel live streaming.",
      "status": "learning",
      "visibility": "private",
      "markets": [
        "apps"
      ],
      "page": "/apps/video-calling/",
      "openUrl": null,
      "publiclyOpenable": false,
      "price": null,
      "pricePublished": false,
      "notes": [],
      "related": [
        "social-app",
        "face-detection",
        "pregnancy-tracker"
      ],
      "agent": null,
      "tools": [
        {
          "name": "describe_product",
          "permission": "public.read",
          "executable": true,
          "readOnly": true,
          "description": "Return the published catalogue record for this product. Caveats travel with the record."
        }
      ]
    }
  ]
}
