FinBoard is a configurable, real-time finance dashboard that allows users to build their own monitoring workspace by connecting to multiple financial APIs and visualizing data through customizable widgets.
The project focuses on scalability, performance, and flexibility, enabling non-technical users to create dashboards without hardcoding API structures.
- Widget-based architecture (Cards, Tables, Charts)
- API-agnostic data mapping (dynamic JSON field selection)
- Auto-refresh per widget
- Drag & drop dashboard layout
- Persistent dashboard state
- Export / Import dashboard configuration
- Dark / Light theme with persistence
- API caching & rate limiting
FinBoard follows a layered, configuration-driven architecture:
User Interaction
↓
UI Components (Widgets, Modals, Navbar)
↓
Zustand State Stores
↓
Data Fetching & Caching Layer
↓
External Financial APIs (Finnhub, Custom APIs)
👉 For full details, see ARCHITECTURE.md
frontend/
├── app/ # Next.js App Router
│ │── layout.tsx
│ │── page.tsx
│ │── globals.css
│
│ ├── components/
│ │ ├── layout/
│ │ │ ├── Navbar.tsx
│ │ │ └── TemplateModal.tsx
│ │ │
│ │ ├── widget/
│ │ │ ├── AddWidget.tsx
│ │ │ ├── AddWidgetModal.tsx
│ │ │ ├── DataWidget.tsx
│ │ │ ├── DraggableWidget.tsx
│ │ │ ├── EmptyDashboard.tsx
│ │ │ ├── WidgetCard.tsx
│ │ │ └── StockChart.tsx
│ │ │
│ │ ├── ui/
│ │ │ ├── ModernTable.tsx
│ │ │ ├── Modal.tsx
│ │ │ ├── Button.tsx
│ │ │ └── ThemeToggle.tsx
│ │ │
│ │ └── ThemeProvider.tsx
│
│ ├── store/ # Zustand stores
│ │ ├── WidgetStore.ts
│ │ └── themeStore.ts
│
│ ├── utils/ # Core logic
│ │ ├── apiCache.ts
│ │ └── dataMapper.ts
│
│
├── public/ # Static assets & screenshots
│
├── ARCHITECTURE.md
├── README.md
├── package.json
└── tsconfig.json
-
Add, remove, update widgets
-
Supported widget types:
- Card – Key metrics
- Table – Multi-row financial data
- Chart – Line / price charts
-
Drag & drop reordering
-
Per-widget refresh interval
-
Supports:
- Finnhub (pre-integrated endpoints)
- Custom public APIs
-
Dynamic JSON field explorer
-
Path-based data extraction (
metric.peRatio,quote.c, etc.) -
API response normalization
- Per-widget polling
- TTL-based API caching
- Request deduplication
- Domain-level rate limiting
- Error isolation per widget
- Widget configuration saved automatically
- Dashboard restored on refresh
- Export dashboard as JSON
- Import dashboard from JSON file
- Fully responsive layout
- Skeleton loading states
- Error handling & retry hints
- Mobile-friendly navigation
- Theme toggle (Dark / Light)
- Next.js (App Router)
- TypeScript
- React
- Tailwind CSS
- Zustand (primary)
- Local persistence with
zustand/persist
- Recharts
- Chart.js
- Custom API cache & rate limiter
- Dynamic data mapper
- Create a free account at https://finnhub.io
- Generate an API key
- Add to
.env.local:
NEXT_PUBLIC_FINNHUB_API_KEY=your_api_key_here
⚠️ API keys are never committed to the repository.
git clone https://github.com/your-username/financial_Dashboard.git
cd financial Dashboardnpm installnpm run devApp will be available at:
http://localhost:3000
- Export: Download current dashboard configuration as JSON
- Import: Upload JSON file to restore dashboard
- Includes widget order, configuration, and settings
- API rate-limit detection
- Invalid API URL handling
- Partial widget failures do not crash dashboard
- Import validation for corrupted JSON
- Zustand over Redux → less boilerplate, UI-focused state
- Adapter-style data mapping → API-agnostic widgets
- Widget-level isolation → scalable & fault tolerant
- Client-first architecture → fast iteration & UX
Shubham Yadav
