Files
finrod/CHANGELOG.md
João Pedro Battistella Nadas f9acdef3fe chore: introduce semver + CHANGELOG.md, cut v0.1.0
- CHANGELOG.md following Keep a Changelog; 0.1.0 entry covers all
  features shipped through the loaded-model indicator
- build.sh now also tags the image with the version read from
  pyproject.toml, e.g. rg.nl-ams.scw.cloud/valinor/finrod:0.1.0
- README documents the release workflow (edit CHANGELOG, bump
  pyproject version, merge, tag vX.Y.Z, build, bump valinor)
2026-06-09 15:55:09 +02:00

1.8 KiB

Changelog

All notable changes to finrod are documented here.

Format: Keep a Changelog. Versioning: Semantic Versioning.

[Unreleased]

[0.1.0] - 2026-06-09

First release. Stateless translator UI that proxies streaming requests to Ollama on radagast.

Added

  • FastAPI backend with three endpoints:
    • GET /api/models — filtered (gemma,aya by default) list from Ollama's /api/tags
    • POST /api/translate — streams Ollama's NDJSON /api/generate response back to the browser
    • GET /api/loaded — proxies Ollama's /api/ps for the currently-loaded model
    • GET /healthz — for Kubernetes probes
  • Single-page UI:
    • Source / target / model dropdowns (30+ languages, "Auto-detect" source)
    • Token-by-token streaming into the output pane with a blinking caret
    • Live status line: spinner while waiting for first token, pulsing dot during streaming, elapsed time and token count
    • Glowing border on the output pane during streaming
    • Loaded-model indicator ( prefix in dropdown, "Hot: … — unloads in Xm" status line); refreshes on page load, on translation completion, and 500 ms after typing pauses
    • ⌘/Ctrl-Enter to translate from the input
    • Dark mode, inline SVG favicon (Star of Fëanor)
  • Dockerfile: two-stage uv build, slim Python 3.13 runtime
  • build.sh: multi-arch (amd64 + arm64) manual push to Scaleway, tags :latest, :<git-short-sha>, and :<pyproject-version>
  • Cluster deploy via the valinor repo at apps/finrod/ (bjw-s app-template, internal-only ingress at finrod.jpnadas.xyz)

Fixed

  • Lock against public PyPI explicitly — the workstation's global uv config had pointed uv.lock sources at the dexterenergy private artifact registry, which 401'd inside Docker