Accessing Headplane
Headplane is included in the Docker stack and runs automatically: URL: http://localhost:3001/admin/Initial Setup
Open Headplane in browser
Navigate to: http://localhost:3001/admin/
Dashboard
The dashboard provides an overview of your entire network:Network Overview
- Total nodes connected
- Online/offline status
- Active users
- Recent activity
Quick Stats
- Number of nodes per user
- Active routes
- Pre-auth keys created
- System health
Recent Events
- New nodes connected
- Routes advertised
- Keys created
- Configuration changes
Health Status
- Headscale service status
- Database connectivity
- API availability
- Version information
Managing Nodes
View All Nodes
- Click Nodes in the sidebar
- See all connected devices with:
- Hostname
- User/owner
- IP addresses (IPv4 and IPv6)
- Online/offline status
- Last seen timestamp
- Operating system
- Tags
Node Details
Click any node to view detailed information:- General Info
- Network Info
- Routes
- Full hostname
- Node ID
- User/namespace
- Created date
- Last updated
- Tailscale version
- OS and architecture
Node Actions
Rename
- Click node name
- Edit hostname field
- Save changes
Delete
- Select node
- Click Delete button
- Confirm deletion
Expire
- Select node
- Click Expire
- Node is marked as expired
Tag
- Click node
- Go to Tags section
- Add or remove tags
- Save changes
Managing Users
View Users
- Click Users in sidebar
- See all users with:
- Username
- Number of nodes
- Created date
- Node list preview
Create User
User Actions
- View nodes: Click username to see all their devices
- Delete user: Remove user and all associated nodes
- Generate keys: Create pre-auth keys for the user
Pre-Auth Key Management
Create Pre-Auth Key
Configure key settings
- Basic Settings
- Advanced Options
- User: Select which user owns this key
- Expiration: Set how long the key is valid
- 1 hour (production)
- 24 hours (testing)
- 168 hours (7 days)
- Custom duration
View Active Keys
See all pre-auth keys:- Key prefix (last few characters)
- User/owner
- Created date
- Expiration date
- Reusable status
- Used/unused status
Expire Key
- Find the key in the list
- Click Expire button
- Key is immediately invalidated
- Cannot be used to connect new devices
Route Management
View Routes
- Click Routes in sidebar
- See all advertised routes:
- Node advertising the route
- Subnet/prefix (e.g., 192.168.1.0/24)
- Exit node routes (0.0.0.0/0)
- Enabled/disabled status
Approve Routes
Approve Exit Nodes
Exit node routes are shown as0.0.0.0/0 (IPv4) or ::/0 (IPv6):
- Find exit node route
- Click Approve
- Node can now route internet traffic
Disable Route
- Find enabled route
- Click Disable
- Clients can no longer use this route
ACL Policy Editor
Edit Policies
Policy Examples
- Personal Network
- Guest Isolation
- Multi-Tier
API Keys Management
Create Additional API Keys
- Go to Settings or API Keys
- Click Create API Key
- Set expiration (recommended: 365 days)
- Copy and store the key securely
Revoke API Key
- Find the key in the list
- Click Revoke or Delete
- Confirm revocation
Headplane Configuration
Headplane settings are inheadplane/config.yaml:
headplane/config.yaml
Configuration Options
| Option | Description | Example |
|---|---|---|
headscale_url | Internal Headscale URL | http://headscale:8080 |
api_key | Headscale API key | Generated from headscale apikeys create |
cookie_secret | Session encryption key | 32-character string |
log_level | Logging verbosity | info, debug, warn |
Troubleshooting
404 Error When Accessing Headplane
Cannot Login / Invalid API Key
Headplane Not Loading / Blank Page
Changes Not Appearing
- Hard refresh browser: Ctrl+Shift+R (or Cmd+Shift+R on Mac)
- Clear browser cache: Settings → Clear browsing data
- Check service logs:
docker compose logs headplane
GUI vs Command Line
- Headplane GUI
- Command Line
Best for:
- Visual overview of network
- Quick device management
- Non-technical users
- One-off tasks
- Monitoring status
- No terminal needed
- Visual feedback
- Easy navigation
- Real-time updates
Security Best Practices
Secure API Keys
- Use long expiration only for dev:
--expiration 999d - Production keys:
--expiration 90d - Rotate keys regularly
- Never commit keys to git
Network Access
- Don’t expose Headplane publicly
- Use VPN or Tailscale to access it
- Add authentication proxy if needed
- Monitor access logs
Cookie Security
- Use strong 32-character cookie_secret
- Change default secret
- Use random string generator:
Regular Audits
- Review connected nodes weekly
- Check active API keys
- Audit user access
- Remove unused keys and nodes
Tips and Tricks
Keyboard Shortcuts
- Search nodes: Type in search box (usually
/key) - Refresh data: F5 or refresh button
- Navigate: Use browser back/forward
