# Dashboard Maintenance Guide

## Overview

The `index.html` dashboard automatically displays all demos in the project. It's designed to stay up-to-date with minimal effort.

## Quick Start

### View Dashboard
```bash
# Start server (if not running)
python3 -m http.server 8889

# Open in browser
firefox http://localhost:8889/
```

### Update Dashboard
```bash
# Regenerate after adding new demos
./generate_index.py

# Or make it executable and run directly
chmod +x generate_index.py
./generate_index.py
```

## Auto-Update Strategies

### Option 1: Manual Regeneration (Simplest)

Run after generating new demos:
```bash
./generate_index.py
```

**Best for:** Occasional updates, full control

### Option 2: File Watcher (Development)

Auto-regenerate when files change:
```bash
# Install watcher (Ubuntu/Debian)
sudo apt install inotify-tools

# Start watcher
./watch_and_update.sh
```

**Best for:** Active development, instant updates

### Option 3: Git Hook (Automated)

Auto-regenerate before commits:
```bash
# Copy hook to git hooks directory
cp .githooks/pre-commit .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
```

**Best for:** Team workflows, version control

### Option 4: Integrate with Generation

Add to your infinite loop workflow:
```python
# After agent completion in infinite loop
python3 generate_index.py
```

**Best for:** Seamless workflow integration

## How It Works

### Generator Script (`generate_index.py`)

**What it does:**
1. Scans demo directories (`threejs_viz/`, `sdg_viz/`, `src/`, `src_infinite/`, `src_group/`)
2. Extracts titles and descriptions from HTML files
3. Updates the `demos` object in `index.html`
4. Updates category counts and statistics
5. Preserves all styling and functionality

**What it scans:**
- `threejs_viz/threejs_viz_*.html` → Three.js demos
- `sdg_viz/sdg_viz_*.html` → SDG network visualizations
- `d3_test/d3_viz_*.html` → D3 data visualizations
- `mapbox_test/mapbox_globe_*/index.html` → Mapbox globe visualizations
- `claude_code_devtools/claude_devtool_*.html` → Claude Code developer tools
- `src/ui_hybrid_*.html` → UI single-file components
- `src_infinite/ui_hybrid_*.html` → Infinite mode UI
- `src_group/ui_hybrid_*/index.html` → Modular UI components

**Current stats:** 107 demos across 7 categories

### File Structure

```
infinite-agents/
├── index.html                  # Dashboard (auto-generated data section)
├── generate_index.py           # Generator script
├── watch_and_update.sh         # File watcher script
├── DASHBOARD.md                # This guide
│
├── threejs_viz/                # Three.js demos
│   ├── threejs_viz_1.html
│   ├── threejs_viz_2.html
│   └── ...
│
├── sdg_viz/                    # SDG network demos
│   ├── sdg_viz_1.html
│   ├── sdg_viz_2.html
│   └── ...
│
├── d3_test/                    # D3 data visualizations
│   ├── d3_viz_1.html
│   ├── d3_viz_2.html
│   └── ...
│
├── mapbox_test/                # Mapbox globe visualizations
│   ├── mapbox_globe_1/
│   │   └── index.html
│   ├── mapbox_globe_2/
│   │   └── index.html
│   └── ...
│
├── claude_code_devtools/       # Claude Code developer tools
│   ├── claude_devtool_1.html
│   ├── claude_devtool_2.html
│   └── ...
│
├── src/                        # UI hybrid (single file)
│   ├── ui_hybrid_1.html
│   ├── ui_hybrid_2.html
│   └── ...
│
├── src_infinite/               # UI hybrid (infinite mode)
│   ├── ui_hybrid_1.html
│   ├── ui_hybrid_2.html
│   └── ...
│
└── src_group/                  # UI hybrid (modular)
    ├── ui_hybrid_1/
    │   └── index.html
    └── ...
```

## Customization

### Add New Demo Category

Edit `generate_index.py` and add scanning logic:

