Show HN: I Made an iOS Podcast Player with Racket
90 comments
·January 27, 2025freeplay
pvg
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.
Bogdanp
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!
petercooper
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
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.
mplewis
You don't need two apps – Overcast does all of this.
carlosjobim
[flagged]
apitman
I don't see anything being demanded. I have several open source projects used by other people. I don't implement every requested feature, but requests are a great way to get ideas I might never have had on my own.
If a developer wants money for every feature, they're free to use a commercial license and accept the tradeoffs.
carlosjobim
Demand or request – what gives somebody the right to make a request without offering anything in return? Most people here wouldn't walk around in the street asking strangers for a handout, or ask for free stuff in shops and restaurants. So why is it okay to make these requests without offering even token compensation?
I have made feature requests from open source project, and always with a monetary offer attached. If everybody who wants a feature pitches in a little, then the creator will be compensated fairly if he chooses to implement that feature.
bowsamic
It was a suggestion, not a demand or request
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 randomly or almost whisper. Then you turn it up and they're projecting loudly again and blow your ears out. It's especially annoying in the car trying to compete with road noise.
Bogdanp
That's a great point! Shouldn't be hard to add.
oidar
For those of unfamiliar with Racket, could you go over what it takes to run a Racket app on iOS?
Bogdanp
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
the-chitmonger
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...
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 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
> 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.
Graziano_M
Wow! I have searched for the feature in the settings so many times after losing my spot in a long podcast. Thank you for pointing that out!
tao_oat
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/
hoofedear
Just want to say, I love the design of your website!
Bogdanp
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!
fandorin
yeah, really good looking page, congrats! btw - out of curiosity - what tool did you use to create app screenshots for AppStore?
Bogdanp
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).
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.
Bogdanp
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.
sneak
Yeah, that is plainly not “no tracking”. Developers are not entitled to the events that occur on devices that belong to me unless they obtain my permission for such surveillance first.
I will never understand why developers believe that they are entitled to information from devices that they do not own.
anonzzzies
Well done; will test and possibly switch. But, for me more importantly, using Racket for this is more really nice. Thanks for that.
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 #"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
Bogdanp
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 of retries quickly) overnight, so that's why that was failing. It's back up now and I'll put a fix in today.
philsnow
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.
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 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
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.
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 implemented using the native API equivalents (e.g., NSURLSession or whichever is more applicable)?
In the larger context of cross-platform apps with a common core written in a non-native programming stack, I often wonder this about network and disk I/O management. I understand using the native APIs for other "I/O" like UI, hardware interfaces (bluetooth, accelerometer, etc.), because they often don't have an equivalent API in the programming stack used to implement the common core.
As far as I know, Capacitor wraps over the native APIs.
Bogdanp
Ultimately, you end up calling some system API for I/O, so the only difference is how efficient the implementations of those Frameworks are compared to the embedded language's implementations. On iOS, embedding Racket requires using an interpreted mode (as opposed to Racket's usual native compilation mode), so there is a small hit, but it's not one that is really noticeable in battery or CPU consumption. In fact, Podcatcher seems to do better in battery consumption compared to the competition in my (and my friend's) testing, but I would guess that's not necessarily _because_ of Racket; it probably has more to do with how the system as a whole pays attention to perf.
jonathanyc
Thanks for the reply! That makes a lot of sense.
sghiassy
Racket has been on my bucket list of languages to learn. Seems really intriguing
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.
adlpz
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
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.
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!