Fumera

  • Flutter
  • NestJS
  • PostgreSQL

I enjoy the occasional cigar, and over time I noticed two problems. First, I could never remember which cigars I still had in my humidor (the cabinet where you store cigars) or which ones I'd loved. Second, when I picked one up, I often couldn't tell exactly what it was. The band tells you the brand, but the specific model and size are easy to forget. That's where the idea for Fumera came from: a companion app to keep track of your cigars, remember your favourites, and capture the experience of each smoke.

Fumera start screen

The core idea

Fumera is built around three things: your humidor (what you own and how much is left), your reviews (rating every cigar you smoke, with flavours, draw, and strength), and a way to look back on all of it. Everything is wrapped in a dark, tactile design that's meant to feel a bit like the hobby itself.

Humidor overview

AI cigar recognition

The feature I'm most proud of is the AI recognition. Instead of typing in every detail by hand, you snap a photo of the cigar and the app figures out what it is: the brand, the model, and even an estimate of its dimensions (length and ring gauge). Behind the scenes the image is sent to my backend, which runs it through Google Gemini and returns a structured guess. If the AI gets something slightly wrong, you can correct a dimension and ask it to refine its answer, and it comes back with better matches and alternative suggestions. It turns what used to be tedious data entry into a two-second scan.

Getting the prompt right was its own little project: I had to teach it to prefer the common names collectors actually use over the technical ones, to leave the brand out of the model name, and to always return dimensions in millimetres so the app could use them directly.

Reviewing a smoke

A big part of enjoying cigars is remembering the moment. After a smoke you rate the experience, tag the flavours you tasted, and note the draw and strength. Each review can carry a photo and a location, so scrolling back through them feels like a little diary of good evenings.

Rating a cigar Reviewed cigars

Technical decisions

I built the app in Flutter, so a single codebase runs on both iOS and Android. The backend is a NestJS API talking to a PostgreSQL database, and the AI cigar-identification logic lives there too, so the app just sends the photo and gets back a clean result. The whole thing, backend and database included, runs on a DigitalOcean droplet that I manage myself, which means I'm not tied to anyone else's platform or pricing and I keep full control over the data.

Cigar detail with batches and history

The real challenge: getting it published

Building the app turned out to be the easy part. Publishing it was the real test.

Because Fumera is related to tobacco, the Apple App Store wouldn't allow it. Apps that facilitate or relate to tobacco products get rejected. Suddenly I had a finished, perfectly working app that no one could download.

This is where the problem-solving really started. My first idea was to sidestep the App Store's tobacco rules by presenting the app around something harmless, so I built a version reskinned as a coffee collection app, swapping cigars for coffee brands to get through review. It was a creative attempt, but it didn't work: the reviewers weren't convinced, and reskinning the whole product just to satisfy a gatekeeper felt wrong anyway.

So I went looking for another route, and landed on AltStore, an alternative app installer that lets people install iOS apps outside of Apple's App Store. Instead of fighting the store's rules, I distribute Fumera directly through AltStore, which sidesteps the tobacco restriction entirely while still giving people a real, installable app on their phone.

It was a frustrating detour, but a genuinely useful lesson: shipping software isn't just about writing it. Sometimes the hardest bug to solve is a policy, and the fix is finding a different path to your users. You can find the app and learn more at fumera.app.