Files
mirror/.gitignore
T
ducoterra 555fc1c3b4 feat: browser-only screen mirroring prototype
A FastAPI server with two pages and one WebSocket. /mirror captures a
window, screen or tab through the OS-native getDisplayMedia picker; /watch
shows every live mirror as a wall and takes one fullscreen on click. Any
number of sharers and watchers, at the same time.

Media never touches the server: each watcher gets its own RTCPeerConnection
to the sharer, and the Python process only relays JSON. The roster lives in
registry.py, which is transport-free by design -- every operation returns
the envelopes to deliver, so admission, fan-out and teardown policy are all
unit-testable without a socket.

Registry rules worth stating: a signal frame is relayed only along an
existing subscription in either direction; viewer-to-peer traffic is
refused; and teardown is broadcast to every viewer rather than only the
subscribers, because a tile is drawn on stream_added and a viewer that has
not yet subscribed still has a stale tile to clear.

Frontend is hand-written ES modules with no build step and no external
asset. Chromium scales a monitor capture to the capturing window and
requires a secure context, so /mirror detects an insecure origin and prints
the three ways out rather than failing on a button click.

LLM-Generated: true
2026-11-01 16:54:03 -05:00

47 lines
611 B
Plaintext

# Python
__pycache__/
*.py[cod]
*.egg-info/
.eggs/
build/
dist/
.venv/
venv/
.python-version
# Tooling caches
.pytest_cache/
.ruff_cache/
.mypy_cache/
.coverage
coverage.xml
htmlcov/
pyright-output.json
# Editors / OS
.vscode/
.idea/
.DS_Store
*.swp
# Local environment — never commit real config values
.env
.env.*
!.env.example
# Secrets / TLS material generated for local HTTPS
*.key
*.pem
*.p12
certs/
# Playwright
test-results/
playwright-report/
.artifacts/
# Phase pipeline runtime state (the roadmap itself stays tracked)
.agents/phase-sessions/
.agents/pipeline.log
.agents/remediation_plan.md