Version Packages#77
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 19, 2026 00:33
fbb9631 to
23b816a
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 19, 2026 00:35
23b816a to
c8ca67e
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 19, 2026 00:45
c8ca67e to
b1fb6fc
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 19, 2026 01:19
b1fb6fc to
5a3f62c
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 19, 2026 01:54
5a3f62c to
06156ac
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 19, 2026 01:56
06156ac to
8baa306
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
ghost@2.0.0
Major Changes
#76
e133e1fThanks @haydenbleasel! - Rework Ghost from a hosted multi-tenant platform into a self-hosted, single-tenant deployment you run on your own Vercel account.Breaking: this release requires a fresh deployment. The database schema is incompatible with 1.x (migrations were squashed to a new baseline) and the auth/credential model changed entirely.
HETZNER_API_TOKEN,AUTH_PASSWORD, andGHOST_SECRET.AUTH_EMAIL/AUTH_PASSWORDfrom the environment; sessions are a jose-signed JWT cookie verified fully in the edge middleware.HETZNER_API_TOKENreplaces the per-user encrypted token that previously lived in Postgres, and the token-management UI is gone.User,Session,Account,Verification, andPasskeymodels are dropped;userIdscoping is removed from servers and snapshot builds; golden images are keyed per deployment environment.GHOST_SECRETreplacesBETTER_AUTH_SECRET,SESSION_SECRET, andBOOTSTRAP_JWT_SECRET; each token type keeps its own issuer/audience pair./(with/new,/account,/[id]); the marketing site is removed and its content (features, supported games, how-it-works, animated logo) moved into the README.@workflow/worldno longer requires an exact version).Reconnecting servers created by a 1.x instance. Your VMs live in your own Hetzner account, so retiring the old control plane doesn't stop the games — players stay connected and nothing is deleted. But 2.0 starts with a fresh database, so those servers won't appear in your new dashboard. To move a world across:
tar -czf /root/world.tar.gz -C /var/lib/ghost/game/data .— then get the archive somewhere fetchable (e.g.scpit off, or upload it to any file host).curl -L <archive-url> | tar -xz -C /var/lib/ghost/game/data— then start the server again. (For a handful of individual files, the dashboard's Files tab can upload them directly instead.)If you'd rather start fresh, step 4 is the only one you need.
Patch Changes
#55
9f5d0feThanks @tomnieuwland! - Add Factorio support, using the factoriotools/factorio:stable image. Space Age DLC is enabled by default and toggleable. Supports Factorio Username/Password for server discovery.#56
274f368Thanks @tomnieuwland! - Adds a script for generating docker compose files from defined games for local testingcf52b97Thanks @haydenbleasel! - Report agent command results accurately when the ack POST fails transiently — a succeeded command was re-acked as failed and the remaining commands in the envelope were abandoned; acks are now best-effort and isolated from command executionbcf6715Thanks @haydenbleasel! - Make agent enrollment survive a lost response — one dropped enroll reply used to brick the VM forever (each retry generated a fresh keypair and hit "Token already used" in a fatal loop, forcing server deletion); the agent now persists its keypair before the enroll POST and the server replays the success idempotently when a burned token arrives with the already-enrolled public keycf52b97Thanks @haydenbleasel! - Fix lost agent events: a failed event flush never scheduled a retry (terminal events like 'Game stopped' could be dropped forever on a quiet agent), and concurrent flushes silently no-oped, letting shutdown discard buffered events mid-flight; flushes are now serialized and rescheduled on failurecf52b97Thanks @haydenbleasel! - Fix every agent file command (list, delete, install-from-URL) crashing with a ReferenceError — agent/src/files.ts used node:path helpers it never imported; the agent package is now included in the repo typecheck so this class of bug can't ship againcf52b97Thanks @haydenbleasel! - Clean up the temporary .part download when installing a file from URL fails at the final rename step, instead of leaking up to 500MB per failed attempt into the game data directorycf52b97Thanks @haydenbleasel! - Stop replaying the last 200 historical log lines on every start/restart — the log tail now follows from the triggering command's start time, so old lines no longer reappear in the console with fresh sequence numbersbcf6715Thanks @haydenbleasel! - Re-attach the console log tail when the agent boots with the game already running — after an agent crash or VM reboot the tail only started on the next user-issued start/restart, so the dashboard console silently went dead; the agent now probes the container on boot and tails from boot time (no historical replay)cf52b97Thanks @haydenbleasel! - Prevent concurrent agent state saves from racing on a shared temp file, which could crash a just-executed command or corrupt state.json and brick the agent on next boot; saves are now serialized and use unique temp filescf52b97Thanks @haydenbleasel! - Return 401 JSON from authenticated API routes when the session has expired instead of redirecting to the sign-in page — fetch/EventSource consumers were receiving the sign-in HTML with a 200, causing endless JSON parse errors and a dashboard that never noticed it was signed out; the server page poll now redirects to sign-in on 401bcf6715Thanks @haydenbleasel! - Recover snapshot builds whose builder-VM create response was lost — the retry's unique-name conflict was turned straight into a fatal build failure, stranding a billedghost-builder-*VM that nothing tracked or deleted; the step now adopts the existing VM by its deterministic name, and transient 429 rate limits retry instead of failing the buildcf52b97Thanks @haydenbleasel! - Redeliver commands whose delivery or ack was lost in transit — commands were marked delivered before the agent received them with no redelivery path, so a dropped long-poll response left them stuck forever; the agent now dedupes redeliveries against its recent command historycf52b97Thanks @haydenbleasel! - Escape dollar signs in generated docker compose files — Docker Compose interpolatesbcf6715Thanks @haydenbleasel! - Apply the observed-state transition when a retried agent event dedupes — if the first attempt crashed between inserting the event and updating the server row, the retry's duplicate hit returned early and the server was stuck showing "running" after the game had stopped (also breaking the hibernation stop drain); the dedupe path now falls through to the state updatebcf6715Thanks @haydenbleasel! - Fix the files API auth guard silently discarding its 401 — the unauthorized branch returned a bare response that the"error" in ownedcheck never matched, so once unauthenticated API requests reach routes (middleware no longer redirects them) the handler would have fallen through and allowed unauthenticated file listing and deletioncf52b97Thanks @haydenbleasel! - Fix the Hibernate action doing nothing on running or stopped servers — the confirmation dialog was only mounted while provisioning, so hibernation was unreachable from the UI in exactly the states where it is allowedbcf6715Thanks @haydenbleasel! - Prevent a second hibernation from starting mid-hibernation — after the stop drain the agent's "stopped" event made the server claimable again, so another Hibernate click launched a concurrent workflow that could create a duplicate billed snapshot and end a successful hibernation in "failed"; the claim now requires a non-hibernating desired state, and the workflow re-asserts "hibernating" after the drain so the UI no longer offers Start against a VM being shut downcf52b97Thanks @haydenbleasel! - Fix hibernation's stop-drain never detecting that the game stopped — the workflow polled a phase value that nothing ever set, always burning the full window and risking an ACPI shutdown mid-world-save; it now watches observed state and waits for the agent-reported stopbcf6715Thanks @haydenbleasel! - Make hibernation snapshot creation crash-safe — a retried step whose previous snapshot succeeded but was never recorded created a second snapshot and orphaned the first, billed per-GB forever; the step now adopts an existing snapshot carrying the server's deterministic description before creating a new onebcf6715Thanks @haydenbleasel! - Show the loading state while switching metric ranges on the Graphs tab — the aborted previous request was clearing the loading flag for the new in-flight one, so charts kept rendering old-range data with the new range's axis formatting until the fetch landedbcf6715Thanks @haydenbleasel! - Return 401 JSON from the middleware for unauthenticated API requests instead of redirecting to the sign-in page — fetch and EventSource consumers were following the 307 and receiving sign-in HTML with a 200, which made the route-level 401 handling (and the dashboard's signed-out detection) unreachablecf52b97Thanks @haydenbleasel! - Remove the advertised Bedrock port (19132-19133/udp) from Minecraft — the compose file runs a plain Java server that never listens on it, so the connect panel and firewall advertised a dead portbcf6715Thanks @haydenbleasel! - Allow number settings (e.g. Max players) to be cleared while retyping — the input snapped back to the previous value on backspace, so typing "1" after clearing "6" produced 61; the field now tracks the raw text while focused and commits valid numberscf52b97Thanks @haydenbleasel! - Fix Palworld difficulty options: the server only accepts None/Normal/Difficult, so the previous Easy and Hard options were silently ignoredcf52b97Thanks @haydenbleasel! - Allow partial settings updates to omit required fields that are already stored — a valid update could previously be rejected with 'X is required' even though the value was saved on the serverbcf6715Thanks @haydenbleasel! - Stop treating Hetzner 429 rate limits as permanent failures during VM creation — the adopt-or-fatal branch matched every 4xx, so a transient rate limit during provision or wake marked the server permanently failed; 429 now rethrows as retryablebcf6715Thanks @haydenbleasel! - Make rescale actually work — Hetzner's change_type requires the VM powered off, but a "stopped" Ghost server only has its game container stopped, so every rescale attempt failed with a provider error; rescaling now runs as a workflow that gracefully powers the VM off (hard poweroff as fallback), changes the type, and boots it back up, with an atomic claim so it can't race a double-click or an in-flight hibernationbcf6715Thanks @haydenbleasel! - Refresh the hardware specs on the Details tab when a rescale lands — previously only the type name ever updated, so cores/memory kept showing the old size until a hard reload; the server poll now rebuilds the specs from the catalog when the server type changes (disk preserved, matching Hetzner's keep-disk rescale)bcf6715Thanks @haydenbleasel! - Keep saved game settings visible after tab navigation — a successful save only updated the form's local state, so switching tabs and returning showed the stale pre-save values (and the 5-second poll never refreshed settings either); the save now updates the shared server context and the poll carries settings throughcf52b97Thanks @haydenbleasel! - Prevent the sign-in failure counter from becoming immortal when its expiry write is missed — the TTL is now refreshed on every failure, so a stale counter can no longer lock the owner out permanentlycf52b97Thanks @haydenbleasel! - Apply settings saved while a server is stopped: Start now sends the freshly built compose file (UPDATE_CONFIG) instead of a bare START, so the server always boots with the latest settings instead of silently reusing the stale compose on diskcf52b97Thanks @haydenbleasel! - Fix server deletion always stalling for the full 120-second drain window — the workflow polled a phase value that nothing ever set; it now watches for the agent's own 'deleting' event and proceeds as soon as the drain completescf52b97Thanks @haydenbleasel! - Distinguish a truly deleted VM (provider 404) from Hetzner's transient 'unknown' server status — a transient 'unknown' during wake or hibernate could drop the reference to a live, billed VM and orphan itcf52b97Thanks @haydenbleasel! - Make VM creation crash-safe: the VM name is reserved in the database before calling the provider, so a retried create adopts the existing VM via a unique-name conflict instead of silently creating (and billing) a second untracked one, and teardown reaps VMs known only by their reserved namecf52b97Thanks @haydenbleasel! - Power on a surviving VM when waking after a failed hibernation — the wake workflow reused the powered-off VM but nothing ever powered it on, so every wake attempt timed out and the server was stuck until deletedbcf6715Thanks @haydenbleasel! - Start the game after waking from hibernation — the container is stopped manually before the snapshot, so Docker'sunless-stoppedpolicy never brings it back on the restored VM; the wake workflow reported "running" while the game was down and the Start button was disabled. Wake now sends a fresh compose (UPDATE_CONFIG) once the agent reconnects, which also applies settings saved while hibernatedbcf6715Thanks @haydenbleasel! - Stop a deletion racing a wake (or provision retry) from leaking a billed VM — the wake step persisted the restored VM's id without checking that the server hadn't been deleted mid-create, and the provision step's cancelled path never reaped a VM known only by its reserved name; both now mirror the guarded persist-then-cleanup pattern so the orphan is deletedbcf6715Thanks @haydenbleasel! - Stop the new-server wizard's Create button from silently doing nothing when a required game setting (e.g. Don't Starve Together's cluster token) is empty — the final step now stays disabled until required settings are filled in, instead of enabling the button and swallowing the click