CryptoDash is a production-ready monorepo that provides both a web dashboard and Chrome extension for tracking onchain identity and crypto metrics. The architecture follows modern best practices with clean separation of concerns.
apps/
web/ → Next.js (IPFS deployment)
extension/ → WXT + React (Chrome extension)
packages/
core/ → Shared logic (chains, Blockscout, storage, types)
ui/ → Shared React components
- Why: Built into npm 7+, zero configuration overhead
- Benefits: Simple dependency management, easy local development
- Alternative considered: Turborepo (overkill for this project size)
- Why: Vite-based, minimal abstraction, designed for MV3
- Benefits: Fast builds, direct access to extension APIs, TypeScript-first
- Alternative considered: Plasmo (too much abstraction), CRXJS (less mature)
- Why: Both web and extension need identical UI/UX
- Implementation: Shared
@cryptodash/uipackage with all components - Benefits: Consistent design, single source of truth, easier maintenance
- Web: Static export to IPFS via Fleek (no server needed)
- Extension: MV3 compliant, no
'unsafe-eval'CSP - Future: Cloudflare Worker API for premium features
Purpose: Shared business logic and utilities
Contents:
- Chain configuration (
chains.ts) - Blockscout API client (
blockscout-service.ts) - Storage abstraction (
storage.ts) - Wagmi configuration (
wagmi-config.ts) - Shared TypeScript types
Dependencies:
@blockscout/app-sdk@rainbow-me/rainbowkitviemwagmi
Purpose: Shared React components
Contents:
- All 16 React components from original app
- Shared Tailwind configuration
- Component exports via barrel pattern
Dependencies:
@cryptodash/core(for business logic)@rainbow-me/rainbowkit@tanstack/react-queryframer-motionlucide-reactreactreact-domviemwagmi
Purpose: Next.js web application
Features:
- Static export for IPFS deployment
- Full dashboard experience
- Wallet connection via RainbowKit
- Real-time blockchain data
Dependencies:
@cryptodash/core@cryptodash/ui- Next.js 15.5.4
- All UI dependencies
Purpose: Chrome extension (MV3)
Features:
- New tab override (full dashboard)
- Popup interface (lightweight summary)
- Background service worker
- No
'unsafe-eval'CSP
Dependencies:
@cryptodash/core@cryptodash/ui- WXT 0.2.0
- All UI dependencies
# Install dependencies
npm install
# Start web app
npm run dev:web
# Start extension development
npm run dev:extension
# Build both
npm run build:all- Run
npm run dev:extension - Load unpacked extension from
.output/chrome-mv3/ - Test in Chrome with live reload
- Run
npm run dev:web - Access at
localhost:3000 - Hot reload for all changes
- Next.js builds to static files
- Exports to
apps/web/out/ - Deploys to IPFS via Fleek
- No server-side rendering needed
- WXT builds with Vite
- Generates MV3 manifest
- Outputs to
.output/chrome-mv3/ - No
'unsafe-eval'in CSP
- Web: Standard Next.js CSP
- Extension: Strict MV3 CSP (no
'unsafe-eval') - Shared: Components work in both environments
- Web: localStorage with TTL
- Extension: chrome.storage.local
- Abstraction:
@cryptodash/corehandles both
- API Service: Cloudflare Worker in
apps/api/ - Smart Contracts: Ethereum/Base subscription system
- Price Feeds: Pyth integration for payments
- Real-time Streaming: HyperSync integration
- Generative Art: Transaction-driven visualizations
- AI Assistant: Enhanced with real blockchain data
- ❌ 146-line build script with hacks
- ❌
'unsafe-eval'CSP compromise - ❌ Path rewriting and inline script extraction
- ❌ Framework fighting instead of feature building
- ✅ No CSP workarounds needed
- ✅ Shared components between web and extension
- ✅ Hot reload in both environments
- ✅ Clean separation of concerns
- ✅ Production-ready architecture
- ✅ Both web and extension build without CSP workarounds
- ✅ Components shared between both apps via
@cryptodash/ui - ✅ Hot reload works in both development environments
- ✅ Extension loads in Chrome without errors
- ✅ Web app deploys to IPFS via Fleek
- ✅ No more
'unsafe-eval'in manifest - ✅ Clean separation of concerns (UI, logic, apps)
This architecture provides a solid foundation for building production-ready crypto applications. The monorepo structure enables code sharing while maintaining clean boundaries between web and extension concerns. The use of WXT ensures the extension follows MV3 best practices without compromising on developer experience.