๐“๐ก๐ž ๐Ÿ๐ข๐ซ๐ฌ๐ญ ๐ ๐š๐ฆ๐ž ๐ฆ๐ฒ ๐ค๐ข๐๐ฌ ๐š๐ฉ๐ฉ๐ซ๐จ๐ฏ๐ž๐

Written by  on July 23, 2026

I like good turn-based offline games. Recently, the kids brought home one that I won’t name here because my GitHub Pagesโ€“backed browser game is a shameless copy.

If you want to play it (free and safe): https://marcelpetrick.github.io/recognizer/

๐—ง๐—ต๐—ฒ ๐—ฟ๐˜‚๐—น๐—ฒ๐˜€ ๐˜๐—ฎ๐—ธ๐—ฒ ๐˜๐—ฒ๐—ป ๐˜€๐—ฒ๐—ฐ๐—ผ๐—ป๐—ฑ๐˜€ ๐˜๐—ผ ๐—ฒ๐˜…๐—ฝ๐—น๐—ฎ๐—ถ๐—ป: ๐˜›๐˜ธ๐˜ฐ ๐˜ค๐˜ข๐˜ณ๐˜ฅ๐˜ด. ๐˜Œ๐˜ช๐˜จ๐˜ฉ๐˜ต ๐˜ด๐˜บ๐˜ฎ๐˜ฃ๐˜ฐ๐˜ญ๐˜ด ๐˜ฆ๐˜ข๐˜ค๐˜ฉ. ๐˜Œ๐˜น๐˜ข๐˜ค๐˜ต๐˜ญ๐˜บ ๐˜ฐ๐˜ฏ๐˜ฆ ๐˜ฎ๐˜ข๐˜ต๐˜ค๐˜ฉ. ๐—™๐—ถ๐—ป๐—ฑ ๐˜๐—ต๐—ฒ ๐—บ๐—ฎ๐˜๐—ฐ๐—ต ๐—ณ๐—ฎ๐˜€๐˜๐—ฒ๐—ฟ ๐˜๐—ต๐—ฎ๐—ป ๐˜†๐—ผ๐˜‚๐—ฟ ๐—บ๐—ฎ๐˜๐—ฒ๐˜€.

It is super simple, but pattern matching requires concentration, and you have to be quick. ๐—œ๐˜’๐˜€ ๐—ด๐—ฟ๐—ฒ๐—ฎ๐˜ ๐—ณ๐˜‚๐—ป ๐—ฒ๐˜ƒ๐—ฒ๐—ป ๐—ฎ๐˜€ ๐—ฎ ๐˜€๐—ถ๐—ป๐—ด๐—น๐—ฒ ๐—ฝ๐—น๐—ฎ๐˜†๐—ฒ๐—ฟ with a local high-score list.

Building it raised three useful questions:
* ๐—›๐—ผ๐˜„ ๐—ฑ๐—ผ ๐˜†๐—ผ๐˜‚ ๐—ด๐˜‚๐—ฎ๐—ฟ๐—ฎ๐—ป๐˜๐—ฒ๐—ฒ that rule across all ๐Ÿ,๐Ÿ“๐Ÿ—๐Ÿ” possible card pairs?
* ๐—›๐—ผ๐˜„ ๐—ฑ๐—ผ ๐˜†๐—ผ๐˜‚ ๐˜๐˜‚๐—ฟ๐—ป a shared game into a good single-player challenge?
* ๐—›๐—ผ๐˜„ ๐—บ๐˜‚๐—ฐ๐—ต ๐—ถ๐—ป๐—ณ๐—ฟ๐—ฎ๐˜€๐˜๐—ฟ๐˜‚๐—ฐ๐˜๐˜‚๐—ฟ๐—ฒ does a small browser game actually need?

The mathematical part uses a finite projective plane. ๐—ง๐—ต๐—ฒ ๐˜๐—ฒ๐˜€๐˜ ๐˜€๐˜‚๐—ถ๐˜๐—ฒ ๐˜ƒ๐—ฒ๐—ฟ๐—ถ๐—ณ๐—ถ๐—ฒ๐˜€ ๐—ฒ๐˜ƒ๐—ฒ๐—ฟ๐˜† ๐—ฝ๐—ผ๐˜€๐˜€๐—ถ๐—ฏ๐—น๐—ฒ ๐—ฐ๐—ฎ๐—ฟ๐—ฑ ๐—ฝ๐—ฎ๐—ถ๐—ฟ.

