Just Watts
Just Watts is a free, open-source smart trainer app for indoor cycling: ERG workouts, real-road courses, ride history and uploads to Garmin and Strava.
Private NFL survivor pool for friends — 2026/27 season
Translation pending
Sports & fitnessTypeScript · JavaScriptGitHub @triwithmsOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Survive Sunday — NFL survivor pool PWA for friends (2026/27)
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Private NFL survivor / elimination pool PWA for the 2026/27 season.
Locale: en-CA. Stack: Next.js App Router, Prisma + Neon Postgres (production), Auth.js (email/username + password).
#1 cost rule: For specs, FILE-MAP lookups, QA critic scoring, copy, and checklists, use free tiers in order — free Grok, then free Claude, then free Gemini — before any paid Grok Bot / Cursor coding agents. Paid agents only for the actual code PR/merge. Aim to save ~30–50% usage by keeping planning and critic loops off paid runs. Details: docs/HANDOFF.md (top) and docs/FREE-GROK.md (free AI first).Read the full README ↗Private NFL survivor / elimination pool PWA for the 2026/27 season.
Locale: en-CA. Stack: Next.js App Router, Prisma + Neon Postgres (production), Auth.js (email/username + password).
#1 cost rule: For specs, FILE-MAP lookups, QA critic scoring, copy, and checklists, use free tiers in order — free Grok, then free Claude, then free Gemini — before any paid Grok Bot / Cursor coding agents. Paid agents only for the actual code PR/merge. Aim to save ~30–50% usage by keeping planning and critic loops off paid runs. Details: docs/HANDOFF.md (top) and docs/FREE-GROK.md (free AI first).
Docs freshness: When any free or included usage allotment is near empty, refresh HANDOFF / FREE-GROK.md / FILE-MAP (Help only if a user/admin process changed) before starting more work — including Grok Bot / Cursor included weekly usage.
Not a coder? Start with docs/HANDOFF.md — what is live on main vs still in an open PR, where the app lives (GitHub + Vercel + Neon), login / AUTH_SECRET / AUTH_URL pitfalls, BM Boys roster names, official Week 1 picks, and copy-paste prompts for free Grok, then free Claude, then free Gemini. That is not paid Grok Bot, Cursor desktop agents, or other expensive coding bots. You merge GitHub PRs and click through Vercel yourself.
If a chat and the handoff disagree, trust the GitHub main branch.
cd /workspace/survive-sunday/app
npm install
npx prisma db push
npm run seed
npm run dev
Open http://localhost:3000.
Or one-shot: npm run setup && npm run dev
npm install && npx prisma db push && npm run seed && npm run build
The pool is live-only. There is no Demo↔Real switch on Admin. Friends see Who are you? from the live roster, then Join (own email + password) or Sign in. Unclaimed seats still use practice @survivesunday.demo emails for Join claiming — that is seat claiming, not a Demo mode.
First real administrator login: Sign in as Gams (Player + Administrator). Switch Admin tools from Account.
Week 1 is the current board week. Week 2 stays on the schedule. Playbook: docs/REAL-MODE.md.
Legal names live in the database (Admin → Players), not in this repo. Sample files use placeholders such as Alex Player.
SUNDAY26@survivesunday.demo address until claimed. That is not a Demo-mode picker.Friends stay signed in on their phone / Home Screen app. We do not ask for a code at every login.
If they forget the password: Sign in → Forgot password → 6-digit code by email (check inbox and spam/junk; optional SMS if a cell is saved) → new password → signed back in.
@survivesunday.demo addresses cannot use Forgot password. Claim the seat, or ask the administrator to set a password. There is no demo sign-in route.RESEND_API_KEY and RESEND_FROM_EMAIL (see DEPLOY.md §3b). Optional Twilio for texts.data/week1-slate.json (real 2026 slate + final scores where present)one_loss; second loss → eliminated/help from HELP-COPY (+ importing prior picks); footer disclaimerpublic/helmets/. Every feed abbreviation (WSH, LA, JAC, …) maps to its file through src/lib/team-abbr.ts; see public/helmets/README.mdnpm run seedWeek 1 may already be in progress. As [email protected]:
nickname,team)public/examples/week1-picks-import.csvsource: imported, audited, visible post-lock, and auto-graded if games are finalWave 1 Pool QA (critical):
ensureWeekLockedEffects(weekId) runs on pool, picks API, standings, scores, and import. When now >= lockAt (or week is locked/graded), it applies missed-pick losses once and auto-grades FINAL games.source: missed pick (teamAbbr: MISS) + week.missedPicksAppliedAt. Lock now then Force grade will not double-loss. role === "admin" (Administrator) is skipped.src/app/not-found.tsx, error.tsx, global-error.tsx, and (app)/error.tsx so a reload on /admin or /help no longer 404/500 with “missing required error components”.AUTH_URL=http://localhost:3000, AUTH_TRUST_HOST=true, trustHost: true, Secure cookies only on https. A practice administrator keeps admin membership for /admin and /admin/import until a real administrator login exists. There is no separate demo sign-in route.
8b. Tunnel login Host — middleware forwards a public Host (e.g. *.trycloudflare.com) as x-forwarded-host / x-forwarded-proto. Auth callbacks.redirect and the auth route rewrite any https://localhost:3000 Location to the request Host. Client afterAuthNavigate always uses a relative signed-in path (/pick).signOuts first, await getSession() before navigate, then hard-loads /pick. Authenticated routes are force-dynamic + revalidate = 0; BottomNav prefetch is off; SW is network-only for HTML/RSC. remounts on user id (, ).Server identity check: node scripts/verify-session-identity.mjs
Copy .env.example → .env. Defaults use SQLite file:./dev.db.
AUTH_URL=http://localhost:3000
AUTH_TRUST_HOST=true
AUTH_TRUST_HOST=true + trustHost: true in src/lib/auth.ts make Auth.js
use the incoming Host / x-forwarded-host / x-forwarded-proto instead of
pinning AUTH_URL. Middleware copies a non-localhost Host onto
x-forwarded-host so a Cloudflare quick tunnel
(https://*.trycloudflare.com) and http://localhost:3000 share one
npm run dev. Auth redirects that still resolve to localhost are rewritten
to the request Host. Session cookies are Secure only on https; names stay
authjs.* (no __Secure- / __Host- prefix) so a localhost login still
works after a tunnel visit.
To pin a single origin (OAuth callback, tunnel-only):
AUTH_URL=https://great-sloths-fetch.loca.lt
AUTH_TRUST_HOST=false
Scores (live): ESPN’s public NFL scoreboard JSON (site.web.api.espn.com, fallback site.api.espn.com). No API key. /scores, Home, Pick, and Schedule sync on load and poll about every 45s during a live kickoff window. Finals auto-grade picks.
Injuries (near-live): same ESPN public injury report JSON. Cached ~12 minutes. Team pages list Out / Doubtful / Questionable / IR / suspension. Pick / Home / Schedule show compact Out·Doubtful·Q chips. This is not the official NFL club report and has no SLA — ESPN’s undocumented endpoints can 403 or change. data/sample_injury_news.json is schema-only and is not shown in the UI.
Not live: spreads/odds stay seeded; no paid SportsDataIO / API-Sports key is required for Hobby.
See DEPLOY.md and data/data_sources.json.
Seed JSON lives in /workspace/survive-sunday/data/ (symlinked as ./data).
For entertainment among friends. Not a gambling service. Not affiliated with or endorsed by the NFL. Team names and logos are trademarks of their owners.
SessionProviderrefetchOnWindowFocusrefetchInterval={60}PickClient.