PicThing 2.0 Dependency Audit
Read-only package-by-package review of the root workspace, three apps, and three packages.
The repo is mostly disciplined. I found 10 high-confidence removable direct declarations, one dependency ownership correction for convex, one types-only bucket move, and one global CLI reproducibility issue in packages/svix. The active runtime dependencies are generally justified by real imports.
convex belongs in webRecommended Cleanup
These have no required direct role in the current checkout. Remove them in small batches and run the existing package checks after each batch.
| Manifest | Package | Why it can go |
|---|---|---|
package.json | prettier | Root has no formatter script of its own. Every formatter-bearing workspace declares its own copy. |
package.json | prettier-plugin-svelte | Only the web config uses it, and apps/web declares it locally. |
package.json | prettier-plugin-tailwindcss | Only the web config uses it, and apps/web declares it locally. |
apps/web | @clerk/themes | No imports or config references. Clerk appearance is implemented locally. |
apps/web | @tailwindcss/typography | No Tailwind @plugin registration and no source references. |
apps/web | embla-carousel | No imports or config references. |
apps/web | embla-carousel-autoplay | No imports or config references. |
apps/web | keen-slider | No imports or config references. |
apps/raycast | typescript-eslint | No direct import. @raycast/eslint-config already declares it as a dependency. |
packages/convex | @types/bun | No Bun globals, Bun types, or types config entry in the package source. |
convexapps/web imports convex/browser and convex/server directly in three files but does not declare convex. The root install currently masks that. Add convex to apps/web first, then remove the root declaration. packages/convex already owns its separate direct declaration.
Secondary Hygiene
| Area | Finding | Recommendation |
|---|---|---|
apps/web | @types/d3 is required implicitly because d3 ships JavaScript without bundled TypeScript declarations. | Keep it, but move it from dependencies to devDependencies. |
apps/raycast | Source imports react directly, but the manifest does not. Installed @raycast/api@1.104.8 currently supplies react@19.0.0. | Treat as an ownership review, not an urgent breakage. Decide whether to follow the Raycast package convention or declare react explicitly. |
apps/raycast | Direct @types/node@25.4.0 and @types/react@19.2.14 are newer than the optional peers exposed by @raycast/api@1.104.8: 22.13.10 and 19.0.10. | Keep the types, but consider aligning versions if Raycast lint or type behavior becomes noisy. |
packages/svix | The dev script calls svix listen, but the workspace has no Node dependency or node_modules/.bin/svix. This Mac resolves /opt/homebrew/bin/svix from Homebrew svix-cli/1.86.0. | Document the external CLI prerequisite or make setup reproducible through the preferred installation path. |
Method
- Read every workspace manifest and the relevant toolchain configs.
- Scanned source, Svelte files, CSS, configs, and scripts while excluding generated caches such as
.wrangler,.convex,.svelte-kit, andnode_modules. - Compared declared dependencies against exact package references and import specifiers.
- Inspected installed package metadata where peer or transitive ownership mattered:
@effect/tsgo,@typescript/native-preview,@raycast/api,@raycast/eslint-config,convex-svelte,convex-vite-plugin,d3, andsvelte-check. - Did not run formatting, checks, builds, or dev servers because the request was read-only. Final
git status --shortandgit diff --statwere empty.
Root Workspace
package.json is primarily a shared toolchain manifest. Four declarations should stay, three formatter declarations are redundant, and convex should move to the web app.
| Dependency | Use | Verdict |
|---|---|---|
@effect/tsgo | prepare runs effect-tsgo patch; TS configs opt into @effect/language-service. | Keep Intentional compiler augmentation. |
@typescript/native-preview | Provides tsgo used by workspace checks and the VS Code native-preview setting. | Keep |
convex | Currently resolves the web app's undeclared direct imports. | Relocate Declare in web, then remove from root. |
prettier | No root formatter command; child packages declare their own copies. | Remove |
prettier-plugin-svelte | Web-only config usage with local web declaration. | Remove |
prettier-plugin-tailwindcss | Web-only config usage with local web declaration. | Remove |
turbo | Used throughout root scripts and turbo.json. | Keep |
typescript | Shared TypeScript peer for svelte-check and Raycast ESLint config; conventional TS tooling anchor. | Keep |
The root overrides for typescript-eslint, @typescript-eslint/utils, and @clerk/shared are constraints rather than direct dependencies. Keep them until the related compatibility pressure is deliberately re-tested; the Clerk store still contains a shared-version compatibility suppression.
Web App
apps/web carries 41 direct declarations. Most are justified. Five are dead declarations, @types/d3 belongs in the dev bucket, and direct convex ownership is missing.
Runtime Dependencies
| Dependency | Measured use | Verdict |
|---|---|---|
@clerk/backend | 2 server-side files: Clerk service and webhook route. | Keep |
@clerk/clerk-js | Client Clerk store initialization. | Keep |
@clerk/themes | No references. Appearance is authored locally. | Remove |
@clerk/ui | Client Clerk store passes ui into Clerk initialization. | Keep |
@lucide/svelte | Imported across 19 component and route files. | Keep |
@picthing/billing | Imported across stores, services, dashboard, and remote billing wrapper. | Keep |
@picthing/convex | Generated API and model types imported across 14 files. | Keep |
@types/d3 | Implicit typings required by d3.Selection annotations. | Move to dev |
@uploadthing/svelte | Svelte UploadThing helper generation. | Keep |
convex-svelte | Reactive Convex hooks across providers, stores, components, and routes. | Keep |
d3 | SVG background editor helper. | Keep Focused but real. |
embla-carousel | No references. | Remove |
embla-carousel-autoplay | No references. | Remove |
figma-squircle | SVG editor helper and SVG background route. | Keep |
jszip | Bulk asset download ZIP generation on /app/assets. | Keep |
keen-slider | No references. | Remove |
mode-watcher | Root layout and dashboard navigation theme toggle. | Keep |
runed | Search params, watchers, and asset-page scroll state. | Keep |
svelte-awesome-color-picker | Imported in three editing routes. | Keep |
uploadthing | Upload service, endpoint, uploader store, and tool routes. | Keep |
virtua | Asset-list virtualization on /app/assets. | Keep |
zod | Asset-store query params and UploadThing input schemas. | Keep |
Development Dependencies
| Dependency | Measured use | Verdict |
|---|---|---|
@sveltejs/adapter-node | SvelteKit adapter config. | Keep |
@sveltejs/kit | Framework config, server hooks, routes, and app utilities. | Keep |
@sveltejs/vite-plugin-svelte | vitePreprocess in Svelte config. | Keep |
@tailwindcss/typography | No references or plugin registration. | Remove |
@tailwindcss/vite | Vite Tailwind plugin. | Keep |
@types/node | Vite config uses node:path, process, and Buffer. | Keep |
clsx | Shared cn() utility. | Keep |
convex-vite-plugin | Local Convex bridge in Vite config. | Keep |
prettier | Package format and lint scripts. | Keep |
prettier-plugin-svelte | Registered in web Prettier config. | Keep |
prettier-plugin-tailwindcss | Registered in web Prettier config. | Keep |
svelte | Core app framework. | Keep |
svelte-check | Package check scripts. | Keep |
tailwind-merge | Shared cn() utility. | Keep |
tailwind-variants | Button variant construction. | Keep |
tailwindcss | CSS import and Vite integration. | Keep |
tw-animate-css | Imported by app CSS. | Keep |
vite | Dev, build, preview scripts and config. | Keep |
vite-plugin-devtools-json | Registered in Vite config. | Keep |
Raycast App
apps/raycast is lean. One direct lint declaration looks redundant. There is also a direct react import supplied transitively by @raycast/api.
| Dependency | Measured use | Verdict |
|---|---|---|
@raycast/api | Core extension UI, clipboard, toasts, actions, and ray scripts. | Keep |
@raycast/utils | useCachedPromise and useLocalStorage. | Keep |
@raycast/eslint-config | Imported by eslint.config.js. | Keep |
@types/node | Required for fs/promises, os, path, process, and Buffer. | Keep Consider version alignment. |
@types/react | Required for TSX and React hook typing. | Keep Consider version alignment. |
eslint | Required by Raycast lint tooling and local ESLint config. | Keep |
prettier | Package format script and Raycast ESLint config peer. | Keep |
typescript-eslint | No direct import; already owned by @raycast/eslint-config. | Remove Verify lint afterward. |
Image Optimizer Worker
apps/image-optimizer-worker has only three declarations and all are active.
| Dependency | Measured use | Verdict |
|---|---|---|
effect | Imported by the Worker entry point, background remover, and tagged errors. Drives HTTP, streams, errors, and control flow. | Keep |
prettier | Package format and lint scripts. | Keep |
wrangler | Deploy, dev, start, type generation scripts, JSON schema, and Worker config. | Keep |
Convex Package
packages/convex has seven declarations. The legacy migration dependencies are still live: /app/assets triggers the migration mutation, so they are not dead weight yet.
| Dependency | Measured use | Verdict |
|---|---|---|
@clerk/backend | Legacy migration action fetches user and organization data from Clerk. | Keep Remove only with migration retirement. |
@convex-dev/workpool | Convex component registration and migration queue. | Keep Remove only with migration retirement. |
@libsql/client | Legacy migration reads old Turso records. | Keep Remove only with migration retirement. |
convex | Core server functions, validators, generated bindings, config, and scripts. | Keep |
convex-helpers | Custom authenticated and bridge function wrappers. | Keep |
@types/bun | No Bun globals, Bun type imports, or TS config references. | Remove |
prettier | Package format and lint scripts. | Keep |
Billing Package
packages/billing is runtime dependency-free and exports constants plus plan-resolution helpers.
| Dependency | Measured use | Verdict |
|---|---|---|
prettier | Package format and lint scripts. | Keep |
Svix Package
packages/svix declares no dependencies. Its only script is a convenience wrapper:
svix listen http://localhost:5173/api/webhooks/clerk
That command works on this Mac because /opt/homebrew/bin/svix points to ../Cellar/svix-cli/1.86.0/bin/svix. A clean bun install does not install it.
Conservative Execution Order
- Add
convextoapps/web, remove rootconvex, then runbun run check:webandbun run check:convex. - Remove the five unused web declarations and move
@types/d3to web dev dependencies, then runbun run check:webandbun run format:web. - Remove the three root formatter duplicates, then run
bun run check:allandbun run format:all. - Remove Raycast's direct
typescript-eslint, then runbun run check:raycastand the Raycast lint script. - Remove Convex's
@types/bun, then runbun run check:convex. - Decide whether
packages/svixintentionally depends on a Homebrew-installed CLI and document that choice.