feat: rename project to Tyto with owl branding

- Rename project from system-monitor to Tyto (barn owl themed)
- Update Go module name and all import paths
- Update Docker container names (tyto-backend, tyto-frontend)
- Update localStorage keys (tyto-settings, tyto-hosts)
- Create barn owl SVG favicon and PWA icons (192, 512)
- Update header with owl logo icon
- Update manifest.json and app.html with Tyto branding

Named after Tyto alba, the barn owl — nature's silent, watchful guardian

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-28 06:36:01 +01:00
parent 2f8d19cfdd
commit a2504c1327
27 changed files with 145 additions and 79 deletions

View File

@@ -1,4 +1,4 @@
# System Monitor
# Tyto
<div align="center">
@@ -10,6 +10,8 @@
**A real-time Linux system monitoring dashboard with a modern web interface**
*Named after Tyto alba, the barn owl — nature's silent, watchful guardian*
[Features](#features) • [Quick Start](#quick-start) • [Multi-Host Setup](#multi-host-monitoring) • [API](#api-reference) • [Development](#development)
</div>
@@ -18,7 +20,7 @@
## Overview
System Monitor is a lightweight, containerized monitoring solution that provides real-time visibility into your Linux systems. Built with a Go backend for efficient metric collection and a SvelteKit frontend for a responsive, modern UI.
Tyto is a lightweight, containerized monitoring solution that provides real-time visibility into your Linux systems. Built with a Go backend for efficient metric collection and a SvelteKit frontend for a responsive, modern UI.
### Key Highlights
@@ -57,8 +59,8 @@ System Monitor is a lightweight, containerized monitoring solution that provides
```bash
# Clone the repository
git clone https://github.com/yourusername/system-monitor.git
cd system-monitor
git clone https://github.com/yourusername/tyto.git
cd tyto
# Start the containers
docker compose up -d
@@ -173,7 +175,7 @@ The backend allows cross-origin requests by default. Ensure ports are accessible
### Host Configuration Storage
Host configurations are stored in browser localStorage under the key `system-monitor-hosts`. The active host is stored in `system-monitor-active-host`.
Host configurations are stored in browser localStorage under the key `tyto-hosts`. The active host is stored in `tyto-active-host`.
---
@@ -267,7 +269,7 @@ npm test
### Project Structure
```
system-monitor/
tyto/
├── backend/
│ ├── cmd/server/ # Main entry point
│ ├── internal/
@@ -388,6 +390,6 @@ MIT License - see [LICENSE](LICENSE) for details.
<div align="center">
**[Back to top](#system-monitor)**
**[Back to top](#tyto)**
</div>

View File

@@ -3,9 +3,9 @@ package main
import (
"log"
"system-monitor/internal/api"
"system-monitor/internal/config"
"system-monitor/internal/sse"
"tyto/internal/api"
"tyto/internal/config"
"tyto/internal/sse"
)
func main() {

View File

@@ -1,4 +1,4 @@
module system-monitor
module tyto
go 1.23

View File

@@ -5,7 +5,7 @@ import (
"sync"
"time"
"system-monitor/internal/models"
"tyto/internal/models"
)
// Manager handles alert threshold checking and tracking

View File

@@ -4,7 +4,7 @@ import (
"testing"
"time"
"system-monitor/internal/models"
"tyto/internal/models"
)
func TestNewManager(t *testing.T) {

View File

@@ -14,9 +14,9 @@ import (
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"system-monitor/internal/config"
"system-monitor/internal/models"
"system-monitor/internal/sse"
"tyto/internal/config"
"tyto/internal/models"
"tyto/internal/sse"
)
type Server struct {

View File

@@ -6,7 +6,7 @@ import (
"strconv"
"strings"
"system-monitor/internal/models"
"tyto/internal/models"
)
type AMDGPUCollector struct {

View File

@@ -8,7 +8,7 @@ import (
"strings"
"sync"
"system-monitor/internal/models"
"tyto/internal/models"
)
type CPUCollector struct {

View File

@@ -8,7 +8,7 @@ import (
"strings"
"syscall"
"system-monitor/internal/models"
"tyto/internal/models"
)
type DiskCollector struct {

View File

@@ -7,7 +7,7 @@ import (
"net/http"
"time"
"system-monitor/internal/models"
"tyto/internal/models"
)
type DockerCollector struct {

View File

@@ -7,7 +7,7 @@ import (
"strconv"
"strings"
"system-monitor/internal/models"
"tyto/internal/models"
)
type MemoryCollector struct {

View File

@@ -7,7 +7,7 @@ import (
"strconv"
"strings"
"system-monitor/internal/models"
"tyto/internal/models"
)
type NetworkCollector struct {

View File

@@ -7,7 +7,7 @@ import (
"strconv"
"strings"
"system-monitor/internal/models"
"tyto/internal/models"
)
type ProcessCollector struct {

View File

@@ -7,7 +7,7 @@ import (
"strconv"
"strings"
"system-monitor/internal/models"
"tyto/internal/models"
)
type SystemCollector struct {

View File

@@ -6,7 +6,7 @@ import (
"time"
"github.com/godbus/dbus/v5"
"system-monitor/internal/models"
"tyto/internal/models"
)
const dbusTimeout = 2 * time.Second

View File

@@ -6,7 +6,7 @@ import (
"strconv"
"strings"
"system-monitor/internal/models"
"tyto/internal/models"
)
type TemperatureCollector struct {

View File

@@ -5,11 +5,11 @@ import (
"sync"
"time"
"system-monitor/internal/alerts"
"system-monitor/internal/collectors"
"system-monitor/internal/config"
"system-monitor/internal/history"
"system-monitor/internal/models"
"tyto/internal/alerts"
"tyto/internal/collectors"
"tyto/internal/config"
"tyto/internal/history"
"tyto/internal/models"
)
type Broker struct {

View File

@@ -3,7 +3,7 @@ services:
build:
context: ./backend
dockerfile: Dockerfile
container_name: sysmon-backend
container_name: tyto-backend
restart: unless-stopped
ports:
- "9848:8080"
@@ -23,21 +23,21 @@ services:
# D-Bus socket for systemd monitoring (optional)
- /run/dbus/system_bus_socket:/run/dbus/system_bus_socket:ro
networks:
- sysmon
- tyto
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
container_name: sysmon-frontend
container_name: tyto-frontend
restart: unless-stopped
ports:
- "9847:80"
depends_on:
- backend
networks:
- sysmon
- tyto
networks:
sysmon:
tyto:
driver: bridge

View File

@@ -1,5 +1,5 @@
{
"name": "system-monitor-frontend",
"name": "tyto-frontend",
"version": "0.0.1",
"private": true,
"scripts": {

View File

@@ -4,7 +4,7 @@
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="%sveltekit.assets%/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>System Monitor</title>
<title>Tyto</title>
<!-- PWA -->
<link rel="manifest" href="%sveltekit.assets%/manifest.json" />
@@ -14,7 +14,7 @@
<!-- iOS PWA support -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="System Monitor" />
<meta name="apple-mobile-web-app-title" content="Tyto" />
<link rel="apple-touch-icon" href="%sveltekit.assets%/icon-192.svg" />
%sveltekit.head%

View File

@@ -23,14 +23,24 @@
<div class="flex items-center gap-3 sm:gap-6">
<!-- Logo -->
<div class="flex items-center gap-2 sm:gap-3">
<div class="w-8 h-8 sm:w-10 sm:h-10 rounded-xl bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center shadow-lg shadow-blue-500/20">
<svg class="w-5 h-5 sm:w-6 sm:h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" />
<div class="w-8 h-8 sm:w-10 sm:h-10 rounded-xl bg-gradient-to-br from-slate-700 to-slate-800 flex items-center justify-center shadow-lg shadow-slate-500/20 overflow-hidden">
<!-- Barn Owl (Tyto alba) icon -->
<svg class="w-7 h-7 sm:w-9 sm:h-9" viewBox="0 0 32 32" fill="none">
<!-- Heart-shaped face -->
<ellipse cx="16" cy="16" rx="10" ry="11" fill="#f8fafc"/>
<ellipse cx="16" cy="16" rx="8" ry="9" fill="#e2e8f0"/>
<!-- Eyes -->
<ellipse cx="12" cy="14" rx="3" ry="3.5" fill="#1e293b"/>
<ellipse cx="20" cy="14" rx="3" ry="3.5" fill="#1e293b"/>
<circle cx="12" cy="14" r="1.5" fill="#fbbf24"/>
<circle cx="20" cy="14" r="1.5" fill="#fbbf24"/>
<!-- Beak -->
<path d="M16 17 L14.5 19.5 L16 21 L17.5 19.5 Z" fill="#d97706"/>
</svg>
</div>
<div>
<h1 class="text-lg sm:text-xl font-bold bg-gradient-to-r {$theme === 'light' ? 'from-slate-800 to-slate-600' : 'from-white to-slate-300'} bg-clip-text text-transparent">
System Monitor
Tyto
</h1>
{#if $systemInfo}
<p class="text-[10px] sm:text-xs {$theme === 'light' ? 'text-slate-500' : 'text-slate-400'}">{$systemInfo.hostname}</p>

View File

@@ -8,8 +8,8 @@ export interface Host {
isLocal: boolean;
}
const STORAGE_KEY = 'system-monitor-hosts';
const ACTIVE_HOST_KEY = 'system-monitor-active-host';
const STORAGE_KEY = 'tyto-hosts';
const ACTIVE_HOST_KEY = 'tyto-active-host';
// Default local host
const localHost: Host = {

View File

@@ -11,7 +11,7 @@ const defaultSettings: Settings = {
};
function createSettingsStore() {
const stored = browser ? localStorage.getItem('sysmon-settings') : null;
const stored = browser ? localStorage.getItem('tyto-settings') : null;
const initial: Settings = stored ? JSON.parse(stored) : defaultSettings;
const { subscribe, set, update } = writable<Settings>(initial);
@@ -54,5 +54,5 @@ export const settings = createSettingsStore();
// Persist to localStorage
if (browser) {
settings.subscribe((s) => localStorage.setItem('sysmon-settings', JSON.stringify(s)));
settings.subscribe((s) => localStorage.setItem('tyto-settings', JSON.stringify(s)));
}

View File

@@ -1,8 +1,30 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<rect width="32" height="32" rx="4" fill="#1e293b"/>
<path d="M6 22 L10 14 L14 18 L18 10 L22 16 L26 12" fill="none" stroke="#3b82f6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="10" cy="14" r="2" fill="#3b82f6"/>
<circle cx="14" cy="18" r="2" fill="#3b82f6"/>
<circle cx="18" cy="10" r="2" fill="#3b82f6"/>
<circle cx="22" cy="16" r="2" fill="#3b82f6"/>
<!-- Background -->
<rect width="32" height="32" rx="6" fill="#1e293b"/>
<!-- Barn owl face - heart-shaped facial disc -->
<path d="M16 5 C10 5 6 10 6 16 C6 22 10 27 16 27 C22 27 26 22 26 16 C26 10 22 5 16 5" fill="#f8fafc"/>
<!-- Inner heart shape -->
<path d="M16 7 C12 7 8 11 8 16 C8 21 12 25 16 25 C20 25 24 21 24 16 C24 11 20 7 16 7" fill="#e2e8f0"/>
<!-- Left eye socket -->
<ellipse cx="12" cy="14" rx="3.5" ry="4" fill="#1e293b"/>
<!-- Right eye socket -->
<ellipse cx="20" cy="14" rx="3.5" ry="4" fill="#1e293b"/>
<!-- Left eye -->
<circle cx="12" cy="14" r="2" fill="#fbbf24"/>
<circle cx="12" cy="14" r="1" fill="#1e293b"/>
<!-- Right eye -->
<circle cx="20" cy="14" r="2" fill="#fbbf24"/>
<circle cx="20" cy="14" r="1" fill="#1e293b"/>
<!-- Beak -->
<path d="M16 17 L14.5 20 L16 22 L17.5 20 Z" fill="#d97706"/>
<!-- Subtle wing hints on sides -->
<path d="M4 16 Q5 12 6 16" fill="none" stroke="#64748b" stroke-width="1.5" stroke-linecap="round"/>
<path d="M28 16 Q27 12 26 16" fill="none" stroke="#64748b" stroke-width="1.5" stroke-linecap="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 467 B

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,14 +1,30 @@
<svg width="192" height="192" viewBox="0 0 192 192" xmlns="http://www.w3.org/2000/svg">
<rect width="192" height="192" rx="24" fill="#1e293b"/>
<rect x="16" y="16" width="160" height="160" rx="16" fill="#0f172a"/>
<!-- Chart lines -->
<path d="M 32 140 Q 56 100 80 120 T 128 80 T 160 60" stroke="#3b82f6" stroke-width="4" fill="none" stroke-linecap="round"/>
<path d="M 32 140 Q 56 130 80 110 T 128 100 T 160 90" stroke="#8b5cf6" stroke-width="4" fill="none" stroke-linecap="round"/>
<!-- Grid lines -->
<line x1="32" y1="60" x2="160" y2="60" stroke="#334155" stroke-width="1"/>
<line x1="32" y1="100" x2="160" y2="100" stroke="#334155" stroke-width="1"/>
<line x1="32" y1="140" x2="160" y2="140" stroke="#334155" stroke-width="1"/>
<!-- Dots -->
<circle cx="160" cy="60" r="6" fill="#3b82f6"/>
<circle cx="160" cy="90" r="6" fill="#8b5cf6"/>
<!-- Background -->
<rect width="192" height="192" rx="36" fill="#1e293b"/>
<!-- Barn owl face - heart-shaped facial disc -->
<path d="M96 30 C60 30 36 60 36 96 C36 132 60 162 96 162 C132 162 156 132 156 96 C156 60 132 30 96 30" fill="#f8fafc"/>
<!-- Inner heart shape -->
<path d="M96 42 C72 42 48 66 48 96 C48 126 72 150 96 150 C120 150 144 126 144 96 C144 66 120 42 96 42" fill="#e2e8f0"/>
<!-- Left eye socket -->
<ellipse cx="72" cy="84" rx="21" ry="24" fill="#1e293b"/>
<!-- Right eye socket -->
<ellipse cx="120" cy="84" rx="21" ry="24" fill="#1e293b"/>
<!-- Left eye -->
<circle cx="72" cy="84" r="12" fill="#fbbf24"/>
<circle cx="72" cy="84" r="6" fill="#1e293b"/>
<!-- Right eye -->
<circle cx="120" cy="84" r="12" fill="#fbbf24"/>
<circle cx="120" cy="84" r="6" fill="#1e293b"/>
<!-- Beak -->
<path d="M96 102 L87 120 L96 132 L105 120 Z" fill="#d97706"/>
<!-- Subtle wing hints on sides -->
<path d="M24 96 Q30 72 36 96" fill="none" stroke="#64748b" stroke-width="6" stroke-linecap="round"/>
<path d="M168 96 Q162 72 156 96" fill="none" stroke="#64748b" stroke-width="6" stroke-linecap="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 874 B

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,14 +1,30 @@
<svg width="512" height="512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<rect width="512" height="512" rx="64" fill="#1e293b"/>
<rect x="42" y="42" width="428" height="428" rx="42" fill="#0f172a"/>
<!-- Chart lines -->
<path d="M 85 373 Q 149 267 213 320 T 341 213 T 427 160" stroke="#3b82f6" stroke-width="10" fill="none" stroke-linecap="round"/>
<path d="M 85 373 Q 149 347 213 293 T 341 267 T 427 240" stroke="#8b5cf6" stroke-width="10" fill="none" stroke-linecap="round"/>
<!-- Grid lines -->
<line x1="85" y1="160" x2="427" y2="160" stroke="#334155" stroke-width="2"/>
<line x1="85" y1="267" x2="427" y2="267" stroke="#334155" stroke-width="2"/>
<line x1="85" y1="373" x2="427" y2="373" stroke="#334155" stroke-width="2"/>
<!-- Dots -->
<circle cx="427" cy="160" r="16" fill="#3b82f6"/>
<circle cx="427" cy="240" r="16" fill="#8b5cf6"/>
<!-- Background -->
<rect width="512" height="512" rx="96" fill="#1e293b"/>
<!-- Barn owl face - heart-shaped facial disc -->
<path d="M256 80 C160 80 96 160 96 256 C96 352 160 432 256 432 C352 432 416 352 416 256 C416 160 352 80 256 80" fill="#f8fafc"/>
<!-- Inner heart shape -->
<path d="M256 112 C192 112 128 176 128 256 C128 336 192 400 256 400 C320 400 384 336 384 256 C384 176 320 112 256 112" fill="#e2e8f0"/>
<!-- Left eye socket -->
<ellipse cx="192" cy="224" rx="56" ry="64" fill="#1e293b"/>
<!-- Right eye socket -->
<ellipse cx="320" cy="224" rx="56" ry="64" fill="#1e293b"/>
<!-- Left eye -->
<circle cx="192" cy="224" r="32" fill="#fbbf24"/>
<circle cx="192" cy="224" r="16" fill="#1e293b"/>
<!-- Right eye -->
<circle cx="320" cy="224" r="32" fill="#fbbf24"/>
<circle cx="320" cy="224" r="16" fill="#1e293b"/>
<!-- Beak -->
<path d="M256 272 L232 320 L256 352 L280 320 Z" fill="#d97706"/>
<!-- Subtle wing hints on sides -->
<path d="M64 256 Q80 192 96 256" fill="none" stroke="#64748b" stroke-width="16" stroke-linecap="round"/>
<path d="M448 256 Q432 192 416 256" fill="none" stroke="#64748b" stroke-width="16" stroke-linecap="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 889 B

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,6 +1,6 @@
{
"name": "System Monitor",
"short_name": "SysMon",
"name": "Tyto",
"short_name": "Tyto",
"description": "Real-time system monitoring dashboard for Linux",
"start_url": "/",
"display": "standalone",