Skip to content
AdikerPublic

About

My webserver with services

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

41 Commits

Folders and files

Repository files navigation

adiker.eu - Personal Service Hub

Polska wersja README znajduje się poniżej: Przejdź do sekcji PL

A lightweight, fast, and mobile-friendly homepage for adiker.eu. It gives quick access to self-hosted services, live status checks, latency display, language and theme controls, and an accessible interface.

Status Stack Deployment


Table of Contents


English

Overview

This repository contains a static single-page application used as a front page for:

  • Jellyfin
  • FileBrowser Quantum
  • autobrr
  • OpenSpeedTest
  • Muse (Discord music bot)

The page is intentionally framework-free: plain HTML, CSS, and vanilla JavaScript. That keeps it fast, portable, and easy to host on GitHub Pages or any static server.

Features

  • Responsive service tabs with a compact status overview and one focused detail card; the entire card links to services with a web interface
  • Live dashboard showing every service's status and latency as measured by this browser
  • Collapsed browser-local history of the last 24 measurements with mini timelines and averages
  • Health checks for all configured services
  • Explicit Checking, Online, Unreachable, and Unknown service states
  • Local Muse readiness probe with Discord gateway connectivity check
  • Polling with warm-up measurement and failure backoff
  • EN/PL language switcher
  • Dark / Light / OLED themes
  • Always-visible client context in the header with OS, browser, and device detection
  • Keyboard-accessible tabs and visible focus states
  • Responsive GitHub project cards for the four profile-pinned repositories and the LiMusic fork; each whole card is a link

Project Structure

.
├── AGENTS.md          # Canonical instructions for AI agents
├── CLAUDE.md          # Claude-specific quick context
├── CNAME              # Custom domain for GitHub Pages (adiker.eu)
├── README.md          # Project documentation
├── css/
│   └── styles.css     # Styling, themes, responsive rules
├── img/
│   ├── 505675340-c40b22c9-33da-47b7-bc4c-ce69bb5cc174.png
│   │                   # Local FileBrowser Quantum logo asset
│   └── muse-logo.png   # Local Muse logo asset
├── index.html         # Main page markup
├── index_old.html     # Legacy page backup
├── js/
│   └── app.js         # UI logic, i18n, status polling
└── ops/
    └── muse-status/   # Host probe, systemd/Caddy templates, and tests

Run Locally

No build step is required.

python3 -m http.server 8080

Then open http://localhost:8080.

Configuration

Service endpoints are defined in js/app.js:

  • https://jellyfin.adiker.eu/health
  • https://files.adiker.eu/health
  • https://autobrr.adiker.eu/api/healthz/liveness
  • https://speedtest.adiker.eu/health
  • https://muse.adiker.eu/health

The Muse endpoint returns 200 {"status":"online"} only when the local container is running, has logged Ready! after its current start, and has an established TCP connection to gateway.discord.gg. Otherwise it returns 503 {"status":"offline"}. It intentionally publishes no Discord, channel, track, container, or failure details.

The local logo is copied from the official Muse repository.

The local bridge is installed from ops/muse-status/. It listens only on a Unix socket and requires the adiker account to be a member of the Docker group:

sudo install -Dm755 ops/muse-status/muse_status.py /usr/local/lib/muse-status/muse_status.py
sudo install -Dm644 ops/muse-status/muse-status.service /etc/systemd/system/muse-status.service
# Back up an existing Caddy snippet before replacing it.
sudo install -Dm644 ops/muse-status/Caddyfile /etc/caddy/conf.d/muse-status.caddy
sudo systemctl daemon-reload
sudo systemctl enable --now muse-status.service
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy

Run the probe tests with:

python3 -m unittest discover -s ops/muse-status -p 'test_*.py'

User preferences are stored in localStorage:

  • adiker.theme
  • adiker.lang
  • adiker.statusHistory.v1

The projects section is a static list in index.html, with EN/PL descriptions in js/app.js. It links to the four repositories pinned on the Adiker GitHub profile and the LiMusic fork. Update the list manually when the profile pins change; the page makes no GitHub API requests. The “See all repositories” link opens the full repository list.

