-
released this
2026-06-02 04:35:26 -07:00 | 31 commits to main since this releaseFixes
- Source health list: journal
source_identries with 3+ colon segments (e.g.muninn-journal:Muninn:ssh.service) are now grouped byprefix:hoststem 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
LIKEmatch. - UI badge: grouped rows show a
N unitschip indicating how many systemd units were merged. - Version: 0.6.1
Downloads
-
Source code (ZIP)
15 downloads
-
Source code (TAR.GZ)
16 downloads
- Source health list: journal
-
v0.6.0 Stable
released this
2026-06-02 02:02:56 -07:00 | 32 commits to main since this releaseChanges
- #60 Split
incidents,received_bundles,sent_bundlesto dedicatedturnstone-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 usessemantic=Trueby default;/api/searchexposes?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 includesby_domaincounts;/api/searchadds?domain=filter.
Upgrade notes
- New DB file
turnstone-incidents.dbcreated automatically on first start alongsideturnstone.db - Existing incident data migrated automatically (idempotent)
- No manual schema changes required
- Set
TURNSTONE_INCIDENTS_DBto override the incidents DB path
Test coverage
394 tests passing (up from 372 in v0.5.0)
Downloads
-
Source code (ZIP)
14 downloads
-
Source code (TAR.GZ)
7 downloads
- #60 Split
-
v0.4.0 — Live Watch Mode Stable
released this
2026-05-11 15:45:30 -07:00 | 131 commits to main since this releaseWhats 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 viatail -F patterns/watch.yamldeclarative config — add sources without restartingfilesource type auto-detects log format (journald JSON, servarr, qBittorrent, caddy, syslog, plaintext)GET /api/watch/statusandPOST /api/watch/reloadendpoints- 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.yamlto activate live watching. For systemd-only systems (no syslog file), install the journal bridge service fromscripts/turnstone-journal-bridge.service.Downloads
-
Source code (ZIP)
14 downloads
-
Source code (TAR.GZ)
17 downloads
- Background watcher tails
-
released this
2026-05-11 13:00:52 -07:00 | 134 commits to main since this releaseWhat'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 resultsfeat: severity overrides + last_ingested timestamp on dashboard
Downloads
-
Source code (ZIP)
10 downloads
-
Source code (TAR.GZ)
9 downloads
-
released this
2026-05-11 09:53:25 -07:00 | 138 commits to main since this releaseWhat'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 dateparserfix: correct time_detected logic, immutable sort pattern, add diagnose() testfeat: add POST /api/diagnose and GET/PATCH /api/settings endpointsfeat: add QuickCapture and IncidentForm componentsfeat: add QuickCaptureBar and QuickCaptureFab entry point componentsfix: surface save errors in QuickCapture via error.valuefeat: add Quick/Structured tabs to DiagnoseViewrefactor: remove incident form from IncidentsView — now in DiagnoseView Structured tabfeat: add SettingsView with entry point style togglefeat: wire QuickCaptureBar/FAB into App.vue, add Settings route
Downloads
-
Source code (ZIP)
12 downloads
-
Source code (TAR.GZ)
15 downloads
-
v0.1.0 — Initial Release Stable
released this
2026-05-11 05:55:50 -07:00 | 154 commits to main since this releaseTurnstone 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 labeling —
issue_typetagging with datalist suggestions - Bundle export/push — versioned JSON snapshot of incident + log entries; POST to
TURNSTONE_BUNDLE_ENDPOINT - Bundle receive —
/api/bundlesendpoint 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.shfor 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.shThen 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 turnstoneUI available at
http://localhost:8534/turnstone/or via Caddy atturnstone.xanderland.tv.Downloads
-
Source code (ZIP)
13 downloads
-
Source code (TAR.GZ)
14 downloads
- Log ingestor — qBittorrent (classic + hotio 5.x