Inspiration

I'm a coffee nerd: grinder, espresso machine, the whole setup. I switch between beans constantly, and every bag needs a completely different grind. Whenever I came back to a favourite after trying something new, I'd burn through a chunk of it re-dialling. So I built a tool for myself that remembers what worked for each bag.

Then I kept scrolling Instagram, where people show off their machines, their gear, their shelves of beautifully designed coffee bags. That gave me the real idea: what if your collection lived in the app as 3D copies of the bags you actually own? A utility became something with personality, a shelf you're proud of, made for that enthusiast niche.

What it does

Photograph a bag and beans reads the label and fills in the details. You log the dose, grind (on your grinder's own scale), yield and time that worked. Tap "Make it 3D" and the bag joins your shelf as a model; tap it and it lifts off the shelf into its detail view.

How I built it

  • Native SwiftUI + SwiftData, iOS 27. No account; your bags and shots live on the phone.
  • Reading the bag, three layers. Vision and Apple's on-device Foundation Models read the label. When they leave gaps, Apple's Private Cloud Compute takes a second pass. A web-research step, running through my own Cloudflare Worker so no API key ever sits in the app, fills in what the label doesn't say.
  • 3D. Vision cuts the bag out, the Worker sends it to Meshy, and the mesh is fitted, sized from the printed net weight and lit by one rig so every bag sits in the same room.
  • RevenueCat runs the money. A one-time unlock, render packs as a virtual currency, a per-person 48-hour launch offer, and offer codes for judges. The Worker reads the RevenueCat balance before every generation and refuses at zero.

Challenges

3D generation. Three generations of the same bag from the same photo gave me two upright bags and one lying on its face. Sending the cutout instead of the whole photo fixed it. Then the size: 91MB per bag without a polygon budget, about 6MB with one.

Pricing. My audience will spend £50 on a piece of gear without blinking, but hates the idea of another £4 subscription. Yet each 3D render costs me real money (roughly 30–55p). So you pay once for the app and per render for 3D: price follows cost, and nobody pays monthly.

Reading the bag. Nobody should type anything by hand, and you might learn something about the coffee you bought, so the three layers above had to fill the form correctly on their own.

What I learned

  • How to put Apple's on-device Vision and Foundation Models to work, and how to back them with a web-research step and test that properly.
  • A monetization model that was new to me, a one-time unlock plus consumable packs on a virtual currency, which RevenueCat supports.
  • The bugs that hurt were the silent ones. At one point the sample shelf drew nine photographs instead of 3D models, with no error and every test green. I now check the built app, not the setting.
  • Remove variables before you pay for a generation.

What's next

I built beans in the evenings over three weeks, around a day job, so it lands close to the deadline and launch week is where the real work starts. I already post coffee videos on my own Instagram, so I'm starting with the audience I know: enthusiasts who show off their gear and their shelves of bags. I'll add the Layers SDK in an update and use Layers to run the first campaign and see where installs come from, next to RevenueCat's numbers. After that: I'll listen, for feedback. I want beans to be the go-to tool for dialling in a perfect espresso, and the place to collect your most beautifully designed coffee bags. App got some traction on Threads amongst coffee enthusiasts, more than 500 likes across two posts, 103 people signed up for the waiting list. im planning to reach out to small coffee reels creators to tap into the niche that create content for my go to customer. one guy who owns a coffee shop reached out to see if they can use it amongst his stuff.

Built With

Share this project:

Updates

Submission history