```python
def generate_demo_data():
    demos = {
        'threejs': [],
        'sdg': [],
        'uiSingle': [],
        'uiModular': [],
        'newCategory': []  # Add new category
    }

    # Add scanning for new category
    new_files = scan_directory('new_dir', 'pattern_*.html')
    for i, filepath in enumerate(new_files, 1):
        demos['newCategory'].append({
            'number': i,
            'title': extract_title_from_html(filepath),
            'description': extract_description_from_html(filepath),
            'path': filepath,
            'type': 'New Type',
            'techniques': []
        })

    return demos
```

Then update `index.html` template to add the category section.

### Modify Extraction Logic

Edit `extract_title_from_html()` or `extract_description_from_html()` in `generate_index.py`:

```python
def extract_title_from_html(filepath):
    """Customize how titles are extracted."""
    # Add custom regex patterns
    # Try different HTML elements
    # Handle edge cases
    pass
```

### Change Dashboard Styling

Edit `index.html` directly - the generator only updates the `demos` object and stats, preserving all styling.

## Workflow Integration

### After Manual Demo Creation

```bash
# 1. Create new demo
nano threejs_viz/threejs_viz_6.html

# 2. Regenerate dashboard
./generate_index.py

# 3. Refresh browser to see changes
```

### After Infinite Loop Generation

Add to your agent completion callback:

```python
# In your infinite loop orchestrator
def on_generation_complete():
    print("🔄 Updating dashboard...")
    subprocess.run(['python3', 'generate_index.py'])
    print("✅ Dashboard updated!")
```

### With Version Control

```bash
# 1. Generate new demos
./your_generation_command.sh

# 2. Update dashboard
./generate_index.py

# 3. Commit everything together
git add threejs_viz/ index.html
git commit -m "Add 5 new Three.js demos"
```

## Troubleshooting

### Dashboard shows old count

**Problem:** Statistics don't match actual files
**Solution:** Run `./generate_index.py` manually

### Can't execute script

**Problem:** Permission denied
**Solution:** `chmod +x generate_index.py watch_and_update.sh`

### Titles look wrong

**Problem:** Extraction isn't finding correct titles
**Solution:** Check HTML file structure, customize extraction in `generate_index.py`

### Watcher doesn't work

**Problem:** `inotifywait` command not found
**Solution:** Install with `sudo apt install inotify-tools`

### Server not accessible

**Problem:** Can't open http://localhost:8889/
**Solution:** Check if server is running: `python3 -m http.server 8889`

## Advanced Usage

### Generate JSON API

Export demo list as JSON for external tools:

```bash
# Add to generate_index.py
import json

demos = generate_demo_data()
with open('demos.json', 'w') as f:
    json.dump(demos, f, indent=2)
```

### Create Category Pages

Generate separate pages per category:

```bash
# Add to workflow
./generate_index.py --category threejs --output threejs.html
./generate_index.py --category sdg --output sdg.html
```

### Statistics Dashboard

Track growth over time:

```bash
# Log counts on each generation
./generate_index.py | tee -a dashboard_stats.log
```

## Best Practices

1. **Regenerate after bulk changes** - After generating multiple demos, run once instead of per-demo
2. **Use watcher during development** - Auto-update while actively creating
3. **Git hook for teams** - Ensure dashboard stays in sync across team
4. **Backup before customization** - Copy `index.html` before major changes
5. **Test extraction** - Verify titles/descriptions look good after adding new demo types

## Quick Reference

```bash
# Update dashboard
./generate_index.py

# Watch for changes
./watch_and_update.sh

# Start server
python3 -m http.server 8889

# View dashboard
firefox http://localhost:8889/

# Check status
find threejs_viz sdg_viz d3_test mapbox_test claude_code_devtools src src_infinite src_group -name "*.html" | wc -l
```

## Future Enhancements

Potential improvements to consider:

- [ ] Screenshot thumbnails for each demo
- [ ] Iframe preview on hover
- [ ] Automatically populate cards with screen shots
- [ ] Demo Tags
- [ ] Use Playwright for automated testing and evaluation of demos

---

**Last Updated:** October 9, 2025
**Current Version:** Dynamic auto-discovery
**Total Demos:** 107 (and counting!)
