❌

Lees weergave

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

  •  

v0.19.0

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

  • Ignore empty key bindings by @fxha in #3077
  • Update auto pair quote logic by @Lorilandly in #2960
  • Fix image paste handler is not executed by @fxha in #3076
  • Add experimental native support for Apple M1 by @fxha in #3089
  • Update dependencies by @fxha in #3096
  • Fix: "delete" shortcut on a selected image deletes the text after it (#2816) by @kiyoka in #3088
  • Fix links to macOS releases by @yous in #3099
  • Fix typo in the DataCenter class init method by @vdeschuy in #3104
  • 0.17.1 by @fxha in #3105
  • Fixed multi line highlight. by @or1ko in #3115
  • Don't copy (or on cut) empty data to the clipboard, matches native behavior by @mitchcapper in #3130
  • Upgrade Electron to v17 by @fxha in #3138
  • Remove Wayland workaround by @fxha in #3147
  • Refactor menu actions and shortcut handling by @fxha in #3032
  • Replace node-spellchecker with Electron builtin spell checker by @fxha in #2895
  • Remove expired "marktext.app" domain by @CouldBeThis in #3350
  • fix wrong logo path in ko.md by @heli-os in #3576
  • Update Traditional Chinese translation of README by @ChiahongHong in #3264
  • Update dependencies by @fxha in #3213
  • Add .mdx extension support by @davidknezic in #3438
  • FIX: 'yarn run test:specs' command fails to load @markedjs/html-differ (#3330) by @kiyoka in #3331
  • fix #3150: Win32 error in renderer process by @fxha in #3214
  • Fix roadmap link by @fulldecent in #3678
  • upgrade to mermaid 10 by @ivy-rew in #3734
  • [i18n] Improve portuguese translation on the README by @tiagozip in #3813
  • chore: update readme add Inkio and remove broken link by @Jocs in #4084
  • chore: Update outdated GitHub Actions versions by @pgoslatara in #4113
  • Add arabic lang for doc by @Almohawis in #4097
  • chore: update readme file by @Jocs in #4136
  • docs: improve grammar & punctuation by @RightWrite in #3939
  • add .claude .agents to gitignore by @chongchonghe in #4172
  • Note added according to the issue #2208 by @aespondac in #3867
  • fix: upload failure with github (#3588) by @left0ver in #3589
  • Fix not colored emojis on popup by @fxha in #3215
  • fix issue 3268 by @hahaha28 in #3269
  • fix: #4153 suppress EPIPE crash in main process by @Wordbe in #4154
  • New feature: Opening image file with the external tool (#2321) by @kiyoka in #3007
  • fix: guard null imageContainer.firstChild in getImageInfo by @Jocs in #4193
  • fix: prevent querySelector crash on empty heading slug by @Bowl42 in #4135
  • Re-Factor MarkText with electron-vite by @Tkaixiang in #4001
  • fix: restore docs accidentally deleted in PR #4001 (electron-vite refactor) by @Jocs in #4196
  • restore: recover accidentally deleted tests from PR #4001 by @Jocs in #4197
  • chore: upgrade project dependencies to latest compatible versions by @Jocs in #4199
  • translate: convert all Chinese code comments to English by @Jocs in #4201
  • fix: fix ESLint configuration and resolve all lint errors by @Jocs in #4202
  • fix: resolve post-refactor regressions from electron-vite migration by @Jocs in #4203
  • Make native menu theme follow app theme by @johnsmith507 in #4205
  • feat: add GitHub Sponsors button to repository by @Jocs in #4207
  • feat: update sponsor by @Jocs in #4208
  • i18n: translate sponsor section in all language READMEs by @Jocs in #4209
  • fix: support Node v24+ with native-keymap C++20 patch and automated postinstall by @Jocs in #4211
  • fix: ensure npm run dev works after npm install on Node v24+ by @Jocs in #4212
  • feat: migrate package manager from npm to pnpm by @Jocs in #4213
  • docs: display special sponsor as a Markdown table by @Jocs in #4215
  • docs: update stale references and add CLAUDE.md by @Jocs in #4216
  • ci: replace manual test_pr with automated PR workflows by @Jocs in #4218
  • fix: word count tooltip not showing on macOS by @Jocs in #4219
  • fix: restore image fullscreen viewer broken by view-image removal by @Jocs in #4221
  • feat: restore third-party license tooling and add CI validation by @Jocs in #4220
  • fix: prevent crash in normalizeTable when body row has more cells than header by @Jocs in #4222
  • fix: skip conflict detection for unbound shortcuts in keybinding loader by @Jocs in #4223
  • fix: avoid reloading existing i18n locales by @cerredz in #4224
  • fix: migrate jsconfig.json away from deprecated baseUrl (TS 6.0) by @Jocs in #4225
  • fix: remove unused languine dependency (resolves CVE-2026-41650) by @Jocs in #4226
  • chore: remove unused deps and upgrade all dependencies to latest by @Jocs in #4227
  • ci: add Claude Code Action workflow by @Jocs in #4228
  • fix: add pnpm-workspace.yaml to approve build scripts for native deps by @Jocs in #4230
  • fix: build error when build mac target by @Jocs in #4232
  • fix: use default font smoothing by @cerredz in #4217
  • docs: update CommonMark Spec links to latest version by @Jocs in #4235
  • fix: #4151 preserve scroll position on external file change by @Wordbe in #4152
  • fix: Internal image cache isn't reset if failed to load (#3001) by @kiyoka in #3010
  • Allow scrolling down even if no contents below by @szdytom in #3405
  • Added Arch Linux to development dependencies in BUILD.md by @lawgimenez in #3381
  • fix(i18n): capitalize GitHub in English and Portuguese locale strings by @Blueteemo in #4238
  • docs: expand CLAUDE.md with single-test recipes and dev script catalog by @Jocs in #4239
  • fix: unblock local lint and vitest runs by @Jocs in #4240
  • test(e2e): broaden Playwright coverage with menu/IPC-driven specs by @Jocs in #4241
  • fix(ui): repair Insert Table dialog wrap and overhaul Help menu by @Jocs in #4242
  • fix(source-view): stop styling math subscripts as emphasis (#4121) by @Jocs in #4243
  • feat(security): sandbox the renderer (contextIsolation, nodeIntegration: false, sandbox: true) by @Jocs in #4244
  • feat(ts): migrate the entire project to TypeScript by @Jocs in #4247
  • refactor(stores): type editor + preferences Pinia stores (TS migration follow-up 1/6) by @Jocs in #4249
  • refactor(renderer): type prefComponents schemas + leaf SFC controls (TS migration follow-up 2/6) by @Jocs in #4250
  • refactor(test): port specs to strict TS β€” drop @ts-nocheck, ESM imports (TS migration follow-up 3/6) by @Jocs in #4251
  • refactor(renderer): type sidebar + top-level SFCs β€” drop @ts-nocheck (TS migration follow-up 4/6) by @Jocs in #4252
  • refactor(renderer): type editor + components SFCs β€” drop @ts-nocheck (TS migration follow-up 5/6) by @Jocs in #4253
  • refactor(renderer): type preference page SFCs β€” drop @ts-nocheck (TS migration follow-up 6/6) by @Jocs in #4254
  • chore(eslint): tighten @typescript-eslint/no-explicit-any to error (TS migration follow-up 7/7) by @Jocs in #4255
  • chore(eslint): ignore .claude/ worktree clones in lint runs by @Jocs in #4256
  • fix(ipc): tighten three IPC channels + SET_IMAGE_FOLDER_PATH signature by @Jocs in #4258
  • fix(renderer): editor fills width when sidebar collapses to icon strip by @Jocs in #4262
  • style(preferences): polish dialog UI and unify design by @Jocs in #4263
  • style(ui): batch polish sidebar, tabs, preferences, and theme contrast by @Jocs in #4264
  • style(sidebar): unify collapse arrows and tighten tree spacing by @Jocs in #4265
  • fix(muya): guard stale cursor/block lookups against null by @Jocs in #4267
  • ci(release): split into validateβ†’buildβ†’publish, harden workflow by @Jocs in #4266
  • test(e2e): regression guards for previously-reported "Unexpected error" crashes by @Jocs in #4268
  • docs(release): expand RELEASE.md into a step-by-step playbook by @Jocs in #4270
  • fix(release): restore updater metadata artifacts by @Jocs in #4272
  • fix(sidebar): create-file button works in non-English locales by @Jocs in #4273
  • chore: remove unused SVG icons from renderer by @Jocs in #4275
  • FIx: switch path-browserify to Pathe + image pasting on windows + cleanup console.logs by @Tkaixiang in #4274
  • refactor(image): remove GitHub uploader and None option; default to PicGo by @Jocs in #4276
  • feat(sidebar): implement file & folder sort with natural ordering by @Jocs in #4277
  • feat(sidebar): add toggle to hide Opened Files + cap list to 4 items by @Jocs in #4278
  • build: add Windows ARM64 native build support by @Jocs in #4279
  • fix(uploader): remove 5 MB hard limit on image uploads by @Jocs in #4280
  • fix(preferences): update broken doc links to correct develop-branch paths by @Jocs in #4281
  • fix(build): restore dedicated .md file icon on Windows by @Blueteemo in #4284
  • chore: remove residual Unsplash code by @Jocs in #4286
  • chore: remove dead code and debug noise by @Jocs in #4287
  • refactor(editor): rename LINTEN_FOR_* typos and unify JSON deep-clones by @Jocs in #4288
  • perf(filesystem): cut stat syscalls and per-call regex compilation by @Jocs in #4289
  • chore: misc simplifications by @Jocs in #4290

New Contributors

Full Changelog: v0.17.0...v0.19.0

  •  

v0.19.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

  • fix(preferences): update broken doc links to correct develop-branch paths by @Jocs in #4281
  • fix(build): restore dedicated .md file icon on Windows by @Blueteemo in #4284

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

  •  

v0.19.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

  • docs(release): expand RELEASE.md into a step-by-step playbook by @Jocs in #4270
  • fix(release): restore updater metadata artifacts by @Jocs in #4272
  • fix(sidebar): create-file button works in non-English locales by @Jocs in #4273
  • chore: remove unused SVG icons from renderer by @Jocs in #4275
  • FIx: switch path-browserify to Pathe + image pasting on windows + cleanup console.logs by @Tkaixiang in #4274
  • refactor(image): remove GitHub uploader and None option; default to PicGo by @Jocs in #4276
  • feat(sidebar): implement file & folder sort with natural ordering by @Jocs in #4277
  • feat(sidebar): add toggle to hide Opened Files + cap list to 4 items by @Jocs in #4278
  • build: add Windows ARM64 native build support by @Jocs in #4279
  • fix(uploader): remove 5 MB hard limit on image uploads by @Jocs in #4280

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

  •  

v0.19.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

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

  •  

5.5.0

⭐ New Feature: Optional IP Address Tracking per Device via periodic ARP scan

Thanks to @mwpastore for adding this!

UpSnap can now automatically track changing IP addresses. For devices with IP tracking enabled, UpSnap periodically scans the local subnet with nmap, matches discovered hosts by MAC address, and updates the stored IP when a device is found at a new address.

1. Set a cron schedule in the settings page:

settings

We do not recommend anything lower than 1 minute. Depending on the amount of devices you have added to UpSnap, the scan duration will increase. Every 30 minutes is plenty for most users.

2. Enable per device:

device-settings

Changelog

Features

Bug fixes

Others

  •  

v0.8.2

What's Changed

  • fix(camera): read WhiteBalance, not ColorEnable, on Windows by @yuzi-co in #662
  • refactor(hid): name the divert intents instead of passing flag bools by @AprilNEA in #1071
  • refactor(linux): make the hidraw probe outcome an explicit enum by @AprilNEA in #1073
  • feat(macos): let launchd own the agent lifecycle via SMAppService by @AprilNEA in #1031
  • docs: character stand-in icon rule + crate-homed agent guides by @AprilNEA in #1026
  • Map SLOT_NAME_DPI_BUTTON to DpiToggle and add verification tests by @ediaz2 in #703
  • fix(agent): harden capture sessions, arming, and observe staleness by @AprilNEA in #1077
  • refactor(hid): fold the one-shot retry state into a OneShotScan type by @AprilNEA in #1070
  • refactor(gui): name the scrolling card's facts instead of a five-tuple by @AprilNEA in #1072
  • feat(agent): localize the menu-bar tray by @AprilNEA in #1038
  • refactor: make the audited implicit state machines typed by @AprilNEA in #1080
  • fix: resolve remaining state-machine audit findings by @AprilNEA in #1083
  • feat(gui): add per-app Actions Ring editor by @AprilNEA in #1085
  • feat(i18n): add Belarusian (be) locale by @aliaksandr-trush in #912
  • fix(macos): capture side-button gestures over HID++ by @juan-apa in #722
  • perf(agent): replace capture polling with events by @AprilNEA in #1136
  • perf(agent): replace lifecycle polling with native events by @AprilNEA in #1137
  • fix(macos): prevent HID activity from promoting DarkWake by @AprilNEA in #1142
  • fix(hid): normalize thumbwheel direction per device by @AprilNEA in #1158
  • chore: release v0.8.2 by @AprilNEA[bot] in #1056

New Contributors

Full Changelog: v0.8.1...v0.8.2

  •  

v0.8.1

What's Changed

Full Changelog: v0.8.0...v0.8.1

  •  

v0.8.0

Highlights

  • One device, however you connect it. The same mouse now keeps one device card and one set of settings across receiver and USB connections. Existing configurations migrate automatically and are backed up before the first save. (#876)
  • A redesigned device workspace makes larger setups easier to manage. A responsive grid, compact cards, clearer battery status, custom device names, scalable interface presets, and a dedicated action menu make devices faster to scan and configure.
  • Per-app profiles are now editable in the GUI. Pick an installed application from the new catalog, see which profile is active, and customize its button bindings without editing TOML. (#976)
  • Scrolling is smoother and more configurable. Built-in smooth scrolling, vertical sensitivity controls, preserved fractional motion, rebindable wheel tilt, and fixes for diverted high-resolution wheels deliver more consistent scrolling across main and thumb wheels. (#902, #925, #992)
  • Buttons can now distinguish a tap from a hold. TOML bindings can assign independent short- and long-press actions with a 500 ms threshold, while held shortcuts remain active until the button is released. (#961)

What's Changed

  • chore(gui): bump gpui-component to da4f9369 by @AprilNEA in #655
  • refactor(hid): centralize device identities by @AprilNEA in #831
  • docs(agents): scale local gate to affected packages by @AprilNEA in #696
  • feat(core,gui): make the main wheel's tilt rebindable (MX anywhere 2s,...) by @6lv1-blr in #902
  • fix(linux): install the app icon at every indexed hicolor size by @4ni1ak in #837
  • fix(gui): recognize mx ergo wheel tilt metadata by @AprilNEA in #905
  • ci: automate typo checks and consolidate configs by @AprilNEA in #906
  • refactor(gui): convert app state to entity events by @AprilNEA in #904
  • fix(mouse): compose thumb-wheel preset labels from translated action names by @NatsUIJM in #910
  • fix(linux): restore glibc 2.35 package baseline by @AprilNEA in #911
  • fix(gui): restore full-phrase thumb-wheel preset labels by @AprilNEA in #913
  • refactor(gui): componentize free-function builders by @AprilNEA in #914
  • fix(macos): honor XDG state dir in permission diagnostics by @AprilNEA in #915
  • fix(hid): improve Unifying receiver discovery reliability by @v14 in #853
  • feat(gui): add per-app profiles and redesign device workspace by @AprilNEA in #907
  • fix(macos): use reliable async-hid report writes by @sh3ll3x3c in #889
  • fix(hid): preserve usage pairs in native handle cache by @sh3ll3x3c in #882
  • fix: show Windows MSI completion and failure state by @mvanhorn in #819
  • feat(gui): make custom controls keyboard-operable by @AprilNEA in #916
  • style(gui): refine profile toolbar layout by @AprilNEA in #921
  • refactor(gui): clean up render paths and element ids by @AprilNEA in #926
  • fix(hidpp): read Unifying link encryption from bit 5, not the software-present bit by @AprilNEA in #924
  • refactor(gui): tighten typed rendering and async ownership by @AprilNEA in #931
  • refactor(gui): move device reads onto swr by @AprilNEA in #929
  • feat(gui): add scalable interface presets by @AprilNEA in #934
  • feat(agent): unify button Down/Up/Cancel lifecycle by @AprilNEA in #933
  • feat(i18n): add Turkish (tr) interface locale by @4ni1ak in #835
  • feat(gui): add switchable device gallery views by @AprilNEA in #927
  • refactor(gui): improve shared component quality by @AprilNEA in #966
  • feat(agent): hold shortcut output until button release by @AprilNEA in #960
  • fix(thumbwheel): scale remapped vertical scrolling by @hsearcy in #925
  • refactor(gui): structure app state by domain by @AprilNEA in #974
  • feat(gui): add installed application catalog picker by @AprilNEA in #976
  • feat(gui): add polished battery indicator by @AprilNEA in #983
  • feat(scroll): preserve precise scroll distances by @AprilNEA in #973
  • ci: replace target caches with sccache by @AprilNEA in #984
  • feat(scroll): add finite smooth scroll runtime by @AprilNEA in #975
  • feat(scroll): smooth diverted thumbwheel input by @AprilNEA in #977
  • feat(gui): polish the app catalog picker and device cards by @AprilNEA in #986
  • feat(scroll): add vertical scroll sensitivity by @AprilNEA in #978
  • feat(scroll): expose smooth scrolling setting by @AprilNEA in #979
  • refactor(gui): strengthen typed render boundaries by @AprilNEA in #981
  • fix(core,gui,agent): key device settings by identity, not by transport by @yuzi-co in #876
  • feat(agent): dispatch independent long-press actions by @AprilNEA in #961
  • refactor(agent): complete thumbwheel state machine by @AprilNEA in #968
  • fix(hid): preserve diverted wheel reporting by @AprilNEA in #992
  • chore: release v0.8.0 by @AprilNEA[bot] in #991

New Contributors

Full Changelog: v0.7.10...v0.8.0

  •  

v0.7.10

What's Changed

  • fix(gui): check the open helper's exit status when launching the agent by @AprilNEA in #820
  • fix(nix): provide git to the sandboxed test phase by @AprilNEA in #833
  • feat(ipc): surface HID open failures in agent status by @AprilNEA in #822
  • fix(agent): follow the picked app icon in the menu bar by @AprilNEA in #846
  • feat(cli): read the running agent's inventory in openlogi list by @AprilNEA in #823
  • fix(thumbwheel): stop the tap firing App ExposΓ©, and scroll by the wheel's native amount by @AprilNEA in #857
  • chore: release v0.7.8 by @AprilNEA[bot] in #834
  • fix(gui): stop discarding correctly rebuilt device records by @AprilNEA in #868
  • fix(overlay,agent): stop the anonymous overlay tenant from wedging the Actions Ring by @AprilNEA in #848
  • refactor(gui): put the asset tier on an swr cache by @AprilNEA in #869
  • chore: release v0.7.9 by @AprilNEA[bot] in #870
  • chore: release v0.7.10 by @AprilNEA in #874

Full Changelog: v0.7.7...v0.7.10

  •  

v0.7.7

v0.7.5 and v0.7.6 were tagged but never published β€” their macOS packaging failed before a single artifact was uploaded, so no release exists for either. Everything both of them contained ships here, and the changes below cover everything since v0.7.4.

What's Changed

  • docs(ci): map every CI job to a local command by @davidbudnick in #732
  • feat(i18n): add Ukrainian (uk) locale by @dima-karpenko in #715
  • ci(shell): gate every shell script with shellcheck and shfmt by @AprilNEA in #745
  • docs(core): correct the model_ids transport ordering, and fix the MX Keys mock by @yuzi-co in #668
  • refactor(xtask): move ci-local.sh and write-changelog.sh into xtask by @AprilNEA in #746
  • refactor(xtask): split bundle.rs along what it actually does by @AprilNEA in #753
  • feat(cli): report feature flags and firmware entities in diag features by @yuzi-co in #690
  • refactor(cli): render diagnostics with display adapters by @AprilNEA in #758
  • refactor: stream display-only formatting by @AprilNEA in #768
  • feat(camera): add anti-flicker and low-light controls by @awesamarth in #793
  • refactor(hid): split the HID++ device layer from the host backend by @AprilNEA in #772
  • chore: cut manifest comments that describe instead of constrain by @AprilNEA in #809
  • fix(hook): stop trusting AXIsProcessTrusted as a revocation signal by @AprilNEA in #801
  • fix(hook): keep macOS tap lifecycle instance-owned by @AprilNEA in #808
  • feat(gui): pick the app icon in Settings by @AprilNEA in #812
  • build(macos): name the helper bundles after their display names by @AprilNEA in #814
  • docs(agents): add a macOS permissions task skill by @AprilNEA in #813
  • fix(agent): shut down when the app is uninstalled by @AprilNEA in #810
  • fix(ipc,agent,desktop): surface Input Monitoring via agent status and fix registry bincode by @rekcilyssup in #760
  • fix(hid): take async-hid 0.5.3 so a denied HID open stops leaking by @AprilNEA in #804
  • fix(hid): park the Windows HID read on a permanently dead handle by @yuzi-co in #779
  • chore: release v0.7.5 by @AprilNEA[bot] in #750
  • fix(release): use changelog as release PR body by @AprilNEA in #821
  • refactor(agent): split the binary watcher from how it relaunches by @AprilNEA in #816
  • refactor(agent-core): give the polling watchers one loop by @AprilNEA in #818
  • feat(hid): recognise Lightspeed receiver 046d:c54d (PRO X SUPERLIGHT 2 DEX) by @v14 in #811
  • chore: release v0.7.6 by @AprilNEA[bot] in #824
  • fix(agent): make macOS permission failures diagnosable by @AprilNEA in #817
  • fix(ci): build both macOS legs with an Icon Composer-capable Xcode by @AprilNEA in #815
  • chore: release v0.7.7 by @AprilNEA[bot] in #830

New Contributors

Full Changelog: v0.7.4...v0.7.7

  •  

v0.7.2

What's Changed

  • fix(agent): reapply volatile settings after Windows resume by @davidbudnick in #639
  • build(nix): make Linux packaging first-class by @AprilNEA in #632
  • chore(infra): add CODEOWNERS by @AprilNEA in #646
  • fix: bind the Actions Ring overlay to one agent run by @AprilNEA in #645
  • chore: converge the repository top level by @AprilNEA in #647
  • refactor(gui): split the GPUI side into app, ui, and overlay crates by @AprilNEA in #672
  • refactor(ipc): replace the GUI's poll loop with a level-triggered state channel by @AprilNEA in #675
  • build(windows): ship the openlogi CLI in the zip and MSI by @yuzi-co in #659
  • build(infra): drop dependency debuginfo in dev builds by @AprilNEA in #695
  • refactor(core): extract openlogi-permissions and give shared constants one definition by @AprilNEA in #697
  • fix(gui): use the GPUI executor timer, not tokio::time::interval, for camera scans by @charliecai01 in #686
  • fix(overlay): prevent GPUI from exiting on window close by @clifinger in #700
  • fix(agent): relaunch after granting Input Monitoring by @AprilNEA in #713
  • chore: release v0.7.2 by @AprilNEA[bot] in #642

New Contributors

Full Changelog: v0.7.1...v0.7.2

  •  

v0.16.20

[0.16.20] - 2026-08-30

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

  • System for Cross-domain Identity Management (SCIM) v2 (Enterprise):
  • JMAP: CalendarEvent/set support for updating and deleting synthetic ids (#2925).
  • Calendar:
    • Conference links in calendar invites and email alarms.
    • Translations for Arabic, Brazilian Portuguese, Bulgarian, Chinese Simplified, Chinese Traditional, Croatian, Czech, Finnish, Hebrew, Hindi, Hungarian, Indonesian, Japanese, Korean, Lithuanian, Norwegian BokmΓ₯l, Persian, Romanian, Russian, Slovak, Slovenian, Thai, Turkish, Ukrainian and Vietnamese.

Changed

  • Calendar: Updated HTTP RSVP page.

Fixed

  • DANE:
    • TLSA records are looked up whenever the MX RRset is signed, even when the MX host's own zone is not.
    • Mandatory DANE failures are permanent rather than temporary, bouncing messages that should be delayed.
    • Valid but unusable TLSA records fall back to the configured TLS strategy, permitting cleartext delivery where TLS is required.
  • S3: Fix outdated upstream af-south-1 region configuration.
  • Setup wizard: SQL directories set to use the main data store are now validated against the data store being configured.
  • CardDAV: Delete default address book id when deleting the default address book.
  • Redis: Sentinel deployments configured with rediss:// URLs now connect to the master over TLS instead of silently falling back to cleartext.
  • Email: Generated Message-ID headers use the hostname of the node that built the message instead of the configured server hostname.
  • MTA:
    • Do not send DMARC reports to local domains.
    • Messages addressed to an inboundReportAddresses match are only discarded when they actually contain a report (#1088).
  • Directory: Impersonation using the recovery admin fails when the impersonated account has not logged in before (LDAP and SQL directories).
  • WebUI: Failed logins open the browser's native credential prompt.
  • Cluster: Expired node id leases are released periodically rather than only during startup, so entries for removed nodes no longer remain Stale or Inactive indefinitely.

Check binary attestation here

  •  

Release 2026.08.28

Docker Images

Docker images have been built and pushed:

Docker Hub:

  • alexta69/metube:latest
  • alexta69/metube:2026.08.28

GitHub Container Registry:

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

Changes

  • feat: collapse the Downloading, Completed and Subscriptions sections (closes #1070) (7938837)
  • fix: show the post-download processing phase in the UI (closes #424) (1251613)
  • fix: accept HOST=* so IPv6 users get a dual-stack bind (closes #795) (70d1975)
  • docs: fix where the download folder selector lives in the UI (f11b376)

  •  

5.5.0-beta.0

Changelog

Features

Bug fixes

Others

  •  

v12.3.1

✨ New Features & Improvements

  • @directus/api
    • Added countFilterListeners, countActionListeners, and countInitListeners methods to the emitter, exposing the number of registered handlers for each event (#28117 by @ComfortablyCoding)

πŸ› Bug Fixes & Optimizations

  • @directus/app
    • Fixed MCP OAuth clients settings pages concatenating breadcrumbs into the page title (#28115 by @MHJahanbakhsh)
  • @directus/api
    • Fixed the WebSocket heartbeat leaking a websocket.message listener on each ping when a client failed to respond in time (#28117 by @ComfortablyCoding)
    • Fixed GraphQL query fragments returning null fields (#28128 by @ComfortablyCoding)
    • Fixed public registration verification using the provided email instead of the stored one (#28144 by @br41nslug)
    • Removed user_created and date_created for update from recommended permissions for directus_shares (#28145 by @br41nslug)
    • Updated storage driver dependencies (#28119 by @ComfortablyCoding)
  • @directus/cli
    • Stripped project_id when pulling settings, so a sync no longer copies one instance's identity onto another (#28132 by @lazerg)
  • @directus/sdk
    • Fixed unsubscribe() not removing subscriptions, causing them to persist across reconnects and accumulate for the lifetime of the client (#28117 by @ComfortablyCoding)
  • @directus/system-data
    • Removed user_created and date_created for update from recommended permissions for directus_shares (#28145 by @br41nslug)
  • @directus/storage-driver-s3
  • @directus/storage-driver-gcs
  • @directus/storage-driver-azure
  • @directus/storage-driver-supabase

πŸ“¦ Published Versions

  • @directus/app@17.1.1
  • @directus/api@39.1.0
  • @directus/cli@12.2.1
  • @directus/composables@11.6.2
  • create-directus-extension@12.1.4
  • @directus/env@6.2.2
  • @directus/extensions@4.0.4
  • @directus/extensions-sdk@18.0.4
  • @directus/memory@4.0.4
  • @directus/pressure@4.0.4
  • @directus/storage-driver-azure@13.0.4
  • @directus/storage-driver-cloudinary@14.0.1
  • @directus/storage-driver-gcs@13.0.4
  • @directus/storage-driver-s3@14.0.1
  • @directus/storage-driver-supabase@5.0.1
  • @directus/system-data@4.6.1
  • @directus/themes@2.0.4
  • @directus/utils@13.5.4
  • @directus/validation@3.0.4
  • @directus/sdk@25.0.1

  •  

v0.16.19

[0.16.19] - 2026-08-24

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

  • WebUI: oauthClientId setting in Application, which allows the WebUI to use a different OAuth client than the default.
  • Sieve: env.spam.score and env.spam.is_spam variables, which expose the spam filter result to system scripts running at the DATA stage.
  • CalDAV: vCardVersion setting in AddressBook, which allows the default vCard version to be specified when the client does not request a specific version.

Changed

  • MySQL & MariaDB: Key columns are now VARBINARY(255) with a full-length primary key instead of TINYBLOB. Note: Existing deployments should run, once per table, for each of the tables a, d, e, f, g, h, j, k, l, m, n, o, p, q, r, s, t, u, w, x and y the command ALTER TABLE a MODIFY k VARBINARY(255) NOT NULL;.

Fixed

  • ACME:
    • Order and authorization failures are never logged, so an order rejected by the CA.
    • An order rejected by the CA marks the renewal task as permanently failed.
  • CalDAV:
    • Attendee addresses whose mailto: URI percent-encodes a full name-addr are silently dropped from the scheduling snapshot.
    • Attendees whose calendar user address cannot be parsed should be flagged with SCHEDULE-STATUS=3.7.
    • The RSVP link in an iMIP invitation stamps PARTSTAT on the organizer's copy of the event only, leaving a local attendee's own copy at NEEDS-ACTION and sending the organizer no reply.
    • MKCALENDAR, MKCOL and PROPPATCH store the display name, description, time zone and the other per-user properties under the authenticated account rather than the account that owns the collection.
  • Directory:
    • An empty column, attribute or claim returned by an external directory is synchronized as an empty string rather than a missing value.
    • /api/discover splits the account name on @ without accounting for the % master user separator or the recovery administrator.
  • FoundationDB: Older chunked entries are not deleted.
  • IMAP: SETACL and DELETEACL fail to resolve an identifier spelled with uppercase characters.
  • iMIP: Invitations, replies and cancellations reference a TZID parameter with no matching VTIMEZONE component whenever the event was stored without one.
  • JMAP:
    • AddressBook/get: A new account's default address book is never recorded.
    • Email/get and Email/parse with fetchAllBodyValues return body values only for the parts listed in textBody or htmlBody, omitting every other text/* part in bodyStructure.
    • Email/set writes display names as an RFC 2047 encoded-word wrapped in a quoted-string, which RFC 2047 forbids.
    • Mailbox/set, AddressBook/set and Calendar/set store isSubscribed and the other per-user properties under the authenticated account rather than the account named in the request.
    • Principal/query returns no results when the name or email filter is spelled with uppercase characters.
    • FileNode/set: File nodes created over JMAP are returned with a <D:href> holding the raw name over WebDAV.
  • Meilisearch:
    • Queries return at most 1000 results, as the maxTotalHits pagination setting is left at the Meilisearch default.
    • Searches combining several terms return documents that match only some of them.
    • A task confirmation timeout is reported as a success when failOnTimeout is disabled.
  • Import: --import always aborts with the target database already containing data in the key range being imported.
  • MTA:
    • A domain catchAllAddress pointing to a mailing list or a sub-addressed mailbox is accepted at RCPT TO and then rejected at local delivery with 550 5.5.0 Mailbox not found.
    • is_local_address() and is_local_domain() expression functions do not match an address or domain spelled with uppercase characters.
    • Relay routes are rejected with host resolves loopback address, which prevents relaying through a local proxy or tunnel.
  • MySQL, MariaDB & PostgreSQL: Range scans, range deletions and store purges run as a single unbounded statement, so on servers that enforce a statement timeout they abort on large accounts and tasks such as account deletion can never complete.
  • Network: local_port and local_ip report the address Stalwart is bound to rather than the address the client connected to when the connection arrives through a trusted proxy.
  • Task manager:
    • totalDeadline is not enforced on tasks that fail with a specific retry time.
    • Indexing tasks are dropped after maxAttempts failures, so a search store that is unavailable or overloaded leaves messages permanently missing from the index.
    • Indexing tasks are dropped when the document metadata read returns no data, which can happen on SQL read replicas that have not yet caught up with the primary.
    • The DNS management task republishes the DKIM records of retired keys that the DKIM rotation task had already removed from the zone.
  • Sieve: spamtest returns only 1 or 10 (and spamtest :percent only 0 or 100), so scripts cannot act on intermediate spam scores.
  • Spam filter: MIME_BAD is tagged whenever the declared Content-Type of an attachment is not byte identical to the type detected from its magic bytes.

Check binary attestation here

  •  
❌