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 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-stoppedThen 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"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:latestOpen http://<mower-ip>/ in your browser. That's it — no config required.
The entrypoint inspects running Docker containers every 30 seconds and surfaces any that expose a web UI.
Add these labels to any container you want to appear on the dashboard:
| Label | Required | Description |
|---|---|---|
openmower.ui=true | yes | Marks this container as a UI service |
openmower.ui.name | no | Display name (defaults to container name) |
openmower.ui.url | no | Full URL — use when the UI is on a different host or path |
openmower.ui.port | no | Port only — URL becomes http://<mower-hostname>:<port> |
openmower.ui.icon | no | MUI icon name e.g. Terminal, Dashboard |
openmower.ui.description | no | Short description shown under the name |
openmower.ui.priority | no | Sort order — lower numbers appear first (default: 0) |
URL resolution order: openmower.ui.url → openmower.ui.port → bare hostname.
If no labels are set, the entrypoint matches against known image names:
| Image (contains) | Detected as | Default port |
|---|---|---|
openmowerapp | OpenMower App | 8080 |
ttyd | Web Terminal | 7681 |
dockge | Dockge | 5001 |
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).
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: 5Icon names come from MUI Icons — use the PascalCase component name shown on that page (e.g. MenuBook, GitHub, Terminal, BarChart).
Requirements: Docker, Node.js 22+, Python 3.12+
docker build -t openmower-entrypoint:local .The easiest way — starts both servers with live reload:
./run-dev.shUses 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 devOpen http://localhost:5173.
├── 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)
The backend exposes these endpoints (consumed by the frontend):
| Endpoint | Description |
|---|---|
GET /api/health | Health check — used by the status indicator |
GET /api/services | Running containers with web UIs |
GET /api/config | Site title + configured links |
GET /api/announcements | Latest posts from the RSS feed (cached 15 min) |
Built on the OpenMower design system — light mode, green primary (#1B9D52), DM Sans + DM Mono fonts, MUI v6.