diff --git a/package.json b/package.json
index f7c6a5f..6ac4583 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "wrnexus",
-  "version": "0.8.3",
+  "version": "0.8.4",
   "private": true,
   "type": "module",
   "description": "An SSR-first full-stack web framework with server-rendered reactive components. Bun-first, Node-friendly.",
diff --git a/packages/language-server/src/server.ts b/packages/language-server/src/server.ts
index c27baa7..974d966 100644
--- a/packages/language-server/src/server.ts
+++ b/packages/language-server/src/server.ts
@@ -102,7 +102,7 @@ async function handle(message: JsonRpc): Promise<void> {
     case "initialize":
       workspaceRoot = params.rootPath ?? rootFromUri(params.rootUri);
       result(message.id, {
-        serverInfo: { name: "WRNexus Language Server", version: "0.8.3" },
+        serverInfo: { name: "WRNexus Language Server", version: "0.8.4" },
         capabilities: {
           textDocumentSync: 1,
           documentFormattingProvider: true,
diff --git a/update-package-versions.mjs b/update-package-versions.mjs
index 318b962..8b70170 100644
--- a/update-package-versions.mjs
+++ b/update-package-versions.mjs
@@ -1,7 +1,17 @@
 import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
 import { join } from "node:path";
+import process from "node:process";
 
-const version = "0.8.3";
+const version = process.argv[2] ?? "0.8.4";
+
+if (!/^0\.8\.\d+$/.test(version)) {
+  throw new Error(`Expected a 0.8.x version, received ${JSON.stringify(version)}`);
+}
+
+const rootPackageFile = "package.json";
+const rootPackage = JSON.parse(readFileSync(rootPackageFile, "utf8"));
+rootPackage.version = version;
+writeFileSync(rootPackageFile, `${JSON.stringify(rootPackage, null, 2)}\n`);
 
 const dependencyGroups = [
   "dependencies",
@@ -62,6 +72,15 @@ for (const entry of readdirSync("packages", {
   writeFileSync(packageFile, `${JSON.stringify(packageJson, null, 2)}\n`);
 }
 
+const languageServerFile = join("packages", "language-server", "src", "server.ts");
+if (existsSync(languageServerFile)) {
+  const source = readFileSync(languageServerFile, "utf8").replace(
+    /serverInfo: \{ name: "WRNexus Language Server", version: "[^"]+" \}/,
+    `serverInfo: { name: "WRNexus Language Server", version: "${version}" }`,
+  );
+  writeFileSync(languageServerFile, source);
+}
+
 const editorPackageFile = join("editors", "vscode", "package.json");
 if (existsSync(editorPackageFile)) {
   const editorPackage = JSON.parse(readFileSync(editorPackageFile, "utf8"));
