RepoPilotOpen in app →

screego/server

screen sharing for developers https://screego.net/

Mixed

Single-maintainer risk — review before adopting

weakest axis
Use as dependencyConcerns

copyleft license (GPL-3.0) — review compatibility; top contributor handles 94% of recent commits…

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit 2w ago
  • 7 active contributors
  • GPL-3.0 licensed
Show all 7 evidence items →
  • CI configured
  • Single-maintainer risk — top contributor 94% of recent commits
  • GPL-3.0 is copyleft — check downstream compatibility
  • No test directory detected
What would change the summary?
  • Use as dependency ConcernsMixed if: relicense under MIT/Apache-2.0 (rare for established libs)

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/screego/server?axis=fork)](https://repopilot.app/r/screego/server)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/screego/server on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: screego/server

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/screego/server shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

WAIT — Single-maintainer risk — review before adopting

  • Last commit 2w ago
  • 7 active contributors
  • GPL-3.0 licensed
  • CI configured
  • ⚠ Single-maintainer risk — top contributor 94% of recent commits
  • ⚠ GPL-3.0 is copyleft — check downstream compatibility
  • ⚠ No test directory detected

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live screego/server repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/screego/server.

What it runs against: a local clone of screego/server — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in screego/server | Confirms the artifact applies here, not a fork | | 2 | License is still GPL-3.0 | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 42 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>screego/server</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of screego/server. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/screego/server.git
#   cd server
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of screego/server and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "screego/server(\\.git)?\\b" \\
  && ok "origin remote is screego/server" \\
  || miss "origin remote is not screego/server (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(GPL-3\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"GPL-3\\.0\"" package.json 2>/dev/null) \\
  && ok "license is GPL-3.0" \\
  || miss "license drift — was GPL-3.0 at generation time"

# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
  && ok "default branch master exists" \\
  || miss "default branch master no longer exists"

# 4. Critical files exist
test -f "main.go" \\
  && ok "main.go" \\
  || miss "missing critical file: main.go"
test -f "server/server.go" \\
  && ok "server/server.go" \\
  || miss "missing critical file: server/server.go"
test -f "ws/client.go" \\
  && ok "ws/client.go" \\
  || miss "missing critical file: ws/client.go"
test -f "router/router.go" \\
  && ok "router/router.go" \\
  || miss "missing critical file: router/router.go"
test -f "ws/event.go" \\
  && ok "ws/event.go" \\
  || miss "missing critical file: ws/event.go"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 42 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~12d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/screego/server"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

Screego is a WebRTC-based screen sharing server built in Go that enables developers to share their screens with low latency and high quality via a web browser. It solves the problem of corporate chat tools (Teams, Slack) having poor screen share quality and latency by providing a dedicated, peer-to-peer encrypted sharing solution with an integrated TURN server for NAT traversal. Monolithic Go server: cmd/ contains CLI entrypoints (serve.go for the server, hash.go for password hashing, command.go for CLI parsing); router/router.go handles HTTP/WebSocket routing; server/server.go is the core signaling server; auth/ manages session authentication; config/ handles environment-based configuration with support for IP detection (config/ipdns/) and different runtime modes (config/mode/). The turn/ package wraps the Pion TURN server. Frontend is separate (screego/client repo).

👥Who it's for

Remote development teams and pair programmers who need to share code and debugging sessions with good visual clarity and minimal lag. DevOps engineers deploying it self-hosted via Docker, and frontend developers using the TypeScript client from the companion screego/client repo.

🌱Maturity & risk

Production-ready. The project has active CI/CD via GitHub Actions (build.yml), semantic versioning (goreleaser.yml), Docker Hub distribution, and a public demo at app.screego.net. Go dependencies are stable (pion/webrtc ecosystem, gorilla web toolkit). However, the relatively small test suite (only server/server_test.go visible) suggests core business logic testing could be deeper.

Low-to-moderate risk. The codebase is lean (~67KB Go) with well-established dependencies (Pion for WebRTC, Gorilla for HTTP), but the single-binary architecture means the server is a single point of failure. No visible breaking-change history in the file list, but lack of comprehensive test coverage in router/ and turn/ packages could hide regressions. TURN server integration (pion/turn/v4) is complex NAT logic that warrants careful testing.

Active areas of work

No recent commit information visible in the file list, but the project structure is stable with well-organized docs/ (configuration.md, nat-traversal.md, development.md). The .goreleaser.yml and build.yml suggest active release automation. Focus appears to be on reliability and documentation rather than new features.

🚀Get running

