The container-only harness was measuring the wrong thing. Real usage — several tabs, several boards, clicking into widgets — reaches ~880 MB server and a 650 MB *browser* heap, and the browser was never measured at all. Profiling build: `docker build --build-arg HOMARR_PROFILING=true . -t homarr:performance`. React's production bundle strips the hooks DevTools needs, hence "Profiling not supported". Note reactProductionProfiling in next.config is read only by the webpack path; under Turbopack it comes from `next build --profile`, and turbo strips any env var not declared in the task's `env`, so all three had to line up before the flag actually took effect — verified by markers present only in React's profiling bundle, and static chunks going 20 -> 84 MB with source maps. inspect-container.mts attaches to an already-running container (SIGUSR1 opens Node's inspector — no rebuild, no restart), reports cgroup/per-process/V8 memory and can pull a heap snapshot out over CDP. The inspected context has no require and no dynamic import, so it reads globals and uses CDP domains instead. analyze-heapsnapshot / analyze-react-fibers / analyze-heap-retainers summarise a snapshot too large for DevTools to open. Harness now opens STRESS_BOARDS across STRESS_TABS_PER_BOARD tabs, clicks into widgets, and records browser heap, DOM nodes and listener count via CDP. Performance.getMetrics silently returns nothing unless the domain is enabled, which is why the first run reported a 0 MiB client heap.
121 lines
4.2 KiB
JSON
121 lines
4.2 KiB
JSON
{
|
|
"name": "@homarr/nextjs",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"build": "HOMARR_VERSION=$(node -p \"require('../../package.json').version\") pnpm with-env next build $([ \"$HOMARR_PROFILING\" = \"true\" ] && echo --profile)",
|
|
"clean": "git clean -xdf .next .turbo node_modules",
|
|
"dev": "pnpm with-env next dev",
|
|
"format": "oxfmt .",
|
|
"lint": "oxlint",
|
|
"start": "pnpm with-env next start",
|
|
"typecheck": "tsc --noEmit",
|
|
"with-env": "dotenv -e ../../.env --"
|
|
},
|
|
"dependencies": {
|
|
"@dnd-kit/core": "catalog:",
|
|
"@dnd-kit/modifiers": "catalog:",
|
|
"@dnd-kit/sortable": "catalog:",
|
|
"@dnd-kit/utilities": "catalog:",
|
|
"@gfazioli/mantine-onboarding-tour": "catalog:",
|
|
"@homarr/analytics": "workspace:^0.1.0",
|
|
"@homarr/api": "workspace:^0.1.0",
|
|
"@homarr/auth": "workspace:^0.1.0",
|
|
"@homarr/boards": "workspace:^0.1.0",
|
|
"@homarr/common": "workspace:^0.1.0",
|
|
"@homarr/core": "workspace:^0.1.0",
|
|
"@homarr/cron-job-status": "workspace:^0.1.0",
|
|
"@homarr/db": "workspace:^0.1.0",
|
|
"@homarr/definitions": "workspace:^0.1.0",
|
|
"@homarr/docker": "workspace:^0.1.0",
|
|
"@homarr/form": "workspace:^0.1.0",
|
|
"@homarr/forms-collection": "workspace:^0.1.0",
|
|
"@homarr/gridstack": "catalog:",
|
|
"@homarr/icons": "workspace:^0.1.0",
|
|
"@homarr/image-proxy": "workspace:^0.1.0",
|
|
"@homarr/integrations": "workspace:^0.1.0",
|
|
"@homarr/modals": "workspace:^0.1.0",
|
|
"@homarr/modals-collection": "workspace:^0.1.0",
|
|
"@homarr/notifications": "workspace:^0.1.0",
|
|
"@homarr/old-import": "workspace:^0.1.0",
|
|
"@homarr/old-schema": "workspace:^0.1.0",
|
|
"@homarr/redis": "workspace:^0.1.0",
|
|
"@homarr/server-settings": "workspace:^0.1.0",
|
|
"@homarr/settings": "workspace:^0.1.0",
|
|
"@homarr/spotlight": "workspace:^0.1.0",
|
|
"@homarr/tasks": "workspace:^0.1.0",
|
|
"@homarr/translation": "workspace:^0.1.0",
|
|
"@homarr/ui": "workspace:^0.1.0",
|
|
"@homarr/validation": "workspace:^0.1.0",
|
|
"@homarr/websocket": "workspace:^0.1.0",
|
|
"@homarr/widgets": "workspace:^0.1.0",
|
|
"@mantine/colors-generator": "catalog:",
|
|
"@mantine/core": "catalog:",
|
|
"@mantine/dropzone": "catalog:",
|
|
"@mantine/hooks": "catalog:",
|
|
"@mantine/modals": "catalog:",
|
|
"@mantine/tiptap": "catalog:",
|
|
"@modelcontextprotocol/sdk": "catalog:",
|
|
"@scalar/api-reference-react": "catalog:",
|
|
"@tabler/icons-react": "catalog:",
|
|
"@tanstack/react-devtools": "catalog:",
|
|
"@tanstack/react-query": "catalog:",
|
|
"@tanstack/react-query-devtools": "catalog:",
|
|
"@tanstack/react-query-next-experimental": "catalog:",
|
|
"@trpc/client": "catalog:",
|
|
"@trpc/next": "catalog:",
|
|
"@trpc/react-query": "catalog:",
|
|
"@trpc/server": "catalog:",
|
|
"@xterm/addon-canvas": "catalog:",
|
|
"@xterm/addon-fit": "catalog:",
|
|
"@xterm/xterm": "catalog:",
|
|
"adm-zip": "catalog:",
|
|
"babel-plugin-react-compiler": "catalog:",
|
|
"better-sqlite3": "catalog:",
|
|
"chroma-js": "catalog:",
|
|
"clsx": "catalog:",
|
|
"dayjs": "catalog:",
|
|
"dompurify": "catalog:",
|
|
"dotenv": "catalog:",
|
|
"drizzle-orm": "catalog:",
|
|
"flag-icons": "catalog:",
|
|
"glob": "catalog:",
|
|
"jotai": "catalog:",
|
|
"jszip": "catalog:",
|
|
"linkedom": "catalog:",
|
|
"lucide-react": "catalog:",
|
|
"mantine-datatable": "catalog:",
|
|
"mantine-react-table": "catalog:",
|
|
"mcp-handler": "catalog:",
|
|
"next": "catalog:",
|
|
"postcss-preset-mantine": "catalog:",
|
|
"posthog-js": "catalog:",
|
|
"prismjs": "catalog:",
|
|
"react": "catalog:",
|
|
"react-dom": "catalog:",
|
|
"react-error-boundary": "catalog:",
|
|
"react-simple-code-editor": "catalog:",
|
|
"sass": "catalog:",
|
|
"sql.js": "catalog:",
|
|
"superjson": "catalog:",
|
|
"trpc-to-mcp": "catalog:",
|
|
"use-deep-compare-effect": "catalog:",
|
|
"yaml": "catalog:",
|
|
"zod": "catalog:"
|
|
},
|
|
"devDependencies": {
|
|
"@homarr/tsconfig": "workspace:^0.1.0",
|
|
"@types/adm-zip": "catalog:",
|
|
"@types/better-sqlite3": "catalog:",
|
|
"@types/chroma-js": "catalog:",
|
|
"@types/node": "catalog:",
|
|
"@types/prismjs": "catalog:",
|
|
"@types/react": "catalog:",
|
|
"@types/react-dom": "catalog:",
|
|
"concurrently": "catalog:",
|
|
"node-loader": "catalog:",
|
|
"typescript": "catalog:"
|
|
}
|
|
}
|