Custom app launcher, browser home page, and service monitor. cute.haus
homelab react typescript
README.md

watsup #

screenshot

watsup is a convenient little dashboard and app launcher for cute.haus, my hybrid homelab/cloud infrastructure. Very much inspired by glance, but I grew tired of the limitations of a generic solution. Plus, I wanted to build my own for fun.

In addition to some pleasantries (top 5 stories on Hacker News, weather, search), it shows every website and service I host, with a checkmark reflecting whether they're reachable or not.

configuration #

The dashboard is configured at runtime from TOML. The bundled config/default.toml reproduces the default dashboard, but the container can use any mounted file by setting WATSUP_CONFIG_PATH:

services:
  watsup:
    image: watsup
    ports:
      - "3000:3000"
    environment:
      WATSUP_CONFIG_PATH: /run/configs/watsup.toml
    configs:
      - source: watsup-dashboard
        target: /run/configs/watsup.toml

configs:
  watsup-dashboard:
    file: ./watsup.toml

The config contains an ordered list of sections. Add as many services and widgets sections as needed:

title = "Home"

[[sections]]
type = "widgets"
columns = 4

[[sections.widgets]]
type = "weather"

[[sections.widgets]]
type = "search"
span = 3

[[sections]]
type = "services"
title = "Public services"
columns = 3
refreshInterval = 20000

[[sections.services]]
name = "Example"
url = "https://example.com"
healthUrl = "https://example.com/health"
goodStatuses = [200, 204]

[[sections]]
type = "services"
title = "Internal services"
columns = 4

[[sections.services]]
name = "Grafana"
url = "https://grafana.example.com"
icon = "https://example.com/grafana.png"

columns and widget span accept values from 1 through 4. Available widget types are weather, search, lobsters, and hacker-news. Service icon, healthUrl, goodStatuses, and section refreshInterval are optional. Without goodStatuses, any response below HTTP 500 is considered online. The config is read when /api/config is requested, so replacing the file and refreshing the page applies changes without rebuilding the image.

build stuff #

To install dependencies:

bun install

To start a development server:

bun dev

To run for production:

bun start

This project was created using bun init in bun v1.3.7. Bun is a fast all-in-one JavaScript runtime.