Reanz1/Dashboard-maker

HTML

1

15 commits

updated Sep 21, 2026

See the code

See what people are saying (1)

SourceMessageScoreDate

I made a simple dashboard for my home server 😊 (r/selfhosted)

I was looking for a dashboard to keep links to all my services in one place, part launcher, part bookmarks page, and everything I found either wanted my Docker socket or wanted me to hand-edit a yaml file every time I added something. So I built Dashboard-maker. All the code written by Ai…

0

Sep 21, 2026

README

Dashboard-maker

A sleek, lightweight home server dashboard built with Flask.

Built for self-hosters who want one page that links to everything they run, without config files to hand-edit, a database to maintain, or a build step to run. Everything — services, categories, even the theme's own HTML — is managed from the browser, and the whole state of the dashboard is three JSON files and a folder of icons.

😊 Examples

https://github.com/user-attachments/assets/ec1ab340-0e73-4aa1-a94a-6adbee43263a

https://github.com/user-attachments/assets/e57e59e4-062c-404d-9746-2b031dbc6048

https://github.com/user-attachments/assets/8a50a0ed-3003-4ca6-acd3-6c2a34d0beb3

🚀 Key Features

Manage everything from the page. Flip on edit mode to add, edit, reorder and delete service cards, and to create, rename and delete categories. Nothing needs a restart, and nothing needs the source.

Live reachability. Each card shows whether its service is answering. Checks run server-side and in parallel, refresh every minute, and accept self-signed certificates — the question is "is it up", not "is its certificate trustworthy". Any response counts, so a login page or a 404 still reads as up.

Search. Filters cards as you type, across name, description, URL and category.

Drag to reorder. Cards move within their category, and the order sticks.

Service icons. Upload a PNG, JPG, GIF, SVG, WEBP or ICO from the service panel, or pick one you already uploaded. Uploads never overwrite an existing icon — a repeat name gets a suffix.

Themes you can edit in the browser. Three ship with the app — Default, Neon and Ocean. Clone any of them and a full HTML editor opens right there; save and the page is restyled. One button resets a theme to the version that shipped.

Zero-database. Three JSON files and an images folder. Back up the dashboard by copying a directory. Writes are atomic, so an interrupted save can't truncate your services.

Container-ready. Python-slim base, one dependency (Flask), no CDN calls at runtime — Tailwind and Inter are served from the image.

📦 Deployment

services:
  dashboard:
    image: randomsi/dashboard-maker:latest
    container_name: dashboard-maker
    restart: unless-stopped
    ports:
      - "5000:5000"
    volumes:
      - ./data:/data
      - ./images:/images
docker compose up -d

Then open http://<your-server>:5000.

Pin a release instead of latest if you'd rather upgrade deliberately — randomsi/dashboard-maker:1.1.0.

🗂️ What's in the volumes

PathHolds
/data/services.jsonYour service cards
/data/categories.jsonCategory names and their order
/data/config.jsonThe active theme
/data/themes/Themes you cloned or edited, as .html files
/images/Uploaded service icons

All of it is created on first start if missing. Nothing in either volume is rewritten on startup, so upgrading is a pull and a recreate against the same volumes.

🐍 Running from source

pip install -r requirements.txt
python app.py          # http://localhost:5000

Heads up: /data and /images are absolute paths, so running outside a container creates them at the filesystem root and needs the permissions to do so.

🎨 Theming

Themes are self-contained HTML files. Each one is the entire page — structure, CSS variables, Tailwind classes — and the app serves it as-is. The controls, dialogs and their styling are injected at runtime by dashboard.js, so a theme doesn't have to implement any of that; it just has to describe how the page should look.

To make your own:

  1. Switch to whichever built-in theme is closest to what you want.
  2. Open the theme panel in edit mode, type a name, and clone it. The clone lands in /data/themes/<name>.html and becomes active immediately.
  3. Edit it in the built-in editor and save. Reset puts it back to the version it was cloned from.

Because the editor takes whole HTML, you can use your favorite AI to write a new one and paste the result back! 😆

https://github.com/user-attachments/assets/0019ac4a-557c-4297-b9e2-562fc4962f83

Two things worth knowing. Editing a built-in theme never touches the file in the image — the edit is saved as an override in /data/themes/, which is also why Reset can always get you back. And themes are served raw, not rendered as templates, so a theme reads its data from the API at runtime rather than through Jinja2.

🔌 API

Everything the UI does goes through these.

EndpointMethodsPurpose
/api/servicesGET, POSTList and add service cards
/api/services/<id>PUT, DELETEUpdate or remove one
/api/services/reorderPOSTPersist card order
/api/statusGETReachability per service, cached 30s
/api/categoriesGET, POSTList and add categories
/api/categories/<name>PUT, DELETERename, or delete with ?reassign=<target>
/api/imagesGET, POSTList and upload icons
/api/themesGET, POSTList themes, clone the active one
/api/themes/<name>GET, PUT, DELETERead, save and remove theme HTML
/api/themes/<name>/resetPOSTDrop the override, restore the built-in
/api/configGET, POSTRead and set the active theme

📄 License

MIT. See LICENSE — it also ships inside the image at /app/LICENSE.

Contributors

Reanz1

15 commits

Reanz1/Dashboard-maker

HTML

