Web UI Overview¶
Monitor and manage your data platform through a modern web interface.
Overview¶
The Dango Web UI is a FastAPI-powered web application that provides monitoring, source management, and validation reporting for your data platform. Access it at http://localhost:8800 when your Dango platform is running.
WebSocket Status
WebSocket infrastructure is available for real-time communication. Currently supports basic messaging and CSV upload notifications. Active sync event streaming is planned for future releases.
Key Features:
- Source management - Add, edit, and remove data sources via web interface
- File uploads - Drag-and-drop CSV file management with optional auto-sync
- Validation reports - Configuration health checks
- Quick actions - One-click sync, generate, and run operations
- System status - Database stats, service health, recent activity
- WebSocket support - Infrastructure for real-time updates (basic implementation)
Technology:
- FastAPI - Modern Python web framework
- WebSockets - Available for messaging and notifications
- Responsive UI - Works on desktop and mobile
- RESTful API - All features accessible via HTTP endpoints
Quick Start¶
Access the Web UI¶
Start your Dango platform:
Open your browser to:
http://localhost:8800
The Web UI launches automatically and is ready to use immediatelyβno login required for local development.
Dashboard Overview¶
The main dashboard shows:
Header: - Project name and status indicator - Navigation menu (Dashboard, Sources, Logs, Settings) - Quick action buttons (Sync, Generate, Run)
Main Panels: 1. System Status - Service health, database size, last sync time 2. Recent Activity - Latest syncs, transformations, errors 3. Source Summary - Enabled sources with status indicators 4. Quick Stats - Row counts, schema stats, data freshness
Navigation¶
Main Menu¶
-
Dashboard
Overview of system health, recent activity, and quick stats.
- Service status indicators
- Recent sync history
- Database statistics
- Quick action buttons
Default landing page at http://localhost:8800
-
Sources
Manage all data sources in one place.
- View all configured sources
- Add new sources with wizard
- Edit source configuration
- Enable/disable sources
- Upload CSV files
-
Logs
Real-time log streaming and history.
- Live sync progress with WebSocket
- Filter by log level (INFO, WARNING, ERROR)
- Search log messages
- Download log files
- Clear log history
-
Settings
Configure platform settings and preferences.
- Port configuration
- Auto-sync settings
- File watcher configuration
- Metabase integration
- dbt-docs settings
-
Validation
Project health and validation reports.
- Configuration validation
- Source connection tests
- Database health checks
- Dependency verification
- Troubleshooting hints
Key Features¶
Real-Time Sync Monitoring¶
Watch data syncs happen live:
Before sync:
During sync (WebSocket updates):
[12:34:56] Starting sync for stripe_payments
[12:34:57] Connecting to Stripe API
[12:34:58] Fetching charges (incremental from 2024-11-01)
[12:35:12] Loaded 1,523 charges
[12:35:13] Fetching customers (full refresh)
[12:35:20] Loaded 342 customers
[12:35:21] Writing to raw_stripe.charges
[12:35:24] Writing to raw_stripe.customers
[12:35:25] β Sync complete (1,865 rows in 29.2s)
After sync:
Source Management Interface¶
Add New Source:
- Click "Add Source" button
- Choose source type from dropdown
- Fill in configuration form
- Test connection
- Save and enable
Edit Existing Source:
- Click source card
- Modify configuration fields
- Re-test connection
- Save changes
- Sync immediately or later
Visual Status Indicators:
- π’ Green - Source healthy, syncing normally
- π‘ Yellow - Warning (credentials expiring, slow sync)
- π΄ Red - Error (auth failed, connection timeout)
- βͺ Gray - Disabled
File Upload System¶
Drag-and-drop CSV file management:
Upload Flow:
- Navigate to Sources β CSV Files
- Drag CSV file into upload zone
- Preview first 10 rows
- Auto-detect:
- Delimiter (comma, tab, pipe)
- Header row presence
- Column types
- Confirm and upload
- File auto-syncs to database
File Management:
- View all uploaded files
- Replace existing files
- Download originals
- Delete unused files
- See sync status per file
Auto-Sync:
When auto_sync: true in config, file changes trigger automatic re-sync:
File detected: sales.csv (modified)
Debouncing for 600 seconds...
Syncing sales_data source...
β Sync complete
Quick Actions¶
One-click operations from the dashboard:
Sync All:
Generate Staging:
Button: Generate Staging
Action: dango generate
Shows: Model generation progress
Result: "3 models created" notification
Run Transformations:
Validate Configuration:
Button: Validate
Action: dango validate
Shows: Validation report with issues
Result: Pass/fail with fix suggestions
Dashboard Panels¶
System Status Panel¶
Displays:
- Platform Status: Running / Stopped
- Web UI: http://localhost:8800 (active)
- Metabase: http://localhost:3000 (active)
- dbt-docs: http://localhost:8800/dbt-docs (active)
- Database: data/warehouse.duckdb (42.3 MB)
- File Watcher: Active (auto-sync enabled)
Quick Links:
- Open Metabase
- Open dbt Docs
- Query Database (opens SQL editor)
Recent Activity Panel¶
Shows last 20 events:
12:35:25 β Sync completed (stripe_payments) - 1,865 rows
12:30:15 β dbt run completed - 15 models
12:15:42 β Generated staging models (stripe)
11:45:00 β OAuth token expires in 7 days (google_sheets)
11:30:21 β Sync failed (old_hubspot) - Auth expired
Event Types:
- Sync started / completed / failed
- Transformations run
- Models generated
- Validation checks
- Configuration changes
- Errors and warnings
Source Summary Panel¶
Grid view of all sources:
Each card shows:
- Source name
- Source type (icon + label)
- Status indicator
- Last sync time
- Row count
- Quick actions (Sync, Edit, Disable)
Example:
βββββββββββββββββββββββββββββββ
β π’ stripe_payments β
β Type: Stripe β
β Last sync: 2 hours ago β
β Rows: 1,865 β
β [Sync Now] [Edit] [...] β
βββββββββββββββββββββββββββββββ
Quick Stats Panel¶
Real-time metrics:
- Total Sources: 5 (4 enabled, 1 disabled)
- Database Size: 42.3 MB
- Total Rows: 28,693
- Schemas: 5 (raw, raw_stripe, staging, intermediate, marts)
- dbt Models: 15 (12 tables, 3 views)
- Last Activity: 2 minutes ago
Port Configuration¶
Default Ports¶
Dango uses these ports by default:
| Service | Default URL | Configurable | Config Location |
|---|---|---|---|
| Web UI | http://localhost:8800 | Yes | .dango/project.yml |
| Metabase | http://localhost:3000 | Yes | docker-compose.yml |
| dbt-docs | http://localhost:8800/dbt-docs | No | Served via Web UI |
Change Web UI Port¶
Edit .dango/project.yml:
Restart platform:
Access at new URL:
Port Conflicts¶
If you see "Address already in use" error:
Find conflicting process:
Kill process:
Or change Dango port as shown above.
Multi-Project Support¶
Run multiple Dango projects simultaneously on different ports:
Project 1 (port 8800):
Project 2 (port 8801):
cd ~/projects/marketing
# Edit .dango/project.yml β port: 8801
dango start
# Web UI: http://localhost:8801
Switch between projects:
- Each project has its own Web UI instance
- Each has separate Metabase and dbt-docs ports
- Projects share nothingβfully isolated
Routing (automatic):
Dango maintains a routing registry:
{
"analytics": {
"port": 8800,
"path": "/Users/you/projects/analytics"
},
"marketing": {
"port": 8801,
"path": "/Users/you/projects/marketing"
}
}
Access any project by port or navigate via browser bookmarks.
API Endpoints¶
The Web UI is built on a RESTful API. All features are accessible programmatically:
Core Endpoints¶
GET /api/status
Get system status.
Response:
{
"platform_running": true,
"database_size": "42.3 MB",
"services": {
"web_ui": "running",
"metabase": "running",
"dbt_docs": "running",
"file_watcher": "running"
}
}
POST /api/sync
Trigger data sync.
curl -X POST http://localhost:8800/api/sync \
-H "Content-Type: application/json" \
-d '{"source": "stripe_payments"}'
POST /api/generate
Generate staging models.
POST /api/run
Run dbt transformations.
curl -X POST http://localhost:8800/api/run \
-H "Content-Type: application/json" \
-d '{"select": "marts.customer_metrics"}'
Source Management¶
GET /api/sources
List all sources.
POST /api/sources
Add new source.
curl -X POST http://localhost:8800/api/sources \
-H "Content-Type: application/json" \
-d '{
"name": "my_csv",
"type": "csv",
"enabled": true,
"csv": {
"file_path": "data/sales.csv"
}
}'
PUT /api/sources/{name}
Update source configuration.
DELETE /api/sources/{name}
Remove source.
File Uploads¶
POST /api/upload
Upload CSV file.
Logs¶
GET /api/logs
Get recent logs.
WebSocket /ws/logs
Stream real-time logs:
const ws = new WebSocket('ws://localhost:8800/ws/logs');
ws.onmessage = (event) => {
console.log(event.data);
};
WebSocket Integration¶
Real-Time Updates¶
The Web UI uses WebSockets for live updates during:
- Data syncs (progress, row counts, status)
- dbt runs (model execution, tests)
- File watcher events (file changes detected)
- Validation checks
- Error notifications
Connection¶
JavaScript example:
// Connect to WebSocket
const ws = new WebSocket('ws://localhost:8800/ws/logs');
// Handle messages
ws.onmessage = (event) => {
const log = JSON.parse(event.data);
console.log(`[${log.timestamp}] ${log.level}: ${log.message}`);
};
// Handle connection
ws.onopen = () => console.log('Connected to Dango logs');
ws.onerror = (error) => console.error('WebSocket error:', error);
ws.onclose = () => console.log('Disconnected from Dango logs');
Message format:
{
"timestamp": "2024-12-09T12:34:56",
"level": "INFO",
"message": "Loaded 1,523 charges",
"source": "stripe_payments",
"context": {
"rows": 1523,
"duration_ms": 12400
}
}
Auto-Reconnect¶
The Web UI automatically reconnects if WebSocket disconnects:
- Retry with exponential backoff
- Show "Reconnecting..." indicator
- Resume log streaming on reconnect
UI Customization¶
Branding¶
Logo and favicon (.dango/project.yml):
branding:
logo: "assets/logo.svg"
favicon: "assets/favicon.ico"
primary_color: "#009688" # Teal
accent_color: "#3F51B5" # Indigo
Dashboard Layout¶
Reorder panels (drag and drop in UI):
- Click "Edit Layout" button
- Drag panels to reorder
- Save layout preferences
- Reset to default if needed
Hide/show panels:
- Toggle panel visibility
- Customize dashboard for your workflow
- Settings persist per browser
Keyboard Shortcuts¶
Speed up your workflow with keyboard shortcuts:
| Shortcut | Action |
|---|---|
Ctrl + S | Sync all sources |
Ctrl + G | Generate staging models |
Ctrl + R | Run dbt transformations |
Ctrl + V | Validate configuration |
Ctrl + L | Focus log search |
Ctrl + / | Show keyboard shortcuts |
Esc | Close modal/dialog |
Best Practices¶
1. Keep the Web UI Open¶
Run it in a dedicated browser tab:
- Monitor syncs in real-time
- Catch errors immediately
- See auto-sync activity
- Quick access to actions
2. Use Auto-Sync for Development¶
Enable file watcher during development:
Save CSV file β automatic sync after 10 minutes.
3. Check Validation Regularly¶
Click "Validate" before important syncs:
- Verify all credentials valid
- Check OAuth tokens not expired
- Ensure database accessible
- Confirm dbt project configured
4. Monitor Resource Usage¶
Keep an eye on:
- Database size (in System Status panel)
- Row counts growing as expected
- Sync durations (should be consistent)
- Error rates (should be zero)
5. Use Logs for Debugging¶
When something fails:
- Open Logs panel
- Filter by ERROR level
- Search for source name
- Read full error stack trace
- Download logs if needed
Troubleshooting¶
Web UI Won't Start¶
Error: "Address already in use"
Solution:
# Check what's using port 8800
lsof -i :8800
# Kill the process or change Dango port
# Edit .dango/project.yml β port: 8801
dango restart
Cannot Connect to WebSocket¶
Symptom: Logs don't update in real-time
Solutions:
- Check firewall: Allow WebSocket connections
- Check proxy: Some proxies block WebSockets
- Refresh page: Sometimes connection drops
- Check browser console: Look for WebSocket errors
Blank Page / 404 Errors¶
Solutions:
-
Verify Dango is running:
-
Check correct port:
-
Clear browser cache:
- Hard refresh:
Ctrl + Shift + R
Slow Performance¶
If Web UI is slow:
-
Large database: Consider cleaning old data
-
Too many logs: Clear log history
-
Logs panel β Clear logs button
-
Many sources: Disable unused sources
- Sources panel β Disable unused sources
Security Considerations¶
Local Development¶
The Web UI is designed for local development only:
- No authentication by default
- Listens on
localhostonly - Not exposed to network
Never expose to internet without adding:
- Authentication (OAuth, API keys)
- HTTPS/TLS encryption
- Rate limiting
- Input validation
Production Deployment¶
For production use:
- Add authentication:
- OAuth 2.0 integration
- API key middleware
-
Session management
-
Enable HTTPS:
- Use reverse proxy (nginx)
- SSL certificates
-
HSTS headers
-
Restrict access:
- VPN or IP allowlist
- Role-based permissions
-
Audit logging
-
Harden configuration:
- Disable debug mode
- Set secure cookies
- CORS restrictions
Next Steps¶
-
Managing Sources
Learn how to add, edit, and manage data sources via the Web UI.
-
Monitoring
Master real-time monitoring, logs, and health checks.
-
CLI Reference
Explore command-line alternatives to Web UI features.
-
Configuration
Customize Web UI settings and platform configuration.