Skip to content
All projects
v1 (of 4 planned versions) · 2026

Opi!

A Finnish training site: it introduces new content, tests with typed exercises scheduled by spaced repetition, and corrects by showing the expected form and the rule. It runs on a Kubernetes cluster built in my homelab, updated automatically on every merge.

Year
2026
Tech stack
  • Python
  • Flask
  • Kubernetes
  • k3s
  • Terraform
  • Proxmox
Opi! home page: today's review session, over a northern-lights background

01 · Context

The challenge

Personal project that started as a small Flask conjugation app and grew into a real platform, designed as if in production. Opi! does three things: it introduces new content (verbs, words, expressions) on a discovery sheet, it tests with typed exercises whose timing is planned by spaced repetition (FSRS), and it corrects by showing the expected form, the letters that differ and the rule. Each session mixes the reviews that are due, the exercises unlocked by the grammar skills and the day's new items, and the Library lets me browse all the content. That content is the central constraint: it lives in YAML files that I review by hand, only what I have approved reaches the exercises, and the code never invents a Finnish form. Personal use, not public, deployed as if in production.

02 · Architecture

How it's built

Opi! architecture diagram: the browser, the front end (React, nginx), api with Redis, then lexicon and srs, each with its own database in one Postgres instance, and the data/ folder imported into lexicon
Four services that only talk over JSON HTTP: api orchestrates, lexicon and srs decide

Key points

  • Finnish content versioned in Git and reviewed by hand: the code never invents a form
  • Four services (React front end, api, lexicon, srs) that only talk over JSON HTTP: none reads another one's database
  • Reviews scheduled by the FSRS library (spaced repetition), without reimplementing the algorithm
  • Infrastructure described as code (Terraform): three virtual machines and a k3s cluster that can be recreated identically
  • Automated delivery: a merge on main rebuilds the images, stores them in a private Harbor registry, and Argo CD updates the cluster
  • Site reachable only from the private network (Tailscale), with the progress backed up every night, restored and tested

03 · In pictures

Gallery

Click an image to open it full screen and browse through the screenshots.

04 · Takeaways

What I took away from it

Describing infrastructure as code (Terraform): the machines are recreated identically, and Argo CD brings the cluster back to the state described in Git. A merge is enough to deploy.