Author SHA1 Message Date
ztimson b1e88159b0 Update src/server.mjs
Code review / review (pull_request) Successful in 36s
2026-09-14 16:27:42 -04:00
ztimson 8261c671af Merge pull request 'Update install.sh' (#7) from ztimson-patch-7 into master
Reviewed-on: #7
2026-09-14 16:25:14 -04:00
ztimson 22985b6230 Update install.sh
Code review / review (pull_request) Successful in 31s
2026-09-14 16:25:08 -04:00
ztimson 9b5bf5d2fb Merge pull request 'Update src/server.mjs' (#6) from ztimson-patch-6 into master
Reviewed-on: #6
2026-09-14 16:11:01 -04:00
ztimson daaa53790a Update src/server.mjs
Code review / review (pull_request) Successful in 32s
2026-09-14 16:10:55 -04:00
ztimson a2afcfa7bd Merge pull request 'ztimson-patch-5' (#5) from ztimson-patch-5 into master
Reviewed-on: #5
2026-09-14 16:06:33 -04:00
ztimson b9ebb149ef Update package.json
Code review / review (pull_request) Successful in 1m21s
2026-09-14 16:06:24 -04:00
ztimson cfcbccf152 Update install.sh 2026-09-14 16:06:11 -04:00
ztimson 9c8c108da0 Merge pull request 'Update README.md' (#4) from ztimson-patch-4 into master
Reviewed-on: #4
2026-09-12 22:46:03 -04:00
ztimson d54d318166 Update README.md
Code review / review (pull_request) Successful in 32s
2026-09-12 22:45:56 -04:00
ztimson 4e70c78a7a Merge pull request 'Add install.sh' (#3) from ztimson-patch-3 into master
Reviewed-on: #3
2026-09-12 22:45:13 -04:00
ztimson fd6e2b07dc Add install.sh
Code review / review (pull_request) Successful in 29s
2026-09-12 22:45:04 -04:00
ztimson 240119ee5f Merge pull request 'ztimson-patch-2' (#2) from ztimson-patch-2 into master
Reviewed-on: #2
2026-09-12 22:41:03 -04:00
4 changed files with 40 additions and 30 deletions
+1 -3
View File
@@ -53,7 +53,7 @@ Homecast is a homebrew, Chromecast-style streaming appliance built around a Rasp
The goal is to provide a simple, self-hosted casting and media experience while retaining complete control over the underlying hardware and software. The goal is to provide a simple, self-hosted casting and media experience while retaining complete control over the underlying hardware and software.
Features include: Features include:
- Installs ontop of any Rasbian + Wayland OS - Installs on-top of any Raspberry Pi OS + Wayland
- Allows you to fully customize and use as your own media center - Allows you to fully customize and use as your own media center
- Remote desktop into the pi via the browser on any device - Remote desktop into the pi via the browser on any device
- Mirrors to the TV - Mirrors to the TV
@@ -70,8 +70,6 @@ Features include:
[![CSS](https://img.shields.io/badge/CSS-1572B6?style=for-the-badge\&logo=css3)](https://www.w3.org/Style/CSS/Overview.en.html) [![CSS](https://img.shields.io/badge/CSS-1572B6?style=for-the-badge\&logo=css3)](https://www.w3.org/Style/CSS/Overview.en.html)
[![Raspberry Pi](https://img.shields.io/badge/Raspberry%20Pi-A22846?style=for-the-badge\&logo=raspberrypi\&logoColor=white)](https://www.raspberrypi.com/) [![Raspberry Pi](https://img.shields.io/badge/Raspberry%20Pi-A22846?style=for-the-badge\&logo=raspberrypi\&logoColor=white)](https://www.raspberrypi.com/)
[![Wayland](https://img.shields.io/badge/Wayland-FFBC00?style=for-the-badge\&logo=wayland\&logoColor=black)](https://wayland.freedesktop.org/) [![Wayland](https://img.shields.io/badge/Wayland-FFBC00?style=for-the-badge\&logo=wayland\&logoColor=black)](https://wayland.freedesktop.org/)
[![WebSocket](https://img.shields.io/badge/WebSocket-000000?style=for-the-badge)](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket)
[![noVNC](https://img.shields.io/badge/noVNC-000000?style=for-the-badge)](https://novnc.com/)
## Setup ## Setup
+35
View File
@@ -0,0 +1,35 @@
#!/bin/bash
set -e
# Fallback AP
curl -sL https://git.zakscode.com/ztimson/fallback-ap/raw/branch/master/install.sh | sudo bash
# VNC
sudo raspi-config nonint do_vnc 0
cat <<EOF | sudo tee /etc/wayvnc/config
use_relative_paths=true
address=127.0.0.1
enable_auth=false
enable_pam=false
relax_encryption=true
EOF
# Node
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.7/install.sh | bash
source ~/.bashrc
nvm install stable && nvm use stable
# Install Homecast
mkdir /app && cd /app
git clone https://git.zakscode.com/ztimson/homecast.git .
npm i
mkdir -p certs
openssl req -x509 -newkey rsa:2048 \
-keyout certs/key.pem \
-out certs/cert.pem \
-days 3650 \
-nodes \
-subj "/CN=homecast"
# TODO: Create service
+1 -1
View File
@@ -4,7 +4,7 @@
"description": "The Homebrew Chromecast", "description": "The Homebrew Chromecast",
"main": "src/server.mjs", "main": "src/server.mjs",
"scripts": { "scripts": {
"start": "node server.mjs" "start": "node src/server.mjs"
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",
+3 -26
View File
@@ -8,7 +8,7 @@ import {fileURLToPath} from 'node:url';
import {WebSocketServer} from 'ws'; import {WebSocketServer} from 'ws';
const __dirname = path.dirname(fileURLToPath(import.meta.url)); const __dirname = path.dirname(fileURLToPath(import.meta.url));
const NOVNC = path.join(__dirname, 'node_modules/@novnc/novnc'); const NOVNC = path.join(__dirname, '../node_modules/@novnc/novnc');
const PORT = process.env['PORT'] || 3000; const PORT = process.env['PORT'] || 3000;
const VNC_HOST = '127.0.0.1'; const VNC_HOST = '127.0.0.1';
const VNC_PORT = 5900; const VNC_PORT = 5900;
@@ -67,36 +67,13 @@ wss.on('connection', ws => {
const socket = net.createConnection(VNC_PORT, VNC_HOST); const socket = net.createConnection(VNC_PORT, VNC_HOST);
socket.on('connect', () => {
console.log(`Connected to VNC ${VNC_HOST}:${VNC_PORT}`);
});
socket.on('data', data => { socket.on('data', data => {
console.log(`VNC -> browser: ${data.length} bytes`); if (ws.readyState === ws.OPEN) ws.send(data, {binary: true});
if (data.length <= 64) {
console.log(` hex: ${data.toString('hex')}`);
console.log(` text: ${JSON.stringify(data.toString())}`);
}
if (ws.readyState === ws.OPEN) {
ws.send(data, {binary: true});
}
}); });
ws.on('message', (data, isBinary) => { ws.on('message', (data, isBinary) => {
const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data); const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
if (socket.writable) socket.write(buffer);
console.log(`Browser -> VNC: ${buffer.length} bytes (${isBinary ? 'binary' : 'text'})`);
if (buffer.length <= 64) {
console.log(` hex: ${buffer.toString('hex')}`);
console.log(` text: ${JSON.stringify(buffer.toString())}`);
}
if (socket.writable) {
socket.write(buffer);
}
}); });
ws.on('error', error => { ws.on('error', error => {