- Docker Compose setup with nginx reverse proxy and frontend service - React + Vite + Tailwind CSS configuration - Complete mockup of all application views: - Authentication (login/register) - Events list and selection - Event chat with matchmaking - 1:1 private chat with WebRTC P2P video transfer mockup - Partner rating system - Collaboration history - Mock data for users, events, messages, matches, and ratings - All UI text and messages in English - Project documentation (CONTEXT.md, TODO.md, README.md, QUICKSTART.md)
7.1 KiB
spotlight.cam
Aplikacja umożliwiająca użytkownikom łączenie się w pary, czatowanie, przesyłanie filmów bezpośrednio peer-to-peer przez WebRTC i ocenianie współpracy – bez przechowywania danych na serwerze.
Stworzyć aplikację umożliwiającą peer-to-peer przesyłanie nagrań wideo między użytkownikami, nawet gdy znajdują się na różnych platformach (Android/iOS), z szyfrowaniem end-to-end, minimalnym udziałem backendu i opcjonalnym czatem tekstowym.
✅ Projekt zakłada pełne wsparcie dla Android/iOS (przez przeglądarkę), bez hostowania plików, z backendem i frontendem działającym w ramach Docker Compose.
🧱 ETAPY WDROŻENIA
- 🔍 Analiza technologii i wymagań
Zidentyfikuj ograniczenia platform: Android, iOS (szczególnie iOS WebView vs Safari).
Sprawdź kompatybilność WebRTC na poziomie przeglądarki (getUserMedia, RTCPeerConnection, RTCDataChannel).
Określ typy danych do przesyłania: pliki wideo (MP4), wiadomości tekstowe, metadane.
Zdecyduj, czy to aplikacja webowa (PWA) czy natywna (Flutter/React Native).
Oszacuj maksymalny rozmiar plików i czas transferu.
- 🧠 Projekt architektury systemu 🔗 Połączenie WebRTC
Użyj RTCPeerConnection + RTCDataChannel do przesyłania wideo.
Zaimplementuj STUN i opcjonalnie TURN (np. Google STUN, własny TURN przy złych NAT-ach).
☁️ Serwer sygnalizacyjny (Signaling)
Stwórz prosty backend (np. Node.js + Express + WebSocket) do wymiany SDP/ICE.
Alternatywnie: pozwól użytkownikom przekazywać dane ręcznie (przez QR/link/komunikator).
📤 Przesyłanie danych
Skorzystaj z RTCDataChannel do przesyłania plików binarnych (Blob/FileReader).
Podziel pliki na fragmenty (chunking), monitoruj postęp.
- 🔐 Bezpieczeństwo i prywatność 🔒 Szyfrowanie
Potwierdź, że WebRTC już szyfruje (DTLS/SRTP).
Zaszyfruj czat tekstowy: np. z użyciem libsodium, Signal Protocol lub WebCrypto.
Nie przechowuj żadnych plików na serwerze — tylko wymiana sygnalizacyjna.
🔄 Wymiana danych sygnalizacyjnych
Dodaj 2 tryby:
QR code + ręczne skanowanie
Link generowany przez jedną stronę i wklejany przez drugą
Kodowanie
Zserializuj offer (SDP) do JSON → Base64 → QR/link.
Po stronie odbiorcy: parsuj i odpowiadaj answer przez podobny kanał.
- 🧪 UX i potwierdzenia
Pokaż komunikaty typu:
„Czekam na połączenie…”
„Połączenie nawiązane z użytkownikiem”
„Trwa przesyłanie: 87%”
Po zakończeniu przesyłania: „Plik otrzymany”, przycisk „Zapisz”.
🧠 Główne założenia
- 🔒 Prywatność: przesyłanie filmów bezpośrednio peer-to-peer przez WebRTC – żadnych plików wideo na serwerze. Opcjonalnie możliwość wymiany linków (np. Google Drive).
- 💬 Czat + matchmaking: użytkownicy rejestrują się, wybierają event, trafiają na czat eventowy, łączą się w pary.
- 🤝 1:1: po potwierdzeniu – para znika z czatu publicznego i przechodzi do prywatnego.
- 📦 Docker Compose: całość uruchamiana w kontenerach.
- 📱 Frontend: PWA – działa mobilnie i na desktopie.
🧱 Architektura systemu
Web client (PWA) ↔ Backend (Node.js + WebSocket + REST API) ↔ PostgreSQL
🐳 Docker Compose – komponenty
Zestaw trzech kontenerów:
frontend: PWA (React/Vite/Tailwind)backend: Node.js/Express/Socket.IOdb: PostgreSQL 15
🗃️ Modele bazy danych
users: identyfikacja, event, dostępnośćevents: lista eventów z worldsdc.comchat_rooms: publiczne i prywatne pokojemessages: wiadomości tekstowe/linkimatches: relacja między dwoma użytkownikamiratings: oceny po wymianie nagraniami
🔁 Flow użytkownika
- Rejestracja użytkownika
- Wybór eventu (lista z worldsdc.com) na którym użytkownik jest.
- Czat ogólny dla eventu – matchmaking.
- Potwierdzenie: przejście do prywatnego czatu 1:1.
- Wybór pliku wideo z galerii urządzenia (nagranie odbywa się poza aplikacją).
- Przesłanie filmu bezpośrednio przez WebRTC (peer-to-peer, bez serwera). Opcjonalnie: wymiana linków (np. Google Drive).
- Po wymianie nagraniami – ocena partnera (1–5, komentarz, chęć ponownej współpracy).
💬 Frontend (PWA)
Zbudowany np. w:
- React + Vite + Tailwind
- lub SvelteKit / SolidStart
Widoki:
- Logowanie / Rejestracja
- Wybór eventu
- Czat eventowy
- Profil partnera
- Czat 1:1
- Ocena partnera
- Historia współprac
🔐 Bezpieczeństwo
- Hasła haszowane (bcrypt).
- WebRTC zapewnia natywne szyfrowanie (DTLS/SRTP) dla transferu P2P.
- Opcjonalne dodatkowe szyfrowanie czatu tekstowego (WebCrypto/libsodium).
- Brak przechowywania nagrań na serwerze – tylko sygnalizacja WebRTC.
- Możliwość zgłaszania użytkownika.
📹 WebRTC P2P Transfer Filmów (główna funkcjonalność)
Komponenty:
- RTCPeerConnection: nawiązanie połączenia P2P między użytkownikami
- RTCDataChannel: kanał do transferu danych binarnych (pliki wideo)
- Chunking: podział dużych plików wideo na fragmenty (np. 16KB chunks)
- Progress monitoring: śledzenie postępu wysyłania/odbierania (pasek postępu)
- STUN/TURN: serwery do przejścia przez NAT/firewall
Flow transferu:
- Użytkownik wybiera plik wideo z galerii urządzenia (
<input type="file">) - Nawiązanie połączenia WebRTC między parą użytkowników (przez serwer sygnalizacyjny WebSocket)
- Otwarcie RTCDataChannel
- Wysłanie metadanych: nazwa pliku, rozmiar, typ MIME
- Podział pliku na chunki i przesłanie przez DataChannel
- Odbieranie chunków i składanie w całość (Blob)
- Po zakończeniu: zapis pliku w pamięci urządzenia odbiorcy
Fallback:
- Jeśli WebRTC nie zadziała (problemy z NAT, firewall), użytkownik może wymienić się linkami do filmów (Google Drive, Dropbox, itp.)
➕ Opcjonalne rozszerzenia
- System oznaczeń zaufania (badge).
- Blokowanie użytkowników.
- Publiczne profile z opiniami.
- Powiadomienia push.
📝 Zasady rozwoju projektu (Development Guidelines)
Język w kodzie
- Wszystkie stringi, komunikaty, UI text, komentarze w kodzie: angielski
- Nazwy zmiennych, funkcji, klas: angielski
- Dokumentacja techniczna w kodzie (JSDoc, docstrings): angielski
Komunikacja
- Komunikacja z zespołem/developerem: polski
- Dokumentacja projektowa (CONTEXT.md, README.md): polski (może być mieszana z angielskim dla części technicznych)
Git commits
- Commit messages: standardowy format bez wzmianek o AI/automatycznym generowaniu kodu
- Przykład dobrego commita:
feat: add WebRTC P2P video transfer mockup - Przykład złego commita:
feat: add video transfer (generated by AI) - Commituj zmiany logicznie (feature by feature, bugfix by bugfix)
Przykład
// ✅ Poprawnie - kod po angielsku
const sendMessage = (message) => {
if (!message.trim()) {
alert('Please enter a message');
return;
}
// Send message via WebSocket
socket.emit('message', message);
};
// ❌ Niepoprawnie - kod po polsku
const wyslijWiadomosc = (wiadomosc) => {
if (!wiadomosc.trim()) {
alert('Proszę wpisać wiadomość');
return;
}
socket.emit('wiadomosc', wiadomosc);
};