Repository navigation
Projects: simple load balancers with targets, services, domains (+ live UI) - #2
Merged
Merged
Conversation
…ervices, domains Rewrite the spec and README around projects (Overview, Graphs, Targets, Services, Domains). Each project gets its own port; attached domains are routed on the shared :80/:443 with automatic HTTPS. ADR 0006 supersedes ADR 0005. Record the newly verified HAProxy behaviour (domain routing on sys_http, maintenance inside a backend). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159fEExV6P6AdgP7HbsJNBc
Replace user-facing frontends/backends with projects (table balancers): - services listen on their own port (auto 20000-29999; 80/443 reserved), each compiled to fe_<id>/be_<id> sharing the project targets - domains route by Host on shared sys_http/sys_https, exact hosts before wildcards; certificates are issued automatically once a domain resolves - project metrics (pr scope) include domain traffic; target health is reported per service; events carry project_id - migration 0002 upgrades frontend/backend databases (domains kept) - CLI: loxy projects ls Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159fEExV6P6AdgP7HbsJNBc
…ains Projects list and create wizard (own port by default, optional domain), per-project tabs, domain cards with DNS records and certificate status. Target health refreshes while the page is open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159fEExV6P6AdgP7HbsJNBc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159fEExV6P6AdgP7HbsJNBc
- Sticky cookie secure only when no plain-HTTP domain reaches the backend. - Maintenance 503 rendered once, in every http backend (covers ports and domains); tcp keeps the frontend reject. - Migration 0002 renames stored server.health.changed alert kinds. - Deleting a project deletes its domains and their managed DNS records. - Automatic certificate issuance re-checks the domain in the transaction and is serialized (no duplicate certificates). - Detached domains stay editable; long FQDNs get valid certificate names. - Panel on :80/:443 blocks domains instead of refusing to start. - Domains indexed per project in the snapshot; UI timeout up to 86400 s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159fEExV6P6AdgP7HbsJNBc
Ephemeral event with per-project status, health, traffic and a health fingerprint (changes when any target check changes), plus node totals. Ephemeral events are no longer kept in the reconnect replay buffer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159fEExV6P6AdgP7HbsJNBc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159fEExV6P6AdgP7HbsJNBc
Design brief in web/DESIGN.md (design skills: frontend-design, emil-design-eng, ui-ux-pro-max, impeccable, web-design-guidelines). - Calm console look, light/dark, self-hosted Hanken Grotesk + JetBrains Mono (OFL, no new npm deps); route strip on project overview. - Responsive: collapsible sidebar, tablet rail, phone bottom bar, tables become cards, dialogs become sheets. - Live: live.tick drives lists, dashboard, headers and target health (refetch on health_sig change, polling removed); live sparklines and a real-time 15-minute graphs view; Live/Reconnecting indicator; "Applying..." while HAProxy catches up; plain-language check results. - Simpler create flow: name, where traffic goes, how people reach it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159fEExV6P6AdgP7HbsJNBc
2shiraz
marked this pull request as ready for review
October 14, 2026 16:26
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR makes Loxy simpler: a project is one load balancer. Each project has Overview, Graphs, Targets, Services, Domains, Logs and Settings tabs. The UI is redesigned to be modern, responsive and always live.
How it works
ip:port), a host from the inventory, or a label selector. Health is checked per service. Changes are applied at runtime with drain-before-remove.fe_<id>/be_<id>). Domains use sharedsys_http/sys_httpsfrontends.UI redesign
The design brief is in
web/DESIGN.md. It was produced with the frontend-design, emil-design-eng, ui-ux-pro-max, impeccable and web-design-guidelines skills.live.tickevent every 2 s drives lists, the dashboard, project headers and target health.Upgrade
Migration
0002_projects.sqlupgrades databases from the frontend/backend version:Decisions
Verification
haproxy:3.4.6-alpinepass:npm run check: 0 errors and 0 warnings. The initial bundle is 64 KB gzip (budget 150 KB).Screenshots are in
docs/screenshots/, including mobile.🤖 Generated with Claude Code
https://claude.ai/code/session_0159fEExV6P6AdgP7HbsJNBc