meklab.net

Projects

Platform and services

The cluster itself, and the services the family uses on it.

  • Live since 2025
    The server rack in the basement today, door open: the switch at the top, the servers on shelves below, and the console screen and keyboard on an arm at its side.

    Meklab Home Cluster

    A Kubernetes cluster in my house, run like production so I can learn how production fails.

    A highly available k3s cluster on six Proxmox hosts, reconciled from Git by Flux. Monitoring went in before any app did, and every service sits behind single sign-on. I've restored it from backup for real once, after Vault's storage came back empty. I don't recommend it as a testing strategy.

    • GitOps from a self-hosted GitLab CE, with CI reaching the cluster through an agent tunnel rather than a kubeconfig secret
    • Split-horizon DNS across three resolvers, all managed by ExternalDNS
    • Backups across VMs, cluster volumes, and an offsite archive

    k3s · Flux · Vault · Longhorn · Traefik · Prometheus · Loki · Authentik · Proxmox · Tailscale

    Private source

  • Live since 2026
    A Scribe thread in Slack: it acknowledges a link with the times the summary and audio will be ready, then posts the summary.

    Scribe Summary Bot

    Send a link, PDF, or image to Slack; get a summary, the full note, and a narrated version back in thread.

    A Slack bot running in the cluster. It reads a document's embedded text first and falls back to OCR only for pages with none, so a 39-page PDF finishes in about half a second instead of an estimated 15 to 25 minutes. Everything runs on local, CPU-only models, so documents never leave my own hardware.

    • Full note delivered in thread as PDF, Markdown, or Word, chosen per user
    • Optional narrated audio as chaptered m4b files in the audiobook library

    Python · Slack API · Ollama · Kokoro TTS

    Source on GitHub

Archival and digitization

Getting decades of family media off formats that won't last much longer.

  • Live since 2026
    The DVD archiver's job list: each disc with its state, its type, and the folder it was filed into.

    One-Button DVD Archiver

    A 2009 MacBook Pro, rebuilt so a grandfather can archive his own DVD shelf.

    Insert a disc, get a lossless rip, transferred to network staging, auto-ejected, with a chime. No terminal, no login, no decisions. A FastAPI and htmx interface with server-sent events shows progress in plain language. The ripper is an explicit SQLite-backed state machine, so a bad disc, a dropped network, or a power cut picks up where it left off. The only decision left is which disc goes in next.

    • Pull-based deployment so the appliance updates itself over the mesh network
    • TMDB metadata lookup so discs land in the library correctly named
    • Audio CD support in progress

    Python · FastAPI · htmx · SQLite · ffmpeg · mkvmerge

    Private source

  • In progress since 2026
    The vinyl inventory: the next accession number, a record search, and sides waiting to be recaptured or reviewed.

    Vinyl Record Digitizer

    An inherited record collection, digitized one side at a time.

    A capture station with a kiosk interface, an inventory server with barcode accession cards, and a pipeline from raw capture through track splitting and quality checks into the media library. Built so a non-technical operator can run a whole session alone.

    • Two-pass silence-detection track splitting with ffmpeg, after rejecting in-memory approaches that fail on long sides
    • Acoustic fingerprinting through AcoustID and MusicBrainz, with fingerprint failure used as a signal that a recording is home-made
    • Printed accession cards with barcodes tie the physical record to its digital master

    Python · FastAPI · ffmpeg · Chromaprint · MusicBrainz · ReportLab

    Source on GitHub

  • Live since 2026
    The family recipe app, a grid of recipe cards with photos and tags.

    Recipe Card Digitizer

    A grandmother's handwritten recipe cards, read by OCR and served from a family recipe app.

    Scans go through a handwriting OCR model, then a text model turns noisy output into well-formed recipe records with title, ingredients, steps, and provenance. Hard cases escalate to a stronger cloud vision model, and only the failed tail ever leaves the machine. Results land in a self-hosted Mealie instance in the cluster.

    • Prompt regression harness that checks the structuring stage against every sample card
    • Ingredient parsing on import, with a backfill for existing recipes
    • Worker runs in-cluster against CPU-only inference sized deliberately for the hardware

    Python · FastAPI · Ollama · Mealie · S3

    Source on GitHub

  • In progress since 2026

    Archival Audio Sorter

    Hours-long tape, record, and CD transfers, split into tracks, identified, and sorted.

    Fingerprinting identifies commercial recordings; anything unmatched is treated as a home recording and transcribed with a CPU-sized speech-to-text model so decades of unlabeled audio can be classified at all. Also untangled a library fractured by playlist names written into album tags. Next step is folding it into the Vinyl Digitizer as the stage that splits record captures and delivers the tracks into Jellyfin.

    ffmpeg · beets · AcoustID · faster-whisper · Python

    Private source

