ROSHCAM
in queue
· 0 active matches
?
View profile
NOTIFICATIONS
No notifications yet
MESSAGES
No conversations yet. Add friends to start chatting.
developer · firebase not configured

SETUP FIREBASE.

This app is intended to ship with a Firebase config hard-coded. To configure it, follow these steps and paste your config into the HTML.

1

Create a Firebase project

Go to console.firebase.google.com, click Add project.

2

Enable Authentication

Build → Authentication → Get started. Enable Email/Password, Google, and Anonymous.

3

Create Firestore

Build → Firestore Database → Create. Paste these rules under the Rules tab:

rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read: if request.auth != null; allow create, update: if request.auth != null && (request.auth.uid == userId || request.auth.uid == '9DURgNdTyUhtBso2L8Lo22R3Dru1'); } match /usernames/{name} { allow read: if request.auth != null; allow create: if request.auth != null && request.resource.data.uid == request.auth.uid; allow delete: if request.auth != null && resource.data.uid == request.auth.uid; } match /queue/{userId} { allow read, list: if request.auth != null; allow create, update: if request.auth != null && request.auth.uid == userId; // Allow deleting any queue entry (matchmaking transactions need this) allow delete: if request.auth != null; } match /matches/{matchId} { allow read, list: if request.auth != null; allow create: if request.auth != null; allow update, delete: if request.auth != null && (resource.data.caller == request.auth.uid || resource.data.callee == request.auth.uid); match /callerCandidates/{doc} { allow read, write: if request.auth != null; } match /calleeCandidates/{doc} { allow read, write: if request.auth != null; } } match /friendRequests/{reqId} { allow read, list: if request.auth != null; allow create: if request.auth != null && request.resource.data.from == request.auth.uid; allow update, delete: if request.auth != null && (resource.data.from == request.auth.uid || resource.data.to == request.auth.uid); } match /invites/{inviteId} { allow read, list: if request.auth != null; allow create: if request.auth != null && request.resource.data.from == request.auth.uid; allow update, delete: if request.auth != null && (resource.data.from == request.auth.uid || resource.data.to == request.auth.uid); } match /activity/{actId} { allow read, list: if request.auth != null; allow create: if request.auth != null && request.resource.data.uid == request.auth.uid; } match /matchHistory/{histId} { allow read, list: if request.auth != null; allow create: if request.auth != null && request.resource.data.uid == request.auth.uid; } match /reports/{reportId} { allow create: if request.auth != null && request.resource.data.reporter == request.auth.uid; // Only the admin can read / triage reports. allow read, list, update: if request.auth != null && request.auth.uid == '9DURgNdTyUhtBso2L8Lo22R3Dru1'; } match /liveMatches/{matchId} { // Spectators: anyone signed in can watch; players write their own live state. allow read, list: if request.auth != null; allow create, update, delete: if request.auth != null; } match /profileComments/{profileUid}/comments/{id} { allow read, list: if request.auth != null; allow create: if request.auth != null && request.resource.data.from == request.auth.uid; allow delete: if request.auth != null && (resource.data.from == request.auth.uid || profileUid == request.auth.uid || request.auth.uid == '9DURgNdTyUhtBso2L8Lo22R3Dru1'); } } }
4

Add your domain

Authentication → Settings → Authorized domains. Add your GitHub Pages domain (e.g. yourname.github.io).

5

Paste config into the HTML

Project settings → Your apps → </> → register, then copy the firebaseConfig object. Open rosham.html, find the FIREBASE_CONFIG constant near the top of the <script> section, and replace the placeholder object with your real config.

// Find this near the top of the <script type="module"> section: const FIREBASE_CONFIG = { apiKey: "YOUR_API_KEY", authDomain: "YOUR_PROJECT.firebaseapp.com", projectId: "YOUR_PROJECT", appId: "1:..." };
ROSHCAM

Rock. Paper. Scissors.
Against real people.

Get matched with a stranger worldwide over live webcam, read their eyes, and throw first. Climb a ranked ladder from Bronze all the way to Legend.

Live webcam duelsReal opponents, real reflexes — your hand is the controller.
Ranked & ELOWin to climb 9 ranks and 50 levels. Build streaks for big jumps.
Friends & challengesAdd friends, message, and challenge them to private duels.
Private by designVideo is peer-to-peer — we never record it. Streamer mode hides names.
playing now · free to play · 13+

Get started

Create a free account or jump in as a guest.

or with email
or
almost there

PICK YOUR handle.

Choose a unique username and country.

1000

FINDING OPPONENT

searching the world…
searching
0s elapsed
🌍 worldwide
?
you
local · webcam 0ms
0 · 0
BEST OF 3
?
connecting…
Opponent stepped away…
show hand
VS
?
NO PEEKING
opponent hidden during round
waiting
opponent disconnected · finding a new one…
PLAYERS — GET READY!
3
SHOW YOUR HAND
rock, paper, or scissors · hold steady
vs

PREDICTED!
🎤 Let's see it!
?
YOU
Bronze III
VS
?
OPP
Bronze III
first time facing this player
BEST OF 3 · WINNER TAKES ALL
ON FIRE 3
PREDICT
SPECTATING · LIVE
?
Player 1
0
VS
BEST OF 3
?
Player 2
0
Connecting to match…
PROMOTION
Bronze III
Silver I

SILVER

1100 RATING
Promoted from Bronze III
SPACE to continue
FORFEIT PENALTY

RATING LOST

−49 ELO
1893 1844
You left an active match by closing or refreshing the browser. This counts as a forfeit and costs −25 ELO on top of the normal loss.
2
LEVEL UP
You reached Level 2
LEVEL UP
2
Level 1 Level 2
SPACE to continue
VICTORY
Best of 3 · won 2–0
?
you
2 0
?
@stranger
Bronze III
1000 +12
1
Rookie +0 XP
0 / 200 XP

You are banned

Your account has been suspended.