The WebRTC noise suppression estimates a running noise profile, so it removes
stationary noise but not keystrokes, which are transient and never look like
noise to it. Chiclet keyboards are as affected as mechanical ones. DeepFilterNet3
runs client-side as a LiveKit track processor and removes them.
Off by default and the model is only fetched once a user switches it on, so
nobody pays the download who does not want the filter. Default strength is 35
percent rather than full: measured, that already gives keystrokes gone with the
voice still natural, and more attenuation only adds artefact risk.
Assets ship with us instead of the package's default CDN, which would report
every participant's IP to a third party at call start and tie call setup to
foreign infrastructure. The Dockerfile gzips the model wasm, which the existing
top-level glob missed — 4.1 MB instead of 15.7 MB per client.
Browser noise suppression is switched off while the filter runs so the two do not
work against each other. Regulation goes through the model's own attenuation
limit, so there is no dry/wet mixer and no delay compensation to get wrong.
Decision and measurements: management ADR-0018 and issue #0054.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Section 4 still described a manual/local npm publish with an untracked .npmrc - obsolete since publish_npm landed in .gitlab-ci.yml on 2026-08-06. Documents the actual job: manual trigger, GITEA_NPM_TOKEN, the empty-package guard, and the threadnet dist-tag.
The anonymisation rewrite of 2026-08-07 gave every touched commit a new SHA, leaving the references in these documents pointing at objects that no longer exist. The mapping was reconstructed from the backup branches and each pair verified by tree and commit message before substituting.
Prefix lookups were built for lengths 7 to 12 and any ambiguous prefix would have been skipped; none were ambiguous across all 251 pairs.
Meine erste Aussage "Logo.svg und LogoLarge.svg sind unreferenziert" war falsch - der Grep hatte icons/ herausgefiltert. Alle vier Logo-SVGs sind importiert und im Bundle; gerendert wird im Widget trotzdem keins, jeweils durch dieselbe HeaderStyle.Standard-Bedingung gesperrt. Das ist der belastbarere Befund, weil er an der Render-Bedingung haengt statt an einem Suchtreffer.
Refs axion1337.chat/threadnet-call#2
VITE_PRODUCT_NAME ist upstream bereits an jeder Stelle vorgesehen (import.meta.env.VITE_PRODUCT_NAME || "Element Call"). Sie in .env.production zu setzen benennt das Widget vollstaendig um, ohne eine einzige Quelldatei anzufassen - also ohne Merge-Reibung beim naechsten Upstream-Update.
Die Inventur in docs/axion1337-fork.md haelt fest, was dadurch tatsaechlich umbenannt wird und was im Embedded-Build ohnehin nie erscheint: die Logo-SVGs rendern nur bei HeaderStyle.Standard, dem Nicht-Widget-Default; Startseite und Login gibt es nur standalone. Die deutschen matrixRTCMode-Beschreibungen bleiben bewusst stehen - sie reden ueber fremde Gegenstellen, nicht ueber uns.
Refs axion1337.chat/threadnet-call#2
Registry-Entscheidung evidenzbasiert: das Package ist pnpm-Dependency von
ThreadNet-Webs apps/web, der Lockfile pinnt die Tarball-URL auf rohana -
Registry bleibt dort. Publish-Auth ueber CI-Variable GITEA_NPM_TOKEN statt
lokaler Klartext-.npmrc.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>