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
2.7 KiB
2.7 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). Supportsi/Esc,hjkl, word/line motions,dd/yy/p(vim's internal register), undo/redo,/search,:command line. Auto-disabled on touch devices (detected via(pointer: coarse)) where modal editing fights the virtual keyboard. Shift-H/Shift-Lcycle focus across the page controls (source → target → model → editor → button) likeShift-Tab/Tab. Also overridden in vim normal mode (replacing vim's viewport-top/bottom default) so the same shortcut works to leave the editor.- On page load, the model dropdown defaults to whichever model Ollama already has hot — skips the 5-15 s disk-reload pain on the first translation. After load it follows the user's manual selection.
Changed
- Editor font-size pinned to
1remto match the output pane (CodeMirror 6 ships smaller by default).
[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,ayaby default) list from Ollama's/api/tagsPOST /api/translate— streams Ollama's NDJSON/api/generateresponse back to the browserGET /api/loaded— proxies Ollama's/api/psfor the currently-loaded modelGET /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
uvbuild, 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
valinorrepo atapps/finrod/(bjw-s app-template, internal-only ingress atfinrod.jpnadas.xyz)
Fixed
- Lock against public PyPI explicitly — the workstation's global
uvconfig had pointeduv.locksources at the dexterenergy private artifact registry, which 401'd inside Docker