• v0.6.1 92d7c21530

    pyr0ball released this 2026-06-02 04:35:26 -07:00 | 31 commits to main since this release

    Fixes

    • Source health list: journal source_id entries with 3+ colon segments (e.g. muninn-journal:Muninn:ssh.service) are now grouped by prefix:host stem at the SQL level. Collapses ~19K crash-loop scope rows into ~24 grouped rows in both the dashboard source health table and the Sources page.
    • Delete by group: deleting a grouped source cascades to all sub-units via LIKE match.
    • UI badge: grouped rows show a N units chip indicating how many systemd units were merged.
    • Version: 0.6.1
    Downloads
  • v0.6.0 354513796a

    v0.6.0 Stable

    pyr0ball released this 2026-06-02 02:02:56 -07:00 | 32 commits to main since this release

    Changes

    • #60 Split incidents, received_bundles, sent_bundles to dedicated turnstone-incidents.db — eliminates FTS5 write lock starvation during high-volume log bursts. One-shot migration on first start copies existing data automatically.
    • #41 Hybrid-BERT label mapping shim — 7-class vocabulary (normal/security_anomaly/system_failure/performance_issue/network_anomaly/config_error/hardware_issue) now translates correctly to Turnstone severity labels via _HYBRID_BERT_LABEL_MAP.
    • #15 Hybrid BM25 + vector re-ranking — late-fusion semantic search (alpha=0.6/beta=0.4). Diagnose stream uses semantic=True by default; /api/search exposes ?semantic=true. Graceful fallback to pure BM25 when embedder unavailable.
    • #32 Domain-view mapping — all 42 patterns annotated across 10 domains (service_health, networking, auth, storage, memory, kernel, power, web_proxy, media, gpu). Diagnose summary includes by_domain counts; /api/search adds ?domain= filter.

    Upgrade notes

    • New DB file turnstone-incidents.db created automatically on first start alongside turnstone.db
    • Existing incident data migrated automatically (idempotent)
    • No manual schema changes required
    • Set TURNSTONE_INCIDENTS_DB to override the incidents DB path

    Test coverage

    394 tests passing (up from 372 in v0.5.0)

    Downloads
  • v0.4.0 04801b62f4

    pyr0ball released this 2026-05-11 15:45:30 -07:00 | 131 commits to main since this release

    Whats new

    Live watch mode — Turnstone now tails log sources continuously in the background, keeping the DB fresh in near-real-time instead of waiting for the 15-minute cron.

    Features

    • Background watcher tails journalctl -f, docker/podman logs -f, or any log file via tail -F
    • patterns/watch.yaml declarative config — add sources without restarting
    • file source type auto-detects log format (journald JSON, servarr, qBittorrent, caddy, syslog, plaintext)
    • GET /api/watch/status and POST /api/watch/reload endpoints
    • Dashboard live/manual indicator chip; stale-data banner copy adapts when watching is active
    • Host-side journal bridge script for systems without journalctl in the container
    • 18 new tests (86 total)

    Upgrading

    Add sources to patterns/watch.yaml to activate live watching. For systemd-only systems (no syslog file), install the journal bridge service from scripts/turnstone-journal-bridge.service.

    Downloads
  • v0.3.0 cc4b167603

    pyr0ball released this 2026-05-11 13:00:52 -07:00 | 134 commits to main since this release

    What's New

    LLM Reasoning

    Quick Capture now shows a plain-language diagnosis above the log stream. Ollama endpoint and model are configurable in Settings. Fails gracefully — log results always returned even if LLM is unreachable.

    Severity Overrides

    Regex rules that reclassify log entries at query time without touching the database. Ships with a default PAM auth noise rule (CRITICAL → WARN). Toggle, delete, or add rules from the Settings page.

    Dashboard Freshness

    Stale-data banner appears when newest ingested entry is >25h old. Suppressed criticals count shown under the recent criticals list.

    Changelog

    • feat: LLM reasoning layer — Ollama summarization on diagnose results
    • feat: severity overrides + last_ingested timestamp on dashboard
    Downloads
  • v0.2.0 fc5029c24e

    pyr0ball released this 2026-05-11 09:53:25 -07:00 | 138 commits to main since this release

    What's New

    Frictionless Incident Capture

    Capture homelab incidents in seconds without remembering exact timestamps.

    • NL time extraction — describe what happened naturally ("disk errors around 3pm", "memory spike this morning"); Turnstone extracts the time and builds a ±30-min log window automatically. Falls back to last 60 minutes when no time phrase is found.
    • Quick Capture tab — single input field in the Diagnose view. Type a description, get a ranked log stream with severity breakdown, save as an incident with one click.
    • Quick Capture Bar — persistent bar below the nav for always-on capture without leaving the current page.
    • Quick Capture FAB — fixed bottom-right button () with an overlay for muscle-memory capture anywhere in the app.
    • Structured tab — the full incident form is now the second tab in Diagnose; IncidentsView is list-only.
    • Settings — toggle between topbar and FAB entry point styles; preference persisted via preferences.json.

    Changelog

    • feat: add diagnose service with NL time extraction via dateparser
    • fix: correct time_detected logic, immutable sort pattern, add diagnose() test
    • feat: add POST /api/diagnose and GET/PATCH /api/settings endpoints
    • feat: add QuickCapture and IncidentForm components
    • feat: add QuickCaptureBar and QuickCaptureFab entry point components
    • fix: surface save errors in QuickCapture via error.value
    • feat: add Quick/Structured tabs to DiagnoseView
    • refactor: remove incident form from IncidentsView — now in DiagnoseView Structured tab
    • feat: add SettingsView with entry point style toggle
    • feat: wire QuickCaptureBar/FAB into App.vue, add Settings route
    Downloads
  • v0.1.0 4351465f97

    pyr0ball released this 2026-05-11 05:55:50 -07:00 | 154 commits to main since this release

    Turnstone v0.1.0

    First working release. Designed for deployment on Xander's system via rootful Podman.

    What's included

    • Log ingestor — qBittorrent (classic + hotio 5.x (N/I/W/C) formats), Plex, syslog
    • Pattern matching — 8 built-in qBittorrent diagnostic patterns, YAML-configurable
    • Incident detection — time-bucketed grouping, severity, repeat tracking
    • Incident labelingissue_type tagging with datalist suggestions
    • Bundle export/push — versioned JSON snapshot of incident + log entries; POST to TURNSTONE_BUNDLE_ENDPOINT
    • Bundle receive/api/bundles endpoint stores incoming bundles for signature building
    • Web UI — Dashboard, Search, Diagnose, Incidents, Bundles, Sources (Vue 3 SPA, dark/light theme)
    • Podman container — multi-stage build, no Node.js in final image; podman-standalone.sh for rootful deployment

    Deployment (Xander's system)

    sudo git clone https://git.opensourcesolarpunk.com/Circuit-Forge/turnstone.git /opt/turnstone
    sudo chown -R x:x /opt/turnstone
    cd /opt/turnstone && podman build -t localhost/turnstone:latest .
    mkdir -p /opt/turnstone/{data,patterns}
    bash /opt/turnstone/podman-standalone.sh
    

    Then register as a systemd service:

    sudo podman generate systemd --new --name turnstone \
      | sudo tee /etc/systemd/system/turnstone.service
    sudo systemctl daemon-reload
    sudo systemctl enable --now turnstone
    

    UI available at http://localhost:8534/turnstone/ or via Caddy at turnstone.xanderland.tv.

    Downloads