[{"data":1,"prerenderedAt":506},["ShallowReactive",2],{"project-42838875":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":28,"sentiment":29,"stance_mix":30,"scored_comments":35,"aspects":36,"strip":47,"post_text":49,"what":50,"said":110,"maker_in_thread":269,"shape":276,"grid":281,"attempts":469,"same_week":470,"maker_shows":18,"maker_hidden":499,"reader_version":500,"card":501},"42838875","Podcatcher","An iOS Podcast Player with Racket","title","Show HN: I Made an iOS Podcast Player with Racket","https:\u002F\u002Fdefn.io\u002F2024\u002F11\u002F16\u002Fpodcatcher\u002F","defn.io","Bogdanp",1737968176,2025,226,85,273,3837,8,"notable","consumer_social","podcast player","mobile_app",[21,24,25,26,27],"ios podcast app","racket","podcast client","swift","debated",0.12,{"positive":31,"neutral":32,"mixed":33,"critical":34},12,17,0,10,39,{"idea":37,"execution":40,"design":43,"privacy":44,"performance":45,"docs":46},{"positive":38,"critical":39},3,1,{"positive":41,"critical":42},2,6,{"positive":38,"critical":33},{"positive":33,"critical":41},{"positive":33,"critical":39},{"positive":33,"critical":33},[48,33,38,39,38,38,48,33,48,38,48,39,39,48,39,38,38,38,33,33,48,48,48,38,33,33,39,48,33,33,38,33,38,38,39,48,38,39,48,38],5,null,{"problem":49,"audience":51,"pricing":63,"motivation":49,"time_to_build":49,"stack":71,"openness":108,"stage":109,"team_size":108},{"value":52,"source":53,"evidence":54},"Podcast listeners on iOS","inferred",[55,59],{"id":56,"by":57,"text":58},"42843872","baggachipz","This is great! I just switched over from Overcast. Very nice and simple interface, no clutter, and not a ton of unnecessary features. Love it.",{"id":60,"by":61,"text":62},"42842676","freeplay","I don't know if this is a good place for feature requests, but the only thing keeping me from switching to this at at the moment is download settings per podcast. For example,…",{"value":64,"source":65,"evidence":66},"Free","commenter",[67],{"id":68,"by":69,"text":70},"42844075","sneak","> It's also free, has no ads or tracking, and it's local-first except for the podcast directory and sync. The app privacy label says it tracks diagnostics.",[72,82,86,92,96,102],{"value":73,"source":74,"evidence":75},"Racket","maker",[76,79],{"id":77,"by":11,"text":78},"42842001","Sure! I have a whole library dedicated to integrating Racket and Swift and you can find some of the nitty-gritty details there[1]. The gist of it is: 1. You build Racket for iOS…",{"id":80,"by":11,"text":81},"42844530","That's right, the UI and the Audio Engine bits are in Swift, because it's easier to interface with those Frameworks directly from Swift (and not fight the platform). Everything…",{"value":83,"source":74,"evidence":84},"Swift",[85],{"id":80,"by":11,"text":81},{"value":87,"source":74,"evidence":88},"SQLite",[89],{"id":90,"by":11,"text":91},"42851892","No worries! I like talking about this stuff. Yes, the app uses Noise under the hood, and the way to think about it is a request-response model[1]. Swift makes an async request to…",{"value":93,"source":74,"evidence":94},"Noise (Racket-Swift RPC library)",[95],{"id":90,"by":11,"text":91},{"value":97,"source":74,"evidence":98},"Sentry",[99],{"id":100,"by":11,"text":101},"42844378","The app store labels are somewhat broad, but that refers to the error tracking that the app does. When an unhandled exception occurs in the app, that error is sent to Sentry.",{"value":103,"source":74,"evidence":104},"Chakra UI",[105],{"id":106,"by":11,"text":107},"42841810","Thanks! It's built with Chakra UI[1] so I can't take full credit for it. EDIT: Oh, I just realized you might be referring to my blog, in which case I _can_ take credit for that…","unknown","launched",{"praise":111,"objections":134,"requests":177,"questions":219,"alternatives":238},[112,123],{"value":113,"source":65,"evidence":114},"Good design of website and app",[115,119],{"id":116,"by":117,"text":118},"42841793","hoofedear","Just want to say, I love the design of your website!",{"id":120,"by":121,"text":122},"42844495","jonathanyc","The app looks really good! Based on the title I thought it’d be something you made most as a testbed for Racket so I was surprised to see the app itself actually looks great :D I…",{"value":124,"source":65,"evidence":125},"Interesting use of Racket",[126,130],{"id":127,"by":128,"text":129},"42843683","anonzzzies","Well done; will test and possibly switch. But, for me more importantly, using Racket for this is more really nice. Thanks for that.",{"id":131,"by":132,"text":133},"42844433","sghiassy","Racket has been on my bucket list of languages to learn. Seems really intriguing",[135,152,162,167],{"value":136,"source":65,"evidence":137},"Discover\u002Fsearch backend returns 502 errors and crashes",[138,142,146,149],{"id":139,"by":140,"text":141},"42846230","philsnow","I’m getting an error going to the Discover tab and also when hitting “search” after typing a search term (newlines added): ``` string::1: bytes->jsexpr: bad input starting…",{"id":143,"by":144,"text":145},"42848062","Humphrey","Doesn't work! Clicking discover just shows a messagebox with a stack trace[1] - so I have no way of adding a podcast to try out the app. [1] Error string::1: bytes->jsexpr: bad…",{"id":147,"by":11,"text":148},"42849307","A botched deploy that I didn't notice ended up crashing the server, which then failed to recover when the systemd unit tried to restart it (it couldn't bind the port and ran out…",{"id":150,"by":11,"text":151},"42849103","Sorry about that! Looks like the server got OOMKilled at one point and failed to recover. It should be back up now and I'll work on a fix.",{"value":153,"source":65,"evidence":154},"Subscribing is slow",[155,159],{"id":156,"by":157,"text":158},"42850048","Hadriel","feedback: it's slow (clicking on subscribe, etc)",{"id":160,"by":11,"text":161},"42850080","Thanks for the feedback. Subscribing in particular is slow, especially for podcasts with lots of episodes, because it tries to save all the episode metadata locally, to avoid…",{"value":163,"source":65,"evidence":164},"Privacy concern over diagnostics tracking",[165,166],{"id":68,"by":69,"text":70},{"id":100,"by":11,"text":101},{"value":168,"source":65,"evidence":169},"Private feeds not supported because server must fetch feed",[170,174],{"id":171,"by":172,"text":173},"42843970","jonathonlacher","Can it handle feeds that aren't available on the public internet? I have a personal feed that I can connect to over TailScale. But I've found that most podcast clients have a…",{"id":175,"by":11,"text":176},"42844366","Yup, unfortunately Podcatcher works the same way and that explains why you'd be getting that error, since the server can't access your feed. That's certainly something that it…",[178,185,195,205,212],{"value":179,"source":65,"evidence":180},"Per-podcast download settings",[181,182],{"id":60,"by":61,"text":62},{"id":183,"by":11,"text":184},"42842716","Thanks! That makes a lot of sense. It actually only downloads at most 2 episodes per podcast at a time, but that's still not great for your use case. I do plan to add per-podcast…",{"value":186,"source":65,"evidence":187},"Compress voices \u002F volume normalization feature",[188,192],{"id":189,"by":190,"text":191},"42849345","strunz","\"Boost voices\" is a cool feature a lot of apps have, but what is really needed is a \"compress voices\" feature. So many podcasters speak loudly 75% of the time, but then trail off…",{"id":193,"by":11,"text":194},"42849542","That's a great point! Shouldn't be hard to add.",{"value":196,"source":65,"evidence":197},"CarPlay support",[198,202],{"id":199,"by":200,"text":201},"42842946","criddell","Does it work with CarPlay?",{"id":203,"by":11,"text":204},"42843457","Not yet, but it's on the list!",{"value":206,"source":65,"evidence":207},"Regex title filtering for downloads",[208],{"id":209,"by":210,"text":211},"42845332","KristijanM13","I support a number of podcast creators on Patreon, and apparently they’ll (at some stage) allow creators to have multiple RSS feeds. Until then, I’d love to be able to regex…",{"value":213,"source":65,"evidence":214},"Podcast 2.0 features like boosts and streaming sats",[215],{"id":216,"by":217,"text":218},"42844597","astound473","Any plans to implement podcast 2.0 features like boosts or sat streaming?",[220,227,234],{"value":221,"source":65,"evidence":222},"How Racket runs on iOS",[223],{"id":224,"by":225,"text":226},"42841905","oidar","For those of unfamiliar with Racket, could you go over what it takes to run a Racket app on iOS?",{"value":228,"source":65,"evidence":229},"Whether the app uses native APIs for networking and performance",[230],{"id":231,"by":232,"text":233},"42849576","jbhoot","> Database management > syncing with the backend server Do features like these, when implemented in Racket, consume more resources (battery, CPU, etc.) than if they were…",{"value":235,"source":65,"evidence":236},"Whether feeds not on the public internet are supported",[237],{"id":171,"by":172,"text":173},[239,247,251,258,265],{"value":240,"source":65,"evidence":241},"Overcast",[242,246],{"id":243,"by":244,"text":245},"42848112","mplewis","You don't need two apps – Overcast does all of this.",{"id":56,"by":57,"text":58},{"value":248,"source":65,"evidence":249},"Pocket Casts",[250],{"id":209,"by":210,"text":211},{"value":252,"source":65,"evidence":253},"Apple Podcasts",[254],{"id":255,"by":256,"text":257},"42844099","nashashmi","I did not use this app yet, but I want to share my issue with the current native podcast player in iOS. Some podcasts are news related and require hearing the latest episode.…",{"value":259,"source":65,"evidence":260},"Castamatic",[261],{"id":262,"by":263,"text":264},"42850164","teekert","Yeah, based on Bitcoin lightning (which is quite different from normal bitcoin) meaning no transaction costs and very low energy use. Basically it happens off-chain until someone…",{"value":266,"source":65,"evidence":267},"Fountain",[268],{"id":262,"by":263,"text":264},{"comments":270,"answered":271,"key":272},20,11,[273,274,275],{"id":183,"text":184},{"id":193,"text":194},{"id":77,"text":78},{"commenters":277,"max_depth":278,"maker_replies":270,"first_comment_mins":279,"lifespan_hours":280},43,9,365,205,[282,284,286,290,294,298,300,301,303,305,308,310,311,315,318,321,324,326,329,331,334,337,339,341,343,345,347,350,352,353,354,355,357,360,362,363,365,367,369,372,373,374,377,379,382,384,386,389,391,393,394,396,397,401,405,408,411,414,418,422,424,426,429,433,435,437,441,443,444,446,448,449,452,453,458,462,465],[60,33,48,283,61,33],"project\u002Fpositive\u002Fidea",[183,33,33,285,11,39],"maker\u002Fneutral\u002Fidea",[287,33,33,288,289,33],"42842844","commenter\u002Fneutral\u002Fnone","pvg",[291,33,38,292,293,33],"42844701","project\u002Fneutral\u002Fidea","petercooper",[295,33,33,296,297,33],"42844865","other\u002Fneutral\u002Fidea","newsclues",[243,33,39,299,244,33],"project\u002Fcritical\u002Fidea",[189,39,38,292,190,33],[193,39,33,302,11,39],"maker\u002Fpositive\u002Fidea",[224,41,38,304,225,33],"maker\u002Fneutral\u002Fexecution",[306,41,38,304,307,33],"42841969","the-chitmonger",[77,41,33,309,11,39],"project\u002Fneutral\u002Fexecution",[209,38,48,283,210,33],[312,38,33,313,314,33],"42845367","other\u002Fneutral\u002Fnone","hbn",[316,38,33,313,317,33],"42845451","tao_oat",[319,38,33,313,320,33],"42847380","Graziano_M",[116,322,48,323,117,33],4,"project\u002Fpositive\u002Fdesign",[106,322,33,325,11,39],"maker\u002Fneutral\u002Fdesign",[327,322,38,325,328,33],"42841901","ashton314",[330,322,33,325,11,39],"42842032",[332,322,48,333,328,33],"42939426","maker\u002Fpositive\u002Fdesign",[335,322,38,325,336,33],"42842971","fandorin",[338,322,33,325,11,39],"42843449",[68,48,39,340,69,33],"project\u002Fcritical\u002Fprivacy",[100,48,33,342,11,39],"project\u002Fneutral\u002Fprivacy",[344,48,39,340,69,33],"42848454",[127,42,48,346,128,33],"project\u002Fpositive\u002Fnone",[139,348,39,349,140,33],7,"project\u002Fcritical\u002Fexecution",[351,348,39,349,140,33],"42846267",[147,348,33,309,11,39],[120,18,38,304,121,33],[80,18,33,309,11,39],[231,18,38,356,232,33],"maker\u002Fneutral\u002Fperformance",[358,18,33,359,11,39],"42849609","project\u002Fneutral\u002Fperformance",[361,18,38,356,232,33],"42851033",[90,18,33,359,11,39],[364,18,33,313,232,33],"42854419",[366,18,33,356,11,39],"42854766",[368,18,33,288,232,33],"42863022",[370,18,48,371,121,33],"42859169","maker\u002Fpositive\u002Fexecution",[131,278,33,313,132,33],[56,34,48,323,57,33],[375,271,38,292,376,33],"42842953","adlpz",[378,271,33,285,11,39],"42843078",[380,31,48,346,381,33],"42842977","wuliwong",[216,383,38,285,217,33],13,[385,383,33,313,263,33],"42846366",[387,383,33,313,388,33],"42847345","cheaprentalyeti",[390,383,33,313,217,33],"42847548",[392,383,33,313,388,33],"42849090",[262,383,33,313,263,33],[171,395,39,349,172,33],14,[175,395,33,309,11,39],[398,399,48,346,400,33],"42842492",15,"giuliomagnifico",[402,403,33,313,404,33],"42842757",16,"mixmastamyk",[406,403,33,407,11,39],"42842805","project\u002Fneutral\u002Fnone",[409,403,33,313,410,33],"42843992","willemlaurentz",[412,32,33,313,413,33],"42843418","wenbin",[415,416,38,407,417,33],"42849699",18,"andro_dev",[419,420,38,421,314,33],"42842491",19,"maker\u002Fneutral\u002Fnone",[423,420,33,421,11,39],"42842506",[425,420,33,313,314,33],"42842983",[427,270,48,283,428,33],"42847898","oulipo",[430,431,39,349,432,33],"42844608",21,"mszyndel",[434,431,33,304,11,39],"42844679",[436,431,38,309,432,33],"42857245",[438,439,39,349,440,33],"42848143",22,"madhacker",[143,442,39,349,144,33],23,[150,442,33,304,11,39],[445,442,48,371,144,33],"42925028",[199,447,38,292,200,33],24,[203,447,33,285,11,39],[156,450,39,451,157,33],25,"project\u002Fcritical\u002Fperformance",[160,450,33,356,11,39],[454,455,48,456,457,33],"42844898",26,"maker\u002Fpositive\u002Fnone","sortatired",[459,460,38,461,157,33],"42850029",27,"project\u002Fneutral\u002Fdocs",[255,463,38,464,256,33],28,"project\u002Fneutral\u002Fdesign",[466,463,33,467,468,33],"42844392","commenter\u002Fneutral\u002Fdesign","Svoka",[],[471,476,480,485,489,494],{"id":472,"name":473,"points":474,"category":475},"42814110","Cs16.css",819,"dev_tools",{"id":477,"name":478,"points":479,"category":20},"42800893","t4t",484,{"id":481,"name":482,"points":483,"category":484},"42834648","DeepSeek My User Agent",360,"ai",{"id":486,"name":487,"points":488,"category":475},"42817439","Lightpanda",319,{"id":490,"name":491,"points":492,"category":493},"42828833","Bagels",283,"productivity",{"id":495,"name":496,"points":497,"category":498},"42806616","video-starter-kit",268,"creative",false,"v2",{"id":502,"name":5,"line":6,"ai":499,"cat":20,"year":13,"points":14,"comments":15,"rec":28,"s":29,"top":18,"kw":503,"maker":11,"domain":10,"tier":19,"attempts":33,"strip":504,"url":9,"mix":505,"praise":113,"objection":136,"sub":21},42838875,[21,24,25,26,27],"5031335053511513330055530015003033153153",[31,32,33,34],1793991111685]