Skip to content

Tech stack

LayerTechWhy
AppFlutter (Dart)Cross-platform, mature, 60fps custom rendering.
Game loopFlameAudio + input on the play surface.
CardsFlutter CustomPainterEvery pip, every face, every shuffle animation. No third-party card lib. Cards are the soul of the visual identity; we build it.
SimPure Dartlib/sim/ has no Flutter imports. Engine, cascade, arcana behavior.
PersistenceSharedPreferences (JSON)Local-first. The web build uses IndexedDB under the hood; same API.
Testsflutter_test + golden_toolkit1869 unit + golden + integration tests.
DeterminismCustom Rng(seed)Bit-exact replay from share codes.

Per CLAUDE.md:

Don’t import a card-rendering library. Cards are the soul of the visual identity; build a custom CustomPainter and own it.

The same rule shipped ThePit’s chart from scratch and produced a visual identity nobody else has. Pale Jack’s cards live in lib/ui/cards/card_painter.dart (~2000 lines).

Per CLAUDE.md:

Don’t require connectivity. Offline-first, no service. Pale Jack is a downloadable game that must work end-to-end on an airplane, in a basement, with the wifi off. No runtime LLM, no live leaderboards, no cloud saves, no online auth, no telemetry that blocks gameplay.

The web build at palejack.com is a static PWA that caches everything on first load and runs offline thereafter.

lib/data/build_flags.dart
const bool kCampaignMode = bool.fromEnvironment(
'CAMPAIGN',
defaultValue: !kIsWeb,
);
BuildValueBehavior
WebfalseSingle-night demo.
Native (default)trueFull 7-night campaign.
Override--dart-define=CAMPAIGN=true/falseEither path.
SurfacePipelineTrigger
palejack.com (game).github/workflows/deploy.yml → Cloudflare Pagesevery push to main
wiki.palejack.com (this site).github/workflows/wiki-deploy.yml → Cloudflare Pagesevery push to main

Both workflows have cancel-in-progress set so rapid pushes cleanly supersede.

This wiki is built with Astro Starlight. Source lives in wiki/. Content is plain Markdown in wiki/src/content/docs/*.md. Edit any page via the Edit this page link in the footer.

../ThePit/ is the sibling project. It pioneered:

  • The Flutter + Flame + CustomPainter pipeline.
  • The deterministic seeded RNG (lib/sim/rng.dart).
  • The ShareCode PIT-/PJK- prefix codec.
  • The RunPersistenceController FTL no-save-scum pattern.
  • The golden_toolkit golden-test harness.

Pale Jack lifts those patterns wholesale; the simulation domain is fresh.

WantRead
Cascade mathlib/sim/cascade_resolver.dart
Enginelib/sim/engine.dart
Night flowlib/sim/night.dart
Arcana cataloglib/sim/arcana/arcana.dart
Dealer voicelib/sim/dealer_voice.dart
Campaign statelib/data/campaign_state.dart
Book of Hourslib/data/book_of_hours.dart
Top-level UIlib/main.dart, lib/ui/table_screen.dart
Teststest/sim/, test/data/, test/ui/, test/integration/, test/golden/