{"id":50048767,"url":"https://github.com/obalunenko/fallout-2d20-combat-tracker","last_synced_at":"2026-05-21T08:04:41.081Z","repository":{"id":358926670,"uuid":"1242999502","full_name":"obalunenko/fallout-2d20-combat-tracker","owner":"obalunenko","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-19T19:07:06.000Z","size":89,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-19T19:45:47.724Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/obalunenko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-19T00:48:36.000Z","updated_at":"2026-05-19T16:14:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/obalunenko/fallout-2d20-combat-tracker","commit_stats":null,"previous_names":["obalunenko/fallout-2d20-combat-tracker"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/obalunenko/fallout-2d20-combat-tracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obalunenko%2Ffallout-2d20-combat-tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obalunenko%2Ffallout-2d20-combat-tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obalunenko%2Ffallout-2d20-combat-tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obalunenko%2Ffallout-2d20-combat-tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/obalunenko","download_url":"https://codeload.github.com/obalunenko/fallout-2d20-combat-tracker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obalunenko%2Ffallout-2d20-combat-tracker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33293467,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-21T02:57:32.698Z","status":"ssl_error","status_checked_at":"2026-05-21T02:57:31.990Z","response_time":62,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-21T08:04:35.998Z","updated_at":"2026-05-21T08:04:41.069Z","avatar_url":"https://github.com/obalunenko.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fallout 2d20 Combat Tracker\n\nDesktop combat tracker for Fallout 2d20 built entirely with Go.\n\n## Stack\n\n- Go\n- Fyne (native desktop UI)\n- SQLite (`modernc.org/sqlite`)\n- Goose migrations (`github.com/pressly/goose/v3`)\n- sqlc generated data-access layer\n- Modular architecture (`domain` -\u003e `app` -\u003e `store` -\u003e `ui`)\n\n## Current MVP (Iteration 1)\n\n- Encounter creation from scratch in UI\n- Initiative ordering (high to low)\n- Round + active turn tracking\n- Next turn progression\n- Party AP / GM Threat controls (`+1` / `-1`)\n- Persistent local storage in SQLite\n- Pip-Boy themed interface with `STAT / CAMP / DATA` tabs\n\n## Create Encounter\n\nUse `NEW ENCOUNTER` in the app header, then:\n\n- enter encounter name\n- add combatant rows with `+ Add Combatant`\n- fill each row with `Name`, `Side` (`party` or `npc`), `Level`, `XP` (for `npc`), `Initiative`, `HP`, `Defense`, `Body Defense`, `DR Phys`, `DR Energy`, `DR Rad`, `DR Poison`\n- for creatures you can enable `torso-only` to use simplified body setup (torso stats only)\n- in DR fields you can enter a number or `IMM` for immunity\n\n## Storage\n\n- DB path: `~/.config/fallout-tracker/tracker.db`\n- Migrations: `internal/store/sqlite/migrations`\n- Migrations are applied automatically on startup via Goose\n- sqlc schema/queries:\n  - `internal/store/sqlite/sqlc/schema.sql`\n  - `internal/store/sqlite/sqlc/query.sql`\n- generated sqlc code: `internal/store/sqlite/dbgen`\n- Tooling is split into dedicated modules:\n  - `tools/goose/go.tool.mod`\n  - `tools/sqlc/go.tool.mod`\n  - `tools/golangci-lint/go.tool.mod`\n  - `tools/goreleaser/go.tool.mod`\n\nExamples:\n\n```bash\nmake goose-status DB=~/.config/fallout-tracker/tracker.db\nmake goose-create NAME=add_new_field\nmake sqlc-generate\nmake tools-list\nmake tools-verify\n```\n\n### DB Normalization Status\n\n- Combat stats are normalized into dedicated tables:\n  - `combatant_defense_by_location`\n  - `combatant_resistance_global`\n  - `combatant_resistance_by_location`\n  - `player_character_defense_by_location`\n  - `player_character_resistance_global`\n  - `player_character_resistance_by_location`\n- Legacy wide columns in `combatants` and `player_characters` were removed in migration `00023`.\n- Current read/write SQL (`sqlc/query.sql`) relies on normalized tables only.\n- Migration notes for `00020`-`00023`: `internal/store/sqlite/migrations/README.md`.\n\n## Run\n\n```bash\nmake run\n```\n\n## Build (local)\n\n```bash\nmake build\n```\n\nGoReleaser build for current platform only:\n\n```bash\nmake goreleaser-local\n```\n\nThis creates:\n\n- `./bin/fallout-tracker-\u003cgoos\u003e-\u003cgoarch\u003e[.exe]`\n\nValidate release config:\n\n```bash\nmake goreleaser-check\n```\n\n## Release (tag)\n\nTag push `v*` triggers GitHub Actions workflow:\n\n- file: `.github/workflows/release.yml`\n- targets: `linux/amd64`, `windows/amd64`, `darwin/universal`\n- behavior:\n  - build Linux and Windows binaries with GoReleaser\n  - build macOS universal binary with GoReleaser `universal_binaries` from `.goreleaser.darwin.yaml`\n  - upload them as workflow artifacts\n  - attach binaries to GitHub Release assets for that tag\n\nExample:\n\n```bash\ngit tag v0.1.0\ngit push origin v0.1.0\n```\n\n## Verify\n\n```bash\ngo test ./...\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobalunenko%2Ffallout-2d20-combat-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fobalunenko%2Ffallout-2d20-combat-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobalunenko%2Ffallout-2d20-combat-tracker/lists"}