1

15 commits

updated Sep 21, 2026

See the code

See what people are saying (1)

SourceMessageScoreDate

I made a simple dashboard for my home server 😊 (r/selfhosted)

I was looking for a dashboard to keep links to all my services in one place, part launcher, part bookmarks page, and everything I found either wanted my Docker socket or wanted me to hand-edit a yaml file every time I added something. So I built Dashboard-maker. All the code written by Ai…

0

Sep 21, 2026

README

Dashboard-maker

A sleek, lightweight home server dashboard built with Flask.

Built for self-hosters who want one page that links to everything they run, without config files to hand-edit, a database to maintain, or a build step to run. Everything — services, categories, even the theme's own HTML — is managed from the browser, and the whole state of the dashboard is three JSON files and a folder of icons.

😊 Examples

https://github.com/user-attachments/assets/ec1ab340-0e73-4aa1-a94a-6adbee43263a

https://github.com/user-attachments/assets/e57e59e4-062c-404d-9746-2b031dbc6048

https://github.com/user-attachments/assets/8a50a0ed-3003-4ca6-acd3-6c2a34d0beb3

🚀 Key Features

Manage everything from the page. Flip on edit mode to add, edit, reorder and delete service cards, and to create, rename and delete categories. Nothing needs a restart, and nothing needs the source.

Live reachability. Each card shows whether its service is answering. Checks run server-side and in parallel, refresh every minute, and accept self-signed certificates — the question is "is it up", not "is its certificate trustworthy". Any response counts, so a login page or a 404 still reads as up.

Search. Filters cards as you type, across name, description, URL and category.

Drag to reorder. Cards move within their category, and the order sticks.

Service icons. Upload a PNG, JPG, GIF, SVG, WEBP or ICO from the service panel, or pick one you already uploaded. Uploads never overwrite an existing icon — a repeat name gets a suffix.

Themes you can edit in the browser. Three ship with the app — Default, Neon and Ocean. Clone any of them and a full HTML editor opens right there; save and the page is restyled. One button resets a theme to the version that shipped.

Zero-database. Three JSON files and an images folder. Back up the dashboard by copying a directory. Writes are atomic, so an interrupted save can't truncate your services.

Container-ready. Python-slim base, one dependency (Flask), no CDN calls at runtime — Tailwind and Inter are served from the image.

📦 Deployment

services:
  dashboard:
    image: randomsi/dashboard-maker:latest
    container_name: dashboard-maker
    restart: unless-stopped
    ports:
      - "5000:5000"
    volumes:
      - ./data:/data
      - ./images:/images
docker compose up -d

Then open http://<your-server>:5000.

Pin a release instead of latest if you'd rather upgrade deliberately — randomsi/dashboard-maker:1.1.0.

🗂️ What's in the volumes

PathHolds
/data/services.jsonYour service cards
/data/categories.jsonCategory names and their order
/data/config.jsonThe active theme
/data/themes/Themes you cloned or edited, as .html files
/images/Uploaded service icons

All of it is created on first start if missing. Nothing in either volume is rewritten on startup, so upgrading is a pull and a recreate against the same volumes.

🐍 Running from source

pip install -r requirements.txt
python app.py          # http://localhost:5000

Heads up: /data and /images are absolute paths, so running outside a container creates them at the filesystem root and needs the permissions to do so.

🎨 Theming

Themes are self-contained HTML files. Each one is the entire page — structure, CSS variables, Tailwind classes — and the app serves it as-is. The controls, dialogs and their styling are injected at runtime by dashboard.js, so a theme doesn't have to implement any of that; it just has to describe how the page should look.

To make your own:

  1. Switch to whichever built-in theme is closest to what you want.
  2. Open the theme panel in edit mode, type a name, and clone it. The clone lands in /data/themes/<name>.html and becomes active immediately.
  3. Edit it in the built-in editor and save. Reset puts it back to the version it was cloned from.

Because the editor takes whole HTML, you can use your favorite AI to write a new one and paste the result back! 😆

https://github.com/user-attachments/assets/0019ac4a-557c-4297-b9e2-562fc4962f83

Two things worth knowing. Editing a built-in theme never touches the file in the image — the edit is saved as an override in /data/themes/, which is also why Reset can always get you back. And themes are served raw, not rendered as templates, so a theme reads its data from the API at runtime rather than through Jinja2.

🔌 API

Everything the UI does goes through these.

EndpointMethodsPurpose
/api/servicesGET, POSTList and add service cards
/api/services/<id>PUT, DELETEUpdate or remove one
/api/services/reorderPOSTPersist card order
/api/statusGETReachability per service, cached 30s
/api/categoriesGET, POSTList and add categories
/api/categories/<name>PUT, DELETERename, or delete with ?reassign=<target>
/api/imagesGET, POSTList and upload icons
/api/themesGET, POSTList themes, clone the active one
/api/themes/<name>GET, PUT, DELETERead, save and remove theme HTML
/api/themes/<name>/resetPOSTDrop the override, restore the built-in
/api/configGET, POSTRead and set the active theme

📄 License

MIT. See LICENSE — it also ships inside the image at /app/LICENSE.

Contributors

Reanz1

15 commits

Languages

HTML

51.6%

JavaScript

20.2%

CSS

18.6%

Python

8.8%