8 ms·
Show HN: I Made an iOS Podcast Player with Racket
- wuliwong 2y agoI 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!
- Hadriel 2y agofeedback: it's slow (clicking on subscribe, etc)
- Bogdanp 2y agoThanks 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 roundtripping later. So, it’s slow initially so it can be fast later and work offline, but I understand how that can be annoying!
- hoofedear 2y agoJust want to say, I love the design of your website!
- Bogdanp 2y agoThanks! 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/ https://www.chakra-ui.com/
- ashton314 2y agoIs that font Valkyrie on your blog?
- fandorin 2y agoyeah, really good looking page, congrats! btw - out of curiosity - what tool did you use to create app screenshots for AppStore?
- Bogdanp 2y agoThanks! 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 2y agoFor those of unfamiliar with Racket, could you go over what it takes to run a Racket app on iOS?
- the-chitmonger 2y agoI'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.html https://docs.racket-lang.org/inside/ios-cross-compilation.ht...
- Bogdanp 2y agoSure! 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 https://github.com/Bogdanp/Noise?tab=readme-ov-file#usage [2]: https://docs.racket-lang.org/inside/cs.html https://docs.racket-lang.org/inside/cs.html [3]: https://www.youtube.com/watch?v=aTvU0j4hBR0 https://www.youtube.com/watch?v=aTvU0j4hBR0 [4]: https://github.com/Bogdanp/remember https://github.com/Bogdanp/remember [5]: https://github.com/Bogdanp/Franz https://github.com/Bogdanp/Franz
- hbn 2y agoLooks very nice. I see Windbreaker Podcast featured in those screenshots on the App Store listing. A Z̶e̶r̶o̶ ̶P̶u̶n̶c̶t̶u̶a̶t̶i̶o̶n̶ Fully Ramblomatic fan?
- giuliomagnifico 2y agoCool thanks! (I also realized I'm not the only one who loves listening to podcasts during the shower eheh)
- freeplay 2y agoI 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 2y agoThanks! 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 2y agoI 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.
- carlosjobim 2y ago[flagged]
- apitman 2y agoI 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 2y agoDemand 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.
- mixmastamyk 2y agoWhere 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 2y agoEvery podcast has its own RSS feed. As for the index, I use Podcast Index[1] and the iTunes API. [1]: https://podcastindex.org/ https://podcastindex.org/
- willemlaurentz 2y agoCheck out this, it might help you with downloading podcasts to the filesystem: https://news.ycombinator.com/item?id=42841416 https://news.ycombinator.com/item?id=42841416
- criddell 2y agoDoes it work with CarPlay?
- Bogdanp 2y agoNot yet, but it's on the list!
- adlpz 2y agoLooks 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 2y agoNoted! 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.
- wenbin 2y agoGood job! If you need episode search, check out PodcastAPI.com
- anonzzzies 2y agoWell done; will test and possibly switch. But, for me more importantly, using Racket for this is more really nice. Thanks for that.
- baggachipz 2y agoThis 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 2y agoCan 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 2y agoYup, 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 2y ago> 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 2y agoThe 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 2y agoYeah, 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.
- nashashmi 2y agoI 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 2y agoNative iOS podcast player allows to customize per-podcast episode order (newest first/oldest first) I guess playback speed is a global playback property though.
- deleted 2y ago[deleted]
- sghiassy 2y agoRacket has been on my bucket list of languages to learn. Seems really intriguing
- jonathanyc 2y agoThe 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 2y agoThat'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 2y ago> 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 2y agoUltimately, 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.
- astound473 2y agoAny plans to implement podcast 2.0 features like boosts or sat streaming?
- teekert 2y agoI streams sats to creators but also to the podcast app. I wonder what an app like Castamatic or Podverse or Fountain makes…
- cheaprentalyeti 2y agoSats?
- astound473 2y agosatoshis, derivative of bitcoin I think? I have a poor understanding of it. Essentially it's a way to pay podcast producers directly. Streaming means it sends whatever you set per minute so you auto-support podcasts. Boosts are short messages with dollar values tied to it. The show has to support this though, not all podcasts do.
- cheaprentalyeti 2y agoSo it's a podcast client with cryptocurrency wallet functionality?
- teekert 2y agoYeah, 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 syncs-up (then it becomes a btc transaction). It makes payments in fractions of cents possible, ie I stream 10 sats/min which is about 60 Eur cent per minute (so 1 cent per second). You can also send messages to creators and attach amounts (those are called boosts), so you'd send a short message and attach 10k sats (or whatever you want), which is about 10 euros/dollars. Some podcasts I listen to use this to read messages on the show (the highest ones). It's fun and casual but remains highly technical for now, https://getalby.com/ https://getalby.com/ takes away some friction (but you're still self hosing a lightning wallet using docker compose). Easiest I think is Fountain [0, 1], which has it all built in. But I never tried that, I use Castamatic [2] with Alby. I have to say, it seems to divide the Linux podcast world a bit with some shows embracing this, and some just calling it crypto-bs. A well, people seem to enjoy it and creators get real value, enough to have to rely less on ads even. I think this is one of the babies we'd throw out if we banned crypto currencies (which I agree are 99.999% bs). [0] https://apps.apple.com/us/app/fountain-podcast-player/id1576394424 https://apps.apple.com/us/app/fountain-podcast-player/id1576... [1] https://play.google.com/store/apps/details?id=fm.fountain.apps&hl=en-US https://play.google.com/store/apps/details?id=fm.fountain.ap... [2] https://apps.apple.com/us/app/castamatic-podcast-player/id966632553 https://apps.apple.com/us/app/castamatic-podcast-player/id96...
- mszyndel 2y agoBug report: go to Discover, serach for Mike Duncan, tap on Revolutions, exception pops up
- sortatired 2y agokudos well done! looks really cool
- Mykyta_Tsiatsko 2y ago[dead]
- KristijanM13 2y agoI 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 2y ago> 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 2y agoI 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/ https://siftrss.com/
- Graziano_M 2y agoWow! 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!
- Ivan_gor 2y ago[dead]
- philsnow 2y agoI’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 2y agoWent 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.
- Bogdanp 2y agoA 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.
- oulipo 2y agoReally cool! Now if you can make an osX version, and also add the radios like "Receiver Radio" it would be perfect :)
- Humphrey 2y agoDoesn'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 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
- madhacker 2y agoNot usable at all on iOS 18.2. Error popup when try to add any podcast.
- strunz 2y ago"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 2y agoThat's a great point! Shouldn't be hard to add.
- andro_dev 2y agoFour things that matter to me in a podcast app - Privacy - OPML support - Ability to import from Apple Podcast - Dark theme
- Hadriel 2y agoi cant download it? cant find it
- Fsouth 2y ago[dead]