D38. Every optional download is listed, sized and removable in Elabora settings; removing it never touches a module (13 Oct 2026)
Decided on 13 October, after the local voices’ list (D37): the word aligners too, and every optional component Elabora downloads, today’s and future ones, must be manageable from Elabora settings.
- The rule. Whatever Elabora downloads once per computer on first use, and never puts in a course, is an optional download: Elabora settings list it, grouped by what it serves, with what it is for, what happens without it, its language if any, whether it is on this computer (its size on disk) or not (the size to download), a download under way and whether it is in use; the author installs, reinstalls or removes it there. Removing it is refused while it is in use or being downloaded, in any process, asks for no confirmation, and never touches what modules already contain; its next use downloads it again, as the first did.
- One registry.
@elabora/nodedownloads/: a kind registers its id prefix, its title, what it serves and what happens without it, its downloads (one per language, or one) with their state, and how to install (force: removed then downloaded again) and remove one; nothing else knows the kinds. The ids are<kind>-<language>(voices-fr,aligner-en) or the kind alone.optionalDownloads,installDownload,uninstallDownload; CLIelabora downloads list|install|uninstall; MCPelabora_downloads,elabora_download_install,elabora_download_uninstall(destructive: only when the author asks), which replace D37’selabora_voice_modelsandelabora_voice_uninstall(never released);elabora voice models,voice installandvoice uninstallstay as the voices’ part (voice uninstall <lang>isdownloads uninstall voices-<lang>). - The first two kinds. The local voices (D25, D37:
voices, French 354 MB, English 126 MB) and the word aligners (D27:aligner, French 355 MB, English 95 MB); the transcriber (D46:transcriber, one download of 671 MB for every language) came third. An alignment, a transcription andelabora narration alignhold their language’s aligner as a generation holds its voices (D37: the same lock, holds and removal,models/download.ts); the aligners’ process (one for every language), which keeps its model open between alignments, is stopped before a removal unless this process is aligning in any language. A download stopped from the settings removes what it had received, never a model that is all there once the removal holds the lock (another process may have finished it). Without an aligner, words are placed in proportion to the text (ElevenLabs voices give their own times). - A new kind (another model, a runtime) only registers in
downloads/index.tswith its list, install and removal, usingmodels/download.tsfor its files: the settings, the commands and the agents’ tools show it; the app needs only its words for the kind (a fallback shows the core’s). - Tests never reach the author’s models. The core’s test suites run with a global setup (
test/isolate.ts) giving every model folder one of the run (ELABORA_VOICE_MODELS_DIR,ELABORA_ALIGNER_MODELS_DIR) unless set; the app’s tests and captures (ELABORA_USER_DATA) get a test cache of their own for them;ELABORA_VOICE_MODELS_MANIFESTandELABORA_ALIGNER_MODELS_MANIFESTgive made-up files, for tests only;scripts/pocket-voices.tsuses a cache of its own. Revisit if: a download is shared by several kinds (one file, two uses), an author wants a download kept on an external disk, or one must be removable while in use (then it waits rather than refuses).