From OCR to LLM and Back: Reading Receipts
Running a vision LLM in production on my own Kubernetes cluster, for privacy and predictable costs
It started with Thai bank transfer slips and grew into shop receipts from any country. A Thai slip has a QR code, but the QR holds only a bank code and a transaction reference. The amount, date and names have to be read from the image, the layout changes from bank to bank, names are often in Thai script, and a chat bot has to answer before its reply window closes. I went from OCR to a vision LLM, back to OCR, and ended up with both: QR and Tesseract for the fast first answer, a self-hosted Gemma model on CPU for the rest. Here is each step, what broke, and how I measured the fixes on synthetic and real receipts. If you read documents in any non-Latin script, the Thai-script problems will look familiar.
Highly Available RKE2 on Immutable openSUSE MicroOS
Three RKE2 servers on KVM VPS, an OS that updates in snapshots, and reboots that take turns
My Kubernetes cluster ran on three Ubuntu nodes built with kubeadm, and every Kubernetes and OS upgrade on it was a chore I had to do by hand. When its price had doubled in four years — for the same, now seven-year-old hardware — I moved it to cheaper VPS running openSUSE MicroOS, an immutable OS that updates itself in snapshots, with RKE2 installed as a package from the same update stream. Here is the whole build, step by step, and what 50 days of automatic updates have shown since.
Как я перенёс учёт откликов из таблицы в обычные файлы
Почему я выбросил RAG-пайплайн и оставил только поиск
С 2012 года я могу поднять любой свой отклик — сначала потому, что историю хранил сам сайт с вакансиями, позже потому, что я завёл таблицу в LibreOffice с цветной разметкой строк. В 2026-м я захотел, чтобы эту таблицу читала и обновляла языковая модель, и вот тут она окончательно сдалась. Рассказываю, как она превратилась в хранилище из обычных markdown-файлов с MCP-сервером сверху — и что я успел собрать и выбросить по дороге.
Preparation for Dual Boot
Cheatsheet for Installing Dual Boot with Windows
Right now is tough time. Everyone needs more disk space and more RAM. So I made a choice to upgrade my work laptop. Here I trying to recap all steps that I made on fresh laptop. I'll probably find this useful next time after few years.
Getting localized in a wagtail way
How I migrated from wagtail-modeltranslation to wagtail-localize
My experience in migrating this site from wagtail-modeltranslation to wagtail-localize. With step-by-step instructions for those who want to make a similar migration.
An upgrade to Jammy Jellyfish
The story of how I upgaded Ubuntu to 22.04 on Nodes in Kubernetes cluster
Due to the fact that recently released Ubuntu 24.04 LTS and I still have Ubuntu 20.04 LTS on the nodes in the Kubernetes cluster and have some free time I decided to upgrade at least to Ubuntu 22.04.
Spinning out a High Available Kubernetes cluster with kubeadm
Deploying a production-ready Kubernetes cluster locally in virtual machines with kubeadm
In most cases, a local cluster of one server is sufficient for application development. And in some implementations it is not a virtual machine but a container. There are a lot of tools k3d and minikube just few of them.
But if you need to prepare for deploying a production cluster on your own, or to test the fault tolerance of distributed storage from an open source project, or to prepare for the CNCF exam. In such cases I have found it useful to have a cluster on my laptop as similar as possible to the one in production.
Here is step by step instructions on how to deploy kubernetes cluster with multiple control-plane nodes(ie high available cluster) on virtual machines using kubeadm.