Recompia
Pokémon Pokopia (Switch 2) recompiled to run natively on Windows with Linux/Handheld support. Multiplayer included, modding, feature enhancements and more! Join the discord community as well
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
正在加载完整 README。 以下为已保存的摘录。
Fantasy draft companion for a sealed reality-competition season. Players draft a roster before the
season, make weekly banishment and murder calls, play optional bonus games, and
follow a live leaderboard.
Stack: Next.js on Vercel, Supabase for Postgres, Auth, Realtime and Storage,
Capacitor for the iOS shell.
Requires Node 20 or newer.
NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY are required.
Next.js inlines them at build time, so changing one needs a rebuild. The anon
key is public by design — it ships in the client bundle and access is governed
by row-level security.查看完整 README ↗Fantasy draft companion for a sealed reality-competition season. Players draft a roster before the season, make weekly banishment and murder calls, play optional bonus games, and follow a live leaderboard.
Stack: Next.js on Vercel, Supabase for Postgres, Auth, Realtime and Storage, Capacitor for the iOS shell.
Requires Node 22.12+, 24, or 26+.
npm install
cp .env.example .env.local # then fill in the Supabase values
npm run dev
NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY are required.
Next.js inlines them at build time, so changing one needs a rebuild. The anon
key is public by design — it ships in the client bundle and access is governed
by row-level security.
| Command | What it does |
|---|---|
npm run dev | Development server |
npm run build | Production build |
npm test | Vitest suite |
npm run typecheck | tsc --noEmit |
npm run native:web:build | Static export for the Capacitor shells |
Schema lives in supabase/0001_traitors_core.sql
— eight tables with row-level security on every one, realtime on the tables the
app subscribes to, and a public storage bucket for portraits.
Admin access is granted by row in public.admin_users, checked through the
private.is_traitors_admin() security-definer function. To grant it:
insert into public.admin_users (user_id, email, display_name)
select id, email, raw_user_meta_data->>'name'
from auth.users
where lower(email) = lower('[email protected]')
on conflict (user_id) do update set email = excluded.email;
The app is season-scoped and white-label capable. Each season owns its cast, rules and lifecycle, so a new season does not inherit the previous one.
show_configs — branding and terminologyseasons — lifecycle metadata and lock scheduleseason_states — the full game state for one season, including its own cast
and its own embedded show configsubmissions — player entries, admin-read onlyscore_adjustments — manual point changes, each with a reasonA season's status drives what players can do: draft (set up, not accepting
entries), live (in play), finalized and archived (read-only).
The season record is the authority. In order of precedence:
NEXT_PUBLIC_DRAFT_CLOSED=true — emergency override, normally unsetfinalized and archived are closed; anything other than
live is closedlockSchedule.draftLockAt — scheduled lockAll of 2–4 are changeable at runtime with no redeploy. The logic is a pure
function in src/utils/draftWindow.ts with tests.
The engine lives in src/utils/scoring.ts and is driven
by a rule pack from src/config/rulePacks.ts, so
point values are data rather than code.
The in-app Rules tab is generated from the active rule pack.
RULE_EXPLANATIONS is typed as a total record over RulePackPoints, so adding
a scoring constant fails to compile until it is explained — the guide cannot
drift from the engine that awards the points.
Two conventions worth knowing before changing anything here:
Both are covered by tests. Run npm test before touching scoring.
npm run native:web:build # static export into native-web/
npx cap add ios # first time only
npm run ios:sync:bundled
npm run ios:open
Always sync through the bundled scripts. A bare npx cap sync resolves webDir
to public/ and re-adds the live-site server.url, producing a shell that
loads a website over the network — which is what App Store Review Guideline 4.2
rejects.
ios/App/App/public is build output, so it is gitignored and a fresh clone does
not have it. It is a folder reference in Copy Bundle Resources, and Xcode
resolves those by enumerating the directory — a directory that is not there
enumerates to nothing and is dropped from the build with no error. An archive
taken before npm run ios:sync:bundled therefore succeeds, validates, uploads,
and passes App Store Connect processing while containing no web app at all.
It fails only on the device: Capacitor's CAPBridgeViewController.loadWebView()
calls exit(1) when index.html is missing, so the app installs from
TestFlight, shows the launch screen, and closes.
Two things stop that build from being produced:
ios/App/Scripts/verify-web-assets.sh runs as the App target's first build
phase and fails the build when App/public/index.html is missing, or when a
Release build still carries a server.url.ios/App/ci_scripts/ci_post_clone.sh builds the export and runs cap sync
before Xcode Cloud opens the project, then asserts the same thing.ci_scripts has to live next to App.xcodeproj. Xcode Cloud looks for it
in the directory holding the project it is building, not at the repository root;
a copy at the root is never found and never runs. It needs
NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY set under
Workflow > Environment, because both are inlined into the bundle at build time.
All of it comes from one file, design/app-icon.svg:
npm run icons:build
That writes the App Store icon, the three launch-screen images, and the web favicons and touch icon. Edit the source art, re-run it, commit the output — do not hand-edit the PNGs, or the platforms drift apart. The App Store icon is written without an alpha channel, which App Store Connect requires.
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