Commit Graph
40 Commits
Author SHA1 Message Date
Kharec 343836df6b fix: build the stalled-download message from the timeout
The message hard-coded "30 seconds" next to the stallTimeout constant:
change one and the other lied.
2026-10-15 17:54:56 +02:00
Kharec e85d0ba7e9 chore: remove marian's duplicate installation check
marian.Installed and marian.Files were only used by the package's own
test, while the app has its own check in translation.go - with a
different rule (pinned size there, size > 0 here), so the two
definitions of 'installed' could disagree. The app's check is the
canonical one (it owns the pins); Load already fails on an incomplete
model, which the test keeps asserting.
2026-10-15 17:54:44 +02:00
Kharec 1440adc199 docs: record why the translation engine lives in-tree
A from-scratch CPU inference engine is the largest, riskiest part of
the codebase and the least connected to screenwriting, so it deserves a
written decision. It stays: the alternative (a ctranslate2/argos
dependency, a plugin or a separate binary) buys a single menu item at
the cost of cgo and per-distribution packaging, while the in-tree
engine keeps the one-binary, offline, GPL-clean build. The package doc
now says so, with the condition that should reopen the question
(more language pairs).
2026-10-15 17:54:11 +02:00
Kharec 82bfef8cba fix: give each translation worker its share of the CPUs
Translate runs NumCPU/2 sentence workers and each of them started
GOMAXPROCS goroutines for the logit projection of every step: on 16
cores, 128 goroutines fighting for 16 cores. The model now caps the
goroutines of a step (SetThreads, called once after Load) so that
workers x threads stays within the machine.
2026-10-15 17:53:38 +02:00
Kharec d6ee57130f fix: copy decoder caches once per surviving beam, not per candidate
Each beam-search step deep-cloned the keys and values of every layer
for every candidate it kept, so the cost grew quadratically with the
sentence length and produced garbage faster than the unrolled dot()
could win. Survivors are now chosen first; a beam whose parent has a
single survivor takes its slices over (the parent is dead), and only a
shared cache is cloned. The step's other buffers (query/key/value,
hidden, logits) are reused across layers, beams and steps instead of
being allocated afresh each time. TestRealModel confirms the output is
unchanged.
2026-10-15 17:52:37 +02:00
Kharec e80ad634ef feat: warn when a PDF export replaces characters it cannot draw
The hand-written PDF writer uses the standard Courier fonts
(WinAnsiEncoding), so any character outside CP1252 - a Polish, Greek,
Cyrillic or CJK script - was silently written as '?'. Render now
collects the characters it had to replace and returns them, and the
export dialog lists them in a warning once the file is written.

Embedding a TrueType font (e.g. Courier Prime) with a CID/ToUnicode
map would fix the root cause; the warning keeps the zero-dependency
trade-off honest in the meantime.
2026-10-15 17:49:53 +02:00
Kharec 5e7ae97b57 fix: make atomic saves durable and preserve the file
writeAtomic renamed the temporary file over the target without syncing
either: on ext4 with delayed allocation a power cut just after a save
could leave a zero-length script, the exact failure autosave exists to
prevent. Sync the temp file before the rename and the directory after
it. While here, keep an existing file's permissions instead of forcing
0o644, and resolve symlinks first so saving through a link replaces
the file it points to, not the link itself (Dropbox/dotfile setups).
2026-10-15 17:44:56 +02:00
Kharec c0a52a9040 fix: protect the dirty flag with an atomic.Bool
SetDirty runs on a Wails call goroutine while the GTK close handler
reads the flag, with no synchronisation: an edit landing while a save
finished could make the close confirmation unreliable. The spellMu
comment already documents the goroutine-per-call convention; the flag
that guards against losing work deserves the same care.
2026-10-15 17:43:56 +02:00
KharecandClaude Opus 5.5 643adffb12 chore: release 1.4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1.4
2026-10-15 16:41:35 +02:00
KharecandClaude Opus 5.5 b6b58c7aca chore: update source-map-js to fix a high severity advisory
GHSA-68fv-2mgg-jv7q: event-loop denial of service through indexed
source-map section offsets. Build-time dependency only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 16:41:27 +02:00
Kharec 839e9291d6 feat: resumable download and cancellable load of the translation model
Downloading the 300 MB model restarted from zero after any failure and
hung forever on a stalled connection. Download into a .partial file
that survives interruptions, resume it with a Range request (falling
back to a fresh download when the server cannot), skip files already
verified, and abort when nothing arrives for 30 s. A model directory
only counts as installed when every file has its pinned size, so a
truncated model is offered for download again instead of failing to
load.

