Generated Computers
Locals: an Apple Silicon engine that runs local LLMs up to 3x faster. A product of Generated Computers.
Translation pending
Replaces Portainer CE + Uptime Kuma + Dozzle in a single <20MB binary. Sub-15ms cold start, deterministic memory under 20MB, native Docker socket streaming, and embedded SQLite WAL.
Translation pending
Developer toolsTypeScript · C#GitHub @brhnshnOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Lightweight, Native AOT Server Launcher & Monitoring Dashboard for Self-Hosted Nodes & Homelabs (<30MB RAM)
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Most homelabs end up running a container manager, an uptime monitor and a status page side by side. Corvus does all of it in one container, with an embedded SQLite database and no external services.
| 🐳 Docker | 📈 Uptime & SSL | 🌐 Status Page | 🛰️ Multi-Node |
|---|---|---|---|
| Start, stop, logs, web terminal, Compose editor and 1-click deployments with rollback | HTTP/TCP/ping checks, SSL expiry, alerts to Discord, Telegram, Slack, email, ntfy and webhooks | Public, unauthenticated status page with incidents and maintenance notes | Outbound-only edge agent (<10 MB RAM) brings remote VPS nodes into the same panel |
How light is it? In production, next to 17 other containers, docker stats reports ~26 MB for Corvus. That comes from Native AOT compilation (no JIT, no runtime VM), a ~45 MB image and aggressive GC/malloc_trim tuning, explained below.
Get Corvus up and running on your Docker host with a single command:
docker run -d \
--name corvus \
--restart unless-stopped \
-p 8090:8090 \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v corvus-data:/data \
ghcr.io/brhnshn/corvus:latest
compose.yaml)services:
corvus:
image: ghcr.io/brhnshn/corvus:latest
container_name: corvus
restart: unless-stopped
ports:
- "8090:8090"
environment:
- CORVUS_PORT=8090
- CORVUS_DATA_DIR=/data
- DOCKER_SOCKET=/var/run/docker.sock
- CORVUS_AUTH_ENABLED=true
- CORVUS_AUTH_USER=admin
- CORVUS_AUTH_PASS=corvus123
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- corvus-data:/data
volumes:
corvus-data:
docker compose up -d
Optional: socket proxy (tecnativa/docker-socket-proxy). Mounting docker.sock read-write is effectively root access to the host. Instead, Corvus can reach Docker over plain TCP (DOCKER_HOST=tcp://socket-proxy:2375, which takes precedence over DOCKER_SOCKET; TLS-enabled TCP is not supported). A commented example is included in docker-compose.yml. unix:// prefixes are also accepted.
Deploy the ultra-lightweight (<10 MB RAM) edge agent to monitor additional VPS nodes without opening inbound ports:
docker run -d \
--name corvus-agent \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-e CORVUS_HUB_URL=wss://corvus.yourdomain.com \
-e CORVUS_SYSTEM_TOKEN=crv_live_... \
ghcr.io/brhnshn/corvus-agent:latest
Open your browser at http://localhost:8090 (or public status page at http://localhost:8090/status).
| Architectural Aspect | Corvus Design Approach | Traditional Heavy Stacks |
|---|---|---|
| Container Footprint | Single All-in-One Container (~45 MB image) | Multi-container setups (App + Database + Cache) |
| Idle Memory (RAM) | <30 MB RAM for all features combined (Workstation GC + malloc_trim) | One process per tool, each with its own memory budget |
| Database Dependency | Zero External DB (Embedded SQLite WAL, single .db file) | Some tools require a dedicated PostgreSQL or MongoDB |
| Docker Integration | Socket (:ro for monitoring only) or least-privilege socket proxy | Direct root-equivalent socket access |
| Combined Scope | Container Lifecycle + Extended Uptime & SSL + Public Status Page | Fragmented across 2-3 separate tools |
| Backup / Portability | Single-file copy or VACUUM INTO snapshot download | Database dumps (pg_dump, mongodump, volume exports) |
Corvus is built from the ground up to challenge the misconception that modern enterprise frameworks require heavy containers:
PublishAot=true) directly to an optimized Linux x64/ARM64 ELF executable. There is no JIT compilation, dynamic IL generation, or heavy runtime metadata bundled in the image.mcr.microsoft.com/dotnet/runtime-deps:9.0 (chiseled minimal glibc), keeping the base OS layer at only ~13 MB.ServerGarbageCollection=false, DOTNET_gcConcurrent=0).DOTNET_GCConserveMemory=9).MALLOC_ARENA_MAX=2).MemoryTrimmerBackgroundService that flushes SQLite connection pools and invokes native malloc_trim(0) every 3 minutes.RetentionCleanupService), ensuring database files never suffer from unmonitored disk bloat.🚀 Native AOT Container Deployment Center & CI/CD Inbound Webhook:
DeploymentEngine.cs): 1-click rolling container deployments with discrete 5-step visual progress stepper (Queued ➔ Pulling ➔ Recreating ➔ Healthcheck ➔ Live).${name}_corvus_backup_${timestamp}_${guid}) and executes ordered zero-downtime rollback if startup or healthchecks fail.IEventBroadcaster, while batching writes to SQLite WAL to eliminate database locks (SQLITE_BUSY).&wait=true): POST /api/hooks/deploy/{token}?wait=true keeps the HTTP connection open and returns HTTP 200 on success or HTTP 500 on failure, enabling GitHub Actions workflows to fail immediately on bad deployments without external tooling.localStorage across page refreshes.🌐 Multi-Node Systems Cockpit & Edge Agent (/systems):
/agent/connect), requiring zero open ports or firewall changes on monitored nodes.src/Corvus.Agent): Standalone .NET 9 Native AOT executable consuming <10 MB RAM, collecting CPU, RAM, Disk, and Network telemetries directly via Linux /proc filesystem.Corvus Architecture:
┌────────────────────────────────────────────────────────┐
│ Corvus Web Dashboard │
│ (React 19 + TypeScript + Tailwind v4 + Recharts) │
│ [Routes: Dashboard, Services, Containers, Uptime, │
│ Metrics, Settings, Public Status (/status)] │
└───────────────────────────┬────────────────────────────┘
│ REST API + SSE Stream (/api/stream/events)
┌───────────────────────────▼────────────────────────────┐
│ Corvus Core Engine │
│ ASP.NET Core Minimal API (.NET 9 Native AOT) │
├───────────────────────────┬────────────────────────────┤
│ Docker REST API Client │ SQLite + Dapper.AOT │
│ (SocketsHttpHandler) │ (DbUp Migrations 001-006) │
├───────────────────────────┴────────────────────────────┤
│ Core Services: │
│ - DockerLogDemuxer (Zero-alloc multiplexed demuxer) │
│ - NotificationService (Discord, Telegram, Ntfy, Web) │
│ - EventBroadcaster (Channel<ServerEventDto> for SSE) │
│ - AuthService (Zero-Trust SSO + Session Cookies) │
├────────────────────────────────────────────────────────┤
│ Background Services: │
│ - ContainerDiscoveryService (10s) │
│ - SystemMetricsCollector (15s) │
│ - UptimeCheckerService (TCP Ping, SSL, Snitch - 60s) │
│ - RetentionCleanupService (24h) │
└────────────────────────────────────────────────────────┘
Enhance your containers with Corvus metadata labels in your compose files:
labels:
- "corvus.name=Nextcloud Hub"
- "corvus.category=Cloud Storage"
- "corvus.description=Personal file sync and share"
- "corvus.url=https://cloud.example.com"
- "corvus.healthcheck=https://cloud.example.com/status.php"
- "corvus.icon=cloud"
- "corvus.ignore=false"
| Method & Path | Description |
|---|---|
GET /api/dashboard/summary | Consolidated KPI overview |
GET /api/services | Service catalogue with ordering and SSL info |
PUT /api/services/reorder | Update visual service ordering |
GET /api/status-page | Public unauthenticated system status summary (services, 30-check sparklines & incidents) |
GET /api/incidents | List active and historical system incidents & maintenance notices |
POST /api/incidents | Create a new system incident or maintenance notice |
PUT /api/incidents/{id} | Update incident details, severity, or message |
POST /api/incidents/{id}/resolve | Mark an incident as resolved |
DELETE /api/incidents/{id} | Remove an incident record |
GET /api/uptime/{id}/daily-stats | 365-day daily uptime rollup statistics |
GET /api/containers | Docker containers list with state and ports |
GET /api/containers/{id}/stats | Live container CPU%, RAM, Net I/O |
GET /api/containers/{id}/logs | Snapshot container logs |
GET /api/containers/{id}/logs/stream | Real-time SSE container log stream |
POST /api/containers/{id}/start | Start container |
POST /api/containers/{id}/stop | Stop container |
POST /api/containers/{id}/pause | Pause container |
POST /api/containers/{id}/unpause | Unpause container |
POST /api/containers/{id}/restart | Restart container |
GET /api/push-monitors | List Dead Man's Snitch periodic push monitors |
POST /api/push-monitors | Create new Dead Man's Snitch monitor |
POST /api/push/{token} |
cd src/Corvus.Web
npm install
npm run build
cd ../Corvus.Api
dotnet run
# Backend Tests (375 passing xUnit tests)
dotnet test tests/Corvus.Api.Tests
# Frontend Tests (66 passing Vitest tests)
cd src/Corvus.Web && npm test
Corvus is inspired by the architectural philosophies of pioneering open-source homelab, container management, and observability tools, re-imagined from the ground up as a single, ultra-lightweight .NET 9 Native AOT command center:
This project is licensed under the MIT License.
/api/systems/{id}/stream): Delivers ultra-responsive real-time metric streams straight to the dashboard with zero polling overhead.start, stop, restart, logs) across disparate VPS nodes directly through the Corvus UI cockpit.crv_live_...).⚙️ Linux Systemd Service Management & Live Journalctl:
/api/systemd/services).journalctl -u {service} -n 100.📝 Visual Docker Compose & .env Stack Editor:
.bak backups before saves.⌨️ Universal Command Palette (Ctrl+K / Cmd+K) & Micro-Animations:
fuzzySearch.ts): Lightweight string matching algorithm delivering instant results across all pages, containers, actions, and settings.↑/↓/Enter) with quick shortcuts (G D Dashboard, G C Containers, G S Systems, G A Activity, R Refresh).PageTransition.tsx, useAnimatedNumber.ts, Skeleton.tsx): 180-220ms spring physics entrance transitions honoring prefers-reduced-motion, smooth live metric counter interpolations, and shimmer skeleton loading states.📜 Event History & Audit Timeline (/activity):
015_activity_logs.sql): Captures container lifecycle changes (start, stop, restart), metric threshold alerts, and administrator actions.ActivityLogService.cs): High-throughput, zero-latency buffered queuing using System.Threading.Channels with automated retention cleanup.ActivityTimeline/): Filter by event categories (container, alert, security, service, system), search by resource, and view detailed JSON payloads.🚨 Proactive Metric Threshold Alerting Engine:
014_alert_rules.sql): Set CPU, RAM, and Disk % thresholds with customizable evaluation duration and anti-spam cooldown protection.ThresholdEvaluatorService.cs): Continuous 20-second evaluation preventing false positives from transient spikes.[RESOLVED] recovery notifications dispatched across Discord, Telegram, Slack, SMTP, Ntfy, and Webhooks.🎨 ObsidianUI Design System & Motion Physics Engine:
#F5F6F8) with zero distracting gradients.#34d399, 70-89% amber #fbbf24, >=90% rose #f87171).cubic-bezier(0.16, 1, 0.3, 1)) with native prefers-reduced-motion compliance.src/components/ui/): Enterprise-grade, type-safe components adhering to the zero-monolith clean architecture rule: Button, Modal, Pill, ProgressBar, StatTile, SearchInput, FilterChip, TagChip, Segment, Sheet, Toast, EmptyState, SslBadge, HistoryBars.🔐 3-Tier Role-Based Access Control (RBAC) & Security Hardening:
admin (full system mutation), operator (container & stack operations), and viewer (read-only audit) roles protected at the endpoint level via CorvusAuthFilter.SsrfGuard): Prohibits requests to AWS/GCP/Azure Cloud Metadata (169.254.169.254), IPv6 link-local addresses, and DNS rebinding attacks across uptime health probes and outbound webhooks.smtp_pass, webhook secrets) are masked on API responses.user_sessions table): Ensures user sessions survive container upgrades, restarts, and redeployments without losing sub-microsecond in-memory verification./profile): Self-service password updates, 2FA management, and administrative user provisioning.corvus_unauthorized session interceptor and resilient dynamic module reloader (lazyWithRetry & ChunkErrorBoundary).📱 Mobile Glass Bottom Navigation Bar:
BottomNav.tsx) with expanding active tabs, sliding indicator, and safe-area notch padding.🌍 Fully Bilingual & Compile-Time i18n:
DeepStringify).en) as default, Turkish (tr) fully supported with one-click seamless switcher.🧠 In-Memory Micro-Cache & Aggressive Memory Compaction (Memory Trimmer):
GET /api/containers/stats-summary) with one-shot=true and sliding CPU delta calculation, eliminating Docker Engine 1-second sampling sleep and delivering sub-100ms instant metrics.ClearAllPools), truncates WAL logs via PRAGMA wal_checkpoint(TRUNCATE);, invokes Gen 2 aggressive compacting GC, and calls Linux libc malloc_trim(0).DOTNET_gcConcurrent=0) and DOTNET_GCConserveMemory=9 locking idle RAM strictly between 20–30 MB.VACUUM; after daily cleanups to return orphaned freelist storage directly back to the host filesystem.🚀 Dual-Mode Service Launcher & Smart Container Sync:
/var/run/docker.sock). Caches unchanged container environment variables via _inspectCache and skips redundant database write transactions using ComputeFingerprint.display_order.🛡️ Advanced 3-State Resilience & Health Engine:
healthy ➔ degraded ➔ down state machine: Prevents panicky false alarms during transient network glitches; only raises alarms after 3 consecutive failures.Parallel.ForEachAsync with bounded concurrency.host.docker.internal / default bridge gateway routing).⏱️ Extended Endpoint Uptime, ICMP Ping & Proactive SSL Expiry:
System.Net.NetworkInformation.Ping for bare-metal nodes, switches, and routers (checkType: 'ping').POST /api/uptime/test-connection) before opting in.Host(...)), Caddy labels, VIRTUAL_HOST, LETSENCRYPT_HOST, and container environment variables (NEXT_PUBLIC_SITE_URL, SITE_URL, APP_URL) to bind public domains instead of unreachable host loopbacks.AdvancedCheckOptions): Independent per-service check intervals (check_interval: 10s-300s), custom timeouts (timeout_seconds), failure tolerance (max_retries / retry_interval), ignore TLS errors (ignore_tls), accepted HTTP status codes (accepted_status_codes, e.g. 200-299, 401), and HTTP method selection (GET/POST/HEAD).checkType: 'docker').🏷️ Multi-Environment Tagging & Quick Filtering:
Prod, Staging, DB, Internal, API) to services and containers with deterministic FNV-1a pastel coloring.corvus.tags, environment, env, com.docker.compose.project) with SQLite-persisted user overrides (PUT /api/containers/{id}/tags).TagFilterBar) across both Services and Containers pages with instant count badges.🦅 Pure Vector Brand Identity (Hex Sentinel):
favicon.ico, pure vector favicon.svg, mobile PWA manifest, and comprehensive brand guidelines (docs/branding/BRAND_GUIDELINES.md).💾 Dual-Mode Backup Management & Disaster Recovery:
VACUUM INTO point-in-time database snapshot download (GET /api/backup/download), lock-free and instantly updating Dashboard stats via SSE.restic, borg, cron) with dynamic token generator and auto-configured curl snippets.🧹 Flexible Data Retention & Storage Telemetry:
is_transition = 0) while preserving transition audit records and populating 365-day lightweight daily summaries (uptime_daily_stats).GET /api/settings/db-stats).RetentionCleanupService) with SQLite PRAGMA optimize;.🖥️ Dedicated Full-Page Container Dashboard (/containers/:id):
?tab=) support (pages/ContainerDetail/).ContainerHistoricalCharts.tsx): Responsive Recharts Area charts rendering real-time CPU % load and memory usage trends with dynamic color degradation, custom tooltips, and memory limit context.inspectHelpers.ts): Bridges Docker daemon PascalCase properties with client-side camelCase structures, ensuring complete and error-free display of Environment Variables (Env), Exposed Port Bindings, Connected Docker Networks, and Storage Volume Mounts.POST /api/containers/{id}/update): Dynamically adjust CPU cores (NanoCpus), RAM limits (Memory), and Restart Policies without stopping or restarting the container.TerminalTab.tsx) and keyword-filtered, auto-scrolling SSE log viewer (LogsTab.tsx).⚡ Fluid Row-Click Navigation & Quick Actions Toolbar (ContainerQuickActions.tsx):
ContainerRow.tsx): Replaced 3-dots menu friction with full-row clickability featuring subtle micro-interaction transitions (hover:bg-white/[0.08] active:scale-[0.998] transition-all), navigating straight into /containers/:id.FileText), Container Overview (Info), Telemetry & Resource Limits (Activity), and Web Terminal (Terminal).host:port ↗) behave as direct anchor links opening in a new browser tab with event bubbling isolation.📦 OCI Registry Image Sentinel & Digest Tracking:
OciRegistryClient.cs): Performs zero-byte HEAD requests to /v2/{repo}/manifests/{tag} against Docker Hub, GitHub Container Registry (GHCR), and Quay to detect upstream image releases without downloading heavy layers.POST /api/containers/{id}/recreate): Amber "Update Available" indicator badge across container lists and 1-click recreate modal (ImageUpdateModal.tsx) pulling the latest image and seamlessly re-spawning the container with identical configuration.📝 Docker Compose YAML Inspector & Safe In-Place Editor:
ComposeFileService.cs, ComposeEndpoints.cs): Resolves Compose files via container labels, strictly blocks directory traversal (..), and automatically takes timestamped .bak backups before writing to disk.ComposeConfigModal.tsx): Monospace YAML editor with line counts, file size indicators, and "Save & Restart Stack" capabilities.ComposeStackGroup.tsx): Bulk Restart Stack, Start Stack, and Stop Stack actions directly on Compose project headers.🛡️ Event-Driven Auto-Healing & Inbound Deploy Webhooks:
AutoHealingService.cs): Revives crashed containers upon abnormal exit codes (ExitCode != 0, OOMKilled), guarded by a thread-safe sliding window (max 2 restarts within 15 minutes) to avoid infinite flapping loops.NotificationService.cs): Multi-channel alerts dispatched across Discord, Telegram, Slack, SMTP, Ntfy, and Webhooks on successful auto-restart.DeployWebhookEndpoints.cs): CI/CD deploy webhook endpoint (POST /api/hooks/deploy/{token}) verified via cryptographic constant-time comparison (CryptographicOperations.FixedTimeEquals).🪵 Interactive Web Terminal (Exec Shell) & Log Streaming:
/bin/bash -> /bin/sh -> /bin/ash -> sh): Interactive shell access directly into running containers via zero-allocation ASP.NET Core Native AOT WebSocket proxy (ArrayPool<byte>, 8 KB static buffer footprint).FlushAsync), dynamic UTF-8 handshake calculations, ANSI 256-color support (TERM=xterm-256color), and strict RBAC protection ([RequireAdmin], 403 Forbidden).DockerLogDemuxer.cs) for Docker stdout/stderr streams.⚡ Safe Dry-Run System Prune (SystemPruneModal.tsx):
GET /system/df with itemized tables for Stopped Containers, Unused Images, Orphaned Volumes (safeguarded by default with data-loss warnings), and Build Cache before selective deletion (POST /api/containers/prune/selective).🔔 Multi-Channel Alerting Engine & Flapping Protection:
IFlappingDetector): Sliding-window transition tracking suppresses alert spam during intermittent flapping, dispatching single warning (Amber) and resolved (Green) notifications.EmailRecipientInput) with regex validation and clipboard parsing.📉 Time-Series Downsampling & Historical Rollups:
system_metrics) into hourly summary records (system_metrics_hourly).30d, 90d, and 1y time-series views with zero chart gaps.🏷️ Environment Tags & Category Grouping:
Prod, Staging, Database, Internal, API).TagBadge (deterministic pastel hash colors and semantic presets), TagInput (Enter/comma creation, chip pills, quick recommendations), and TagFilterBar (real-time counts, one-click multi-tag filtering).corvus.tags, environment, env, com.docker.compose.project).service_overrides and never overwritten by rediscovery cycles.⏱️ Extended Endpoint Uptime & SSL Tracking:
POST /api/uptime/test-connection), and explicitly opt in.Host(...)), Caddy labels, VIRTUAL_HOST, LETSENCRYPT_HOST, and container environment variables (NEXT_PUBLIC_SITE_URL, SITE_URL, APP_URL) to bind public domains instead of unreachable host loopbacks.AdvancedCheckOptions): Independent per-service check intervals (check_interval: 10s-300s), custom timeouts (timeout_seconds), failure tolerance (max_retries / retry_interval), ignore TLS errors (ignore_tls), accepted HTTP status codes (accepted_status_codes, e.g. 200-299, 401), and HTTP method selection (GET/POST/HEAD)./api/health), TCP ports, or native Docker daemon health checks. Preserved across restarts via service_overrides.internal-agent, cloudflared, local-dns) are monitored via direct Docker daemon state (checkType: 'docker'), providing real green SLA bars and audit trails.💀 Dead Man's Snitch (Periodic Push Monitor):
borg, restic, scripts).🌐 Public Status Page (Always Active & Strictly Opt-in):
/status): Active and accessible out of the box for public services without requiring administrative toggle activation.is_public and is_uptime_enabled appear on the public board.service_incidents) managed via the administrative Incidents tab.uptime_daily_stats), providing long-term SLA insights with minimal disk footprint.🛡️ Hardened Authentication, Zero-Trust SSO & DoS Protection:
HTTP 429).Tailscale, Cloudflare Access, Remote-User, X-Forwarded-User) via opt-in CORVUS_TRUST_PROXY_HEADERS and trusted IP verification.CORVUS_ALLOWED_ORIGINS or local development.autoComplete) support, and Docker .env initial login switch.📱 Responsive Mobile & Tablet First Command Center:
🔄 Automated Semantic Version & Update Checker:
GET /api/version) with one-click update notice banner.⚡ Performance & Optimization:
PRAGMA busy_timeout = 5000;, PRAGMA synchronous = NORMAL;, PRAGMA cache_size = -2000;.MALLOC_ARENA_MAX=2) and zero-body streaming response reads to eliminate multi-threaded memory bloat.004_performance_indexes.sql).React.lazy and Vite manualChunks (initial bundle <200 KB).| Push webhook ping for backups and cron jobs |
GET /api/backup/download | Lock-free internal SQLite database snapshot download (.db) |
GET /api/settings/db-stats | Real-time SQLite database & WAL disk size telemetry |
GET /api/settings | Retrieve all system settings |
PUT /api/settings | Update system configuration parameters |
GET /api/stream/events | Server-Sent Events live status stream |
GET /api/auth/status | Current session & Zero-Trust SSO detection |
GET /api/systems | List registered fleet systems with live CPU, RAM, Disk metrics |
POST /api/systems | Register a new edge node and issue agent token |
GET /api/systems/{id}/stream | SSE: 100ms adaptive high-frequency telemetry stream |
GET /agent/connect | WSS Tunnel: Secure bidirectional Edge Agent connection |
GET /api/systemd/services | List whitelist-filtered Linux systemd services |
POST /api/systemd/services/{name}/restart | Restart systemd unit |
GET /api/systemd/services/{name}/logs | Stream live systemd journalctl execution logs |
GET /api/activity | Structured audit trail and event timeline |