what's new

Every release of every part of Glyph, newest first. 25 releases.

desktop0.4.02026-10-20
  • Transfer music (Settings > Transfer music, or Library > Transfer music), with no login and nothing to set up: Spotify liked songs and playlists come over by copying them in the Spotify app (Ctrl+A, Ctrl+C) and pressing Paste; YouTube Music by playlist link or a Google Takeout file; Deezer and SoundCloud from a public profile; Last.fm from the user name. Runs in the background, continues after a restart, and lists that come over twice only get their new songs. Pasting many links into search opens it too.
  • Links without keys: Spotify playlists, albums, artists and songs are read from Spotify's public embed page when neither the server nor the app has a Spotify key (up to 100 songs per list), YouTube playlists from YouTube's web endpoint without an API key.
  • New playlist: paste a link instead of typing songs. Spotify playlists, albums, artists and songs, Deezer playlists, albums, artists and profiles, SoundCloud sets, likes and tracks, YouTube playlists, public Apple Music playlists and albums, Bandcamp albums, Last.fm profiles and short links (on.soundcloud.com, deezer.page.link, spotify.link) work; pasting such a link into search does the same. Playlist files (CSV, Spotify export, M3U, XSPF) import from the same dialog.
  • Settings > Support > Docs opens the new documentation at docs.glyph.my.
  • Add Discord Rich Presence (Settings > Integrations, off by default): the current song, artist, album and cover appear in your Discord profile. A Discord application ID from the Developer Portal is needed unless this build ships one.
  • Queue: songs added with Play next / Add to queue form an "Up next" section that always plays first; the rest is labelled "Next from: <list>". Click any queued song to continue from there.
  • Shuffle styles (Settings > Playback, or right-click Shuffle): smart shuffle spreads artists and moves recently heard songs back; fully random is uniform.
  • Right-click menus on player controls: mini player card/bar, repeat mode, shuffle style, seek 10/30 s and restart on previous/next, output device, channel mode and MPD on volume.
  • Spatial audio: choose Mono, Stereo or Spatial; Spatial keeps surround (5.1/7.1) speaker positions and renders them for headphones with an HRTF head model.
  • Play on a Music Player Daemon (MPD) on another computer, with Glyph as remote.
  • Opt-in listening statistics (time, plays, skips, top artists and songs, hours and weekdays), synced across signed-in devices; turning them off deletes them.
  • Lyrics: the current line stays centred and moves smoothly with an eased colour sweep; pick another lyrics version (remembered per song) and adjust timing in a new options panel; redesigned view switch.
  • Search lyrics: results found only through their lyrics appear in an "In lyrics" section. Search waits until you stop typing.
  • AI assistants (MCP): a local MCP server (127.0.0.1, token) or access through the signed-in server with OAuth sign-in and in-app approval; 27 tools for playback, queue, search, playlists, likes and lyrics.
  • YouTube: choose r-dlp (built in, default) or yt-dlp; native InnerTube search and a YouTube ID hint to the server make finding sources much faster.
  • Server downloads retry transient failures and fall back to another quality instead of failing.
  • Artist pages list the full discography from Deezer; verified badges appear next to artist names; an animated equalizer marks the playing song.
  • Sidebar shows followed artists; right-click an entry to hide it. Playing an artist adds only the artist to Recently played.
  • Add-to-playlist flyouts stay on screen with a 5 px gap and say "No playlists yet" when empty; playlist names are limited to 100 characters and long titles wrap.
  • List pages scroll under the top bar; the info column of a playlist scrolls in small windows; the queue panel has bottom padding on the lyrics page.
  • The background animation drops to 10 fps while Glyph is not focused (switchable); the window title follows the playing song while the app is in the background.
  • New languages: Español, Français, Italiano, Polski, Português, Türkçe, Українська.
