Fixed warning dialogs on macOS not rendering rich text [Warchamp7] (#13949)
Fixed source icon state appearing inverted [Warchamp7] (#13953)
Fixed audio monitoring settings not saving [Warchamp7] (#13951)
Fixed missing encoder check showing missing encoders in an output mode that is not currently selected [Warchamp7] (#13950)
Fixed Windows updater not updating game capture and virtual camera in some cases [Warchamp7] (#13939)
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
Fixed script injection in event scripts. With JScript, untrusted values passed to event handlers (such as the logon password in OnClientValidatePassword, or error text and UIDs sent by remote servers) could break out of their string. With either script language, a rule's "Run function" name could carry code. This would allow an attacker to run arbitrary code in the hMailServer process. Values are now escaped, and rule function names may only contain letters, digits and underscores.
If you are unable to install this version, disable JScript execution and do not give end-users access to the hMailServer COM API.
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
DNS: PowerDNS Authoritative provider for automatic DNS record management.
Changed
Fixed
Troubleshoot tool: TLSA records are looked up for every MX host, including hosts whose zone is not DNSSEC signed.
Spam filter:
OpenPhish and PhishTank entries containing uppercase characters never match, since message URLs are lowercased while HTTP lookup entries keep their original case. HTTP lookups now match keys case-insensitively.
URL shortener links are followed using the lowercased URL, so case-sensitive short links resolve to the wrong destination or not at all.
Incremental training never advances its position past the first run, so every retained sample added since then is trained again, and counted again in the reservoir, on each run until it expires.
Updating the rules only adds new objects, so upstream changes to existing rules, DNSBL servers, HTTP lookups, lookup keys and file extensions never reach an existing installation.
Updating the rules reports success when objects fail to import, or when a configuration error stops the updated settings from being activated.
JMAP:
A PushSubscription created within the verification rate limit window of another one on the same account never receives its PushVerification, since the blocked verification is dropped instead of being sent once the window expires.
A push notification retried after a failed delivery can report an older state than a change queued during the failed attempt, since the older state changes are merged last and overwrite the newer ones.
Changes made while a push request is in flight are not delivered until the next change reaches the same subscription, since a successful delivery cancels the pending retry.
The VAPID aud claim is derived from a hand-written parse of the push URL, so a crafted push URL can make the server sign a token for a push service other than the one the request is sent to.
Email/import rejects a blobId that refers to a Blob/upload creation id in the same request ("#u0") with Invalid blob id..
Email/set with a full mailboxIds object identical to the current mailboxes, together with a keyword change, stores the message with IMAP UID 0, so IMAP clients stop seeing it.
MTA:
A node without the outboundMta role stops replying to DATA and to JMAP submissions once about 1024 messages have been queued on it.
MX records are resolved through the DNSSEC-validating resolver even when DANE is disabled.
A DATA stage Sieve script does not see headers added by milters or MTA hooks, and discards every milter and MTA hook change when it edits the message.
MySQL: Range deletions and search index removals start with a single unbounded DELETE and switch to chunks only after a timeout.
IMAP: COPY and MOVE fail with NO [CONTACTADMIN] when another session changes the same message at the same time.
Autodiscover: Implicit TLS ports (993, 995, 465) are advertised with <Encryption>TLS</Encryption>, which Outlook reads as STARTTLS.
HTTP: Idle keep-alive connections are never closed.
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
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)
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:
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)
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)
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
Renamed the blackbox test package to e2e (#28226 by @Nitwel)
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.
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)
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)
rtpmjpeg: reject reserved quantization value 127 (bluenviron/gortsplib#1161) RFC 2435 reserves quantization values 100-127, but the guard used Quantization < 127
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.
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.
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:
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
9f05b1c: Docker - add line in compose for dbus if using fqdn with .local domain (#1772) (@invario)
b17b091: feature: Support use of FQDN resolution with DNS and mDNS (#1760) (@invario)