diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..3131f71
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,12 @@
+.git
+**/node_modules
+**/build
+**/.svelte-kit
+**/.vercel
+**/.netlify
+**/.wrangler
+**/dist
+.superpowers
+.remember
+docs
+apps/docs/.svelte-kit
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 23e7894..9a04a50 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,9 +1,8 @@
name: Release
# Release channel is driven by the branch you merge into:
-# main -> production (dist-tag: latest)
-# dev -> beta (dist-tag: beta) version must be a -beta.x prerelease
-# any -> next (dist-tag: next) whenever the version contains -next.x
+# main -> production (dist-tag: latest) version must be a clean x.y.z
+# dev -> next (dist-tag: next) version must be a -next.x prerelease
# A merge only publishes when the version in package.json is NOT already on npm,
# so ordinary merges that don't bump the version are no-ops.
on:
@@ -44,8 +43,8 @@ jobs:
- run: pnpm install --frozen-lockfile
# Decide the dist-tag from branch + version, or skip if this channel/version
- # combination is not allowed. Enforces: production only from main, beta only
- # from dev, next from anywhere.
+ # combination is not allowed. Enforces: production only from main, next only
+ # from dev.
- name: Resolve release channel
id: channel
working-directory: packages/sveltekit-og
@@ -55,10 +54,8 @@ jobs:
BRANCH="${GITHUB_REF_NAME}"
echo "name=$NAME"; echo "version=$VERSION"; echo "branch=$BRANCH"
- if [[ "$VERSION" == *-next.* ]]; then
+ if [[ "$BRANCH" == "dev" && "$VERSION" == *-next.* ]]; then
TAG=next
- elif [[ "$BRANCH" == "dev" && "$VERSION" == *-beta.* ]]; then
- TAG=beta
elif [[ "$BRANCH" == "main" && "$VERSION" != *-* ]]; then
TAG=latest
else
diff --git a/.node-version b/.node-version
new file mode 100644
index 0000000..a45fd52
--- /dev/null
+++ b/.node-version
@@ -0,0 +1 @@
+24
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 2dabb09..dce0e49 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -64,8 +64,7 @@ npm run format
| Branch | Version | Published to |
| ------ | ----------------- | ---------------- |
| `main` | clean (`4.4.0`) | `latest` (prod) |
-| `dev` | `-beta.x` | `beta` |
-| any | `-next.x` | `next` |
+| `dev` | `-next.x` | `next` |
Any other branch/version combination does **not** publish. A push/merge only publishes when the version is not already on npm — merges that don't bump the version are no-ops.
@@ -75,22 +74,14 @@ Bump the version with the interactive helper (it commits and pushes to the curre
pnpm release
```
-### Beta
+### Next (prerelease)
```bash
git checkout dev
-pnpm release # pick a -beta version, e.g. 4.4.0-beta.0
-```
-
-Pushing to `dev` publishes `@beta`. Install with `npm i @ethercorps/sveltekit-og@beta`.
-
-### Next (experimental preview)
-
-```bash
pnpm release # pick a -next version, e.g. 4.4.0-next.0
```
-Publishes `@next` from any branch. Use for throwaway previews you don't want on `@beta`.
+Pushing to `dev` publishes `@next`. Install with `npm i @ethercorps/sveltekit-og@next`.
### Production
diff --git a/apps/docs/.hallmark/log.json b/apps/docs/.hallmark/log.json
new file mode 100644
index 0000000..d119748
--- /dev/null
+++ b/apps/docs/.hallmark/log.json
@@ -0,0 +1,23 @@
+[
+ {
+ "date": "2026-10-08",
+ "macrostructure": "Workbench",
+ "theme": "project tokens (svecodocs rose)",
+ "enrichment": "none",
+ "brief": "sveltekit-og docs \u00b7 /docs/playground redesigned as a Workbench: toolbar, editor | live render, code drawer"
+ },
+ {
+ "date": "2026-10-08",
+ "macrostructure": "Narrative Workflow",
+ "theme": "project tokens (svecodocs rose)",
+ "enrichment": "none",
+ "brief": "sveltekit-og docs \u00b7 /docs/playground redesigned as a four-stage flow with twinkleplop highlighting"
+ },
+ {
+ "date": "2026-10-08",
+ "macrostructure": "Component Playground",
+ "theme": "project tokens (svecodocs rose)",
+ "enrichment": "none",
+ "brief": "sveltekit-og docs \u00b7 /docs/playground for the client API"
+ }
+]
diff --git a/apps/docs/.node-version b/apps/docs/.node-version
new file mode 100644
index 0000000..a45fd52
--- /dev/null
+++ b/apps/docs/.node-version
@@ -0,0 +1 @@
+24
diff --git a/apps/docs/package.json b/apps/docs/package.json
index f8eb815..5eeda45 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -48,7 +48,11 @@
"vite": "^7.2.4"
},
"dependencies": {
- "@ethercorps/sveltekit-og": "^4.3.1-next.3",
- "octokit": "^5.0.5"
+ "@ethercorps/sveltekit-og": "^4.4.0-next.2",
+ "@twinkleplop/html": "^0.1.7",
+ "@twinkleplop/theme-github": "^0.2.4",
+ "@twinkleplop/typescript": "^0.1.7",
+ "octokit": "^5.0.5",
+ "paneforge": "1.0.2"
}
}
diff --git a/apps/docs/src/app.css b/apps/docs/src/app.css
index f5e9f06..4986cbb 100644
--- a/apps/docs/src/app.css
+++ b/apps/docs/src/app.css
@@ -1,3 +1,9 @@
@import '@svecodocs/kit/theme-rose.css';
@import '@svecodocs/kit/globals.css';
@source "../node_modules/@svecodocs/kit";
+
+/* Hallmark responsive gate 34: no horizontal scroll from clipped-edge content; clip (not hidden) keeps sticky working */
+html,
+body {
+ overflow-x: clip;
+}
diff --git a/apps/docs/src/content/runtime/bun.md b/apps/docs/src/content/runtime/bun.md
new file mode 100644
index 0000000..c1272c4
--- /dev/null
+++ b/apps/docs/src/content/runtime/bun.md
@@ -0,0 +1,107 @@
+---
+title: Bun
+description: How to use SvelteKit OG with the official Bun adapter (@sveltejs/adapter-bun)
+section: Runtime
+priority: 6
+---
+
+
+
+This section details the configuration needed to run SvelteKit OG on the [Bun](https://bun.sh) runtime with the official Bun adapter (`@sveltejs/adapter-bun`). Both engines work: Satori + ReSVG take the Node code path (the wasm is read from `node_modules`), and Takumi resolves its native backend through its `bun` export condition.
+
+
{error}
+ {:else if url}
+ {example.hint}
+{INSTALL}
+Renders happen inside a module worker. Components must fail with COMPONENT_IN_WORKER.
{error}{/if}
+{#if url}- The Satori engine (no Takumi) — PNG via resvg and vector SVG, each as an HTML string, a - Svelte component, and a pre-rendered build-time image. + The Satori engine (no Takumi) — PNG via resvg and vector SVG, each as an HTML string, a Svelte + component, and a pre-rendered build-time image.
@@ -56,7 +75,11 @@ {#each section.routes as route (route.href)}
+ Rendered in your browser with @ethercorps/sveltekit-og/client — engine
+ {engine}, no server request. Only this engine's WebAssembly was downloaded.
+
{error}
+{:else if url}
+ - The Takumi engine on its own — a built-in font and multiple output formats, as an HTML - string, a Svelte component, and a pre-rendered build-time image. + The Takumi engine on its own — a built-in font and multiple output formats, as an HTML string, + a Svelte component, and a pre-rendered build-time image.
@@ -46,7 +67,11 @@ {#each section.routes as route (route.href)}