Skip to content

v0.3.0

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 Nov 04:32
· 315 commits to main since this release
492103f

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 view button 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/stats are off unless -http / RE_PSN_HTTP names an address; they used to listen on
    127.0.0.1:36101 by default. To keep the old behaviour, set RE_PSN_HTTP=127.0.0.1:36101 (or -http 127.0.0.1:36101).
    -http-token and the warning for a page reachable beyond localhost without a token are unchanged.
  • The release carries one SHA256SUMS instead of a .sha256 file per download: five assets instead of nine.
    Check a download with sha256sum -c SHA256SUMS --ignore-missing.
  • A shorter README: its long reference parts fold into dropdowns, and a short list linking to docs/features.md replaces 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-app starts 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 in app/go.mod and app/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 saves re-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, t for light, in the website's colours;
    NO_COLOR turns colour off. Without a terminal, or with --no-tui, it prints one line and exits 2. See app/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, --status and its values, feature ids, setting names, theme values) 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 theme command 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.py generates site/index.html and site/data.json from docs/features.tsv, VERSION, the README settings table
    and this file (--check compares the committed files and the colour tokens of site/style.css with the sources), and site/style.css is 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
    deploys site/ to GitHub Pages on a push to main that touches it, or by hand; the deploy job runs only when the repository variable PAGES_ENABLED is true.
  • 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 a plain view link switches the interface off. The only request is for data.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 with node --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 file re-psn.ini, and
    re-psn-app check HOST:PORT and re-psn-app version, next to the terminal UI described above. See app/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 explicit RE_PSN_BIND address.
  • .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 (tags X.Y.Z, plus X.Y and latest for 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 -replace a busy port names the earlier re-psn holding it. See docs/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