❌

Normale weergave

Release 2026.09.26

26 September 2026 om 09:50

Docker Images

Docker images have been built and pushed:

Docker Hub:

  • alexta69/metube:latest
  • alexta69/metube:2026.09.26

GitHub Container Registry:

  • ghcr.io/alexta69/metube:latest
  • ghcr.io/alexta69/metube:2026.09.26

Changes

  • chore: upgrade Python and frontend dependencies (f5e5ab3)
  • fix: say when an add is skipped because the video is in the download archive (98b0b10)
  • feat: Auto audio format and a Tags choice for what gets written into the file (ee2bb0b)
  • docs: reword the contribution guidance (d959cbc)
  • ci: warn when the README passes a 15,000-byte budget (04ebfb8)
  • docs: restructure the README as a landing page and variable reference (d310bcc)
  • docs: state in SECURITY.md that MeTube does not request CVEs (f319b26)

  •  

OBS Studio 33.0.0 Beta 4

3 Oktober 2026 om 01:26

Beta 4 Changes

  • Fixed a CI and packaging issue. There are no application changes since Beta 1.

Beta 3 Changes

  • Fixed a CI issue. There are no application changes since Beta 1.

Beta 2 Changes

  • Fixed a versioning issue. There are no application changes since Beta 1.

33.0 New Features

  • Updated CEF from 127/6533 to 150/7871 [WizardCM] (#13900)
    • This is a massive update to the underlying framework used for browser sources and docks from the July 2024 release to September 2026
    • All of this work is on the backend and should be invisible to users. Please be sure to report any new weirdness or problems you run into with browser sources!
  • Complete overhaul to plugin loading [FiniteSingularity/PatTheMav] (#13594)
    • First-party plugins are now in a new folder named core
    • Third-party plugins have an updated installation location and folder structure
    • Existing third-party plugins will continue to load from the legacy locations until OBS Studio 34.0
    • More information is available in our knowledge base article.
  • Improved how source snapping works in the preview [Warchamp7] (#12298)
    • New visual indicator added
    • Sources now snap along the entire axis instead of only when directly touching
    • Sources no longer snap to hidden sources
  • Improved behavior of spinboxes for number values [Warchamp7] (#12337)
    • Typing is no longer mysteriously blocked in some situations
    • Numbers are no longer cut off in some situations
    • Values now update only after pressing Enter and Enter does not close the window
    • Holding Shift + Up/Down now advances multiple steps at a time
    • Dragging the cursor inside the input but outside the text itself now works properly
  • Enabled NVENC on Arm64 [RytoEX] (#13827)

33.0 Changes

  • Added a check for encoders being missing when loading a profile [derrod] (#11340)
  • Added support for newest NVIDIA Broadcast SDKs for NVIDIA Audio Effects and Video Effects [pkviet] (#13838)
  • Added hotkeys for controlling audio monitoring of a source [Warchamp7] (#13599)
  • Fixed issues with groups in Studio Mode [Warchamp7] (#11092)
    • Fixed moving sources inside a group causing them to glitch out in Program
    • Fixed moving sources inside a group showing up live in Program
  • Adjusted naming of Window Capture methods on Windows [Penwy] (#12047)
  • Improved detection of fullscreen games for Game Capture [Kira-NT] (#10880)
  • Improved transparency handling for macOS Screen Capture [jcm93] (#13030)
  • Scaled simple output recording audio bitrate by channel count [nickvonkaenel] (#13311)
  • Removed support for Ubuntu 24.04

33.0 Bug Fixes

  • Added a startup error if obs-transitions failed to load [notr1ch] (#13321)
  • Improved file splitting for Hybrid MP4/MOV [derrod] (#13386)
  • Fixed outputs getting stuck running when a bad rescale output resolution is set [suogesi] (#13375)
  • Fixed monitoring icon state getting desynced when using third-party tools or websockets [prgmitchell] (#13822)
  • Fixed potential crash when shader cache file is invalid [notr1ch] (#13538)
  • Fixed a potential crash on Linux when USB mic is removed [R0te/RytoEX] (#13922)
  • Fixed a potential crash when renaming a source with the Add Source window open [Warchamp7] (#13800)
  • Fixed a potential deadlock during video/audio tasks [exeldro] (#13579)
  • Fixed an issue with B-frame offset calculation in AMF that could cause streams to disconnect [lexano-ivs] (#13762)
  • Fixed PipeWire screencast sources being duplicated in studio mode [tytan652] (#13673)
  • Fixed a potential crash when switching off a newly created profile [Warchamp7] (#13182)
  • Fixed a source toolbar crash when source type is missing [Penwy] (#13539)

33.0 Developer Information

  • Added frontend event and output signal for replay buffer saving [Penwy] (#8955)
  • Added guidance regarding the theme system to the top of all theme files [Warchamp7] (#13733)
  • Added ability to set a file extension filter for OBS_PATH_FILE_SAVE path types [FiniteSingularity] (#10190)
  • Added obs_frontend_is_safe_mode for first-party plugins
    • Third-party plugins are not loaded at all in Safe Mode
  • Added versions to Flatpak plugin extension point [tytan652] (#13735)
  • Updated libnsgif to 1.0.0 [RytoEX] (#11178)
    • This is a breaking change for any plugins using libobs/graphics gs_image_file
  • Clarified documentation for obs_module_unload [notr1ch] (#13327)
  • Required MbedTLS 3 and exclude 4 or later [tytan652] (#13799)
  • Fixed repeated preview enable/disables not working [WarmUpTill] (#12580)
  • Only emit core signal handlers for public canvases [tt2468] (#13574)
  • Deprecated unused hidden API for sources [derrod] (#13122)
  • Deprecated APIs for audio source monitoring_type [Warchamp7] (#13599)
    • This is replaced by a new monitoring_enabled boolean

Checksums

OBS-Studio-33.0.0-beta4-Sources.tar.gz: 71f33df72e454d53c0eb1e706441e2b24c475acc3ac259b8c071e9707ad10eb7
OBS-Studio-33.0.0-beta4-Ubuntu-26.04-x86_64-dbsym.ddeb: 9be1bbd516cb9b62be1adb381be44c026f197c9c206c90d06381d4eb6baf99d4
OBS-Studio-33.0.0-beta4-Ubuntu-26.04-x86_64.deb: 055db4d5cb1099b106d67645f84bc076ad1409836a0b603a35f393e1aa063a1d
OBS-Studio-33.0.0-beta4-Windows-arm64-PDBs.zip: a1e5095bd3b20bd3703cd2a2e97dc9735f5bb08513218d463edb1e9b88376d10
OBS-Studio-33.0.0-beta4-Windows-arm64.zip: c8bdbd9963e9bbdaf5e8ffaa7536ce6edd4ac583bec560fff69a5dee532ac111
OBS-Studio-33.0.0-beta4-Windows-x64-Installer.exe: 28323560c1585d51a290984777e980ef8788cd3210f150993ccbd9ee62484d8a
OBS-Studio-33.0.0-beta4-Windows-x64-PDBs.zip: 4825a54748ff65dde606537042df5b8eae634e89bb419eb93439907e97963268
OBS-Studio-33.0.0-beta4-Windows-x64.zip: 0a6d97ed2fb4d4c4cd3669eeaf063365e89ce72b602dc101659fc135f047359e
OBS-Studio-33.0.0-beta4-macOS-Apple-dSYMs.tar.xz: 58c55f934334a51e49b26baa627da34ee60909fbc74dc1c10e8f2469b6156c92
OBS-Studio-33.0.0-beta4-macOS-Apple.dmg: ecaba68924c83e96a300ba58412da04f0f469f331f88c10e7a74c6117e6e41f3
OBS-Studio-33.0.0-beta4-macOS-Intel-dSYMs.tar.xz: cadfe8423ba34900543a68b8a394c74efce632395260386c85c3d0ba6fb969cb
OBS-Studio-33.0.0-beta4-macOS-Intel.dmg: 47461ba641b88375da22f1fd74f476277ca5156fbbf54e0536b5f0eae487e2d5

  •  

Release 2026.09.25

25 September 2026 om 09:03

Docker Images

Docker images have been built and pushed:

Docker Hub:

  • alexta69/metube:latest
  • alexta69/metube:2026.09.25

GitHub Container Registry:

  • ghcr.io/alexta69/metube:latest
  • ghcr.io/alexta69/metube:2026.09.25

⚠️ Action needed for bookmarklet users

MeTube now refuses requests sent from other websites unless their origin is listed in CORS_ALLOWED_ORIGINS. This closes a security hole (GHSA-cxj8-27g9-669f). If you use a bookmarklet, add the sites you use it on, e.g. CORS_ALLOWED_ORIGINS=https://www.youtube.com. Details in #1085.

Changes

  • docs: point readers at the wiki from the README top and the issue forms (dfe3daa)
  • fix: let a refused bookmarklet see why it was refused (e165b36)
  • test: pin that scheme-less internal URLs are refused before any fetch (2979e3a)
  • fix: refuse state-changing requests and socket connections from other sites (772a16c)

  •  

v0.8.8

25 September 2026 om 06:16

What's Changed

  • feat(hid): recognise Nano receiver 046d:c534 (MK270, MK295) by @4ni1ak in #1456
  • fix(agent): divert a single-bound gesture button by @pseudoseed in #1569
  • fix(gui): restore per-app profile removal and add reset controls by @AprilNEA in #1580
  • fix(gui): prefer firmware codename over catalog name for M650 variants by @4ni1ak in #1366
  • refactor(gui): simplify variant name correction ownership by @AprilNEA in #1585
  • chore: release v0.8.8 by @AprilNEA[bot] in #1573

New Contributors

Full Changelog: v0.8.7...v0.8.8

  •  

v0.20.0-rc.6

24 September 2026 om 04:45

❗ This is a pre-release

  • May contain bugs and unfinished features.

⚠️ Note for macOS users

Builds are unsigned (no Apple Developer ID). After dragging MarkText into Applications, clear the quarantine flag once:

xattr -cr /Applications/marktext.app

Verifying downloads

All artifacts are listed with their SHA-256 in SHA256SUMS.txt. Verify with:

sha256sum -c SHA256SUMS.txt --ignore-missing

What's Changed

  • docs: explain how to put marktext on PATH on every platform by @Jocs in #5459
  • fix(desktop): wrap long code-block lines when exporting to PDF (#5307) by @Jocs in #5460
  • fix(desktop): restore treePathExcludePatterns filtering in the sidebar tree by @Jocs in #5461
  • fix(desktop): require deliberate movement before a tab click becomes a drag (#4895) by @Jocs in #5464
  • fix(desktop): put the unsaved dot back on the left of the title bar path (#5467) by @Jocs in #5468
  • fix(muya): render SVG images that state no size of their own (#4991) by @Jocs in #5462
  • fix(muya): bound inline math by the text column, not by its own box (#5034) by @Jocs in #5466
  • fix(muya): give every mermaid render its own id (#5023) by @Jocs in #5465
  • fix(muya): show the text cursor over the whole editable column (#5477) by @Jocs in #5478
  • feat: support pandoc's backslash TeX math delimiters (#5446) by @Jocs in #5481
  • fix(desktop): theme the table of contents text and arrows (#5094) by @Jocs in #5486
  • fix(desktop): tell the two backslash math preferences apart in the UI (#5481) by @Jocs in #5485
  • feat(export): convert Markdown to arbitrary formats via Pandoc by @dimbc in #5379
  • fix(desktop): make source mode math highlighting follow the editor (#5483) by @Jocs in #5484
  • fix(desktop): reload an unedited tab silently when its file changes on disk (#3652) by @Jocs in #5479
  • fix(muya): keep footnote definitions packed one per line as siblings by @Jocs in #5487
  • fix(muya): resolve footnote references while escapes are still visible by @Jocs in #5491
  • fix(muya): give each repeated footnote reference its own id and backref by @Jocs in #5492
  • feat(i18n): add Russian (ru) localization by @blvcknwh1te in #5496
  • test(muya): stop the deepClone spec from overflowing the stack itself by @Jocs in #5505
  • fix(i18n): give Dutch users the Dutch editor UI, and hold the language registries together by @Jocs in #5502
  • fix(desktop): resolve local link paths without decoding the document folder (#4749) by @Jocs in #5506
  • test(desktop): repoint the technical-term checks at keys that exist by @Jocs in #5503
  • i18n: improve Russian localization wording by @NeroWolfe75 in #5507
  • feat(toc): highlight active heading based on cursor position by @rkristelijn in #4345
  • docs: update verify the download instructions by @slovanos in #5511
  • fix(desktop): keep the outline title in place, and make its word-wrap preference work by @Jocs in #5514
  • perf(muya): skip a code block re-render that produces identical DOM by @Jocs in #4876
  • fix(muya): re-render a code block when the grammar it renders with changes (#5515) by @Jocs in #5516
  • fix(desktop): stop clipboard image uploads clobbering each other and mangling paths by @Jocs in #5512
  • fix(desktop): retry a save whose rename an SMB share refused (#5322) by @Jocs in #5520
  • fix(desktop): find the uploader the user installed, wherever they installed it (#5518) by @Jocs in #5519
  • fix(desktop): find pandoc the same way the uploader finds picgo (#2751) by @Jocs in #5525
  • Type the .vue CodeMirror/spell-checker handles and forbid any in .vue (#4257) by @Jocs in #5521
  • Type the editor handle as Muya, from the engine's own declarations (#4257) by @Jocs in #5533
  • Drop the legacy muya ambient bridge and its aliases (#4257) by @Jocs in #5526
  • fix(muya): select the clicked line ourselves on a triple-click (#5389) by @Jocs in #5524
  • fix(muya): take the image references from the live DOM after selecting (#5391) by @Jocs in #5534
  • fix(muya): keep an image resize released outside the window (#5393) by @Jocs in #5537
  • fix(muya): size an image from where its resize handle was grabbed (#5392) by @Jocs in #5535
  • fix(muya): cut a cross-block selection from beforeinput too (#5415) by @Jocs in #5536
  • fix: keep the export render container out of the page layout (#5541) by @Jocs in #5542
  • fix(muya): keep a wide equation from scrolling under its own tag (#4339) by @Jocs in #5540

New Contributors

Full Changelog: v0.20.0-rc.5...v0.20.0-rc.6

  •  

Release 2026.09.23

23 September 2026 om 20:20

Docker Images

Docker images have been built and pushed:

Docker Hub:

  • alexta69/metube:latest
  • alexta69/metube:2026.09.23

GitHub Container Registry:

  • ghcr.io/alexta69/metube:latest
  • ghcr.io/alexta69/metube:2026.09.23

Changes

  • fix: stop folder errors from reading as a successful add (closes #1082) (292fe2d)

  •  

v12.4.1

23 September 2026 om 19:00

πŸ› Bug Fixes & Optimizations

  • @directus/api
    • Fixed reading from folders endpoint as non admin (#28286 by @Nitwel)

πŸ“¦ Published Versions

  • @directus/app@18.0.1
  • @directus/api@39.2.1

  •  

v12.4.0

22 September 2026 om 20:54

⚠️ Potential Breaking Changes

Updated MapLibre GL JS from 1.15.3 to 6.9.0 (#28216)
The map layout and the geometry interface now require WebGL2, which MapLibre has mandated since v3. Browsers that only support WebGL1, chiefly Safari 14 and earlier and older Android devices, will no longer render maps.

Dragging with a pointer or a mouse wheel keeps the hovered item popup pinned to the cursor as before. Touch drags no longer reposition it, since the underlying touch event carries no cursor coordinates.

Updated Unhead from 1.11.20 to 3.4.1 (#28248)
@directus/themes now requires @unhead/vue 3.x as a peer dependency. Projects that pair it with their own Unhead instance need to upgrade and follow the v2 and v3 migration guides.

Updated outdated type definitions for directus_comments, directus_flows, directus_operations, directus_presets, directus_roles, and directus_versions (#27956)
The following fields are now correctly marked as nullable:

  • @directus/types: Comment.user_created, Comment.user_updated, FlowRaw.user_created, OperationRaw.options, OperationRaw.user_created, Preset.collection, Role.description, and ContentVersion.hash
  • @directus/sdk: DirectusRole.parent and DirectusVersion.hash

Updated outdated type definitions for directus_relations, directus_policies, directus_shares, directus_access, directus_comments, and directus_versions (#27970)
Breaking changes in @directus/sdk:

  • DirectusRelation.meta and DirectusRelation.schema are now nullable
  • DirectusPolicy.ip_access and DirectusRelation.meta.one_allowed_collections are now correctly typed as string[]

Breaking changes in @directus/types:

  • Policy.enforce_tfa is no longer nullable
  • Share.name, role, password, user_created, date_created and times_used are now nullable

Fixed read permissions not enforced when resolving item keys for updateByQuery and deleteByQuery (#28143)
Update/delete by query now resolves the affected items with the read permissions enforced:

  • Read access to the collection's primary key field is now required.
  • The affected items are scoped to what the role can read, irrespective of update rights.
  • Nested o2m saves require read access on the child collection.

Added native mailtrap email transport support via EMAIL_TRANSPORT=mailtrap (#27873)
The transport is configured through the following environment variables:

  • EMAIL_MAILTRAP_TOKEN β€” an API token from https://mailtrap.io/api-tokens. Required.

  • EMAIL_MAILTRAP_SANDBOX β€” send to the testing inbox instead of real recipients.

  • EMAIL_MAILTRAP_TEST_INBOX_ID β€” which testing inbox to send to. Required in sandbox mode.

  • EMAIL_MAILTRAP_BULK β€” send via the bulk stream. Cannot be combined with sandbox mode.

  • @directus/app

  • @directus/themes

  • @directus/types

    • Updated outdated type definitions for directus_relations, directus_policies, directus_shares, directus_access, directus_comments, and directus_versions (#27970 by @kheiner)
  • @directus/sdk

    • Updated outdated type definitions for directus_relations, directus_policies, directus_shares, directus_access, directus_comments, and directus_versions (#27970 by @kheiner)
    • Removed the unused helper types ToTuple and TupleToUnion (#27956 by @kheiner)

✨ New Features & Improvements

  • @directus/app
    • Disabled inactive collections in the Studio, preventing them from being selected or used while being viewable (#27792 by @br41nslug)
    • Moved Flows into its own module and improved how they're organized and managed, including folders, search and filtering, import and export, and duplication (#28206 by @robluton)
    • Added support for hiding a manual Flow's own button, so it runs only from a Manual Flow field (#28206 by @robluton)
    • Added support for setting the From Name in the Send Email operation (#28206 by @robluton)
  • @directus/api
    • Moved Flows into its own module and improved how they're organized and managed, including folders, search and filtering, import and export, and duplication (#28206 by @robluton)
    • Added support for hiding a manual Flow's own button, so it runs only from a Manual Flow field (#28206 by @robluton)
    • Added support for setting the From Name in the Send Email operation (#28206 by @robluton)
    • Added native mailtrap email transport support via EMAIL_TRANSPORT=mailtrap (#27873 by @tsokolovs)
  • @directus/system-data
    • Moved Flows into its own module and improved how they're organized and managed, including folders, search and filtering, import and export, and duplication (#28206 by @robluton)
  • @directus/specs
    • Moved Flows into its own module and improved how they're organized and managed, including folders, search and filtering, import and export, and duplication (#28206 by @robluton)
  • @directus/types
    • Moved Flows into its own module and improved how they're organized and managed, including folders, search and filtering, import and export, and duplication (#28206 by @robluton)
  • @directus/cli
    • Moved Flows into its own module and improved how they're organized and managed, including folders, search and filtering, import and export, and duplication (#28206 by @robluton)
  • @directus/sdk
    • Moved Flows into its own module and improved how they're organized and managed, including folders, search and filtering, import and export, and duplication (#28206 by @robluton)
  • @directus/env
    • Added native mailtrap email transport support via EMAIL_TRANSPORT=mailtrap (#27873 by @tsokolovs)

πŸ› Bug Fixes & Optimizations

  • @directus/app
    • Fixed the image editor's error notice rendering as an unstyled info message instead of an error (#28245 by @Nitwel)
    • Updated Unhead from 1.11.20 to 3.4.1 (#28248 by @br41nslug)
    • Fixed relational edits made in quick succession saving duplicate create or update entries for the same row, which made the stale entry win and dropped block editor changes inside translations (#28247 by @alvarosabu)
    • Fixed the filter delete (x) button in the search bar's filter popover becoming unclickable on hover. (#28114 by @aniruddhav25)
    • Fixed table row context menus staying open when opening the menu on another row (#28191 by @robluton)
    • Updated outdated type definitions for directus_comments, directus_flows, directus_operations, directus_presets, directus_roles, and directus_versions (#27956 by @kheiner)
    • Updated outdated type definitions for directus_relations, directus_policies, directus_shares, directus_access, directus_comments, and directus_versions (#27970 by @kheiner)
    • Blocked crud usage for inactive collections and added a COLLECTION_INACTIVE error (#27792 by @br41nslug)
    • Updated dompurify, joi, express, qs, uuid, diff, pm2, OpenTelemetry and AI SDK dependencies to address CVEs (#28242 by @br41nslug)
    • Fixed the date picker calendar showing English weekday names and starting the week on Sunday regardless of the user language (#28147 by @lazerg)
    • Replaced lodash with lodash-es in the Studio (#28245 by @Nitwel)
    • Added new DEV_APP_PORT env var for setting the app port while in development mode (#28112 by @robluton)
  • @directus/api
    • Updated outdated type definitions for directus_comments, directus_flows, directus_operations, directus_presets, directus_roles, and directus_versions (#27956 by @kheiner)
    • Updated outdated type definitions for directus_relations, directus_policies, directus_shares, directus_access, directus_comments, and directus_versions (#27970 by @kheiner)
    • Blocked crud usage for inactive collections and added a COLLECTION_INACTIVE error (#27792 by @br41nslug)
    • Updated dompurify, joi, express, qs, uuid, diff, pm2, OpenTelemetry and AI SDK dependencies to address CVEs (#28242 by @br41nslug)
    • Updated stream-json from 1.9.1 to 3.6.0 (#28251 by @br41nslug)
    • Fixed read permissions not enforced when resolving item keys for updateByQuery and deleteByQuery (#28143 by @br41nslug)
    • Fixed relational fields ordering to align with the order of fields in query parameters. (#28197 by @wakqasahmed)
    • Fixed Oracle JSON filtering and json() function returning quoted strings for scalar string values (#28264 by @wofiporia)
    • Fixed schema cache synchronization timeouts leaving stale bus subscriptions and pending timers behind (#28178 by @lazerg)
    • Fixed the global access cache ignoring the client IP (#28190 by @br41nslug)
    • Updated sharp, nodemailer, tiptap, js-yaml and mysql2 dependencies (#28219 by @br41nslug)
    • Fixed the block editor flickering and losing its controls while editing a version (#28105 by @alvarosabu)
    • Fixed schema diff generation for nested metadata additions and removals (#27880 by @thribhuvan003)
    • Fixed FilesService.uploadOne to prevent client payloads from overwriting system fields (e.g., uploaded_by, created_on etc) (#28208 by @br41nslug)
    • Fixed year() function on Oracle returning the ISO week-numbering year instead of the calendar year, and made the Oracle date part functions (year, month, week, day, weekday, hour, minute, second) return numbers instead of zero padded strings (#28257 by @galshir)
    • Fixed uploaded_on not being set for TUS uploads (#28043 by @kheiner)
    • Fixed comment updates and deletes enforcement (#28162 by @kheiner)
    • Fixed foreign key constraints being dropped when updating a relation with a partial payload (#28137 by @lazerg)
    • Updated Flows and Operations tools to automatically fix incorrect X/Y positions for flow operations when used through (#28159 by @bryantgillespie)
      MCP and AI Assistant
  • @directus/types
    • Updated outdated type definitions for directus_comments, directus_flows, directus_operations, directus_presets, directus_roles, and directus_versions (#27956 by @kheiner)
    • Blocked crud usage for inactive collections and added a COLLECTION_INACTIVE error (#27792 by @br41nslug)
  • @directus/sdk
    • Updated outdated type definitions for directus_comments, directus_flows, directus_operations, directus_presets, directus_roles, and directus_versions (#27956 by @kheiner)
    • Added missing empty-parameter validation to readRelationByCollection, createField, deleteCollection, utilsExport, utilsImport, utilitySort, triggerFlow, and readShareInfo (#27970 by @kheiner)
    • Updated known-but-not-enforced string fields on directus_users, directus_settings, directus_deployment_runs (#28129 by @kheiner)
  • @directus/errors
    • Blocked crud usage for inactive collections and added a COLLECTION_INACTIVE error (#27792 by @br41nslug)
  • @directus/schema-builder
    • Blocked crud usage for inactive collections and added a COLLECTION_INACTIVE error (#27792 by @br41nslug)
  • @directus/utils
    • Blocked crud usage for inactive collections and added a COLLECTION_INACTIVE error (#27792 by @br41nslug)
  • @directus/memory
    • Fixed the local key-value store treating equal setMax values as updates (#28172 by @jashkarangiya)
    • Fixed concurrent local KV updates losing increments or overwriting larger values in setMax. (#28194 by @jashkarangiya)
  • @directus/release-notes-generator

πŸ“¦ Published Versions

  • @directus/app@18.0.0
  • @directus/api@39.2.0
  • @directus/cli@12.3.0
  • @directus/composables@11.6.3
  • create-directus-extension@12.1.5
  • @directus/env@6.3.0
  • @directus/errors@2.5.2
  • @directus/extensions@4.0.5
  • @directus/extensions-registry@4.0.4
  • @directus/extensions-sdk@18.0.5
  • @directus/memory@4.0.5
  • @directus/pressure@4.0.5
  • @directus/release-notes-generator@3.0.2
  • @directus/schema-builder@1.0.3
  • @directus/specs@15.2.0
  • @directus/storage-driver-azure@13.0.5
  • @directus/storage-driver-cloudinary@14.0.2
  • @directus/storage-driver-gcs@13.0.5
  • @directus/storage-driver-s3@14.0.2
  • @directus/storage-driver-supabase@5.0.2
  • @directus/system-data@4.7.0
  • @directus/themes@3.0.0
  • @directus/types@17.0.0
  • @directus/utils@13.5.5
  • @directus/validation@3.0.5
  • @directus/sdk@26.0.0

  •  

v0.16.23

21 September 2026 om 11:57

[0.16.23] - 2026-09-21

If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.

Added

  • Expressions: bit_and function.

Changed

Fixed

  • MTA:
    • A mailing list whose recipients include another mailing list is accepted at RCPT TO and then rejected at local delivery with 550 5.5.0 Mailbox not found.
    • DMARC aggregate reports carry two spf elements per record and the version element of a DMARC aggregate report is written as 1 instead of 1.0.
    • DSNs generated for an alias rewrite or a list expansion emit a doubled addr-type in Original-Recipient (rfc822;rfc822;user@example.org).
    • DSNs that cannot be written to the store are discarded, the recipients are flagged as notified and the original message is removed from the queue, losing both the bounce and the message.
  • POP3:
    • TOP msg n counts the n lines from the first byte of the message instead of from the first byte of the body.
    • A message whose very first line begins with . is not byte-stuffed.
  • Spam filter: Moving or copying a message from one account into another creates no training sample, so the classifier never learns from it.
  • Sieve: envelope "orcpt" yields the bare address for an ORCPT supplied over SMTP. It now carries the addr-type prefix in every case, as required by RFC 6009.
  • ACME: The _acme-challenge TXT records published for a DNS-01 authorization are never removed.
  • DNS: The DNSSEC resolver queries a single nameserver at a time, working around a hickory-resolver race that cancels the TCP retry when two nameservers return a truncated response in parallel.
  • Troubleshoot tool:
    • MX records are resolved through the DNSSEC-validating resolver, matching the resolver used by the delivery path.
    • A TLSA lookup that fails or returns bogus records stops the delivery attempt for that host, instead of continuing without DANE.
  • OIDC: Bearer tokens that carry no email, preferred_username or upn claim are always authenticated against the default directory.
  • Meilisearch: A confirmation timeout is treated as a failed write even when failOnTimeout is disabled, so an index whose batches take longer than pollInterval x maxRetries never completes an indexing task and resubmits the same batch indefinitely.
  • WebUI: A failed update no longer takes an Application offline.
  • FoundationDB: The cached read version is invalidated when any broadcast is received from another node.
  • Redis:
    • On a cluster, the rate limiter and the blob upload quota issue INCR and EXPIRE as a MULTI/EXEC transaction, whose MOVED redirects collapse into a single EXECABORT that never refreshes the slot map.
    • A connection that fails because it is addressing the wrong server is returned to the pool and reused, since the recycle check only issues PING.

Check binary attestation here

  •  

v1.21.1

20 September 2026 om 18:18

Fixes and improvements

General

  • require browser POST requests to have an allowed origin (#6238) Browsers can send POST requests without performing any preflight request and without checking whether the request origin is present in Access-Control-Allow-Origin. Intercept these requests and check server-side whether the origin is allowed, blocking the request if it is not.
  • conf: fix comparison and sharing of the default authInternalUsers (#6205)
  • h265: fix DTS extraction of streams with long-term reference pictures (bluenviron/mediacommon#371)
  • pmp4: support stsz with a constant sample size (#5803) (bluenviron/mediacommon#373)
  • pmp4, fmp4: restore check on inbound H265 SPS (bluenviron/mediacommon#374) A valid H265 SPS is required for marshaling back an MP4, so we have to resume checking them.
  • pmp4: support tracks without edts (bluenviron/mediacommon#375) The edit box is optional (ISO/IEC 14496-12, 8.6.5), but tracks without it were rejected with "unexpected box 'mdia'".
  • pmp4: return seek errors from GetPayload (bluenviron/mediacommon#376) GetPayload checked the wrong variable after seeking, therefore a failed seek was ignored and the payload was read from the current position of the reader.
  • pmp4, fmp4: correctly fill HvcC NumTemporalLayers / TemporalIdNested from SPS (bluenviron/mediacommon#379)
  • pmp4: support tracks longer than 2^32 ticks (bluenviron/mediacommon#377)

RTSP

RTMP

HLS

  • make the server manage sessions (#6239) Sessions are now managed by the HLS server, detaching their lifecycle from muxers. This also comes with a performance improvement, since finding a session now traverses a single mutex, and not two channels like before.
  • return 404 when a session is valid but muxer is closed (#5736) (#6240) HLS sessions are now kept open for up to 30 seconds after a muxer is closed. This allows the server to handle incoming requests belonging to these sessions and to classify then as 404 rather than 401.
  • change error returned in case session is not found (#6241) match the RTSP behavior and return a "session not found" message rather than an "authentication error", which is reserved for creating sessions, not for using them.
  • muxer: return 404 when closed (bluenviron/gohlslib#394)

WebRTC

  • fix AV1 getting stuck by stripping padding (#5632) (#5774) (#6242) AV1 OBU padding is generated by several encoders. Stripping it has been demonstrated to solve most situations in which browsers get stuck when playing such streams.
  • fix stuck decoding with DJI drones (#5221) (#6051) (#6243) Streams from DJI drones contain SEI units with payload type 5 and a specific UUID that seem to cause stuck videos on Chrome and Firefox. Filter out these units.
  • add ability to exclude interfaces (#5788)

Dependencies

  • code.cloudfoundry.org/bytefmt updated from v0.88.0 to v0.90.0
  • github.com/MicahParks/keyfunc/v3 updated from v3.8.1 to v3.8.2
  • github.com/abema/go-mp4 updated from v1.7.1 to v1.7.3
  • github.com/bluenviron/gohlslib/v2 updated from v2.4.4 to v2.4.5
  • github.com/bluenviron/gortmplib updated from v1.0.2 to v1.0.3
  • github.com/bluenviron/gortsplib/v5 updated from v5.6.5 to v5.6.6
  • github.com/bluenviron/mediacommon/v2 updated from v2.9.4 to v2.9.5
  • github.com/gin-contrib/pprof updated from v1.5.4 to v1.5.5
  • github.com/matthewhartstonge/argon2 updated from v1.5.7 to v1.6.3
  • github.com/pion/ice/v4 updated from v4.4.1 to v4.4.2
  • github.com/pion/interceptor updated from v0.1.47 to v0.1.48
  • github.com/pion/sdp/v3 updated from v3.0.19 to v3.0.20
  • github.com/pion/transport/v4 updated from v4.1.0 to v4.1.1
  • github.com/pion/webrtc/v4 updated from v4.2.19 to v4.2.20
  • golang.org/x/crypto updated from v0.55.0 to v0.57.0
  • golang.org/x/net updated from v0.58.0 to v0.59.0
  • golang.org/x/sync updated from v0.22.0 to v0.23.0
  • golang.org/x/sys updated from v0.47.0 to v0.48.0
  • golang.org/x/term updated from v0.45.0 to v0.46.0
  • github.com/bytedance/gopkg updated from v0.1.3 to v0.1.4
  • github.com/bytedance/sonic updated from v1.15.0 to v1.15.2
  • github.com/bytedance/sonic/loader updated from v0.5.0 to v0.5.1
  • github.com/cloudwego/base64x updated from v0.1.6 to v0.1.7
  • github.com/gabriel-vasile/mimetype updated from v1.4.12 to v1.4.13
  • github.com/gin-contrib/sse updated from v1.1.0 to v1.1.1
  • github.com/go-playground/validator/v10 updated from v10.30.1 to v10.30.3
  • github.com/goccy/go-json updated from v0.10.5 to v0.10.6
  • github.com/klauspost/cpuid/v2 updated from v2.3.0 to v2.4.0
  • github.com/mattn/go-isatty updated from v0.0.20 to v0.0.23
  • github.com/pelletier/go-toml/v2 updated from v2.2.4 to v2.4.3
  • github.com/pion/dtls/v3 updated from v3.1.5 to v3.1.8
  • github.com/pion/mdns/v2 updated from v2.1.0 to v2.2.0
  • github.com/pion/srtp/v3 updated from v3.0.13 to v3.0.15
  • github.com/pion/stun/v3 removed
  • github.com/pion/turn/v5 updated from v5.0.13 to v5.1.0
  • go.mongodb.org/mongo-driver/v2 updated from v2.5.0 to v2.8.0
  • golang.org/x/arch updated from v0.22.0 to v0.29.0
  • golang.org/x/text updated from v0.41.0 to v0.42.0
  • google.golang.org/protobuf updated from v1.36.10 to v1.36.11
  • github.com/pion/stun/v4 v4.0.0 added
  • hls.js updated from v1.7.2 to v1.7.3

Security

Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.

Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:

ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx

You can verify checksums of binaries by downloading checksums.sha256 and running:

cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check

  •  

Release 2026.09.20

20 September 2026 om 09:38

Docker Images

Docker images have been built and pushed:

Docker Hub:

  • alexta69/metube:latest
  • alexta69/metube:2026.09.20

GitHub Container Registry:

  • ghcr.io/alexta69/metube:latest
  • ghcr.io/alexta69/metube:2026.09.20

Changes

  • build: pin the frontend builder image to the last QEMU-safe digest (300bf79)
  • fix: align the row action icons across both download tables (ec01524)
  • fix: stop offering a dead Start button on queued downloads (closes #1081) (a6d81d4)

  •  

v0.8.6

20 September 2026 om 00:06

What's Changed

  • refactor(gui): split app_icon around an AppIconExt trait by @AprilNEA in #1422
  • fix(gui): hold a config reload until the agent connects by @AprilNEA in #1416
  • refactor(ipc): own the client handshake once and guard it with ast-grep by @AprilNEA in #1424
  • refactor(core): name the process roles, host profiles, and environment knobs once by @AprilNEA in #1426
  • refactor(ipc,cli): bound the handshake once and give the CLI one agent door by @AprilNEA in #1427
  • refactor(core): build every worker runtime in one place by @AprilNEA in #1428
  • refactor(core): spell the app bundle's layout once by @AprilNEA in #1429
  • docs(infra): add openlogi workflow skills by @AprilNEA in #1409
  • docs(infra): refine agent guidance and diagnostic workflows by @AprilNEA in #1485
  • refactor(cli): give the command modules that carry code a file of their own by @AprilNEA in #1494
  • refactor(hidpp): split the pending-request queue and the mock channel out of channel.rs by @AprilNEA in #1495
  • refactor(hook): split the macOS backend by responsibility by @AprilNEA in #1496
  • refactor(hook): split the Linux backend into the evdev hook and the foreground watcher by @AprilNEA in #1497
  • chore: drop an unused dependency, a dead parameter, and stale docs by @AprilNEA in #1487
  • refactor(gui): let state mutators own their events and views share one relevance filter by @AprilNEA in #1505
  • refactor(gui): give write-on-release sliders one component by @AprilNEA in #1506
  • refactor(ipc): own the observe loop's connection state in one Observer by @AprilNEA in #1507
  • perf(gui): resolve each device's assets once per asset generation by @AprilNEA in #1508
  • refactor(gui): say what the state types are by @AprilNEA in #1509
  • refactor(core): give the key vocabulary one owner by @AprilNEA in #1488
  • refactor(core): give seven copied decisions one owner each by @AprilNEA in #1489
  • refactor(xtask): spell xtask's waits and its bundle builder in the workspace's vocabulary by @AprilNEA in #1490
  • ci(windows): run the tests on Windows by @AprilNEA in #1491
  • refactor(device): drop the capture paths nothing calls and type the session errors by @AprilNEA in #1500
  • refactor(core): split the config module by concern by @AprilNEA in #1511
  • refactor(device): split the inventory and probe modules by responsibility by @AprilNEA in #1512
  • refactor(device): call durations that bound a wait timeouts by @AprilNEA in #1513
  • refactor(device): run gesture and keyboard capture through one session skeleton by @AprilNEA in #1501
  • refactor(device): share one pending-restore token between capture and host switch by @AprilNEA in #1502
  • refactor(agent): run the capture watchers on one harness and name the device-access handles by @AprilNEA in #1503
  • refactor: say what eight identifiers are by @AprilNEA in #1517
  • refactor(camera): suffix the macOS backends like the other platforms' by @AprilNEA in #1518
  • refactor(gui): move the F-key geometry into function_row/key_points.rs by @AprilNEA in #1525
  • refactor(agent): move the device list and re-apply plan into orchestrator/devices.rs by @AprilNEA in #1526
  • refactor(gui): split the AppState tests by what they exercise by @AprilNEA in #1527
  • refactor(inject): run scripts and workflows once, over four platform hooks by @AprilNEA in #1529
  • refactor(core): split the config tests by what they exercise by @AprilNEA in #1530
  • refactor(device): split the inventory and gesture capture tests by what they exercise by @AprilNEA in #1531
  • refactor(agent): split the orchestrator tests by what they exercise by @AprilNEA in #1532
  • refactor(hidpp): split the channel tests by what they exercise by @AprilNEA in #1533
  • refactor(device): move the host-switch session's tests to host_switch/tests.rs by @AprilNEA in #1535
  • refactor(agent): move the button runtime's worker loop into button/worker.rs by @AprilNEA in #1536
  • refactor(inject): break the macOS injector into scroll, browser and SPI modules by @AprilNEA in #1537
  • refactor(gui): move the mouse view's binding labels and tests out of view.rs by @AprilNEA in #1538
  • refactor(gui): move the camera panel's row builders into controls/rows.rs by @AprilNEA in #1539
  • feat(gui): detect and display installation sources by @AprilNEA in #1515
  • docs(gui): mend the desktop crate's intra-doc links by @AprilNEA in #1541
  • chore: release v0.8.6 by @AprilNEA[bot] in #1481

Full Changelog: v0.8.5...v0.8.6

  •  

v0.20.0-rc.5

19 September 2026 om 18:09

❗ This is a pre-release

  • May contain bugs and unfinished features.

⚠️ Note for macOS users

Builds are unsigned (no Apple Developer ID). After dragging MarkText into Applications, clear the quarantine flag once:

xattr -cr /Applications/marktext.app

Verifying downloads

All artifacts are listed with their SHA-256 in SHA256SUMS.txt. Verify with:

sha256sum -c SHA256SUMS.txt --ignore-missing

What's Changed

  • fix(desktop): load the e2e Playwright config by moving it to the package root by @Fr4ncis in #5435
  • fix(muya): ignore a table tool click once its table left the document (#5442) by @Jocs in #5443
  • docs: add StarDesk as a special sponsor by @Jocs in #5444
  • fix(tests): Windows paths + CI + timeout fix by @dzid26 in #5323
  • ci: check every text file out as LF so the Windows test leg sees the same bytes by @Jocs in #5447
  • ci: bound the unit-test job at ten minutes by @Jocs in #5448
  • fix(desktop): keep title bar path segments in order under the Bidi algorithm by @dronov-dmitry in #5317
  • fix(muya): apply pandoc's tex_math_dollars constraints to $…$ (#5446) by @Jocs in #5449
  • feat: add the texMathDollars preference, replacing the math option (#5446) by @Jocs in #5450
  • feat: implement pandoc's tex_math_gfm, replacing the GitLab compatibility option (#5446) by @Jocs in #5457
  • feat: show selected text word count by @Renakoni in #4457

New Contributors

Full Changelog: v0.20.0-rc.4...v0.20.0-rc.5

  •  

5.7.0

18 September 2026 om 16:06

⭐ New Feature: FQDN support with DNS and mDNS

Device addresses can now be configured using a fully qualified domain name instead of an IPv4 address. UpSnap resolves regular hostnames through DNS and .local hostnames through mDNS before pinging, waking, shutting down, or putting a device to sleep.

Changelog

Others

  •  

v0.20.0-rc.4

17 September 2026 om 10:24

❗ This is a pre-release

  • May contain bugs and unfinished features.

⚠️ Note for macOS users

Builds are unsigned (no Apple Developer ID). After dragging MarkText into Applications, clear the quarantine flag once:

xattr -cr /Applications/marktext.app

Verifying downloads

All artifacts are listed with their SHA-256 in SHA256SUMS.txt. Verify with:

sha256sum -c SHA256SUMS.txt --ignore-missing

What's Changed

  • chore(desktop): disable the Report button in the error dialog by @Jocs in #5359
  • fix(muya): run paragraph commands on the whole table or code block (#4944) by @Jocs in #5358
  • fix(muya): don't drop blocks when a cut ends inside a code block (#4903, #5148) by @Jocs in #5357
  • feat: add source line number toggle by @masalha-alaa in #5111
  • fix(muya): change the heading level of the caret's paragraph, not its list (#5360) by @Jocs in #5361
  • fix(muya): keep a setext heading's level when promoting or demoting it (#5362) by @Jocs in #5363
  • fix(muya): keep every line when a multi-line block becomes a heading (#5366) by @Jocs in #5367
  • fix(muya): collapse only the nested code block when a cut starts in its language line (#5368) by @Jocs in #5370
  • fix(muya): keep the code block when a cut ends in its language line (#5371) by @Jocs in #5372
  • fix(muya): remove the selected rest of a list or quote when a cut starts in it (#5385) by @Jocs in #5397
  • feat(muya): support same-line display math by @Renakoni in #4935
  • fix(muya): start an image resize only from the resize bar's own handles (#5116) by @Jocs in #5382
  • fix(muya): don't crash or replace another block when picking a table size after undo (#5355) by @Jocs in #5384
  • fix(desktop): launch normally when NODE_ENV=development is set (#5053) by @Jocs in #5374
  • fix(desktop): open files from a second instance started with --user-data-dir (#3020) by @Jocs in #5375
  • fix(desktop): keep debug mode out of release builds (#5407) by @Jocs in #5410
  • fix(desktop): read locale files from the app's resources (#5408) by @Jocs in #5411
  • fix(muya): keep the document intact when a cut ends in a table (#5400, #5405, #5399, #5398) by @Jocs in #5406
  • fix(muya): cancel Backspace that turns a setext heading into a paragraph (#5035) by @Jocs in #5381
  • fix(muya): keep a dollar sign in a regex replace capture by @Dev-next-gen in #5404
  • fix(muya): regexp replace groups β€” per-match Replace All, unmatched groups, two-digit $nn by @Jocs in #5420
  • fix(muya): keep an inline raw HTML tag's id intact by @Dev-next-gen in #5416
  • fix(muya): re-read the block type after a Backspace on a syntax marker (#5388) by @Jocs in #5421
  • fix(muya): keep blocks after a paragraph merged into a table cell out of the row (#5386) by @Jocs in #5422
  • fix(muya): keep the rest of a blockquote quoted on forward-Delete merge (#5423) by @Jocs in #5424
  • fix(muya): escape braces in a plain-text find query by @Dev-next-gen in #5428
  • fix(desktop): open Quick Open when files are open without a folder by @Dev-next-gen in #5431
  • fix(muya): select the document when Select All's cached caret block was removed by undo (#5387) by @Jocs in #5425

New Contributors

Full Changelog: v0.20.0-rc.3...v0.20.0-rc.4

  •  

v0.8.5

16 September 2026 om 10:00

What's Changed

  • fix(gui): resolve depot metadata named only by the manifest by @4ni1ak in #836
  • docs(gui): adopt upstream gpui kit skills by @AprilNEA in #1400
  • fix(linux): keep the generated systemd unit out of the user's tier by @AalmanSadath in #796
  • fix(hidpp): stop HID++ replies landing on the wrong request by @isleofgreg in #1286
  • feat(gui): enable supported button gestures by @juan-apa in #1167
  • fix(gui): restore stacked card layout under gpui-kit 0.6 by @AprilNEA in #1408
  • chore: release v0.8.5 by @AprilNEA[bot] in #1399

Full Changelog: v0.8.4...v0.8.5

  •  

Release 2026.09.15

15 September 2026 om 22:20

Docker Images

Docker images have been built and pushed:

Docker Hub:

  • alexta69/metube:latest
  • alexta69/metube:2026.09.15

GitHub Container Registry:

  • ghcr.io/alexta69/metube:latest
  • ghcr.io/alexta69/metube:2026.09.15

Changes

  • build: upgrade Python and npm dependencies (6708a88)
  • fix: stop resolving submitted URLs locally when a proxy will (closes #1079) (5cac98a)
  • docs: add MeTube Mobile (Android) to Sending links to MeTube (3516872)

  •  

v0.8.4

15 September 2026 om 20:40

What's Changed

  • feat(i18n): migrate catalogs to semantic TOML keys by @AprilNEA in #1169
  • perf(i18n): avoid copying borrowed translations by @AprilNEA in #1184
  • fix(i18n): polish supported locale copy by @AprilNEA in #1180
  • fix(i18n): localize DPI steps and correct count labels by @AprilNEA in #1292
  • fix(i18n): polish Brazilian Portuguese profile and settings copy by @uricholiveira in #1276
  • fix(i18n): refine French asset and control descriptions by @didlawowo in #1278
  • fix(hid): keep pairing phase after device selection by @AprilNEA in #1181
  • refactor(gui): model camera preview lifecycle states by @AprilNEA in #1182
  • refactor(agent): consolidate capture manager slots by @AprilNEA in #1183
  • docs(linux): fix the Debian install command and the bug form's platform note by @AalmanSadath in #791
  • docs: add Russian README translation by @MonteNegroX in #1039
  • Fix typo in installation guide by @mikevankuik in #1189
  • fix(i18n): correct mistranslations in the Spanish catalog by @eibidia in #1315
  • feat(i18n): Updated French README.md file by @DimitriDR in #1271
  • fix: add Debian runtime dependencies by @MauricioSilv in #1249
  • fix(hook): normalize Windows cursor position to DIP scale by @fly530 in #1246
  • fix(agent): restore diverted HID++ controls on a clean shutdown by @4ni1ak in #1106
  • refactor(hook): type windows cursor dpi normalization by @AprilNEA in #1318
  • fix(linux): declare F13-F20 in uinput key capabilities by @costantinoai in #1224
  • fix(core): stop seeding Back/Forward with a divertable default by @litityum in #1225
  • fix(agent): fence queued pairing discovery after selection by @AprilNEA in #1320
  • fix(agent): avoid capture recovery deadline busy loops by @AprilNEA in #1321
  • test(gui): cover camera preview lifecycle by @AprilNEA in #1322
  • fix(gui): place Windows actions ring correctly across mixed-DPI monitors by @AprilNEA in #1319
  • fix(gui): stop linking SMAppServiceErrorDomain so macOS 13 and 14 can launch by @AprilNEA in #1324
  • feat(hid): add hardware-aware mock device record and replay by @AprilNEA in #1165
  • test(agent): cover native and browser side-button profiles by @AprilNEA in #1325
  • fix(macos): bind Safari navigation to press-time process by @foleykyle01 in #1082
  • fix(camera): surface startup failures and retry preview by @yuzi-co in #1069
  • chore(gui): upgrade to gpui kit 0.6.1 and published pre adapters by @AprilNEA in #1338
  • feat(hid): add rgb-effects lighting and receiver routing by @LuisUrrutia in #351
  • fix(gui): keep update consent buttons visible by @AprilNEA in #1398
  • fix(linux): preserve gesture capture across receiver probes by @yvvlee in #1043
  • chore: release v0.8.4 by @AprilNEA[bot] in #1179

New Contributors

Full Changelog: v0.8.3...v0.8.4

  •  

v0.20.0-rc.3

15 September 2026 om 03:02

❗ This is a pre-release

  • May contain bugs and unfinished features.

⚠️ Note for macOS users

Builds are unsigned (no Apple Developer ID). After dragging MarkText into Applications, clear the quarantine flag once:

xattr -cr /Applications/marktext.app

Verifying downloads

All artifacts are listed with their SHA-256 in SHA256SUMS.txt. Verify with:

sha256sum -c SHA256SUMS.txt --ignore-missing

What's Changed

  • fix(muya): make a code block a diagram when its language is a diagram language (#5060) by @Jocs in #5304
  • docs: fix the macOS alias path in the CLI docs by @Jocs in #5308
  • chore: run only eslint --fix on staged desktop TS/Vue files by @Jocs in #5318
  • fix(desktop): ignore line-ending menu updates for a closed window (#4923) by @Jocs in #5319
  • fix: #4926 prevent emoji deletion from splitting surrogate pairs by @Renakoni in #4931
  • fix(desktop): keep exported links working from folders named with #, ? or % by @Dev-next-gen in #5320
  • fix(desktop): explain the max width format in preferences (#5331) by @Jocs in #5334
  • fix(muya): delete emoji whole in code blocks and drop the caret-inside-cluster handler (#4926) by @Jocs in #5332
  • fix(desktop): keep exported images working from folders named with #, ? or % (#5335) by @Jocs in #5337
  • fix(muya): regex search freezes on zero-width patterns and splits emoji by @Jocs in #5333
  • fix(desktop): keep the share host in exported links from UNC documents (#5336) by @Jocs in #5338
  • fix: #4899 keep trailing content out of the child list when outdenting a list item by @doktorigi in #4913
  • fix(muya): keep the link popover open when moving between links (#5313) by @anandghegde in #5324
  • fix: reuse image on case-insensitive path match (#3119) by @dzid26 in #5326
  • fix(desktop): name copied images after their content, not their path (#5344) by @Jocs in #5346
  • fix(muya): only outdent a paragraph that sits in a nested list item (#5342) by @Jocs in #5345
  • fix(muya): split the list when outdenting a task item into a plain list (#5341) by @Jocs in #5348
  • fix(muya): edit a footnote definition as its own container (#5340, #5343) by @Jocs in #5347
  • fix(muya): keep a Tab-indented list item out of a sublist of the other kind (#5349) by @Jocs in #5354
  • fix(muya): preserve ordered list source markers by @Renakoni in #4776

New Contributors

Full Changelog: v0.20.0-rc.2...v0.20.0-rc.3

  •  

v0.16.22

13 September 2026 om 20:43

[0.16.22] - 2026-09-13

If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.

Added

Changed

Fixed

  • WebDAV: PROPFIND responses do not declare the namespace of every requested property on the DAV:multistatus element.
  • MTA:
    • SMTP session state obtained before STARTTLS is discarded once the TLS handshake completes, as required by RFC 3207.
    • Inbound throttle, outbound throttle and queue quota match expressions evaluate their if/then conditions.
    • DMARC: Messages without an aligned SPF or DKIM pass from a domain that publishes a DMARC policy are reported as fail instead of none in logs.
    • DMARC: A temporary DNS error on an SPF or DKIM check whose identifier aligns with the author domain produces temperror instead of fail.
    • DMARC: A policy record without a p tag is only applied, as p=none, when it contains a rua tag, even if it declares sp or np.
  • iMIP: Notification subjects and bodies omit the event start date, time and timezone for recurring events.
  • OIDC: Discovery is retried for 30 seconds before the directory is marked as unavailable, so a provider that is still starting up no longer requires a restart.
  • WebUI: The cached bundle of an Application is discarded when its resourceUrl changes or the record is deleted, so the next unpack fetches the new resource.
  • DNS: Append . to MX record hostnames.
  • Recovery mode: Automatic IP banning is disabled during recovery and initial setup.
  • FoundationDB: The cached read version is invalidated when a queue refresh or registry change broadcast is received.
  • Sieve: Messages filed with fileinto by a user script are treated as ham and are no longer moved to Junk when classified as spam.
  • IMAP:
    • SELECT, EXAMINE and STATUS on a shared mailbox require the r (read) right.
    • AUTHENTICATE is refused on clear-text connections unless allowPlainTextAuth is enabled, and the greeting and CAPABILITY response advertise LOGINDISABLED instead of the AUTH= mechanisms in that case.
  • IMAP, POP3, ManageSieve: Partial commands received before STARTTLS or STLS are discarded once the TLS handshake completes.
  • Network: Inbound TLS handshakes, both implicit and STARTTLS, are aborted after the listener's tlsTimeout, releasing the connection slot.
  • OAuth: A random key is used when the OIDC provider's encryptionKey or HMAC signatureKey cannot be read, instead of an empty key.
  • LDAP: The {local} and {domain} filter placeholders are escaped.
  • JMAP:
    • CalendarEvent/set stores useDefaultAlerts per user, and CalendarEvent/get returns false when it was never set.
    • CalendarEvent/get returns null for baseEventId unless the id is a synthetic recurrence instance.
    • CalendarEvent/get returns null for requested recurrenceRule and recurrenceOverrides properties on synthetic recurrence instances.
    • CalendarEvent/get and ContactCard/get return only id when the properties argument is an empty list, instead of every property.

Check binary attestation here

  •  

v0.20.0-rc.2

11 September 2026 om 04:31

❗ This is a pre-release

  • May contain bugs and unfinished features.

⚠️ Note for macOS users

Builds are unsigned (no Apple Developer ID). After dragging MarkText into Applications, clear the quarantine flag once:

xattr -cr /Applications/marktext.app

Verifying downloads

All artifacts are listed with their SHA-256 in SHA256SUMS.txt. Verify with:

sha256sum -c SHA256SUMS.txt --ignore-missing

What's Changed

  • fix: preserve Google Docs CSS formatting on paste by @Renakoni in #4699
  • fix(desktop): preserve RTL text direction in PDF and print export by @Jocs in #4874
  • docs: update sponsor logo by @Jocs in #5014
  • docs: remove sponsor ukey by @Jocs in #5217
  • fix: preserve viewport when toggling task-list checkbox by @Awaker-OTE in #5189
  • fix(desktop): allow saving directly to a drive root (#5150) by @Panisnbb in #5188
  • docs: fix grammar issues in FAQ.md by @woltary02-creator in #5089
  • fix(ui): sync quick insert highlight with input method by @KDOJP in #5176
  • feat(i18n): add Dutch locale + validation tests + fix existing issues by @rkristelijn in #5137
  • Japanese translation update by @coolvitto in #5049
  • fix: allow copy-paste in same folder with auto-rename by @rkristelijn in #5139
  • chore: add pre-commit hooks (husky + lint-staged) by @rkristelijn in #4999
  • fix(muya): escape HTML in image attribute values (CWE-79) by @andesyteoss in #4980
  • fix: #5001 persist pasted bitmap images to the assets folder per preferences by @Panisnbb in #5168
  • fix(muya): preserve cursor on IME composition backspace(#4956) by @Zengzzhao in #4957
  • fix(muya): size table columns to their content by @Renakoni in #4952
  • fix: handle UNC image paths and watchers by @Renakoni in #4778
  • fix(desktop): ignore revoked output pipe errors on macOS by @Awaker-OTE in #5229
  • feat(desktop): add "Reset Zoom" item to the Window menu by @xrgzs in #5185
  • fix: #3469 decode Windows clipboard file paths as UTF-16LE by @Panisnbb in #5167
  • fix(desktop): prevent CodeMirror line tree corruption by @Renakoni in #4930
  • fix(i18n): add the missing Dutch resetZoom label by @githello1 in #5245
  • feat(macOS): add Dictionary lookup for selected editor text by @nikkogibler in #4814
  • fix: #4890 use file extension for side bar icons by @doktorigi in #4910
  • fix(muya): #4747 deep clone editor state without recursing by @CookPiu in #5259
  • fix: init image size when render html tag image by @Jocs in #5264
  • fix: render rect selection in table by @Jocs in #5265
  • fix: the missing locale key by @Jocs in #5266
  • fix: #5152 align TOC navigation with editor viewport by @foo-hao in #5153
  • fix: #5130 keep Electron locale resources for all supported UI languages by @legsing in #5132
  • fix: #5129 detect system language on first start by @legsing in #5131
  • fix: skip website preview deploy on fork PRs by @Jocs in #5278
  • feat: add 'Treat soft newlines as spaces' preference (#1849) by @wmoss in #4937
  • fix(muya): keep IME input intact after a soft line break by @Jocs in #5281
  • fix(muya): stop the quick-insert hint claiming a line of its own by @Jocs in #5283
  • fix(muya): give a code block's trailing empty line a line box by @Jocs in #5286
  • fix(muya): keep footnote reference ids intact for special identifiers (#5208) by @Jocs in #5285
  • fix(muya): skip search matches whose block left the document (#5163, #5215) by @Jocs in #5287
  • fix(muya): keep the image resize bar from crashing after its image is removed (#5216) by @Jocs in #5288
  • fix(muya): ignore a quick-insert pick once its paragraph is gone (#5213) by @Jocs in #5289
  • fix(muya): drop an image selection whose block left the document (#5055) by @Jocs in #5291
  • fix(muya): number empty lines in code blocks (#5294) by @Jocs in #5295
  • fix(muya): don't restore a drag selection onto removed blocks (#4981, #5256) by @Jocs in #5290
  • fix(muya): end the paragraph on a Shift+Enter that would leave an empty line by @Jocs in #5300
  • fix: make anchor links reach CJK headings and headings in other documents (#5292) by @Jocs in #5298
  • fix(desktop): flush pending edits before entering source code mode by @richbodo in #5103
  • fix(muya): load relative images from folders named with #, ? or % (#5302) by @Jocs in #5301
  • test(desktop): wait for TOC scrolls to settle in the toc-scroll e2e by @Jocs in #5303

New Contributors

Full Changelog: v0.20.0-rc.1...v0.20.0-rc.2

  •  

5.6.0

10 September 2026 om 17:02

⭐ New Feature: Unified Logs

Logs are merged with PocketBase logs and not a seperate console-only feature anymore.

  • Added superuser-only /logs page backed by PocketBase built-in logs.
  • Filter by level, text-search log level/message/data, sort, paginate, refresh.
  • View structured data, relative source path, level, message, time, raw JSON.
  • Toggle UpSnap-only logs using upsnap=true record attribute.
  • Wake and shutdown logs identify manual or cron trigger.
  • Ping status transitions and tracked IP changes now log events.
  • Added UPSNAP_LOG_LEVEL: DEBUG, INFO, WARN, ERROR, OFF.
logs

Changelog

Features

Others

  •  

v0.16.21

6 September 2026 om 18:48

[0.16.21] - 2026-09-06

If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.

Added

Changed

  • Sieve: Messages generated by user scripts are DKIM signed through the new SieveUserInterpreter.dkimSignDomain setting, which defaults to the account's own domain.

Fixed

  • JMAP:
    • CalendarEvent/set requests that ask for scheduling messages are rejected with a forbidden error when the account cannot send them.
    • Calendar/get and AddressBook/get return every property when the properties argument is omitted or null.
    • EventSource ping events advertise the interval in seconds rather than milliseconds.
    • Calendar synthetic ids returned when expanding recurrences identify an occurrence by its recurrence id.
  • IMAP: Every command in a pipelined STATUS or FETCH batch receives its tagged completion, instead of the first failing command dropping the responses for all commands queued behind it.
  • WebDAV: Accounts without a storage quota no longer advertise a 4 GiB limit in DAV:quota-available-bytes.
  • MTA: Inbound DMARC and TLS aggregate reports that a reporter sends more than once are imported again as a duplicate entry.
  • Spam filter: Domain and URL blocklists are queried only for text written as a link.
  • iTIP: Detaching an occurrence that the recurrence rule already generates is sent as a METHOD:REQUEST carrying the RECURRENCE-ID instead of a METHOD:ADD.
  • Sieve: fileinto :specialuse and specialuse_exists accept special-use attributes in the \Trash form.
  • LDAP: Active Directory servers that answer an unauthenticated bind (a non-empty DN with a zero-length password) with success no longer authenticate accounts without a password.
  • Network: Listeners bound to the unspecified IPv6 address ([::]) fall back to IPv4 when socket creation fails with EPROTONOSUPPORT.
  • OpenTelemetry: log exporter does not include the parent span's attributes.

Check binary attestation here

  •  

v0.5.5 - β€œConquistador Coffee”

6 September 2026 om 12:13

0.5.5 (2026-09-06)

  • Feature: [#26423] [Plugin] Add PathNavigator and PathConnection for exploring the footpath network as a graph.
  • Feature: [#26827] [Plugin] Add map resize hook to scripting api.
  • Feature: [#26877] Clear Scenery can now remove footpath additions, and remove walls separately from small scenery.
  • Feature: [#26938] [Plugin] Allow getting and setting caret position for textbox while it is in focus.
  • Improved: [#16269] Unnamed rides in the original Added Attractions & Loopy Landscapes scenarios now use their official names from Rollercoaster Tycoon Classic.
  • Improved: [#19000] Add sprite font glyph for the Won (β‚©).
  • Improved: [#21441] Add sprite font glyph for the Hryvnia (β‚΄).
  • Improved: [#22500] LandSetHeightAction has now proper error message title.
  • Improved: [#23872] Loading a park outside the game now sets the folder of the load/save window, as loading one in-game does.
  • Improved: [#25362] When dragging footpaths, they will now properly adapt to uneven terrain.
  • Improved: [#26099] The ride type selection cheat has been moved into the ride operations tab.
  • Improved: [#26099] The ride visiblity cheat has been moved into the ride colour/appearance tab.
  • Improved: [#26441, #26958] Change result.position.z of SmallScenery- and WallPlaceAction to match the actual position of the placed tile element.
  • Improved: [#26862] Add a Liquid Glass app icon for macOS 26 and later.
  • Improved: [#26931] The save prompt now bounces the macOS dock icon, flashes the Windows taskbar button and marks Linux windows urgent when it blocks quitting an unfocused game.
  • Improved: [#26936] Rain is now drawn next to the top toolbar, but only when it is centred.
  • Improved: [#26996] Ride names in scenarios can now be autopatched.
  • Fix: [#7858] Dropdowns do not close when an action by a plugin or another player in multiplayer closes their parent window.
  • Fix: [#15891] Lower case hard sign is drawn as upper case.
  • Fix: [#18197] Track Designs Manager does not autoload scenery.
  • Fix: [#18415] Preview in the Track Designs Manager is not updated after deleting the first design.
  • Fix: [#18782] Dropdowns do not close and become non-functional when mouse is released outside of the game window.
  • Fix: [#21632] [Plugin] Crash when loading custom image larger than 300 by 300 pixels.
  • Fix: [#22854] Network connections of plugins pile up every time another park is loaded.
  • Fix: [#24520] The close button does not use the sprite font on languages using a TTF font when the enlarged UI is enabled.
  • Fix: [#24610] Graph tabs on Finances window get a little bit longer every time you switch between them.
  • Fix: [#25169] The convert command strips custom objects from the resulting park.
  • Fix: [#25496] The guest pickup button does not grey out when the guest’s state changes while the window is open.
  • Fix: [#25558] [Plugin] Image buttons ignore their explicit border setting when a theme draws borders around them.
  • Fix: [#26056] Freeze when trying to download all objects on save where they are missing.
  • Fix: [#26802] Opening rides with 0 or -1 water cars per train crash the game.
  • Fix: [#26811] Crash when a ride points to a non-existing station object.
  • Fix: [#26816] Water rides ignore zero clearances, preventing adjacent terrain modifications and building them anywhere.
  • Fix: [#26880] Max negative G-Force stat on flat track erroneously reads as 0.49g.
  • Fix: [#26903] Making a ride visible or invisible is always denied in multiplayer.
  • Fix: [#26917] Tile Inspector does not show indestructible track status correctly when β€˜Make all track pieces destructible’ cheat is enabled.
  • Fix: [#26921] The bottom panel buttons for finances, park rating, date, etc. are not invalidating properly.
  • Fix: [#26935] Windows opened on the title screen do not β€˜flash’ around the edges when bringing them back into focus.
  • Fix: [#26938] [Plugin] Caret in textbox not animating or blinking.
  • Fix: [#26954] Land paint price is not updated when selecting columns or rows of tiles by holding down Ctrl.
  • Fix: [#26965] When showing missing objects, some types show up as β€˜Unknown type’.
  • Fix: [#26965] The window with missing objects is displayed under the β€˜Load game’ window.
  • Fix: [#26992] A partial or no car is drawn on the ride vehicle tab if the ride has 0 or fewer cars per train.
  • Fix: [#26996] Correct spelling of some rides in Heide-Park, Diamond Heights and Alton Towers.
  • Fix: [#26996] Scenario patch for Okinawa Coast doesn’t work for CD versions of Wacky Worlds (meaning landscape ownership fixes do not get applied).
  • Fix: [#27004] Windows are moved off-screen when mouse is released outside of the game window.
  • Fix: [#27023] [Plugin] Transparent plugin sprites do not work correctly in software rendering mode.

Release created in https://github.com/OpenRCT2/OpenRCT2/actions/runs/34024796628

SHA256 checksums:

f5d8aac771931b5cf683a34de92f6fc34dc5460fb6c606f987a4000d4016ed79  ./OpenRCT2-v0.5.5-Linux-noble-x86_64.tar.gz
23b50a9f8a6fae33e9c86c3638b0d7575a582ff8bee1e0d20bc791bd1759e1c4  ./OpenRCT2-v0.5.5-windows-symbols-x64.zip
790068a44ee461dd80f0cad22090d2cd2bda58ba1270746285fa912bdcf55e36  ./OpenRCT2-v0.5.5-Linux-resolute-x86_64.tar.gz
db233a2cde7861057f5d70982cb7299066222888f7c796540085ee4eb9a0a7a0  ./OpenRCT2-v0.5.5-Linux-bookworm-x86_64.tar.gz
56c8bade89ca207be137da7853635a572ac9bde0c8fe024371859539ed584606  ./OpenRCT2-v0.5.5-sha256sums.txt
ee677d5d3db4f62213634e21950406b92f23b9391b10485b2d2b6cac779efa55  ./OpenRCT2-v0.5.5-windows-symbols-win32.zip
30fc440e7296f90e90d397e9dc123141a52e7d597c92aef5eddddc4dcadff24c  ./OpenRCT2-v0.5.5-windows-symbols-arm64.zip
6810120d5b7409d1a6f8622a48306f31aeede203bfc51b96b3336ba7cb9faf90  ./OpenRCT2-v0.5.5-windows-portable-x64.zip
47ad04a020dde36265d90854d13f61377ce376bcec2c77b0e191231a10a45eca  ./OpenRCT2-v0.5.5-windows-installer-arm64.exe
0c69b2cc7f278854fe1ba24ba70e03313e83ebc4c80ef4e979c44108bfc1a12a  ./OpenRCT2-v0.5.5-windows-portable-arm64.zip
f5922dd3df9985ef75eb984537b9205bc5b8c795711141a20f2b3d04cb3cd4b3  ./OpenRCT2-v0.5.5-windows-portable-win32.zip
c36b216d3378c9c29a36e29bfc498a7ed93357a48ec06f61f7f658489dc9eb01  ./OpenRCT2-v0.5.5-windows-installer-x64.exe
f04c1c0ba160671389fabe3c09601abec8180d8615a34a57d5c38bec883100ec  ./OpenRCT2-v0.5.5-windows-installer-win32.exe
f3debb61bd9b6cc4c85e4ca4f17c46f76834a1e89f1faac2b694e0a563d9ad7c  ./OpenRCT2-v0.5.5-linux-x86_64.AppImage
fe2117cd916e01e7544964cb5b39b94a31a2380126d09fa5d5995cc9e2224d3a  ./OpenRCT2-v0.5.5-Linux-trixie-x86_64.tar.gz
d02f0a3054106e60186805268828cc80068485ffa324aca7363ae1d69081fb0d  ./OpenRCT2-v0.5.5-macos-universal.zip
8dcabe11c87a5ea8de00a7e083ee3f54bd37239def6cb6f14d2b192492707111  ./OpenRCT2-v0.5.5-android.apk

  •  

v1.21.0

9 September 2026 om 08:49

New major features

Media-over-QUIC

  • support forwarding streams (#6145)

API

  • add /paths/static-sources/get endpoint (#6177) this allows to obtain details about static sources.
  • add type-specific properties to forward destinations (#6178)
  • add type-specific properties to static sources (#6184)

Fixes and improvements

General

  • add --validate-conf flag (#5549) (#6140)
  • use internal/core/VERSION as single source of truth to get version (#6119)
  • httpp: propagate Flush() through the response writer wrappers (#6126) handlerLogger's responseRecorder and handlerWriteTimeout's writeTimeoutWriter both wrap http.ResponseWriter but implement neither http.Flusher nor Unwrap(). Any handler that flushes mid-response has that flush silently dropped, and its output only reaches the client when the handler returns. That defeats the stated purpose of writeTimeoutWriter, whose own comment says it exists so one can "write long responses, splitted in chunks, without causing timeouts": the deadline is reset per Write(), but nothing ever leaves the buffer until the end. Found while adding a server-sent-events endpoint: events written and flushed at t=0.4s onlyreached the client at t=2.2s, when the handler returned. Adding Flush() plus Unwrap() (so http.ResponseController can reach through) fixes both. The new test drives a real listener throughboth wrappers and reads while the handler is still blocked, so it fails on the current code by hitting the read deadline.
  • support setting read buffer size on macOS (#6128) (#6131)
  • drop support for Debian Bullseye (#6137) Bullseye reached EOL on 31st august 2026.
  • emit "closed" log message when a server is closed (#6152)
  • fix external command exit code reporting on non-Windows platforms (#6155)
  • conf: support YAML version directives (#6157)
  • metrics: add 'pos' property to forward_dests (#6183)
  • metrics: deprecate the 'remoteAddr' property (#6174) Metrics are meant to provide aggregate statistics, not per-peer properties, that can be accessed through the API. The property is still served to keep backward compatibility.
  • metrics: add 'type' to forward dests, deprecated 'protocol' (#6170) 'type' is aligned with the terminology used in the rest of the server.
  • metrics, pprof: set default Allow-Origins to empty list (#6165) This prevents cross-site attacks to the API with the default configuration.
  • always-available: support disabling recording when the source is offline (#6182) Add alwaysAvailableRecorded parameter that controls whether recording happens during offline periods for always-available paths. When set to false, recording only starts when a real source is connected.
  • allow sources and forward destinations with an empty password (#6193) Restore the behavior introduced in #395 and accidentally reverted by #5779, which factored the RTMP/HLS credential check into validateURL() and applied it to RTSP sources too. A username with an explicitly empty password is valid per RFC 3986 and is required by some legacy cameras whose password cannot be set. It is now accepted for every scheme handled by validateURL(), including forward destinations. A username without password or a password without username is still rejected,with a clearer error message pointing to the right syntax.
  • fix wrong validation of HTTP allowed origins (#6198) An allowed origin with wildcards was making the server accept origins with a different scheme. This is fixed.
  • fix HTTP allowed origins dots being interpreter as any character (#6199) A dot in an HTTP allowed origin now requires a corresponding dot in an incoming origin.
  • serve Origin: Vary header with Access-Control-Allow-Origin (#6200) This prevents CDNs from caching the Access-Control-Allow-Origin header regardless of the origin.
  • stop returning wildcard in Access-Control-Allow-Origin (#6201) if domain is allowed, return the domain, otherwise nothing.
  • pmp4, fmp4: stop validating inbound H264/H265 SPS (bluenviron/mediacommon#366) Validating SPS adds latency and is generally redundant.
  • pmp4, fmp4: do not accept empty H264/H265 parameters (bluenviron/mediacommon#367)
  • h265: fix DTS extraction of streams with temporal sub-layers (bluenviron/mediacommon#368) The picture-type switches in the H265 DTS extractor accepted only TRAIL_N/TRAIL_R/RASL_N/RASL_R, so an access unit whose slices are TSA_N/TSA_R/STSA_N/STSA_R (Rec. ITU-T H.265, table 7-1, types 2-5) fell through to "access unit doesn't contain an IDR or non-IDR NALU" and the stream could never be recorded. TSA and STSA pictures use the same slice segment header syntax as TRAIL pictures, so handle them in the same way.

API

  • add 'type' to forward dests, deprecated 'protocol' (#6170) 'type' is aligned with the terminology used in the rest of the server.
  • set default Allow-Origins to empty list (#6165) This prevents cross-site attacks to the API with the default configuration.
  • deprecate 'conf' field of forward destinations (#6175) configuration is already available through the confName property of the path.
  • refactor endpoint names (#6172) group endpoints by category (i.e. /hls/muxers, /hls/sessions), rename /forward/* into /forward-dests/*, use kebab-case. Backward compatibility is preserved by still serving old endpoints.

Media-Over-QUIC

  • rename boolean header fields (#6148) rename Properties into HasProperties, FirstObject into IsFirstObject
  • add shared Conn interface (#6149)
  • close server streams when no longer in use (#6151) Explicitly close bidirectional and unidirectional streams that were previously keep open for the entire duration of the session. Note that closing a stream in QUIC/WebTransport means telling the peer that "we are not sending data anymore", while still allowing inbound data.
  • add shared client (#6150)
  • impose a 100MB limit on reordered bytes per session (#6194) previously, the limit was per-track. This decreases the probability of incurring in an out-of-memory situations.

RTSP

  • redact credentials in logs (#6158)
  • demux MPEG-TS from static source pull (#6181) When rtspDemuxMpegts is set, a pulled single MP2T track is demuxed into elementary streams, matching RTSP publishers, so HLS can attach.
  • support setting read buffer size on macOS (#6128) (bluenviron/gortsplib#1143)
  • client: ignore invalid source IPs in SETUP responses (bluenviron/gortsplib#1070) (bluenviron/gortsplib#1145)
  • fix decoding and encoding fragmented MPEG-4 audio packets (bluenviron/gortsplib#1150) The AU-size field was set incorrectly in subsequent fragments.
  • stop validating inbound H264/H265 SPS (bluenviron/gortsplib#1151) Validating SPS adds latency and is generally redundant.
  • Support SDES (RFC 4568) SRTP key exchange for RTSP/RTSPS sources (bluenviron/gortsplib#1148)
  • rtpklv: do not reuse buffer of returned KLV units (bluenviron/gortsplib#1154) Decode() returns a slice that points to the decoder's internal buffer, and the next call to Decode() overwrites that same array in place. A caller that holds the previous unit - for instance while it is being recorded or forwarded on another goroutine - ends up reading the bytes of the next unit, or a torn mix of both when the sizes differ. Clear the buffer instead of truncating it, so each unit gets its own array. This is what the h264, h265, av1, vp8 andmpeg1video decoders already do, at the cost of one allocation per unit.
  • auth: support qop=auth in digest client (bluenviron/gortsplib#1074) (bluenviron/gortsplib#1155) The client never looked at the qop directive of a digest challenge and always computed the legacy RFC 2069 response, so servers that require qop="auth" - as most RFC 7616 implementations do - rejected every request with a 401. Parse qop in WWW-Authenticate, and when the server offers "auth", send qop, cnonce and nc and compute the response as H(HA1:nonce:nc:cnonce:qop:HA2) (RFC 7616, section 3.4.1). The nonce count increases at every request, as required. Challenges without qop keep the previous behavior. auth-int is not implemented. Also copy the opaque value of the challenge into the Authorization header, which RFC 7616 section 3.3 says the client should return unchanged.
  • client: remove Content-Length from HTTP tunnel GET request (bluenviron/gortsplib#1158)
  • rtpav1: do not set Y/Z bits when no OBU bytes were written (bluenviron/gortsplib#1153) When the remaining space in a packet is too small to hold any byte of thenext OBU, the encoder writes nothing but still marks the current packet with Y=1 and the following one with Z=1. The AV1 RTP payload format (v1.0, section 4.4) requires both bits to be 0 unless an OBU element is actually fragmented across the two packets. Receivers that honor the bits therefore join two complete OBUs into one: this happens with the decoder in this package, with pion/rtp and with ffmpeg. It is reachable whenever an earlier OBU leaves exactly 0 free bytes (or 0-2 when the next OBU is size-prefixed), so it affects streams that are repacketized, e.g. non-RTSP sources read over RTSP in mediamtx.

RTMP

HLS

  • validate hlsSegmentCount according to the HLS variant (#6154)

WebRTC

  • Register RTX for incoming video tracks (#6125)
  • fix deprecated webrtcICEServers parser for IPv6 hosts; (#5932)

RPI Camera

Dependencies

  • code.cloudfoundry.org/bytefmt updated from v0.85.0 to v0.88.0
  • github.com/bluenviron/gohlslib/v2 updated from v2.4.3 to v2.4.4
  • github.com/bluenviron/gortmplib updated from v1.0.1 to v1.0.2
  • github.com/bluenviron/gortsplib/v5 updated from v5.6.4 to v5.6.5
  • github.com/bluenviron/mediacommon/v2 updated from v2.9.3 to v2.9.4
  • github.com/matthewhartstonge/argon2 updated from v1.5.6 to v1.5.7
  • github.com/pion/webrtc/v4 updated from v4.2.18 to v4.2.19
  • github.com/quic-go/quic-go updated from v0.61.0 to v0.62.0
  • github.com/quic-go/webtransport-go updated from v0.12.0 to v0.13.0
  • github.com/stretchr/testify updated from v1.12.0 to v1.12.1
  • github.com/dunglas/httpsfv updated from v1.1.0 to v1.1.1
  • github.com/pion/stun/v3 updated from v3.1.6 to v3.1.7
  • github.com/pion/turn/v5 updated from v5.0.12 to v5.0.13
  • gopkg.in/yaml.v3 removed
  • go.yaml.in/yaml/v3 v3.0.5 added
  • github.com/bluenviron/mediamtx-rpicamera updated from v2.8.0 to v2.9.0
  • hls.js updated from v1.7.0 to v1.7.2

Security

Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.

Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:

ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx

You can verify checksums of binaries by downloading checksums.sha256 and running:

cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check

  •  
❌