Files
spotlightcam/docs/CONTEXT.md
Radosław Gierwiało 80ff4a70bf feat: initial project setup with frontend mockup
- 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)
2025-11-12 17:50:44 +01:00

205 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
1. 🔍 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.
2. 🧠 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.
3. 🔐 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ł.
6. 🧪 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.IO
- `db`: PostgreSQL 15
## 🗃️ Modele bazy danych
- `users`: identyfikacja, event, dostępność
- `events`: lista eventów z worldsdc.com
- `chat_rooms`: publiczne i prywatne pokoje
- `messages`: wiadomości tekstowe/linki
- `matches`: relacja między dwoma użytkownikami
- `ratings`: oceny po wymianie nagraniami
## 🔁 Flow użytkownika
1. Rejestracja użytkownika
2. Wybór eventu (lista z worldsdc.com) na którym użytkownik jest.
3. Czat ogólny dla eventu matchmaking.
4. Potwierdzenie: przejście do prywatnego czatu 1:1.
5. **Wybór pliku wideo z galerii urządzenia** (nagranie odbywa się poza aplikacją).
6. **Przesłanie filmu bezpośrednio przez WebRTC** (peer-to-peer, bez serwera). Opcjonalnie: wymiana linków (np. Google Drive).
7. Po wymianie nagraniami ocena partnera (15, 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:
1. Użytkownik wybiera plik wideo z galerii urządzenia (`<input type="file">`)
2. Nawiązanie połączenia WebRTC między parą użytkowników (przez serwer sygnalizacyjny WebSocket)
3. Otwarcie RTCDataChannel
4. Wysłanie metadanych: nazwa pliku, rozmiar, typ MIME
5. Podział pliku na chunki i przesłanie przez DataChannel
6. Odbieranie chunków i składanie w całość (Blob)
7. 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
```jsx
// ✅ 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);
};
```