Static demo A self-hosted Portuguese learning platform running on a two-node k3s cluster at home. This page is a snapshot; the live version reads pod status from the Kubernetes API and node metrics from Prometheus. · Write-ups · Repo

Laboratório
Brasil

k3s · two nodes · qwen2.5 7b local

--:--
Miami
--:--
Rio
Palavra do dia — carioca slang · click for another mermão Contração de "meu irmão". Tratamento entre amigos, muito carioca. Fala, mermão! Cê vai na praia hoje?
Aprender — learning tools
01

Tutor

Open WebUI + Ollama

Conversation practice against a local 7B model

running
02

Coach

Python CLI

Writing correction with typed error kinds

planned
03

Fichas

Anki export

Decks generated from the corpus, with audio

planned
04

Gíria

CloudNativePG

Carioca slang database, fed by coach output

planned
Mídia — media libraries
05

Música

Navidrome

Samba, MPB, choro

running
06

Livros

Audiobookshelf

Podcasts and audiobooks

planned
07

Vídeo

Jellyfin

Films, with transcript breakdown tooling

planned
Infra — platform
08

Grafana

kube-prometheus-stack

Node and pod metrics, k3s-adjusted scrape config

planned
09

Ollama

qwen2.5 7b q4_K_M

CPU inference, 20Gi limit, measured 4.6 tok/s

running
Corpus — from fsi-scraper
FSI Brazilian Portuguese FAST · Lesson 3 · AT THE HOTEL

Making a Long-Distance Call

B Alô! Telefonista! A Telefonista, boa tarde, eu gostaria de fazer uma chamada interurbana para Brasília. B Pois não, para que número a senhora quer ligar? A Para o número 216-8079, pessoa a pessoa, por favor.
+ 6 more lines in this dialog
65 lessons · 2141 dialog lines · 71 files · 2 sources · exported from Postgres by fsi-scraper
FSI Brazilian Portuguese FAST, US Foreign Service Institute (public domain)
9
dias seguidos · study streak
Nós — cluster nodes
control-plane
16 GB · workload=light
memory7.1 / 16 GB
cpu18%
worker
32 GB · workload=heavy
memory7.4 / 31 GB
cpu62%
Stack

Platform

  • k3stwo nodes, bare metal, flannel VXLAN
  • FluxGitOps, whole cluster from one repo
  • Traefikingress, hostname per service
  • Sealed Secretscredentials committed safely

Observability

  • Prometheusk3s-specific scrape config
  • Grafananode and namespace dashboards
  • node-exporterDaemonSet, picks up new nodes

Built here

  • coachPython CLI, typed corrections via Pydantic
  • fsi-scrapercorpus pipeline, 5 stages, ruff + pytest
  • This portalConfigMap-served, hash-triggered rollouts

Next

  • Terraform + AKSportal to cloud, then torn down
  • CloudNativePGbackup and a tested restore
  • Shared storagelocal-path pins pods to disks
Write-ups
devops

Exercise - Ingress with Traefik

The exercise said not to write the Ingress myself. Make the Helm chart do it. I spent the first half convinced I was just typing commands for no reason, and the second half fighting the space bar.

devops

Letting Linkding Out of the House

My bookmark manager only existed behind a port-forward. Getting it onto the public internet took a Cloudflare Tunnel, a Service I never made, and a certificate lesson I did not see coming.

devops

The second source is the one that tells you if your design was right

The first course worked. The second one showed me which parts of my design were real and which parts were just how FSI happened to be laid out.

devops

Scraping a 1970s language course into Postgres

A free FSI course, an OCR text layer that is mostly right, and a five stage pipeline you can run twice without breaking anything.

devops

Five ways I broke port-forward in one night

One command, two numbers, and every one of them wrong at some point while I tested Navidrome and Open WebUI.

devops

Navidrome was running and doing nothing

Two settings that had been quietly ignored for 37 days, a root-owned volume on the Dell, and the restart test that almost scared me.