While cooking, I found that most of the apps already out there that focused on meal planning and recipe/shopping list management didn't quite work out how I wanted them to. Some would only work on limited devices, or bombarded me with pointless social features, or they didn't allow importing external recipes, didn't include shopping list functionality, didn't scale recipes or convert measurements between metric/imperial, or they locked key features behind subscriptions.
So I built Tasty Bites in my (now ample) free time.
Tech used:
- Symfony/Api-Platform in the backend. Not glamorous, but I'd worked with it before and knew it could get the job done.
- Angular with bootstrap in the frontend. Angular is nice and the built in PWA/SW features are top notch. About half way through I wished I had used Tailwind instead of bootstrap.
- Deployed to a medium ec2 instance and RDS postgres db. RDS in particular is quite expensive, but the free tier and AWS credits help. I used GitHub Actions to build the CI/CD pipeline.
- The app is available as an installable PWA that should work on any device (albeit with some issues on ios 17 due to some issues in webkit (https://github.com/angular/angular/issues/50378) I've also deployed to the Microsoft Store and Play Store using the bundlers from PWAbuilder (https://www.pwabuilder.com/) which was a surprisingly easy experience. Building an ios app from the PWA is the next step, PWABuilder offers a bundler but the process looks a lot more involved and the approval process seems to be a bit hit and miss for packaged PWA's. (If anyone has any insight here, it would be much appreciated)
Things to improve:
- The recipe scraper is about 80-90% okay, but could be improved. I think a LLM based approach could yield better results, albeit at a higher price point.
- Integration with grocery shops is limited to Woolworths (Australia, where I'm based). It's a shame that most grocery suppliers don't provide an API for converting a shopping list to a cart.
- The interface is still a little clunky in places.