2025-09-04 19:42:45 -05:00
2025-09-02 09:00:07 -05:00
2025-09-04 19:42:02 -05:00
2025-09-04 19:41:21 -05:00
2025-08-25 17:47:38 -05:00
2025-09-04 19:42:02 -05:00
2025-08-20 16:19:29 -05:00
2025-09-04 19:40:36 -05:00
2025-08-20 16:17:28 -05:00
2025-08-19 17:43:12 -05:00
2025-09-04 19:42:02 -05:00
2025-09-04 19:42:02 -05:00
2025-09-04 19:42:45 -05:00

RadChat

A lightweight, self-hostable voice and text chat application using WebRTC for media and WebSockets for signaling. RadChat runs as a single binary with a static frontend.

  • Backend: Go (Gorilla WebSocket), simple HTTP server with middleware
  • Frontend: Single-page app (vanilla JS, HTML, CSS)
  • Signaling: JSON messages over WebSocket
  • Media: WebRTC peer connections with configurable STUN/TURN

Features

  • Join a room and chat with others via audio and text
  • Username validation and collision checks
  • Emoji picker and message reactions (planned)
  • File upload/download (ephemeral)
  • Optional gzip and no-cache middlewares
  • Configurable origin policy for WebSocket upgrades

Architecture Overview

  • server/ package: Hub and Client primitives, websocket upgrader, HTTP middleware
  • package main: wires routes, creates a Hub, starts the run loop, and serves static assets
  • static/: SPA frontend (index.html, app.js, styles.css, SVG and sounds) handling UI, WebRTC, and signaling

Data flow (high level):

  1. Browser loads SPA from / (static/)
  2. Client connects to /ws for signaling
  3. Hub tracks Clients and broadcasts system/user messages
  4. WebRTC offers/answers/ICE are relayed via WS signaling
  5. Optional file uploads via /files and served via /files/{id}

Directory Layout

  • main.go: entrypoint; flags and route wiring
  • hub.go: HTTP handlers and hub run loop integration
  • client.go: read/write pumps for websocket client
  • message.go: message envelope used for signaling and system messages
  • utils.go: file ops, ids, username validation, URL scheme helpers
  • server/: Hub/Client structs, upgrader, middleware
  • static/: frontend resources

Getting Started

Prerequisites: Go 1.20+ and a modern browser.

Build and run:

go build -o radchat
./radchat -ip 0.0.0.0 -port 8080 -gzip-enable

Open http://localhost:8080 in your browser.

Common flags:

  • -ip: bind address (default localhost)
  • -port: port (default 8080)
  • -bufsize: channel buffer size for hub broadcast/register/unregister
  • -gzip-enable: enable gzip middleware
  • -cache-disable: disable caching headers
  • -files: directory for uploads (default ./files)
  • -files-timeout: seconds until an upload expires (default 3600)
  • -origin: allowed Origin host for WS upgrades; leave empty to allow any

Configuration (STUN/TURN)

Edit static/app.js CONFIG.CONN.RTC_CONFIGURATION to set iceServers. By default, public Google STUN is enabled. For restrictive networks, configure your TURN server (e.g., Coturn) and optionally set iceTransportPolicy to "relay".

Development

  • Backend hot reload: run using go run .
  • Frontend: static files are served as-is; just refresh the browser
  • Lint/docs: prefer GoDoc-style comments for exported symbols (see server/doc.go)

Security Notes

  • Set -origin in production to your domain to enforce Origin checks for WS upgrades
  • Consider terminating TLS in front (reverse proxy) so GetScheme returns https
  • Uploaded files are sanitized by name and stored under ./files; validate trust boundaries

Roadmap / Tasks

FIX/ADJUSTMENT NEEDED
  • STYLE: MOBILE: Users list needs a rework
  • APP: Emojis should have category picker buttons
  • APP: File picker: Add an uploading spinner icon before the message is posted, currently it has a chat alert
  • APP: File picker: Drag and drop
FEATURE ADDITIONS
  • APP/STYLE: User settings should include a microphone selection, audio selection, and a test functionality for both
  • APP/STYLE: Emoji message reactions
  • APP/STYLE: Add webcam capability
  • APP/STYLE: Add screen sharing
IN PROGRESS FEATURE ADDITIONS
  • APP: Self-hosted STUN/TURN
BUG TRACKER [ Latest: #38 ]
  • [#38] APP: STUN/TURN issues with browser ICE rejection of offer. Need TURN to function properly?
    • Manifests in an inability to receive/send audio from a user.
    • Need a way of reporting which STUN/TURN was agreed on.
    • Set up my own STUN/TURN with Coturn.
FUTURE
  • APP: Add pagination and message history
  • APP: See who is in the room before you join
  • META: Turn the app into a docker container

License

MIT (or your chosen license).

Description
No description provided
Readme 21 MiB
Languages
JavaScript 60.5%
CSS 19.5%
Go 15.2%
HTML 4.4%
Shell 0.4%