package.json
{
"name": "birdbrain",
"version": "1.0.1-beta.17",
"description": "Open source web investigation & capture tool",
"main": "./out/main/index.js",
"packageManager": "pnpm@10.28.2",
"author": "Matt Donovan",
"license": "MIT",
"homepage": "https://github.com/thebristolsound/birdbrain",
"engines": {
"node": ">=20.19.0"
},
"scripts": {
"dev": "electron-vite dev",
"build": "electron-vite build",
"preview": "electron-vite preview",
"postinstall": "node scripts/rebuild-native.mjs",
"rebuild:electron": "node scripts/rebuild-native.mjs",
"build:extension": "vite build --config extension/vite.config.ts && cross-env BUILD_TARGET=content vite build --config extension/vite.config.ts",
"dev:extension": "vite build --config extension/vite.config.ts --watch",
"build:verifier": "node scripts/build-verifier.mjs",
"test": "cross-env ELECTRON_RUN_AS_NODE=1 electron ./node_modules/vitest/vitest.mjs run",
"test:watch": "cross-env ELECTRON_RUN_AS_NODE=1 electron ./node_modules/vitest/vitest.mjs",
"test:coverage": "cross-env ELECTRON_RUN_AS_NODE=1 electron ./node_modules/vitest/vitest.mjs run --coverage",
"coverage:report": "node scripts/coverage-report.mjs",
"coverage:all": "node scripts/coverage-all.mjs",
"lint": "eslint . --ext .ts,.tsx",
"format": "prettier --write \"src/**/*.{ts,tsx}\" \"extension/**/*.{ts,tsx}\"",
"pretest:e2e": "pnpm build",
"test:e2e": "npx playwright test",
"test:e2e:debug": "npx playwright test --debug",
"pretest:e2e:debug": "pnpm build",
"package": "pnpm build:extension && electron-vite build && electron-builder --publish never",
"package:win": "pnpm build:extension && electron-vite build && electron-builder --win --publish never",
"package:mac": "pnpm build:extension && electron-vite build && electron-builder --mac --publish never",
"package:linux": "pnpm build:extension && electron-vite build && electron-builder --linux --publish never"
},
"build": {
"appId": "com.birdbrain.app",
"productName": "Birdbrain",
"icon": "resources/icon.png",
"protocols": [
{
"name": "Birdbrain",
"schemes": [
"birdbrain"
]
}
],
"directories": {
"output": "dist"
},
"publish": [
{
"provider": "github",
"owner": "thebristolsound",
"repo": "birdbrain"
}
],
"asarUnpack": [
"**/node_modules/sharp/**",
"**/node_modules/@img/**"
],
"extraResources": [
{
"from": "extension/dist",
"to": "extension",
"filter": [
"**/*"
]
}
],
"win": {
"target": [
"nsis"
]
},
"mac": {
"target": [
{
"target": "dmg",
"arch": [
"x64",
"arm64"
]
},
{
"target": "zip",
"arch": [
"x64",
"arm64"
]
}
]
},
"linux": {
"target": [
"AppImage",
"deb"
],
"icon": "resources/icons",
"category": "Utility",
"maintainer": "Matt Donovan <thebristolsound@users.noreply.github.com>"
}
},
"pnpm": {
"supportedArchitectures": {
"os": [
"current"
],
"cpu": [
"x64",
"arm64"
]
},
"onlyBuiltDependencies": [
"better-sqlite3",
"electron",
"esbuild",
"msw",
"sharp"
],
"overrides": {
"tar": "^7.5.16"
}
},
"dependencies": {
"@fontsource-variable/inter": "^5.2.8",
"@fontsource-variable/jetbrains-mono": "^5.2.8",
"@ghostery/adblocker-electron": "^2.18.1",
"@hono/node-server": "^1.19.14",
"@hono/zod-validator": "^0.4.3",
"@peculiar/asn1-cms": "^2.8.0",
"@peculiar/asn1-schema": "^2.8.0",
"@peculiar/asn1-tsp": "^2.8.0",
"@peculiar/asn1-x509": "^2.8.0",
"@tanstack/react-query": "^5.101.2",
"@tanstack/react-router": "^1.170.17",
"@tiptap/core": "3.29.0",
"@tiptap/pm": "3.29.0",
"@tiptap/react": "3.29.0",
"@tiptap/starter-kit": "3.29.0",
"@tiptap/static-renderer": "3.29.0",
"better-sqlite3": "^12.11.1",
"cheerio": "^1.2.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"electron-updater": "^6.8.9",
"hono": "^4.12.27",
"ioc-extractor": "^8.1.7",
"konva": "^10.3.0",
"lucide-react": "^0.577.0",
"motion": "^12.42.2",
"radix-ui": "^1.6.1",
"react-konva": "^19.2.5",
"react-markdown": "^10.1.0",
"sharp": "^0.34.5",
"tailwind-merge": "^3.6.0",
"tldts": "^7.4.6",
"use-image": "^1.1.4",
"uuid": "^14.0.1",
"zod": "^3.25.76",
"zustand": "^5.0.14"
},
"devDependencies": {
"@electron-toolkit/utils": "^4.0.0",
"@eslint/js": "^9.39.4",
"@playwright/test": "^1.61.1",
"@tailwindcss/vite": "^4.3.2",
"@tanstack/react-query-devtools": "^5.101.2",
"@tanstack/router-devtools": "^1.167.0",
"@testing-library/dom": "^10.4.1",
"@testing-library/react": "^16.3.2",
"@types/better-sqlite3": "^7.6.13",
"@types/chrome": "^0.1.43",
"@types/node": "^25.9.4",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"@types/uuid": "^10.0.0",
"@vitejs/plugin-react": "^4.7.0",
"@vitest/coverage-v8": "^3.2.6",
"cross-env": "^10.1.0",
"electron": "^39.8.10",
"electron-builder": "^26.15.3",
"electron-vite": "^3.1.0",
"esbuild": "^0.28.1",
"eslint": "^9.39.4",
"eslint-config-prettier": "^10.1.8",
"happy-dom": "^20.10.6",
"jsdom": "^29.1.1",
"node-gyp": "^12.4.0",
"postject": "1.0.0-alpha.6",
"prettier": "^3.9.4",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"shadcn": "^4.12.0",
"tailwindcss": "^4.3.2",
"typescript": "^5.9.3",
"typescript-eslint": "^8.62.1",
"vite": "^6.4.3",
"vitest": "^3.2.6"
}
}