New Year, New Payment Processor, Meticulous Support, and Much More

Happy New Year! 🄳

I realized I haven’t posted in over a month! That doesn’t mean things were quiet though as there have been lots of changes since the last update.

Every Christmas brings a new Ruby release, and as usual I couldn’t resist upgrading Visualizer immediately. There’s been 0 issues with it specifically, but some of you might have noticed other issues.

For several weeks Visualizer was a target of automated attacks, which caused a few brief interruptions. The service recovered on its own within ~30 seconds each time, but there were short windows of unavailability. I’ve applied several hardening fixes based on what these attempts revealed.

There’s a silver lining, though. Those attacks surfaced a nasty edge case: some shots were so badly malformed that simply viewing them could trigger an infinite loop and bring a web server down. That is now fixed, so this won’t happen again. And now Visualizer is better for everyone. šŸ˜…

New Payment Processor

The Lemon Squeezy road has been bumpy from the very beginning. The product often doesn’t work, and I’m getting errors I have no control over, which results in people being unable to subscribe or subscriptions expiring incorrectly. Their Stripe integration story has been even rougher. I’ve been in their preview programme since early August and the very basic things still aren’t resolved, and they’ve been ghosting my emails for over 5 months now.

As of today I’ve switched from Lemon Squeezy to Creem for all new subscribers. If you’re already on Lemon Squeezy, nothing changes - you’ll keep renewing there. Creem doesn’t offer migrations yet, so if you cancel and later resubscribe, you’ll go through Creem.

Exactly a year ago I promised that the prices will not increase, and today Premium is actually getting cheaper for EU customers because the VAT is now included in the price. I can do that because Creem is based in Europe. Which is also a nice plus with everything else going on in the world right now. 😬

Meticulous support

Thanks to Paul’s PR Visualizer now understands Meticulous files. There were some hiccups with profile support, but that should now be smooth too. Can’t wait to see how this community evolves. 🄰

API changes

There’s now an update shot endpoint, which allows you to edit all the fields on the shot, including custom fields, if you’re a Premium user.

I’ve also added a rate limit and when you exceed it, you’ll see 429 errors. It’s mainly there for script vibe kiddies, and AI crawlers, as the limits are quite high so I don’t think any real users will be affected.

Misc

I experimented with Codex and told it to write me a fun community stats page. It’s been improved somewhat by Discord suggestions already, but I’m still open for ideas on how to make it better, more valuable, and more interesting. At least I want it to be a bit more substantial before I expose it more publicly.

If you use Coffee Management, I’ve also re-added Roasters page in case you want to delete some roasters or just look at your entire collection for some reason.

Thanks for reading, and have a good remaining of the week! ā˜•


Date Search and Infrastructure Improvements

Almost two years ago, Chris opened an issue to add the ability to search by date, and it took me until last week to finally implement it. šŸ™ˆ

Not because it was particularly hard, but because I couldn’t find a nice way to present the UI, so I kept postponing it. Eventually, I came up with a compromise that’s also an improvement over the existing shots search. I unified Notes and Bean notes search into a single field. And if you’re a Premium user, it also searches your Private notes. Maybe it’s just me, but I really like this. I often can’t remember which note field I put something in. šŸ˜…

Besides this, there were several small code changes and bug fixes since the previous update. There was, however, a big infrastructure change. Visualizer now runs on two web servers behind a load balancer. I’m happy to say the migration was super smooth and completely zero-downtime.

You shouldn’t notice any difference day to day, as the main server was rarely resource constrained. Occasionally there could be queue build-ups if someone went a bit crazy with API requests, but that shouldn’t happen anymore. šŸ¤ž

This is very likely my last update of the year, so I again wish you all the best for the holiday season and the new year! šŸŽ†

P.S. In case you missed it, I built a nice Year in Review, so be sure to check it out!


Thank you for the first 5 years! šŸ™

It’s hard to believe, but Visualizer has been around for over 5 years now. November 2020 feels like yesterday, when I wrote the first few lines of code and that introductory post about my explorations in parsing and displaying Decent shot data in a browser.

I rarely look back, but at this year’s Rails World in Amsterdam I was selected to give a lightning talk about Visualizer, more specifically: how Rails made my hobby profitable. Unfortunately, the lightning talks weren’t recorded, so you can only see the slides. For me, this was a great reason to dig back through the history of Visualizer and remember / relive all the transformations it went through. And how many things I was forced to learn because of it. Which made me grow a lot as a software developer, but also as a person. I can say without a doubt that I wouldn’t be working where I am today were it not for this little thingy. And as an absolute cherry on top, I also got this response from Joe Masilotti:

This was my favorite lightning talk from the conference. Great job on it, Miha!

2025 has been an absolutely incredible year for Visualizer. There were so many changes and improvements that even I can barely keep track: Push notifications, migration to Lemon Squeezy, quick shot compare, support for Gaggiuino and GagiMate, tagging improvements, integration with Loffee Labs, including on Coffee Management which also got bag archiving and a complete redesign, Passkeys, managing dropdown values, and so many more improvements and bug fixes.

None of this would have been possible without you. Without users, especially without premium users, this project would have been long dead. But because of you, it’s been alive and kicking for over 5 years! I know it sounds cheesy at this point, but I honestly can’t thank you enough. Even in my wildest dreams, I never expected this fun little side project to have almost 7,000 users and over 3.6 million uploaded shots. Absolute insanity. 🤯

I don’t want to be the only one looking back, so as in previous years, I built a Year in Review for you all. As all Visualizer users can see, I’m not the best designer — I am a backend developer after all. But I’m quite proud at what I was able to create this year together with my new friend Jipiti. While I don’t think these tools will replace me anytime soon, I firmly believe they can be an incredible accelerator and the best transformer of my words into Tailwind classes.

There were plenty of other changes since the last update too. Most notably, I fixed a bug where shot times were displayed on the Community feed, even if you had them set to be hidden. Looking through the change log, I found that the bug got introduced way back in March (specifically here: bd4e4aa) when I unified the look and feel between the user view and the community view. I somehow overlooked this setting, and I’m extremely sorry to everyone affected! I take a lot of pride in how privacy-focused I am and on how many places I handle this, and I failed big time here. šŸ˜ž

Now, back to positive news: as in previous years, my friend Luka (Banibeans) has a special offer for Visualizer users. This year, when you use VISUALIZER10 at checkout, you not only get a 10% discount, but he also promised he’ll throw in an extra 100g of something very tasty.

Whether you’re decorating a tree, lighting candles, raising an aluminum pole, or just catching your breath, I wish you wonderful holidays filled with great coffee and even better company. šŸ„‚

Miha