git clone https://github.com/screego/server.git
cd server
go mod download
go run main.go serve

The server starts on port 3000 by default. Configuration via environment variables (see config/config.go) or .env file (screego.config.example provided).

Daily commands:

go run main.go serve

Or with custom config: PORT=8080 go run main.go serve. Docker: docker run -p 3000:3000 screego/server. The server listens on port 3000 by default and requires WebSocket support.

🗺️Map of the codebase

  • main.go — Application entry point that initializes the server and CLI commands; every contributor must understand the startup flow.
  • server/server.go — Core server initialization and HTTP handler setup; defines the primary request routing and WebSocket management.
  • ws/client.go — WebSocket client abstraction handling peer connections and message routing; central to the real-time screen sharing protocol.
  • router/router.go — HTTP route definitions and middleware setup; required reading for understanding request flow.
  • ws/event.go — Event type definitions and dispatcher for WebSocket messages; defines the message contract between frontend and backend.
  • config/config.go — Configuration loading and validation; all runtime behavior depends on proper config handling.
  • ui/src/index.tsx — Frontend React entry point; entry to the TypeScript/React UI application.

🛠️How to make changes

Add a new WebSocket event type

  1. Create a new event handler file following the naming pattern ws/event_<eventname>.go (ws/event_customevt.go)
  2. Define the event struct and implement the Handler interface with a Handle(c *Client) error method (ws/event_customevt.go)
  3. Register the event type in the dispatcher by adding a case in ws/event.go UnmarshalJSON switch statement (ws/event.go)
  4. Define the outgoing message type in ws/outgoing/messages.go if clients need to receive responses (ws/outgoing/messages.go)
  5. Add Prometheus metrics in ws/prometheus.go if tracking this event is important (ws/prometheus.go)

Add a new HTTP API endpoint

  1. Define the route handler function in router/router.go or a dedicated handler file (router/router.go)
  2. Register the route in the RegisterRoutes function with appropriate HTTP method and path (router/router.go)
  3. Wrap with auth middleware by calling auth.Session(http.HandlerFunc(handler)) if authentication is needed (auth/auth.go)
  4. Test the endpoint by adding tests following the pattern in server/server_test.go (server/server_test.go)

Add a new UI page or component

  1. Create a new .tsx component file in ui/src/ following the naming convention (PascalCase.tsx) (ui/src/CustomComponent.tsx)
  2. Define the component as a default export React functional component (ui/src/CustomComponent.tsx)
  3. Add the new route in ui/src/Router.tsx using the existing routing pattern (ui/src/Router.tsx)
  4. If the component needs WebSocket communication, use the useRoom hook from ui/src/useRoom.ts (ui/src/useRoom.ts)
  5. Style the component using CSS modules or inline styles (refer to ui/src/global.css for shared styles) (ui/src/global.css)

Add a new configuration option

  1. Add the new field to the Config struct in config/config.go with envconfig tags (config/config.go)
  2. If the option requires validation logic, add it to the Validate method in config/config.go or a dedicated validation function (config/config.go)
  3. Document the new option in docs/config.md for users (docs/config.md)
  4. Add the option to the example config file screego.config.example (screego.config.example)
  5. If the option affects server behavior, pass it through server initialization in server/server.go (server/server.go)

🔧Why these technologies

  • Go + Gorilla (gorilla/websocket, gorilla/mux, gorilla/handlers, gorilla/sessions) — High-performance, low-latency WebSocket real-time communication with standard HTTP routing and session management. Single-threaded request handling with goroutines for concurrent peers.
  • WebRTC (via Pion library for ICE/TURN) — Decentralized peer-to-peer screen sharing with encryption and NAT traversal. No media relay needed for direct P2P streaming.
  • React + TypeScript + Vite (frontend) — Modern SPA for responsive UI, type safety, and fast development iteration. Vite enables rapid HMR during development.
  • Pion TURN server (github.com/pion/turn/v4) — Provides NAT traversal and relay when direct P2P fails. Lightweight in-process alternative to coturn.
  • **** — undefined

🪤Traps & gotchas

SCREEGO_AUTH env var: If set to a hashed password (via go run main.go hash <password>), all rooms require authentication; unset means open access. TURN server certificate: Self-signed certs work for TURN, but WebRTC may reject them depending on client OS (common NAT traversal issue). Port forwarding: If behind NAT, TURN_SERVERS must list publicly-routable addresses; config/ipdns/ auto-detects but can be fooled by incorrect provider selection. Session persistence: Uses in-memory sessions (gorilla/sessions with cookies); restarting the server logs out all users. DNS resolution: config/ipdns/dns.go uses external DNS lookups; firewall rules may block outbound DNS queries needed for IP detection.

