DeepSeek Harness Remote
DeepSeek Harness Remote: DeepSeek Harness 실행 PC와 모바일·PC를 안전하게 연결해 어디서나 작업 이어받기
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Free real-time planning poker for agile teams. No sign-up, no install, no ads.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Free real-time planning poker for agile teams. No sign-up, no install, no ads.
pokrr.app · Français · Planning poker guide
Create a room in one click, share the link or QR code, and estimate user stories together. Participants join with a nickname only: no account, no email. Votes stay hidden until the reveal, so nobody anchors on someone else's estimate.
Planning poker minimaliste : gratuit, sans pub, sans inscription. Stack Next.js 16 + PartyServer (Cloudflare Workers + Durable Objects). Coût d'hébergement cible 0 €/mois en restant dans les free tiers Cloudflare et Vercel.
wrangler sur ton compte Cloudflare. La plateforme PartyKit hébergée a fermé le 23/10/2026.room.storage). Une room vit tant qu'une connexion WebSocket est ouverte, et se ferme après 2 h sans aucune action (code WebSocket 4001, le client ne se reconnecte pas), puis Cloudflare évince le DO 1 à 3 min après la dernière déconnexion et l'état est perdu → coût ressources ≈ 0. Un npm run party:deploy redémarre les DO et vide toutes les rooms en cours : éviter de déployer pendant une session.npm install
npm run dev
wrangler dev) : ws://localhost:1999Les deux serveurs tournent en parallèle via concurrently.
Prérequis : npm run dev doit tourner dans un autre terminal (port 3000 + 1999).
npm run smoke # 23 assertions backend (happy path)
npm run smoke:election # 7 assertions élection admin auto (POKRR_ADMIN_GRACE_MS=2000)
npm run smoke:security # 20 assertions sécurité (CSWSH, XSS, admin usurp, voterId, JSON, HTTP sur /parties/)
npm run smoke:idle # coupure d'inactivité (POKRR_IDLE_TIMEOUT_MS=8000, local uniquement)
npm run test:e2e # 1 test Playwright (3 voters, happy path complet)
Tests unitaires (vitest, sans serveur) : npm test (tests/unit/ : logique de jeu GameRoom, stats, sanitisation).
Total : 50 assertions backend + tests unitaires + 1 E2E. CI GitHub Actions (.github/workflows/ci.yml) sur chaque push vers main et sur chaque pull request : lint, typecheck (front et Worker), build, audit, tests unitaires, knip, puis les 3 smokes contre wrangler dev.
npx wrangler login # OAuth Cloudflare via navigateur
npm run party:deploy # wrangler deploy, publie sur pokrr.<sous-domaine>.workers.dev
Note l'URL renvoyée, c'est ton NEXT_PUBLIC_PARTYKIT_HOST pour Vercel.
npx vercel login # OAuth Vercel
npx vercel # premier deploy, prompts → accepter les défauts
# Ajouter la variable d'env côté Vercel (Settings → Environment Variables) :
# NEXT_PUBLIC_PARTYKIT_HOST = pokrr.<sous-domaine>.workers.dev
# (optionnel) NEXT_PUBLIC_SITE_URL = https://<ton-domaine>
npx vercel --prod # production deploy
pokrr.app (ou autre).ws.pokrr.app vers le Worker (sinon garder l'URL *.workers.dev).# Sanité de base
curl -sS https://<ton-domaine>/api/health | jq
# Page de statut visuelle
open https://<ton-domaine>/status
Ouvre la home, crée une salle, ouvre le lien dans un 2e navigateur, vote, vérifie auto-reveal.
Voir .env.example. Récap :
| Variable | Côté | Rôle |
|---|---|---|
NEXT_PUBLIC_PARTYKIT_HOST | Next | Hostname du Worker (sans protocole) |
NEXT_PUBLIC_SITE_URL | Next | URL canonique pour metadataBase OG/Twitter (optionnel) |
POKRR_ADMIN_GRACE_MS | Worker (.env en local ; en prod, aucune vars n'est définie dans wrangler.jsonc, donc défaut du code) | Fenêtre grâce avant élection admin auto (défaut 1 min) |
POKRR_IDLE_TIMEOUT_MS | Worker (.env en local ; en prod, aucune vars n'est définie dans wrangler.jsonc, donc défaut du code) | Fermeture d'une salle sans action (défaut 2 h) |
src/proxy.ts # Locale (Accept-Language), CSP à nonce par requête, noindex des previews
src/app/
page.tsx # Redirige / vers /fr
layout.tsx # Layout racine, metadata OG/Twitter, JSON-LD
robots.ts, sitemap.ts # URL du site codée en dur (https://pokrr.app)
icon.svg # Favicon SVG indigo
_NewRoomButton.tsx # Création de salle (nanoid 10)
_JoinRoomForm.tsx, _LocaleToggle.tsx, _ThemeToggle.tsx, _ThemeScript.tsx
[lang]/ # Routes localisées fr / en
page.tsx # Home (créer / rejoindre, contenu SEO, FAQ)
opengraph-image.tsx # OG card 1200×630 (une par route : home, room, blog, landings)
room/[code]/page.tsx # Server shell de la salle, rend _RoomClient
blog/[slug]/ # Articles MDX (contenu dans src/content/blog/{fr,en}/)
planning-poker-remote/, planning-poker-scrum/ # Landings
status/ # Page statut publique
room/[code]/ # Composants de la salle (importés par [lang]/room/[code]/page.tsx)
_RoomClient.tsx # Hub UI (pre-rendered shell + JoinModal overlay)
_CardDeck.tsx # Deck de cartes + ∞ + ? + ☕, grille responsive
_PlayerList.tsx # Cartes joueurs avec flip 3D 400ms au reveal
_ResultsPanel.tsx # Moyenne, médiane, suggestion, distribution
_AdminBar.tsx # Reveal / reset / next story / toggle auto-reveal
_StoryHeader.tsx # Édition titre story (admin)
_TimerDisplay.tsx # Timer de story
_JoinModal.tsx # Pseudo first-time (overlay)
_ShareDialog.tsx # Code grand + QR + copier
_HelpDialog.tsx # Modal raccourcis clavier
status/_StatusClient.tsx # Sondes du front et du serveur de salles
api/health/route.ts # GET /api/health JSON
src/i18n/ # Dictionnaires typés fr.ts / en.ts, DictContext
src/content/blog/ # Articles MDX fr / en
src/lib/
usePokrrRoom.ts # Hook PartySocket + state local
useRoomShortcuts.ts # Raccourcis 0-9, ?, Space (admin), R (admin)
voterId.ts # localStorage voterId nanoid 16
stats.ts # Calcul stats post-reveal
party/ # Worker PartyServer (tsconfig dédié)
index.ts # Classe PokrrRoom + fetch du Worker (18 events tracés, garde d'accès, élection admin)
domain/GameRoom.ts # Logique de jeu pure (votes, reveal, admins), GameError.ts
security.ts # Origine autorisée, IP client, rate limit
sanitize.ts # Validation pseudo / story / voterId
types.ts # Protocole partagé client/server, LIMITS
log.ts # Logs JSON structurés
scripts/
smoke-room.mjs # Test bout-en-bout (23 assertions)
smoke-security.mjs # Test sécurité (20 assertions)
smoke-admin-election.mjs # Test élection admin (7 assertions)
smoke-idle-expiry.mjs # Test coupure d'inactivité
tests/unit/ # vitest (domain, lib, party)
e2e/ # Playwright
wrangler.jsonc # Config du Worker (binding Main, migration SQLite v1)
nanoid(10) dans un alphabet sans ambiguïté visuelle (23456789ABCDEFGHJKLMNPQRSTUVWXYZ).nanoid(16) URL-safe, généré et stocké côté client (localStorage).src/proxy.ts (nonce par requête, connect-src dérivé de NEXT_PUBLIC_PARTYKIT_HOST). Autres headers (next.config.ts) : X-Frame-Options DENY, X-CTO nosniff, Referrer-Policy, Permissions-Policy, HSTS en prod./parties/ répond 404 sans créer de Durable Object.< > sur pseudos / titres, max 24 chars pseudo / 200 chars story.GET /api/health : status + uptime./status : check visuel des deux services.wrangler tail en prod, console en dev). voterId tronqué 8 chars (anti-exfiltration).? carte ?, Space reveal (admin), R reset (admin).role="radiogroup" + aria-checked sur le deck, aria-live sur le compteur, sr-only h1, aria-label sur boutons icon-only.text-neutral-400 minimum sur fond neutral-950).prefers-reduced-motion désactive l'animation flip.