Accessibility

  • Skip link to main content
  • Semantic tablist and tabpanel roles
  • Keyboard navigation with left/right arrows in tabs
  • aria-live updates for dashboard/status text
  • :focus-visible styles
  • Reduced-motion support via prefers-reduced-motion

AI Agent Notes

AI agents should read AGENTS.md before making changes. It is the canonical source for repository guardrails, Git workflow, branch naming, commit style, and verification rules.

Claude-specific quick context is available in CLAUDE.md. If CLAUDE.md conflicts with AGENTS.md, follow AGENTS.md.

Deployment

The project is designed for static hosting, especially GitHub Pages. The repository uses GitHub Actions to validate pull requests and publish the static site from main.

Typical deployment flow:

  1. Push changes to a branch.
  2. Open a pull request to main.
  3. Wait for the Pages workflow to pass.
  4. Merge after review.
  5. GitHub Actions publishes the runtime files to GitHub Pages.
  6. Keep CNAME in the repository root for the custom domain mapping.

The workflow runs lightweight smoke checks: required file presence, CNAME validation, JavaScript syntax validation, and a local static server check for the HTML, CSS, JavaScript, and local image asset.

In repository settings, set GitHub Pages to use GitHub Actions as the build and deployment source.

Contributing

Contributions are welcome.

  1. Fork the project.
  2. Create a feature branch.
  3. Commit your changes.
  4. Open a pull request.

adiker.eu - Osobisty hub usług

Lekka, szybka i przyjazna mobilnie strona startowa dla adiker.eu. Zapewnia szybki dostęp do usług self-hosted, sprawdzanie ich statusu na żywo, pomiar opóźnień oraz wygodny, dostępny interfejs.

Przegląd

To repozytorium zawiera statyczną aplikację jednostronicową, używaną jako strona główna dla:

  • Jellyfin
  • FileBrowser Quantum
  • autobrr
  • OpenSpeedTest
  • Muse (bot muzyczny Discorda)

Strona celowo nie używa frameworków: to czysty HTML, CSS i vanilla JavaScript. Dzięki temu pozostaje szybka, przenośna i łatwa w hostowaniu na GitHub Pages albo dowolnym serwerze statycznym.

Funkcje

  • Responsywne zakładki usług z kompaktowym podsumowaniem i jednym aktywnym panelem szczegółów; cała karta prowadzi do usług z interfejsem WWW
  • Dashboard pokazujący status i opóźnienie każdej usługi, mierzone z tej przeglądarki
  • Zwijana lokalna historia ostatnich 24 pomiarów z mini-timeline i średnim opóźnieniem
  • Health checki dla wszystkich skonfigurowanych usług
  • Jawne stany usług: Checking, Online, Unreachable i Unknown
  • Lokalna sonda gotowości Muse ze sprawdzeniem połączenia z gateway Discorda
  • Odpytywanie z pomiarem rozgrzewkowym i backoffem przy błędach
  • Przełącznik języka EN/PL
  • Motywy Dark / Light / OLED
  • Zawsze widoczne w nagłówku informacje o kliencie: OS, przeglądarka i typ urządzenia
  • Zakładki dostępne z klawiatury i czytelne stany focus
  • Responsywne karty GitHub z czterema przypiętymi repozytoriami i forkiem LiMusic; cała karta jest linkiem

Struktura projektu

.
├── AGENTS.md          # Kanoniczne instrukcje dla agentów AI
├── CLAUDE.md          # Szybki kontekst specyficzny dla Claude
├── CNAME              # Własna domena dla GitHub Pages (adiker.eu)
├── README.md          # Dokumentacja projektu
├── css/
│   └── styles.css     # Style, motywy, reguły responsywne
├── img/
│   ├── 505675340-c40b22c9-33da-47b7-bc4c-ce69bb5cc174.png
│   │                   # Lokalny zasób logo FileBrowser Quantum
│   └── muse-logo.png   # Lokalny zasób logo Muse
├── index.html         # Główny markup strony
├── index_old.html     # Kopia starszej wersji strony
├── js/
│   └── app.js         # Logika UI, i18n, odpytywanie statusów
└── ops/
    └── muse-status/   # Sonda hosta, szablony systemd/Caddy i testy

Uruchom lokalnie

Nie wymaga builda.

python3 -m http.server 8080

