Add Homepage dashboard + dual-export OpenCode traces

Homepage as the front door: single page at framework:7575 with one tile
per service, live widgets where the upstream supports it (Ollama loaded
models, container state via docker.sock, etc.), bookmarks for reference
docs. Config files are pyinfra-managed — source of truth lives in
compose/homepage/, sync by editing there and re-running ./run.sh.

OpenCode plugin now dual-exports spans to Phoenix and OpenLIT in
parallel. Phoenix remains the per-trace waterfall view; OpenLIT picks
up the same data for fleet-level metrics. Each destination has its own
batch processor so a hiccup at one doesn't block the other.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-08 12:00:05 -04:00
parent f23f7b8cc9
commit 178d7d3c0f
11 changed files with 269 additions and 16 deletions

View File

@@ -0,0 +1,22 @@
# https://gethomepage.dev/configs/bookmarks/
- Reference:
- Strix Halo wiki:
- abbr: SH
href: https://strixhalo.wiki
- kyuz0 backend benchmarks:
- abbr: KB
href: https://kyuz0.github.io/amd-strix-halo-toolboxes/
- llama.cpp:
- abbr: LC
href: https://github.com/ggml-org/llama.cpp
- OpenCode:
- abbr: OC
href: https://opencode.ai
- Phoenix:
- abbr: PX
href: https://arize.com/docs/phoenix

View File

@@ -0,0 +1,8 @@
# Docker integration. https://gethomepage.dev/configs/docker/
#
# `localhost-docker` is the name services.yaml refers to via
# `server: localhost-docker`. Homepage uses the mounted /var/run/docker.sock
# (read-only) to render container state on each tile.
localhost-docker:
socket: /var/run/docker.sock

View File

@@ -0,0 +1,80 @@
# Service tiles for the localgenai stack. Edit in place — pyinfra
# ships this once and never overwrites.
#
# Widget reference: https://gethomepage.dev/widgets/
- Inference:
- Ollama:
icon: ollama.svg
href: http://framework:11434
description: Local model server (Qwen3-Coder-30B and friends)
server: localhost-docker
container: ollama
widget:
type: ollama
url: http://framework:11434
- llama.cpp:
icon: si-llama
href: http://framework:8080
description: Vulkan-backed llama.cpp server (gfx1151)
server: localhost-docker
container: llama
# No native widget; a ping check confirms liveness.
widget:
type: customapi
url: http://framework:8080/health
refreshInterval: 30000
mappings:
- field: status
label: Status
- vLLM:
icon: mdi-server-network
href: http://framework:8000
description: Batched OpenAI-compatible serving (ROCm)
server: localhost-docker
container: vllm
- Agent UIs:
- OpenWebUI:
icon: open-webui.svg
href: http://framework:3000
description: Chat UI in front of Ollama, with SearXNG search
server: localhost-docker
container: openwebui
- OpenHands:
icon: mdi-robot
href: http://framework:3030
description: Autonomous coding agent (loopback — needs SSH tunnel)
server: localhost-docker
container: openhands
- Observability:
- Beszel:
icon: beszel.svg
href: http://framework:8090
description: Host + container + AMD GPU dashboard
server: localhost-docker
container: beszel
- OpenLIT:
icon: mdi-chart-line-variant
href: http://framework:3001
description: LLM fleet metrics (cost, tokens, latency)
server: localhost-docker
container: openlit
- Phoenix:
icon: arize-phoenix.svg
href: http://framework:6006
description: Per-trace agent waterfall / flamegraph
server: localhost-docker
container: phoenix
- External:
- SearXNG:
icon: searxng.svg
href: https://searxng.n0n.io
description: Self-hosted metasearch (used by OpenWebUI + OpenCode)

View File

@@ -0,0 +1,26 @@
# Top-level dashboard settings. https://gethomepage.dev/configs/settings/
title: localgenai
favicon: https://gethomepage.dev/favicon.ico
theme: dark
color: slate
headerStyle: clean
language: en
target: _blank
# Layout: keep the four service groups in a 3-column grid each so a tile
# fits comfortably without wrapping on a 1440-wide laptop.
layout:
Inference:
style: row
columns: 3
Agent UIs:
style: row
columns: 3
Observability:
style: row
columns: 3
External:
style: row
columns: 3

View File

@@ -0,0 +1,19 @@
# Top-of-page widgets. https://gethomepage.dev/widgets/info/
- search:
provider: custom
url: https://searxng.n0n.io/search?q=
target: _blank
focus: true
- resources:
label: framework
cpu: true
memory: true
disk: /
- datetime:
text_size: xl
format:
timeStyle: short
dateStyle: medium