package.json
{
"name": "syllo",
"version": "1.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"start": "node server.mjs",
"lint": "eslint .",
"typecheck": "tsc --noEmit",
"typecheck:convex": "tsc -p convex/tsconfig.json",
"convex:dev": "convex dev",
"convex:auth-prepare": "node scripts/prepare-convex-auth.mjs",
"test": "vitest run",
"test:watch": "vitest"
},
"dependencies": {
"@ai-sdk/google": "4.0.101",
"@ai-sdk/openai": "4.0.98",
"@auth/core": "0.41.3",
"@convex-dev/auth": "0.0.96",
"@fontsource-variable/geist": "5.3.0",
"@fontsource-variable/geist-mono": "5.3.0",
"@modelcontextprotocol/sdk": "1.32.1",
"@radix-ui/react-alert-dialog": "1.1.15",
"@radix-ui/react-select": "2.2.6",
"@radix-ui/react-separator": "1.1.8",
"@radix-ui/react-slot": "1.2.4",
"@radix-ui/react-switch": "1.2.6",
"@tanstack/react-router": "1.170.45",
"@tanstack/react-start": "1.169.3",
"ai": "7.0.147",
"better-sqlite3": "13.0.3",
"class-variance-authority": "0.7.1",
"clsx": "2.1.1",
"convex": "1.47.0",
"cross-spawn": "7.0.6",
"epubjs": "0.3.93",
"framer-motion": "12.34.5",
"lucide-react": "0.576.0",
"motion": "12.35.1",
"openai": "6.27.0",
"react": "19.2.4",
"react-dom": "19.2.4",
"sonner": "2.0.7",
"tailwind-merge": "3.5.0",
"ts-fsrs": "5.4.2",
"zod": "4.6.7"
},
"devDependencies": {
"@eslint/js": "9.39.5",
"@tailwindcss/vite": "4.3.3",
"@tanstack/router-plugin": "1.168.47",
"@types/better-sqlite3": "7.6.13",
"@types/cross-spawn": "6.0.6",
"@types/node": "24.19.2",
"@types/react": "19.3.0",
"@types/react-dom": "19.3.0",
"@types/youtube": "0.3.0",
"@vitejs/plugin-react": "6.1.2",
"@xmldom/xmldom": "0.9.12",
"eslint": "9.39.5",
"eslint-plugin-jsx-a11y": "6.10.2",
"eslint-plugin-react-hooks": "7.1.1",
"fake-indexeddb": "6.2.6",
"globals": "17.13.0",
"happy-dom": "21.0.4",
"jszip": "3.10.2",
"tailwindcss": "4.3.3",
"typescript": "5.9.3",
"typescript-eslint": "8.72.0",
"vite": "8.3.4",
"vitest": "4.1.12"
},
"overrides": {
"epubjs": {
"@xmldom/xmldom": "0.9.12"
}
}
}