Thursday 16 Oct 2025
Croissant v0.4 is out! I fixed a few minor bugs and added favicons.
Feature Requests
I’ve had a surprising amount of feedback. I wasn’t expecting anyone to care about an app I designed for myself. Thanks to all who managed to navigate my contact form.
Croissant’s design philosophy is vague because I’m just making it up as I go along. Essentially it’s an experiment in keeping it simple. Not “MVP” because MVP is nonsense — and not “minimalism” because that does not mean good. Croissant is just basic and unbloated.
The three most requested f…
Thursday 16 Oct 2025
Croissant v0.4 is out! I fixed a few minor bugs and added favicons.
Feature Requests
I’ve had a surprising amount of feedback. I wasn’t expecting anyone to care about an app I designed for myself. Thanks to all who managed to navigate my contact form.
Croissant’s design philosophy is vague because I’m just making it up as I go along. Essentially it’s an experiment in keeping it simple. Not “MVP” because MVP is nonsense — and not “minimalism” because that does not mean good. Croissant is just basic and unbloated.
The three most requested features have been:
- Favicons
- Bookmarks
- Folders
Folders is never going to happen, sorry! That would literally double the codebase for a feature I’d never use myself but have to maintain.
Bookmarks is possible. Croissant is just a reader not an organisation tool but I see the value of “read later”. Not sure how this will work yet. I do not want to build a bookmark manager.
Favicons has happened! When I declared “no icons” I was talking about the craze of UI icons everywhere. Icons without labels! Meaningless béziers from self-important designers that leave the rest of us saying “WTF does this button do?”
Favicons actually serve a purpose and improve the design.
![]()
Favicons highlight the author and are easy to scan.
Favicons are a simple feature but were not easy to implement.
Tauri Troubles
Tauri is causing me headaches. I’m starting to rethink if I should continue the native app wrapper or focus solely on the PWA.
The web platform always wins. How many cautionary tales must I read before I accept the truth! Why am I wasting time debugging Tauri and Apple’s webview for issues that don’t even exist in Safari? Wasted time and energy. I’m accruing non-transferable knowledge in my (very) limited brain capacity.
Croissant v0.4 might be the last native macOS version. It only exists because the PWA requires a server proxy (CORS) that has privacy concerns. Maybe I can add a “bring your own proxy” feature?
Where’s the Icon?
Podcast feeds include an image tag but basic RSS does not. There are standardised ways to provide an image/icon with <link rel="icon"> and web manifests. These both require parsing the website’s HTML to discover.
I’m relying on “known” root locations; namely:
/apple-touch-icon.png/favicon.ico
These locations aren’t required for either icon but browsers check there by default so it’s a good place to guess. For the 200-ish blogs I subscribe to I get a ~65% success rate. Not ideal but good enough for now. I really want to avoid HTML spelunking but I may have to. Expect an improvement in the next update. For now a croissant emoji is used for missing icons.
Implementation Details
I’m using the Offscreen Canvas API to generate a standard image size to cache locally. Favicons are currently cached for a week before refreshing.
First I tried using a service worker to cache. Tauri was not happy. Second I tried using OPFS with the File System API. Tauri was not happy. I dumped Base64 into local storage and Tauri was OK with that but I wasn’t because that’s horrible. Finally I went back to IndexedDB which is perfectly happy storing binary blobs.
So you can see why Tauri is on thin ice! I don’t want tech choices dictating what parts of the web platform I can use without jumping through non-standard hurdles.
That’s all for now. I hope to have another update this year! Visit CroissantRSS.com to download or install Croissant as a progressive web app.
Oh yeah… and I kinda messed up deployment of the PWA service worker so you may need to backup, remove, and reinstall… sorry!