Skip to content

Claude/denon keol remote app i y4 yc#13

Open
jucor wants to merge 3 commits intojtangelder:masterfrom
jucor:claude/denon-keol-remote-app-iY4YC
Open

Claude/denon keol remote app i y4 yc#13
jucor wants to merge 3 commits intojtangelder:masterfrom
jucor:claude/denon-keol-remote-app-iY4YC

Conversation

@jucor
Copy link

@jucor jucor commented Mar 7, 2026

Hi!
Thanks for the great work. I've asked an LLM (Opus 4.6) to code a web interface and add support for my old CEOL N7 functionalities. I thought I'd open a pull request here just in case you were still interested all those years later. No worries if you're not -- and in any case, thanks for that super helpful repo!

claude and others added 3 commits March 7, 2026 11:51
Transform the CLI-only Denon remote into a full web application:

- Express + WebSocket backend with persistent telnet connection
- Mobile-first responsive single-page frontend
- Real-time status updates (power, volume, input, surround mode)
- Input sources: Bluetooth, CD, Tuner, USB, Network, AUX, Spotify, etc.
- Bluetooth input selection and pairing mode support
- Playback controls (play/pause/stop/skip/repeat/shuffle)
- Volume slider + up/down + mute
- Tone controls (bass/treble)
- Sound modes (stereo, direct, music, movie, etc.)
- Sleep timer
- Raw command input for advanced use
- Docker + docker-compose for easy deployment
- Original CLI preserved via `npm run cli`

https://claude.ai/code/session_013iwz3TLcQm7Dj3f2MY12xp
- Add SSDP/UPnP discovery to find Denon receivers on the network
- Add TCP port 23 subnet scan as fallback discovery method
- Add discovery UI overlay with scan button and manual IP entry
- Auto-discover on startup when DENON_HOST is not set
- Add /api/discover and /api/connect?host= endpoints
- Allow connecting to a different host from the web UI

- Remove vorpal (abandoned, core-js@2 deprecation warnings)
- Remove colors (supply chain risk)
- Rewrite CLI using Node.js built-in readline (zero extra deps)
- Dependencies reduced from 110 packages to 70, 0 vulnerabilities

https://claude.ai/code/session_013iwz3TLcQm7Dj3f2MY12xp
…nd code quality

- Use textContent instead of innerHTML for discovery device list (XSS fix)
- URL-encode input source in setInput() to handle USB/IPOD correctly
- Validate numeric inputs in volume/sleep endpoints, return 400 for NaN
- Validate CLI volume argument and show error for non-numeric input
- Fix connectDenon race condition by removing listeners from old client
- Refactor scanSubnet to plain async function (remove Promise anti-pattern)
- Use npm ci with package-lock.json for deterministic Docker builds
- Run Node process as non-root user in Dockerfile
- Fix help command to show aliases inline instead of as separate entries
- Clarify mute command description and btpair redundancy
- Update README DENON_HOST default to reflect actual null/auto-discover
- Improve docker-compose comment about host network mode for discovery

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jtangelder
Copy link
Owner

Glad it was helpful after all these years! I see that in your PR you're basically renaming the package and removing all references to AVR-X1000. Can you make sure you dont touch these, and still leave support for those commands?

I dont have the AV receiver anymore, but would be nice to still have that support in there. Maybe we can go with an facade pattern if they are very different?

Otherwise, having this PR around is already useful for others to learn from. Thanks!

@jucor
Copy link
Author

jucor commented Mar 9, 2026

Of course, you're right ! I'm still tweaking a few things on my branch for the N7 , but I'll include back the AVR-X1000 too!
Warning: it's 100% "vibe-coded", so it is not greatly polished and is much less streamlined than the CLI you built. I wonder whether having a separate repo is worth it, keeping this repo for the human-made Telnet CLI + protocol (and adding to it the N7 protocol infos I have), and then another repo for the more bells-and-whistles-and-bugs vibe coded :) What do you think?

@jtangelder
Copy link
Owner

Yeah, that might be a better idea, to have it in a separate repo. I will happily link to yours from the documentation page of course when you send me the CL for that :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants