* fix(p2p stats): improve own-IP geolocation and world map accuracy
Resolve the user's public endpoint when libp2p only advertises private listen addresses, look up an accurate country flag for "Your IP", snap peer markers to country centroids, and add leeching seeder link plus panel layout tweaks.
* fix(p2p stats): skip caching own-IP lookups cancelled by abort
When the P2P stats panel unmounts mid-request, its AbortSignal cancels
the in-flight fetchOwnPublicEndpoint / fetchOwnIpCountryCode calls. Those
empty results were still cached for 30-60s, so reopening the panel within
that window showed "Your IP" as unavailable or without a country flag even
though nothing had actually failed. Skip caching when the signal aborted so
a later open retries. Addresses Cursor Bugbot finding.
Merge board directories from the new bitsocialnet/lists per-directory layout on the client side.
Update vendored fallback data, sync tooling, directory references, and tests.
Treat failed board stat fetches as complete on the home page so stats do not stay loading forever.
Vite's built-in server.open fired before portless was reachable and
used the wrong hardcoded URL, so yarn start opened a 404. Disable
vite's open when PORTLESS_URL is set and explicitly open the
branch-scoped URL from start-dev.js after HTTP 2xx/3xx readiness.
Add a Claude Code SessionStart hook (matcher: startup) that runs
`corepack yarn install` when node_modules is missing, so worktrees Claude
creates internally are immediately usable. Also extend create-task-worktree.sh
to install deps after the worktree is created, covering Codex/Cursor/manual
flows that share that script.
* fix(thread-page): make thread auto updates opt-in
Wire `Auto` and `Update` to the same manual refresh path and cover the thread flow with an e2e harness.
* fix(thread-page): address PR review findings
* fix(electron): restore packaged desktop app loading
Rebuild and verify Electron native modules before packaging and use the Vite base URL for packaged asset preloads.
* test(preload-utils): cover non-root base urls
Spaces in Electron Forge filenames (e.g. "5chan Setup.exe") broke
markdown download links in the release body. Also add allowUpdates
to finalize-release so it succeeds when a release already exists.
Restructure the release workflow so build jobs upload workflow artifacts
instead of creating GitHub releases directly. A single finalize-release
job downloads all artifacts and creates the release only when every
platform build succeeds. Also removes the unused gradle bundle step
from the Android job and adds retry logic to gradlew assembleRelease.