Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Use Bun with Alpine for smaller base image
FROM oven/bun:1.2-alpine AS base
FROM oven/bun:1.3-alpine AS base

# Install dependencies for building
FROM base AS deps
Expand Down
752 changes: 429 additions & 323 deletions bun.lock

Large diffs are not rendered by default.

36 changes: 25 additions & 11 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,16 +1,30 @@
import { dirname } from 'path';
import { fileURLToPath } from 'url';
import { FlatCompat } from '@eslint/eslintrc';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const compat = new FlatCompat({
baseDirectory: __dirname,
});
import nextCoreWebVitals from 'eslint-config-next/core-web-vitals';
import nextTypescript from 'eslint-config-next/typescript';

const eslintConfig = [
...compat.extends('next/core-web-vitals', 'next/typescript'),
{
ignores: ['eslint.config.mjs'],
},
Comment on lines +5 to +7
...nextCoreWebVitals,
...nextTypescript,
{
settings: {
react: {
version: '19.2',
},
},
rules: {
// These two rules were newly enabled by eslint-plugin-react-hooks@7,
// which ships with eslint-config-next@16 (Next.js 16 upgrade). They flag
// ~20 pre-existing, idiomatic sites (e.g. `setMounted(true)` hydration
// guards, FocusTimer's interdependent timer state, self-referencing retry
// callbacks) — none are bugs introduced by the upgrade. Disabled here to
// keep the dependency bump free of behavior-sensitive refactors; tracked
// for a dedicated follow-up to enforce incrementally. See PR/upgrade notes.
'react-hooks/set-state-in-effect': 'off',
'react-hooks/immutability': 'off',
},
},
];

export default eslintConfig;
10 changes: 0 additions & 10 deletions next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,6 @@ const nextConfig: NextConfig = {
},
],
},
{
// Cache static assets with long expiry but allow revalidation
source: '/_next/static/:path*',
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=31536000, immutable',
},
],
},
{
// Don't cache HTML pages aggressively to prevent chunk mismatch
source: '/((?!_next/static|favicon.ico).*)',
Expand Down
85 changes: 42 additions & 43 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@
],
"private": true,
"scripts": {
"dev": "next dev --turbopack",
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"lint": "eslint",
"format": "prettier --write .",
"format:check": "prettier --check .",
"db:generate": "bunx drizzle-kit generate",
Expand All @@ -35,53 +35,52 @@
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@radix-ui/react-alert-dialog": "^1.1.14",
"@radix-ui/react-checkbox": "^1.3.2",
"@radix-ui/react-dialog": "^1.1.14",
"@radix-ui/react-dropdown-menu": "^2.1.15",
"@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-popover": "^1.1.14",
"@radix-ui/react-progress": "^1.1.7",
"@radix-ui/react-select": "^2.2.5",
"@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-tabs": "^1.1.12",
"@radix-ui/react-tooltip": "^1.2.7",
"better-auth": "^1.3.4",
"@radix-ui/react-alert-dialog": "^1.1.16",
"@radix-ui/react-checkbox": "^1.3.4",
"@radix-ui/react-dialog": "^1.1.16",
"@radix-ui/react-dropdown-menu": "^2.1.17",
"@radix-ui/react-label": "^2.1.9",
"@radix-ui/react-popover": "^1.1.16",
"@radix-ui/react-progress": "^1.1.9",
"@radix-ui/react-select": "^2.3.0",
"@radix-ui/react-slot": "^1.2.5",
"@radix-ui/react-tabs": "^1.1.14",
"@radix-ui/react-tooltip": "^1.2.9",
"better-auth": "^1.6.14",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
"date-fns": "^4.4.0",
"date-fns-tz": "^3.2.0",
"drizzle-orm": "^0.44.6",
"framer-motion": "^12.23.11",
"ioredis": "^5.6.1",
"lucide-react": "^0.525.0",
"nanoid": "^5.1.5",
"next": "15.3.6",
"drizzle-orm": "^0.45.2",
"framer-motion": "^12.40.0",
"ioredis": "^5.11.1",
"lucide-react": "^1.17.0",
"nanoid": "^5.1.11",
"next": "16.2.7",
"next-themes": "^0.4.6",
"postgres": "^3.4.7",
"posthog-js": "^1.258.2",
"posthog-node": "^5.6.0",
"react": "^19.1.1",
"react-day-picker": "^9.8.1",
"react-dom": "^19.1.1",
"tailwind-merge": "^3.3.1",
"zod": "^4.0.11",
"zustand": "^5.0.6"
"postgres": "^3.4.9",
"posthog-js": "^1.381.0",
"posthog-node": "^5.36.3",
"react": "^19.2.7",
"react-day-picker": "^9.14.0",
"react-dom": "^19.2.7",
"tailwind-merge": "^3.6.0",
"zod": "^4.4.3",
"zustand": "^5.0.14"
},
"devDependencies": {
"@eslint/eslintrc": "^3.3.1",
"@tailwindcss/postcss": "^4.1.11",
"@tailwindcss/postcss": "^4.3.0",
"@types/ioredis": "^5.0.0",
"@types/node": "^20.19.9",
"@types/pg": "^8.15.5",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"drizzle-kit": "^0.31.4",
"eslint": "^9.32.0",
"eslint-config-next": "15.3.4",
"prettier": "^3.6.2",
"tailwindcss": "^4.1.11",
"tsx": "^4.20.3",
"typescript": "^5.8.3"
"@types/node": "^24.13.1",
"@types/pg": "^8.20.0",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"drizzle-kit": "^0.31.10",
"eslint": "^10.4.1",
"eslint-config-next": "16.2.7",
"prettier": "^3.8.3",
"tailwindcss": "^4.3.0",
"tsx": "^4.22.4",
"typescript": "^6.0.3"
}
}
19 changes: 14 additions & 5 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
Expand All @@ -11,23 +15,28 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"jsx": "react-jsx",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./src/*"]
"@/*": [
"./src/*"
]
}
},
"include": [
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
"next-env.d.ts",
"out/types/**/*.ts"
"out/types/**/*.ts",
".next/dev/types/**/*.ts"
],
"exclude": ["node_modules"]
"exclude": [
"node_modules"
]
}