Releases: KanashiiDev/web-presence
Release list
3.1.0
Web Presence 3.1.0
This release introduces GitHub Contributions, making it possible to submit new activities and updates directly from the UserScript Manager.
GitHub Contributions
You can now contribute activities to the official web-presence-activities repository without leaving the extension.
- Connect your GitHub account directly from the UserScript Manager.
- Submit new activities or updates with a reviewable confirmation step.
- Existing authors are automatically preserved, with your GitHub username added when needed.
- Version checks prevent outdated versions from overwriting newer repository versions.
- Forks, branches, commits, and pull requests are handled automatically.
- Review and edit the commit message before submitting.
- Disconnect your GitHub account at any time from the GitHub settings.
Improved
- The version section in the UserScript Manager editor has been split into separate fields for better version safety.
- Added tabs to the UserScript Manager for easier access to installed activities.
- Added a Report Issue button to activities in the Activity Library, allowing users to report problems directly to script authors.
Fixed
- Fixed the extension popup appearing too wide.
- Fixed incorrect wiki links in the UserScript Manager.
Full Changelog: 3.0.0...3.1.0
3.0.0
Web Presence 3.0.0
discord-music-rpc is now Web Presence
When this project first started, it had a single goal: bringing Rich Presence support to music websites. As it evolved, I realized it had the potential to become much more than that. It no longer made sense to limit the project's identity to music alone, so I decided it was time for a new name.
Starting with this release, discord-music-rpc becomes Web Presence—a name that better reflects the project's broader vision of supporting media and activity across the web.
Thank you to everyone who has supported the project, reported bugs, suggested features, or contributed along the way. Your feedback has helped shape Web Presence into what it is today, and I'm excited for what's next.
Added
- Added Video Statistics to the dashboard.
- Added Video History to the dashboard.
- Added a Music / Video / All filter to the extension's History page.
Improved
- Rebranded the project from discord-music-rpc to Web Presence.
- Generalized all music-related localization strings to support a broader range of media.
- Refreshed and reorganized the dashboard interface.
- Improved localization key consistency throughout the project.
Changed
- Updated the API:
songUrlhas been renamed tolink.- This change is fully backward compatible, so no migration is required.
Breaking Changes
- None. Existing integrations will continue to work without modification.
Synchronise history data with the Dashboard
1- Extension popup > settings > backup / restore
2- Click "Sync History Between App & Extension"
Conflict issues in Linux distributions
You must remove the old application on Arch and Nix.
Arch
1- sudo pacman -Rns discord-music-rpc
2- curl -fsSL https://raw.githubusercontent.com/KanashiiDev/web-presence/main/scripts/install-arch.sh | bash
Nix
1- nix profile remove discord-music-rpc
2- nix profile add github:KanashiiDev/web-presence
3- Reboot
Full Changelog: 2.2.0...3.0.0
2.2.0
Discord Music RPC 2.2.0
This release significantly improves the selector system, making it easier to inspect and write selectors while also fixing incorrect image matching. It also introduces new selector flags for more flexible matching.
Note: This is the final release under the
discord-music-rpcrepository name. Starting with the next release, the project will be renamed toweb-presence.
Added
- Added
onlyandignoreselector flags for more flexible selector matching. - These flags are also supported in the userscript system when used inside the
getText()andgetImage()functions.
Improved
- Added a preview for selector results, allowing you to inspect matched text and images before choosing the correct result.
- Improved the selector results interface for better readability and usability.
- Added an information section explaining the purpose of each part of the selector system.
Fixed
- Fixed an issue where the image selector could occasionally return incorrect results.
Full Changelog: 2.1.0...2.2.0
2.1.0
Discord Music RPC 2.1.0
This release introduces support for additional Linux distributions, improves update checking, adds debug logging, and fixes several issues related to RPC status and system sleep behavior.
Added
- A Debug Logs section in the extension.
- Support for Nix/NixOS and Arch Linux.
Nix/Arch Installation
Arch Linux:
Install via the one-shot installer script:
curl -fsSL https://raw.githubusercontent.com/KanashiiDev/discord-music-rpc/main/scripts/install-arch.sh | bashOr install the .pkg.tar.zst package directly from GitHub Releases:
sudo pacman -U discord-music-rpc-<version>-x64.pkg.tar.zstNixOS / Nix:
Quick install without modifying your configuration:
nix profile add github:KanashiiDev/discord-music-rpcOr add as a flake input for NixOS module / home-manager support:
inputs.discord-music-rpc.url = "github:KanashiiDev/discord-music-rpc";Improved
- App update checking.
- Extension
- Optimized orphan settings cleanup.
- Improved parser list reloading and caching behavior.
- Improved parser registration initialization and save scheduling.
- Installed activities are now automatically removed when deleted from the remote repository.
- Userscript IDs are now preserved after the first save instead of being regenerated on every edit.
- Duplicate userscripts are now prevented based on both script ID and content.
Fixed
- Incorrect RPC connection status displayed in the system tray.
- An issue where the application could prevent the system from entering sleep mode.
- A race condition affecting activity registration persistence.
Full Changelog: 2.0.0...2.1.0
2.0.0
Discord Music RPC 2.0.0
This release introduces a major architectural change to the system by replacing the built-in site model with a new Activity Library. This update improves maintainability, enables faster updates, and introduces a centralized way to manage and distribute activities.
Added
- Activity Library system
- Userscript iframe support
Activity Library
To reduce maintenance overhead and enable faster updates, built-in sites have been migrated into the Activity Library system.
The Activity Library is a centralized repository-based system that allows users to:
- Install, publish, and maintain userscripts through a shared repository
- Receive automatic updates for installed activities
- Contributors will be able to export their userscripts directly from the Userscript Manager and submit them to this repository for others to use.
Important
As part of this transition, users must grant Userscript API permission to the extension in their browser for the Activity Library system to function correctly.
Improved
- Userscript regex engine improved to fully support complete regex patterns
- Userscript enable/disable toggle behavior fixed in edge cases
- Image detection in userscripts fixed for more reliable results
- Several built-in websites updated and migrated into the Activity Library
- Overall userscript system stability and consistency improved
- Improved userscript API permission warning with updated help section and visual guides
Changed
- Built-in site support has been removed and replaced by the Activity Library system
- Built-in Site Visibility management has been removed
- Userscript export format changed from JSON to JavaScript only for consistency
Breaking Changes
- Due to the system transition, site-specific filters and settings may need to be reconfigured after updating
- Some userscripts may need to be edited or re-saved.
Fixed
- Fixed multiple issues in userscript execution and site handling
- General stability improvements across the system
New Contributors
- @stealingudc made their first contribution in #32
Full Changelog: 1.11.0...2.0.0
1.11.0
v1.11.0 Update
This release expands Discord Web support, improves parser flexibility, adds more control over normalization and dashboard stats, and fixes several issues across the extension and dashboard experience.
Added
- Added Discord Web support.
- Added Discord Web port switching and toggle controls to the dashboard.
- Added Discord Web port configuration directly to the extension popup settings.
- Added a host permission warning dialog to the extension popup.
- Added configurable title normalization modes in extension settings.
- Added selector parser manager.
- Added wildcard domain support (
*.domain) for userscripts, selector parsers, and built-in parsers. - Added multi-domain and domain editing support for selector parsers.
- Added row count selector for dashboard stats capture section.
- Added new “All Time” range option to dashboard stats summary.
Improved
- Improved localization structure in the userscript permission alert system.
- Improved and completed missing translations across the extension.
- Improved overall parser flexibility and domain matching behavior.
Fixed
- Fixed an IndexedDB export issue that could cause stack overflow errors during backup export.
- Fixed several localization inconsistencies in the userscript and filter section.
- Fixed an issue where some images were not displayed correctly in dashboard stats.
Full Changelog: 1.10.0...1.11.0
1.10.0
v1.10.0 Update
This release introduces major improvements to selector validation, input flexibility, parsing logic, and overall system reliability.
Added
- Title and artist fields now support plain text input.
Improved
- The artist field is no longer mandatory; the title field is now the only required field.
- Auto video state detection improved; potential conflict scenarios resolved.
- Artist and title normalization enhanced with improved dash-based parsing and structured validation.
- Improved reliability in selector preview rendering.
Fixed
- Fixed incorrect validation results caused by partial selector detection in the system. (#22)
Removed
- Removed animeKai
Full Changelog: 1.9.0...1.10.0
1.9.0
v1.9.0 Update
This release introduces Live Activity output with WebNowPlaying integration and file-based activity export, along with multiple stability and metadata fixes.
Added
WebNowPlaying integration
Stream your current music metadata to Rainmeter and OBS in real time - no browser extension needed. The following fields are sent every second:
- Track title, artist, and source
- Cover art
- Playback position and duration
Setup: Install the Rainmeter or OBS plugin, then go to Dashboard → Settings and enable WNP Rainmeter Support or WNP OBS Support.
- Rainmeter plugin → https://github.com/keifufu/WebNowPlaying-Rainmeter
- OBS script → https://github.com/keifufu/WebNowPlaying-OBS
Activity File Store
Writes your current playback data to local files on every track change - useful for streaming overlays, widgets, or any tool that reads from disk.
| File | Contents |
|---|---|
artist.txt |
Artist name |
title.txt |
Track title |
source.txt |
Source |
cover.png |
Album art (downloaded automatically) |
activity.json |
All fields + updatedAt timestamp |
When playback stops, text files are cleared and cover.png is removed.
Enable/disable: Dashboard → Settings → Local Activity Share
Open the folder: Dashboard → Settings → Open Directory
Fixed
- Fixed
KeepAliveManagernot being initialized on startup - Fixed user-added music sites disappearing from the list
- Fixed empty parentheses not being stripped from activity title and artist fields
Full Changelog: 1.8.0...1.9.0
1.8.0
v1.8.0 Update
This release focuses on smarter media detection, better site support, and a more reliable selector & userscript experience across the extension.
Added
-
Automatic video tracking in Watching Mode
- Selector integrations and userscripts can now automatically detect video playback and progress
- Optional auto-detect toggle available when activity mode is set to Watching
-
Added playback status support for casting to selector integrations
-
New supported sites
- animeNexus
- animepahe
- animetsu
- miruro
New userscript helper functions
getText(selector, options?)
Reads the text content (or an attribute) of a DOM element matching the given CSS selector.
Parameters:
| Parameter | Type | Description |
|---|---|---|
selector |
string |
CSS selector (e.g., ".now-playing-title") |
options.attr |
string |
Read an attribute instead of text (e.g., "href", "title") |
options.transform |
function |
A function to modify the result before returning it |
options.root |
Element |
Search within a specific element instead of the whole page |
Returns: string — the extracted text, or "" if nothing was found.
// Basic usage — reads the text inside .now-playing-title
getText(".now-playing-title");
// → "Bohemian Rhapsody"
// Read an attribute instead of text content
getText(".song-link", { attr: "href" });
// → "https://example.com/song/123"
// Transform the result (e.g., remove a leading slash)
getText(".song-link", {
attr: "href",
transform: (v) => v.replace(/^\//, ""),
});
// → "song/123"
// Search inside a specific container
getText(".subtitle", { root: document.querySelector(".player-widget") });Returns
""if the element is not found, the attribute doesn't exist, or the transform function throws an error. Whitespace is trimmed automatically.
getImage(selector, root?)
Extracts an image URL from a DOM element. Works with <img> tags, CSS background-image, or a child <img> inside the matched element.
Parameters:
| Parameter | Type | Description |
|---|---|---|
selector |
string |
CSS selector |
root |
Element (optional) |
Search within a specific element instead of the whole page |
Returns: string \| null — the image URL, or null if not found.
getImage(".album-cover img"); // → "https://example.com/cover.jpg"
getImage(".hero-banner"); // → reads background-image CSS property
getImage(".track-card"); // → finds the first <img> inside .track-cardSearch priority: direct <img> src → CSS background-image → first child <img> src.
getTextAll(selector, options?)
Same as getText, but returns an array of results for all matching elements.
Parameters:
| Parameter | Type | Description |
|---|---|---|
selector |
string |
CSS selector (e.g., ".track-list .title") |
options.attr |
string |
Read an attribute instead of text (e.g., "href", "title") |
options.transform |
function |
A function to modify each result before returning it |
options.root |
Element |
Search within a specific element instead of the whole page |
Returns: string[] — empty strings are automatically filtered out.
getTextAll(".track-list .title");
// → ["Song 1", "Song 2", "Song 3"]
getTextAll(".nav a", { attr: "href", transform: (v) => new URL(v).pathname });
// → ["/home", "/about", "/contact"]getImageAll(selector, root?)
Same as getImage, but returns an array of image URLs for all matching elements.
getImageAll(".playlist-item img");
// → ["cover1.jpg", "cover2.jpg", "cover3.jpg"]Returns: string[] — null values are automatically filtered out.
querySelectorDeep(selector, root?, all?)
Searches for elements matching a CSS selector across the regular DOM and all nested shadow DOMs.
- If
allisfalse(default), returns the first matching element. - If
allistrue, returns all matching elements as an array. - Falls back to partial class matching via
queryWithPartialClassif a direct match fails.
querySelectorDeep(".playlist-item img");
// → <img src="cover1.jpg">
querySelectorDeep(".playlist-item img", document, true);
// → [<img>, <img>, <img>]Parameters:
selector(string) — CSS selector to match.root(Document | Element | ShadowRoot, optional) — Root node to start searching from. Defaults todocument.all(boolean, optional) — Whether to return all matches (true) or just the first (false).
Returns:
Element | nullwhenall = falseElement[]whenall = true
Improved
Selector system upgrades
Partial class matching support added
You don’t need to match class names exactly. The selector will match any class that starts with the given value.
".card" → matches "card-primary", "card-secondary", "card-lg"-
Supports basic CSS combinators
(space) → selects all nested (descendant) elements>→ selects direct children only+→ selects the next sibling element~→ selects all following sibling elements
-
Works with tag + class combinations
"div.card" → matches <div class="card-primary">
Important Notes
-
You must include at least a tag name or a class in your selector
(e.g. only#idor attribute selectors are not supported) -
Class matching is based on prefix:
"btn" matches "btn-primary", "btn-large"
-
This is different from standard CSS behavior
In normal CSS:.btn /* does NOT match .btn-primary */
But here, it does match.
- Improved selector UI for easier element picking
-
iframeParser enhancements
- Better detection logic for embedded players
- Improved multi-frame handling
- More reliable casting detection
Fixed
- Fixed incorrect duration and time tracking in selector integrations
- Fixed issue where hidden overlays on pages blocked selecting elements underneath
- Fixed incorrect duration detection in selector integrations preview
- Fixed casting detection failures in iframe-based players
- Fixed popup breaking when opened too early
- Fixed userscripts not running after import
- Updated broken selectors for supported sites (animeNexus, animepahe, biliBiliTV)
Removed
-
Removed dead websites:
- 9anime
- aniCrush
- aniWatch
Full Changelog: 1.7.0...1.8.0
1.7.0
v1.7.0 Update
This release focuses on stability improvements, better UX in the dashboard, and internal refactors to make the system more maintainable and extensible.
Added
-
Artist drill-down in dashboard/stats/summary
- Click an artist to view their top 10 songs
-
Persistent custom image override via URL in dashboard/stats/summary
- Custom images are now saved and retained across sessions
-
Custom dialog system
- Replaces default
alertandconfirmacross dashboard and extension for a more consistent UI
- Replaces default
Improved
-
Error filtering in extension
- Reduced unnecessary log noise when users do not grant userscript permissions
-
Localization system
- Reorganized locale file structure and added Crowdin support for easier translations
Fixed
-
Memory leaks in dashboard
- Resolved issues caused by event listeners, timers, and subscriptions
-
Missing translations in dashboard and extension
-
Extension playing detection logic
- Fixed incorrect behavior caused by parser-specific
isPlayingoverriding tabaudiblestate - Fixed
isPlayingdetection across multiple parsers (j1FM,plazaOne,r-a-dio,radioGarden,sasaleleMusicStation,soundcloud,wap-fm)
- Fixed incorrect behavior caused by parser-specific
Full Changelog: 1.6.0...1.7.0