Dashboard

A lightweight, self-hosted application launcher & monitoring dashboard built with Python + Flask.

Python 3.10+ Flask 3.x Version 3.4.1 MIT License Docker ready
View on GitHub Docker Hub Get Started
Dashboard screenshot
Dashboard — dark theme with application tiles and API monitoring cards

✨ Features

🗂️ Application Management Add, edit, delete, and organise web applications with a clean CRUD interface.
📂 Category Support Create, edit, reorder, and delete categories with per-category app grouping.
📌 Pin Favourites Pin important applications to keep them pinned at the top of the dashboard.
🖼️ Custom Icons Upload icons or provide a URL — remote images are downloaded, resized to 64×64, and saved automatically.
🎨 Color Coding Assign a colour to any app for visual grouping with a colour picker and hex input synced.
📡 API Tiles Poll any HTTP endpoint with configurable method, headers, payload, interval, and template formatting.
🚨 Blinking Alert Cards Cards pulse in warning/danger state when alert keywords and counts match configured thresholds.
📦 Import / Export JSON Export all apps and categories to JSON and restore them in Settings at any time.
🔍 Search Provider Custom search engine URL and in-dashboard search bar toggle from Settings.
📱 Responsive Grid Automatic column layout with mobile-friendly breakpoints — works on phones and tablets.
🌙 Dark Theme Built-in polished dark styling with a background image option.
🖥️ Drop-down Terminal Quake-style in-browser terminal console triggered by a configurable hotkey.

🚀 Quick Start

Choose the installation method that fits your environment. The dashboard listens on port 6008 by default.

# Pull from Docker Hub
docker pull ftsiadimos/dashboard:latest

docker run -d --restart unless-stopped \
  -p 6008:6008 \
  --name=dashboard \
  -v $(pwd)/data:/app/data \
  ftsiadimos/dashboard:latest
# Or pull from GitHub Container Registry
docker pull ghcr.io/ftsiadimos/dashboard:latest

docker run -d --restart unless-stopped \
  -p 6008:6008 \
  --name=dashboard \
  -v $(pwd)/data:/app/data \
  ghcr.io/ftsiadimos/dashboard:latest
# docker-compose.yml
version: '3.8'

services:
  dashboard:
    image: ftsiadimos/dashboard:latest
    container_name: dashboard
    ports:
      - "6008:6008"
    volumes:
      - ./data:/app/data
    restart: unless-stopped
docker-compose up -d
git clone https://github.com/ftsiadimos/dashboard.git
cd dashboard

python -m venv venv
source venv/bin/activate     # Windows: venv\Scripts\activate

pip install -r requirements.txt

flask run --host=0.0.0.0 --port=6008

Then open http://localhost:6008 in your browser and configure via Settings.

📡 API Tile Integration

Point any app tile at an HTTP endpoint to create a live monitoring card. The dashboard fetches the endpoint at your chosen interval and renders the response using a lightweight template syntax — no plugins, no code required.

Template Tokens

{path.to.value} {_len} {data.items.first.name} {data.items.last.name} {servers.max_by(cpu).name} {servers.min_by(cpu).name} regex:<pattern>

Examples

Example 1 — Simple JSON value
API URL           https://status.example.com/api/health
Display Template  Status: {status}
# Response {"status":"ok"}  →  "Status: ok"
Example 2 — Nested JSON & array length
API URL           https://weather.example.com/forecast
Display Template  {forecast.daily.0.temperature}° / {forecast.daily.0.condition}

# Count items in a top-level array
API URL           https://tickets.example.com/open
Display Template  {_len} open tickets
# Response [{}, {}, {}]  →  "3 open tickets"
Example 3 — Array helpers (max_by / min_by / first / last)
API URL           https://status.example.com/api/servers
Display Template  Top host: {servers.max_by(cpu).name}
Example 4 — POST with headers & body
API URL           https://zabbix.example.com/api_jsonrpc.php
API Method        POST
Headers           {"Content-Type":"application/json"}
Payload           {"jsonrpc":"2.0","method":"problem.get","params":{"output":["problemid"],"countOutput":true},"auth":"TOKEN","id":1}
Display Template  {_len} problems
Example 5 — Regex extraction from HTML
API URL           https://statuspage.example.com
Display Template  regex:<title>([^<]+)</title>
# Extracts the first capture group from the HTML response

🖥️ Drop-down Terminal Console

Press the configured hotkey (default: `) from any page to slide a Quake-style terminal panel down. Press it again or hit Esc to close.

Quake-style terminal console
Quake-style drop-down terminal console

Commands

CommandDescription
helpShow all available commands
listList all app tiles as clickable rows
run <name>Run a tile's API call by name (partial match)
curl [opts] <url>Execute an ad-hoc HTTP request
curl … | jq <filter>Pipe response through a client-side jq filter
save <name> curl …Save a curl command under a name for later replay
list-customList all saved custom commands
run-custom <name>Re-run a saved custom command by name
delete-custom <name>Delete a saved custom command by name
search <query>Filter tiles by name
clearClear the terminal output

curl Flags

FlagDescription
-X <METHOD>HTTP method (default: GET)
-H <header>Add a request header (repeatable)
-d <body>Request body (JSON or plain text)

Keyboard Shortcuts

KeyAction
` (configurable)Toggle terminal open / closed
EscClose terminal
↑ / ↓Walk through command history
TabAutocomplete command or app name

Appearance & Settings

Open Settings → Terminal Console to customise the trigger key, height, opacity, font size, font family, accent colour, and animation speed.

📄 License

Released under the MIT License. See the LICENSE file for details.