Initial vibeproxy implementation

Self-contained HTTP/HTTPS/TCP/UDP reverse proxy manager written in Go,
with SQLite storage, a Bootstrap 5 admin UI (Go templates, no JS
framework), and a REST API under /api/v1.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QTXFrNP1imCW7jtfL5SZrw
This commit is contained in:
2026-08-17 10:28:59 -05:00
co-authored by Claude Sonnet 5
commit ba1f7c4c03
105 changed files with 9142 additions and 0 deletions
+118
View File
@@ -0,0 +1,118 @@
:root {
--vp-sidebar-w: 240px;
}
body {
background-color: #f4f6f9;
}
.vp-shell {
display: flex;
min-height: 100vh;
}
.vp-sidebar {
width: var(--vp-sidebar-w);
flex-shrink: 0;
background-color: #1b2430;
color: #cfd6e2;
position: sticky;
top: 0;
height: 100vh;
}
.vp-brand {
color: #fff;
text-decoration: none;
font-weight: 600;
font-size: 1.1rem;
padding: 1.1rem 1.25rem;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.vp-brand i {
color: #4dabf7;
}
.vp-nav {
padding: 0.75rem 0.5rem;
flex: 1;
}
.vp-nav .nav-link {
color: #a9b4c4;
border-radius: 0.4rem;
padding: 0.55rem 0.85rem;
margin-bottom: 0.15rem;
font-size: 0.92rem;
}
.vp-nav .nav-link i {
width: 1.25rem;
display: inline-block;
text-align: center;
margin-right: 0.4rem;
}
.vp-nav .nav-link:hover {
background-color: rgba(255, 255, 255, 0.06);
color: #fff;
}
.vp-nav .nav-link.active {
background-color: #2c5cc5;
color: #fff;
}
.vp-sidebar-footer {
padding: 0.85rem 1.25rem;
border-top: 1px solid rgba(255, 255, 255, 0.08);
}
.vp-main {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
}
.vp-topbar {
background: #fff;
border-bottom: 1px solid #e5e9f0;
padding: 0.9rem 1.5rem;
}
.vp-content {
padding: 1.5rem;
flex: 1;
}
.vp-chip-list {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
margin-bottom: 0.5rem;
}
.vp-chip {
font-weight: 500;
padding: 0.4rem 0.6rem;
}
.stat-card {
border: none;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
}
.stat-card .stat-value {
font-size: 1.7rem;
font-weight: 700;
}
.table-hover tbody tr {
cursor: default;
}
code.vp-token {
word-break: break-all;
}