The product stays deliberately small: 10, 20, or 50 cards, a timer, and local high scores. ๐˜•๐˜ฐ ๐˜ข๐˜ค๐˜ค๐˜ฐ๐˜ถ๐˜ฏ๐˜ต๐˜ด. ๐˜•๐˜ฐ ๐˜จ๐˜ญ๐˜ฐ๐˜ฃ๐˜ข๐˜ญ ๐˜ณ๐˜ข๐˜ฏ๐˜ฌ๐˜ช๐˜ฏ๐˜จ๐˜ด. ๐˜•๐˜ฐ ๐˜ฃ๐˜ข๐˜ค๐˜ฌ๐˜ฆ๐˜ฏ๐˜ฅ.

๐—” ๐˜€๐—ถ๐—ฑ๐—ฒ ๐—ป๐—ผ๐˜๐—ฒ ๐—ณ๐—ผ๐—ฟ ๐˜๐—ต๐—ผ๐˜€๐—ฒ ๐—ถ๐—ป๐˜๐—ฒ๐—ฟ๐—ฒ๐˜€๐˜๐—ฒ๐—ฑ ๐—ถ๐—ป ๐˜€๐—ผ๐—ณ๐˜๐˜„๐—ฎ๐—ฟ๐—ฒ ๐—ฑ๐—ฒ๐—น๐—ถ๐˜ƒ๐—ฒ๐—ฟ๐˜†
I also used the project as a compact, end-to-end SDLC example: written requirements, scope, and acceptance criteria; separated and testable domain logic; versioned storage with migration handling; unit, component, browser, mobile, and accessibility tests; formatting, linting, type checking, and build gates; locked dependencies with automated updates; and repeatable PWA deployment through GitHub Actions and GitHub Pages.

๐ˆ๐Ÿ ๐ฒ๐จ๐ฎ ๐ญ๐ก๐ข๐ง๐ค ๐ฒ๐จ๐ฎ ๐š๐ซ๐ž ๐ช๐ฎ๐ข๐œ๐ค๐ž๐ซ: ๐ฉ๐ฅ๐š๐ฒ ๐š๐ง๐ ๐ฉ๐จ๐ฌ๐ญ ๐ฒ๐จ๐ฎ๐ซ ๐ฌ๐œ๐จ๐ซ๐ž ๐Ÿค—

๐‚๐ฅ๐จ๐ฎ๐ ๐€๐๐ˆ๐ฌ ๐š๐ซ๐ž ๐ž๐ฑ๐ฉ๐ž๐ง๐ฌ๐ข๐ฏ๐ž. ๐–๐š๐ญ๐ž๐ซ๐ฆ๐ž๐ฅ๐จ๐ง ๐ข๐ฌ ๐ง๐จ๐ญ. ๐Ÿ‰

Written by  on July 15, 2026

Vision models grow in their capabilities while the execution demands way fewer resources.

Means: my sales slip scanner-project from two years ago needed an upgrade. Before I was using GPT-4 Vision via the @OpenAI API, which costs you control over your data and a few cents for every analysis.

Now, after intensive benchmarking across a range of 15 models (with ๐Ž๐ฅ๐ฅ๐š๐ฆ๐š) and some surprising regressions (newer harness doesn’t mean the models execute faster; it can also mean they suddenly run into model load errors…), I put my money on ๐๐ฐ๐ž๐ง๐Ÿ‘.๐Ÿ“:๐Ÿ’๐. A casual language model with a ๐ฏ๐ข๐ฌ๐ข๐จ๐ง ๐ž๐ง๐œ๐จ๐๐ž๐ซ. My own benchmark over the selected models against the huge sample size of three receipts: all three were successfully evaluated. ๐Ÿ˜‰

