Replace the SPA Rules route with a self-contained src/pirats/rules.html served at GET /rules (registered before the SPA mount, included in package data for the Nix build). Plain anchor links replace the scrollIntoView workaround since there's no hash router to fight. The corner Rules link and splash-page link now point at /rules, and the Vite dev server proxies /rules to the backend like /api. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Rats with Gats Remote Play (pirats)
A web-based remote play companion app for the tabletop roleplaying game Rats with Gats (where players roleplay as gunslinging pirate rats, or "Pi-Rats", in the magical land of Yeld). The application manages lobbies, character creation, card mechanics, scene phases, obstacles, challenges, and player voting. See RULEBOOK.md for the game rules.
It is built with a FastAPI + SQLModel (SQLite) backend and a Svelte 5 single-page frontend (in frontend/), which polls the backend's JSON state endpoint for near-real-time updates.
Features
- Game Lobby: Create games and join as players via a unique game ID.
- Character Creation:
- Fill out the character profile (appearance, smell, catchphrase).
- Delegate custom "Like/Hate" relationship questionnaire cards to other crewmates (answering them for each other!).
- Draft three "Secret Pirate Techniques" which are automatically shuffled and swapped among players.
- Bind swapped techniques to Face Cards (Jack, Queen, King) for play.
- Dynamic Card Mechanics:
- Automated 54-card deck shuffling and card drawing.
- Automatically matches card suits to thematic obstacles (Clubs for combat, Spades for stealth/cunning, Hearts for social/morale, Diamonds for nautical/athletics).
- Scene Management:
- Assign roles (Pi-Rats or "The Deep" narrator).
- Dynamic challenge creation linking multiple active obstacles.
- Automatically handles card matching colors/values, automatic success when playing Face Card techniques, and Joker card triggers to discard/replace obstacles.
- Between-Scenes Voting:
- Vote on crewmates to rank up.
- Toggle personal objectives (Get a Gat, Earn a Name, Die like a Pirate).
Installation & Running
This project supports standard Python package tools as well as Nix flakes.
Option 1: Standard Python Installation
Prerequisites
- Python >= 3.9
- Virtual environment tool (optional but recommended)
1. Setup Virtual Environment (Optional)
python -m venv .venv
source .venv/bin/activate
2. Install Package
Install the package and its dependencies in editable mode:
pip install -e .
3. Run the App
Launch the FastAPI server using the installed package entrypoint:
pirats --host 0.0.0.0 --port 8000 --reload
Alternatively, run it with uvicorn:
uvicorn pirats.main:app --host 0.0.0.0 --port 8000 --reload
Once running, access the web UI at http://localhost:8000.
Option 2: Using Nix Flakes
If you use the Nix package manager, this repository provides a complete environment.
1. Enter the Development Shell
Includes Python, all runtime dependencies, and testing tools (pytest):
nix develop
2. Run the Application
Run the package directly from the flake:
nix run . -- --host 0.0.0.0 --port 8000
3. Build the Application Package
nix build .
The executable will be located in ./result/bin/pirats.
Deploying as a NixOS Service
The Nix flake exposes a NixOS module that configures the application to run as a systemd service with appropriate sandboxing.
Add this flake to your system configuration and configure the service:
services.pirats = {
enable = true;
host = "127.0.0.1";
port = 8000;
databasePath = "/var/lib/pirats/rats_with_gats.db";
openFirewall = false; # Set to true to open ports in the firewall
};
Running Tests
Tests are written using pytest.
Running with Pip
pytest
Running with Nix
nix develop --command pytest
Project Structure
pirats/
├── pyproject.toml # Python package metadata and dependencies
├── flake.nix # Nix package (incl. frontend build), dev shell, NixOS service module
├── tests/
│ └── test_game.py # Game logic and CRUD test suite (pure-crud, no HTTP for most)
├── frontend/ # Svelte 5 + Vite SPA
│ └── src/
│ ├── pages/ # Routes: Home, Join, Dashboard (game UI), Admin
│ ├── components/ # One component per game phase, Card.svelte, and scene/ (ScenePhase sub-panels)
│ └── lib/ # api.js (fetch wrapper), cards.js (card display helpers), suggestions.js (Suggest-button pools)
└── src/
└── pirats/ # FastAPI backend package
├── main.py # App setup, /api/game create/join/state endpoints, CLI entrypoint
├── models.py # SQLModel tables (Game, Player, Obstacle, Challenge, Vote, GameEvent)
├── cards.py # Card parsing, deck building, obstacle table from the rulebook
├── crud.py # Facade re-exporting all crud_* modules
├── crud_*.py # Game logic by phase: base (deck/hands/rank), character, scene, challenge, upkeep
├── routes_*.py # Thin API routers by phase, mounted under /api
└── static/ # Built frontend lands here (gitignored; populated by the Nix build)
Frontend Development
Run the backend (pirats --reload) and the Vite dev server side by side; Vite proxies /api to port 8000:
cd frontend && npm install && npm run dev