diff --git a/.changeset/breezy-apricots-leave.md b/.changeset/breezy-apricots-leave.md
new file mode 100644
index 00000000..2f553d56
--- /dev/null
+++ b/.changeset/breezy-apricots-leave.md
@@ -0,0 +1,5 @@
+---
+"stackspulse": patch
+---
+
+Upgrade to next.js 15.
diff --git a/apps/server/package.json b/apps/server/package.json
index c15a170f..ae0211ed 100644
--- a/apps/server/package.json
+++ b/apps/server/package.json
@@ -10,7 +10,7 @@
"deploy": "fly deploy --remote-only"
},
"dependencies": {
- "@dotenvx/dotenvx": "1.21.0",
+ "@dotenvx/dotenvx": "1.25.1",
"@libsql/client": "0.8.0",
"@sentry/node": "8.35.0",
"@stacks/blockchain-api-client": "8.1.2",
@@ -20,7 +20,7 @@
"drizzle-orm": "0.33.0",
"h3": "1.13.0",
"nitro-cors": "0.7.1",
- "postgres": "3.4.4",
+ "postgres": "3.4.5",
"twitter-api-v2": "1.17.1",
"unstorage": "1.12.0",
"zod": "3.23.8",
diff --git a/apps/web/next.config.mjs b/apps/web/next.config.ts
similarity index 85%
rename from apps/web/next.config.mjs
rename to apps/web/next.config.ts
index 4bbd452f..23b6827d 100644
--- a/apps/web/next.config.mjs
+++ b/apps/web/next.config.ts
@@ -1,7 +1,7 @@
import { withSentryConfig } from "@sentry/nextjs";
+import type { NextConfig } from "next";
-/** @type {import('next').NextConfig} */
-const nextConfig = {
+const nextConfig: NextConfig = {
output: "standalone",
images: {
remotePatterns: [
diff --git a/apps/web/package.json b/apps/web/package.json
index 6d91da0a..8f159ae1 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -10,43 +10,44 @@
"deploy": "fly deploy --remote-only"
},
"dependencies": {
- "@dotenvx/dotenvx": "1.21.0",
+ "@dotenvx/dotenvx": "1.25.1",
"@hirosystems/token-metadata-api-client": "2.0.0",
"@radix-ui/themes": "3.0.5",
- "@sentry/nextjs": "8.35.0",
+ "@sentry/nextjs": "8.41.0",
"@stacks/stacks-blockchain-api-types": "7.14.1",
"@stacks/transactions": "6.17.0",
"@stackspulse/protocols": "workspace:*",
"@t3-oss/env-core": "0.11.1",
"@t3-oss/env-nextjs": "0.11.1",
- "@tabler/icons-react": "3.20.0",
- "@tanstack/react-query": "5.59.16",
- "class-variance-authority": "0.7.0",
+ "@tabler/icons-react": "3.23.0",
+ "@tanstack/react-query": "5.61.5",
+ "class-variance-authority": "0.7.1",
"clsx": "2.1.1",
"date-fns": "4.1.0",
"fathom-client": "3.7.2",
"javascript-time-ago": "2.5.11",
- "next": "14.2.15",
+ "next": "15.0.3",
"react": "18.3.1",
"react-dom": "18.3.1",
- "recharts": "2.13.0-alpha.4",
+ "react-is": "18.3.1",
+ "recharts": "2.13.3",
"sharp": "0.33.5",
- "tailwind-merge": "2.5.4",
+ "tailwind-merge": "2.5.5",
"tailwindcss-animate": "1.0.7",
"unstorage": "1.12.0",
"zod": "3.23.8"
},
"devDependencies": {
- "@types/node": "22.8.1",
+ "@types/node": "22.10.1",
"@types/react": "18.3.12",
"@types/react-dom": "18.3.1",
"autoprefixer": "10.4.20",
- "eslint": "8.57.0",
- "eslint-config-next": "14.2.15",
+ "eslint": "9.15.0",
+ "eslint-config-next": "15.0.3",
"eslint-plugin-tailwindcss": "3.17.5",
- "postcss": "8.4.47",
+ "postcss": "8.4.49",
"radix-themes-tw": "0.2.3",
- "tailwindcss": "3.4.14",
- "typescript": "5.6.3"
+ "tailwindcss": "3.4.15",
+ "typescript": "5.7.2"
}
}
diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx
index e60ddcb9..eea794c5 100644
--- a/apps/web/src/app/layout.tsx
+++ b/apps/web/src/app/layout.tsx
@@ -36,7 +36,6 @@ export default function RootLayout({
suppressHydrationWarning
className={`${font.variable} font-sans antialiased`}
>
-
@@ -44,6 +43,7 @@ export default function RootLayout({
+