Then I built a ๐ก๐จ๐ญ-๐Ÿ๐จ๐ฅ๐๐ž๐ซ-๐œ๐จ๐ง๐œ๐ž๐ฉ๐ญ around the script, and it works (thank you @Mr Zahorsky โ€” without whom I would have never come across that idea). For instance: in less than ten seconds, 13 samples were processed, and you get the result sum plus a fancy HTML overview for comparison.

๐ƒ๐š๐ญ๐š ๐ž๐ง๐ญ๐ซ๐ฒ can be done for cheap: give the kids the smartphone, snap all receipts, throw out some watermelon slices ๐Ÿ‰๐Ÿ˜‰

If you want to run the tool as well, check my GitHub: https://github.com/marcelpetrick/sales-slip-scanner-ng. As said: a local GPU is the only thing you need; ๐ง๐จ ๐œ๐ฅ๐จ๐ฎ๐, ๐ง๐จ ๐€๐๐ˆ ๐ค๐ž๐ฒ๐ฌ, ๐ง๐จ ๐œ๐ซ๐ž๐๐ข๐ญ ๐œ๐š๐ซ๐. Everything is now self-hosted. You’ll also find the benchmark of the vision models there, including the results.

๐“๐ก๐ž ๐›๐ข๐  ๐ช๐ฎ๐ž๐ฌ๐ญ๐ข๐จ๐ง ๐ข๐ฌ: ๐ฐ๐ก๐š๐ญ ๐ฌ๐ก๐จ๐ฎ๐ฅ๐ ๐ˆ ๐š๐ฎ๐ญ๐จ๐ฆ๐š๐ญ๐ž ๐ง๐ž๐ฑ๐ญ ๐ฐ๐ข๐ญ๐ก ๐š ๐ฅ๐จ๐œ๐š๐ฅ ๐ฏ๐ข๐ฌ๐ข๐จ๐ง ๐ฆ๐จ๐๐ž๐ฅ? ๐–๐ก๐š๐ญ ๐ฐ๐จ๐ฎ๐ฅ๐ ๐ฒ๐จ๐ฎ ๐๐จ?

#neverstoplearning

๐—œ ๐—ฅ๐—ฎ๐—ป ๐—ฎ ๐Ÿฎ๐Ÿณ๐—• ๐— ๐—ผ๐—ฑ๐—ฒ๐—น ๐—ผ๐—ป ๐—ฎ๐—ป ๐Ÿด๐—š๐—• ๐—š๐—ฃ๐—จ.

Written by  on July 15, 2026

๐Ÿฐ๐Ÿฌ ๐—บ๐—ถ๐—ป๐˜‚๐˜๐—ฒ๐˜€. That’s all it took me to get Bonsai 27B running locally on an RTX A2000 Laptop GPU with just 8GB of VRAM.

Bonsai 27B is based on Qwen 3.6, but uses PrismML’s custom native ๐Ÿ-๐›๐ข๐ญ ๐๐จ๐ง๐ฌ๐š๐ข format, reducing the model to just 3.9GB. A specialized ๐ฅ๐ฅ๐š๐ฆ๐š.๐œ๐ฉ๐ฉ fork implements custom CUDA kernels for the 1-bit inference path, making it possible to run the model directly on an 8GB GPU. The runtime exposes an OpenAI-compatible API, so existing tools and agents work without modification.
Performance is a different topic: 15 down to 9 tokens/s.

If you want to give it a try: find my notes and setup-scripts at GitHub: https://github.com/marcelpetrick/codingWithGPT/tree/master/bonsaiTestrun

๐Œ๐ฒ ๐š๐ฉ๐ฉ๐ฌ ๐š๐ซ๐ž ๐ง๐จ๐ญ ๐š๐›๐š๐ง๐๐จ๐ง๐ฐ๐š๐ซ๐ž!

Written by  on July 10, 2026

Yesterday, #RitterRadar got some updates: first, all dependencies were refreshed (no more CVEs); then I fixed some bugs I had noticed over the past few weeks; and finally, the best news: a new feature that gives you a copyable list of the events matching your current filter.

So, for instance, if you live near Potsdam and want to see all medieval events within 50 km over the next two months – you get this:

