No description
  • Go 57.1%
  • JavaScript 30.3%
  • CSS 9.7%
  • HTML 1.6%
  • Dockerfile 1%
  • Other 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Ivan Pavlina cb16b37ace
All checks were successful
ci / check (push) Successful in 1m25s
ci / docker (push) Successful in 28s
ci / notify (push) Successful in 1s
ci: drop the repull job, the router repulls on its own
The router scheduler repull-tick checks the git.exithub.net images every
minute, so CI no longer needs SSH access to the router.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 11:07:05 +02:00
.forgejo/workflows ci: drop the repull job, the router repulls on its own 2026-10-20 11:07:05 +02:00
cmd/portal usage: several Claude accounts, their usage, and switching between them 2026-10-17 18:08:31 +02:00
internal usage: several Claude accounts, their usage, and switching between them 2026-10-17 18:08:31 +02:00
.dockerignore Portal: a small dashboard to replace the Muximux fork 2026-10-12 13:34:46 +02:00
.gitignore Portal: a small dashboard to replace the Muximux fork 2026-10-12 13:34:46 +02:00
CLAUDE.md ci: drop the repull job, the router repulls on its own 2026-10-20 11:07:05 +02:00
Dockerfile Portal: a small dashboard to replace the Muximux fork 2026-10-12 13:34:46 +02:00
go.mod Portal: a small dashboard to replace the Muximux fork 2026-10-12 13:34:46 +02:00
go.sh Portal: a small dashboard to replace the Muximux fork 2026-10-12 13:34:46 +02:00
go.sum Portal: a small dashboard to replace the Muximux fork 2026-10-12 13:34:46 +02:00
README.md ci: drop the repull job, the router repulls on its own 2026-10-20 11:07:05 +02:00

Portal

A small dashboard for one homelab: a bar of apps that open in iframes (or in a new tab), grouped into drop-down menus, edited in the browser and stored in one YAML file. It replaces a fork of Muximux and reads Muximux's config.yaml as it is.

  • Username and password sign-in; sessions are signed cookies that survive restarts.
  • Apps stay loaded in the background, can be pinned, get keys 1–9 and an address of their own (/<name>).
  • Apps in frames can show badges on the bar and the browser tab.
  • Icons from dashboard-icons, Lucide, a URL or an upload.
  • Everything is edited in the browser, including drag-and-drop order.
  • Optional meters for Claude Code session and weekly usage, for several Claude accounts, with a switch for the one Claude Code uses.

Quick start

docker run -d -p 8080:8080 -v portal-data:/data git.exithub.net/ivan.pavlina/portal:latest

Open http://localhost:8080; with no users yet, the login page creates the account. /data holds config.yaml (plus config.yaml.bak), session.key and the icon cache. PORTAL_DATA and PORTAL_ADDR (default :8080) override the data directory and the listen address.

From source, without a Go install on the host:

bash go.sh test ./...

Build and deploy

A push to main runs the Forgejo workflow: checks (vet, race tests, gofmt, govulncheck, staticcheck), then a multi-arch image (amd64 and arm64) pushed to git.exithub.net/ivan.pavlina/portal, then the router running it (a MikroTik RB5009) repulls it by itself (scheduler repull-tick).

More

Configuration, the badge protocol, design decisions, testing and gotchas are in CLAUDE.md.