Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@

All notable changes to this project are documented here.

## [0.10.0] - 2026-04-18

### Added
- Dashboard settings now include a RockSniffer addon download and setup flow, making it possible to keep the current song in sync automatically while you play.

### Changed
- The RockSniffer addon setup is easier to follow, with clearer local launch steps, version-aware downloads, and a safer queue handoff when a matching song starts.

### Fixed
- Search stays more reliable during broader filtered lookups.

## [0.9.0] - 2026-04-16

### Added
Expand Down
27 changes: 17 additions & 10 deletions docs/local-development.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ For this repo, treat `http://localhost:9000` as the default existing dev app. Be
## Day-To-Day Commands

- `npm run dev`
- `npm run tunnel`
- `npm run db:migrate`
- `npm run check:prepush`
- `npm run check:ship`
Expand Down Expand Up @@ -118,25 +119,31 @@ Use that tunnel first for sign-in and other auth-sensitive browser checks.

EventSub and Twitch panel hosted testing also work better with a public HTTPS URL.

Cloudflare Tunnel flow:
Start the existing tunnel with:

```bash
cloudflared login
cloudflared tunnel create request-bot-dev
cloudflared tunnel route dns request-bot-dev dev.example.com
cloudflared tunnel run <your-tunnel-id>
npm run tunnel
```

That script points `https://dev.itsaunix.systems` at `http://localhost:9000` using the repo-local Cloudflare tunnel defaults and the credentials file under your local `.cloudflared` folder.

Override the defaults with:

- `REQUEST_BOT_TUNNEL_ID`
- `REQUEST_BOT_TUNNEL_HOST`
- `REQUEST_BOT_TUNNEL_URL`
- `REQUEST_BOT_TUNNEL_CREDENTIALS_FILE`

If you need to recreate the tunnel yourself, then set:

- `APP_URL=https://dev.example.com`
- `VITE_ALLOWED_HOSTS=dev.example.com` if Vite blocks the hostname
- `VITE_TWITCH_EXTENSION_API_BASE_URL=https://dev.example.com` for the standalone panel build
- `APP_URL=https://dev.itsaunix.systems`
- `VITE_ALLOWED_HOSTS=dev.itsaunix.systems` if Vite blocks the hostname
- `VITE_TWITCH_EXTENSION_API_BASE_URL=https://dev.itsaunix.systems` for the standalone panel build

Also register these Twitch redirect URIs:

- `https://dev.example.com/auth/twitch/callback`
- `https://dev.example.com/auth/twitch/bot/callback`
- `https://dev.itsaunix.systems/auth/twitch/callback`
- `https://dev.itsaunix.systems/auth/twitch/bot/callback`

`ngrok http 9000` is the simpler alternative when you do not need a stable hostname.

Expand Down
2 changes: 2 additions & 0 deletions drizzle/0044_rocksniffer_relay_token.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE `channel_settings`
ADD COLUMN `rocksniffer_relay_token` text DEFAULT '' NOT NULL;
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "request-bot",
"private": true,
"type": "module",
"version": "0.9.0",
"version": "0.10.0",
"engines": {
"node": ">=22"
},
Expand All @@ -17,6 +17,7 @@
"pretypecheck": "npm run routes:generate && npm run db:sync-latest-migration",
"predeploy": "npm run db:sync-latest-migration",
"dev": "vite dev --port 9000",
"tunnel": "node scripts/tunnel.mjs",
"build": "vite build",
"build:extension:panel": "vite build --config vite.extension.config.ts",
"build:extension:package": "npm run build:extension:panel && node scripts/package-extension-panel.mjs",
Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
19 changes: 19 additions & 0 deletions public/rocksniffer-addon/rocklist_live_connector/README.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
RockList.Live Connector for RockSniffer

What this addon does
- Watches RockSniffer for song starts.
- Sends the current song to RockList.Live.
- Asks RockList.Live to set the matching queued song as current.

How to install it
1. Copy the rocklist_live_connector folder into RockSniffer's addons folder.
2. Start RockSniffer.
3. Open this page in your browser:
http://127.0.0.1:9938/addons/rocklist_live_connector/rocklist_live_connector.html
4. Paste the relay URL from RockList.Live and save it.
5. Keep the page open in a browser tab or OBS browser source while you play.

What to expect
- The first release only sets the current song.
- It does not automatically mark songs as played.
- If more than one queued song matches, RockList.Live leaves the queue unchanged.
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#0c1219" />
<title>RockList.Live Connector</title>
<link rel="stylesheet" type="text/css" href="style.css" />
<script src="../config.js"></script>
<script src="../config-ui.js"></script>
<script src="../_deps/jquery-3.2.1.js"></script>
<script src="../_deps/sniffer-poller.js"></script>
<script src="../_deps/sniffer-storage.js"></script>
<script src="script.js"></script>
</head>
<body>
<div class="shell">
<div class="shell__stack">
<header class="hero panel">
<p class="eyebrow">RockList.Live</p>
<h1>RockSniffer sync</h1>
<p class="hero-copy">
Leave this page open while you play. When a song starts in
Rocksmith and matches a song on your playlist, RockList.Live marks
it as playing now.
</p>
</header>

<main class="layout">
<section class="panel">
<div class="panel-heading">
<h2>Status</h2>
</div>
<div class="status-grid">
<article class="status-card">
<p class="eyebrow">RockSniffer</p>
<p class="status-value" id="rocksniffer-status">Waiting for data</p>
<p class="status-detail" id="rocksniffer-detail">
Waiting for RockSniffer.
</p>
</article>
<article class="status-card">
<p class="eyebrow">Queue sync</p>
<p class="status-value" id="sync-status">Waiting</p>
<p class="status-detail" id="sync-detail">
Waiting for the next song.
</p>
</article>
</div>
</section>

<section class="panel">
<div class="panel-heading">
<h2>Relay URL</h2>
</div>
<form id="relay-form" class="form-grid">
<label class="field-label" for="relay-url">Relay URL</label>
<input
id="relay-url"
name="relayUrl"
type="url"
inputmode="url"
placeholder="https://..."
autocomplete="off"
spellcheck="false"
/>
<div class="button-row">
<button type="submit" id="save-relay">Save relay URL</button>
<button type="button" class="secondary" id="clear-relay">
Clear saved URL
</button>
</div>
<p class="field-note" id="relay-feedback"></p>
<div class="addon-release">
<p class="field-label">Addon version</p>
<p class="addon-release__value" id="addon-release-value">
2026-04-17-1836
</p>
<p class="field-note" id="addon-release-detail">
Save your relay URL to check for updates.
</p>
<div class="button-row addon-release__actions is-hidden" id="addon-release-actions">
<a
class="button-link secondary"
id="addon-release-download"
href="#"
target="_blank"
rel="noreferrer noopener"
>
Download latest
</a>
</div>
</div>
</form>
</section>

<section class="panel">
<div class="panel-heading">
<h2>Last song</h2>
</div>
<div class="song-card">
<p class="song-title" id="last-song-title">No song seen yet</p>
<p class="song-meta" id="last-song-artist">Waiting for RockSniffer</p>
<p class="song-detail" id="last-song-arrangement"></p>
<p class="song-detail" id="last-song-state"></p>
</div>
</section>
</main>
</div>
</div>
</body>
</html>
Loading
Loading