João Pedro Battistella Nadas 33fc5e0c7d fix: drop vim mode, pin CodeMirror to dodge esm.sh outage
esm.sh's build backend was returning HTTP 500 for unbuilt @codemirror/*@6
version ranges (out of disk). A failed top-level module import aborts the
whole <script type=module>, so fillLangs()/loadModels() never ran and the
language/model dropdowns came up empty despite a healthy backend.

- Pin CodeMirror imports to already-built versions (view@6.36.0,
  state@6.7.0, commands@6.10.4), which esm.sh serves fine during the outage.
- Remove vim editing mode entirely (@replit/codemirror-vim import, vim()
  extension, Vim.mapCommand H/L bindings, .cm-vim-panel CSS). The
  document-level Shift-H/L focus cycling is retained.
- Bump to 0.4.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 11:15:07 +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%