Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
189 commits
Select commit Hold shift + click to select a range
724d639
fix: catch profane substrings and clan tags in username censor
evanpelle Apr 2, 2026
2d28bfc
Add Rarity to cosmetic items (#3587)
evanpelle Apr 6, 2026
10d02de
Admiral (#3522)
evanpelle Apr 6, 2026
bfa259a
add .claude/ to .gitignore
evanpelle Apr 6, 2026
4dba57a
Revert "Admiral (#3522)"
evanpelle Apr 6, 2026
0a117ae
add adfree description to cosmetics
evanpelle Apr 6, 2026
2f95314
Update name censor to check for certain substrings (#3603)
evanpelle Apr 6, 2026
592dadf
Refactor home page ads into a single file, add corner video ad (#3601)
evanpelle Apr 6, 2026
b5ca0f9
Perf/refactor/fix(NameLayer): about 10% extra improvement (#3540)
VariableVince Apr 7, 2026
cb6bb54
Bump vite from 7.3.0 to 7.3.2 in the npm_and_yarn group across 1 dire…
dependabot[bot] Apr 7, 2026
f170f03
Merge branch 'v30'
evanpelle Apr 7, 2026
341f344
Perf/Refactor(UserSettings): caching makes it 10-20x faster (#3481)
VariableVince Apr 7, 2026
18da713
Implement FX sound effects (#3394)
camclark Apr 7, 2026
ea7af50
fix Privilege check after bad merge
evanpelle Apr 7, 2026
1cbee79
Reduce Attacking Troops Overlay Reflows (#3608)
ralfisalhon Apr 7, 2026
50bd075
Fix deselected host lobby settings persisting for joiners 🐛 (#3607)
FloPinguin Apr 7, 2026
bf73eb9
update clan sessions api documentation
evanpelle Apr 8, 2026
347e16c
update API.md to warn that rate limits are strict
evanpelle Apr 8, 2026
38222bf
Strait of Malacca map adition (#3599)
Loncile Apr 8, 2026
55e8a4e
feat: add NewsBox component and integrate news items into PlayPage (#…
AlexBesios Apr 8, 2026
105404c
Fix: Player Panel shown on top of Win Modal (#3618)
VariableVince Apr 8, 2026
646d7ec
Disable Radial Menu during spawn phase, just left click or tap to pic…
VariableVince Apr 8, 2026
f3cbca0
Remove dead color code (#3613)
babyboucher Apr 8, 2026
7f7cbba
Water-Nukes 💧 (#3604)
FloPinguin Apr 9, 2026
f0b3c49
Fix: flag not visually removed when selecting default/none flag + sho…
VariableVince Apr 10, 2026
d5a2cc0
cosmetic refactor (#3628)
evanpelle Apr 10, 2026
de92a27
Fix for v30: do not show "Not logged in" on flag modal on CrazyGames …
VariableVince Apr 10, 2026
ece1355
Fix for v30: do not show "Not logged in" on flag modal on CrazyGames …
VariableVince Apr 10, 2026
696e727
support for purchasing currency packs (#3629)
evanpelle Apr 10, 2026
51716e9
Add map luna (the moon) (#3635)
PatrickPlaysBadly Apr 11, 2026
4780eff
don't show store button on crazy games
evanpelle Apr 11, 2026
7fe1cd8
fix Luna map thumbnail (#3646)
RickD004 Apr 11, 2026
4c95095
Add flags for the Arctic map (#3610)
RickD004 Apr 12, 2026
17f9cd3
Fix public lobby max player bypass (#3650)
babyboucher Apr 12, 2026
95d7895
Update Europe map and remove its Classic version off rotation (#3647)
RickD004 Apr 12, 2026
7465b28
create a nightly build
evanpelle Apr 12, 2026
6c836b0
Fix pop being applied while city is Under Construction (#3655)
babyboucher Apr 13, 2026
17c1a63
Trading in lakes 🚤 (#3653)
FloPinguin Apr 13, 2026
3704914
Add map conakry (#3656)
PatrickPlaysBadly Apr 13, 2026
2554dc0
increasing staging deployments ttl from 18h=>25h
evanpelle Apr 13, 2026
9f1d020
upate nightly deployment to deploy at 7:00 UTC
evanpelle Apr 13, 2026
616ba1c
Add support to purchase cosmetics with in-game currency (#3648)
evanpelle Apr 13, 2026
4354273
Add flags to NPCs of Arctic and Mediterranean maps (#3657)
RickD004 Apr 13, 2026
318d1e2
Refactor/Fix(UserSettings): last localstorage calls now use UserSetti…
VariableVince Apr 13, 2026
41c72a0
UI Updates (#3616)
iiamlewis Apr 14, 2026
897a3a3
adds map of the Caucasus (#3661)
RickD004 Apr 14, 2026
4814c42
Dependabot: check for go dependency security updates too (#3660)
VariableVince Apr 14, 2026
61f19da
VSCode: small textual fix in launch.json (#3659)
VariableVince Apr 14, 2026
e63c18c
VSCode: have it recommend trusted Prettier and Socket Security extens…
VariableVince Apr 14, 2026
5b6796a
Bump actions/github-script from 8 to 9 in the updates group (#3663)
dependabot[bot] Apr 14, 2026
845ebd7
Chore(deps): Update express-rate-limit (#3667)
VariableVince Apr 14, 2026
e42c99b
Add 2Team spawnzones for Luna map (#3664)
RickD004 Apr 14, 2026
35a64fa
Big Water-Nukes Performance Improvements 💧 (#3668)
FloPinguin Apr 14, 2026
e569c05
Fix muti game joining issue (#3675)
babyboucher Apr 15, 2026
d05f5e7
Fix external train trade attribution in match results (#3589)
Aotumuri Apr 15, 2026
eb7cf1e
Turn the Sahara brown in Mediterranean map (#3676)
RickD004 Apr 15, 2026
3a49b9a
Fix settings-slider visuals (#3673)
dbyale Apr 15, 2026
57aaf59
Have game server reject banned players (#3683)
evanpelle Apr 15, 2026
f32994f
Account Modal Bugfix (#3687)
ryanbarlow97 Apr 15, 2026
9821e8e
Add host cheats for streamers (Specifically Enzo) ⭐ (#3671)
FloPinguin Apr 15, 2026
a12cb56
Great Lakes improvement (#3681)
RickD004 Apr 15, 2026
f1f63ec
Partial Pathfinding Rebuild 💧 (#3689)
FloPinguin Apr 15, 2026
e0cc50d
Fix hostCheats check not disabling (#3691)
babyboucher Apr 15, 2026
87a72a4
Forward game tick errors from worker to client 🐛 (#3690)
FloPinguin Apr 16, 2026
31baeac
Bump dompurify from 3.3.2 to 3.4.0 in the npm_and_yarn group across 1…
dependabot[bot] Apr 16, 2026
1ebac8e
Move brand images to proprietary/ and support multi-dir asset pipelin…
evanpelle Apr 16, 2026
adeb6a3
Update homepage & in-game promos (#3602)
evanpelle Apr 16, 2026
b32b81c
Censor slurs split across clan tag and username
evanpelle Apr 16, 2026
1509bc9
Account Modal Bugfix (#3687)
ryanbarlow97 Apr 15, 2026
76f8441
feat: add warning news type and Firefox performance notice (#3680)
baculinivan-web Apr 16, 2026
565060f
Merge branch 'v30'
evanpelle Apr 17, 2026
d0a9146
Update luna for compact maps (#3692)
PatrickPlaysBadly Apr 17, 2026
e5e1211
feat: add Shift+ modifier support for keybinds (#3679)
baculinivan-web Apr 17, 2026
cfb7315
mls (v5.1) (#3705)
Aotumuri Apr 18, 2026
ae96eb7
Fix nation nuke crash when attacker has no remaining tiles 🛡️ (#3703)
FloPinguin Apr 18, 2026
bf79a0c
Bump protobufjs from 7.5.3 to 7.5.5 in the npm_and_yarn group across …
dependabot[bot] Apr 18, 2026
0801cad
Fix NaN coordinates in Warship patrol logic 🚢 (#3697)
FloPinguin Apr 18, 2026
bcd9cd6
Cache shared-water computation for nation port placement 💧 (#3696)
FloPinguin Apr 18, 2026
ec88844
Add new Bering Sea map, reduce Strait rotation (#3706)
RickD004 Apr 18, 2026
4e04bed
Show game ID ingame 🪪 (#3674)
FloPinguin Apr 18, 2026
12b06fa
Pathfinding Fixes (Water Nukes / Lakes) 💧 (#3714)
FloPinguin Apr 19, 2026
20f428d
Fix middle-click SAM not upgrading other buildings when SAM is unaffo…
baculinivan-web Apr 19, 2026
5203359
Update Britannia and take its Classic version off rotation (#3710)
RickD004 Apr 19, 2026
c3d7d03
Improve ingame moderation for admins (#3678)
ryanbarlow97 Apr 20, 2026
328b885
Merge commit from fork
theRealestAEP Apr 20, 2026
de54f7c
Merge commit from fork
theRealestAEP Apr 20, 2026
78d4b30
worker: stop trusting client-supplied headers for WS client IP
evanpelle Apr 20, 2026
29a1e8d
feat: multi-warship selection with Shift+drag box (#3677)
baculinivan-web Apr 21, 2026
eedb90f
Fix game ID display for team games 🪪 (#3734)
FloPinguin Apr 21, 2026
0801798
Feat: Alliance and betrayal hotkeys (#3110)
Jarifa Apr 21, 2026
ad2be09
Fix: Normalize sound effect loudness (#3738)
camclark Apr 22, 2026
f7716c7
Little Console Cleanup 🧹 (#3741)
FloPinguin Apr 22, 2026
ec6e140
Add an Antarctica map 🐧 (#3740)
RickD004 Apr 22, 2026
9df0569
Bump @xmldom/xmldom from 0.8.12 to 0.8.13 in the npm_and_yarn group a…
dependabot[bot] Apr 23, 2026
4fd1624
Add fullscreen support: HUD button (desktop/Android) + iOS Add to Hom…
baculinivan-web Apr 23, 2026
236f611
Cap RailroadLayer Maximum Texture Size (#3584)
dbyale Apr 23, 2026
1aaa3ba
Bump uuid from 11.1.0 to 14.0.0 in the npm_and_yarn group across 1 di…
dependabot[bot] Apr 23, 2026
98233d8
Adjust troop loss calculations and troop limits (#3652)
1brucben Apr 23, 2026
aa70d67
add Archipelago Sea map ⚓ (#3749)
RickD004 Apr 24, 2026
66bbbc6
Colored SVG smiley icons next to nation names based on relation 😊 (#3…
FloPinguin Apr 24, 2026
37079e6
2661 PR 1/3 Warship Retreat Core, Blue UI Signal, and Transport-First…
Zixer1 Apr 24, 2026
f748294
Fix proprietary asset serving in dev (#3662 regression)
evanpelle Apr 24, 2026
54604c4
Remove directory-URL branch from buildAssetUrl (#3756)
evanpelle Apr 25, 2026
4ae1fa2
Remove small islands on compact maps with half threshold 🏝️ (#3762)
FloPinguin Apr 25, 2026
8634eff
Map playlist tweaks 🗺️ (#3765)
FloPinguin Apr 25, 2026
3783352
Fix: only run the deploy action within our repository (#3753)
VariableVince Apr 25, 2026
9ae6f8a
Feat/auto copy lobby code (#3758)
Zixer1 Apr 25, 2026
ca9dc4e
Bump the npm_and_yarn group across 1 directory with 2 updates (#3766)
dependabot[bot] Apr 25, 2026
62299c9
standardize UI colors to fit brand guidelines (#3754)
evanpelle Apr 25, 2026
32a254b
add Baja California map 🏜️ (#3759)
RickD004 Apr 25, 2026
a5c346b
upload manifest to r2 before starting container (#3767)
evanpelle Apr 26, 2026
7d67c80
Include Vite's bundle output in the manifest (#3772)
evanpelle Apr 26, 2026
3815f04
Revert "Adjust troop loss calculations and troop limits (#3652)"
evanpelle Apr 26, 2026
4338d70
flag-tweak (#3775)
theRealestAEP Apr 26, 2026
c0febac
2661 PR 2/3 Warship Port Healing, Docking Capacity, and Waiting Behav…
Zixer1 Apr 26, 2026
8099b9f
Massive nation improvement 🤖 (#3761)
FloPinguin Apr 27, 2026
408d0e4
Improve TribeExecution deleteAllStructures 🏛️ (#3777)
FloPinguin Apr 27, 2026
4aeece4
fix: render spawn highlight on 1/5 frames instead of 4/5 (#3782)
Automatron76 Apr 27, 2026
4aa726c
Serve hashed assets from R2 via CDN_BASE (#3773)
evanpelle Apr 27, 2026
0c0f9c2
Update attack labels (#3784)
evanpelle Apr 28, 2026
79ac66d
Add map los angeles (with roads) (#3708)
PatrickPlaysBadly Apr 28, 2026
fc45410
Remove the ticks() % 5 gate in TerritoryLayer.spawnHighlight() so the…
evanpelle Apr 28, 2026
01b3cbe
Set crossOrigin = "anonymous" on canvas-bound icon images (#3789)
evanpelle Apr 28, 2026
70f425e
emit sound when structure starts building not on completion
evanpelle Apr 28, 2026
7d41f0d
fix: add copy button for game ID in game history details (#3783)
Automatron76 Apr 28, 2026
692028d
Make nations more forgiving toward humans on Easy difficulty 🕊️ (#3791)
FloPinguin Apr 28, 2026
7654537
Much better river handling for nations and tribes! 🏞️ (#3786)
FloPinguin Apr 29, 2026
d004258
Fix cross-browser CSS-mask CORS failures for OpenFrontLogo and Soldie…
evanpelle Apr 29, 2026
a989bcb
Rename Mediterranean to Mare Nostrum 🏛️ (#3768)
RickD004 Apr 29, 2026
3476bfc
Changed the default in UserSettings.ts:386 from 1 to 0. New users (or…
evanpelle Apr 29, 2026
bd6c63b
Nation ship improvements (#3724)
babyboucher Apr 29, 2026
58cb86c
Add CLAUDE.md
evanpelle Apr 29, 2026
2994a5f
Start game via WebSocket intent (#3794)
evanpelle Apr 29, 2026
4b66e40
move homepage background down 2cm
evanpelle Apr 29, 2026
67a42c2
add malibu glow on edge of lobby card on hover
evanpelle Apr 29, 2026
c2567b4
reword to Public Player ID (#3797)
ryanbarlow97 Apr 29, 2026
063704f
Use OpenFront font for version (#3795)
evanpelle Apr 29, 2026
2a76a63
Restrict ArchipelagoSea to special rotation only 🗺️ (#3798)
FloPinguin Apr 29, 2026
dd52e97
Fix broken logo in README 🖼️ (#3799)
FloPinguin Apr 29, 2026
f304141
Fix/refactor/optim(StructureIconsLayer): restore structure icons afte…
VariableVince Apr 30, 2026
1776ae4
go to player on spawn start (#3802)
evanpelle Apr 30, 2026
3350830
Merge branch 'v30'
evanpelle Apr 30, 2026
f1d0136
mls (v5.3) (#3804)
Aotumuri Apr 30, 2026
742a544
2661 PR 3/3 Warship Manual Override, Aggro Override, and Heal-at-Port…
Zixer1 Apr 30, 2026
4f20d2b
TypeScript update to 6.0.3 (#3806)
babyboucher Apr 30, 2026
ccb80f4
Fix warship diagonal chase and improve trade ship capture reliability…
evanpelle Apr 30, 2026
8a638a3
perf(UnitLayer): batch trail clears to fix O(n²) cost on mass nuke ex…
evanpelle Apr 30, 2026
02353cf
Fix nuke cancellation on alliance to use blast radius
evanpelle Apr 30, 2026
1f549d0
add malibu glow on hover to ranked, join, create lobby buttons
evanpelle Apr 30, 2026
38bbef6
update structure icon filename to bust cache, previous assets had bad…
evanpelle May 1, 2026
df05d21
Clan System Part 2 - UI (#3625)
ryanbarlow97 May 1, 2026
a93c466
Update maps Los Angeles & Dyslexdria (#3809)
PatrickPlaysBadly May 1, 2026
914c7e7
Remove "uuid" dependency (#3811)
VariableVince May 1, 2026
4d5b7c0
Use adfree flag to suppress ads
evanpelle May 2, 2026
d071c82
Add cache busting to asset urls to bust assets with bad headers
evanpelle May 2, 2026
77462b4
Bump toshimaru/auto-author-assign from 3.0.1 to 3.0.2 in the updates …
dependabot[bot] May 2, 2026
0cb17f8
Fix build: add missing adfree field to ResolveCosmetics test mock 🔧 (…
FloPinguin May 2, 2026
775d9a0
Chore(deps): Update pixijs to 8.18.1 (#3812)
VariableVince May 2, 2026
f5a91b8
Map accuracy & consistency pass: nation names, spawn positions, and f…
evadua May 2, 2026
bcdc212
bugfix: SAM was only reloading when not in cooldown (#3817)
evanpelle May 2, 2026
f90e73c
conqueror receives 50% of gold when conquering a human player (#3818)
evanpelle May 2, 2026
f850bdb
fix(tests): update AttackStats to expect 50% war gold for human conqu…
evanpelle May 2, 2026
1be1972
meta: make tribes slightly weaker to speed up the early game
evanpelle May 2, 2026
41ed31e
meta: make sam & missile silo cooldown 90 ticks
evanpelle May 2, 2026
23a9d2f
meta: increase nuke speed to 8 tiles per tick
evanpelle May 2, 2026
ba57da3
Increase port build time to 5 seconds
evanpelle May 2, 2026
22dbc4f
meta: increase alt/current attackerTroopLoss to 60/40
evanpelle May 2, 2026
bf74028
Fix medal icon CORS errors by inlining SVG as data URI
evanpelle May 2, 2026
819edb2
Fix winner stats spoofing exploit
evanpelle May 2, 2026
23a1538
Fix Bosphorus map (#3823)
RickD004 May 3, 2026
213ddd3
Fix: remove unnecessary optional chain i left in (#3822)
VariableVince May 3, 2026
482d1b8
Fix Bosphorus map (#3823)
RickD004 May 3, 2026
58ec8b2
Nations: Fix city farming + reactive defense posts + fix nuked territ…
FloPinguin May 3, 2026
4cd6f50
Nations: Fix city farming + reactive defense posts + fix nuked territ…
FloPinguin May 3, 2026
5d6c48e
Revert "Fix winner stats spoofing exploit"
evanpelle May 3, 2026
ac679b6
update cache bust version to invalid bad response headers
evanpelle May 3, 2026
e0e98e2
Fix map land tile lookup broken by asset URL migration 🗺️ (#3826)
FloPinguin May 3, 2026
3a24383
Fix map land tile lookup broken by asset URL migration 🗺️ (#3826)
FloPinguin May 3, 2026
257fb9b
temporarily disable turnstile
evanpelle May 4, 2026
8ea3426
fix: Show full store item names instead of truncating them (#3831)
Aotumuri May 4, 2026
1bf7df1
Fix mobile logo spacing (#3842)
Aotumuri May 4, 2026
8e55bf9
Remove emoji from user settings (#3838)
Aotumuri May 4, 2026
9420542
Move turnstile check to api (#3845)
evanpelle May 4, 2026
8d1614d
Merge branch 'v31'
evanpelle May 4, 2026
0ef933f
Merge upstream/main into main
devin-ai-integration[bot] May 5, 2026
238c00b
Condense store pattern tiles with alternate colours swatches
devin-ai-integration[bot] May 5, 2026
28f1efe
Add skin preview button with in-game territory preview modal
devin-ai-integration[bot] May 5, 2026
885bbea
Replace skin preview with realistic multi-player game scene
devin-ai-integration[bot] May 5, 2026
f3b97f6
Use real gameplay screenshot for skin preview
devin-ai-integration[bot] May 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 10 additions & 1 deletion .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,16 @@ updates:
groups:
updates:
applies-to: version-updates
patterns: ["*"] #wildcard, needs brackets as bugfix apparently
patterns: ["*"] # wildcard, needs brackets as bugfix apparently
security:
applies-to: security-updates
patterns: ["*"]
- package-ecosystem: "gomod"
directory: "/map-generator"
schedule:
interval: "monthly"
open-pull-requests-limit: 0 # exclude version updates
groups:
golang:
applies-to: security-updates
patterns: ["*"]
19 changes: 12 additions & 7 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ on:
branches:
- "*"

# Nightly build: rebuild and deploy main to nightly.openfront.dev
# 07:00 UTC = 11:00 PM PST (midnight PDT during summer)
schedule:
- cron: "0 7 * * *"

permissions: {}

concurrency:
Expand All @@ -42,16 +47,16 @@ concurrency:

jobs:
deploy:
# Don't deploy on push if this is a fork
if: ${{ github.event_name == 'workflow_dispatch' || github.repository == 'openfrontio/OpenFrontIO' }}
# Deploy on push/schedule/workflow_dispatch (see "on:") unless this is a fork
if: ${{ github.repository == 'openfrontio/OpenFrontIO' }}
# Use different logic based on event type
name: Deploy to ${{ inputs.target_domain || 'openfront.dev' }}
runs-on: ubuntu-latest
timeout-minutes: 30
environment: ${{ inputs.target_domain == 'openfront.io' && 'prod' || '' }}
env:
DOMAIN: ${{ inputs.target_domain || 'openfront.dev' }}
SUBDOMAIN: ${{ github.event_name == 'push' && github.ref_name || inputs.target_subdomain || 'main' }}
SUBDOMAIN: ${{ github.event_name == 'schedule' && 'nightly' || github.event_name == 'push' && github.ref_name || inputs.target_subdomain || 'main' }}
steps:
- uses: actions/checkout@v6
- name: 📝 Update job summary
Expand Down Expand Up @@ -79,7 +84,7 @@ jobs:
gh api octocat
- name: 📝 Create deployment
if: ${{ github.repository == 'openfrontio/OpenFrontIO' && steps.generate-token.outputs.token != '' }}
uses: actions/github-script@v8
uses: actions/github-script@v9
id: deployment
env:
ENVIRONMENT: ${{ inputs.target_domain == 'openfront.io' && 'prod' || 'staging' }}
Expand Down Expand Up @@ -129,10 +134,10 @@ jobs:
GHCR_REPO: ${{ vars.GHCR_REPO }}
GHCR_USERNAME: ${{ vars.GHCR_USERNAME }}
ENV: ${{ inputs.target_domain == 'openfront.io' && 'prod' || 'staging' }}
HOST: ${{ github.event_name == 'workflow_dispatch' && inputs.target_host || 'staging' }}
HOST: ${{ github.event_name == 'workflow_dispatch' && inputs.target_host || 'staging' }} # schedule and push both use staging
CDN_BASE: ${{ vars.CDN_BASE }}
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
TURNSTILE_SECRET_KEY: ${{ secrets.TURNSTILE_SECRET_KEY }}
API_KEY: ${{ secrets.API_KEY }}
SERVER_HOST_MASTERS: ${{ secrets.SERVER_HOST_MASTERS }}
SERVER_HOST_FALK2: ${{ secrets.SERVER_HOST_FALK2 }}
Expand Down Expand Up @@ -161,7 +166,7 @@ jobs:
echo "::endgroup::"
- name: 🔄 Update deployment status
if: ${{ always() && github.repository == 'openfrontio/OpenFrontIO' && steps.generate-token.outputs.token != '' && steps.deployment.outcome == 'success' && steps.deployment.outputs.deployment_id != '' }}
uses: actions/github-script@v8
uses: actions/github-script@v9
env:
FQDN: ${{ env.FQDN }}
DEPLOYMENT_ID: ${{ steps.deployment.outputs.deployment_id }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pr-author.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: toshimaru/auto-author-assign@4d585cc37690897bd9015942ed6e766aa7cdb97f
- uses: toshimaru/auto-author-assign@bdd7688cbf9e6d5683f02f8c7d8ae4062a254b6d
4 changes: 2 additions & 2 deletions .github/workflows/pr-description.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/github-script@v8
- uses: actions/github-script@v9
with:
script: |
if (context.eventName === 'merge_group') {
Expand Down Expand Up @@ -64,7 +64,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/github-script@v8
- uses: actions/github-script@v9
with:
script: |
if (context.eventName === 'merge_group') {
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@ jobs:
GHCR_REPO: openfront-prod
GHCR_USERNAME: ${{ vars.GHCR_USERNAME }}
DOMAIN: ${{ vars.DOMAIN }}
CDN_BASE: ${{ vars.CDN_BASE }}
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
TURNSTILE_SECRET_KEY: ${{ secrets.TURNSTILE_SECRET_KEY }}
API_KEY: ${{ secrets.API_KEY }}
SERVER_HOST_STAGING: ${{ secrets.SERVER_HOST_STAGING }}
SSH_KEY: ~/.ssh/id_rsa
Expand Down Expand Up @@ -117,10 +117,10 @@ jobs:
GHCR_REPO: ${{ vars.GHCR_REPO }}
GHCR_USERNAME: ${{ vars.GHCR_USERNAME }}
DOMAIN: ${{ vars.DOMAIN }}
CDN_BASE: ${{ vars.CDN_BASE }}
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
TURNSTILE_SECRET_KEY: ${{ secrets.TURNSTILE_SECRET_KEY }}
API_KEY: ${{ secrets.API_KEY }}
SERVER_HOST_FALK2: ${{ secrets.SERVER_HOST_FALK2 }}
SSH_KEY: ~/.ssh/id_rsa
Expand Down Expand Up @@ -167,10 +167,10 @@ jobs:
GHCR_REPO: ${{ vars.GHCR_REPO }}
GHCR_USERNAME: ${{ vars.GHCR_USERNAME }}
DOMAIN: ${{ vars.DOMAIN }}
CDN_BASE: ${{ vars.CDN_BASE }}
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
TURNSTILE_SECRET_KEY: ${{ secrets.TURNSTILE_SECRET_KEY }}
API_KEY: ${{ secrets.API_KEY }}
SERVER_HOST_FALK2: ${{ secrets.SERVER_HOST_FALK2 }}
SSH_KEY: ~/.ssh/id_rsa
Expand Down Expand Up @@ -217,10 +217,10 @@ jobs:
GHCR_REPO: ${{ vars.GHCR_REPO }}
GHCR_USERNAME: ${{ vars.GHCR_USERNAME }}
DOMAIN: ${{ vars.DOMAIN }}
CDN_BASE: ${{ vars.CDN_BASE }}
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
TURNSTILE_SECRET_KEY: ${{ secrets.TURNSTILE_SECRET_KEY }}
API_KEY: ${{ secrets.API_KEY }}
SERVER_HOST_FALK2: ${{ secrets.SERVER_HOST_FALK2 }}
SSH_KEY: ~/.ssh/id_rsa
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ resources/.DS_Store
.env*
.DS_Store
.clinic/
CLAUDE.md
NOTES.md
.claude/
.idea/
# this is autogenerated by script
src/assets/
Expand Down
6 changes: 6 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"recommendations": [
"socketsecurity.vscode-socket-security",
"esbenp.prettier-vscode"
]
}
2 changes: 1 addition & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
{
"type": "node",
"request": "launch",
"name": "Debug Jest Tests",
"name": "Debug Tests",
"runtimeExecutable": "npm",
"runtimeArgs": ["run-script", "test"],
"console": "integratedTerminal",
Expand Down
84 changes: 84 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Commands

```bash
npm run inst # Install deps (uses npm ci --ignore-scripts — do NOT use npm install)
npm run dev # Run client + server in dev mode with hot reload
npm run start:client # Client only
npm run start:server-dev # Server only
npm test # Run all tests (Vitest)
npm run test:coverage # Tests with coverage
npm run lint # ESLint
npm run lint:fix # ESLint with auto-fix
npm run format # Prettier
npm run build-prod # Production build
```

**Run a single test file:**

```bash
npx vitest tests/YourTest.test.ts --run
npx vitest NationAllianceBehavior --run # match by name pattern
```

## Architecture

OpenFront.io is a real-time multiplayer territorial strategy game. There are four components:

1. **`src/core/`** — Deterministic game simulation. Pure TypeScript with **no external dependencies**. Must remain fully deterministic (seeded PRNG, no floating-point math). Runs in a Web Worker thread. All `src/core` changes **must** include tests.
2. **`src/client/`** — Rendering (Pixi.js/WebGL), UI (Lit web components + Tailwind CSS 4), WebSocket communication.
3. **`src/server/`** — Game coordination, intent relay, WebSocket management (Node.js/Express/ws).
4. **API** — Closed-source Cloudflare Worker handling auth, stats, cosmetics, monetization. Not in this repo.

### Simulation Flow (Intent → Execution)

The game simulation runs **on each client**, not the server. The server only relays intents.

1. Player action → client creates an **Intent** → sent to server
2. Server bundles all intents for the tick into a **Turn** → relays to all clients
3. Client forwards Turn to the Core worker
4. Core creates an **Execution** for each intent
5. Core calls `executeNextTick()` — all executions run and mutate game state
6. Core sends **GameUpdates** back to client → client renders

Intents and all wire messages are Zod-validated schemas defined in `src/core/Schemas.ts`.

### CDN / Static Assets

The game server only serves `index.html` and the WebSocket. All other assets (JS bundle, images, maps, worker) come from a CDN bucket. `CDN_BASE` is an empty string in dev (falls back to same-origin) and a full origin (e.g. `https://cdn.example.com`) in production. It is set as both a Vite build-time variable and a server runtime env var.

## Key Files

| File | Purpose |
| --------------------------- | -------------------------------------- |
| `src/core/Schemas.ts` | All intent/message types (Zod schemas) |
| `src/core/GameRunner.ts` | Simulation orchestrator |
| `src/core/game/GameImpl.ts` | Game state implementation |
| `src/server/GameServer.ts` | Main WebSocket server, game loop |
| `src/server/Master.ts` | Lobby and game registry |
| `tests/util/Setup.ts` | Test helper — creates test games |
| `docs/Architecture.md` | Architecture overview |
| `docs/Auth.md` | JWT/auth flow |
| `docs/API.md` | Public API endpoints |
| `vite.config.ts` | Build config, CDN handling |

## UI Text / i18n

All user-visible text must go through `translateText()` and have a corresponding entry added to `resources/lang/en.json`. Translations are managed via Crowdin. DO NOT modify any other translation files.

## Testing Patterns

Tests use a `setup()` helper from `tests/util/Setup.ts` that creates a full game instance with map data from `tests/testdata/maps/`. Write tests that exercise the core simulation directly — not mocks.

## Tech Stack

- **Bundler:** Vite + TypeScript 5.7
- **Rendering:** Pixi.js (WebGL)
- **UI Components:** Lit (LitElement) + Tailwind CSS 4
- **Audio:** Howler.js
- **Schemas/Validation:** Zod
- **Testing:** Vitest
- **Server:** Node.js, Express, ws (WebSocket)
40 changes: 40 additions & 0 deletions CREDITS.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ Licensed under [Open Data Commons Open Database License (ODbL)](https://opendata
Copernicus Global Digital Elevation Models distributed by OpenTopography.
Copyright © opentopography.org. All Rights Reserved. [Terms of Use](https://opentopography.org/usageterms)

### NASA

[NASA Earth Observatory](https://science.nasa.gov/earth/earth-observatory/blue-marble-next-generation/topography-bathymetry-maps/)
[Public Domain](https://www.nasa.gov/nasa-brand-center/images-and-media/)

### Hawaii Relief Map

[USA Hawaii relief location map](https://commons.wikimedia.org/wiki/File:USA_Hawaii_relief_location_map.svg) by NordNordWest
Expand All @@ -64,10 +69,45 @@ Licensed under [CC0 1.0.](https://creativecommons.org/publicdomain/zero/1.0/lega
[NASA/JPL-Caltech](https://www.jpl.nasa.gov/images/pia10748-our-milky-way-gets-a-makeover-artist-concept/)
[Public Domain](https://www.jpl.nasa.gov/jpl-image-use-policy/)

### Strait Of Malacca Map

[https://commons.wikimedia.org/wiki/User:Sadalmelik#/media/File:Sumatra_Topography.png](https://commons.wikimedia.org/wiki/File:Sumatra_Topography.png#/media/File:Sumatra_Topography.png)
Sadalmelik - Own work
Topographic map of Sumatra. Created with GMT from publicly released SRTM data. For locator version, see Image:Sumatra Locator Topography.png
CC BY-SA 3.0
File:Sumatra Topography.png

### Luna (The Moon) Map

[https://svs.gsfc.nasa.gov/4720#section_credits]
NASA's Scientific Visualization Studio
Visualizer
Ernie Wright (USRA) ORCID logo.
Scientist
Noah Petro (NASA/GSFC) ORCID logo.

### Antarctica Map

Polar Geospatial Center, 2018, "PGC Map Catalog", https://doi.org/10.7910/DVN/6R8F7U, Harvard Dataverse, V1, [2364], [Apr-02-2026].
[Terms of Use](https://www.pgc.umn.edu/guides/user-services/acknowledgement-policy/)

[U.S. Geological Survey](https://earthexplorer.usgs.gov/metadata/4980/GT30ANTARCPS/)
[Public Domain](https://www.doi.gov/copyright)

### Los Angeles Map

© [OpenStreetMap contributors](https://www.openstreetmap.org/copyright)
Licensed under ODbL

## Icons

### [The Noun Project](https://thenounproject.com/)

Stats icon by [Meko](https://thenounproject.com/mekoda/) – https://thenounproject.com/icon/stats-4942475/
Pay Per Click icon by [Fauzan Adiima](https://thenounproject.com/creator/fauzan94/) – https://thenounproject.com/icon/pay-per-click-2586454/
Medal icon by [Snow](https://thenounproject.com/snowdoll/) – https://thenounproject.com/icon/medal-4567887/

### Flags

[Wikimedia Commons](https://commons.wikimedia.org/wiki/Flag)
Licensed under [CC BY-SA 3.0 DE](https://creativecommons.org/licenses/by-sa/3.0/de/deed.en)
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ ENV GIT_COMMIT="$GIT_COMMIT"
RUN <<'EOF' tee /usr/local/bin/start.sh
#!/bin/sh
if [ "$DOMAIN" = openfront.dev ] && [ "$SUBDOMAIN" != main ]; then
exec timeout 18h /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
exec timeout 25h /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
else
exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
fi
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="resources/images/OpenFrontLogoDark.svg">
<source media="(prefers-color-scheme: light)" srcset="resources/images/OpenFrontLogo.svg">
<img src="resources/images/OpenFrontLogo.svg" alt="OpenFrontIO Logo" width="300">
<source media="(prefers-color-scheme: dark)" srcset="proprietary/images/OpenFrontLogoDark.svg">
<source media="(prefers-color-scheme: light)" srcset="proprietary/images/OpenFrontLogo.svg">
<img src="proprietary/images/OpenFrontLogo.svg" alt="OpenFrontIO Logo" width="300">
</picture>
</p>

Expand Down
2 changes: 1 addition & 1 deletion deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,10 @@ ENV=$ENV
HOST=$HOST
GHCR_IMAGE=$GHCR_IMAGE
GHCR_TOKEN=$GHCR_TOKEN
TURNSTILE_SECRET_KEY=$TURNSTILE_SECRET_KEY
API_KEY=$API_KEY
DOMAIN=$DOMAIN
SUBDOMAIN=$SUBDOMAIN
CDN_BASE=$CDN_BASE
OTEL_EXPORTER_OTLP_ENDPOINT=$OTEL_EXPORTER_OTLP_ENDPOINT
OTEL_AUTH_HEADER=$OTEL_AUTH_HEADER
EOL
Expand Down
20 changes: 18 additions & 2 deletions docs/API.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# API Usage

> **Warning:** Rate limits are very strict. Join the [Discord](https://discord.gg/K9zernJB5z) to request higher rate limits.

## Games

### List Game Metadata
Expand Down Expand Up @@ -207,10 +209,24 @@ GET https://api.openfront.io/public/clan/:clanTag/sessions

- `start` (optional): ISO 8601 timestamp
- `end` (optional): ISO 8601 timestamp
- `page` (optional): Page number, 1-200 (default: 1)
- `limit` (optional): Results per page, 1-50 (default: 20)

**Response:**

```json
{
"results": [ ... ],
"total": 150,
"page": 1,
"limit": 20
}
```

Results are ordered by game start time, newest first.

**Example**

```bash
curl https://api.openfront.io/public/clan/UN/sessions?start=2025-11-15T00:00:00Z &
end=2025-11-18T23:59:59Z
curl "https://api.openfront.io/public/clan/UN/sessions?start=2025-11-15T00:00:00Z&end=2025-11-18T23:59:59Z&limit=10&page=1"
```
Loading
Loading