João Pedro Battistella Nadas 2d067226b9 revert: drop clipboard yank/paste and modal dropdowns
The vim clipboard integration was unreliable across browsers
(library "+" register broken on Firefox; custom navigator.clipboard
actions worked on Chrome but hit chip prompts and Firefox config
edge cases). The modal dropdown layer added more state than it
saved keystrokes. Pulling both back out.

What remains of the vim work:
  - CodeMirror + @replit/codemirror-vim in the input buffer
    (i/Esc, hjkl, word/line motions, yy/p via vim's internal
    register, undo, /, :)
  - Shift-H / Shift-L focus navigation across controls, including
    the H/L override inside the editor so it works from any focus
2026-06-09 17:07:01 +02:00

finrod

Tiny web translator backed by Ollama on radagast. Named for Finrod Felagund, Noldor loremaster of the tongues of Men.

Run

uv run uvicorn app:app --host 127.0.0.1 --port 8000 --reload

Then open http://127.0.0.1:8000.

Config

Env var Default Notes
OLLAMA_URL http://radagast.jpnadas.xyz:11434 Ollama base URL
MODEL_FILTER gemma,aya Comma-separated substrings; model matches if it contains any. Empty = show all

Models

For Pt/Nl/En translation, three worth A/B-ing:

ssh radagast 'ollama pull gemma2:9b'      # already there — big-and-broad baseline
ssh radagast 'ollama pull gemma3:4b'      # newer multilingual training, ~2-3× faster on Ivy Bridge
ssh radagast 'ollama pull aya-expanse:8b' # Cohere multilingual model, strong on Dutch

All three fit in radagast's 10 GB at Q4. Switching models in the dropdown forces Ollama to load the new weights — expect a 5-15 s pause on the first call after a switch while it reads from disk.

Build / push image

Built locally and pushed to Scaleway — no Gitea runners on the homelab yet, so there's no CI workflow.

One-time setup (host needs buildx + QEMU for cross-arch):

docker buildx create --name multi --use
docker run --privileged --rm tonistiigi/binfmt --install all
docker login rg.nl-ams.scw.cloud -u nologin -p <SCW_SECRET_KEY>

Then on every change:

./build.sh

That builds linux/amd64,linux/arm64 and pushes three tags:

  • :latest — moving pointer
  • :<git-short-sha> — immutable, traceable
  • :<pyproject-version> (e.g. :0.1.0) — semver

Deploy

Cluster manifests live in valinor/apps/finrod/ (bjw-s app-template, internal-only ingress at finrod.jpnadas.xyz). To roll out a new build, bump tag: in valinor/apps/finrod/values.yaml to the new semver on a branch → PR → merge → ArgoCD syncs.

Release workflow

This project uses Semantic Versioning and keeps a human-edited CHANGELOG.md.

To cut a release:

  1. On a branch, edit CHANGELOG.md: move accumulated [Unreleased] notes into a new ## [X.Y.Z] - YYYY-MM-DD section.
  2. Bump version in pyproject.toml to X.Y.Z.
  3. PR → merge to main.
  4. Tag the merge commit:
    git checkout main && git pull
    git tag -a vX.Y.Z -m "vX.Y.Z"
    git push origin vX.Y.Z
    
  5. ./build.sh — the image now also gets :X.Y.Z (read from pyproject.toml).
  6. In valinor, bump apps/finrod/values.yaml tag: from the previous version to X.Y.Z on a branch → PR → ArgoCD picks it up.
Description
No description provided
Readme 483 KiB
Languages
HTML 82.1%
JavaScript 7.2%
Python 6.3%
Dockerfile 2.4%
Shell 2%