A web-based configuration tool for Homepage dashboard. This tool provides a visual interface to create and manage Homepage service configurations without manually editing YAML files.
- 🔐 Authentication - Secure login with configurable username and password
- 🎨 Visual Configuration Editor - Add, edit, and delete services through a user-friendly interface
- 🔄 Drag & Drop - Reorder services and categories with drag-and-drop functionality
- 👁️ Live Homepage Preview - Display your actual Homepage dashboard in an iframe for real-time preview
- 📥 Import/Export - Import existing YAML configurations and export your changes
- 🔖 Bookmarks Management - Manage Homepage bookmarks with dedicated UI
- 🔧 Widget Support - Full support for all Homepage widget types including:
- Media widgets (Emby, Jellyfin, Plex, etc.)
- Download clients (qBittorrent, Transmission)
- Custom API widgets
- Home Assistant, Synology, and more
- 🐳 Docker Support - Easy deployment with Docker and docker-compose
- 🚀 CI/CD - Automated builds with GitHub Actions
# Clone the repository
git clone https://github.com/thsrite/homepage-config.git
cd homepage-config
# Start with docker-compose
docker-compose up -d
# Access the tool
# Open http://localhost:9835 in your browserdocker run -d \
--name homepage-config \
-p 9835:9835 \
-e AUTH_USERNAME=admin \
-e AUTH_PASSWORD=your-secure-password \
-v ./homepage/services.yaml:/app/config/services.yaml \
-v ./homepage/bookmarks.yaml:/app/config/bookmarks.yaml \
-v /path/to/your/icons:/app/public/images \
--restart unless-stopped \
thsrite/homepage-config:latestNote: The -v /path/to/your/icons:/app/public/images mount is optional but required if you want to use local icon files with /images/ paths.
docker run -d \
--name homepage-config \
-p 9835:9835 \
-e AUTH_USERNAME=admin \
-e AUTH_PASSWORD=your-secure-password \
-v ./homepage/services.yaml:/app/config/services.yaml \
-v ./homepage/bookmarks.yaml:/app/config/bookmarks.yaml \
-v /path/to/your/icons:/app/public/images \
thsrite/homepage-config:latest- Python 3.8 or higher
- pip (Python package manager)
- Clone the repository:
git clone https://github.com/thsrite/homepage-config.git
cd homepage-config- Install Python dependencies:
pip install -r requirements.txt- Run the application:
python3 run.py- Create a
.envfile with required authentication settings:
cp .env.example .env
# Edit .env and set your username and password- Run the application:
python3 run.py- Open your browser and navigate to:
http://localhost:9835
Authentication is required for all deployments. You must configure a username and password via environment variables.
| Variable | Required | Default | Description |
|---|---|---|---|
AUTH_USERNAME |
✅ Yes | - | Username for login |
AUTH_PASSWORD |
✅ Yes | - | Password for login |
SESSION_SECRET |
No | auto-generated | Secret key for JWT tokens |
SESSION_EXPIRE_MINUTES |
No | 1440 (24h) | Session expiration time in minutes |
Edit your docker-compose.yml to set authentication credentials:
services:
homepage-config:
image: thsrite/homepage-config:latest
environment:
- AUTH_USERNAME=your-username # Change this!
- AUTH_PASSWORD=your-password # Change this!
- SESSION_SECRET=your-random-secret-key
ports:
- "9835:9835"
volumes:
- ./homepage/services.yaml:/app/config/services.yaml
- ./homepage/bookmarks.yaml:/app/config/bookmarks.yaml
- /path/to/your/icons:/app/public/images # Optional: for local iconsFor local development, create a .env file:
AUTH_USERNAME=admin
AUTH_PASSWORD=your-secure-password
SESSION_SECRET=your-random-secret-key- Click the "Add Category" button in the Configuration Editor
- Enter a name for your category (e.g., "Media", "Tools", "Downloads")
- The category will appear in the editor
-
Click "Add Service" within a category
-
Fill in the service details:
- Service Name - Display name for the service
- Icon URL - Icon for the service, supports:
- External URLs:
https://example.com/icon.png - Local images:
/images/myicon.png(requires volume mount, see below)
- External URLs:
- Service URL - Link to access the service
- Health Check URL - URL to check if service is online
- Server/Container - Docker server and container names (optional)
-
Configure widget (optional):
- Select widget type from dropdown
- Fill in widget-specific configuration
- For Custom API widgets, add field mappings
-
Click "Save Service"
- Drag services using the grip handle (⋮) to reorder within a category
- Drag services between categories to move them
- Drag categories to reorder them
- Click "Import" in the top navigation
- Select your existing
services.yamlfile - Click "Import" to load the configuration
- Click "Export" in the top navigation
- The
services.yamlfile will be downloaded - Copy it to your Homepage configuration directory
The right panel can display your actual Homepage dashboard:
- Enter your Homepage URL in the input field (e.g.,
http://localhost:3000) - Click "Set URL" to load your Homepage in the preview panel
- Click "Refresh" to reload the Homepage after making configuration changes
- The URL is saved in your browser for future sessions
# Build locally
docker build -t homepage-config:latest .
# Build for multiple platforms
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 \
-t homepage-config:latest .| Variable | Description | Default |
|---|---|---|
PORT |
Application port | 9835 |
DEBUG |
Enable debug mode | false |
CONFIG_PATH |
Configuration file path | config/services.yaml |
version: '3.8'
services:
homepage-config:
image: thsrite/homepage-config:latest
container_name: homepage-config
restart: unless-stopped
ports:
- "9835:9835"
volumes:
- ./homepage/services.yaml:/app/config/services.yaml
- ./homepage/bookmarks.yaml:/app/config/bookmarks.yaml
- /volume1/docker/homepage/image:/app/public/images # Optional: for local icons
environment:
- PORT=9835
- DEBUG=falseUsing Local Icons: To use local icon files instead of external URLs:
- Mount a directory to
/app/public/imagesin the container - Place your icon files in the mounted directory on the host
- Reference icons in the service configuration as
/images/filename.png - Example: If you have
/volume1/docker/homepage/image/myapp.pngon the host, use/images/myapp.pngin the Icon URL field
- Generated config:
config/services.yaml - Backups:
config/backups/ - Uploads:
uploads/
widget:
type: emby
url: http://10.0.0.2:8096
key: your_api_key_here
enableBlocks: true
enableNowPlaying: truewidget:
type: qbittorrent
url: http://10.0.0.2:8889
username: admin
password: your_passwordwidget:
type: customapi
url: http://10.0.0.2:3003/api/v1/stats
method: GET
mappings:
- field: downloads
label: Downloads
- field: uploads
label: UploadsThe application provides a REST API for programmatic access:
GET /api/services/- Get all servicesPOST /api/services/- Create a new servicePUT /api/services/{category}/{name}- Update a serviceDELETE /api/services/{category}/{name}- Delete a serviceGET /api/categories/- Get all categoriesPOST /api/categories/- Create a new categoryGET /api/config/export- Export configuration as YAMLPOST /api/config/import- Import YAML configuration
Full API documentation is available at: http://localhost:9835/docs
homepage-config/
├── backend/ # FastAPI backend
│ ├── api/ # API endpoints
│ ├── core/ # Core functionality
│ └── models/ # Data models
├── frontend/ # HTML/JS frontend
│ ├── static/ # CSS, JS, images
│ └── index.html # Main page
├── config/ # Configuration files
├── .github/ # GitHub Actions workflows
├── requirements.txt # Python dependencies
├── Dockerfile # Docker image definition
├── docker-compose.yml # Docker compose configuration
├── run.py # Development server
└── README.md # This file
- Backend: FastAPI, Python 3.8+
- Frontend: HTML5, Bootstrap 5, JavaScript
- Libraries: SortableJS (drag-drop), Axios (HTTP client)
- Deployment: Docker, GitHub Actions
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
If port 9835 is already in use, you can change it:
Docker:
docker run -p 8081:9835 ...Local:
# In run.py
uvicorn.run(
"main:app",
host="0.0.0.0",
port=8081, # Change to desired port
...
)- Check for tab characters in YAML (will be auto-fixed)
- Ensure YAML syntax is valid
- Remove inline comments if causing issues
- Check if Homepage is running
- Verify the URL is correct
- Try using IP address instead of hostname
- Check for CORS/iframe restrictions
- Export the configuration
- Copy
services.yamlto Homepage config directory - Restart Homepage container/service
- Click Refresh in the preview panel
This project is licensed under the MIT License - see the LICENSE file for details.
- Homepage - The awesome dashboard this tool configures
- FastAPI - Modern web framework for building APIs
- Bootstrap - CSS framework for responsive design
- SortableJS - Drag and drop library
For issues, questions, or suggestions:
- Check the troubleshooting section
- Review Homepage documentation
- Open an issue on GitHub
- Multi-language support
- Dark mode theme
- Configuration templates library
- Service status checking
- Bulk import/export
- Configuration validation warnings
- Keyboard shortcuts
- Mobile responsive design improvements
Made with ❤️ for the Homepage community