NOTICE: By continued use of this site you understand and agree to the binding แแแแกแแฎแฃแ แแแแก แแแ แแแแแ and แแแแคแแแแแชแแแแฃแ แแแแก แแแแแขแแแ.
A Tampermonkey userscript that unlocks all Songsterr Plus features and replaces the native export button with high-quality Guitar Pro 7 (.gp) and MIDI (.mid) downloaders built on alphaTab.
SongsterrUltimate.user.js and save (Ctrl+S)This project wouldn't be possible without the brilliant work of these contributors:
The script is structured in 7 main sections that work together to unlock Songsterr:
We attack the problem from three angles simultaneously:
/auth/profile API calls and return a fake Plus profileThis multi-layered approach ensures the app believes it's in Plus mode from the very first render.
const MAGIC_ID = Math.floor(Math.random() * 900000000) + 100000000;
const MAGIC_PROFILE = { plan: 'plus', hasPlus: true, subscription: { plan: { id: 'plus' } }, ... };
A fresh random 9-digit user ID is generated each session. This prevents the server from accumulating download history against a fixed ID that could trigger rate limiting.
The profile perfectly mirrors what Songsterr's /auth/profile endpoint returns for real subscribers.
We replace the global fetch with a protected hook using Object.defineProperty with writable: false and configurable: false to prevent the page from redefining it:
| Route | Action |
|---|---|
/auth/profile |
Returns MAGIC_PROFILE as fake 200 OK JSON |
sentry / logs / analytics |
Returns {} silently, blocking telemetry |
/api/songs/* / /api/tab/* |
Caches revision data for our downloader |
Stealth features:
fetchHooked.toString() returns the original function's source, defeating integrity checksObject.defineProperty to survive any page-side redefinitionsTo prevent memory leaks from accumulated cached data:
const CACHE_SIZE_LIMIT = 50;
function manageCacheSize() {
if (window.__SGD_REVISION_CACHE.size >= CACHE_SIZE_LIMIT) {
// Remove oldest 10 entries when limit reached
const entries = Array.from(window.__SGD_REVISION_CACHE.entries());
for (let i = 0; i < 10 && i < entries.length; i++) {
window.__SGD_REVISION_CACHE.delete(entries[i][0]);
}
}
}
The revision cache automatically cleans up old entries to stay under the 50-song limit.
Songsterr uses server-side rendering. Before React boots, it writes the entire Redux state into:
<script id="state">{"user":{"hasPlus":false,...},...}</script>
We patch this JSON as soon as the element appears, before React parses it:
data.user.hasPlus = true;
data.user.profile = MAGIC_PROFILE;
data.consent = { loading: false, suite: 'tcf', view: 'none' }; // kills GDPR banner
Result: React hydrates in Plus mode from its very first render, with zero flash of free content.
This is the most delicate part. We use a setInterval that targets only Plus-gated buttons:
โ ๏ธ Critical pitfall: removing disabled from ALL buttons breaks the tab player! Songsterr legitimately uses disabled during audio loading.
Solution โ three surgical passes:
svg use[href*="lock"] marks paywalled buttonsdata-id attributes (Speed, Loop, Solo, Print)Cny223 is the internal class for locked controlsSpecial handling: The Autoscroll button is protected separately by ใใใชใซ's fix (data-id renamed to Auto-Scroll to avoid conflicts with our setInterval).
Player controls (Play, Metronome, navigation) have none of these signals, so they're never touched.
Songsterr is a React SPA with dynamic navigation. We handle this with multiple resilience mechanisms:
Debounced injection:
let _injectionTimeout = null;
function debouncedInjection() {
if (_injectionTimeout) clearTimeout(_injectionTimeout);
_injectionTimeout = setTimeout(() => {
tryInjectButtons();
}, 100);
}
Navigation hooks:
history.pushState, history.replaceState, and popstate eventsImproved error filtering:
Only filters known benign errors (AudioContext, source-map, etc.) while preserving Songsterr and script-related errors for debugging.
Comprehensive logging system:
function sgdLog(level, source, message, data) {
// Structured logging with source tagging
}
Silent try/catch blocks now log warnings instead of swallowing errors silently, making debugging much easier.
This is where the magic happens! Inspired by Metaphysics0's approach:
Step 1: Read song metadata from the same <script id="state"> element (with API fallback when DOM is stale)
Step 2: Fetch track data from Songsterr's CloudFront CDN using Chrome headers via GM_xmlhttpRequest (bypasses CORS)
Step 3: Convert to alphaTab's internal model with precise mappings
Step 4: Export to GP7 or MIDI formats
Key conversions:
| Concept | Songsterr โ alphaTab |
|---|---|
| Duration | Fraction [num, den] โ Duration enum + dots |
| String index | 0 = highest string โ 1 = lowest string |
| Bend points | Hundredths of semitone โ Quarter-tones (ร2) |
| Instrument ID | Internal ID โ GM program (0-127) |
| Percussion | MIDI note โ alphaTab articulation index |
CDN Strategy:
dqsljvtekg760.cloudfront.netd3d3l6a6rcgkaf.cloudfront.netInjection target:
<div id="c-export" class="B3a4pa B3agq5"> โ replaced entirely
<button id="control-export" title="Download tab">Export</button>
</div>
We replace the #c-export div with our #sgd-wrapper, inheriting the same CSS classes for perfect alignment.
Three fallback selectors for Songsterr updates:
#c-export โ stable element ID (primary)#control-export's parent div[title*="Download tab"] or [data-id*="Export"]Permanent MutationObserver re-injects if our buttons disappear after React re-renders.
Ever wanted to just listen to the original song while practicing? This feature:
Songsterr's CSS changes can break the native autoscroll. ใใใชใซ's fix:
overflow: auto !important ruledata-idThe script includes a comprehensive debug logging system:
F12 to open DevToolstoggleSgdLogging() in the console to enable/disable loggingA green "Logging ON/OFF" button appears in the UI for easy access.
This project is for educational and cybersecurity research purposes only. It demonstrates advanced browser extension techniques including client-side state spoofing, network interception, and DOM manipulation.
If you use Songsterr regularly, please consider supporting the developers with an official subscription. This script is intended for learning, testing, and personal use scenarios.
Made with โค๏ธ for the guitar community, with special thanks to ใใใชใซ and Metaphysics0 for their brilliant contributions!
แ แแแขแแแแ: 43.8