{
    "type": "list",
    "title": "Projects",
    "canonical": "https://www.dealmobile.co.uk/projects",
    "description": "Apps I run, and the libraries, tools and experiments I’ve built. Each has a page with how it works and how it is built.",
    "path": "/projects",
    "url": "https://www.dealmobile.co.uk/projects",
    "markdown": "https://www.dealmobile.co.uk/projects.md",
    "json": "https://www.dealmobile.co.uk/projects.json",
    "items": [
        {
            "type": "project",
            "title": "Mullet",
            "url": "https://www.dealmobile.co.uk/projects/mullet",
            "markdown": "https://www.dealmobile.co.uk/projects/mullet.md",
            "json": "https://www.dealmobile.co.uk/projects/mullet.json",
            "summary": "A Python tool that runs large coding jobs unattended with your own Claude Code, checks every step itself, and returns a branch and an evidence report.",
            "published": "2026-10-20"
        },
        {
            "type": "project",
            "title": "Solar Calendar",
            "url": "https://www.dealmobile.co.uk/projects/solar-calendar",
            "markdown": "https://www.dealmobile.co.uk/projects/solar-calendar.md",
            "json": "https://www.dealmobile.co.uk/projects/solar-calendar.json",
            "summary": "A calendar where every month is the same four weeks, the year keeps pace with the seasons, and ordinary dates are shown alongside every day.",
            "published": "2026-10-20"
        },
        {
            "type": "project",
            "title": "Where Should I Live",
            "url": "https://www.dealmobile.co.uk/projects/where-should-i-live",
            "markdown": "https://www.dealmobile.co.uk/projects/where-should-i-live.md",
            "json": "https://www.dealmobile.co.uk/projects/where-should-i-live.json",
            "summary": "A city-ranking app that works out your take-home pay, monthly costs and visa options in 78 cities, for one person or a whole household. A headless CMS holds the data, and a static app ships it.",
            "published": "2026-10-20"
        },
        {
            "type": "project",
            "title": "Apple News API",
            "url": "https://www.dealmobile.co.uk/projects/apple-news-api",
            "markdown": "https://www.dealmobile.co.uk/projects/apple-news-api.md",
            "json": "https://www.dealmobile.co.uk/projects/apple-news-api.json",
            "summary": "A PHP 8.1 library for the Apple News Publisher API. It signs requests, builds Apple News Format documents in PHP objects and handles articles, sections and channels.",
            "published": "2026-10-20"
        },
        {
            "type": "project",
            "title": "TurboPush",
            "url": "https://www.dealmobile.co.uk/projects/turbopush",
            "markdown": "https://www.dealmobile.co.uk/projects/turbopush.md",
            "json": "https://www.dealmobile.co.uk/projects/turbopush.json",
            "summary": "A dependency-free TypeScript upload client and a single-class PHP endpoint. Files go up in parallel chunks with retries, pause and resume, and the client also speaks the open tus protocol.",
            "published": "2026-10-20"
        },
        {
            "type": "project",
            "title": "RSS to JSON",
            "url": "https://www.dealmobile.co.uk/projects/rss-to-json",
            "markdown": "https://www.dealmobile.co.uk/projects/rss-to-json.md",
            "json": "https://www.dealmobile.co.uk/projects/rss-to-json.json",
            "summary": "Parses RSS 0.9x and 2.0, RSS 1.0, Atom and other XML feeds into plain PHP arrays ready for json_encode, keeping namespaced elements such as media:content and dc:creator.",
            "published": "2026-10-20"
        },
        {
            "type": "project",
            "title": "Puzzler PHP SDK",
            "url": "https://www.dealmobile.co.uk/projects/puzzler-php-sdk",
            "markdown": "https://www.dealmobile.co.uk/projects/puzzler-php-sdk.md",
            "json": "https://www.dealmobile.co.uk/projects/puzzler-php-sdk.json",
            "summary": "A small PHP library for publishers who license puzzles from Puzzler Media. It signs each request, filters puzzles by date, type and name, and maps HTTP errors to exceptions.",
            "published": "2026-10-20"
        },
        {
            "type": "project",
            "title": "GitHub Auditor",
            "url": "https://www.dealmobile.co.uk/projects/github-auditor",
            "markdown": "https://www.dealmobile.co.uk/projects/github-auditor.md",
            "json": "https://www.dealmobile.co.uk/projects/github-auditor.json",
            "summary": "A Python CLI that keeps a local clone of every repository in your GitHub and Bitbucket accounts and writes Markdown reports from them. It can also archive, license, tag and reconfigure repositories in bulk.",
            "published": "2026-10-20"
        },
        {
            "type": "project",
            "title": "ScrapePy",
            "url": "https://www.dealmobile.co.uk/projects/scrapepy",
            "markdown": "https://www.dealmobile.co.uk/projects/scrapepy.md",
            "json": "https://www.dealmobile.co.uk/projects/scrapepy.json",
            "summary": "A command-line crawler that downloads a site with its images, rewrites the links so it works offline, and writes a Markdown copy with frontmatter. Re-runs only fetch what has changed.",
            "published": "2026-10-20"
        },
        {
            "type": "project",
            "title": "Trove",
            "url": "https://www.dealmobile.co.uk/projects/trove",
            "markdown": "https://www.dealmobile.co.uk/projects/trove.md",
            "json": "https://www.dealmobile.co.uk/projects/trove.json",
            "summary": "A Python search engine for your own documents and code. It runs keyword and vector search together, re-ranks the results with a cross-encoder, and answers AI coding tools through an MCP server with 38 tools.",
            "published": "2026-10-20"
        },
        {
            "type": "project",
            "title": "Scrape",
            "url": "https://www.dealmobile.co.uk/projects/scrape",
            "markdown": "https://www.dealmobile.co.uk/projects/scrape.md",
            "json": "https://www.dealmobile.co.uk/projects/scrape.json",
            "summary": "A single PHP class that walks the “Index of /” pages a web server generates, filters the files by type, path and name, and downloads them in parallel.",
            "published": "2026-10-20"
        },
        {
            "type": "project",
            "title": "TCL Google TV Tools",
            "url": "https://www.dealmobile.co.uk/projects/tcl-google-tv-tools",
            "markdown": "https://www.dealmobile.co.uk/projects/tcl-google-tv-tools.md",
            "json": "https://www.dealmobile.co.uk/projects/tcl-google-tv-tools.json",
            "summary": "Shell and Python scripts that switch off a TCL Google TV’s unwanted packages in small, reversible batches, get round TCL’s block on apps starting at boot, check the setup after every restart, and give a Linux laptop a 4K screen on the TV that only exists while the TV is watching.",
            "published": "2026-10-23"
        },
        {
            "type": "project",
            "title": "Reelify",
            "url": "https://www.dealmobile.co.uk/projects/reelify",
            "markdown": "https://www.dealmobile.co.uk/projects/reelify.md",
            "json": "https://www.dealmobile.co.uk/projects/reelify.json",
            "summary": "A local Python pipeline that scores the motion in each frame of a screen recording, cuts the idle parts, speeds up the rest to fit a target length and can caption keyframes with a local vision model.",
            "published": "2026-10-20"
        }
    ]
}