🏗️Architecture

💡Concepts to learn

  • WebRTC Signaling — Screego's core function is exchanging SDP offers/answers and ICE candidates between peers via server/server.go; you must understand this handshake to modify peer negotiation or connection pooling
  • TURN (Traversal Using Relays around NAT) — Screego includes a built-in TURN server (pion/turn/v4) in the turn/ package; NAT traversal is critical for cross-firewall screen sharing, so understanding TURN allocations and relay logic is essential for deployment issues
  • ICE (Interactive Connectivity Establishment) — Pion's ICE agent discovers candidate addresses (host, srflx, relay) and performs connectivity checks; screego's TURN server acts as a relay when direct connectivity fails, so ICE candidate collection is core to screego's NAT avoidance strategy
  • Session-based Authentication with Gorilla — The auth/ package uses gorilla/sessions for token-based access to rooms; understanding cookie-based sessions vs. JWT tradeoffs affects how you modify authentication logic and session persistence
  • Environment-based Configuration (12-Factor App) — Config is loaded from environment variables via kelseyhightower/envconfig in config/config.go; this pattern is critical for Docker and cloud deployments, so you must understand which vars are required (PORT, SCREEGO_AUTH) vs. optional (TURN_SERVERS)
  • Structured Logging with Zerolog — Screego uses zerolog (github.com/rs/zerolog) for JSON-formatted logs; debugging peer connection failures or TURN allocation issues requires reading structured log fields (peer_id, session_id, etc.)
  • Prometheus Metrics — The server exposes Prometheus metrics via github.com/prometheus/client_golang (likely at /metrics); monitoring peer counts, connection duration, and TURN relay usage is essential for production deployments
  • screego/client — Official TypeScript/React frontend; this repo is the backend that screego/client connects to via WebSocket and WebRTC
  • pion/webrtc — Underlying Go WebRTC library that screego/server depends on; understanding Pion's media API is essential for debugging signaling issues
  • jitsi/jitsi-meet — Alternative self-hosted video conferencing with screen share; larger ecosystem but more complex than screego's focused approach
  • pulumi/pulumi — Not directly related but commonly paired; teams use Pulumi to deploy screego/server to cloud VPC with proper TURN server config
  • mjolnirapp/mjolnir — Matrix moderation bot; some screego deployments use Matrix (Synapse) for authentication instead of built-in sessions

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add unit tests for auth/auth.go

The auth package has no corresponding _test.go file, unlike server/server_test.go and config/loglevel_test.go. Authentication is critical for security in a screen-sharing application. Adding comprehensive tests would cover authentication flows, token validation, and session management - all high-risk areas.

  • [ ] Create auth/auth_test.go with test cases for authentication logic
  • [ ] Test auth token generation and validation
  • [ ] Test session management and expiration
  • [ ] Add test coverage for edge cases (invalid tokens, expired sessions, etc.)
  • [ ] Aim for >80% code coverage on auth/auth.go

Add GitHub Actions workflow for golangci-lint

The repo has .golangci.yml configuration but no dedicated CI workflow to enforce linting on PRs. Currently, only build.yml exists in .github/workflows/. A linting workflow would catch code quality issues early and ensure consistency across contributions.

  • [ ] Create .github/workflows/lint.yml
  • [ ] Configure golangci-lint action to run on push and pull_request events
  • [ ] Set up the action to use the existing .golangci.yml config
  • [ ] Make the linting step fail the workflow on any violations
  • [ ] Document the linting requirements in CONTRIBUTING.md or similar

Add integration tests for TURN server configuration (turn/server.go)

The turn/ package (turn/server.go, turn/none.go, turn/portrange.go) lacks test coverage. TURN server setup is critical for NAT traversal in peer-to-peer screen sharing. Tests should verify TURN server initialization, port range handling, and fallback to none mode.

  • [ ] Create turn/server_test.go with tests for TURN server initialization
  • [ ] Add tests for turn/portrange.go port range validation and parsing
  • [ ] Test turn/none.go for the no-TURN fallback case
  • [ ] Verify configuration integration with config/config.go TURN settings
  • [ ] Test error handling for invalid port ranges and configuration conflicts

