Open-Source OpenBB Workspace Frontend Application - A Financial Analysis Workbench Built for Individual Users
Finanalyzer App is the frontend component of the Finanalyzer project, a modern financial analysis workbench built with React + TypeScript. It fully complies with OpenBB Workspace architecture standards, providing individual users with a more flexible and open alternative.
- β Fully Open Source - Transparent code, free customization
- β Chinese-Friendly - Built-in bilingual support (Chinese/English)
- β Unrestricted Functionality - HTML Widget supports JavaScript, unlocking unlimited possibilities
- β Debug Widget - Developer-friendly, easy data inspection
- β AI Integration - Integrated Claude Code / OpenCode for intelligent analysis
- β Ecosystem Compatible - Seamless integration with OpenBB ecosystem
Finanalyzer frontend adopts the same technology stack as OpenBB ODP Desktop App:
- React 18 + TypeScript - Stable and reliable
- TanStack Router (v1.131) - Modern routing
- @openbb/ui - OpenBB-consistent UI styles (open-source version)
- TailwindCSS (v3.4) - Rapid styling
- React Markdown - Markdown rendering support
- Vite 7 - Lightning-fast build
- ESLint + TypeScript ESLint - Code quality assurance
- Node.js: Version 18.0 or higher
- npmΒ or pnpm: Latest stable version (pnpm recommended)
- Git: Version 2.30 or higher
- Modern Browser: Chrome, Firefox, Edge, or Safari (latest versions)
Verify your environment:
node --version # >= 18.0
npm --version
git --version- Clone the Repository
git clone https://github.com/finanalyzer/app.git finanalyzer-app
cd finanalyzer-app- Install Dependencies
# Using npm
npm install
# Or using pnpm (recommended)
pnpm install- Configure Environment Variables
Create a .env file:
cp .env.example .env # If .env.example existsEdit the .env file:
# Backend API base URL (required when connecting to remote backend)
VITE_API_BASE_URL=https://your-backend.example.com
# Application title (optional)
VITE_APP_TITLE=Finanalyzer
# Proxy configuration (optional, for development)
VITE_PROXY_PATH=/api
VITE_PROXY_TARGET_URL=http://localhost:8001Environment Variables:
| Variable | Required | Description |
|---|---|---|
VITE_API_BASE_URL |
No* | Backend API base URL. Leave empty for local dev with Vite proxy |
VITE_APP_TITLE |
No | Application title displayed in browser tab |
VITE_PROXY_PATH |
No | Development proxy path (e.g., /api) |
VITE_PROXY_TARGET_URL |
No | Proxy target URL (e.g., http://localhost:8001) |
*Required when connecting to a remote backend. For local development, Vite proxy handles routing.
- Verify Installation
npm list --depth=0
npm run lintnpm run devExpected output:
VITE v8.0.1 ready in 500 ms
β Local: http://localhost:5173/
β Network: use --host to expose
β press h + enter to show help
- Open your browser and navigate to http://localhost:5173
- First-time setup recommendations:
- Configure Language: Click the language selector (top-right) to switch between Chinese and English
- Add Backend Connection: If using a remote backend, navigate to the "Connections" page to configure
- Create Dashboard: Go to the "Dashboard" page to create your first investment dashboard
π GitHub Pages Demo: https://finanalyzer.github.io/app
Note: The static build uses a default backend URL of http://localhost:8001/api. You need to configure the backend on the "Connections" page and start the backend service locally for proper functionality.
- Dashboard: View and manage investment dashboards
- Connections: Configure backend connections
- Extensions: Install and manage extensions
- Apps: Launch and configure applications
- Settings: User preferences and configuration
Mobile: Sidebar collapses into a hamburger menu. Tap the icon (top-left) to expand.
Displays the active page: Dashboard, Connections, Extensions, Apps, or Settings.
- Application Title: "Finanalyzer" (or custom title)
- Language Selector: Switch between Chinese and English
- User Menu: User profile and settings (if authenticated)
The dashboard is the core of Finanalyzer, used for creating and managing investment dashboards.
- Chart Widget: Visualize data (line, bar, pie charts)
- Table Widget: Display tabular data (supports sorting, filtering, pagination)
- Metric Widget: Display key metrics (large numbers, trend indicators)
- Markdown Widget: Add custom notes and analysis
- HTML Widget: Custom HTML content (supports JavaScript)
- Debug Widget: Developer debugging tool
- Click the "Add Widget" button (top-right of dashboard)
- Select widget type from the modal
- Configure widget parameters (title, data source, other settings)
- Click "Add" to place the widget
- Drag the widget to desired position
- Drag corners to resize
Manage backend connections for remote deployments.
- Click the "Add Connection" button
- Enter connection details:
- Name: Connection display name
- URL: Backend API base URL (e.g.,
https://api.example.com) - Authentication: Select authentication method
- Header: Add authentication header (e.g.,
Authorization: Bearer token) - Query: Add query parameter (e.g.,
access_token=xxx)
- Header: Add authentication header (e.g.,
- Click "Test Connection" to verify
- Click "Save" to save the connection
For backends protected by Cloudflare Access:
- Visit the backend URL and complete Cloudflare Access authentication
- Open browser DevTools β Application β Cookies
- Copy the
CF_Authorizationcookie value - When adding a connection in Finanalyzer, select Header authentication
- Add authentication header:
- Key:
CF-Authorization - Value: [paste token]
- Key:
- Click the language selector (top-right corner)
- Select language:
- English: Switch to English
- δΈζ: Switch to Chinese
- All UI text updates immediately
- Preference is saved to browser local storage
The src/services/dashboardApi.ts service handles all dashboard-related API calls with automatic authentication:
- Connection-based Authentication: Automatically retrieves authentication headers from
connectionServicebased onVITE_API_BASE_URL - URL Encoding: Properly handles widget IDs containing slashes
- Query Parameter Support: Supports authentication via query parameters in addition to headers
import { getDashboards, deleteWidget } from './services/dashboardApi';
// Get all dashboards (authentication handled automatically)
const dashboards = await getDashboards();
// Delete a widget (widget ID is URL-encoded automatically)
await deleteWidget(dashboardId, 'equity/screener-123');- Service reads
VITE_API_BASE_URLfrom environment variables - Matches connection configured in
connectionService - Extracts authentication headers/query parameters from matching connection
- All API requests automatically include authentication information
# Development server
npm run dev
# Build for production
npm run build
# Run linter
npm run lint
# Fix lint issues
npm run lint:fix
# Run tests (watch mode)
npm run test
# Run tests with coverage
npm run test:coverage
# Run single test file
npx vitest run tests/example.test.ts
# Run single test
npx vitest run tests/example.test.ts -t "test name"The project includes a GitHub Actions workflow that automatically builds and deploys to GitHub Pages:
- Push to
mainbranch triggers build - Static files are built
- Deployed to
https://finanalyzer.github.io/app
Build for production:
npm run buildBuild artifacts are located in the dist/ directory and can be deployed to any static file server.
Contributions are welcome! Please follow these steps:
- Fork this repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'feat: add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Submit a Pull Request
- Follow ESLint + TypeScript strict mode
- Use
npm run lint:fixto auto-fix formatting issues - Follow Conventional Commits specification
This project is licensed under the MIT License - see the LICENSE file for details.
- Finanalyzer API (Backend): https://github.com/finanalyzer/api
- OpenBB Platform: https://github.com/OpenBB-finance/OpenBB
- Issue Tracker: GitHub Issues
- Feature Requests: GitHub Discussions
Investment involves risks, analysis should be done carefully. This tool is for research and learning purposes only.