Skip to content

Admin UI

Admin UI

Web dashboard for Pvdify at pvdify.win.

Overview

The Admin UI provides a visual interface for managing apps, releases, config, and domains. Built with Svelte and SvelteKit.

Access

URL: https://pvdify.win

Authentication via Cloudflare Access:

  • Email OTP
  • GitHub OAuth (planned)

Features

Dashboard

Home view showing:

  • All apps with status indicators
  • Recent deployments
  • System health
  • Quick actions
┌──────────────────────────────────────────────────────────┐
│ Pvdify [user@email] │
├──────────────────────────────────────────────────────────┤
│ │
│ Apps (5) [+ New App] │
│ ┌────────────────────────────────────────────────────┐ │
│ │ ● myapp production v42 running │ │
│ │ ● myapp-staging staging v15 running │ │
│ │ ○ myapp-pr-123 preview v1 deploying │ │
│ │ ● api-service production v8 running │ │
│ │ ● worker-service production v12 running │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ Recent Activity │
│ • myapp deployed v42 (5 min ago) │
│ • api-service config updated (1 hour ago) │
│ • myapp-pr-123 preview created (2 hours ago) │
│ │
└──────────────────────────────────────────────────────────┘

App Detail

Per-app management:

┌──────────────────────────────────────────────────────────┐
│ ← Back myapp [Deploy] [⚙️] │
├──────────────────────────────────────────────────────────┤
│ │
│ Status: ● Running │
│ Environment: production │
│ Image: ghcr.io/org/app:v1.2.3 │
│ Release: v42 (deployed 5 minutes ago) │
│ │
│ ┌─────────┬─────────┬─────────┬─────────┬─────────┐ │
│ │ Overview│ Releases│ Config │ Domains │ Logs │ │
│ └─────────┴─────────┴─────────┴─────────┴─────────┘ │
│ │
│ Processes │
│ ┌────────────────────────────────────────────────────┐ │
│ │ web.1 ● running 2h uptime [Restart] │ │
│ │ web.2 ● running 2h uptime [Restart] │ │
│ │ worker.1 ● running 2h uptime [Restart] │ │
│ └────────────────────────────────────────────────────┘ │
│ [Scale Processes] │
│ │
│ Domains │
│ • myapp.com (SSL ✓) │
│ • www.myapp.com (SSL ✓) │
│ [+ Add Domain] │
│ │
└──────────────────────────────────────────────────────────┘

Releases

Release history with rollback:

┌──────────────────────────────────────────────────────────┐
│ Releases │
├──────────────────────────────────────────────────────────┤
│ │
│ v42 ● Active [Current] │
│ ghcr.io/org/app:v1.2.3 │
│ Deployed by gh-actions • 5 minutes ago │
│ │
│ v41 [Rollback] │
│ ghcr.io/org/app:v1.2.2 │
│ Deployed by user@email • 1 day ago │
│ │
│ v40 [Rollback] │
│ ghcr.io/org/app:v1.2.1 │
│ Deployed by gh-actions • 3 days ago │
│ │
└──────────────────────────────────────────────────────────┘

Config Editor

Environment variable management:

┌──────────────────────────────────────────────────────────┐
│ Config [+ Add Var] │
├──────────────────────────────────────────────────────────┤
│ │
│ NODE_ENV production [Edit] │
│ DATABASE_URL postgres://... [Edit] │
│ API_KEY ●●●●●●●● (secret) [Edit] │
│ REDIS_URL redis://... [Edit] │
│ │
│ Version: v3 (updated 1 hour ago) │
│ [View History] │
│ │
└──────────────────────────────────────────────────────────┘

Config Versions History

View and restore previous config versions:

┌──────────────────────────────────────────────────────────┐
│ Config History [Close] │
├──────────────────────────────────────────────────────────┤
│ │
│ v3 ● Current 2026-01-05 10:30 [Restore] │
│ Changes: API_KEY, REDIS_URL │
│ │
│ v2 2026-01-03 10:00 [Restore] │
│ Changes: DATABASE_URL │
│ │
│ v1 2026-01-01 10:00 [Restore] │
│ Changes: NODE_ENV │
│ │
└──────────────────────────────────────────────────────────┘

Click View History in the Config tab to see all versions with timestamps and change lists. Click Restore to revert to a previous configuration.

Log Viewer

Real-time log streaming:

┌──────────────────────────────────────────────────────────┐
│ Logs [All ▼] [Follow ✓] [Download] │
├──────────────────────────────────────────────────────────┤
│ │
│ 2026-01-05 10:30:01 [web.1] Server started on :3001 │
│ 2026-01-05 10:30:02 [web.1] Connected to database │
│ 2026-01-05 10:30:05 [web.1] GET /health 200 2ms │
│ 2026-01-05 10:30:10 [web.2] Server started on :3001 │
│ 2026-01-05 10:30:15 [worker.1] Processing job abc123 │
│ 2026-01-05 10:30:20 [web.1] GET /api/users 200 45ms │
│ █ │
│ │
└──────────────────────────────────────────────────────────┘

Domain Management

┌──────────────────────────────────────────────────────────┐
│ Domains [+ Add Domain] │
├──────────────────────────────────────────────────────────┤
│ │
│ myapp.com │
│ Status: ● Active SSL: ✓ Full (strict) │
│ DNS: CNAME → tunnel.cfargotunnel.com │
│ [Verify] [Remove] │
│ │
│ www.myapp.com │
│ Status: ● Active SSL: ✓ Full (strict) │
│ DNS: CNAME → tunnel.cfargotunnel.com │
│ [Verify] [Remove] │
│ │
└──────────────────────────────────────────────────────────┘

Deployment

Deploy Modal

One-click deploy from UI:

┌────────────────────────────────────────┐
│ Deploy myapp │
├────────────────────────────────────────┤
│ │
│ Image: │
│ ┌──────────────────────────────────┐ │
│ │ ghcr.io/org/app:v1.2.4 │ │
│ └──────────────────────────────────┘ │
│ │
│ Recent images: │
│ • ghcr.io/org/app:v1.2.3 │
│ • ghcr.io/org/app:v1.2.2 │
│ │
│ [Cancel] [Deploy] │
│ │
└────────────────────────────────────────┘

Scale Modal

Adjust process counts:

┌────────────────────────────────────────┐
│ Scale Processes │
├────────────────────────────────────────┤
│ │
│ Web: [2] [▲] [▼] │
│ Worker: [1] [▲] [▼] │
│ │
│ Resource limits: │
│ Memory: 512M per process │
│ CPU: 0.5 per process │
│ │
│ [Cancel] [Scale] │
│ │
└────────────────────────────────────────┘

Click Scale Processes in the app detail view to adjust the number of running instances for each process type.

Technical Stack

ComponentTechnology
FrameworkSvelteKit
StylingTailwind CSS
IconsLucide
AuthCloudflare Access
APIpvdifyd REST API
Real-timeServer-Sent Events

Development

Terminal window
# Clone and install
git clone https://github.com/pvdify/admin-ui
cd admin-ui
npm install
# Development server
npm run dev
# Build for production
npm run build
# Deploy to production (on VPS)
systemctl restart pvdifyd

Hosting

Served by pvdifyd as static files:

  • Source: /opt/pvdify/admin-ui/dist/
  • Domain: pvdify.win (via Cloudflare Tunnel)
  • Access: Cloudflare Access (email OTP)
  • Deployment: Build locally, restart pvdifyd
Terminal window
# Build
cd /opt/pvdify/admin-ui
npm run build
# Restart pvdifyd to serve new static files
systemctl restart pvdifyd