{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"project","url":"https://ejfox.com/projects/towntuner","json_url":"https://ejfox.com/projects/towntuner.json","generator":"ejfox.com/json-twin@1","data":{"cacheVersion":"2026-05-13-gear-cards","html":"<p class=\"\">A single-purpose podcast app for exactly one podcast: Harmontown, all ~360 episodes</p>\n<p class=\"\">For the past five or six years I've listened to Harmontown almost every single night. I went through it a few times on Spotify, then made my way through the archives on YouTube. And each night I kept getting annoyed: every podcast app I used was full of other podcasts I didn't care about, getting in the way of me listening to Harmontown. This was a problem that needed to be solved.</p>\n<p class=\"\">A few weeks later I had a vibe-coded iOS app that Apple somehow approved for TestFlight. It's a little piece of software made with love, mostly just for myself, but I figured if anyone else would find it useful it would be the Harmontown people — so I <a href=\"https://www.reddit.com/r/Harmontown/comments/1q288e8/fan_app_towntuner_an_singlepurpose_podcast_app/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://www.reddit.com/r/Harmontown/comments/1q288e8/fan_app_towntuner_an_singlepurpose_podcast_app/\">posted it to r/Harmontown<svg class=\"inline-block w-4 h-4 ml-1 opacity-50 dark:opacity-75 group-hover:opacity-100 transition-opacity align-text-bottom\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M0 256C0 114.6 114.6 0 256 0s256 114.6 256 256s-114.6 256-256 256H37.1c-13.7 0-20.5-16.5-10.9-26.2L75 437C28.7 390.7 0 326.7 0 256m349.6-102.4c23.6 0 42.7-19.1 42.7-42.7s-19.1-42.7-42.7-42.7c-20.6 0-37.8 14.6-41.8 34c-34.5 3.7-61.4 33-61.4 68.4v.2c-37.5 1.6-71.8 12.3-99 29.1c-10.1-7.8-22.8-12.5-36.5-12.5c-33 0-59.8 26.8-59.8 59.8c0 24 14.1 44.6 34.4 54.1c2 69.4 77.6 125.2 170.6 125.2s168.7-55.9 170.6-125.3c20.2-9.6 34.1-30.2 34.1-54c0-33-26.8-59.8-59.8-59.8c-13.7 0-26.3 4.6-36.4 12.4c-27.4-17-62.1-27.7-100-29.1v-.2c0-25.4 18.9-46.5 43.4-49.9c4.4 18.8 21.3 32.8 41.5 32.8zm-172.5 93.3c16.7 0 29.5 17.6 28.5 39.3s-13.5 29.6-30.3 29.6s-31.4-8.8-30.4-30.5S160.3 247 177 247zm190.1 38.3c1 21.7-13.7 30.5-30.4 30.5s-29.3-7.9-30.3-29.6s11.8-39.3 28.5-39.3s31.2 16.6 32.1 38.3zm-48.1 56.7c-10.3 24.6-34.6 41.9-63 41.9s-52.7-17.3-63-41.9c-1.2-2.9.8-6.2 3.9-6.5c18.4-1.9 38.3-2.9 59.1-2.9s40.7 1 59.1 2.9c3.1.3 5.1 3.6 3.9 6.5\" class=\"\"></path></svg></a> on New Year's Day.</p>\n<figure role=\"figure\" aria-label=\"towntuner — a Harmontown-only podcast player\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1780065876/projects/towntuner/1.png\" alt=\"towntuner — a Harmontown-only podcast player\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1780065876/projects/towntuner/1.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1780065876/projects/towntuner/1.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1780065876/projects/towntuner/1.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1780065876/projects/towntuner/1.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"towntuner — a Harmontown-only podcast player\" width=\"988\" height=\"2108\" style=\"--splay-rot:0.6deg;\" data-dimensions=\"988×2108\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">towntuner — a Harmontown-only podcast player</figcaption>\n</figure>\n<h2 class=\"\" id=\"what-it-does\">What it does</h2>\n<ul class=\"list-disc\">\n<li class=\"\"><strong class=\"\">Shuffle all episodes</strong>, skipping the ones you've played recently</li>\n<li class=\"\"><strong class=\"\">Filter episodes by guest</strong></li>\n<li class=\"\"><strong class=\"\">Read the transcript</strong> of whatever's playing</li>\n<li class=\"\"><strong class=\"\">Search across every transcript</strong></li>\n<li class=\"\"><strong class=\"\">See your totals</strong> — episodes listened to, hours listened</li>\n</ul>\n<p class=\"\">It builds on the amazing work of <a href=\"https://harmonsearch.com\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://harmonsearch.com\">HarmonSearch</a>, whose transcripts power both the transcript view and search.</p>\n<figure role=\"figure\" aria-label=\"towntuner on iPhone — the episode browser with prestige progression\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/towntuner/2.png\" alt=\"towntuner on iPhone — the episode browser with prestige progression\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/towntuner/2.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/towntuner/2.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/towntuner/2.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/towntuner/2.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"towntuner on iPhone — the episode browser with prestige progression\" width=\"988\" height=\"2108\" style=\"--splay-rot:1.51deg;\" data-dimensions=\"988×2108\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">towntuner on iPhone — the episode browser with prestige progression</figcaption>\n</figure>\n<p class=\"\"><a href=\"https://testflight.apple.com/join/Theuk8mq\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://testflight.apple.com/join/Theuk8mq\">Join the TestFlight beta<svg class=\"inline-block w-4 h-4 ml-1 opacity-50 dark:opacity-75 group-hover:opacity-100 transition-opacity align-text-bottom\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04c-2.04.027-3.91 1.183-4.961 3.014c-2.117 3.675-.546 9.103 1.519 12.09c1.013 1.454 2.208 3.09 3.792 3.039c1.52-.065 2.09-.987 3.935-.987c1.831 0 2.35.987 3.96.948c1.637-.026 2.676-1.48 3.676-2.948c1.156-1.688 1.636-3.325 1.662-3.415c-.039-.013-3.182-1.221-3.22-4.857c-.026-3.04 2.48-4.494 2.597-4.559c-1.429-2.09-3.623-2.324-4.39-2.376c-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83c-1.207.052-2.662.805-3.532 1.818c-.78.896-1.454 2.338-1.273 3.714c1.338.104 2.715-.688 3.559-1.701\" class=\"\"></path></svg></a> — iOS only, sorry.</p>","title":"towntuner","metadata":{"title":"towntuner","date":"2025-08-01T04:00:00.000Z","category":"Apps","featured":false,"draft":false,"url":"https://github.com/ejfox/towntuner","tech":["Swift","SwiftUI","iOS"],"state":"deployed","ai-involvement":"ai-collaborative","tags":["ios","app","audio"],"words":222,"images":2,"imageDetails":{"total":2,"cloudinary":2,"withDimensions":0},"links":3,"codeBlocks":0,"headers":{"h2":1},"toc":[{"text":"What it does","slug":"what-it-does","level":"h2","children":[]}],"type":"post"}},"_links":{"self":"https://ejfox.com/projects/towntuner.json","html":"https://ejfox.com/projects/towntuner","index":"/projects.json"}}