diff --git a/backlog/config.yml b/backlog/config.yml new file mode 100644 index 0000000..c9b7dfb --- /dev/null +++ b/backlog/config.yml @@ -0,0 +1,16 @@ +project_name: "rTube Online" +default_status: "To Do" +statuses: ["To Do", "In Progress", "Done"] +labels: [] +milestones: [] +date_format: yyyy-mm-dd +max_column_width: 20 +default_editor: "nvim" +auto_open_browser: true +default_port: 6420 +remote_operations: true +auto_commit: false +bypass_git_hooks: false +check_active_branches: true +active_branch_days: 30 +task_prefix: "task" diff --git a/backlog/tasks/task-1 - Set-up-rtube-online-Next.js-project.md b/backlog/tasks/task-1 - Set-up-rtube-online-Next.js-project.md new file mode 100644 index 0000000..cdbd8e8 --- /dev/null +++ b/backlog/tasks/task-1 - Set-up-rtube-online-Next.js-project.md @@ -0,0 +1,16 @@ +--- +id: TASK-1 +title: Set up rtube-online Next.js project +status: Done +assignee: [] +created_date: '2026-02-15 21:11' +labels: [] +dependencies: [] +priority: high +--- + +## Description + + +Create Next.js 14 landing page with r*stack pattern: hero, how-it-works, features, ecosystem footer. Video library demo page ported from video-player Flask app. Live streaming viewer with HLS.js. API routes for R2 video listing and proxying with range requests. + diff --git a/backlog/tasks/task-10 - Test-video-library-with-uploaded-content.md b/backlog/tasks/task-10 - Test-video-library-with-uploaded-content.md new file mode 100644 index 0000000..25b48e4 --- /dev/null +++ b/backlog/tasks/task-10 - Test-video-library-with-uploaded-content.md @@ -0,0 +1,30 @@ +--- +id: TASK-10 +title: Test video library with uploaded content +status: To Do +assignee: [] +created_date: '2026-02-15 21:12' +labels: [] +dependencies: [] +priority: medium +--- + +## Description + + +Test the video library page with manually uploaded content: +1. Upload a test video directly to R2: rclone copy test.mp4 r2:rtube-videos/ +2. Visit rtube.online/demo +3. Verify the video appears in the sidebar list +4. Click to play — verify video playback with seeking (range requests) +5. Test search/filter functionality +6. Test download and copy link buttons + + +## Acceptance Criteria + +- [ ] #1 Uploaded video appears in /api/videos response +- [ ] #2 Video plays in the demo page player with seeking support +- [ ] #3 Download button works +- [ ] #4 Copy link button copies correct URL + diff --git a/backlog/tasks/task-2 - Deploy-rtube-online-to-Netcup.md b/backlog/tasks/task-2 - Deploy-rtube-online-to-Netcup.md new file mode 100644 index 0000000..802ec77 --- /dev/null +++ b/backlog/tasks/task-2 - Deploy-rtube-online-to-Netcup.md @@ -0,0 +1,16 @@ +--- +id: TASK-2 +title: Deploy rtube-online to Netcup +status: Done +assignee: [] +created_date: '2026-02-15 21:11' +labels: [] +dependencies: [] +priority: high +--- + +## Description + + +Docker Compose with 3 services: rtube (Next.js), nginx-rtmp (RTMP ingest + HLS), archive-worker (stream→R2). Security hardened (cap_drop ALL, no-new-privileges, read_only). Traefik labels for rtube.online. Deployed at /opt/apps/rtube-online/ on Netcup. + diff --git a/backlog/tasks/task-3 - Onboard-rtube.online-domain.md b/backlog/tasks/task-3 - Onboard-rtube.online-domain.md new file mode 100644 index 0000000..edb1b7f --- /dev/null +++ b/backlog/tasks/task-3 - Onboard-rtube.online-domain.md @@ -0,0 +1,16 @@ +--- +id: TASK-3 +title: Onboard rtube.online domain +status: Done +assignee: [] +created_date: '2026-02-15 21:11' +labels: [] +dependencies: [] +priority: high +--- + +## Description + + +Purchased on Porkbun, nameservers pointed to Cloudflare (stan/tessa). Zone ID: ce8c3c5abe7aa7791841b87457a259bf. CNAME records for @ and www pointing to Cloudflare tunnel. Tunnel config updated via API to route rtube.online and www.rtube.online to Traefik. + diff --git a/backlog/tasks/task-4 - Create-rtube-videos-R2-bucket-and-configure-credentials.md b/backlog/tasks/task-4 - Create-rtube-videos-R2-bucket-and-configure-credentials.md new file mode 100644 index 0000000..d7b5718 --- /dev/null +++ b/backlog/tasks/task-4 - Create-rtube-videos-R2-bucket-and-configure-credentials.md @@ -0,0 +1,16 @@ +--- +id: TASK-4 +title: Create rtube-videos R2 bucket and configure credentials +status: Done +assignee: [] +created_date: '2026-02-15 21:11' +labels: [] +dependencies: [] +priority: high +--- + +## Description + + +Created rtube-videos R2 bucket in Cloudflare (EU region). Generated scoped R2 API token (Object Read & Write). Configured .env at /opt/apps/rtube-online/.env with R2_ENDPOINT, R2_BUCKET, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY. Configured rclone r2 remote on Netcup for archive worker. Endpoint: https://0e7b3338d5278ed1b148e6456b940913.eu.r2.cloudflarestorage.com + diff --git a/backlog/tasks/task-5 - Update-rSpace.online-ecosystem-footer.md b/backlog/tasks/task-5 - Update-rSpace.online-ecosystem-footer.md new file mode 100644 index 0000000..679dc74 --- /dev/null +++ b/backlog/tasks/task-5 - Update-rSpace.online-ecosystem-footer.md @@ -0,0 +1,16 @@ +--- +id: TASK-5 +title: Update rSpace.online ecosystem footer +status: Done +assignee: [] +created_date: '2026-02-15 21:11' +labels: [] +dependencies: [] +priority: medium +--- + +## Description + + +Added rCal (rcal.jeffemmett.com) and rTube (rtube.online) links to the r* ecosystem footer in /home/jeffe/Github/rSpace-website/components/footer.tsx. Also stripped Vercel remnants from README and package.json. Committed and pushed to GitHub (auto-mirrors to Gitea). + diff --git a/backlog/tasks/task-6 - Open-UFW-port-1936-for-RTMP-ingest.md b/backlog/tasks/task-6 - Open-UFW-port-1936-for-RTMP-ingest.md new file mode 100644 index 0000000..ae03ecc --- /dev/null +++ b/backlog/tasks/task-6 - Open-UFW-port-1936-for-RTMP-ingest.md @@ -0,0 +1,16 @@ +--- +id: TASK-6 +title: Open UFW port 1936 for RTMP ingest +status: Done +assignee: [] +created_date: '2026-02-15 21:12' +labels: [] +dependencies: [] +priority: medium +--- + +## Description + + +Opened TCP port 1936 on Netcup UFW firewall for RTMP ingest. nginx-rtmp maps host 1936 to container 1935. OBS streams to rtmp://rtube.online:1936/live. + diff --git a/backlog/tasks/task-7 - Test-OBS-→-rTube-live-streaming.md b/backlog/tasks/task-7 - Test-OBS-→-rTube-live-streaming.md new file mode 100644 index 0000000..d887dc5 --- /dev/null +++ b/backlog/tasks/task-7 - Test-OBS-→-rTube-live-streaming.md @@ -0,0 +1,32 @@ +--- +id: TASK-7 +title: Test OBS → rTube live streaming +status: To Do +assignee: [] +created_date: '2026-02-15 21:12' +labels: [] +dependencies: [] +priority: high +--- + +## Description + + +End-to-end test of RTMP streaming workflow: +1. Open OBS Studio, set Service to Custom +2. Server: rtmp://rtube.online:1936/live +3. Stream Key: test-stream +4. Start streaming from OBS +5. Open rtube.online/live in browser, enter key "test-stream" +6. Verify HLS playback works with low latency +7. Verify LIVE indicator shows on the page +8. Stop stream and verify clean disconnect + + +## Acceptance Criteria + +- [ ] #1 OBS connects to rtmp://rtube.online:1936/live without error +- [ ] #2 HLS player at /live loads and plays the stream +- [ ] #3 Stream playback has acceptable latency (<10s) +- [ ] #4 Stopping stream shows appropriate error/ended message in viewer + diff --git a/backlog/tasks/task-8 - Test-stream-auto-archive-to-R2.md b/backlog/tasks/task-8 - Test-stream-auto-archive-to-R2.md new file mode 100644 index 0000000..9ce3277 --- /dev/null +++ b/backlog/tasks/task-8 - Test-stream-auto-archive-to-R2.md @@ -0,0 +1,33 @@ +--- +id: TASK-8 +title: Test stream auto-archive to R2 +status: To Do +assignee: [] +created_date: '2026-02-15 21:12' +labels: [] +dependencies: [] +priority: high +--- + +## Description + + +Verify the archive worker pipeline works end-to-end: +1. Stream via OBS or FFmpeg to rtmp://rtube.online:1936/live/test-archive +2. Stream for at least 30 seconds, then stop +3. Check archive-worker logs: docker logs rtube-archive +4. Verify FLV→MP4 conversion completed +5. Verify MP4 uploaded to r2:rtube-videos/streams/ +6. Verify local FLV and MP4 cleaned up from /recordings volume +7. Check rtube.online/demo — archived video should appear in the library +8. Play the archived video from the demo page + + +## Acceptance Criteria + +- [ ] #1 Archive worker receives on_publish_done callback from nginx-rtmp +- [ ] #2 FLV recording is converted to MP4 via ffmpeg +- [ ] #3 MP4 is uploaded to rtube-videos R2 bucket under streams/ prefix +- [ ] #4 Archived video appears in /api/videos listing +- [ ] #5 Video plays back correctly from /demo page + diff --git a/backlog/tasks/task-9 - Test-FFmpeg-→-rTube-streaming.md b/backlog/tasks/task-9 - Test-FFmpeg-→-rTube-streaming.md new file mode 100644 index 0000000..154091a --- /dev/null +++ b/backlog/tasks/task-9 - Test-FFmpeg-→-rTube-streaming.md @@ -0,0 +1,27 @@ +--- +id: TASK-9 +title: Test FFmpeg → rTube streaming +status: To Do +assignee: [] +created_date: '2026-02-15 21:12' +labels: [] +dependencies: [] +priority: medium +--- + +## Description + + +Test RTMP ingest using FFmpeg (alternative to OBS): +1. From any machine with ffmpeg: + ffmpeg -i input.mp4 -c:v libx264 -preset veryfast -c:a aac -f flv rtmp://rtube.online:1936/live/ffmpeg-test +2. Verify stream appears in nginx-rtmp stats: curl http://rtube-rtmp:8080/stat +3. Watch from rtube.online/live with key "ffmpeg-test" +4. Verify playback works + + +## Acceptance Criteria + +- [ ] #1 FFmpeg successfully connects and streams to RTMP endpoint +- [ ] #2 Stream is viewable via HLS at /live page +