[HN Gopher] Show HN: I Made an iOS Podcast Player with Racket
       ___________________________________________________________________
        
       Show HN: I Made an iOS Podcast Player with Racket
        
       Author : Bogdanp
       Score  : 162 points
       Date   : 2025-01-27 08:56 UTC (14 hours ago)
        
 (HTM) web link (defn.io)
 (TXT) w3m dump (defn.io)
        
       | hoofedear wrote:
       | Just want to say, I love the design of your website!
        
         | Bogdanp wrote:
         | 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 :P. Thanks again!
         | 
         | [1]: https://www.chakra-ui.com/
        
           | ashton314 wrote:
           | Is that font Valkyrie on your blog?
        
             | Bogdanp wrote:
             | Yep, it's one of Matthew Butterick's fonts[1].
             | 
             | [1]: https://mbtype.com/fonts/valkyrie/
        
           | fandorin wrote:
           | yeah, really good looking page, congrats! btw - out of
           | curiosity - what tool did you use to create app screenshots
           | for AppStore?
        
             | Bogdanp wrote:
             | Thanks! I used Pixelmator Pro to put the images together. I
             | just made one long image that I cropped at the end into the
             | screenshots you see on the App Store. For the iPhone
             | templates, I think I exported a template from Sketch, but I
             | later found out that Pixelmator also has them (you can find
             | them under the Mockups category in the New dialog).
        
       | oidar wrote:
       | For those of unfamiliar with Racket, could you go over what it
       | takes to run a Racket app on iOS?
        
         | the-chitmonger wrote:
         | I'd love to know as well - I found some documentation on the
         | Racket site, but I'm not entirely sure what I'm looking at
         | here.
         | 
         | https://docs.racket-lang.org/inside/ios-cross-compilation.ht...
        
         | Bogdanp wrote:
         | 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 in an interpreted mode (regular
         | Racket works a bit like a JIT in that it needs to load code
         | into memory at runtime, which is a no-go on iOS)
         | 
         | 2. You link to it as a regular static library.
         | 
         | 3. You call Racket's C API[2] to load and run Racket code.
         | 
         | Here's[3] a somewhat outdated video I did a while back on using
         | that library for Mac app development. Many of the things in
         | this video are now much simpler/more straightforward, but maybe
         | it serves to give you an idea. I also have some source-
         | available Mac apps built this way that you can take a look
         | at[4, 5].
         | 
         | [1]: https://github.com/Bogdanp/Noise?tab=readme-ov-file#usage
         | 
         | [2]: https://docs.racket-lang.org/inside/cs.html
         | 
         | [3]: https://www.youtube.com/watch?v=aTvU0j4hBR0
         | 
         | [4]: https://github.com/Bogdanp/remember
         | 
         | [5]: https://github.com/Bogdanp/Franz
        
       | hbn wrote:
       | Looks very nice.
       | 
       | I see Windbreaker Podcast featured in those screenshots on the
       | App Store listing. A Zero Punctuation Fully Ramblomatic fan?
        
         | Bogdanp wrote:
         | Yep!
        
           | hbn wrote:
           | Yahtzee is one of my favorite writers. I need to get back
           | into the last couple books of his I haven't read.
        
       | giuliomagnifico wrote:
       | Cool thanks! (I also realized I'm not the only one who loves
       | listening to podcasts during the shower eheh)
        
       | freeplay wrote:
       | 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, some podcasts I don't want to miss an episode and I
       | want them all downloaded. Other podcasts I only check in on
       | occasionally and would only want the latest episode to be kept on
       | device.
       | 
       | I subscribe to a lot of podcast and downloading and keeping every
       | episode is going to eat up a lot of storage.
       | 
       | Besides that, love the simplicity of it. Well done!
        
         | Bogdanp wrote:
         | 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 settings
         | in probably the release after next, so stay tuned for that!
        
         | pvg wrote:
         | _I don 't know if this is a good place for feature requests_
         | 
         | If you've checked out the thing being showhn enough to have a
         | feature request, you're doing Show HN right.
        
         | petercooper wrote:
         | I have the same requirements but started to think these use
         | cases might be different enough to warrant different apps. So
         | I've gradually shifted to those "don't miss" ones in a
         | dedicated podcast app and the occasional ones to Spotify. Could
         | probably do with another app for the tiny daily ones too..
        
           | newsclues wrote:
           | I've considered the multiple apps to manage content
           | consumption but it's such an inelegant solution I've been
           | unwilling to try it.
           | 
           | I want to be able to categorize content. I want a category of
           | podcast to work to, work out to, go to sleep to, or to simply
           | sit a learn. I want different categories of music. I want to
           | be able to set a group of content on YouTube that I will
           | watch everything on, and one that I can sort through and pick
           | the few videos I want to watch.
           | 
           | Given the value of that data in just my sorting and
           | prioritizing of content, I don't know why I don't have the
           | tools so that data can be harvested and sold.
           | 
           | I think it will lead to better content.
        
       | mixmastamyk wrote:
       | Where does one learn how to interface with the podcast
       | directories? Who provides free downloads? I had heard something
       | about rss at one point.
       | 
       | Couldn't find a good app for phosh and was thinking of writing
       | one.
        
         | Bogdanp wrote:
         | Every podcast has its own RSS feed. As for the index, I use
         | Podcast Index[1] and the iTunes API.
         | 
         | [1]: https://podcastindex.org/
        
         | willemlaurentz wrote:
         | Check out this, it might help you with downloading podcasts to
         | the filesystem: https://news.ycombinator.com/item?id=42841416
        
       | criddell wrote:
       | Does it work with CarPlay?
        
         | Bogdanp wrote:
         | Not yet, but it's on the list!
        
       | adlpz wrote:
       | Looks cool! If I may, a couple of feature suggestions:
       | 
       | 1. You mentioned it already but bookmarks. In particular
       | bookmarks that can be added through iOS Shortcuts (so we can each
       | build whatever crazy automation we need) and that can be exported
       | (so we can keep LARPing productivity in our Obsidian vaults).
       | 
       | 2. An "undo" function, somehow. I know this is weird but I've
       | misclicked the seek bar so many times (esp. in the lock screen)
       | and lost where I was... a solution for that would be so cool.
       | 
       | I've been using the same podcasts app for... well over 10 years.
       | But yours looks really cool, I may just switch.
        
         | Bogdanp wrote:
         | Noted! There is already an undo function, though. If you seek,
         | an undo button pops up. Also, if you go to settings, there's a
         | "History" view where you can also undo from.
        
       | wuliwong wrote:
       | I will definitely check it out. I've never done iOS development
       | but I have been considering doing this very thing as a way to
       | learn and to give myself the podcast player I really want. :)
       | Good luck!
        
       | wenbin wrote:
       | Good job! If you need episode search, check out PodcastAPI.com
        
       | anonzzzies wrote:
       | Well done; will test and possibly switch. But, for me more
       | importantly, using Racket for this is more really nice. Thanks
       | for that.
        
       | baggachipz wrote:
       | 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.
        
       | jonathonlacher wrote:
       | 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 server-side
       | component, which means their backend server must be able to
       | access the feed.
       | 
       | I tried adding my private feed to Podcatcher and am getting
       | "Server Error (500)".
        
         | Bogdanp wrote:
         | 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
         | could support though, but you would obviously not get any push
         | notifications for that feed.
        
       | sneak wrote:
       | > _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.
        
         | Bogdanp wrote:
         | 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.
        
       | nashashmi wrote:
       | 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. Other podcasts are more serial like history narrations
       | and require hearing the series in the order it appears. Download
       | options should be reflective of these two functions. And "play
       | next" should also be reflective of these two functions.
       | 
       | Some podcasts have fast speakers and need to be slowed down.
       | Other podcasts have slow speakers and need to be sped up. The
       | speed setting should be saved per podcast.
       | 
       | New View: A play next queue list should be present. Swipe right
       | to play. Swipe left for other options
       | 
       | Condensed View: Upon expanding an episode, swipe left to see
       | other episodes in the list ordered by date based on preference.
       | Scroll down to see options for the episode. Scroll up to see
       | other episodes in Queue.
        
         | Svoka wrote:
         | Native iOS podcast player allows to customize per-podcast
         | episode order (newest first/oldest first) I guess playback
         | speed is a global playback property though.
        
       | sghiassy wrote:
       | Racket has been on my bucket list of languages to learn. Seems
       | really intriguing
        
       | jonathanyc wrote:
       | 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 tried looking through your blog but couldn't find anything
       | except the 40 minute YouTube video for your other app. It sounds
       | like both the UI and the audio-related code are in Swift? What
       | code ends up actually being in Racket then?
        
         | Bogdanp wrote:
         | 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 else (the
         | Database management & the models, the download manager, ID3
         | parsing, parsing release notes, syncing with the backend
         | server, etc.) is implemented in Racket and is portable.
        
       | astound473 wrote:
       | Any plans to implement podcast 2.0 features like boosts or sat
       | streaming?
        
         | teekert wrote:
         | I streams sats to creators but also to the podcast app. I
         | wonder what an app like Castamatic or Podverse or Fountain
         | makes...
        
       | mszyndel wrote:
       | Bug report: go to Discover, serach for Mike Duncan, tap on
       | Revolutions, exception pops up
        
         | Bogdanp wrote:
         | Thanks! I'm not able to reproduce this on my end, but if you
         | send me the exception (here or via e-mail), I'd be happy to
         | take another look!
        
       | sortatired wrote:
       | kudos well done! looks really cool
        
       | KristijanM13 wrote:
       | 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 match on titles
       | for download. This one creator I follow has about 6-7 different
       | shows on the same feed, but I only listen to 2 of them.
       | 
       | I've been a Pocket Casts users since I can remember. I'll +1 the
       | CarPlay support that you mention was already on your list. The
       | other, which they've recently introduced, is to disable Lock
       | Screen scrubbing. Been a life saver!
       | 
       | Looks great though! I'll keep an eye on the change long as it
       | evolves.
        
         | hbn wrote:
         | > The other, which they've recently introduced, is to disable
         | Lock Screen scrubbing
         | 
         | I was so happy I happened to read through their recent
         | changelog and caught that. WAY too many times I accidentally
         | swiped along the scrub bar and put myself at a random place in
         | a 4 hour podcast episode and had to spend 5 minutes trying to
         | figure out where I was.
        
         | tao_oat wrote:
         | I have the same problem with Patreon feeds -- I use
         | [siftrss][1] to manage this for now. Though it's slightly
         | hacky, it works!
         | 
         | [1]: https://siftrss.com/
        
       | philsnow wrote:
       | 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 #"error code:
       | 502" context..:        .../syntax/readerr.rkt:15:2: -raise- read-
       | error        .../private/arrow-val-first.rkt:486:18
       | .../private/backend.rkt:45:9: get-trending-podcasts
       | .../noise-serde-lib/backend.rkt:69:22
        
         | philsnow wrote:
         | Went looking for the source, but when following a link to
         | podcatcher.net, Cloudflare is saying the podcatcher.net backend
         | is "502 Bad Gateway"ing.
         | 
         |  _edit: oh right,
         | 
         | > I am still debating whether or not I want to make the app
         | itself source available, like I've done for Franz and Remember.
         | Maybe if there's interest._
        
       ___________________________________________________________________
       (page generated 2025-01-27 23:00 UTC)