個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A pure browser-based Discogs companion for DJs and collectors. Sync your collection and want list, link playable YouTube videos, build setlists, and dig crates with BPM/key filtering and harmonic mixing suggestions.
No backend. No install. No build step. All data stays in your browser.檢視完整 README ↗A pure browser-based Discogs companion for DJs and collectors. Sync your collection and want list, link playable YouTube videos, build setlists, and dig crates with BPM/key filtering and harmonic mixing suggestions.
No backend. No install. No build step. All data stays in your browser.
Clone the repo and serve the files with any static server:
git clone https://github.com/haimw/discogs-tool.git
cd discogs-tool
python3 -m http.server 5000
Then open http://localhost:5000.
No build step or dependencies required.
How it works:
0 ("All") catches any unfiled releases.What gets stored per release:
| Field | Description |
|---|---|
| Artist / Title / Year | Core release info |
| Format | Vinyl, CD, Cassette, etc. |
| Genres / Styles | From Discogs metadata |
| Country | Country of pressing |
| Folder | Which collection folder it belongs to |
| Quantity | How many copies you own |
| Cover / Thumb | Cover art images |
| Date Added | When added to your collection |
| Videos | YouTube links from the release page |
| Tracklist | Physical side-by-side track listing (A1, B1, etc.) |
The Your Collection view shows your releases as a card grid.
Filters:
| Filter | How to use |
|---|---|
| Search | Type artist or title in the search box |
| Genre | Click a genre pill to filter |
| Folder | Click a folder pill to filter |
| Country | Click a country pill to filter |
Sort options: Artist, Title, Year, Date Added
Pagination: 48 releases per page
Each card shows:
Click any card to open the release detail page:
A flat list of every video across your entire collection — ideal for crate digging and DJ prep.
Filters:
| Filter | How to use |
|---|---|
| Search | Type title, artist, or release name |
| BPM Range | Enter min and/or max BPM |
| Key | Pick a Camelot key from the dropdown (1A–12B) |
| Min Rating | Click a star pill (1★–5★) |
| Tag | Click a tag pill (e.g. "peak", "floor filler") |
Sort options: Artist, Title, Release, Year, BPM, Rating
Each track row shows:
Sync and browse your Discogs want list with marketplace monitoring.
Sync: Click Sync Want List to download all your wants into the browser.
Filters:
| Filter | How to use |
|---|---|
| Search | Type artist or title |
| Genre | Click a genre chip |
| Format | Click a format pill |
| Decade | Click a decade pill (1960s, 1970s, etc.) |
| Country | Click a country pill |
| Availability | Filter to items currently for sale |
Sort options: Artist, Title, Year, Date Added, Rating
Actions:
| Action | Description |
|---|---|
| Play | Play linked YouTube video if available |
| Shuffle | Shuffle through playable want list items |
| Check Availability | Pull marketplace stats for all want list items |
| Export CSV | Download full want list as a CSV file |
| Dig Deeper | Analyse which genres, styles, and artists are in your want list but not yet in your collection — click any pill to filter |
An embedded YouTube player drives all playback. A Now Playing bar stays fixed at the bottom of the screen.
Now Playing bar contains:
Playback modes:
| Mode | How to trigger |
|---|---|
| Single track | Click any track row or video entry |
| Play all from release | "Play All" button on a release detail page |
| Play from collection | "Play Collection" on the collection view |
| Shuffle | "Shuffle" button — enter how many tracks (1–9999) |
| Setlist | "Play All" or click a specific track in a setlist |
Queue panel:
Automatic volume crossfade between tracks for smooth DJ-style transitions.
How to enable:
How it works:
[fade duration + 2] seconds from its end, the crossfade starts.Settings are saved to IndexedDB and persist across sessions.
Get a ranked list of compatible next tracks based on key, BPM, and genre.
How to open: Click the Suggestions button in the Now Playing bar.
How scoring works:
| Factor | Points |
|---|---|
| Exact Camelot key match | 100 |
| Adjacent key on Camelot wheel (±1 or relative major/minor) | 70 |
| Genre match | 40 |
| BPM within 6% delta | Up to 100, scaled by closeness |
| Track rating bonus | +2 per star |
Camelot wheel compatibility: Same key, one step clockwise, one step counter-clockwise, or the relative major/minor (A↔B same number).
Panel shows: Top 20 suggestions with score, BPM, key, artist, title. For each suggestion:
Tip: Add BPM and Key to your tracks via the Metadata Editor for best results. Without them, suggestions fall back to genre matching only.
Add DJ metadata to any track directly in the app.
How to open: Click the pencil (✎) icon on any track row in the Tracks view, Release detail, or Setlist detail.
Editable fields:
| Field | Type | Notes |
|---|---|---|
| BPM | Number | 40–220 |
| Key | Dropdown | Camelot 1A–12B |
| Rating | Stars | 0–5 stars |
| Energy | Number | 1–10 scale |
| Shelf Location | Text | Physical storage reference (e.g. "A3") |
| Tags | Text | Comma-separated (e.g. "peak, floor filler, closer") |
| Notes | Textarea | Freeform notes |
| Verified | Checkbox | Mark the YouTube link as confirmed correct |
Click Save to persist, or Cancel to discard. Data is stored per track (indexed by release ID + YouTube ID) and syncs immediately to filters and suggestions.
Build and manage DJ setlists (playlists) from your collection.
How to create a setlist:
Adding tracks to a setlist:
Setlist detail page:
| Action | How |
|---|---|
| Rename | Click the name field and type |
| Reorder tracks | Drag the ⋮ handle up or down |
| Remove a track | Click the × button |
| Add notes | Type in the Notes textarea (venue, vibes, cues, etc.) |
| Play all | Click Play All |
| Play from a track | Click that track row |
Export options:
| Format | Use case |
|---|---|
| M3U | Import into media players |
| TXT | Plain text track listing |
| CSV | Spreadsheet with BPM, Key, and metadata |
A canvas-based visualizer renders in the Now Playing bar while music plays.
Switch modes using the buttons above the canvas:
| Mode | Description |
|---|---|
| Bars | 56 vertical bars in a cyan-to-magenta spectrum with a mirror reflection |
| Wave | 3 overlapping animated sine waves |
| Particles | 180 star-field particles with fade trails |
| Rings | 6 concentric rings pulsing outward from centre |
| Aurora | 5 wavy bands mimicking the northern lights |
| Helix | Twin DNA strands with connecting rungs |
| Lissajous | Mathematical Lissajous curves with glow |
| Tunnel | Receding neon rectangles forming a tunnel |
Visualizer starts and stops automatically with playback.
Monitor Discogs marketplace listings for items on your want list.
How to use:
What gets tracked per item:
Notifications:
New listings trigger a notification only when a previously-unavailable item becomes available (0 → 1+ copies).
Manage a physical record store or selling inventory directly from your collection.
Serialization:
Inventory table columns: Serial, Artist, Title, Year, Country, Style, Format, Min Price, Status, Batch, Actions
Actions per item:
| Action | Description |
|---|---|
| Mark as Sold | Records sale date and price received |
| Assign to Batch | Move item into a named batch |
| Refresh Price | Pull current marketplace price from Discogs |
| Open on Discogs | Jump to the listing on Discogs.com |
Batch management:
Filters: Free-text search (serial, artist, title), Status (All / Active / Sold), Batch
Export and import your complete app data to protect against browser data loss or to migrate between browsers/devices.
Export (backup):
vinyl-backup-YYYY-MM-DD.json).What the backup includes:
Restore:
Important: All data is stored in your browser's IndexedDB. Clearing browser site data will delete everything. Regular backups are strongly recommended.
All data is stored locally in IndexedDB — nothing is sent to any custom backend.
| Store | Contents |
|---|---|
config | Discogs credentials and app settings |
releases | Full release metadata |
videos | YouTube video links per release |
folders | Collection folder structure |
tracklist | Physical track listings (Discogs side/position data) |
track_meta | Editable DJ metadata (BPM, Key, Rating, Energy, Shelf, Tags, Notes) |
wants | Want list items |
marketplace_stats | Price and availability data |
setlists | Setlists with tracks, order, and notes |
store_items | Serialised inventory records |
store_batches | Inventory batch groupings |
notifications | Marketplace alerts |
Session state (currently playing track) is stored in sessionStorage so playback context survives page refreshes.
discogs-tool/
├── index.html — SPA shell, navigation, now-playing UI
├── app.js — App entry point and initialisation
├── style.css — Visual theme and layout
└── src/
├── api.js — Discogs API client with rate-limit handling
├── db.js — IndexedDB wrapper
├── config.js — App configuration and constants
├── init.js — Startup and credential checks
├── router.js — Client-side routing
├── player.js — YouTube IFrame player wrapper
├── player_state.js — Playback state (queue, current track)
├── crossfade.js — Crossfade engine (dual player)
├── harmonic.js — Harmonic mixing and suggestion scoring
├── visualizer.js — Canvas visualizer (8 modes)
├── search.js — Search and filter utilities
├── setlists.js — Setlist CRUD and playback
├── marketplace.js — Marketplace polling and notifications
├── backup.js — Export and restore logic
├── meta.js — Track metadata read/write
├── meta_editor.js — Inline metadata editor UI
├── queue.js — Queue management
├── utils.js — Shared helpers
├── store_serial.js — Store serialisation logic
└── views/
├── setup.js — Credentials setup screen
├── collection.js — Collection grid and release detail
├── tracks.js — All Tracks view
├── wantlist.js — Want List view
├── wantlist_sync.js — Want list sync logic
├── release.js — Release detail page
└── store.js — Store & inventory view
| Layer | Technology |
|---|---|
| Language | Vanilla JavaScript (ES modules) |
| Storage | IndexedDB (via custom wrapper) |
| Music data | Discogs REST API |
| Video playback | YouTube IFrame API |
| Hosting | GitHub Pages (static) |
No frameworks, no bundler, no server.
MIT