Repository navigation
chore(release): version packages - #163
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
5 times, most recently
from
November 8, 2026 11:02
d22f826 to
f93de97
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
November 8, 2026 11:51
f93de97 to
7e4e0d4
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 publish to npm yourself or setup this action to publish 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
@cloudhal/[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
471087a: Security (self-hosting, Self-host: auth hardening after the 0.6.3 review (setup token, Better Auth origins, --no-auth guard, rate-limit IP) #165). In 0.6.3 a self-hosted
cloudhal studio(the Docker image included) exposed to a network before its first sign-up could be claimed by whoever reached it first: the first account to sign up became the Owner, and nothing on the Node path asked for the setup token the Cloudflare deployment already requires. If you run 0.6.3 beyondlocalhost, upgrade and check that the Owner account is yours. In 0.6.4:cloudhal studiorequires the one-time token fromCLOUDHAL_SETUP_TOKEN(32 characters or more, letters, digits and- . _ ~only, e.g.openssl rand -hex 32; a shorter or other value stops the start) or, when that is unset, one it generates at start and prints as a…/login#setup=<token>link to its output (read it from the container's logs:docker compose logs cloudhal). Sign-up without the token is refused; once the Owner exists the link is no longer printed. An operator's own token is never printed.--hostbeyond loopback and no--base-url, Better Auth refused every sign-up, sign-in and sign-out with403 INVALID_ORIGINbecause onlyhttp://localhost:<port>was trusted. Without a public origin Studio now also trusts the origin each request was made to, as the API's own CSRF check does (on a loopback--hostonly when that origin islocalhost,127.0.0.1or[::1], so a DNS name rebound to the machine is not trusted); with--base-urlset, that origin alone (plusCLOUDHAL_TRUSTED_ORIGINS) may sign in.--base-urlis the origin browsers open Studio at: required behind a reverse proxy and recommended whenever--hostis not loopback; a start without it beyond loopback prints a one-line warning.--no-authstays on this machine. It is refused unless--hostis loopback (127.0.0.1, the default, or::1) and--behind-proxyis off.X-Forwarded-For/CF-Connecting-IPas the client sent them.serveNodenow derives the client's address itself: the socket's, or withtrustProxythe lastX-Forwarded-Forhop, which the proxy appended; the API (ApiDeps.clientAddressHeader) and Better Auth (AuthOptions.clientAddressHeader) read only that value on Node, while Workers keepCF-Connecting-IP. Sessions record that address too, and Better Auth's own limits (sign-in and sign-up: 3 per 10 s per address) now apply on Node as on Workers, stored in the project's SQLite; before they were on only underNODE_ENV=production.forwardedUrltakes the last value ofX-Forwarded-Proto/X-Forwarded-Host, the one the proxy added, not the first, which a client can send.--base-urlis also the origin of invite and password-reset links (ApiDeps.studioOrigin).cloudhal deploy: it speaks of the setup link printed when Cloudhal started or was deployed (other languages are AI drafts awaiting review).#setup=<token>without form decoding, so an operator's own token containing+(fromopenssl rand -base64, for a Cloudflare deployment too) is no longer turned into a space and refused.--behind-proxyneeds--base-url.cloudhal studiorefuses to start with--behind-proxy/CLOUDHAL_BEHIND_PROXY=1and no--base-url/CLOUDHAL_BASE_URL. Behind a proxy the public origin is known, and as Better Auth's base URL it makes session cookiesSecure(__Secure-prefix) on https and is the one origin sign-in accepts. In 0.6.3 that combination could not sign in at all, so no working setup breaks.--init-if-emptystages the scaffold in.cloudhal-initinside the folder and moves it into place withcloudhal.jsonlast, so a container stopped during its first start no longer crash-loops on "is not empty": the next start redoes the scaffold when the stagedcloudhal.jsonis missing, cut off or names no site, and finishes it otherwise. A fresh ext4 volume whose only entry islost+foundcounts as empty.--hostmeans0.0.0.0, every IPv4 address; pass--host ::for IPv6 as well. The help says so.New in
@cloudhal/api:CLIENT_ADDRESS_HEADER,clientAddressandinboundRequestin@cloudhal/api/node;trustedOriginsWithOwn(withloopbackOnly) andAuthOptions.trustedOriginsas a function in@cloudhal/api/auth;createAuthFortakessetupToken,trustRequestOriginandoriginCheck.studio()returnssetup(the link, while nobody has an account) andwarnings.Updated dependencies [b073595]
@cloudhal/[email protected]
Patch Changes
not-published(503,Retry-After: 3600,noindex) before the first publish,preview-expired(410) for a preview link that does not verify,unavailable(503) for a Worker that serves no site, anderror(500, with thecf-rayas a reference) when a render fails. The Site Worker answers them before Astro runs, every oneno-storewith its own CSP;GET /__cloudhal/healthanswers{ "ok": true, "state": "published" | "not-published" }in the admin's/api/healthshape. The page is in the request's locale (host or path prefix, then the site default, then English) for every language Studio speaks, right to left where needed, through the samepnpm i18n:export/importflow as Studio's catalogs. A theme may restyle it with an optionalstatusPageexport insrc/theme.ts(@cloudhal/astro-renderer/status-page), which falls back to the built-in page on a throw, a slow answer or an oversized document and never runs forerror;cloudhal devdraws each state at/__cloudhal/status/<state>. The blog starter's routes usestatusPage/statusPlainas their own fallback. Behaviour change: an invalid or expired preview link now answers 410 instead of silently showing the published page.@cloudhal/[email protected]
Patch Changes
471087a: Security (self-hosting, Self-host: auth hardening after the 0.6.3 review (setup token, Better Auth origins, --no-auth guard, rate-limit IP) #165). In 0.6.3 a self-hosted
cloudhal studio(the Docker image included) exposed to a network before its first sign-up could be claimed by whoever reached it first: the first account to sign up became the Owner, and nothing on the Node path asked for the setup token the Cloudflare deployment already requires. If you run 0.6.3 beyondlocalhost, upgrade and check that the Owner account is yours. In 0.6.4:cloudhal studiorequires the one-time token fromCLOUDHAL_SETUP_TOKEN(32 characters or more, letters, digits and- . _ ~only, e.g.openssl rand -hex 32; a shorter or other value stops the start) or, when that is unset, one it generates at start and prints as a…/login#setup=<token>link to its output (read it from the container's logs:docker compose logs cloudhal). Sign-up without the token is refused; once the Owner exists the link is no longer printed. An operator's own token is never printed.--hostbeyond loopback and no--base-url, Better Auth refused every sign-up, sign-in and sign-out with403 INVALID_ORIGINbecause onlyhttp://localhost:<port>was trusted. Without a public origin Studio now also trusts the origin each request was made to, as the API's own CSRF check does (on a loopback--hostonly when that origin islocalhost,127.0.0.1or[::1], so a DNS name rebound to the machine is not trusted); with--base-urlset, that origin alone (plusCLOUDHAL_TRUSTED_ORIGINS) may sign in.--base-urlis the origin browsers open Studio at: required behind a reverse proxy and recommended whenever--hostis not loopback; a start without it beyond loopback prints a one-line warning.--no-authstays on this machine. It is refused unless--hostis loopback (127.0.0.1, the default, or::1) and--behind-proxyis off.X-Forwarded-For/CF-Connecting-IPas the client sent them.serveNodenow derives the client's address itself: the socket's, or withtrustProxythe lastX-Forwarded-Forhop, which the proxy appended; the API (ApiDeps.clientAddressHeader) and Better Auth (AuthOptions.clientAddressHeader) read only that value on Node, while Workers keepCF-Connecting-IP. Sessions record that address too, and Better Auth's own limits (sign-in and sign-up: 3 per 10 s per address) now apply on Node as on Workers, stored in the project's SQLite; before they were on only underNODE_ENV=production.forwardedUrltakes the last value ofX-Forwarded-Proto/X-Forwarded-Host, the one the proxy added, not the first, which a client can send.--base-urlis also the origin of invite and password-reset links (ApiDeps.studioOrigin).cloudhal deploy: it speaks of the setup link printed when Cloudhal started or was deployed (other languages are AI drafts awaiting review).#setup=<token>without form decoding, so an operator's own token containing+(fromopenssl rand -base64, for a Cloudflare deployment too) is no longer turned into a space and refused.--behind-proxyneeds--base-url.cloudhal studiorefuses to start with--behind-proxy/CLOUDHAL_BEHIND_PROXY=1and no--base-url/CLOUDHAL_BASE_URL. Behind a proxy the public origin is known, and as Better Auth's base URL it makes session cookiesSecure(__Secure-prefix) on https and is the one origin sign-in accepts. In 0.6.3 that combination could not sign in at all, so no working setup breaks.--init-if-emptystages the scaffold in.cloudhal-initinside the folder and moves it into place withcloudhal.jsonlast, so a container stopped during its first start no longer crash-loops on "is not empty": the next start redoes the scaffold when the stagedcloudhal.jsonis missing, cut off or names no site, and finishes it otherwise. A fresh ext4 volume whose only entry islost+foundcounts as empty.--hostmeans0.0.0.0, every IPv4 address; pass--host ::for IPv6 as well. The help says so.New in
@cloudhal/api:CLIENT_ADDRESS_HEADER,clientAddressandinboundRequestin@cloudhal/api/node;trustedOriginsWithOwn(withloopbackOnly) andAuthOptions.trustedOriginsas a function in@cloudhal/api/auth;createAuthFortakessetupToken,trustRequestOriginandoriginCheck.studio()returnssetup(the link, while nobody has an account) andwarnings.b073595: Status pages (RFC-0043 §1, Status pages: a real page instead of plain text before the first publish (and other site states) #117). A site that cannot show its pages answers with one small, translated, self-contained page instead of plain text:
not-published(503,Retry-After: 3600,noindex) before the first publish,preview-expired(410) for a preview link that does not verify,unavailable(503) for a Worker that serves no site, anderror(500, with thecf-rayas a reference) when a render fails. The Site Worker answers them before Astro runs, every oneno-storewith its own CSP;GET /__cloudhal/healthanswers{ "ok": true, "state": "published" | "not-published" }in the admin's/api/healthshape. The page is in the request's locale (host or path prefix, then the site default, then English) for every language Studio speaks, right to left where needed, through the samepnpm i18n:export/importflow as Studio's catalogs. A theme may restyle it with an optionalstatusPageexport insrc/theme.ts(@cloudhal/astro-renderer/status-page), which falls back to the built-in page on a throw, a slow answer or an oversized document and never runs forerror;cloudhal devdraws each state at/__cloudhal/status/<state>. The blog starter's routes usestatusPage/statusPlainas their own fallback. Behaviour change: an invalid or expired preview link now answers 410 instead of silently showing the published page.Updated dependencies [471087a]
@cloudhal/[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
@cloudhal/[email protected]
No changes in this release.