Add Skald hard fork plan
This commit is contained in:
@@ -0,0 +1,238 @@
|
||||
# Skald Hard Fork - Master TODO
|
||||
#
|
||||
# Goal:
|
||||
# Turn this Galene-derived repository into Skald: a new, audio-only,
|
||||
# hall-based conferencing server. This is a hard fork, so compatibility with
|
||||
# Galene names, URLs, video behavior, and recording format is intentionally
|
||||
# not the default.
|
||||
#
|
||||
# Legend:
|
||||
# - item = needs doing
|
||||
# + item = implemented, needs testing
|
||||
# X item = tested and done
|
||||
#
|
||||
# Non-negotiable target state:
|
||||
# - Project name is Skald everywhere.
|
||||
# - Halls replace groups/rooms everywhere user-facing and in internal code
|
||||
# where practical.
|
||||
# - Video is removed, not hidden.
|
||||
# - Incoming video is rejected.
|
||||
# - The browser UI is audio-only and accessible.
|
||||
# - Recordings are single mixed Ogg Opus audio files.
|
||||
# - No legacy Galene compatibility paths or fallback shims unless explicitly
|
||||
# added later by choice.
|
||||
|
||||
# ============================================================================
|
||||
# PHASE 0: BASELINE INVENTORY AND GUARDRAILS
|
||||
# ============================================================================
|
||||
|
||||
- Record the current upstream/fork point in CHANGES or a new fork note
|
||||
- Capture current baseline: `go test ./...` result before behavior changes
|
||||
- Capture current baseline: `go build ./...` result before behavior changes
|
||||
- Inventory generated/static assets, including static/example and third-party assets
|
||||
- Inventory all public URLs: /group/, /public-groups.json, /recordings/, /galene-api/
|
||||
- Inventory all config/data paths: groups/, data/, recordings/, galenectl.json
|
||||
- Inventory all Galene binary/service names in docs, scripts, examples, and tests
|
||||
- Decide whether existing stored data will be migrated manually or treated as incompatible
|
||||
- Keep the old LICENSE intact and preserve required attribution
|
||||
|
||||
# ============================================================================
|
||||
# PHASE 1: FOUNDATION AND TOTAL REBRANDING
|
||||
# ============================================================================
|
||||
|
||||
- Rename Go module: github.com/jech/galene -> git.stormux.org/storm/skald
|
||||
- Update all internal Go import paths across source and tests
|
||||
- Rename galene.go -> skald.go and keep the main package entrypoint working
|
||||
- Rename galenectl/ directory and binary to skaldctl/
|
||||
- Rename static/galene.css -> static/skald.css
|
||||
- Rename static/galene.js -> static/skald.js
|
||||
- Rename static/galene.html -> static/skald.html
|
||||
- Update webserver static serving to load skald.html and renamed assets
|
||||
- Update all HTML, JS, CSS, docs, tests, and examples that reference renamed assets
|
||||
- Rename galene-*.md docs to skald-*.md
|
||||
- Replace "Galene", "Galène", and "galene" with "Skald" and "skald" where they refer to this project
|
||||
- Keep historical upstream references only where they are attribution, changelog history, or license context
|
||||
- Rename default binary, service, and install examples from galene to skald
|
||||
- Rename galenectl config file to skaldctl.json
|
||||
- Update CHANGES with Skald fork point and first Skald development section
|
||||
- Verify `go test ./...` compiles after the pure project rename pass
|
||||
- Search for remaining Galene names and classify each survivor as attribution/history or a bug
|
||||
|
||||
# ============================================================================
|
||||
# PHASE 2: HALL TERMINOLOGY AND DATA MODEL
|
||||
# ============================================================================
|
||||
|
||||
- Rename Go package group/ to hall/ if the package-wide rename stays tractable
|
||||
- Rename package declarations, types, variables, funcs, tests, and comments from group to hall
|
||||
- Rename Group type to Hall and update all compile errors intentionally
|
||||
- Rename group description files/concepts to hall description files/concepts
|
||||
- Rename default directory flag: -groups -> -halls
|
||||
- Rename default data directory: groups/ -> halls/
|
||||
- Rename public listing concept from public groups to public halls
|
||||
- Rename subgroups to subhalls everywhere, including JSON fields and commands
|
||||
- Rename auto-subgroups -> auto-subhalls
|
||||
- Rename allow-subgroups -> allow-subhalls
|
||||
- Rename include-subgroups -> include-subhalls
|
||||
- Rename group action names to hall action names where exposed to clients
|
||||
- Rename chat/help commands such as /subgroups to /subhalls
|
||||
- Update tests to use generic placeholder names, not real usernames
|
||||
- Verify no user-facing "group", "groups", "room", or "rooms" remain except attribution/history
|
||||
- Verify old group JSON/config paths are not silently accepted unless explicitly reintroduced later
|
||||
|
||||
# ============================================================================
|
||||
# PHASE 3: URLS, API, PROTOCOL, AND CONTROL TOOL
|
||||
# ============================================================================
|
||||
|
||||
- Rename browser hall URLs from /group/name/ to /hall/name/
|
||||
- Rename /public-groups.json to /public-halls.json
|
||||
- Rename /galene-api/ to /skald-api/
|
||||
- Rename API collection paths from .groups to .halls
|
||||
- Rename protocol join fields from group to hall
|
||||
- Rename protocol callbacks/events from joined group semantics to joined hall semantics
|
||||
- Update static/protocol.js public API: ServerConnection.join and related callbacks
|
||||
- Update static/management.js to use /skald-api/v0/.halls/
|
||||
- Update static/mainpage.js to open /hall/ URLs and fetch /public-halls.json
|
||||
- Update stats endpoint naming only if it exposes Galene/group terminology
|
||||
- Update skaldctl command names: create-hall, update-hall, delete-hall, list-halls
|
||||
- Update skaldctl flags: -hall, -include-subhalls, -auto-subhalls, etc.
|
||||
- Update skaldctl help text and error messages
|
||||
- Update API and webserver tests for /hall/ and /skald-api/
|
||||
- Verify old /group/, /public-groups.json, /galene-api/, and .groups paths fail clearly
|
||||
- Verify protocol backward compatibility with Galene is intentionally broken
|
||||
|
||||
# ============================================================================
|
||||
# PHASE 4: BACKEND - STRIP VIDEO COMPLETELY
|
||||
# ============================================================================
|
||||
|
||||
- Remove video codec constants and helpers from codecs/ package
|
||||
- Remove or rewrite video-only codec tests
|
||||
- Strip video/vp8, video/vp9, video/av1, and video/h264 from SDP negotiation
|
||||
- Ensure audio/opus remains negotiated correctly
|
||||
- Reject incoming video m-lines/transceivers at WebRTC peer connection setup
|
||||
- Reject or close incoming video tracks if a browser still sends them
|
||||
- Ensure rejection is explicit in logs without crashing the hall
|
||||
- Remove outgoing video track routing from rtpconn/ and hall/
|
||||
- Remove simulcast and SVC handling
|
||||
- Remove video bandwidth estimation and video throughput selection
|
||||
- Remove video-specific RTCP behavior such as PLI/FIR/keyframe requests
|
||||
- Remove screenshare backend support
|
||||
- Remove presentation/file-as-video support if it depends on video tracks
|
||||
- Remove background blur support and background-blur-worker.js from the served app
|
||||
- Remove video fields from hall descriptions, stats, API responses, and protocol docs
|
||||
- Check WHIP/WHEP-style endpoints for video assumptions and either make audio-only or remove
|
||||
- Ensure browsers that request audio+video get a working audio-only session or a clear video rejection
|
||||
- Verify two browser clients can join one hall and exchange audio only
|
||||
- Verify a client attempting camera or screenshare cannot publish video
|
||||
|
||||
# ============================================================================
|
||||
# PHASE 5: FRONTEND - AUDIO-ONLY USER EXPERIENCE
|
||||
# ============================================================================
|
||||
|
||||
- Remove all <video> elements and video containers from skald.html
|
||||
- Remove camera buttons and presentation buttons tied to camera/video behavior
|
||||
- Remove screenshare button and related menu commands
|
||||
- Remove video quality, resolution, throughput, simulcast, and collapse controls
|
||||
- Remove video device selector and camera permission flow
|
||||
- Remove hideVideo(), showVideo(), getMaxVideoThroughput(), and related JS paths
|
||||
- Remove background blur UI, worker references, and CSS
|
||||
- Keep microphone mute/unmute behavior intact
|
||||
- Keep audio input and output device selection intact
|
||||
- Keep chat, user list, moderation, locking, recording controls, and status messages
|
||||
- Rename visible text in skald.html, index.html, stats.html, mainpage.js, management.js, and protocol errors
|
||||
- Replace public groups UI with public halls UI
|
||||
- Remove video CSS from skald.css and common.css
|
||||
- Check layout after removing the video pane; no dead space or hidden required controls
|
||||
- Preserve keyboard access with Tab and Shift+Tab through all controls
|
||||
- Ensure controls have labels or accessible names after icon/button cleanup
|
||||
- Verify audio-only UI loads without 404s for renamed assets
|
||||
- Verify joining, muting, chat, recording controls, and leaving work from keyboard
|
||||
|
||||
# ============================================================================
|
||||
# PHASE 6: RECORDING REWRITE - SINGLE MIXED OGG OPUS
|
||||
# ============================================================================
|
||||
|
||||
- Remove diskwriter dependency on github.com/at-wat/ebml-go and WebM/Matroska writing
|
||||
- Remove per-track/per-participant WebM recording logic
|
||||
- Remove video recording fields such as hasVideo, width, height, keyframes, and video MIME handling
|
||||
- Decide final mixer implementation before coding:
|
||||
* Decode all active Opus RTP audio to 48 kHz PCM
|
||||
* Maintain a per-source jitter/timing buffer so join/leave does not corrupt the mix
|
||||
* Mix to stereo with clipping prevention or limiting
|
||||
* Insert silence for missing frames rather than blocking the mixer
|
||||
* Encode mixed PCM to Ogg Opus
|
||||
- Evaluate Go-native decode/encode/container libraries versus ffmpeg subprocess
|
||||
- If using ffmpeg, add a startup check and clear admin/operator error when ffmpeg is missing
|
||||
- If using ffmpeg, use nonblocking stdin writes and drain stderr safely
|
||||
- If using ffmpeg, command shape starts from:
|
||||
ffmpeg -f s16le -ar 48000 -ac 2 -i pipe:0 -c:a libopus -b:a 128k output.ogg
|
||||
- Ensure recording work cannot block WebRTC packet handling
|
||||
- Name recording files skald-recording-YYYYMMDD-HHMMSS.ogg
|
||||
- Avoid usernames or live personal identifiers in recording filenames
|
||||
- Store one recording file per hall recording session
|
||||
- Close recordings cleanly on explicit stop
|
||||
- Close recordings cleanly when the hall empties
|
||||
- Handle participant join/leave during recording without stopping the file
|
||||
- Handle mute/unmute during recording without stale audio
|
||||
- Handle recording start when no one is speaking
|
||||
- Add focused mixer/recording tests with synthetic audio where possible
|
||||
- Verify produced Ogg Opus file with `ffprobe` or equivalent
|
||||
- Verify produced file plays in a standard audio player
|
||||
|
||||
# ============================================================================
|
||||
# PHASE 7: CONFIGURATION, INSTALLATION, AND DEPLOYMENT SURFACES
|
||||
# ============================================================================
|
||||
|
||||
- Update command-line flags and help output for Skald and halls
|
||||
- Update default examples for halls/, data/, recordings/, and skaldctl.json
|
||||
- Update systemd service examples to skald user, binary, and paths
|
||||
- Update reverse proxy examples to /hall/ and /skald-api/
|
||||
- Update TURN/STUN docs only where project name or URLs changed
|
||||
- Update Docker/container or packaging files if present later
|
||||
- Update .gitignore for renamed binaries, config files, and generated artifacts
|
||||
- Verify there are no stale install commands that build or run galene/galenectl
|
||||
|
||||
# ============================================================================
|
||||
# PHASE 8: DOCUMENTATION
|
||||
# ============================================================================
|
||||
|
||||
- Rewrite README.md to describe Skald as audio-only hall conferencing
|
||||
- Rewrite skald-install.md for new project name, binary names, and hall paths
|
||||
- Rewrite skald.md admin/usage docs for audio-only behavior
|
||||
- Rewrite skald-client.md for audio-only client authors
|
||||
- Rewrite skald-protocol.md for hall terminology and audio-only tracks
|
||||
- Rewrite skald-api.md for /skald-api/ and .halls paths
|
||||
- Remove video, camera, screenshare, simulcast, SVC, and WebM recording instructions
|
||||
- Add Ogg Opus recording documentation
|
||||
- Document that incoming video is rejected by design
|
||||
- Document that Galene protocol/API compatibility is intentionally broken
|
||||
- Document any required external ffmpeg dependency if the recorder uses ffmpeg
|
||||
- Check docs for old real-person sample usernames and replace with placeholders
|
||||
|
||||
# ============================================================================
|
||||
# PHASE 9: VERIFICATION AND CLEANUP
|
||||
# ============================================================================
|
||||
|
||||
- Run `go test ./...` and fix failures caused by the fork work
|
||||
- Run `go vet ./...` and resolve real issues
|
||||
- Run focused webserver/API tests for /hall/ and /skald-api/
|
||||
- Run focused protocol/frontend checks if the project has a JS typecheck/test path
|
||||
- Search source/docs for remaining Galene names
|
||||
- Search source/docs for remaining /group/, .groups, public-groups, galenectl, and galene-api
|
||||
- Search source/docs for remaining video, camera, screenshare, simulcast, WebM, and Matroska references
|
||||
- Search source/docs for remaining group/room terminology in user-facing surfaces
|
||||
- Classify allowed survivors as attribution/history/third-party icon names only
|
||||
- Build skald binary
|
||||
- Build skaldctl binary
|
||||
- Run a local server and verify static pages load without 404s
|
||||
- Test: create a hall with skaldctl
|
||||
- Test: list halls with skaldctl
|
||||
- Test: join one hall from two browsers and confirm two-way audio
|
||||
- Test: attempt to publish video and confirm rejection
|
||||
- Test: start recording and confirm one Ogg Opus file appears
|
||||
- Test: join a third participant during recording and confirm the mix continues
|
||||
- Test: mute/unmute during recording and confirm the output reflects it
|
||||
- Test: leave all participants and confirm recording stops cleanly
|
||||
- Test: play the recording in a standard audio player
|
||||
- Test: restart server and verify halls/config load from the new paths
|
||||
- Remove obsolete files that are no longer served or built
|
||||
- Do a final diff review for accidental compatibility shims or stale Galene naming
|
||||
Reference in New Issue
Block a user