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
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
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.Read the full 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.
This is the beginning of the README. Read the rest at the original. Read the full README ↗