The model load held the translation mutex, so Cancel did nothing for
the seconds it takes to read 300 MB. Load without holding the lock,
make marian.Load context-aware, and let CancelTranslation wait for the
task to wind down so a new one can start at once. The idle release
timer re-arms when it fires while a download holds the task slot,
instead of never freeing the model.
2026-10-13 18:17:53 +02:00
Kharec 8181c6e885 docs: update readme 2026-10-13 18:15:14 +02:00
Kharec 082152fc31 chore: update changelog 2026-10-13 18:15:10 +02:00
Kharec b84284b60c docs: update agent 2026-10-13 18:15:05 +02:00
Kharec 7872403e11 docs: update readme 2026-10-13 16:52:13 +02:00
Kharec e9eb2ff36a docs: update agent 1.3 2026-10-01 10:17:54 +02:00
Kharec 60032ce490 chore: update chanelchore: update changelog 2026-10-01 10:17:50 +02:00
Kharec 5e1dc1cace docs: update readme 2026-10-01 10:16:05 +02:00
Kharec ed6704b97e feat: implement translation 2026-10-01 10:16:01 +02:00
Kharec 803dc3328a feat: main translation script 2026-10-01 10:15:53 +02:00
Kharec 9987d7e1ab feat: update frontend to integrate translation 2026-10-01 10:15:47 +02:00
Kharec 49df7f36a1 feat: refresh screenshots 2026-10-01 10:15:34 +02:00
Kharec cb356ff8c5 feat: add a translate stack 2026-10-01 10:15:28 +02:00
Kharec 5cf16588c1 chore: update changelog 1.2 2026-09-29 14:26:51 +02:00
Kharec fd90f9edaf ci: update ignore 2026-09-29 14:25:53 +02:00
Kharec da744d51c6 feat: add pkgbuild 2026-09-29 14:25:50 +02:00
Kharec d8334b1cfd feat: update version 2026-09-29 14:25:46 +02:00
Kharec b652cd88e8 docs: update readme 2026-09-29 14:25:43 +02:00
Kharec 89dafc010e chore: update changelog 2026-09-29 14:25:39 +02:00
Kharec 89a8f0b49b docs: update agent 2026-09-29 14:25:35 +02:00
Kharec 8cb406dea1 feat: icon 1.1 2026-09-29 14:16:04 +02:00
Kharec 110339ea41 feat: update screenshots 2026-09-29 14:16:00 +02:00
Kharec d5c8c65fdf feat: integrate icon 2026-09-29 14:15:54 +02:00
Kharec 9203c3c6b6 design: new icon 2026-09-29 14:15:48 +02:00
Kharec 5e2e71db9d docs: update readme 2026-09-29 14:15:42 +02:00
Kharec 825995c112 feat: make install 2026-09-29 14:15:38 +02:00
Kharec 23c97bdbc5 chore: update changelog 2026-09-29 14:15:26 +02:00
Kharec 54a6565e64 docs: update agents.md 2026-09-29 14:15:22 +02:00
Kharec 664527182d feat: first release ! 2026-09-28 14:21:06 +02:00
Kharec 77a333e8d9 Initial commit 2026-09-28 14:12:14 +02:00