❌

Lees weergave

Release 2026.09.23

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

πŸ› 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

⚠️ 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

[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

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

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

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

❗ 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

⭐ 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

❗ 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

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

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

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

❗ 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

[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

❗ 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

⭐ 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

[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”

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

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

  •  

v0.20.0-rc.1

❗ 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): resolve Homebrew/standard bin dirs for GUI launches by @Jocs in #4796
  • fix(muya): show and slug TOC headings by rendered plain text (#3516) by @Jocs in #4811
  • Add UKey Wallet sponsor to README and website by @Jocs in #4819
  • fix(desktop): apply editor max-width preference to @muyajs/core content column (#4828) by @Jocs in #4830
  • Add Bengali README and links by @FahimFBA in #4823
  • fix(muya): skip identity operations during deferred flush by @tech-hoon in #4815
  • fix(muya): harden History against identity (null) json-change ops by @Jocs in #4838
  • fix(muya): stop inline math showing a scrollbar for trailing sub/superscripts (#4837) by @Jocs in #4839
  • fix(muya): isolate mermaid render failures during export (#4812) by @Jocs in #4840
  • fix(desktop): correct English typos in locale and preference schema (#4787) by @Jocs in #4845
  • fix(muya): stop double percent-encoding autolink hrefs by @Jocs in #4841
  • fix(muya): keep pasted list items in order when merging mid-list by @Jocs in #4842
  • fix(desktop): confirm before opening executable link targets (code execution) by @Jocs in #4843
  • fix(muya): keep soft line breaks when exporting to HTML/PDF by @Jocs in #4844
  • fix(muya): show escaped pipe in table cell code as | not | (#4849) by @Jocs in #4850
  • fix(muya): preserve fenced code block info string on round-trip (#4770) by @Jocs in #4846
  • fix(muya): load Prism component dependencies in order (fixes flaky c++ load) by @Jocs in #4861
  • refactor(muya): treat the code fence info string as the source of truth (CommonMark) by @Jocs in #4856
  • fix(muya): call h1-h6 "headings" not "headers" in the insert menu by @Jocs in #4854
  • fix(desktop): don't crash on unwatchable image directories (UNC/WSL paths) by @Jocs in #4853
  • fix(desktop): save files atomically to prevent data loss on crash by @Jocs in #4852
  • fix(desktop): make crash-recovery buffer writes durable against power loss by @Jocs in #4864
  • fix(muya): render extensionless remote images served with a charset (shields.io badges) by @Jocs in #4857
  • fix(muya): follow the link when modifier-clicking a linked image by @Jocs in #4858
  • fix(muya): follow the link on Ctrl/Cmd-click for reference-linked and raw-HTML linked images (#4865) by @Jocs in #4866
  • fix(desktop): keep TOC collapse state across tab switches by @Jocs in #4860
  • fix(desktop): flush pending edits before saving (dropped last keystroke) by @Jocs in #4859

New Contributors

Full Changelog: v0.20.0-beta.5...v0.20.0-rc.1

  •  

v0.20.0-beta.5

❗ 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): scroll wide math blocks instead of clipping by @Jocs in #4751
  • fix(desktop): route undo/redo to CodeMirror in source code mode by @Jocs in #4752
  • fix(muya): leave Tab to the IME during composition by @Jocs in #4753
  • fix(desktop): add a context menu to the sidebar root folder by @Jocs in #4754
  • fix(muya): preserve code fence length on serialize by @Jocs in #4755
  • fix(muya): refresh math/diagram preview on undo by @Jocs in #4756
  • fix(desktop): resolve relative local links on export by @Jocs in #4757
  • fix(muya): require a word boundary before an emoji shortcode by @Jocs in #4758
  • fix(desktop): don't overwrite an existing file when creating from the sidebar by @Jocs in #4759
  • fix(desktop): ignore content-identical file-change events by @Jocs in #4760
  • fix(desktop): make the source-mode selection visible on dark themes by @Jocs in #4771
  • fix(desktop): persist export dialog options across sessions by @Jocs in #4768
  • fix(muya): convert $$ to a math block in place inside a list item by @Jocs in #4767
  • fix(muya): self-close generated tags for JSX/MDX compatibility by @Jocs in #4766
  • fix(muya): preserve current-line indent on Enter in code fences by @Jocs in #4761
  • fix(muya): make autolinks and bare URLs followable on Cmd/Ctrl-click by @Jocs in #4763
  • fix(muya): exclude selection whitespace when applying inline format by @Jocs in #4762
  • fix(desktop): make empty-state CTA button labels readable in all themes by @Jocs in #4775
  • fix(muya): surface the KaTeX parse error for invalid math by @Jocs in #4764
  • fix(desktop): keep sidebar width + tree collapse state across icon toggle by @Jocs in #4769
  • fix(muya): recognize c++/h++ as aliases for the cpp code grammar by @Jocs in #4794
  • fix(muya): don't highlight LaTeX \% as a comment by @Jocs in #4795
  • fix(muya): recolor sequence-diagram text/boxes for dark themes by @Jocs in #4800
  • fix(muya): keep image resize handles attached on layout reflow by @Jocs in #4802
  • fix(muya): make cpp c++/h++ alias registration idempotent by @Jocs in #4816
  • fix(desktop): preserve TOC collapse state across content edits by @Jocs in #4803
  • fix(desktop): make Paragraph/Format commands inert in source mode (grey out menus) by @Jocs in #4810
  • fix(desktop): New File on a collapsed sidebar folder expands it by @Jocs in #4809
  • fix(desktop): select the query when re-opening the Find bar by @Jocs in #4807
  • fix(desktop): keep diagram content when exporting with Header & Footer by @Jocs in #4805
  • fix(desktop): list bundled fonts in the font picker by @Jocs in #4801
  • fix(desktop): remove doubled Edit-menu separator on Windows/Linux by @Jocs in #4797
  • fix(desktop): generate a PDF outline from headings on export by @Jocs in #4798
  • fix(desktop): avoid PDF/print page breaks right after a heading by @Jocs in #4799

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

  •  

v0.20.0-beta.4

❗ 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(renderer): keep the key bindings hover row readable on dark themes by @FurkaanBoraa in #4719
  • fix(renderer): make the custom dictionary table readable on dark themes by @FurkaanBoraa in #4721
  • feat(muya): self-contained editor typography via --mu-* options by @Jocs in #4722
  • refactor(desktop): consume muya self-contained typography, remove shell style injection by @Jocs in #4726
  • fix(muya): move preview toolbar to the block's top-right by @Jocs in #4734
  • fix(renderer): hide muya float tools in source-code mode by @Jocs in #4732
  • fix(desktop): remove duplicate title when using the native title bar by @Jocs in #4630
  • fix(muya): keep a nested sublist when forward-deleting an empty list item (#1845) by @Jocs in #4725
  • fix(muya): remove the inner format when un-toggling a nested inline run (#2063) by @Jocs in #4727
  • docs: add commenting guidelines by @Jocs in #4738
  • fix(muya): escape parentheses in inserted image paths (#3060) by @Jocs in #4728
  • fix(muya): decode HTML entities in fetched page titles when pasting a URL (#2525) by @Jocs in #4729
  • fix(muya): reset search state when the document is replaced (#1932) by @Jocs in #4730
  • fix(muya): split on Enter over a cross-block selection (#2443) by @Jocs in #4735
  • fix(muya): let Enter replace a selection when the format toolbar is shown (#3196) by @Jocs in #4736
  • fix(muya): stop punctuation after a link wrapping to its own line (#2258, #3025) by @Jocs in #4737
  • chore: audit Claude-authored comments against the commenting guidelines by @Jocs in #4740
  • fix: normalize HTML task-list paste by @Renakoni in #4710
  • fix: preserve bare URL HTML links on paste by @Renakoni in #4711
  • fix: preserve whitespace-only plain text paste by @Renakoni in #4706
  • fix: preserve nested HTML lists under ordered parents by @Renakoni in #4709
  • fix: prevent nested empty list items from becoming setext headings by @Renakoni in #4697
  • fix: preserve empty task list items when parsing markdown by @Renakoni in #4696
  • fix: remove ~1s sidebar delay for newly created files (#3955) by @Jocs in #4744
  • fix(i18n): degrade malformed translations to raw text instead of crashing (#4046) by @Jocs in #4745
  • fix: vertically center task list checkbox with item text by @Jocs in #4750
  • fix(desktop): prefer UTF-8 when a file is valid UTF-8 instead of trusting ced (#3151) by @Jocs in #4739
  • fix(desktop): scroll the view up when the caret moves above the viewport (#3329) by @Jocs in #4742
  • fix: scroll the active tab into view on tab switch (#3958) by @Jocs in #4743

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

  •  

v0.20.0-beta.3

❗ 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): restore vue-tsc typecheck (vite 7 PluginOption) by @Jocs in #4667
  • fix(release): support immutable releases (draft-then-promote) + docs by @Jocs in #4666
  • fix(muya): undo/redo corruption on coalesced paragraphβ†’list + text edits by @Jocs in #4669
  • fix(renderer): keep find-bar prefill from being clobbered on open by @NSO73 in #4646
  • fix(muya): preserve nested-list indentation in RTL mode by @Jocs in #4676
  • fix(muya): load mhchem onto the same katex instance so \ce renders (#4670) by @Jocs in #4674
  • fix(muya): keep inline links that are followed by a bare URL or text (#4671) by @Jocs in #4672
  • fix(keybinding): sync menu bar and command palette when keybindings change by @Jocs in #4681
  • fix(muya): guard detached code block in language selector (#4654) by @Jocs in #4677
  • test(e2e): stabilize flaky search-prefill test (wait for selection commit) by @Jocs in #4682
  • fix: export PDF/HTML/print in the editor's text direction (RTL) by @Jocs in #4678
  • fix(muya): create a code-block when typing ``` + Enter inside block-quotes and lists by @Jocs in #4689
  • fix(muya): prevent undo/redo exceptions from permanently disabling history (#4685) by @Jocs in #4692
  • fix(muya): auto-hide inline markers when holding an arrow key out of a token by @Jocs in #4694
  • test(e2e): replace fixed waits with expect.poll in editor-input by @NSO73 in #4695
  • fix: normalize first-row colspan table paste by @Renakoni in #4707
  • fix(renderer): use the theme text colour for the key bindings list (#3937) by @FurkaanBoraa in #4713
  • fix: wrap selected text when typing auto-pair characters by @Renakoni in #4698
  • fix(muya): skip empty sibling containers in caret navigation (#4644 follow-up) by @FurkaanBoraa in #4715
  • fix(muya): stop the paragraph front-menu from acting on a stale block (#4686) by @Jocs in #4714
  • fix(muya): re-sync the live tree from json state when an undo/redo apply throws by @Jocs in #4717
  • fix(desktop): paint the launch window in the active theme's background (#3957) by @FurkaanBoraa in #4718

New Contributors

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

  •  

v0.20.0-beta.2

❗ 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(release): v0.19.0 release branch (DO NOT MERGE until stable) by @Jocs in #4269
  • chore: bump develop to 0.20.0-dev by @Jocs in #4296
  • docs(release): update Step 7 asset list to 24 by @Jocs in #4298
  • docs(end-user): align user docs with 0.19 prefs and platform matrix by @Jocs in #4300
  • docs(dev): sync developer docs with current codebase by @Jocs in #4299
  • chore: convert repo to pnpm monorepo (packages/desktop, muyajs, website) by @Jocs in #4302
  • refactor(website): migrate to Next.js 15 + Cloudflare Workers CI by @Jocs in #4305
  • feat(website): serve www.marktext.me (301 β†’ apex) by @Jocs in #4308
  • fix(website): wwwβ†’apex redirect (middleware) + smarter preview-URL parsing by @Jocs in #4309
  • ci(website): enable Preview URLs on marktext-website Worker by @Jocs in #4311
  • refactor(website): redesign landing page, drop markdown engine deps by @Jocs in #4312
  • feat(muya): migrate TS rewrite to packages/muya alongside legacy muyajs by @Jocs in #4314
  • feat(website): add /docs route and consolidate docs/ under packages/website/ by @Jocs in #4316
  • fix: replace remaining absolute raw.githubusercontent.com URLs with relative paths in READMEs by @Jocs with @Copilot in #4329
  • fix(website): serve prerendered docs pages via static-assets cache by @Jocs in #4335
  • fix(website): open download buttons in new tab pointing to releases page by @Jocs in #4336
  • refactor(website): simplify docs subtree (palette / sidebar / markdown / nav) by @Jocs in #4349
  • refactor(website): simplify landing page (helpers, types, data-driven blocks) by @Jocs in #4350
  • chore(website): tighten middleware matcher; drop unused 'use client' by @Jocs in #4351
  • fix(muyajs): preserve nested lists of differing types (#4341) by @Jocs in #4354
  • fix(muyajs): allow CJK ideographs as flanking boundary for emphasis by @Jocs in #4355
  • fix(muyajs): clamp setStart offset to legal range to prevent IndexSizeError (#2800) by @Jocs in #4358
  • fix(muyajs): null-guard list block paths to prevent renderer crash (#4346) by @Jocs in #4359
  • fix: restore local builds after monorepo split by @Jocs in #4361
  • fix(release): add repository field for electron-builder by @Jocs in #4368
  • fix(muyajs): split correct paragraph on Enter in multi-block list items (#4374) by @Jocs in #4376
  • fix(renderer): improve graphite contrast and unify accent colors (#4377) by @Jocs in #4378
  • feat(muya): expose desktop-required public API accessors by @Jocs in #4381
  • feat(muya): expose themeable CSS variables and diagram theming by @Jocs in #4382
  • feat(muya): add block duplicate/insert/delete public API by @Jocs in #4384
  • feat(muya): restore flowchart and sequence diagrams by @Jocs in #4385
  • feat(muya): add ImagePathPicker floating autocomplete UI by @Jocs in #4386
  • fix(muya): unbreak lint:css (stylelint 17 compatibility) by @Jocs in #4388
  • feat(muya): add cursorCoords + active formats to selection-change by @Jocs in #4387
  • feat(muya): implement focus mode (dim inactive blocks) by @Jocs in #4389
  • feat(muya): emit format-click and preview-image interaction events by @Jocs in #4390
  • feat(muya): add updateParagraph block-type conversion API by @Jocs in #4391
  • feat(muya): add runtime setOptions / setFont / setTabSize / setListIndentation by @Jocs in #4393
  • feat(muya): add spellcheck word-replacement API by @Jocs in #4392
  • feat(muya): serialize/restore undo history by @Jocs in #4394
  • feat(muya): add invalidateImageCache by @Jocs in #4396
  • test(muya): port MarkText regression cases (#4341/#4307/#4190) by @Jocs in #4399
  • feat(muya): add createTable / insertImage / setCursor API by @Jocs in #4397
  • feat(muya): add clipboardFilePath paste hook by @Jocs in #4398
  • fix(muya): treat CJK as punctuation for strong/em flanking (#4307) by @Jocs in #4401
  • feat(desktop): consume @muyajs/core in util files (markdownToHtml/pdf/dompurify/printService/sourceCode/icon) by @Jocs in #4402
  • feat(desktop): add kebab-case editor CSS vars to themes for @muyajs/core by @Jocs in #4404
  • feat(desktop): migrate editor.vue to @muyajs/core engine by @Jocs in #4406
  • fix(i18n): unify quick-insert hint to "/" trigger by @Jocs in #4405
  • test(parity): failing-test scoreboard for #4406 muyajsβ†’@muyajs/core gaps by @Jocs in #4407
  • fix(muya): insertParagraph immediate-block anchoring in nested blocks (PG13) by @Jocs in #4408
  • fix(muya): consume autoCheck + hideLinkPopup options (PG3/PG12) by @Jocs in #4409
  • feat(muya): expose block affiliation in selection-change (PG1) by @Jocs in #4410
  • feat(muya): restore clipboard image paste + imageAction routing + copyAsRich (PG5/PG6/PG9) by @Jocs in #4411
  • fix(muya): inline export CSS + heading ids for offline export & TOC anchors (PG7/PG8) by @Jocs in #4412
  • feat(muya): emit preview-image + heading-copy-link events (PG10/PG11) by @Jocs in #4414
  • feat(muya): restore drag-and-drop image insertion (PG4) by @Jocs in #4413
  • feat(desktop): wire @muyajs/core parity APIs (menu state, copyAsRich, heading-link, source cursor, saved indicator) by @Jocs in #4415
  • fix(desktop): pass imageAction + getPathForFile to Muya constructor (re-activate PG4/5/6) by @Jocs in #4417
  • fix(muya): resolve pre-existing lint:css no-descending-specificity by @Jocs in #4419
  • fix(muya): record source-mode bulk edit as a single undo boundary (PG14) by @Jocs in #4420
  • test(desktop): remove redundant muyajs-engine unit specs (Phase F) by @Jocs in #4422
  • fix(desktop): retarget theme.ts editor CSS at muya mu-* classes (E4) by @Jocs in #4421
  • fix(desktop): port print image-src resolution off muyajs (last muya/lib import) by @Jocs in #4423
  • fix(muya): crash typing '#' β€” guard I18n.t + add heading-copy-link locale key by @Jocs in #4424
  • fix(muya): add missing image i18n keys ('Click to add an image' / 'Load image failed') by @Jocs in #4427
  • fix(muya): render relative image paths anchored to the document dir (Phase G blocker) by @Jocs in #4428
  • fix(desktop): Editβ–ΈReplace action + saved-indicator false-clean (Phase G) by @Jocs in #4431
  • fix(muya): preserve drive/UNC roots in relative image path resolution (#4428 review follow-up) by @Jocs in #4430
  • fix: source-mode cursor sync + language-switch hint refresh (Phase G G7/G8) by @Jocs in #4432
  • fix(muya): updateParagraph data-loss on list/quote + front-matter insertion + frontmatterType lang (Phase G) by @Jocs in #4429
  • test: cover @muyajs/core migration regression gaps (Phase G) by @Jocs in #4434
  • fix(muya): restore cross-cell table selection + resolve dead TableChessboard picker (Phase G) by @Jocs in #4435
  • test(muya): de-flake heading-locale + backspace regression specs (#4434 review) by @Jocs in #4436
  • fix(muya): restore the in-editor table grid picker (revert #4435 chessboard deletion + wire trigger) by @Jocs in #4437
  • docs: archive the muyajs β†’ @muyajs/core migration tracker by @Jocs in #4438
  • chore: keep .claude/ fully ignored (untrack migration tracker) by @Jocs in #4439
  • fix: restore editor visual parity after @muyajs/core migration by @Jocs in #4443
  • fix(muya): align Cmd+A / copy / cut / paste with legacy muyajs by @Jocs in #4446
  • chore(muya): align packages/muya conventions with desktop + doc cleanup by @Jocs in #4450
  • fix(muya): editor parity with muyajs (themes, fonts, spellcheck) + CLASS_NAMES cleanup by @Jocs in #4454
  • refactor(muya): split clipboard into modules + type copy/paste modes as enums by @Jocs in #4459
  • fix(muya): enable inline image resize by @Jocs in #4460
  • refactor(muya): rebuild ImageEditTool to match muyajs ImageSelector by @Jocs in #4461
  • chore: remove ununsed comments by @Jocs in #4462
  • chore(muya): remove redundant comments added during the muyajs port by @Jocs in #4463
  • refactor(muya): unify Selection into facade over Text/Table/Image sub-selections by @Jocs in #4467
  • fix(muya): match muyajs nested list spacing and bullet markers by @Jocs in #4469
  • fix(editor): restore caret on source-mode undo and tab switch by @Jocs in #4470
  • fix(muya): preventDefault on forward-delete paragraph merge by @Jocs in #4471
  • fix(muya): restore Paste as Plain Text via async clipboard read by @Jocs in #4472
  • fix(muya): stop drag-selection from expanding to whole blocks by @Jocs in #4477
  • fix(muya): delete whole image on backspace (inline, raw html, reference) by @Jocs in #4478
  • fix(muya): stop Shift+Tab unindent from crashing on insertTab by @Jocs in #4479
  • fix(muya): stop arrow nav from crashing on null cursor coords by @Jocs in #4480
  • fix(muya): clear the / trigger when quick-inserting front matter by @Jocs in #4481
  • fix(desktop): make Promote Heading shortcut fire on macOS by @Jocs in #4482
  • fix(desktop): refresh muya locale on language switch (hint + quick-insert menu stay translated) by @Jocs in #4489
  • fix(desktop): anchor theme card h3 label to its heading by @Jocs in #4490
  • fix(muya): stop in-flight float positioning from re-revealing a hidden float by @Jocs in #4491
  • fix(desktop): return relative image path for local-path-string inserts by @Jocs in #4492
  • fix: insert web images dragged from a browser by @Jocs in #4494
  • fix(muya): support resizing images that share the same link by @Jocs in #4495
  • fix(muya): render vega-lite diagrams under the renderer CSP by @Jocs in #4496
  • fix(muya): refresh local images on "Reload images" (View β†’ Reload images) by @Jocs in #4498
  • fix: reflect the current block in the Paragraph menu (PG1) by @Jocs in #4500
  • fix(muya): keep selection after applying an inline format to a range by @Jocs in #4501
  • fix(desktop): reflect underline/superscript/subscript/highlight in the Format menu by @Jocs in #4503
  • fix: paragraph menu / command palette parity (focus, list unwrap, shortcut symbols) by @Jocs in #4504
  • fix(muya): keep cursor in place when toggling Loose List Item by @Jocs in #4506
  • refactor(muya): rework the selection type surface by @Jocs in #4512
  • fix(desktop): point in-app docs links at marktext.me by @Jocs in #4513
  • fix(website): point self-referential doc links at the published docs by @Jocs in #4514
  • fix(website): register the missing end-user docs pages by @Jocs in #4515
  • feat(i18n): add Turkish (tr) locale by @FurkaanBoraa in #4510
  • feat: make PlantUML server URL configurable by @jyte in #4400
  • fix: #4474 unsaved indicator never clears after undoing back to on-disk content by @FurkaanBoraa in #4475
  • fix(test): correct PlantUML custom-server URL assertion by @Jocs in #4517
  • fix(i18n): reconcile desktop & muya locale keys after the muya engine refactor by @Jocs in #4516
  • test(muya): backfill engine-unit coverage for audited gaps by @Jocs in #4508
  • test(muya-e2e): backfill real-DOM e2e coverage for audited gaps by @Jocs in #4511
  • test(desktop): backfill renderer/main unit coverage for audited gaps by @Jocs in #4509
  • refactor(muya): return enums from TextSelection direction/type by @Jocs in #4519
  • refactor(muya): setSelection takes anchor/focus endpoints by @Jocs in #4523
  • refactor(muya): route format/codeblock selection through setCursor by @Jocs in #4520
  • refactor(muya): split ICursor into focused interfaces by @Jocs in #4524
  • refactor(muya): keep table rect selection exclusive of text selection by @Jocs in #4522
  • refactor(muya): extract computeDirection/computeCaretType helpers by @Jocs in #4525
  • refactor(muya): simplify selectAll into three escalation rules by @Jocs in #4526
  • test(muya): replace any with precise block/state types in specs by @Jocs in #4528
  • refactor(desktop): remove no-explicit-any suppressions in favor of precise types by @Jocs in #4527
  • refactor(muya): drop cyclomatic complexity below 20 across the engine by @Jocs in #4529
  • refactor(muya): rename selection enum members to UPPER_SNAKE_CASE by @Jocs in #4531
  • chore: translate remaining Chinese console/debug strings to English by @Jocs in #4533
  • refactor(muya): enforce _ prefix for private members via lint by @Jocs in #4535
  • refactor(muya): mark core/state/selection internals private by @Jocs in #4541
  • refactor(muya): mark block-tree internals private/protected by @Jocs in #4538
  • refactor(muya): mark UI float-tool internals private by @Jocs in #4539
  • refactor(desktop): remove remaining no-explicit-any suppressions by @Jocs in #4548
  • feat: align Paragraph/Format menus with muyajs behavior on @muyajs/core (+3 upgrades) by @Jocs in #4547
  • fix(muya): sync inline format toolbar highlight via selection-change by @Jocs in #4558
  • fix(muya): align normalizePastedHTML link unlinking with muyajs by @Jocs in #4550
  • fix(muya): render footnotes in copy-as-html / copy-as-rich clipboard HTML by @Jocs in #4544
  • fix(muya): align clipboard cut/delete semantics with muyajs by @Jocs in #4540
  • fix(muya): collapse code block to paragraph on cross-block cut from its language line (#918) by @Jocs in #4545
  • fix(muya): merge pasted paragraphs/headings inline (muyajs parity) by @Jocs in #4542
  • fix(muya): replace selected image on paste + language-input paste parity by @Jocs in #4543
  • fix(muya): merge same-type list paste + plain-text block HTML (muyajs parity) by @Jocs in #4546
  • fix(muya): round-2 paste/clipboard parity fixes from a full muyajs re-audit by @Jocs in #4549
  • fix: populate the table of contents on open and fix link navigation by @NSO73 in #4448
  • fix(desktop): paste captured image on macOS Edit β†’ Screenshot by @Jocs in #4566
  • fix(muya): restore editor cursor when closing the search bar (selectHighlight) by @Jocs in #4567
  • fix(muya): restore find-bar prefill from editor selection by @Jocs in #4569
  • fix(search): scroll editor to match when opening a folder-search result by @Jocs in #4568
  • fix(muya): serialize lists with the configured listIndentation by @Jocs in #4570
  • fix(muya): restore the focused frontmatter delimiter markers by @Jocs in #4571
  • fix(muya): show code-block line numbers on first render for language-less blocks by @Jocs in #4572
  • fix(muya): re-parse on parse-affecting option changes so ```math toggles live by @Jocs in #4573
  • fix(export): repair five styled-HTML export regressions (math, vega, footnotes, TOC, images) by @Jocs in #4576
  • fix(export): make "Overwrite theme font" actually override the selected theme by @Jocs in #4579
  • fix(editor): restore per-tab caret on tab switch by @Jocs in #4580
  • fix(editor): restore undo after an external file reload by @Jocs in #4582
  • fix(desktop): auto-focus the editor when creating or opening a tab by @Jocs in #4581
  • fix(editor): align code block line numbers vertically by @Jocs in #4583
  • fix(editor): keep spelling suggestions when "no underline" is enabled by @Jocs in #4584
  • refactor(muya): decouple engine/block layers from src/ui plugin internals by @Jocs in #4587
  • fix(clipboard): copy only the selected part of cross-block selections by @Jocs in #4586
  • fix(muya): correct setext heading level when typing the underline by @Jocs in #4591
  • fix(muya): guard checkNeedRender against a null cursor (image-preview reclick crash) by @Jocs in #4588
  • test(desktop): backfill renderer/main unit coverage for post-migration gaps by @Jocs in #4592
  • test(muya-e2e): backfill real-DOM e2e coverage for post-migration gaps by @Jocs in #4593
  • test(muya): backfill engine unit coverage for post-migration gaps by @Jocs in #4589
  • test(desktop): backfill app e2e coverage for post-migration gaps by @Jocs in #4594
  • chore(security): remediate 25 Dependabot alerts by @Jocs in #4596
  • chore(deps): upgrade all packages to latest + align shared versions by @Jocs in #4597
  • test(muya): poll for the html_tag mount instead of waiting a single frame by @Jocs in #4607
  • fix(muya): escape pipes at cell start and consecutive pipes in table serialization by @Jocs in #4601
  • fix(muya): absorb a manually typed closing markdown marker after text by @Jocs in #4602
  • fix(muya): let Shift+ArrowUp/Down extend selection while the inline toolbar is shown by @Jocs in #4603
  • fix(muya): render
  • fix(muya): keep emphasis intact when a line contains escaped dollar signs by @Jocs in #4605
  • fix(muya): paste a URL into link parentheses without nesting a markdown link by @Jocs in #4608
  • fix(muya): make links inside a raw HTML block clickable by @Jocs in #4609
  • fix(muya): correct inline code/math shortcut labels in the format toolbar by @Jocs in #4611
  • fix: #4356 crash when using the link popover on a link with an unsupported protocol by @FurkaanBoraa in #4473
  • fix(muya): map Β  to U+00A0 and keep escaped spaces unbreakable by @Jocs in #4612
  • fix(desktop): scroll to non-heading in-document anchors on Ctrl/Cmd-click by @Jocs in #4613
  • fix(muya): keep the inline-math parse-error message on one line by @Jocs in #4614
  • fix(muya): allow inline style in the html-block live preview by @Jocs in #4618
  • fix(muya): cap and horizontally scroll the inline-math popup by @Jocs in #4615
  • fix(desktop): isolate the editor stacking context so previews stay under modals by @Jocs in #4617
  • test(desktop): fix inline code/math shortcut tests failing on develop after #4611 by @FurkaanBoraa in #4624
  • fix(desktop): scroll CodeMirror to the heading on TOC click in source mode by @Jocs in #4619
  • fix(muya): constrain a rendered diagram svg so wide diagrams don't clip by @Jocs in #4616
  • fix(desktop): apply custom keybinding changes without an app restart by @Jocs in #4621
  • fix(muya): break undo entries at word and edit-kind boundaries by @Jocs in #4622
  • fix(muya): swap cross-block arrow boundary keys in RTL mode by @Jocs in #4610
  • fix: opaque light-theme editor text colors for crisp antialiasing by @Jocs in #4631
  • fix(muya): clamp selection offset to the node's legal range by @Jocs in #4626
  • fix(desktop): prevent data loss when closing after Source Code mode edits by @Jocs in #4627
  • fix(muya): center inline math vertically so it sits on the text baseline by @Jocs in #4632
  • fix(muya): render inline math containing an escaped dollar sign by @Jocs in #4629
  • fix(muya): prevent renderer crash when deleting consecutive thematic breaks by @Jocs in #4628
  • test: drop the low-value opaque-color guard tests from #4466 by @Jocs in #4633
  • test(muya): regression guard for code-block scroll on typing (#3191) by @Jocs in #4638
  • fix(muya): align serialized table columns by visual width (#1983) by @Jocs in #4636
  • fix(muya): insert ordinary spaces for Tab instead of non-breaking spaces (#3273) by @Jocs in #4634
  • fix(muya): convert typed diagram fences to diagram blocks on Enter (#2177) by @Jocs in #4635
  • fix(muya): keep the caret on Shift+Tab list unindent (REPLACEMENT path) (#3223) by @Jocs in #4637
  • fix(muya): typed diagram fences create diagram blocks via the language selector (#2177) by @Jocs in #4640
  • refactor: rewrite getTOC and remove unused comments by @Jocs in #4642
  • fix(muya): allow trailing whitespace after a math block's closing $$ (#1931) by @Jocs in #4649
  • fix(muya): stop ArrowDown from endlessly creating empty paragraphs (#3520) by @Jocs in #4650
  • fix(muya): take the list marker from a line start in _convertToList (#2429) by @Jocs in #4651
  • fix(muya): strip trailing punctuation from extended autolinks (#2096) by @Jocs in #4652
  • fix(muya): ArrowUp at document start moves the caret to offset 0 (#3193) by @Jocs in #4655
  • fix(muya): destroy UI plugins on Muya.destroy() to stop leaking DOM nodes (#3315) by @Jocs in #4659
  • fix(muya): don't cut a cross-block selection on Ctrl+ (Windows/Linux) (#3491) by @Jocs in #4656
  • fix(muya): apply inline format across paragraphs nested in one blockquote (#3462) by @Jocs in #4661
  • fix: #4534 group theme menu into Light/Dark submenus by @FurkaanBoraa in #4623
  • fix(muya): drop pending op batch on setContent to prevent cross-document corruption (#2938) by @Jocs in #4658
  • test(desktop): pin autosave's recreate-missing-directory behavior (#3509) by @Jocs in #4657
  • fix(muya): keep list item non-empty on Enter in empty first paragraph (#4644) by @Jocs in #4660

New Contributors

Full Changelog: v0.19.0...v0.20.0-beta.2

  •  

v0.19.1

⚠️ 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(release): v0.19.0 release branch (DO NOT MERGE until stable) by @Jocs in #4269
  • chore: bump develop to 0.20.0-dev by @Jocs in #4296
  • docs(release): update Step 7 asset list to 24 by @Jocs in #4298
  • docs(end-user): align user docs with 0.19 prefs and platform matrix by @Jocs in #4300
  • docs(dev): sync developer docs with current codebase by @Jocs in #4299
  • chore: convert repo to pnpm monorepo (packages/desktop, muyajs, website) by @Jocs in #4302
  • refactor(website): migrate to Next.js 15 + Cloudflare Workers CI by @Jocs in #4305
  • feat(website): serve www.marktext.me (301 β†’ apex) by @Jocs in #4308
  • fix(website): wwwβ†’apex redirect (middleware) + smarter preview-URL parsing by @Jocs in #4309
  • ci(website): enable Preview URLs on marktext-website Worker by @Jocs in #4311
  • refactor(website): redesign landing page, drop markdown engine deps by @Jocs in #4312
  • feat(muya): migrate TS rewrite to packages/muya alongside legacy muyajs by @Jocs in #4314
  • feat(website): add /docs route and consolidate docs/ under packages/website/ by @Jocs in #4316
  • fix: replace remaining absolute raw.githubusercontent.com URLs with relative paths in READMEs by @Copilot in #4329
  • fix(website): serve prerendered docs pages via static-assets cache by @Jocs in #4335
  • fix(website): open download buttons in new tab pointing to releases page by @Jocs in #4336
  • refactor(website): simplify docs subtree (palette / sidebar / markdown / nav) by @Jocs in #4349
  • refactor(website): simplify landing page (helpers, types, data-driven blocks) by @Jocs in #4350
  • chore(website): tighten middleware matcher; drop unused 'use client' by @Jocs in #4351
  • fix(muyajs): preserve nested lists of differing types (#4341) by @Jocs in #4354
  • fix(muyajs): allow CJK ideographs as flanking boundary for emphasis by @Jocs in #4355
  • fix(muyajs): clamp setStart offset to legal range to prevent IndexSizeError (#2800) by @Jocs in #4358
  • fix(muyajs): null-guard list block paths to prevent renderer crash (#4346) by @Jocs in #4359
  • fix: restore local builds after monorepo split by @Jocs in #4361

New Contributors

  • @Copilot made their first contribution in #4329

Full Changelog: v0.19.0...v0.19.1

  •  
❌