Repository navigation
Releases: DejavuMoe/edgeTTS
Release list
edgeTTS 0.9.6
Changes
Fixed
- Keep synthesis running when Escape dismisses the interface language menu. An unhandled Escape still cancels the active request.
- Block synthesis while a TXT import is pending, including keyboard shortcuts, so the request and editor cannot refer to different text. Preserve edits and clears that supersede a read.
- Clear an unavailable active voice when a refreshed catalog is empty, and allow the favorites filter to be turned off after its last matching voice disappears.
- Remove the UTF-8 import BOM exactly once, preserving a leading U+FEFF in the actual content and enforcing the 20,000-code-point limit against the preserved text.
- Preserve idle timeout failures between audio reads instead of reporting a successful end. Cancel abandoned WebSocket initialization and ignore delayed close events from replaced sockets.
- Map upstream failures on the first audio read to HTTP 502 for both speech APIs, before streaming headers are committed.
- Apply immutable caching only to assets inside the web root; a parent directory named
assetsno longer causes the HTML entry point to be cached for a year. - Use the configured
PORTin the container healthcheck, retaining 8080 as the default. - Recheck the highest published stable version before writing a GitHub release, so a delayed older release cannot move GitHub's latest marker backward.
- Give Nginx proxy test runs unique container names and clean up only resources they created.
- Discard and close segmented audio that arrives after iterator return, and preserve cancellation errors in non-segmented streams while releasing concurrency permits exactly once.
- Share an in-flight voice catalog refresh without sharing callers' failure policies: ordinary reads may use the cached catalog, while forced refreshes still report upstream failures.
- Keep reading the complete audio response when the browser's MediaSource quota is exhausted. Preserve buffered preview playback, then switch to the full downloadable recording while retaining playback position and paused state.
Compatibility
- Existing API shapes, authentication, configuration and text limits are unchanged. The fixes include regression coverage for all 16 confirmed audit findings and the MediaSource quota case.
See the changelog for details.
Upgrade
Check the changes above for compatibility notes. Update your Compose image to ghcr.io/dejavumoe/edgetts:0.9.6, retain your .env, then run:
docker compose pull edgetts
docker compose up -d edgettsA single-instance replacement can interrupt active streams. Use the immutable digest below for reproducible deployment and rollback.
Verification
- Tag
v0.9.6points to commitc7cf10baa055177b7f3d7aea05f709c52650bc51. - Tag CI passed quality, Docker runtime, Nginx proxy and multi-architecture publication checks.
- Registry checks confirmed
linux/amd64,linux/arm64, SLSA provenance and SPDX SBOM attestations. Thesha-c7cf10baa055177b7f3d7aea05f709c52650bc51,0.9.6andlatestreferences resolve to the same OCI index.
Container distribution
- Version:
ghcr.io/dejavumoe/edgetts:0.9.6 - Latest:
ghcr.io/dejavumoe/edgetts:latest - Immutable OCI index:
ghcr.io/dejavumoe/edgetts@sha256:2ae9711b4d8dfc7cffea6dc39e9755a9d41983e77fbc5a3ba25e3bf156a20cc0 linux/amd64:sha256:b809870c601c6d28a8e9bc9041e1fd3948d962d3805171695ce6569a1a21d3dflinux/arm64:sha256:336b0b9cddeeafdea944d0adb936464f25ed42836adf801a85d70e3bd458ccde
edgeTTS 0.9.5
Changes
Changed
- Switch the production container and healthcheck to Bun
1.4.2, pinned by image digest. Keep Node.js and pnpm for source builds and bare-metal deployments. Preserve API contracts, environment variables, port 8080 and the existing non-root UID/GID 1000. - Reduce the amd64 container root filesystem from about 160 MiB to 97 MiB with the Bun musl runtime and pruned dependency tests, examples and documentation. Preserve ICU, TLS, runtime and package licenses, the WebUI and both speech APIs; enforce a 105 MiB image budget in CI.
- Build the platform-independent JavaScript once on the builder's native CPU, reuse the build cache in CI, and compress published layers with gzip level 9. Both target architectures run an offline final-image contract check, including real HTTP streaming, disconnect cancellation and queue release, before publication completes. CI also verifies graceful SIGTERM shutdown.
- Avoid allocating Unicode offset tables when short text already fits in a single segment.
Security
- Authenticate protected routes before reading or parsing request bodies. Missing or invalid credentials take precedence over malformed or oversized bodies; authenticated request validation and the public health/WebUI routes are unchanged.
- Make container application code and assets root-owned so the non-root service cannot replace them, and exclude nested environment and npm configuration files from the build context.
- Update Fastify to
5.12.5, fast-uri to3.1.8/4.2.1, and ip-address to10.7.3within existing dependency ranges, resolving the six known production dependency audit findings.
See the changelog for details.
Upgrade
Check the changes above for compatibility notes. Update your Compose image to ghcr.io/dejavumoe/edgetts:0.9.5, retain your .env, then run:
docker compose pull edgetts
docker compose up -d edgettsA single-instance replacement can interrupt active streams. Use the immutable digest below for reproducible deployment and rollback.
Verification
- Tag
v0.9.5points to commit7148b5f854839554d3ff3b00f127787fca7c6de9. - Tag CI passed quality, Docker runtime, Nginx proxy and multi-architecture publication checks.
- Registry checks confirmed
linux/amd64,linux/arm64, SLSA provenance and SPDX SBOM attestations. Thesha-7148b5f854839554d3ff3b00f127787fca7c6de9,0.9.5andlatestreferences resolve to the same OCI index.
Container distribution
- Version:
ghcr.io/dejavumoe/edgetts:0.9.5 - Latest:
ghcr.io/dejavumoe/edgetts:latest - Immutable OCI index:
ghcr.io/dejavumoe/edgetts@sha256:9af0ad3c6a1b743d9b97702913b255cc60050efea3185659946680eec24d9cc6 linux/amd64:sha256:8dcc65a7924b8ac16ab6c3f55ccedcec6bab863564a499fb8fdeb464f678ab78linux/arm64:sha256:7d8fff7370cf9ac4afdb2cf0eb4f5d9abd2166a14dfc3f9628a8b5e48507e3de
edgeTTS 0.9.4
Changes
Added
- STranslate integration instructions in the English, Chinese and Japanese guides, with links to the edgeTTS plugin and its installation package. The guides cover API token authentication, automatic voice discovery, and native and OpenAI-compatible speech APIs.
Changed
- Stable tag builds now create the GitHub release after the container image passes verification. Release notes include the changelog, upgrade instructions, and immutable multi-architecture image references.
Security
- Update transitive
brace-expansiondependencies from5.0.9to5.0.12and from1.1.18to1.1.21, addressing recursion denial-of-service advisories and restoring the production dependency audit without advisory exclusions.
See the changelog for details.
Upgrade
Check the changes above for compatibility notes. Update your Compose image to ghcr.io/dejavumoe/edgetts:0.9.4, retain your .env, then run:
docker compose pull edgetts
docker compose up -d edgettsA single-instance replacement can interrupt active streams. Use the immutable digest below for reproducible deployment and rollback.
Verification
-
This release entry was created manually after a missing executable permission blocked the automatic step. The script permission fix is on main; the verified release tag and image digests are unchanged.
-
Tag
v0.9.4points to commit758ebb4af126a6ad27a086436928ea55642416a2. -
Tag CI passed quality, Docker runtime, Nginx proxy and multi-architecture publication checks.
-
Registry checks confirmed
linux/amd64,linux/arm64, SLSA provenance and SPDX SBOM attestations. Thesha-758ebb4af126a6ad27a086436928ea55642416a2,0.9.4andlatestreferences resolve to the same OCI index.
Container distribution
- Version:
ghcr.io/dejavumoe/edgetts:0.9.4 - Latest:
ghcr.io/dejavumoe/edgetts:latest - Immutable OCI index:
ghcr.io/dejavumoe/edgetts@sha256:f780306adc39c5bb3a58f9e45632010085aee0995b7c1b285fd061fca0fbe1f2 linux/amd64:sha256:6fe79d582c4255fd9ba6af1a5eb1f41971c27d2418fbc4ad84d1026e32b4cf07linux/arm64:sha256:c83de52828232f4c447d8efb866d984b1faf07e301c5c33b30bd7e8621575989
edgeTTS 0.9.2
Changes
Added
- Every voice has a portrait, drawn locally with DiceBear's Dylan style. The locale picks skin tones and hair colours common where the voice's language is spoken, and the gender picks the haircut; the voice ID seeds the choice, so each voice keeps its face. Portraits load in their own chunk after the first paint, with the monogram in their place until then.
- The web app has a favicon, Apple touch icon, web app manifest, description and Open Graph metadata, and the page title follows the interface language.
Changed
- The logo is redrawn as lines of text, one of them breaking into a waveform.
- The container image is built on Alpine: the runtime stage is plain
alpine:3.24with the Node binary andlibstdc++only, without npm, npx, Yarn or Corepack, and source maps, type declarations and Markdown files are pruned from its dependencies. The unpacked image shrinks from about 280 MB to 168 MB, and the compressed download from 85 MB to 55 MB. Thenodeuser keeps UID/GID 1000.
Fixed
- The finished take's waveform now draws when the web app is served by edgeTTS. The Content Security Policy blocked the browser from reading the take back from its local Blob URL, so the plain timeline was always shown;
connect-srcnow allowsblob:alongside the page's origin.
See the changelog for details.
Upgrade
Check the changes above for compatibility notes. Update your Compose image to ghcr.io/dejavumoe/edgetts:0.9.2, retain your .env, then run:
docker compose pull edgetts
docker compose up -d edgettsA single-instance replacement can interrupt active streams. Use the immutable digest below for reproducible deployment and rollback.
Verification
- Tag
v0.9.2points to commit10fd249b388d803cd8c4c9880c4fc50028279c80. - Tag CI passed quality, Docker runtime, Nginx proxy and multi-architecture publication checks.
- Registry checks confirmed
linux/amd64,linux/arm64, SLSA provenance and SPDX SBOM attestations. Thesha-10fd249b388d803cd8c4c9880c4fc50028279c80,0.9.2andlatestreferences resolve to the same OCI index.
Container distribution
- Version:
ghcr.io/dejavumoe/edgetts:0.9.2 - Latest:
ghcr.io/dejavumoe/edgetts:latest - Immutable OCI index:
ghcr.io/dejavumoe/edgetts@sha256:e188d86b2a933b4306d4657dc26c5fb445c77d0f9cce041900addfc284661197 linux/amd64:sha256:d0a6cd57f2fba2976b5ebbdf5af9a48b5fb22dde780c14968d619fd3925f90f5linux/arm64:sha256:053b1b7baf0613da1e8dd6987a86d0c9bd84d335e9b95f56171d6c93cbfebe3b
edgeTTS 0.9.1
Changes
- Cancelled non-segmented synthesis now closes late upstream audio and returns
AbortErrorinstead of an empty successful stream. - Voice discovery timeouts now abort the underlying HTTP request, so abandoned requests do not accumulate across retries.
- Completed audio above 12 MiB skips an unnecessary Blob read before waveform decoding. Playback and the plain timeline are unchanged.
See the changelog for details.
Upgrade
The HTTP API, configuration, authentication and audio formats are unchanged. Update your Compose image to ghcr.io/dejavumoe/edgetts:0.9.1, retain your .env, then run:
docker compose pull edgetts
docker compose up -d edgettsA single-instance replacement can interrupt active streams. Use the immutable digest below for reproducible deployment and rollback.
Verification
- Signed tag
v0.9.1points to commit11dfd95f9f3dfbe9d5cbaf61fdd65e0e7fa5a9d4. - Tag CI passed quality, Docker runtime, Nginx proxy and multi-architecture publication checks.
- Registry checks confirmed
linux/amd64,linux/arm64, SLSA provenance and SPDX SBOM attestations. The testedsha-11dfd95f9f3dfbe9d5cbaf61fdd65e0e7fa5a9d4,0.9.1andlatestreferences resolve to the same OCI index.
Container distribution
- Version:
ghcr.io/dejavumoe/edgetts:0.9.1 - Latest:
ghcr.io/dejavumoe/edgetts:latest - Immutable OCI index:
ghcr.io/dejavumoe/edgetts@sha256:ff9643bcd0ec27a1b35574c7791c042631430cf5fa2697b078d9fb4381be06f1 linux/amd64:sha256:376f5389cd53cf9bfc9f6c513f7326f4d81d88f91c733f2d2c27734c1cf769f2linux/arm64:sha256:da52b9c80ab9b83fe9721b519577778ae50dcd07c0b83f8bc684af9bc3008104
edgeTTS 0.9.0
Changes
- A workbench laid out in working order. The synthesize button ends the text, next to the character count, like a send button. The result appears directly below the text, and voice and delivery settings fill a full-height panel on the right. On phones the page reads top to bottom (text, synthesize, result, settings) with nothing pinned over the content.
- See the take you made. The finished audio is drawn as its own waveform, decoded locally in your browser, with the played part in the accent colour and a time readout under the pointer. Click or drag to seek; keyboard, touch and screen readers use the same slider as before. Nothing is uploaded. Takes above 12 MiB, or in browsers that cannot decode them, keep the plain timeline.
- A clear result line. The take shows the short voice name and its settings (
Xiaoxiao · 标准 · 1.00× · 2 段 · 573 KiB); the full voice name and ID are in its tooltip. - Voices you can tell apart. Every voice has a monogram in its own stable colour, and while a take is synthesizing, a row of bars shows the voice forming.
- Polish throughout. Quality options are vertically centred, sliders show label and value above a full-width track with a compact reset, hover and focus states are consistent across controls, and stray accent lines and side stripes are gone. Phone and laptop layouts were fixed so nothing overlaps or gets cut off.
See the changelog for details.
Upgrade
The HTTP API, configuration variables, authentication, audio formats, download filenames and browser-stored preferences and favorites are unchanged. Update the image reference in your compose.yaml to ghcr.io/dejavumoe/edgetts:0.9.0, keep your .env, then run:
docker compose pull edgetts
docker compose up -d edgettsA single-instance replacement can interrupt active streams. Pin the verified OCI digest below for reproducible deployment and rollback.
Verification
- Linux build, typecheck, lint, 762 application/package tests, 47 architecture checks, 40 documentation checks, 61 release governance checks and formatting passed;
pnpm audit --prodreports no known high or critical advisories. - The workbench was reviewed at desktop, laptop and phone sizes in light and dark schemes, in Chinese, English and Japanese, with synthesis against the live Microsoft service.
- The upstream integration is unchanged since 0.7.0, so the live smoke tests were not rerun.
Container distribution
- Version:
ghcr.io/dejavumoe/edgetts:0.9.0 - Latest:
ghcr.io/dejavumoe/edgetts:latest - Immutable OCI index:
ghcr.io/dejavumoe/edgetts@sha256:b880d70357e0e83d9a7ace76f6b1c1d7176d3e33f9cb80252c7ac48d4cfb9fbf
edgeTTS 0.8.0
Changes
- Redesigned web workbench. A full-height text sheet sits beside an inspector for voice and delivery settings, with a transport bar pinned to the bottom. The synthesize action, live progress, player and download stay in view, so results no longer appear below the fold.
- Voice list instead of a dropdown. All voices are browsable in one list, grouped by region with names in your interface language, favorites pinned at the top, short speaker names ("Xiaoxiao") and full keyboard navigation.
- Quicker controls. Quality is a two-way choice. Speed, pitch and volume each take one row and offer a reset only when changed.
- New visual style. Warm neutral colors with a single accent, a full dark mode, and WCAG AA text contrast in both schemes, enforced by tests.
- Repository layout. Guides now live in
docs/en/,docs/zh-CN/anddocs/ja/. Production templates are real files,deploy/compose/compose.yamlanddeploy/systemd/edgetts.service, and the guides are kept identical to them by tests. - The README Quick Start Compose file now matches the deployment guide: configurable host binding (
EDGETTS_BIND_ADDRESS,EDGETTS_HOST_PORT) and the fail-closedREQUIRE_API_KEYdefault.
See the changelog for details.
Upgrade
The HTTP API, configuration variables, authentication, audio formats and browser-stored preferences and favorites are unchanged. Your existing compose.yaml keeps working: update the image reference to ghcr.io/dejavumoe/edgetts:0.8.0, keep your .env, then run:
docker compose pull edgetts
docker compose up -d edgettsDocumentation URLs changed. For example, docs/deployment.md is now docs/en/deployment.md; update any bookmarks. A single-instance replacement can interrupt active streams. Pin the verified OCI digest below for reproducible deployment and rollback.
Verification
- Linux build, typecheck, lint, 748 application/package tests, 47 architecture checks, 40 documentation checks, 61 release governance checks and formatting passed.
- The new interface was reviewed in a browser against the live Microsoft service at desktop, laptop and phone sizes, in light and dark schemes.
pnpm audit --prodreports no known vulnerabilities. The upstream integration is unchanged since 0.7.0, so the live smoke tests were not rerun.
Container distribution
- Version:
ghcr.io/dejavumoe/edgetts:0.8.0 - Latest:
ghcr.io/dejavumoe/edgetts:latest - Immutable OCI index:
ghcr.io/dejavumoe/edgetts@sha256:5e7d9df60402f291b462b253c865025fd2c0a75f85e0476404191af1f8c8eac7
edgeTTS 0.7.0
Changes
- Faster long-text synthesis: all segments of a request now share one upstream connection. In live measurements, median delivery time for an 8-segment text fell from 21.7 s to 11.2 s, and upstream connections from 8 to 1.
400 UNKNOWN_VOICEfor voices absent from a fresh cached voice catalog. The check never fetches the catalog, so synthesis never waits on voice discovery.- New configuration:
SPEECH_RATE_LIMIT_SCOPE=ip(per-address speech budget),TRUST_PROXY, and capacity/timeout tuning (SYNTHESIS_MAX_CONCURRENT,SYNTHESIS_MAX_QUEUED,VOICE_CACHE_TTL_MS,EDGE_*_TIMEOUT_MS). - Optional Prometheus metrics at
/api/metricsbehind the API key (METRICS_ENABLED=true). - Generated OpenAPI description:
docs/openapi.json. - Startup validates every environment variable at once and lists all problems. Invalid-request logs no longer contain rejected values.
- Internal: lint-enforced architecture boundaries, type-aware linting, a refactored web workbench, multilingual documentation checks, and a production dependency audit in CI. See the architecture decisions and the changelog.
Upgrade
API fields, authentication requirements, default concurrency limits and MP3 formats are unchanged. Two defaults are stricter:
- An unrecognized
SERVE_STATICvalue now aborts startup instead of being ignored. Usetrueorfalse, or leave it unset. - Request bodies are limited to 256 KiB (previously 1 MiB). Every valid request still fits, including 20,000 code points of fully escaped text.
Preserve your existing .env, update the image reference to ghcr.io/dejavumoe/edgetts:0.7.0, then run:
docker compose pull edgetts
docker compose up -d edgettsA single-instance replacement can interrupt active streams. Pin the verified OCI digest below for reproducible deployment and rollback.
Verification
- Linux build, typecheck, lint, 728 application/package tests, 47 architecture checks, 29 documentation checks, 61 release governance checks and formatting passed.
- Live Microsoft smoke tests passed for the provider, the service and the HTTP server.
pnpm audit --prodreports no known vulnerabilities.
Container distribution
- Version:
ghcr.io/dejavumoe/edgetts:0.7.0 - Latest:
ghcr.io/dejavumoe/edgetts:latest - Immutable OCI index:
ghcr.io/dejavumoe/edgetts@sha256:a1bbc6ceff83a683514b2a3d9841df0405e61166700908ca6852a82356229d4c
edgeTTS 0.6.0
Changes
- Fix crashes caused by late Edge WebSocket frames arriving after synthesis cancellation, with regression coverage against the real dependency and a local WebSocket server.
- Add reproducible ablation experiments and fixed-load checks for voice caching, request coalescing, bounded queues and playback progress throttling.
- Remove an unused rate-limit option while preserving the shared speech quota across both endpoints.
- Make disconnect-test cleanup deterministic on Linux and await localization-test initialization without React update warnings.
- Add architecture diagrams to the English, Chinese and Japanese READMEs, simplify deployment/API documentation, and enforce LF text checkout rules.
Upgrade
API fields, authentication requirements, concurrency limits and MP3 formats remain unchanged. Preserve your existing .env, update the image reference to ghcr.io/dejavumoe/edgetts:0.6.0, then run:
docker compose pull edgetts
docker compose up -d edgettsA single-instance replacement can interrupt active streams. Pin the verified OCI digest below for reproducible deployment and rollback.
Verification
- Linux build, typecheck, lint, 635 application/package tests and formatting passed.
- Windows
pnpm testpassed, including 57 release governance checks. - Existing Microsoft integration contracts are covered by local deterministic tests; this release does not claim new live Microsoft synthesis qualification.
Container distribution
- Version:
ghcr.io/dejavumoe/edgetts:0.6.0 - Latest:
ghcr.io/dejavumoe/edgetts:latest - Immutable OCI index:
ghcr.io/dejavumoe/edgetts@sha256:e8a9975393c217609b39f8346f3789a720bfa979d65ffeff02a3ea90551fb6fe - linux/amd64:
sha256:2846a94413d0881d785ed2dca611f27ac1dcbde4a89adbce71e313d265463099 - linux/arm64:
sha256:e819598f272ff7639c16c331d1dfd7c370dd10b99c6f4f2295d4bc8c93c81e75 - The version and latest aliases resolve to the same verified index, including both runtime architectures and provenance/SBOM attestations.
- Release commit:
af34fd15b4f191b2a0e04c102e8b2c5f3d7305ab - Successful release CI: quality, Docker image contract, deterministic Nginx contract, and multi-architecture publication all passed.
Full changelog: v0.5.0...v0.6.0
edgeTTS 0.5.0
Changes
- Require an API key by default when
NODE_ENV=production, while keeping explicit external-auth mode and local development available. - Add browser security headers and a Content Security Policy compatible with the workbench's controls and Blob audio playback.
- Normalize framework and unexpected HTTP errors into the documented JSON envelope without exposing internal error details.
- Limit voice discovery to 60 authenticated requests per minute per process, independently of the shared speech budget.
- Expire synthesis queue waits after 30 seconds with
503 SERVER_BUSY, while preserving admitted streams and cleaning up cancellation timers. - Fix browser cancellation after response headers, including Blob fallback downloads, and keep JSON timeouts active through response-body reads.
- Clarify Microsoft online text transmission in all four UI languages and align the English, Chinese and Japanese deployment and API documentation.
- Fix source-deployment API key generation, move systemd keys out of public unit files, and leave container shutdown time for the server to exit.
- Remove obsolete audit material, duplicate documentation and unused code; include release guard checks in the standard test command.
Upgrade notes
- Production authentication: set a valid
API_KEYbefore upgrading. If authentication is provided by a trusted external gateway, explicitly setREQUIRE_API_KEY=falseand leaveAPI_KEYunset. Setting this flag to false does not disable verification of an existing key. - Preserve the existing
.envfile and change the deployment image toghcr.io/dejavumoe/edgetts:0.5.0, then rundocker compose pull edgettsanddocker compose up -d edgetts. - Both speech routes still share a process-wide admission budget; this release does not introduce per-tenant quotas. Audio request fields and MP3 output remain unchanged.
- Queued clients can now receive
503 SERVER_BUSYafter 30 seconds. A single-instance upgrade may interrupt active audio streams.
Verification
- Build, typecheck, lint, formatting and diff checks passed.
- 624 tests and 57 release guard checks passed locally.
- This release does not claim new live Microsoft synthesis qualification. The preceding fixes were checked with desktop MediaSource and mobile-sized Blob playback in Chromium against a local simulated service.
Container distribution
- Version:
ghcr.io/dejavumoe/edgetts:0.5.0 - Latest:
ghcr.io/dejavumoe/edgetts:latest - Immutable OCI index:
ghcr.io/dejavumoe/edgetts@sha256:0f7b63eef9d013202207e4eb67a3a980a1e8a2ef47046977e0a0bc4bb1468264 - linux/amd64:
sha256:79980478645c2bebc787184fab5a6850b0f6d07d331d7c4e591ecb376f00a25c - linux/arm64:
sha256:8492cd072d64c75e5a19697b8392d12b79acb352331528c8e0ac7835b24fd1c9 - Both runtime architectures include SLSA provenance and SPDX SBOM attestations. The version and latest aliases resolve to the same verified index.
- Release commit:
e896e9626de2d710c08278da15257fc7a8f66225 - Successful release CI
Full changelog: v0.4.0...v0.5.0