server0.4.02026-10-20
  • /v1/import/spotify also reads SoundCloud links (sets, a profile's likes or tracks, single songs) with the server's SoundCloud key, so the app's "Transfer music" needs no key of its own.
  • Serve the documentation at docs.glyph.my (and /docs on other hosts), rendered from the Markdown in github.com/glyphmusic/docs at request time: a push to main is live within about a minute without a deploy. glyph.my/docs redirects there. Pages have a search (Ctrl+K or /, index at search.json); for LLMs there are llms.txt, llms-full.txt and every page as Markdown at its .md address.
  • Relay AI assistants (MCP) to signed-in desktop apps: Streamable HTTP endpoint /mcp, OAuth 2.1 with PKCE and dynamic client registration, a sign-in page confirmed in the app, and glyph remote mcp on|off for owners (migration 0014).
  • Search YouTube through InnerTube directly before falling back to yt-dlp, and accept the app's YouTube ID hint to skip the search.
  • Add /changelog: every release of the desktop app, server, companion and r-dlp, newest first, filterable by part (scripts/snapshot-changelogs.mjs).
  • Add a questions section to the landing page, with FAQ structured data.
  • Add glyph config list|get|set|unset|path to read and change server.toml with validation, sources and defaults; API keys are never printed.
  • Add glyph cloudflare list|set|unset|secret|domain to change a Cloudflare deployment's values, secrets and custom domain.
companion0.3.02026-10-19
  • Build from Glyph Server and desktop protocol v0.3.0, including streaming and resolver performance improvements and authenticated management endpoints.
  • Install r-dlp's matching GitHub release at startup as a checked runtime dependency, with a persistent cache and bundled offline fallback.
  • Support version pins and disabling automatic release checks without rebuilding the container.
  • Pin r-dlp v0.1.1 in automated image builds and verify its version before publication.
  • Include HTTP/2 negotiation and a shared resolution deadline in the native audio resolver.
desktop0.3.02026-10-19
  • Support streamed fragmented MP4 audio without replacing track metadata with a zero duration.
  • Recognize the optional account-only API policy advertised by Glyph Server 0.3.0.
server0.3.02026-10-19
  • Distribute the glyph CLI through the glyph-server npm package, with verified native downloads and a legacy command alias.
  • Add component version/check/update commands for CLI, server, companion and r-dlp, plus authenticated companion maintenance.
  • Ship the prebuilt Worker and migrations; add guided self-hosted Cloudflare setup and deployments using the owner's resources.
  • Support scoped Docker companion updates with pulled-image and health verification.
  • Make source/Docker/CI builds self-contained with a shared protocol snapshot.
  • Stream and coalesce encoded audio, reuse connections, move cache stats off the playback path and bound parallel resolution.
  • Add optional account-only API/media access while preserving login and refresh.
server0.2.62026-10-19
  • Serve lyrics from the companion first (POST /internal/lyrics) and fall back to the Worker's own lookup, so LRCLIB's rate limit on data-centre addresses no longer breaks lyrics.
  • Answer /v1/lyrics with "no lyrics" (404) when the upstream is rate-limited or down, instead of a 502/503; a failed lookup is retried after five minutes, a confirmed miss after an hour.
  • Answer /v1/similar with an empty list (200) when Last.fm is not configured or fails, instead of a 503/502.
  • Build against desktop protocol v0.2.4.
companion0.2.52026-10-19
  • Serve lyrics for the Worker from this machine (POST /internal/lyrics), so LRCLIB's rate limit on data-centre addresses no longer breaks lyrics.
  • Build from server v0.2.6 and desktop protocol v0.2.5, including the degraded lyrics and empty-radio answers.
  • Keep pinning and labelling all three source revisions, and smoke-test native resolver startup before image publication.
desktop0.2.52026-10-19
  • Show artists in "Recently played": playing from an artist's page adds the artist next to the songs, on Home and in the list.
  • Show similar artists at the bottom of an artist's page (Last.fm with your own key, Deezer otherwise).
  • Grey out the queue's radio switch, with an explanation on hover, when the server has no working Last.fm key.
  • Look lyrics up locally when the server cannot serve them (for example when LRCLIB rate-limits it) instead of showing an error.
  • Give an artist's liked songs and their full release list their own pages, with a round play button next to the heading.
  • Show in the download tooltip how many songs of a list are already saved and how an ongoing download is progressing.
server0.2.52026-10-19
  • Add persistent native r-dlp workers through GLYPH_RDLP_PATH, retaining the existing yt-dlp extraction fallback.
  • Route YouTube downloads through the same companion streaming, quality and stale-URL recovery paths as playback.
  • Honor the client youtube_only flag, allow bounded additional search variants, and reject other sources and previews in this mode.
  • Accept both legacy track bodies and resolve request bodies at the download endpoint.
  • Build against desktop protocol v0.2.4.
companion0.2.42026-10-19
  • Enable r-dlp v0.1.0 as the default prestarted audio resolver; keep yt-dlp for search, metadata and extraction fallback.
  • Build from server v0.2.5 and desktop protocol v0.2.4, including forced YouTube search and server-based downloads.
  • Pin and label all three source revisions, and smoke-test native resolver startup before image publication.
desktop0.2.42026-10-19
  • Download YouTube audio through the configured server/companion path, using the same source resolution as playback.
  • Add a shared download queue: maximum five simultaneous downloads by default, configured only through audio.download_parallelism and audio.download_adaptive in TOML.
  • Adapt download admission to observed network throughput and stalled transfers, including local YouTube downloads.
  • Add Only YouTube in source settings, honoring Local/Server and returning unavailable instead of falling back to another provider or preview.
  • Prevent simultaneous downloads from sharing temporary output filenames.
  • Changes are recorded here for every release, newest first.
server0.2.42026-10-19
  • Retry higher-priority full sources when a Deezer preview or a previous miss is cached; refresh outdated resolver mappings.
  • Read artists from YouTube video titles, tolerate nullable channel metadata, and continue text searches after transient ISRC lookup failures.
  • Retry empty YouTube searches instead of keeping temporary extraction failures cached.
  • Reduce Worker overhead by batching abuse-limit checks, reusing request-local account lookups and avoiding redundant cache requests.
  • Associate batched rate-limit results by their stable key.
  • Reduce repeated search-result normalization and avoid copying full audio bodies through Wasm for supported range responses.
  • Keep full-song quality warming out of the foreground streaming request CPU budget.
companion0.2.32026-10-19
  • Build the companion from server v0.2.4 and desktop protocol v0.2.3, with independent release references.
  • Retry full-source searches before using cached Deezer previews and recover from empty or failed YouTube searches.
  • Recognize artists in video titles even when the upload channel differs, and accept nullable channel metadata.
  • Include the server resolver and performance fixes from v0.2.4.
desktop0.2.32026-10-19
  • Add keyboard navigation for song lists and scroll selected rows using their measured position and row height.
  • Keep tooltip, hover, slider and scrolling state separate between the main window and mini player.
  • Bound artwork and metadata caches; reuse the liked-song index without hashing the entire library for each row.
  • Merge concurrent playlist track edits and update liked-track lookups after remote metadata changes.
  • Batch listening activity in a lightweight sidecar and serialize library writes, including pending writes at shutdown.
  • Reuse audio prefetch workers and decoded sample buffers; initialize buffer cleanup outside the audio callback.
  • Keep glow animations running when moving the window and reduce per-frame allocations.
  • Include the audio stream cache in storage settings and consistently recognize Russian artist separators.
r-dlp0.1.12026-10-19
  • Enable HTTP/2 negotiation, with HTTP/1.1 fallback and an HTTP/1-only benchmark control.
  • Add bounded serve --warmup to prime connections and anonymous visitor context.
  • Apply one eight-second resolution budget across player, visitor bootstrap and retry.
  • Add caller-defined resolution budgets and regression coverage for stalled response bodies.
  • Add a transport A/B benchmark with real audio-range validation and redacted output.
  • Document coordinated installation with the updated Glyph server worker integration.
r-dlp0.1.02026-10-19
  • Native direct YouTube audio resolver with compatible MP4/Vorbis selection.
  • Reusable HTTP client and persistent JSON-lines worker mode.
  • Anonymous visitor bootstrap on rejected player requests.
  • Strict input/host validation, bounded responses and request frames.
  • Reproducible PC0373 cold/warm benchmark with real media range checks.
  • Companion integration available on the separate server feat/r-dlp-audio branch.
server0.2.32026-10-18
  • Resolve Worker cache misses on the companion (POST /internal/resolve), so the Worker parses one small answer instead of several provider searches. Without a companion, or when it is busy or offline, the Worker resolves itself as before.
  • Never share the admission queue between Worker requests. A permit handed across requests woke the waiter in the other request's context, which Cloudflare reported as hung requests and exceeded CPU limits.
  • Accept Audius' presigned R2 audio redirects (*.r2.cloudflarestorage.com) as redirect targets only; Audius playback and downloads returned HTTP 502.
companion0.2.22026-10-18
  • Resolve different songs with three prestarted yt-dlp processes, share duplicate lookups, and reserve separate audio and metadata capacity.
  • Reuse resolved audio URLs in bounded memory for seeks and refills.
  • Check upstream source commits every 15 minutes and publish smoke-tested images automatically. Watchtower applies new images every five minutes.
  • Publish a versioned container image alongside the source-specific and latest tags.
desktop0.2.22026-10-18
  • Speculatively warm the first audio bytes of hovered songs, opened lists and upcoming queue tracks, with bounded background work and data-saver support.
  • Play saved downloads locally before any network request; check remote revisions in the background and replace changed audio only after a complete SHA-256-checked download.
  • Decode arriving HTTP ranges immediately, including after seeking. Keep received audio ranges in a bounded local disk cache for replays and loops.
  • Keep the seek cursor at its requested position while buffering, preload the next queue item early, and resume a prepared crossfade player when a seek skips the fade window.
  • Signed-in sharing copies short Glyph links for songs, artists and playlists, with rich previews and desktop deep links. Shared playlists open as a preview with an explicit Add to library action.
  • Prefetch HTTP audio blocks before the current buffer runs out, with larger startup and decoded reserves to prevent chunk-boundary pauses.
  • Enable Windows multimedia scheduling for the WASAPI callback to improve playback under load and when minimized.
  • Local yt-dlp playback starts from HTTP chunks while parallel background ranges fill the cache. Subsequent reads switch to the completed local file; downloaded songs remain immediate local playback.
  • Start streamable HTTP MP4 audio from its leading metadata instead of scanning every segment before playback; preserve byte-range seeking after initialization.
  • Give the playlist editor Save button the same 8 px corner radius as Follow. Keep it inactive gray until the name, cover or playlist switches differ from the opening state. Changed values enable a white Save button; reverting them disables it again.
  • Add 10 px of space above the Queue panel to separate it from the topbar.
  • New releases use one SHA256SUMS.txt for all assets. The updater selects the checksum by exact filename and also supports older per-asset checksum files. Older app versions need one manual upgrade to adopt this format.
  • Clicking outside Settings closes the modal and blocks interaction with controls underneath it.
  • Continue playback when a proxy changes from partial ranges to full audio responses. Validate returned byte ranges and keep small full responses seekable for MP3/ID3 probing.
  • Server: use the companion to search specifically for matching song audio before falling back to previews; serve consistent byte ranges from both cache hits and fresh media.
  • Recover audio outputs that accept a stream but never consume samples by retrying the same device with its negotiated buffer settings. Report a nonresponsive output instead of loading forever.
  • Add diagnostics around opening the output and queueing decoded audio.
  • Server fixes prepared alongside this build: retry full playback sources before reusing a Deezer preview; avoid redundant YouTube metadata requests and long cooldowns after transient YouTube failures.
  • Antivirus heuristic reports for the unsigned 0.2.1 installer remain under investigation; no clean VirusTotal result is claimed for this release.
server0.2.22026-10-18
  • Reuse three prestarted yt-dlp extractors in parallel, coalesce duplicate video lookups, and separate audio transfer capacity from metadata requests. Keep a bounded CLI fallback.
  • Preserve upstream ETags and modification dates so clients can check downloaded audio revisions without blocking playback.
  • Reuse resolved YouTube URLs in bounded companion memory, avoiding repeated yt-dlp extraction on seeks and audio refills without storing audio on disk.
  • Signed-in sharing copies short Glyph links for songs, artists and playlists, with rich previews and desktop deep links. Shared playlists open as a preview with an explicit Add to library action.
  • Avoid a Worker crash when a long cache key contains Unicode characters at the truncation boundary.
  • Start background quality preparation for partial audio responses and let companion encodes finish after a request disconnects.
  • Match YouTube by ISRC when available, then retry artist/title without the audio suffix if necessary (fixes Blender's LUVME falling back to a preview).
  • Prepare two quality variants concurrently in the background, keeping an encoder available for foreground work.
  • Forward requested byte ranges through the Worker and companion to YouTube, avoiding repeated downloads of the entire prefix when seeking or refilling the decoder.
  • Stream uncached high-quality YouTube audio immediately instead of waiting for a whole download and remux.
  • Publish one SHA256SUMS.txt for the complete release; self-update matches exact filenames and retains support for old sidecars.
  • Search for song audio through the configured companion when resolving a YouTube match; avoid unrelated video results and duration mismatches.
  • Explicitly slice full edge-cache hits for range requests; re-fetch entries missing the byte length instead of returning inconsistent audio responses.
  • Retry full playback sources before a cached Deezer preview and shorten preview caching to five minutes. Invalidate earlier resolver mappings.
  • Skip per-video metadata extraction when YouTube flat results already include duration.
  • Do not disable all YouTube requests for ten minutes after one network failure or timeout.
desktop0.2.12026-10-18
  • Send account authorization only once per request. Duplicate headers caused HTTP 400 responses in search, playback resolution, profiles and device management.
  • Show failures and retry actions for device and profile loading instead of leaving loading placeholders visible indefinitely.
  • Bound account-refresh waits and local yt-dlp status checks.
  • Normalize Windows shortcut paths so the app is registered as **Glyph**.
  • **Playback > Sources > YouTube playback**: choose **Local** yt-dlp or the **Server** companion. The choice is specific to each device. Local mode resolves YouTube before contacting the server; downloaded files always play locally.
  • A Windows setup executable with a stable installation folder, Start menu shortcut and uninstaller. New installations update the existing app rather than creating another versioned installation.
  • Playback startup diagnostics and a test for starting a downloaded track through the real audio output.
desktop0.2.02026-10-18
  • Updated desktop interface, playlist controls, profile pictures and mini player.
  • Adaptive audio playback, improved streaming buffers, loudness processing and playback recovery.
  • Improved library activity, account synchronization and private-server access handling.
  • Server request admission and abuse limits, persistent audio cache inventory, storage reservations and audio quality variants.
  • Stable releases for Windows x64, macOS Intel and Apple Silicon, and Linux x64 and ARM64, with SHA-256 checksums.
  • Route /download, screenshots, icons, the web manifest and crawler files through the Cloudflare Worker. This fixes missing landing-page images, the unavailable favicon and the download page's HTTP 522 response.
server0.2.02026-10-18
  • Prefer the Windows setup executable on the download page when a release includes one. Keep the portable ZIP as the fallback for earlier releases.
  • Account-aware request admission, abuse limits and bounded media work.
  • Persistent audio cache inventory, storage reservations and audio quality variants.
  • Updated account, admin and native companion behavior.
  • Corrected the native updater repository to glyphmusic/server.
  • Published native archives for five platform targets with SHA-256 checksums.
  • Deployed the Cloudflare Worker and companion, including database migrations through 0013_audio_variant_jobs.sql.
  • Fixed missing Cloudflare routes for the download page, landing screenshots, favicon, app icons, web manifest and crawler files.
desktop0.1.02026-10-17
  • Initial published desktop release: music search, playback, lyrics, library and playlists, optional account synchronization, and portable application archives.
server0.1.0
  • Initial server implementation, provider search and resolution, streaming audio, optional accounts and synchronization, Cloudflare Worker and native companion.