Skip to content

Repository files navigation

OpenMower Entrypoint

Landing page for the OpenMower project. Hosted on port 80 of the mower — the default interface when you open the mower's IP in a browser.

What it does:

  • Auto-detects running Docker containers that expose a web UI and links to them
  • Shows configurable quick links (docs, GitHub, etc.)
  • Fetches and displays the latest news from openmower.de

Add to an Existing Compose File

Add this service to your existing docker-compose.yml:

services:
# ... your existing services ...entrypoint:
image: ghcr.io/xtech/web-openmower-entrypoint:latestports:
- "80:80"volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./entrypoint-config.yaml:/config/config.yaml:ro # optionalrestart: unless-stopped

Then label any service you want to appear on the dashboard:

services:
my-app:
image: my-app:latestlabels:
openmower.ui: "true"openmower.ui.name: "My App"openmower.ui.port: "3000"openmower.ui.icon: "Grass"openmower.ui.description: "The main OpenMower interface"

Quick Start (standalone)

docker run -d \
--name openmower-entrypoint \
-p 80:80 \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--restart unless-stopped \
ghcr.io/clemenselfein/openmower-entrypoint:latest

Open http://<mower-ip>/ in your browser. That's it — no config required.


Service Auto-Detection

The entrypoint inspects running Docker containers every 30 seconds and surfaces any that expose a web UI.

Label-based (recommended)

Add these labels to any container you want to appear on the dashboard:

LabelRequiredDescription
openmower.ui=trueyesMarks this container as a UI service
openmower.ui.namenoDisplay name (defaults to container name)
openmower.ui.urlnoFull URL — use when the UI is on a different host or path
openmower.ui.portnoPort only — URL becomes http://<mower-hostname>:<port>
openmower.ui.iconnoMUI icon name e.g. Terminal, Dashboard
openmower.ui.descriptionnoShort description shown under the name
openmower.ui.prioritynoSort order — lower numbers appear first (default: 0)

URL resolution order: openmower.ui.urlopenmower.ui.port → bare hostname.

Auto-detection fallback

If no labels are set, the entrypoint matches against known image names:

Image (contains)Detected asDefault port
openmowerappOpenMower App8080
ttydWeb Terminal7681
dockgeDockge5001

Auto-detected services are marked with an "Auto-detected" badge. The URL hostname is taken from the HTTP Host header of the browser request, so it works correctly whether you access the mower by IP, hostname, or mDNS (mower.local).


Configuration

Mount a config.yaml at /config/config.yaml inside the container. All fields are optional — omitting the file uses built-in defaults.

site:
title: "OpenMower"# Page title shown in the footerlinks:
- name: "Documentation"url: "https://openmower.de/latest/docs/"icon: "MenuBook"# MUI icon name
- name: "GitHub"url: "https://github.com/ClemensElflein/OpenMower"icon: "GitHub"
- name: "Community"url: "https://discord.gg/jE7QNaSxW7"icon: "Forum"announcements:
rss_url: "https://openmower.de/latest/updates/index.xml"max_items: 5

Icon names come from MUI Icons — use the PascalCase component name shown on that page (e.g. MenuBook, GitHub, Terminal, BarChart).


Building from Source

Requirements: Docker, Node.js 22+, Python 3.12+

Docker image

docker build -t openmower-entrypoint:local .

Local development

The easiest way — starts both servers with live reload:

./run-dev.sh

Uses tmux for a side-by-side split if available, otherwise prefixed output in one terminal. CTRL+C stops both.

Manually:

# Terminal 1 — backendcd backend
python3 -m venv .venv &&source .venv/bin/activate
pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
# Terminal 2 — frontendcd frontend
npm install
npm run dev

Open http://localhost:5173.


Project Structure

├── backend/
│ ├── main.py # FastAPI app + routes
│ ├── docker_discovery.py # Docker socket inspection
│ ├── rss.py # RSS fetch + cache
│ ├── config.py # Config file loading
│ ├── models.py # Pydantic models
│ └── requirements.txt
├── frontend/
│ └── src/
│ ├── EntrypointPage.tsx
│ ├── api.ts
│ ├── components/ # ServiceCard, LinkCard, AnnouncementCard, ...
│ ├── sections/ # ServicesSection, LinksSection, AnnouncementsSection
│ └── theme/ # OpenMower MUI theme (from design system)
├── .design/ # Brand tokens, logo assets
├── Dockerfile
├── docker-compose.yml
├── run-dev.sh # Local dev helper
└── config.yaml # Default config (copy and mount to customise)

API

The backend exposes these endpoints (consumed by the frontend):

EndpointDescription
GET /api/healthHealth check — used by the status indicator
GET /api/servicesRunning containers with web UIs
GET /api/configSite title + configured links
GET /api/announcementsLatest posts from the RSS feed (cached 15 min)

Design

Built on the OpenMower design system — light mode, green primary (#1B9D52), DM Sans + DM Mono fonts, MUI v6.

About

OpenMower web dashboard — auto-detects Docker services with web UIs, shows quick links, and displays latest news. Default landing page served on port 80 of your mower.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages