Queue timing for Spotify on Spicetify.
See how long is left in your queue and exactly when every upcoming track will play — a total on the "Next up" heading, a countdown or clock time on every row, and no hard-coded Spotify class names anywhere.
Installation · Settings · How It Works · Troubleshooting · All Docs
- Total remaining — the length of everything still queued, right on the "Next up" heading
- Per-track ETA — every upcoming row shows when it starts, as a countdown (
in 11:42) or a clock time (9:47 PM) - Accurate totals — durations Spotify hasn't preloaded are fetched once and cached, so the total never silently truncates
- Estimate marking — values are prefixed with
~while a duration is still unknown - Repeat aware — shows
∞when repeat-one is active - Works everywhere the queue does — the side panel and the full-page queue view
- Localised clock — 12/24-hour follows your Spotify locale, or force either
- Settings UI — a proper settings modal from Spotify Settings or the profile menu
- Zero dependencies — no CDN scripts, no
moment.js, no network calls unless duration lookup is enabled
Inspired by Theblockbuster1's QueueTime, rebuilt from scratch in TypeScript.
Full settings list: docs/settings.md
Marketplace (recommended)
- Open the Spicetify Marketplace
- Search for Queue ETA
- Click Install
No further setup needed — it works out of the box with sensible defaults.
Requires Spicetify >= 2.0.0. For manual install instructions, see docs/installation.md.
Then: queue a few tracks and open the queue. The total appears on the "Next up" heading and each row gets its own ETA. → Settings
Three ways in:
- Spotify Settings → scroll to the Queue ETA section → Open
- Profile menu (avatar, top right) → Queue ETA Settings
QueueETA.openSettings()in the console
| Setting | Default | What it does |
|---|---|---|
| Enable Queue ETA | On | Master switch for all annotations |
| Show total remaining | On | Queue length on the "Next up" heading |
| Label | Remaining |
Text after the total; empty for none |
| Include current track | On | Counts the rest of the playing track in the total |
| Display mode | Countdown | Countdown, Clock time, or Off |
| Countdown prefix | in |
Text before each countdown; empty for none |
| Clock format | Match system | Match system, 12-hour, 24-hour |
| Time style | Compact | 1:36:18 or padded 01:36:18 |
| Fetch missing durations | On | Looks up tracks Spotify hasn't preloaded |
| Mark estimates | On | Prefixes ~ when a duration is unknown |
| Debug logging | Off | Console diagnostics |
Full reference: docs/settings.md.
QueueETA.getModel() // queue durations, offsets, current remaining
QueueETA.set('etaMode', 'clock')
QueueETA.openSettings()
QueueETA.cache.clear()
QueueETA.reset()| Page | What's in it |
|---|---|
| Installation | Marketplace install, manual install, and updating |
| Settings | Every option, what it changes, and the console API |
| How It Works | Architecture, duration resolution, and the future-proofing strategy |
| Troubleshooting | Nothing showing up, wrong times, performance |
Why it keeps working across Spotify updates: Spotify ships hashed, per-build CSS class names, so anything selecting on them breaks every few releases. Queue ETA never does. It anchors on stable ARIA and structural contracts (#queue-panel, role="treegrid", role="row", aria-posinset, aria-rowcount) and renders through CSS custom properties on ::after pseudo-elements — meaning it inserts no elements into Spotify's React tree at all, so it cannot conflict with a re-render. If Spotify wipes a value, the next tick restores it. → How It Works
Join the official Discord for live support, bug reports, feature requests, and release announcements. It's the fastest way to get unstuck.
- Discord (support, updates, feedback) — https://discord.gg/fXK34DeDW5
- Report an issue — https://github.com/7xeh/QueueETA/issues
- GitHub — https://github.com/7xeh/QueueETA
Source-available under the QueueETA Source-Available License v1.0 — see LICENSE. Not OSI open source.
You may read, fork, modify, and run it for personal, non-commercial use, and open pull requests here. You may not redistribute it, publish a fork or rebrand, ship pre-built bundles of it, or use it commercially without written permission. Contact 7xeh.dev for licensing.