🌿Good first issues

  • Add unit tests for router/router.go. Currently no *_test.go file exists for HTTP route handling; mock the server.Server interface and test that POST /api/rooms creates sessions and GET /ws/:id upgrades WebSocket correctly.: Critical request path is untested
  • Document TURN server configuration in docs/config.md with examples. The code supports TURN_SERVERS, TURN_REALM, TURN_USERNAME, TURN_PASSWORD env vars but docs only mention generic NAT traversal; add concrete Docker Compose example with embedded TURN.: Config is complex and underdocumented, blocking self-hosted deployments
  • Add integration tests for turn/ package that verify TURN server lifecycle (start, accept allocation, cleanup). Current test coverage missing for pion/turn integration.: TURN is critical for NAT traversal and has no visible test coverage

Top contributors

Click to expand
  • @jmattheis — 94 commits
  • @morya — 1 commits
  • @ipitio — 1 commits
  • [@Alex Wellnitz](https://github.com/Alex Wellnitz) — 1 commits
  • @shyim — 1 commits

📝Recent commits

Click to expand
  • be8b0f0 — Merge pull request #244 from screego/update (jmattheis)
  • fa5eb93 — fix: update workflows (jmattheis)
  • 4c42abc — fix: update go version (jmattheis)
  • 20f3356 — fix: update dependencies (jmattheis)
  • 5285d3e — fix: goreleaser args (jmattheis)
  • 92bbd23 — fix: goreleaser version (jmattheis)
  • b93565b — fix: goreleaser version (jmattheis)
  • c8a3a33 — Merge pull request #238 from screego/update (jmattheis)
  • 3c0d0f4 — ci: add golangci config (jmattheis)
  • 08db40b — fix: update deps (jmattheis)

🔒Security observations

The screego/server codebase demonstrates reasonable security practices overall, including non-root Docker containerization and use of established security libraries. However, there are concerns regarding outdated or deprecated dependency patterns, potential configuration file management, and missing explicit security header implementation. The main risks are Low-to-Medium severity and primarily relate to maintenance and configuration rather than critical code flaws. The application's use of WebRTC/TURN infrastructure requires careful network-level security controls. No obvious injection vulnerabilities, hardcoded secrets, or critical misconfigurations were identified in the visible file structure.

  • Medium · Outdated Go Version — go.mod. The go.mod file specifies Go 1.26.0, which appears to be a future/unrealistic version. This may indicate a configuration error or mismanagement of Go versions. Verify the actual Go version being used for compilation. Fix: Update go.mod to use a stable, current Go version (e.g., 1.21 or 1.22). Ensure version consistency across all build environments.
  • Medium · Potential Hardcoded Configuration Files — screego.config.development, screego.config.example. Configuration files 'screego.config.development' and 'screego.config.example' are checked into version control. These may contain sensitive defaults or examples that could be misused. Fix: Keep example configuration files but ensure no sensitive data (API keys, passwords, tokens) is included. Add actual configuration files to .gitignore.
  • Medium · Use of Deprecated gorilla/sessions Package — go.mod (github.com/gorilla/sessions v1.4.0). The dependency github.com/gorilla/sessions v1.4.0 is part of the deprecated Gorilla toolkit. While functional, it's no longer actively maintained. Fix: Consider migrating to actively maintained session management libraries or evaluate using context-based authentication with JWT tokens.
  • Low · Minimal Docker Container Hardening — Dockerfile. The Dockerfile uses 'FROM scratch' and runs as non-root user (1001), which are good practices. However, there's no health check defined, and the container lacks explicit network policy guidance. Fix: Add HEALTHCHECK instruction to monitor service availability. Document recommended network policies for deployment environments.
  • Low · Exposed WebRTC Ports — Dockerfile (EXPOSE directives). Ports 3478 (TCP/UDP) and 5050 are exposed in the Dockerfile for WebRTC/TURN server functionality. These should be firewalled appropriately in production. Fix: Document port exposure requirements clearly. Recommend network-level firewall rules in deployment documentation. Consider using environment-based port configuration.
  • Low · No explicit CORS or Security Headers Configuration Visible — router/router.go (not fully analyzed). While gorilla/handlers is included (which supports CORS), no explicit security headers configuration is evident in the analyzed files. Fix: Implement comprehensive security headers (HSTS, X-Frame-Options, X-Content-Type-Options, CSP) using middleware. Explicitly configure CORS policy based on use case.
  • Low · Cryptographic Dependencies — go.mod (golang.org/x/crypto v0.50.0). The codebase uses golang.org/x/crypto v0.50.0 which is relatively recent. Ensure it remains updated as cryptographic libraries require continuous maintenance. Fix: Implement dependency update schedule using Dependabot or similar tools. Monitor security advisories for Go cryptographic packages.

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Mixed signals · screego/server — RepoPilot