Files
finrod/CHANGELOG.md
João Pedro Battistella Nadas 782c7182f2 feat: vim bindings in the input via CodeMirror 6
- Replace the plain <textarea> with a CodeMirror 6 EditorView that
  has @replit/codemirror-vim attached. Loaded from esm.sh, so no
  build step — finrod stays no-bundler.
- vim() extension is conditionally omitted on coarse-pointer devices
  (phones, tablets) where modal editing without a hardware Esc key
  is unusable and IME composition fights the keymap.
- Ctrl-/Cmd-Enter shortcut and the typing-debounce that refreshes
  the "Hot:" indicator both migrate to CodeMirror's keymap and
  updateListener APIs respectively.
- Editor styled to match the existing .output pane.

CHANGELOG: note under [Unreleased].
2026-06-09 16:15:36 +02:00

2.1 KiB

Changelog

All notable changes to finrod are documented here.

Format: Keep a Changelog. Versioning: Semantic Versioning.

[Unreleased]

Added

  • Vim bindings in the input via CodeMirror 6 + @replit/codemirror-vim (loaded from esm.sh, no build step). Supports i/Esc, hjkl, word/line motions, dd/yy/p, undo/redo, / search, : command line. Auto-disabled on touch devices (detected via (pointer: coarse)) where modal editing fights the virtual keyboard.

[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