Auto-skip repeated tracks on YouTube, YouTube Music & Spotify for endless music discovery.
Available on: 🌐 Chrome Extension • 📱 Android App • 💻 Windows Desktop
🚀 Quick Start • ✨ Features • 📱 Platforms • 🧠 How It Works • 📊 Use Cases
|
Music algorithms love showing you the same songs over and over. Spotify played that one hit 47 times this month? YouTube stuck in a loop of 5 familiar tracks? You're not discovering music anymore — you're just reliving it. |
Unloop intelligently tracks every song you've heard and automatically skips repeats based on your preferences. It's like having a DJ who never forgets and always knows exactly when you're ready to hear something fresh. 100% automatic. 100% private. 100% discovery. |
Track your music discovery journey with real-time stats:
|
|
|
Clean, distraction-free interface. Hides:
|
|
Get achievement toasts as you reach milestones:
- 🎉 25 loops: "Nice! You've avoided 25 boring repeats"
- 🌟 50 loops: "Awesome! 50 repeats dodged"
- 🎊 100 loops: "Incredible! 100 loops prevented"
- 🏆 250 loops: "Amazing! Discovery master status"
- 💎 500 loops: "Legendary! Absolute champion"
- 🧠 Intelligence Levels: "I'm starting to understand your taste..." → "I know you better than you know yourself"
|
100% Offline No servers, no cloud |
Zero Tracking No analytics, no telemetry |
Local Storage All data stays on your device |
Open Source Transparent & auditable |
╔════════════════════════════════════════════════════╗
║ 🔄 Unloop ║
║ Fresh Music Discovery ║
╠════════════════════════════════════════════════════╣
║ ║
║ [●════════════════════════════] ON ║
║ ║
║ ┌──────────────────────────────────────────────┐ ║
║ │ 🎵 Discovery Mode Active │ ║
║ │ Smart Auto — Learning your taste... │ ║
║ │ "Keeping your queue fresh and exciting" │ ║
║ └──────────────────────────────────────────────┘ ║
║ ║
║ ┌─────────────┬─────────────┬─────────────────┐ ║
║ │ Freshness │Intelligence │ Variety │ ║
║ │ 94% │ 73% │ 89% │ ║
║ │ 🎯 │ 🧠 │ 🎨 │ ║
║ └─────────────┴─────────────┴─────────────────┘ ║
║ ║
║ ┌─────────────────────────────────────────────┐ ║
║ │ 🎵 Songs Explored │ 847 │ ║
║ │ ⏭️ Loops Prevented │ 234 │ ║
║ │ 🎨 Artist Discovery │ 67 │ ║
║ │ ⏱️ This Session │ 12 songs │ ║
║ └─────────────────────────────────────────────┘ ║
║ ║
║ 🎯 Discovery Mode: ║
║ ┌────────────────────────────────────────────┐ ║
║ │ ( ) Smart Auto [AI] ← Zero setup! │ ║
║ │ ( ) Strict - Never repeat │ ║
║ │ ( ) Memory Fade - Time-based cooldown │ ║
║ │ ( ) Semi-Strict - Discovery quota │ ║
║ │ ( ) Artist Smart - Rotation guard │ ║
║ └────────────────────────────────────────────┘ ║
║ ║
║ 🎵 Now Playing: ║
║ ┌────────────────────────────────────────────┐ ║
║ │ "Ocean Eyes" - Billie Eilish │ ║
║ │ [⚪ Whitelist] [⚫ Blacklist] │ ║
║ └────────────────────────────────────────────┘ ║
║ ║
║ 📊 Data Management: ║
║ [📊 CSV Export] [📥 Import] [🗑️ Clear History] ║
║ ║
║ 🎨 Customize: ║
║ Theme: (●) Dark ( ) Light ( ) Auto ║
║ Minimal Mode: [ ] Hide extras ║
║ ║
╚════════════════════════════════════════════════════╝
In-page notifications that appear on music platforms:
┌─────────────────────────────────────────┐
│ 🎵 Unloop │
│ Skipped — already heard this │
│ Keeping your discoveries fresh ✨ │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ 🧠 Unloop │
│ Smart choice — letting this one play │
│ You seem to love this artist! 💜 │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ 🎉 Achievement Unlocked! │
│ 250 loops prevented — Discovery Master │
│ Amazing! Keep exploring! 🏆 │
└─────────────────────────────────────────┘
Intelligence Score Over Time
100│ ╱─
│ ╱─
75│ ╱────
│ ╱───
50│ ╱────
│ ╱────
25│ ╱────
│ ────
0└────────────────────────────────────────
Day 1 Week 1 Week 2 Week 3 Week 4
"I'm learning your taste..." → "We're in sync!" 🔥
Songs Discovered: 847 🎵
[████████████████████████████░░░░] 85% to 1,000
Next Milestone:
┌─────────────────────────────────────────┐
│ 🏆 1,000 Songs - Explorer Champion │
│ Keep going! Only 153 more to go! 🎯 │
└─────────────────────────────────────────┘
Unloop is available across multiple platforms to fit your music listening lifestyle:
One-click install - easiest method
-
Download this repository
git clone https://github.com/DEADSAW/unloop.git cd unloop -
Generate Icons (one-time setup)
- Open
icons/generate-icons.htmlin your browser - Click Download All button
- Move downloaded PNGs to
icons/folder
- Open
-
Load Extension
- Open Chrome:
chrome://extensions/ - Enable Developer mode (toggle in top right)
- Click Load unpacked
- Select the
unloopfolder - ✅ Done!
- Open Chrome:
-
Start Discovering
- Go to YouTube Music, YouTube, or Spotify
- Click the Unloop icon in your toolbar
- Choose your discovery mode
- Let the magic begin! 🎵
-
Download & Install
# Clone the repository git clone https://github.com/DEADSAW/unloop.git cd unloop/android-app
-
Build the APK
- Open the
android-appfolder in Android Studio - Build → Build Bundle(s) / APK(s) → Build APK(s)
- Install the generated APK on your device
Or use command line:
./gradlew assembleDebug
- Open the
-
Grant Permissions After installation, enable these permissions:
- Accessibility Service - For auto-skip functionality
- Notification Access - To detect currently playing songs
-
Start Using
- Open the Unloop app
- Enable the service
- Play music on Spotify, YouTube Music, or any music app
- Enjoy automatic skip of repeated songs! 🎵
Requirements: Android 8.0+ (API 26)
-
Download & Setup
# Clone the repository git clone https://github.com/DEADSAW/unloop.git cd unloop/desktop-app npm install
-
Run the Application
npm start
Or build an installer:
npm run build
The installer will be in the
distfolder. -
Configure & Use
- The app appears in your system tray
- Use Ctrl+Shift+U to toggle the main window
- Use Ctrl+Shift+M for mini player mode
- Configure your discovery preferences
- Track your listening across all platforms! 🎵
Requirements: Windows 10+ with Node.js 16+
graph LR
A[🎵 Music Platform] -->|Song Change| B[Content Script]
B -->|Extract Metadata| C{Check Rules}
C -->|Whitelist?| D[✅ Allow Play]
C -->|Blacklist?| E[⏭️ Skip]
C -->|History Check| F{Mode Logic}
F -->|Smart Auto| G[Affection Score]
F -->|Strict| H[Ever Played?]
F -->|Memory Fade| I[Time Check]
F -->|Semi-Strict| J[New Songs Count]
F -->|Artist Smart| K[Artist Rotation]
G -->|Decision| L[Skip or Allow]
H -->|Decision| L
I -->|Decision| L
J -->|Decision| L
K -->|Decision| L
L -->|Update| M[📊 Stats & History]
L -->|Toast| N[🔔 Notification]
The Brain — Runs on YouTube/Spotify pages
// Continuously monitors for song changes
setInterval(() => {
const currentSong = detectCurrentSong();
if (currentSong.id !== lastSongId) {
processSong(currentSong);
}
}, 1000); // Check every secondKey Functions:
- 🎵 Song Detection: Extracts title, artist, video ID from platform DOM
- 📝 History Tracking: Stores play count, skip count, listen duration
- ⏱️ Duration Tracking: Monitors how long you listen to each song
- ⏭️ Auto-Skip: Simulates next button click when rules violated
- 🔔 Toast Notifications: Beautiful in-page alerts
The Storage Manager — Handles data persistence
// Stores all extension data
chrome.storage.local.set({
songHistory: {}, // Every song you've heard
settings: {}, // Your mode & preferences
whitelist: [], // Songs that always play
blacklist: [], // Songs that never play
stats: {}, // Discovery metrics
achievements: {} // Milestone progress
});Responsibilities:
- 💾 Data Persistence: Saves history across browser sessions
- 🔄 Message Handling: Coordinates between popup and content script
- 📊 Stats Calculation: Computes freshness, intelligence, variety
- 🏆 Achievement Tracking: Monitors milestone progress
The Control Panel — Your settings dashboard
- 🎛️ Mode Selector: Switch between discovery modes
- 📊 Live Stats: Real-time metrics with animated graphs
- ⚙️ Settings Sliders: Fine-tune mode parameters
- 🎨 Theme Toggle: Dark/Light/Auto modes
- 📤 Data Export: Backup your listening history
- 🎮 Song Controls: Whitelist/Blacklist current track
The most sophisticated mode with AI-powered decision making:
function calculateAffectionScore(song) {
// 60% weight: How long do you listen?
const listenWeight = song.avgListenDuration * 0.6;
// 30% weight: Do you play or skip it?
const playSkipRatio = song.totalPlays / (song.totalPlays + song.totalSkips);
const ratioWeight = playSkipRatio * 0.3;
// 10% penalty: Quick skips (<20s) hurt score
const quickSkipPenalty = (song.quickSkipCount / song.totalPlays) * 0.1;
return Math.max(0, listenWeight + ratioWeight - quickSkipPenalty);
}Score Interpretation:
0.8 - 1.0= Loved → 4-12 hour cooldown0.5 - 0.8= Liked → 24-48 hour cooldown0.3 - 0.5= Neutral → 80 hour cooldown0.0 - 0.3= Disliked → 140-160 hour cooldown
function calculateSmartCooldown(affectionScore, song) {
// Base formula: 4 hours (loved) to 164 hours (disliked)
let cooldownHours = 4 + (1 - affectionScore) * 160;
// Hard block: Skip 3+ times = 90 day timeout
if (song.totalSkips >= 3) {
cooldownHours = 90 * 24; // 2160 hours
}
return cooldownHours;
}// Rule 1: Session Repeat Protection
if (last5Songs.includes(songId)) {
skip("Heard too recently");
}
// Rule 2: Hard Dislike Protection
if (song.totalSkips >= 3 || song.quickSkipCount >= 2) {
skip("You usually skip this");
}
// Rule 3: Artist Diversity Shield
if (artistPlaysInLast10Songs >= 3 && avgListenDuration < 0.75) {
skip("Keeping artist variety");
}
// Rule 4: Time-Based Cooldown
const hoursSinceLastPlay = (now - song.lastPlayed) / 3600000;
if (hoursSinceLastPlay < calculateSmartCooldown(affectionScore, song)) {
skip("Still on cooldown");
}
// Rule 5: Allow if Approved
allow("Smart choice ✨");┌─────────────────────────────────────────────────────────────────┐
│ 🎵 MUSIC PLATFORM │
│ (YouTube / YouTube Music / Spotify) │
└────────────────────────┬────────────────────────────────────────┘
│
│ Song Change Detected
▼
┌─────────────────────────────────────────────────────────────────┐
│ 🔍 CONTENT SCRIPT │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 1. Extract Metadata │ │
│ │ • Video ID / Track ID │ │
│ │ • Title & Artist │ │
│ │ • Platform (YT/YTM/Spotify) │ │
│ └──────────────────────────────────────────────────────────┘ │
└────────────────────────┬────────────────────────────────────────┘
│
│ Query Storage
▼
┌─────────────────────────────────────────────────────────────────┐
│ 💾 BACKGROUND SERVICE │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ chrome.storage.local │ │
│ │ • songHistory: { [id]: {...} } │ │
│ │ • whitelist: [...] │ │
│ │ • blacklist: [...] │ │
│ │ • settings: { mode, params } │ │
│ │ • stats: { listened, skipped, ... } │ │
│ └──────────────────────────────────────────────────────────┘ │
└────────────────────────┬────────────────────────────────────────┘
│
│ Send Data
▼
┌─────────────────────────────────────────────────────────────────┐
│ ⚙️ DECISION ENGINE │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Whitelist? │───>│ ✅ ALLOW │ │ │ │
│ └─────────────┘ └─────────────┘ │ │ │
│ │ │ Mode │ │
│ │ No │ Logic │ │
│ ▼ │ │ │
│ ┌─────────────┐ ┌─────────────┐ │ • Strict │ │
│ │ Blacklist? │───>│ ⏭️ SKIP │ │ • Memory │ │
│ └─────────────┘ └─────────────┘ │ • Semi │ │
│ │ │ • Artist │ │
│ │ No │ • Smart │ │
│ ▼ │ │ │
│ ┌─────────────┐ └──────┬──────┘ │
│ │ Check Mode │ │ │
│ │ Rules │───────────────────────────────┘ │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Decision │ │
│ └──────┬──────┘ │
└──────────┼─────────────────────────────────────────────────────┘
│
├──────> ✅ ALLOW ──────┐
│ │
└──────> ⏭️ SKIP ───────┤
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 🎬 ACTIONS │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ If ALLOW: │ │
│ │ • Update play count │ │
│ │ • Track listen duration │ │
│ │ • Add to session history │ │
│ │ • Show toast: "Enjoying fresh music ✨" │ │
│ │ │ │
│ │ If SKIP: │ │
│ │ • Click next button (simulate user) │ │
│ │ • Update skip count │ │
│ │ • Show toast with reason │ │
│ │ • Check achievement milestones │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
🎵 New Song Detected
│
▼
┌──────────────────────┐
│ In Last 5 Songs? │
└──────────┬───────────┘
│
┌────────────┼────────────┐
│ YES NO │
▼ ▼
⏭️ SKIP ┌──────────────────┐
"Heard too recently" │ Skip Count >= 3? │
└────────┬─────────┘
│
┌──────────┼──────────┐
│ YES NO │
▼ ▼
⏭️ SKIP ┌──────────────────┐
"You usually skip this" │ Artist Overplayed?│
└────────┬─────────┘
│
┌──────────┼──────────┐
│ YES NO │
▼ ▼
⏭️ SKIP ┌──────────────────┐
"Keeping variety" │ Calculate Score │
└────────┬─────────┘
│
┌───────────┼───────────┐
▼ ▼
[High Score] [Low Score]
│ │
▼ ▼
Short Cooldown Long Cooldown
(4-12 hours) (80-160 hours)
│ │
└───────────┬───────────┘
│
▼
┌──────────────────────┐
│ Cooldown Expired? │
└────────┬─────────────┘
│
┌──────────┼──────────┐
│ YES NO │
▼ ▼
✅ ALLOW ⏭️ SKIP
"Smart choice ✨" "Still on cooldown"
| Your Situation | Best Platform | Why? |
|---|---|---|
| 🖥️ I mainly listen on desktop browser | Chrome Extension | Full-featured, works directly in YouTube/Spotify web |
| 📱 I listen on my phone with apps | Android App | Works with any music app, no browser needed |
| 💼 I want system-wide monitoring | Desktop App | Advanced analytics, global hotkeys, mini player |
| 🌍 I use multiple platforms | All Three! | Each tracks independently, export/import data to sync |
| Scenario | Without Unloop | With Unloop | Recommended Mode |
|---|---|---|---|
| 🎧 Monday Morning Commute | ❌ Same 10 songs on repeat 😴 Bored by Friday |
✅ 50+ new discoveries/week 🎉 Always excited |
Smart Auto |
| 🏋️ Gym Workout Playlist | ❌ Overplayed motivational songs 📉 Losing impact |
✅ Fresh energy every session 💪 Sustained motivation |
Memory Fade (7 days) |
| 📚 Study/Focus Music | ❌ Algorithm loops same artist 😑 Distracted by familiarity |
✅ Continuous variety 🧠 Better focus |
Artist Smart |
| 🎨 Creative Work Session | ❌ Predictable background music 💤 Uninspired |
✅ Unexpected discoveries ✨ Creative spark |
Strict |
| 🎉 Party Playlist Building | ❌ Duplicates, manual checking ⏰ 3 hours of work |
✅ Auto-filtered unique tracks ⚡ 20 minutes |
Strict + Export |
| 🌙 Sleep/Relaxation | ❌ Same calming songs nightly 😬 Losing effectiveness |
✅ Gentle variety 😴 Better sleep quality |
Memory Fade (2 days) |
"I want to discover as much new music as possible"
Recommended Mode: Strict
- Never hear the same song twice
- Perfect for building massive playlists
- Discover 100+ new songs per week
- Great for finding hidden gems
"I want fresh music but don't mind occasional repeats"
Recommended Mode: Memory Fade (168 hours / 1 week)
- Songs return after 1 week
- 70% fresh, 30% familiar balance
- Maintains discovery while allowing favorites
- Prevents burnout from too much newness
"I want to challenge myself to discover X songs before repeating"
Recommended Mode: Semi-Strict (20 new songs)
- Forces discovery quotas
- Gamifies the listening experience
- Perfect for "Discover 500 songs this year" goals
- Satisfying progress tracking
"I love variety but algorithms keep playing the same artists"
Recommended Mode: Artist Smart (3 max per session)
- Prevents "Drake hour" or "Beatles marathon"
- Maintains genre diversity
- Still allows repeats, just from different artists
- Great for discovering new artists in familiar genres
"I want it to just work automatically"
Recommended Mode: Smart Auto
- Zero configuration required
- Learns your preferences over time
- Loved songs return sooner, disliked songs stay away
- Perfect "set and forget" mode
"I need to build a 500-song playlist without duplicates"
Perfect Workflow:
- Enable Strict Mode
- Open YouTube Music radio/playlist
- Let Unloop auto-skip all repeats
- Export history as CSV after session
- Import into Spotify/Apple Music
unloop/
├── 📂 Chrome Extension (Web)
│ ├── 📜 manifest.json # Extension configuration & permissions
│ ├── 🧠 background.js # Service worker - data persistence
│ ├── ⚙️ content.js # Main engine - song detection & skip logic
│ ├── 🎨 toast.css # Toast notification styles
│ ├── 📂 popup/
│ │ ├── popup.html # Extension dashboard UI
│ │ ├── popup.css # Beautiful gradients & animations
│ │ └── popup.js # Settings logic & stats rendering
│ ├── 📂 icons/ # Extension icons
│ └── 📂 assets/ # Libraries (Chart.js)
│
├── 📂 android-app/ # Native Android Application
│ ├── 📂 app/src/main/
│ │ ├── MainActivity.kt # Main UI
│ │ ├── 📂 data/ # Room database & models
│ │ └── 📂 service/ # Notification listener & accessibility
│ ├── 📂 screenshots/ # App screenshots
│ ├── build.gradle.kts # Build configuration
│ └── README.md # Android-specific docs
│
├── 📂 desktop-app/ # Windows Desktop Application
│ ├── main.js # Electron main process
│ ├── 📂 src/
│ │ ├── index.html # Main UI
│ │ ├── renderer.js # UI logic
│ │ ├── smart-engine.js # Analytics engine
│ │ └── mini.html # Mini player
│ ├── package.json # Dependencies
│ └── README.md # Desktop-specific docs
│
└── 📜 README.md # Main documentation (this file)
| 📜 manifest.json |
Extension configuration file. Defines:
|
| 🧠 background.js |
Service worker running in the background. Handles:
|
| ⚙️ content.js |
The main engine injected into music platforms. Core logic:
1,738 lines of pure discovery magic ✨ |
| 🎨 popup.js |
Dashboard interface controller. Features:
1,106 lines of beautiful UI logic 🎨 |
|
|
|
| Song detection speed | Extension size | CPU usage (idle) | Memory footprint |
┌─────────────────────────────────────────────────────┐
│ ✅ 100% Local Processing │
│ • All decisions made on your device │
│ • No external API calls │
│ │
│ ✅ Zero Data Collection │
│ • No analytics or telemetry │
│ • No user tracking │
│ • No third-party services │
│ │
│ ✅ Minimal Permissions │
│ • storage: Save your preferences │
│ • activeTab: Read current song only │
│ • scripting: Auto-skip functionality │
│ │
│ ✅ Open Source │
│ • Fully auditable code │
│ • Community reviewed │
│ • No obfuscation │
│ │
│ ✅ Crash Protection │
│ • Context invalidation guards │
│ • Session token tracking │
│ • Automatic recovery │
│ • No data loss │
└─────────────────────────────────────────────────────┘
// chrome.storage.local (Persistent)
{
enabled: true,
settings: {
mode: "smart-auto" | "strict" | "memory-fade" | "semi-strict" | "artist-smart",
memoryFadeHours: 72, // 1-8760 (1 year)
songsBeforeRepeat: 5, // 1-50
maxArtistPerSession: 3, // 1-10
theme: "dark" | "light" | "auto",
minimalMode: false
},
songHistory: {
"[videoId]": {
platform: "YouTube" | "YouTube Music" | "Spotify",
title: "Song Title",
artist: "Artist Name",
firstPlayed: 1704067200000, // Unix timestamp
lastPlayed: 1735689600000, // Unix timestamp
totalPlays: 5,
totalSkips: 2,
totalListeningSeconds: 890,
avgListenDuration: 0.75, // 0-1 scale
quickSkipCount: 1, // Skips < 20 seconds
lastListenDuration: 0.82
}
},
whitelist: ["videoId1", "videoId2"],
blacklist: ["videoId3", "videoId4"],
stats: {
listened: 847,
skipped: 234,
firstInstall: 1704067200000,
totalListeningSeconds: 1247800
},
achievements: {
loops25: true,
loops50: true,
loops100: false,
intel50: true,
intel70: true,
intel85: false
}
}
// chrome.storage.session (Resets on browser close)
{
sessionData: {
songs: ["id1", "id2", "id3"], // Last songs this session
artists: ["Artist A", "Artist B"], // Artists this session
startedAt: 1735689600000
}
}// Content Script → Background
chrome.runtime.sendMessage({
type: "TRACK_SESSION_SONG",
title: "Ocean Eyes",
artist: "Billie Eilish"
});
// Popup → Background
chrome.runtime.sendMessage({
type: "UPDATE_SETTINGS",
settings: { mode: "smart-auto" }
});
// Background → Content Script
chrome.tabs.sendMessage(tabId, {
type: "UPDATE_CONFIG",
config: { enabled: true, mode: "strict" }
});The extension includes comprehensive crash protection:
// Extension context validation
function isExtensionAlive() {
return !!chrome?.runtime?.id;
}
// Session token tracking (prevents stale operations)
let songProcessToken = 0;
function processSong(song) {
const myToken = ++songProcessToken;
// Long async operation...
await heavyComputation();
// Check if session is still valid
if (myToken !== songProcessToken) {
return; // Abort - page navigated away
}
// Safe to continue
}
// Graceful degradation
try {
chrome.storage.local.get(...);
} catch (error) {
if (isContextInvalidatedError(error)) {
// Silently fail - extension reloaded
return;
}
// Log other errors
console.error(error);
}- Install the extension (see Installation)
- Open YouTube Music
- Enable Unloop and select Strict Mode
- Play 3-5 different songs (let each play for ~30 seconds)
- Replay one of the songs you just heard
- Verify: Should auto-skip with toast: "Skipped — already heard this 🎵"
✅ Success: The extension is working!
| Mode | Test Steps | Expected Behavior |
|---|---|---|
| Strict |
1. Play Song A 2. Play Song B 3. Try to replay Song A |
✅ Song A auto-skips 🔔 Toast: "Already heard this" |
| Memory Fade |
1. Set cooldown to 1 hour 2. Play Song A 3. Wait 30 minutes 4. Try to replay Song A 5. Wait another 30 minutes 6. Try again |
❌ Skips at 30 min ✅ Allows at 60 min |
| Semi-Strict |
1. Set threshold to 3 songs 2. Play Song A 3. Play Songs B, C, D (new) 4. Try to replay Song A |
✅ Allows (3 new songs played) 🔔 Toast: "Welcome back!" |
| Artist Smart |
1. Set max to 2 2. Play 2 songs by Artist X 3. Try 3rd song by Artist X |
❌ Skips 3rd song 🔔 Toast: "Artist variety" |
| Smart Auto |
1. Play Song A (listen 80%) 2. Play Song B (skip at 10s) 3. Wait 24 hours 4. Try replaying A and B |
✅ Song A allowed (loved) ❌ Song B skipped (disliked) |
After the basic test:
- Open Unloop popup
- Check stats:
- Songs Explored: Should show 3-5
- Loops Prevented: Should show 1+
- Freshness: Should be 80-100%
- Click "📊 CSV Export"
- Verify: Downloaded CSV contains your song history with timestamps
- Play a song
- Click Unloop icon while song is playing
- Add song to whitelist (⚪ button)
- Replay the song
- Verify: Should NOT skip (whitelist overrides all rules)
Repeat for blacklist:
- Add different song to blacklist (⚫ button)
- Verify: Skips immediately when played
Combine whitelist with Strict mode:
- Enable Strict for maximum discovery
- Whitelist your 10-20 all-time favorites
- Result: Endless discovery + guaranteed comfort songs
- Use Smart Auto for 1-2 months
- Export history as CSV
- Analyze data:
- Which artists do you listen to most?
- Average listen duration per genre?
- Peak discovery hours?
- Share your taste profile or import into other tools
- Enable Memory Fade (90 days)
- Play summer vibes in June-August
- Songs return in September (autumn playlist!)
- Automatic seasonal rotation
Enable Minimal Mode when:
- Working/studying with music
- Don't want distracting stats
- Just need the core skip functionality
- Clean, zen interface preferred
Track your progress toward milestones:
- Open popup daily to check stats
- Try to hit 500 loops prevented
- Watch your Intelligence score grow
- Unlock all achievement toasts
🤔 Why do I need this? Doesn't YouTube/Spotify already have shuffle?
Shuffle randomizes the order, but algorithms still repeat the same pool of songs. Unloop tracks your entire listening history and prevents any repeat based on your chosen rules. It's like having a DJ with perfect memory who never forgets what you've heard.
Example: Spotify's Discover Weekly has 30 songs. Without Unloop, you hear those 30 on repeat. With Unloop (Strict mode), each song plays once, then you're forced to discover new tracks forever.
💾 Will this slow down my browser?
No. Unloop is incredibly lightweight:
- CPU Usage: 0% when idle, <0.1% when checking songs
- Memory: <5MB (less than a single browser tab)
- Storage: ~1-10MB depending on history size
- Battery: Zero measurable impact
The extension only activates on YouTube/Spotify pages and runs efficient checks every second.
🔒 Is my listening data private?
100% Private.
- ✅ All data stored locally on your device
- ✅ Zero external API calls
- ✅ No analytics or tracking
- ✅ No servers or cloud storage
- ✅ Open source - audit the code yourself
Your listening history never leaves your computer. Ever.
📱 Does this work on mobile?
Yes! We now have a native Android app available!
✅ Android App (Available Now)
- Works with any music app (Spotify, YouTube Music, etc.)
- Auto-skip via accessibility service
- Beautiful Material 3 design
- See Android Installation
🔄 iOS (Coming Soon)
- Native iOS app in development
- Expected: Q2 2026
The Chrome extension is currently desktop-only, but our Android app provides the same core functionality for mobile users.
🎵 Which platforms are supported?
Currently:
- ✅ YouTube (fully supported)
- ✅ YouTube Music (fully supported)
- 🔄 Spotify (beta - may have edge cases)
Coming soon:
- Apple Music (Safari extension)
- SoundCloud
- Bandcamp
- Tidal
🔄 What happens if I reinstall the extension?
Your data is stored in chrome.storage.local, which persists even if you:
- Disable the extension
- Close the browser
- Restart your computer
However, data is lost if you:
- Uninstall the extension
- Clear browser data (Extensions category)
Solution: Export your history (📊 CSV Export or 📥 JSON Export) before uninstalling!
⚡ Can I use this with multiple devices?
Each device has its own independent history (no cloud sync).
Workaround:
- Export history from Device A (📊 CSV Export)
- Import on Device B (📥 Import)
- Merge histories manually
Future: We're exploring optional cloud sync (with encryption) for users who want cross-device sync.
🎯 What's the difference between Strict and Smart Auto?
| Feature | Strict | Smart Auto |
|---|---|---|
| Philosophy | Never repeat anything | Smart cooldowns based on preference |
| Setup | Zero config | Zero config |
| Best for | Maximum discovery | Balanced experience |
| Repeats | Never | Eventually (4-160 hours) |
| Learning | No | Yes - adapts to your taste |
| Favorite songs | Gone forever | Return sooner (4-12 hours) |
| Hated songs | Skip once, gone forever | Skip 3x, gone for 90 days |
TL;DR: Strict = pure discovery. Smart Auto = AI-powered balance.
🐛 I found a bug! How do I report it?
Thanks for helping improve Unloop!
- Open an issue
- Include:
- Platform (Chrome/Android/Desktop)
- Browser/OS version
- Extension/App version
- Steps to reproduce
- Console errors (press F12 for web)
- Screenshot if applicable
We'll fix it ASAP! 🚀
💡 Can I request a feature?
Absolutely! Create a feature request and describe:
- What you want
- Why it's useful
- How you'd use it
- Which platform(s) it applies to
Popular requests get prioritized. Community votes help too! ⭐
Monday: [Song A] [Song B] [Song C] [Song A] [Song B] [Song A]
Tuesday: [Song A] [Song B] [Song D] [Song A] [Song C] [Song B]
Wednesday: [Song A] [Song B] [Song C] [Song A] [Song E] [Song A]
Thursday: [Song A] [Song B] [Song A] [Song C] [Song A] [Song B]
Friday: [Song A] [Song B] [Song C] [Song A] [Song A] [Song B]
Total Unique: 5 songs
Total Plays: 30
Repeats: 25 (83%)
Feeling: 😴 Bored
Monday: [Song A] [Song B] [Song C] [Song D] [Song E] [Song F]
Tuesday: [Song G] [Song H] [Song I] [Song J] [Song K] [Song L]
Wednesday: [Song M] [Song N] [Song O] [Song P] [Song Q] [Song R]
Thursday: [Song S] [Song T] [Song U] [Song V] [Song W] [Song X]
Friday: [Song Y] [Song Z] [Song AA][Song AB][Song AC][Song AD]
Total Unique: 30 songs
Total Plays: 30
Repeats: 0 (0%)
Feeling: 🎉 Excited
Help us reach 1,000 stars! ⭐
⭐ Stars
│
│ ╱─────
│ ╱
│ ╱
└────────────── Time
Your star helps us grow! 🚀
| Issue | Solution |
|---|---|
| ❌ Extension not detecting songs |
1. Refresh the YouTube/Spotify page 2. Check if extension is enabled (click icon) 3. Make sure you're on youtube.com or music.youtube.com 4. Check browser console for errors (F12) |
| ❌ Songs not skipping |
1. Verify Unloop is ON (check popup toggle) 2. Confirm song is not whitelisted 3. Check if mode rules allow the song 4. Reload content script (refresh page) |
| ❌ Stats showing 0 |
1. Play at least 1 song end-to-end 2. Wait 5 seconds for storage sync 3. Close and reopen popup 4. Check chrome://extensions for errors |
| ❌ "Extension context invalidated" error |
This happens when YouTube Music navigates to a new page: 1. Refresh the page (this is automatic now) 2. Extension has built-in crash protection 3. Data is never lost (saved before errors) |
| ❌ Import not working |
1. Verify JSON file format matches export 2. Check file size (<5MB recommended) 3. Use CSV import for large datasets 4. Clear history before importing |
- ✅ Five discovery modes
- ✅ Smart Auto AI
- ✅ Statistics dashboard
- ✅ Theme customization
- ✅ Achievement system
- ✅ CSV export
- ✅ Android app (NEW!)
- ✅ Windows desktop app (NEW!)
- 🔄 Spotify full support (currently beta)
- 📱 iOS companion app
- 🌐 Multi-language support
- 📊 Advanced analytics graphs
- 🎵 Genre-based discovery modes
- ☁️ Optional cloud backup
- 🔗 Cross-platform sync
- 🤝 Social features (share discoveries)
- 🎯 Collaborative playlists
- 🧠 ML-powered recommendations
- 🎨 Custom theme builder
- 📻 Radio mode (pure discovery stream)
- 🔗 Integration with Last.fm, Discogs
We welcome contributions! Here's how:
Open an issue with:
- Browser/Platform version
- Extension/App version
- Steps to reproduce
- Console errors (if applicable)
Have an idea? Create a feature request
- Fork the repo
- Create feature branch (
git checkout -b feature/AmazingFeature) - Commit changes (
git commit -m 'Add AmazingFeature') - Push to branch (
git push origin feature/AmazingFeature) - Open Pull Request
Documentation improvements are always welcome!
MIT License - feel free to use, modify, and distribute!
See LICENSE file for details.
- Chart.js - Beautiful statistics graphs
- YouTube Music - Platform for music discovery
- Chrome Extensions API - Powerful extension framework
- You! - For caring about music discovery 🎵
|
Discussions Ask questions & share tips |
Issues Report bugs & request features |
Star on GitHub Show your support! |
Contact Via GitHub Issues |
Because life's too short for boring repeats.
⬇️ Download Now • 📖 Read Docs • ⭐ Star on GitHub
Made with 💜 by Sangam Rai
For music lovers, by music lovers.
Version 1.0.0 • Last updated: January 2026



