Repository navigation
v0.3.0
Pre-release
Pre-release
Pre-release: this is a 0.x version and may change without notice.
Changed
- The website starts in the plain view on a phone (narrow screens); the
terminal viewbutton switches the interface on, and nothing is stored. - The website's interface on a phone: the version no longer wraps one letter per line in the title bar, and the menu is a row of tabs that scrolls sideways with the page content shown under it, instead of a full-screen list that hid the content.
- Credits: README, NOTICE.md and the website name undecuple as the maintainer of re-psn and author of the changes since the fork, and LICENSE
keeps upstream's copyright line with a second line for the fork's changes. - The status page and
/api/statsare off unless-http/RE_PSN_HTTPnames an address; they used to listen on
127.0.0.1:36101by default. To keep the old behaviour, setRE_PSN_HTTP=127.0.0.1:36101(or-http 127.0.0.1:36101).
-http-tokenand the warning for a page reachable beyond localhost without a token are unchanged. - The release carries one
SHA256SUMSinstead of a.sha256file per download: five assets instead of nine.
Check a download withsha256sum -c SHA256SUMS --ignore-missing. - A shorter README: its long reference parts fold into dropdowns, and a short list linking to
docs/features.mdreplaces the features table. - The container image moves from Alpine 3.20 (end of life) to Alpine 3.24 and Go 1.26, both bases pinned by digest, and the server
runs as the non-root user 10001. Tested with Podman and in the NAT lab on CI.
Added
re-psn-appstarts a terminal UI when run with no arguments, built on Bubble Tea v2.1.1 and Lip Gloss v2.0.6 (MIT; the app module's
first dependencies, pinned inapp/go.modandapp/go.sum; the server module still has none). On first start it asks whether
this machine plays, hosts or both, then for the online ID and the server, and savesre-psn.ini. The home screen has a menu
(Overview, Rooms, Leaderboards, Settings, Help) beside the content, or one at a time under 70 columns. Rooms and Leaderboards
are the tabs of a Status screen filled over the game protocol only (HELLO, SEARCH_ROOMS, GET_RANKING for a typed board id);
the server's version, uptime and connection counts read "not available over the protocol". Settings edits mode, name, server,
status URL and theme ([app] theme, new) and saves with mode 0600. Dark by default,tfor light, in the website's colours;
NO_COLORturns colour off. Without a terminal, or with--no-tui, it prints one line and exits 2. Seeapp/README.md.- Website: autocomplete in the terminal interface. While you type, the command line shows the rest of the best match dimmed and a list of up to eight matches (command names,
--statusand its values, feature ids, setting names,themevalues) with a one-line description each. Tab or Right arrow takes the match, Up and Down choose from the list, Enter takes a chosen item, Esc closes the list, and a click or tap takes an item. The input is an ARIA combobox and the list a listbox, with a polite count of the suggestions. Nothing new is requested or stored. - Website: a visible System / Light / Dark switch in the page header and in the terminal interface (without script it is hidden and the page follows the system), kept in step with the
themecommand and remembered in the browser; and colour from the whole gruvbox-material palette for headings, status tags, command names, the prompt, flags, ids, links and the bars. Every text colour is checked at 4.5:1 or more against its background in both modes; where an accent is too faint as text on the light page it is a border or an underline and the text keeps a passing colour. site/, the project website:tools/site.pygeneratessite/index.htmlandsite/data.jsonfromdocs/features.tsv,VERSION, the README settings table
and this file (--checkcompares the committed files and the colour tokens ofsite/style.csswith the sources), andsite/style.cssis hand-written in the
gruvbox-material palette, dark by default and light with the system. No script and no third-party loads (a CSP says so)..github/workflows/pages.yml
deployssite/to GitHub Pages on a push to main that touches it, or by hand; the deploy job runs only when the repository variablePAGES_ENABLEDistrue.site/terminal.js, the terminal-style interface of the project website: a menu, a content pane and a command line (features [--status S] [id],roadmap,settings [name],
install,connect,version,changelog,about,credits,licence,docs,links,theme,clear,history,--help), Tab completion, history, a dark and a light theme,
and, on a phone, a row of scrolling tabs over the content with tappable command chips. The page still works without script and aplain viewlink switches the interface off. The only request is fordata.json
on the same site (the content security policy allows scripts and requests from this site only). The section bar now stays in view while scrolling, there is a Top link, a real
page heading and a favicon. Tested withnode --test tools/terminal.test.js.app/, the start of the desktop app, as a Go module of its own: a client
for the TCP protocol (HELLO, heartbeat, rooms, leaderboards, and the MEMBER_JOINED, MEMBER_LEFT and ROUTE pushes) with a
conformance test against the real server, a reader and writer for the per-user settings filere-psn.ini, and
re-psn-app check HOST:PORTandre-psn-app version, next to the terminal UI described above. Seeapp/README.md.docker/docker-compose.test.yml: an opt-in hardened host-network compose file for a shared test host (non-root, no capabilities,
read-only filesystem, resource limits). It refuses to start without an explicitRE_PSN_BINDaddress..github/workflows/container.yml: builds the image for linux/amd64 and linux/arm64 and, when a release is published, pushes it to
ghcr.io/undecuple/re-psn(tagsX.Y.Z, plusX.Yandlatestfor a release that is not a pre-release). A manual run builds and
pushes nothing unless asked. The first image,0.2.0, was pushed by a manual run (amd64 and arm64, unsigned); the arm64 image was not run.-replace(RE_PSN_REPLACE): when the game port is held by an earlier re-psn of the same user, the server sends it SIGTERM,
waits up to 10 s for the port and starts in its place (Linux only). It finds the earlier instance through a pidfile in
$XDG_RUNTIME_DIR/re-psn/and signals it only if the pid, owner, start time and program name all check out. The server now
stops cleanly on SIGINT or SIGTERM, and without-replacea busy port names the earlier re-psn holding it. Seedocs/running.md.
Files
Each archive holds one self-contained server binary (no installer, no runtime needed), LICENSE, NOTICE.md and an examples folder (settings file, systemd unit, proxy configs).
The x86_64 AppImage holds the same Linux binary and examples as one runnable file; it needs FUSE to mount, or run it with --appimage-extract-and-run. It is not signed.
Check a download with sha256sum -c SHA256SUMS --ignore-missing.
b8768bebab9ae83e2bf264cace021c855eb1e5bc7620cc120948a961e484bd75 re-psn-v0.3.0-windows-amd64.zip
2003d6e6b6c2f1272d6aa2abf0a9891ce89ee13b55a72883fec236ea29b06df5 re-psn-v0.3.0-linux-amd64.tar.gz
29612108c75e942ef3a5e5f039cd9e727c93932b57a92ff1e1326204226c727e re-psn-v0.3.0-linux-arm64.tar.gz
ff4bb0a0748f74d8da7e2aedb98a2b1de5414ec5d4cbb8b929690c52f4dd7b86 re-psn-v0.3.0-x86_64.AppImage
Developed with AI agent assistance.
Next release: when ready