Następnie otwórz http://localhost:8080.

Konfiguracja

Endpointy usług są zdefiniowane w js/app.js:

  • https://jellyfin.adiker.eu/health
  • https://files.adiker.eu/health
  • https://autobrr.adiker.eu/api/healthz/liveness
  • https://speedtest.adiker.eu/health
  • https://muse.adiker.eu/health

Endpoint Muse zwraca 200 {"status":"online"} tylko wtedy, gdy lokalny kontener działa, po bieżącym uruchomieniu zalogował Ready! i ma aktywne połączenie TCP z gateway.discord.gg. W przeciwnym razie zwraca 503 {"status":"offline"}. Publiczna odpowiedź nie ujawnia serwera Discord, kanału, utworu, kontenera ani przyczyny awarii.

Lokalne logo pochodzi z oficjalnego repozytorium Muse.

Lokalny most instaluje się z ops/muse-status/. Nasłuchuje wyłącznie na sockecie Unix, a konto adiker musi należeć do grupy docker:

sudo install -Dm755 ops/muse-status/muse_status.py /usr/local/lib/muse-status/muse_status.py
sudo install -Dm644 ops/muse-status/muse-status.service /etc/systemd/system/muse-status.service
# Przed zastąpieniem istniejącego snippetu Caddy wykonaj jego kopię zapasową.
sudo install -Dm644 ops/muse-status/Caddyfile /etc/caddy/conf.d/muse-status.caddy
sudo systemctl daemon-reload
sudo systemctl enable --now muse-status.service
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy

Testy sondy uruchomisz poleceniem:

python3 -m unittest discover -s ops/muse-status -p 'test_*.py'

Preferencje użytkownika zapisywane są w localStorage:

  • adiker.theme
  • adiker.lang
  • adiker.statusHistory.v1

Sekcja projektów jest statyczną listą w index.html, a opisy EN/PL znajdują się w js/app.js. Prowadzi do czterech repozytoriów przypiętych na profilu Adiker w GitHubie oraz do forka LiMusic. Po zmianie przypiętych repozytoriów należy ręcznie zaktualizować listę; strona nie odpytuje API GitHuba. Link „Zobacz wszystkie repozytoria” otwiera pełną listę repozytoriów.

Dostępność

  • Link skip do głównej treści
  • Semantyczne role tablist i tabpanel
  • Nawigacja klawiaturą przy pomocy strzałek lewo/prawo w tabach
  • Aktualizacje aria-live dla dashboardu i statusów
  • Style :focus-visible
  • Wsparcie dla prefers-reduced-motion

Notatki dla agentów AI

Agenci AI powinni przeczytać AGENTS.md przed wprowadzaniem zmian. To kanoniczne źródło zasad repozytorium, workflow Git, nazewnictwa branchy, stylu commitów i oczekiwanej weryfikacji.

Szybki kontekst dla Claude znajduje się w CLAUDE.md. Jeżeli CLAUDE.md jest sprzeczny z AGENTS.md, obowiązuje AGENTS.md.

Wdrożenie

Projekt jest przygotowany pod hosting statyczny, szczególnie GitHub Pages. Repozytorium używa GitHub Actions do walidowania pull requestów i publikowania statycznej strony z main.

Typowy proces wdrożenia:

  1. Wypchnij zmiany na branch.
  2. Otwórz pull request do main.
  3. Poczekaj, aż workflow Pages przejdzie poprawnie.
  4. Zmerguj po review.
  5. GitHub Actions opublikuje pliki runtime na GitHub Pages.
  6. Zostaw plik CNAME w katalogu głównym dla mapowania własnej domeny.

Workflow wykonuje lekkie smoke checki: obecność wymaganych plików, walidację CNAME, sprawdzenie składni JavaScript oraz lokalny test serwera statycznego dla HTML, CSS, JavaScriptu i lokalnego obrazka.

W ustawieniach repozytorium ustaw GitHub Pages na źródło builda i wdrożenia GitHub Actions.

Współtworzenie

Wkład jest mile widziany.

  1. Zrób fork projektu.
  2. Utwórz branch z funkcją albo poprawką.
  3. Zacommituj zmiany.
  4. Otwórz pull request.

License

MIT

About

My webserver with services

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages