# Services Homepage
A lightweight, self-hosted dashboard for quick access to your Docker services with a modern holographic UI design.


## Features
- đ¨ **Holographic Glass Design** - Modern liquid glass buttons with animated shimmer effects
- đ¯ **Dynamic Service Loading** - Services configured via simple XML file
- đ **Smart URL Resolution** - Automatic handling of ports, protocols, and hostnames
- đ **Icon Integration** - Includes Simple Icons pack (3000+ brand logos)
- đą **Responsive Layout** - Works seamlessly on desktop and mobile
- đŗ **Docker-Ready** - Single-container deployment with nginx
- ⥠**Lightweight** - Minimal resources, fast loading
- đ **Search & Filter** - Instant search with keyboard shortcut (press `/`)
- âšī¸ **Connection Details** - Info button shows hostname/port for each service
- đŽ **Keyboard Navigation** - Arrow keys to navigate, Enter to open, Esc to clear
- đĸ **Status Indicators** - Optional visual status (online/offline/maintenance)
## Quick Start
### 1. Deploy with Docker Compose
```bash
docker-compose up -d
```
The homepage will be available at `http://localhost:8088`
### 2. Configure Your Services
Edit `services.xml` to add your services:
```xml
```
### 3. Restart to Apply Changes
```bash
docker-compose restart
```
## Configuration Guide
### Service Attributes
| Attribute | Required | Description | Example |
|-----------|----------|-------------|---------|
| `name` | Yes | Display name for the service | `"Nextcloud"` |
| `proto` | No | Protocol (http/https) | `"https"` (default: `"http"`) |
| `port` | No | Port number | `"8080"` |
| `host` | No | Custom hostname or full URL | `"nextcloud.example.com"` |
| `logo` | No | Icon filename in `/logos/` | `"nextcloud.svg"` |
| `status` | No | Service status indicator | `"online"`, `"offline"`, or `"maintenance"` |
### URL Resolution Logic
The service URL is built using this priority:
1. **Full URL** - If `host` starts with `http://` or `https://`, use as-is
2. **Hostname with Port** - If `host` contains `:port`, use `proto://host:port`
3. **Hostname Only** - If `host` is set (no port), use `https://host` (ignores `proto` and `port`)
4. **Fallback** - Use current page hostname with specified `proto` and `port`
### Examples
```xml
```
## Keyboard Shortcuts
- **`/`** - Focus the search bar (press from anywhere)
- **Arrow Keys** - Navigate between service cards (Up/Down/Left/Right)
- **Enter** - Open the selected service in a new tab
- **Esc** - Clear the current selection
## Info Button
When a service has both a hostname and port configured, a small info button (â) appears in the bottom-right corner of the card. Click it to view connection details including:
- Service name
- Hostname
- Port number
- Protocol
## Status Indicators
Add optional status indicators to services by including a `status` attribute:
```xml
```
Status colors:
- **Green** (online) - Service is running normally, pulsing animation
- **Red** (offline) - Service is not available
- **Orange** (maintenance) - Service is under maintenance
## Icon Management
### Using Included Icons
The repository includes Simple Icons (3000+ brand logos). Available icons are in:
```
logos/simple-icons/icons/
```
### Adding Custom Icons
1. Add your SVG file to the `logos/` directory
2. Reference it in `services.xml`:
```xml
```
### Icon Styling
All icons are automatically styled white using CSS filters. To customize:
Edit `styles.css` and modify the `.card .logo` rule:
```css
.card .logo {
filter: brightness(0) invert(1); /* White icons */
/* OR */
filter: hue-rotate(180deg); /* Color shift */
}
```
## Customization
### Theme Colors
Edit CSS variables in `styles.css`:
```css
:root {
--bg: #0f1720; /* Background color */
--card: #0b1220; /* Card background */
--accent: #4f46e5; /* Accent color (purple) */
--muted: #94a3b8; /* Muted text */
}
```
### Holographic Effects
The holographic button effects include:
- **Shimmer Animation** - Continuous light sweep (8s loop, 3s on hover)
- **Gradient Background** - Purple/pink gradient blend
- **Glowing Border** - Animated gradient border on hover
- **Backdrop Blur** - Glass-like frosted effect
To adjust shimmer speed, modify the `@keyframes shimmer` animation:
```css
.card::before {
animation: shimmer 8s infinite linear; /* Change 8s to adjust speed */
}
```
### Layout
Change grid responsiveness in `styles.css`:
```css
.grid {
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
/* Adjust minmax() to change card width */
}
```
## File Structure
```
services-homepage/
âââ docker-compose.yml # Docker deployment config
âââ Dockerfile # Custom nginx build (if needed)
âââ index.html # Main HTML page
âââ styles.css # Holographic UI styles
âââ services.xml # Service definitions
âââ README.md # This file
âââ LICENSE # License information
âââ logos/ # Icon directory
âââ simple-icons/ # Simple Icons pack (3000+ logos)
âââ default.svg # Fallback icon
âââ gitea.svg
âââ jellyfin.svg
âââ nextcloud.svg
âââ ...
```
## Updating Icons
### Replace All Icons with Simple Icons
```bash
cd logos
for f in *.svg; do
basename=$(basename "$f" .svg)
match=$(find simple-icons/icons -type f -iname "*${basename}*.svg" -print -quit)
[ -n "$match" ] && cp "$match" "$f" && echo "Updated: $f"
done
```
### Find Available Icons
```bash
ls logos/simple-icons/icons/ | grep -i "keyword"
```
## Backup and Recovery
Icon backups are automatically created in:
```
logos/backup-YYYYMMDD-HHMMSS/
```
To restore from backup:
```bash
cp logos/backup-20251123-231406/*.svg logos/
docker-compose restart
```
## Troubleshooting
### Services Not Loading
1. Check `services.xml` syntax:
```bash
xmllint --noout services.xml
```
2. Check browser console for errors (F12)
3. Verify file permissions:
```bash
chmod 644 services.xml index.html styles.css
chmod 755 logos/
```
### Icons Not Displaying
1. Verify icon exists:
```bash
ls -lh logos/youricon.svg
```
2. Check icon reference in `services.xml` matches filename exactly
3. Clear browser cache (Ctrl+Shift+R)
### Container Issues
```bash
# View logs
docker logs services-homepage
# Restart container
docker-compose restart
# Rebuild if files changed
docker-compose up -d --force-recreate
```
## Performance
- **Image Size**: ~45MB (nginx:alpine base)
- **Memory Usage**: ~5-10MB
- **Load Time**: <100ms (local network)
- **Icons**: Cached by browser after first load
## Browser Support
- â
Chrome/Edge 90+
- â
Firefox 88+
- â
Safari 14+
- â
Mobile browsers (iOS Safari, Chrome Android)
## Security
- All volumes mounted read-only (`:ro`)
- No external dependencies at runtime
- Logs automatically rotated (5MB max, 2 files)
- CORS not enabled (same-origin only)
## Advanced Usage
### Custom Nginx Config
Create `nginx.conf` and mount it:
```yaml
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
```
### Adding Authentication
Use a reverse proxy (Nginx Proxy Manager, Caddy, Traefik) with basic auth:
```nginx
location / {
auth_basic "Services";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://services-homepage:80;
}
```
### Dynamic Port Updates
For services with dynamic ports (e.g., Transmission behind VPN), use environment variables:
```xml
```
Then update via script or use a template processor.
## Contributing
Contributions welcome! Completed features:
- â
Search/filter functionality with keyboard shortcut
- â
Keyboard navigation (arrow keys, Enter, Esc)
- â
Service status indicators (online/offline/maintenance)
- â
Info button showing connection details
Areas for future improvement:
- Service health checks (automatic ping/availability detection)
- Drag-and-drop reordering
- Categorized sections/groups
- Custom themes/color schemes
- Export/import service configurations
## License
MIT License - See LICENSE file for details
## Credits
- **Icons**: [Simple Icons](https://simpleicons.org/) (CC0 1.0 Universal)
- **Design Inspiration**: Holographic UI by vishnu137 on CodePen
- **Web Server**: nginx Alpine
## Support
For issues, questions, or suggestions:
1. Check this README first
2. Review browser console for errors
3. Check Docker logs: `docker logs services-homepage`
4. Verify `services.xml` syntax
---
**Version**: 1.0.0
**Last Updated**: November 23, 2025