Apps

Software built for specific people and the problems they actually have.

  • In progress since 2026
    The OpenClef library in grid view: a search bar, filters for composer, key and difficulty, and one piece so far, shown by its first page.

    OpenClef Sheet Music Library

    An open-source, self-hosted sheet music library for performers.

    It started when my sister and I were getting ready to play a piece together for the millionth time. We were sending music back and forth and hunting for a copy of something we'd played years ago, and I thought it would be nice to self-host something like Mealie, but for sheet music. Existing tools are locked to one tablet and one user, or treat scores as plain files. OpenClef organizes music the way musicians look for it: by work, arrangement, part, instrument, and composer. I checked the design with other musicians before writing code, and full export to forScore keeps it compatible with how performers already work.

    Python · FastAPI · PostgreSQL · SQLAlchemy

    Source on GitHub

  • Live since 2026
    YardWise's Today page: nothing due, and a box for asking the garden assistant a question.

    YardWise Garden Journal

    A garden journal built for one family, handed over with an AI-readable maintainer manual.

    A phone-first garden journal for a non-technical owner: a property map, a plant inventory, and shared family accounts. The repo includes a manual written for an AI assistant, so the owner can ask for changes and the release pipeline checks them before they go live.

    • Release is a semver tag; Flux image automation promotes it with no manual deploy step
    • Project-only membership and a scoped token keep the blast radius to one repo

    Python · Django · htmx · PostgreSQL · Flux

    Source on GitHub

  • Live since 2025
    The Long Odds host screen: a four-letter room code, a QR code for joining, and the game settings, with the 303-question pack selected.

    Long Odds

    A party game played on phones. Everyone guesses a number, then bets on whose guess is closest.

    I tested whether a language model could write the trivia. Small models got the format right and the facts wrong, so the game plays from an original pack of 303 questions, each with a cited source.

    TypeScript · Next.js

    Private source

Experiments

Long-running side quests, mostly for the learning.

  • In progress since 2026
    A chess board showing perft test position 2, one of the six standard positions the engine's FEN parser reads and writes exactly.

    MekChess Engine

    A chess engine in Rust, starting from a move generator tested against a reference.

    Partly an excuse to learn Rust, and partly because I'm bad at chess. It's really fun to build a program that's far better at one thing than you, or almost anyone else, will ever be. In a silly sort of way, that makes you the best at it. So far the move generator and board representation are done and tested. A search engine and a Lichess bot come next.

    • FEN parsing and board representation with property-style tests against a reference library

    Rust

    Source on GitHub

  • In progress since 2026
    The DSKY from this site's home page during its lamp test, every digit lit. It is the display the phone will imitate.

    Pocket AGC

    Turning a jailbroken smartphone into a stand-in for the Apollo Guidance Computer, DSKY and all.

    Research and a design plan so far.

    Source on GitHub

The room is Mission Operations Control Room 2 in Houston, as it was for the lunar landings. Each project sits at the console whose job it most resembles. Some resemblances are more of a stretch than others.