Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
e0ddb88
Rebuild the portal frontend on React 19, TypeScript, Vite and Tailwin…
GeekOfWires Jul 21, 2026
4d11bca
Add empire secondary colours and upgrade Express to 5.x
GeekOfWires Jul 21, 2026
d6b196e
Port all portal pages to TypeScript and test against the Express API
GeekOfWires Jul 21, 2026
8ed73ab
Add a Dockerfile so the portal can run in the PSF-LoginServer compose…
GeekOfWires Jul 23, 2026
1240411
Show empire population as a bar graph, porting EmpireStats
GeekOfWires Jul 23, 2026
8b48b54
Re-theme the empire graph and move the counts into a legend
GeekOfWires Jul 23, 2026
0126497
Theme the empire bars: vertical faction gradient, notch, and glow
GeekOfWires Jul 23, 2026
3296c66
Cache the home-page population count for 5 minutes
GeekOfWires Jul 23, 2026
5c6fb35
Add a continent map modal with facilities and SOI, coloured by control
GeekOfWires Jul 23, 2026
961c1bf
Add rank, battle history, and weapon detail to public profiles
GeekOfWires Aug 18, 2026
d0b8bc1
Port the Express server from JavaScript to TypeScript
GeekOfWires Aug 18, 2026
615dcea
Rate-limit the authentication endpoints
GeekOfWires Aug 18, 2026
e2cea43
Expand continent data to all 23 zones
GeekOfWires Aug 18, 2026
20a73db
Split the admin panel into per-area sections
GeekOfWires Aug 18, 2026
54c25e3
Let non-GM players view their own characters at /me
GeekOfWires Aug 18, 2026
7494270
Draw inventory items as traced artwork rather than name tiles
GeekOfWires Aug 18, 2026
4179519
Add player transfer and a Construction menu to the Combat view
GeekOfWires Aug 18, 2026
8ebfef7
Stop dialogs resizing on hover, and map labels eating clicks
GeekOfWires Aug 18, 2026
0d4b5ef
Remove the Svelte and webpack project the React rewrite replaced
GeekOfWires Aug 20, 2026
53ddaa7
Show the continent and facility in the interstellar log
GeekOfWires Aug 20, 2026
1b00cfc
Read everything through the login server; drop the database pool
GeekOfWires Aug 20, 2026
37d6749
Rewrite the README for the portal as it actually is
GeekOfWires Aug 20, 2026
cee89e5
Call the login server's API the PSF-Server HTTP API
GeekOfWires Aug 20, 2026
1bc468f
Escape the NUL in the continent link key
GeekOfWires Oct 3, 2026
de263df
Call it the PSF-HTTP API
GeekOfWires Oct 3, 2026
952892d
Harden the outward-facing side
GeekOfWires Oct 3, 2026
c333fa9
Bound the load the portal can put on the game server
GeekOfWires Oct 3, 2026
4ad2295
Sign out when the session is gone
GeekOfWires Oct 3, 2026
a06cca5
Forward the caller's session to the PSF-HTTP API
GeekOfWires Oct 3, 2026
d8adfd8
Let panels fill their row and wide dialogs fill the screen
GeekOfWires Oct 3, 2026
b5c13b6
List World Server Management first in the admin sidebar
GeekOfWires Oct 3, 2026
f37459d
Add Packet Review
GeekOfWires Oct 3, 2026
17fff8e
Add the Services section and Scheduling page
GeekOfWires Oct 3, 2026
ba2d144
Add Command: squad administration
GeekOfWires Oct 3, 2026
88886eb
Edit a character's rank and experience from the avatar page
GeekOfWires Oct 3, 2026
7eca731
Add the Stats page with Top Guns and Top Vehicles
GeekOfWires Oct 3, 2026
0f76375
Refresh continent and item artwork; name facility categories
GeekOfWires Oct 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "psfportal-vite",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev-client"],
"port": 5173
}
]
}
7 changes: 7 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# node_modules must be installed inside the image so bcrypt's native binary
# matches the container platform, not copied from the (possibly Windows) host.
node_modules
public
.git
.env
*.log
19 changes: 0 additions & 19 deletions .eslintrc.cjs

This file was deleted.

25 changes: 24 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,31 @@
.DS_Store
.env
node_modules
public/bundle.*

# `public/` is now entirely Vite build output (sources live in src/, static/ and index.html)
public/

package-lock.json
yarn.lock
*swp
*swo

# ---------------------------------------------------------------------------
# Client-derived assets. NEVER commit anything in these paths.
#
# They are generated from a local PlanetSide client install (see
# `npm run build-client-assets`) and contain material owned by Daybreak Game
# Company: item names and description prose from the client's string table, and
# inventory artwork from its texture archives. The generator is part of this
# repo; its output is not, and must not be redistributed here or in any image
# published from here. The app degrades to internal object names and plain grid
# tiles when these are absent, so a fresh clone still builds and runs.
# ---------------------------------------------------------------------------
# `data/*` rather than `data/`: git cannot re-include a file whose parent DIRECTORY is
# excluded, so the negation below only works against a contents glob.
data/*
# ...except the item table, which is committed. Its description prose -- the one clearly
# copyrightable part -- is stripped before commit; what remains is names, types and grid
# footprints, the factual identifiers the inventory UI needs to render anything at all.
!data/items-english.json
static/items/
46 changes: 46 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# PSFPortal — Vite/React frontend built and served by the Express API.
#
# Debian (glibc) base. This used to be load-bearing -- `bcrypt` and `pg` are
# native modules, and bcrypt's glibc prebuilts avoided a source build. Both are
# gone now that the login server owns the database and the password check, so
# the dependency tree is pure JavaScript and an Alpine base would work. Left on
# Debian deliberately rather than swapped in passing: the saving is tens of
# megabytes on a locally-built dev image, and a base change deserves its own
# test. npm install still runs inside the image so the tree matches the
# container platform (the host may be Windows/macOS).

# ---- build stage: install deps and produce the static SPA in public/ ----
FROM node:24-bookworm-slim AS build
WORKDIR /app

# package-lock.json is gitignored in this project, so install rather than ci.
COPY package.json ./
RUN npm install

COPY . .
# Client-derived assets (data/) are gitignored and absent from a clean checkout, so create the
# directory unconditionally -- otherwise the runtime COPY below fails on a fresh clone. An image
# built WITHOUT them is fully functional, just showing internal object names and plain grid tiles.
# NODE_ENV must be set for the BUILD, not just the runtime stage below: vite.config.ts gates source
# maps on it, and a map emitted here would be copied into the image and served publicly.
RUN mkdir -p data && NODE_ENV=production npm run build

# ---- runtime stage: the Express server + built assets ----
FROM node:24-bookworm-slim
WORKDIR /app
ENV NODE_ENV=production

COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/public ./public
COPY --from=build /app/api ./api
# Item names/icons generated from a local client install (see docs/client-assets.md). Present only
# when the builder supplied them; the app falls back to internal names and plain tiles otherwise.
# NOTE: an image built with these baked in carries Daybreak-owned material -- keep it local, do not
# push it to a public registry.
COPY --from=build /app/data ./data
COPY --from=build /app/index.ts ./index.ts
COPY --from=build /app/package.json ./package.json

EXPOSE 8080
# The Express server is TypeScript run directly by Node (native type stripping); no build step.
CMD ["node", "index.ts"]
Loading