——-

04. Juli 2026 | Kinder- und Sommerfest in Gannahall 2026 | 14641 Nauen (26 km)
04. Juli 2026 – 05. Juli 2026 | Mythologie und Handwerk des Mittelalters 2026 | 15569 Woltersdorf (47 km)
22. Aug. 2026 – 23. Aug. 2026 | Sommerfest Lรผbarser Hofkulturdiverse Konzerte | 13469 Berlin (30 km)
29. Aug. 2026 | Mittelalterliches zum Ackerbรผrgerfest | 14641 Nauen (26 km)

——-

#FastAPI #WebScraping #OpenStreetMap #Geocoding #OpenSource #EventDiscovery

URL to the GitHub-project: https://github.com/marcelpetrick/RitterRadarย if you haven’t given it a try yet โš”๏ธ๐Ÿ‰

๐๐ญ ๐‚๐ซ๐ž๐š๐ญ๐จ๐ซ ๐ฌ๐ฉ๐ž๐ฅ๐ฅ๐œ๐ก๐ž๐œ๐ค โ€” ๐ง๐จ๐ฐ ๐ฐ๐ข๐ญ๐ก ๐๐Œ๐‹ ๐ฌ๐ฎ๐ฉ๐ฉ๐จ๐ซ๐ญ

Written by  on July 8, 2026

I never wrote a #QtCreator #plugin before. Somehow I always avoided that, because first you have to set up your environment, then build a husk, make it build, yada yada.

But the spellchecker plugin from Carel Combrink was missing support for QML-type files for years now. C++ parsing existed, #QML did not.

๐—ฆ๐—ผ ๐—œ ๐—ฒ๐˜…๐—ฝ๐—ฎ๐—ป๐—ฑ๐—ฒ๐—ฑ ๐—ถ๐˜.

New QML parser added next to the existing C++ parser. As you know: QML is different from C++ ๐Ÿ˜‰

It now scans QML comments and user-visible string literals:
* // line comments
* /* block comments */
* double-quoted strings
* single-quoted strings
* template literals

It also tries hard to not be annoying. It ignores QML/JavaScript code tokens like imports, ids, property names, bindings, and component names. URLs, emails, pure numbers, color values, and all-caps words are filtered out as well.

Source positions are preserved, so underlines and replacements land where they should. It works for current-file and project-wide checks, with background processing, reparsing, and settings for comments and string literals.

Lots of #testing. Unit tests, yes. But also manual testing, because certain aspects were not part of my initial implementation plan. As always.

So now you can use any Hunspell dictionary to check your QML files for typos and get them fixed.

Typos in code and comments are a real concentration breaker while reading code.

๐— ๐—ถ๐˜€๐˜€๐—ถ๐—ผ๐—ป ๐—ฑ๐—ผ๐—ป๐—ฒ. ๐—”๐—ป๐—ผ๐˜๐—ต๐—ฒ๐—ฟ ๐˜๐—ต๐—ถ๐—ป๐—ด ๐—น๐—ฒ๐—ฎ๐—ฟ๐—ป๐—ฒ๐—ฑ. ๐—”๐—ป๐—ฑ ๐—บ๐—ฎ๐˜†๐—ฏ๐—ฒ ๐˜๐—ต๐—ฒ ๐—ฝ๐—ฎ๐˜๐—ฐ๐—ต ๐—ถ๐˜€ ๐—ฎ๐—ฐ๐—ฐ๐—ฒ๐—ฝ๐˜๐—ฒ๐—ฑ.

If someone really wants to check the patch themselves on GitHub:
https://github.com/CJCombrink/SpellChecker-Plugin/pull/197

Thanks to Carel Combrink and the other contributors for the existing work this builds on.

๐’๐ญ๐š๐ง๐๐ข๐ง๐  ๐จ๐ง ๐ญ๐ก๐ž ๐ฌ๐ก๐จ๐ฎ๐ฅ๐๐ž๐ซ๐ฌ ๐จ๐Ÿ ๐ ๐ข๐š๐ง๐ญ๐ฌ.

#Spellchecking