Releases: NeuroSkill-com/skill
Skill v0.0.126
Changelog
Features
- daemon restart on launch
Contributors
- Eugene Hauptmann
Skill v0.0.125
Changelog
Features
- fixed auto connect
Contributors
- Eugene Hauptmann
Skill v0.0.124
Changelog
Features
- fixed daemon invoke
- linter
- fixed calibration
- fixed
set default - better connect
- fixed connectivity
Contributors
- Eugene Hauptmann
Skill v0.0.123
Changelog
Features
-
Add daemon calibration session HTTP routes:
POST /v1/calibration/session/start,POST /v1/calibration/session/cancel,GET /v1/calibration/session/status. -
Add
POST /v1/calibration/record-completedandGET /v1/calibration/active-profiledaemon routes. -
Daemon broadcasts
calibration-ttsevents with spoken text before each phase, giving the frontend a 4-second window to play TTS audio before the countdown begins. -
Auto-install daemon as persistent OS service on first app launch. The Tauri app calls the daemon's
/service/installendpoint after startup, registering a LaunchAgent (macOS), systemd user unit (Linux), or Windows service. The daemon now persists across app restarts and reboots. -
Add
--uninstallCLI flag to skill-daemon for clean service removal. -
LLM catalog: Added Qwen3.6 35B-A3B (MoE), MiniMax M2.7, and GLM 5.1 models to the local LLM catalog.
-
HuggingFace GGUF search: New UI section in Settings → LLM to search HuggingFace Hub for GGUF models. Browse repos by downloads/likes, expand to see individual quant files with sizes, and add models to the catalog with one click (optionally starting download immediately). Each repo shows a collapsible README (rendered as markdown with proper table and heading styling, YAML frontmatter stripped) and a direct link to the HuggingFace page. Two new daemon endpoints:
GET /llm/catalog/searchandGET /llm/catalog/search/files(the latter also returns the repo README, capped at 32 KB). Fully localized (9 languages). -
Interactive search: AI summary with streaming. "Generate" button in the Insights panel sends search context (labels, EEG metrics, sessions, screenshots) to the local LLM via
chat_completions_ipcwith a channel callback. Response streams token-by-token with live markdown rendering viaMarkdownRenderer. Thinking blocks are shown in a collapsible<details>element. -
Interactive search: rich AI prompt with full EEG context. The LLM prompt now includes:
- Time range and epoch count
- Labels with timestamps and similarity distances
- EEG epoch metrics: engagement, relaxation, SNR, α/β/θ band powers, heart rate, relevance score, session ID
- On-demand timeseries fetch when graph nodes lack stored metrics (computes averages from raw data)
- Session metrics with stddev, best-session flag
- Screenshot context: app name, window title, timestamp, OCR similarity
- Fallback session derivation from node session_ids when backend sessions are empty
-
Interactive search: prompt visibility. Collapsible "Prompt" section shown immediately when "Generate" is clicked (open by default during generation, collapses after). Shows the exact data sent to the LLM in monospace font.
-
Interactive search: LLM auto-start. When the LLM is not running, shows "Start LLM and try again" button that calls
start_llm_server, waits for initialization, and retries the summary automatically. -
Interactive search: Continue in Chat. "Continue in Chat →" button after the AI summary creates a new chat session named "Search: {query}", saves the prompt and response as messages, and opens the chat window. Users can ask follow-up questions about their search results.
-
Interactive search: auto-save to chat history. Every AI summary is automatically saved as a chat session, making all LLM conversations from search discoverable in the chat history regardless of whether the user clicks "Continue in Chat".
-
Interactive search: insights panel. Collapsible "Insights & Patterns" card with:
- Optimal conditions: auto-detected peak engagement hour and best app
- App × Engagement correlation: bar chart showing avg engagement per app (uses
window_titlefallback) - Hour-of-day engagement pattern: bar chart across 24 hours
- AI summary with streaming, thinking blocks, markdown rendering, and chat integration
-
Interactive search: bookmark/findings system. Star button in node detail panel saves nodes to localStorage (max 50). Saved findings appear in the empty state with quick re-search and delete controls.
-
Interactive search: graph color mode switcher. Dropdown to recolor EEG nodes by timestamp (turbo), engagement level, SNR quality, or session (hash-based). Graph reactivity fixed with explicit dependency tracking.
-
Interactive search: timeline scrubber. Horizontal SVG timeline below the graph showing all timestamped nodes as color-coded clickable dots. Clicking selects the node in the detail panel.
-
Interactive search: EEG sparkline. "Load EEG bands ±60s" button on EEG point nodes fetches actual timeseries data and renders α (blue), β (amber), θ (green) band power chart with a red marker at the epoch timestamp.
-
Interactive search: screenshot preview. Inline screenshot thumbnail in the detail panel when a screenshot node is selected.
-
Interactive search: compare mode. Select two EEG points for side-by-side metrics comparison with green/red diff highlighting and time gap display.
-
Interactive search: node detail panel improvements. Moved to a separate card below the graph with colored left border, generous spacing, text-sm font sizes, responsive metrics grid, breadcrumb trail, and "More like this" / bookmark buttons.
-
Interactive search: 3D graph enhancements. Double-click zoom with smooth camera tween, minimap, node kind filtering, subtle grid floor, reset view button, enhanced tooltips with metrics/session/relevance.
-
Add device filter to EEG embedding search. A dropdown in the search controls lets users filter by device (e.g. MuseS-F921, AttentivU-053) or search across all devices. Backed by
GET /v1/search/devicesanddevice_nameparameter on the streaming search endpoint. -
Per-epoch EEG metrics in AI summary prompt. The interactive search AI summary now includes per-epoch metrics (engagement, relaxation, SNR, α/β/θ band powers, FAA, mood, TAR, meditation, cognitive load, drowsiness, heart rate) instead of just "(no EEG metrics stored)". Each 5-second epoch shows its own brain state data.
-
On-the-fly CSV metrics fallback. When embeddings lack
metrics_json, the interactive search now lazily loads session_metrics.csvfiles and matches epochs by timestamp (±3s tolerance) to populate metrics from CSV data. This is transparent to the user — metrics appear without needing a backfill. -
Background metrics backfill from CSV. New
POST /v1/analysis/backfill-metricsendpoint patchesmetrics_jsonin the SQLite embeddings table for rows where it is NULL, matching against_metrics.csvby timestamp. Fires automatically on search page load (fire-and-forget). After first run, all future searches find metrics directly in the DB. -
Recomputation of derived EEG metrics. When
meditation,cognitive_load,drowsiness, orstress_indexare null in storedmetrics_jsonbut band powers (α, β, θ, δ) are present, they are recomputed on-the-fly using the same formulas as the live pipeline. -
Shared EEG score formulas (
skill-data/eeg_scores.rs). New module with pure-math functions for computing derived EEG metrics from averaged band powers. -
Interactive search: EEG metrics on graph nodes. Each EEG epoch node now carries its full metrics (engagement, relaxation, SNR, alpha/beta/theta, FAA, heart rate, etc.) via the
NeighborMetricsstruct, visible in the tooltip and detail panel. -
Interactive search: session grouping & cross-session comparison. Every node gets a
session_idderived from its timestamp. The results include a session summary with averaged metrics, stddev, min/max engagement/SNR, duration, and band power ratios. The best session (highest avg engagement) is auto-flagged with a ★ marker. -
Interactive search: cross-session trend chart. SVG sparkline rendered above the session summary, showing engagement trend across sessions. Best session dot highlighted in green.
-
Interactive search: relevance scoring. Each EEG node receives a composite
relevance_scorecombining text similarity (50%), temporal distance (30%), and engagement (20%). Nodes are optionally sortable by relevance in the UI and rendered larger in the 3D graph for high-relevance matches. -
Interactive search: SNR quality filter. New
snrPositiveOnlytoggle (step 6) excludes EEG epochs with non-positive SNR (bad signal quality). Backed by server-side filtering before graph construction. -
Interactive search: device filter. Device dropdown (step 7) in the interactive pipeline, filtering EEG epochs by device name at the SQL query level via
get_session_timeseries_filtered(). -
Interactive search: date-range filter with presets. Date-range inputs (step 8) constrain results to a time window. Quick preset buttons (24h, 7d, 30d) with a clear button.
-
Interactive search: EEG epoch ranking. Rank-by dropdown (step 9) sorts EEG epochs by engagement, SNR, or relaxation before selecting top-k, surfacing the most interesting epochs first.
-
Interactive search: collapsible advanced filters. Steps 6–9 are grouped behind an "Advanced filters" toggle to keep the default view clean. An amber dot indicator shows when any filter is active.
-
Interactive search: performance timing & system load. Each search returns
embed_ms,graph_ms,total_mstiming plus CPU usage and memory stats viasysinfo. Displayed in a compact perf bar. -
Interactive search: search result caching. LRU-style cache (8 entries, 5-minute TTL) in the daemon. Repeated searches with identical parameters return instantly without re-embedding.
-
Interactive search: CSV export. "Export CSV" button in the sessions summary panel downloads a CSV with all session metrics.
-
Interactive search: search history. Recent queries persisted in localStorage (max 10). Displayed as clickable chips in the empty state for quick re-runs. ArrowUp in empty textarea recalls the last query.
-
**Interactive search: pipeline settings persist...
Skill v0.0.122
Changelog
Features
-
Add recent/frequent command ranking to Cmd-K. Commands you use most often and most recently appear at the top in a "Recent" section, with frequency and recency boosts applied to search scoring.
-
Add typo tolerance to Cmd-K search. Misspellings like "drak mode" or "calbriation" now find the right result using Damerau-Levenshtein edit distance as a fallback when fuzzy matching fails.
-
Add contextual boosting to Cmd-K. Device, EEG, Calibration, and LSL commands are ranked higher when a device is connected; Devices settings are boosted when no device is connected.
-
Add keyboard-driven toggles in Cmd-K. Toggleable settings (dark mode, high contrast) show an ON/OFF indicator and can be flipped with the Tab key without closing the palette.
-
Add prefix-based command filtering to Cmd-K. Type
>to show only system commands or@to show only settings. -
Add semantic search fallback to Cmd-K via fastembed embeddings. When fuzzy results are sparse and the query is 6+ characters, a debounced request to the daemon's
/v1/search/commandsendpoint returns semantically similar commands in a "Suggested" section. Handles natural language queries like "make text bigger" or "reduce eye strain". -
Add toggle dark/light mode command to the Cmd-K palette.
-
Add deep-link search for individual settings in the Command Palette (Cmd-K). 154 settings across all 20 tabs are now searchable by name, description, and synonyms — typing "DND", "dark mode", "GPU", "OCR", etc. instantly finds the right setting.
-
Auto-generate per-locale search indexes from i18n translation files and Tab components. Indexes are built for all 9 languages (EN, DE, ES, FR, HE, JA, KO, UK, ZH) and stay in sync automatically via a Vite plugin that watches for changes during development.
-
Add synonym expansion to Cmd-K fuzzy search. Common abbreviations like DND, BT, GPU, OCR, LLM, and 30+ others are expanded before matching so users can search using shorthand.
-
Add Command Palette button to the title bar of every window. Clicking the command-key icon opens Cmd-K, matching the keyboard shortcut behavior.
-
Selecting a setting in Cmd-K now opens the Settings window, switches to the correct tab, scrolls to the exact setting, and flashes a blue highlight to draw attention to it.
-
Wire settings index generation into
npm run dev,npm run build, andnpm run bumpso indexes are always up to date before commits and builds. -
Add Chat and Compare shortcuts to the Shortcuts settings tab, making all 11 global shortcuts user-configurable. The Compare shortcut (previously hardcoded to Cmd+Shift+M) is now customizable like all others.
-
Tray menu now reflects user-customized shortcuts for all actions including Chat and Compare.
-
The keyboard shortcuts overlay (? key) now shows all 11 global shortcuts, matching the Shortcuts settings tab and tray menu.
-
Global keyboard shortcuts no longer steal keystrokes from other apps. Shortcuts are now only registered when a Skill window is focused and unregistered when all windows lose focus, so the focused app always gets the keystroke first. The "Open NeuroSkill" shortcut (Cmd+Shift+O) remains always-on so users can bring the app to the foreground from anywhere.
-
Session sidecar
device_kind: JSON sidecars now includedevice_kind(e.g. "muse", "awear", "openbci") alongsidedevice_nameandchannel_names. Enables reliable device identification during reembedding when a day directory contains sessions from different devices. Backward compatible — old sidecars without this field are handled gracefully. -
Embedding coverage dashboard in Settings → EXG → Re-embed. Shows a color-coded coverage bar (green ≥95%, amber ≥50%, red <50%), total/embedded/missing epoch counts, and estimated time remaining based on current embed speed.
-
Per-day breakdown table in the re-embed section. Expandable table showing each day's total epochs, embedded count, missing count, and a mini coverage bar — makes it easy to identify which days have gaps.
-
Idle reembed status indicator. When background embedding is enabled, the UI now shows whether it's actively processing (with day + progress), or waiting for the idle timeout to elapse, instead of running silently.
-
Re-embed progress improvements. Progress bar now shows indeterminate animation during encoder loading, percentage + ETA during processing, amber bar when paused (device reconnected), red bar with error detail on failure.
-
EEG embedding coverage in Search page. Corpus stats banner and empty-state panel now show epoch embedding coverage (e.g. "12,400/14,200 (87%)") with color coding, so you know at a glance whether your data is fully searchable.
-
Multi-modal search: Interactive search now returns screenshots (proximity + OCR text similarity) and EEG epochs alongside text labels. New
kScreenshots,kLabels, andreachMinutesparameters control result depth. -
Search corpus stats: New
GET /search/statsendpoint and SSE streaming variant (/search/stats/stream) show EEG days, sessions, recording time, label counts, screenshot counts, and embedding model info. Stats appear in the search UI for all modes. -
Daemon test mode:
POST /v1/test/beginpauses background work (screenshots, OCR, re-embed) for stable E2E testing.POST /v1/test/endresumes. Debug builds only (#[cfg(debug_assertions)]). -
Daemon readiness:
/readyznow returns{ok, ready, test_mode}—readyis set after the TCP listener binds.SKILL_DAEMON_TOKENenv var allows injecting auth tokens for isolated test daemons. -
Interactive test picker:
npm testshows a TUI picker (Node.js, cross-platform) with 17 suites. Arrow keys + space to toggle, enter to run. -
Rust version guard:
npm run tauri devandnpm run test:clippycheck Rust >= 1.95 and promptrustup update stableif outdated.
Bugfixes
-
Fix Chat shortcut not being loaded from saved settings on app startup.
-
Reembed silent failures: Added diagnostic logging on first extract failure and first encode failure per batch. Previously all epoch failures were completely silent, making it impossible to debug why 27K+ epochs would fail with zero output.
-
CSV channel length mismatch: The CSV parser now skips entire rows when any channel value fails to parse, preventing channels from accumulating different sample counts. Previously, individual parse failures were silently skipped per-channel, creating mismatched-length arrays that the ZUNA encoder rejected.
-
Mixed-device reembedding: CSVs with fewer columns than the metadata expects (e.g. different device in the same day directory) now use available columns instead of skipping all rows. The column count is detected per-file from the CSV header.
-
Reconnect respects test mode: The BLE reconnect loop now pauses when
test_modeis active, preventing background connection attempts from interfering with E2E tests. -
cpu-onlyfeature build: Fixed compilation errors inskill-daemonwhen built with--no-default-features --features cpu-only. The#[cfg(not(feature = "llm"))]fallback paths referencedAppStatefields that don't exist without thellmfeature. Replaced with static stubs. This fixes the CI coverage job. -
Clippy 1.95: Fixed
sort_by→sort_by_key(Reverse)in skill-history,collapsible_matchin connect_wired,checked_divin iroh_remote. -
Prebuilt llama naming: Updated download URL from
q1-metal/q1-vulkantometal-static/vulkan-staticto match current release asset names. -
Fix macOS DMG creation stream error: Added retry logic (up to 3 attempts) to the
appdmginvocation inscripts/create-macos-dmg.sh. TheERR_STREAM_WRITE_AFTER_ENDrace condition in appdmg's internal file-copy stream is now caught and retried automatically, with partial DMG cleanup between attempts. -
Search hang fixed: Removed expensive
collect_search_meta(session JSON parsing) from the search hot path. Corpus stats are now fetched separately via a dedicated endpoint. -
Label stale count:
count_needing_embed()usesSELECT COUNT(*)instead of loading all stale rows into memory. -
Heredoc terminators: Fixed indented heredoc terminators (
DPLIST,PYEOF) in release-mac, release-linux, and pr-build workflows that causedsyntax error: unexpected end of file. -
Flaky env var test: Added
Mutexguard toenforce_path_integritytests in skill-tools to prevent parallel env var races. -
A11y errors: Added
aria-labelto 3 unlabeled inputs inEegModelTab.svelte. -
Smoke test auth: Added Bearer token to all HTTP requests in
test.ts(was sending unauthenticated). Updated 20+ REST paths from old Tauri-era shortcuts to/v1/daemon endpoints. Score: 83/275 → 341/0. -
E2E test isolation: Daemon token and data E2E tests now spawn isolated daemons on random ports with temp skill dirs. Can run in parallel.
-
Pre-checkout CI step:
free-disk-spacestep inlined for workflows that run it beforeactions/checkout. -
ESM import fix: Removed Node 22-only
globimport andrequire()calls fromci.mjs(broke on Node 20 CI runners).
Refactor
- Dead scripts removed: Deleted
prepare-daemon-sidecar.sh(superseded by.js),adopt_anyhow.py(unused),check_windows_manifest.py(ported to Node). - Screenshot store reuse: Interactive search opens the screenshot store once and reuses it for both proximity and OCR searches.
- E2E helpers: New
src/tests/e2e-helpers.tswithspawnDaemon(),testBegin()/testEnd(),isDaemonReady(),freePort()shared across all E2E test files.
Build
- CI scripts consolidated: Replaced ~960 lines of duplicated inline YAML with a single
scripts/ci.mjs(Node.js, 12 subcommands). Zero Python dependency for builds — all scripts are Node.js + bash. - Release workflows refactored: All 3 release workflows (macOS, Linux, Windows) support
workflow_dispatchfor on-demand builds. On-dem...
Skill v0.0.121
Changelog
Features
- update failing apple notary tool
Contributors
- Eugene Hauptmann
Skill v0.0.120
Changelog
Features
- updated API docs
Contributors
- Eugene Hauptmann
Skill v0.0.119
Changelog
Features
- added openblas to ci
- fixed tests limits
- missing keys
Contributors
- Eugene Hauptmann
Skill v0.0.118
Changelog
Features
- updated neuroloop
- neuroloop 0.1.1
- added new logo
- updated neuroloop and neuroskill
- added korean and a11y + fixed i18n
- merged PRs
- deps(cargo): bump the cargo-all group across 1 directory with 8 updates
- Bumps the cargo-all group with 8 updates in the / directory:
- | Package | From | To |
- Updates
rusqlitefrom 0.37.0 to 0.39.0 - Updates
zipfrom 4.6.1 to 7.2.0 - Updates
llmfit-corefrom 0.8.9 to 0.9.7 - Updates
sysinfofrom 0.33.1 to 0.38.4 - Updates
libcfrom 0.2.184 to 0.2.185 - Updates
randfrom 0.9.3 to 0.10.1 - Updates
tokio-tungstenitefrom 0.24.0 to 0.28.0 - Updates
jsonschemafrom 0.45.1 to 0.46.0
- Signed-off-by: dependabot[bot] support@github.com
- linter
- neuroloop
- ui
-
- zuna-rs Performance (0.0.4)
-
- model/*.rs — Replaced LinearConfig::init() (random KaimingUniform via ChaCha12 RNG) with linear_zeros() using Tensor::zeros across all 8 model files
-
- Apple Accelerate BLAS
-
- skill-daemon/Cargo.toml — Added simd + multi-threads to burn-ndarray for all platforms; added platform-specific BLAS: blas-accelerate (macOS), blas-openblas-system (Linux)
-
- Labels DB Schema Migration
-
- labels.rs — Added ALTER TABLE migration for wall_start, wall_end, label_start, label_end, text_embedding, context_embedding, embedding_model columns
-
- HNSW Panic-Proofing
-
- skill-label-index/lib.rs — Added safe_insert() with dimension check via idx.inner.dim() before insert
-
- Embedding Status & Reindex UI
-
- Daemon: GET /v1/labels/embedding-status — reports current model, stale count, per-model breakdown
-
- Reembed Settings
-
- skill-settings — ReembedConfig struct: auto_labels, auto_eeg, auto_screenshots, batch_size, batch_delay_ms
-
- Daemon Watchdog Settings
-
- skill-settings — daemon_auto_restart: bool (default true), daemon_restart_timeout_secs: u64 (default 10)
-
- Daemon Band Powers in BandSnapshot
-
- eeg_bands.rs — Added top-level rel_delta..rel_gamma fields to BandSnapshot, computed as channel-averaged absolute powers normalized across all 6 bands (including high_gamma)
-
- NeuroLoop Band Display Fixes
-
- Band bars always empty — Fixed scaling: old formula val * barWidth * 3 assumed ~30% relative power; new formula normalizes bars relative to strongest displayed band
-
- NeuroLoop Scores Update Fix
-
- mergeScoresEvent() — Was missing cognitive_load, drowsiness, mood from EegBands events; now extracts all 7 metrics at 10Hz
-
- NeuroLoop Status Injection Fix
-
- before_agent_start — Was calling runNeuroSkill CLI first (30s timeout, fails on WS auth); reversed to try the already-open WS connection first (instant, already authenticated), CLI as fallback
-
- NeuroLoop LLM Auto-Start
-
- On WS connect — Checks LLM server status; if stopped, shows warning and auto-starts the server
-
- Misc
-
- npm run stop — Added to package.json, kills all skill-daemon processes
- Test Results
-
- 75 Rust tests — 0 failures, 0 warnings
- ndarray optimization
- updated embeddings and hnsw
-
- zuna-rs 0.0.4 — zero-cost model init (no random waste)
- fixed labels
- deps(npm): bump the npm-all group with 11 updates
- Bumps the npm-all group with 11 updates:
- Updates
@threlte/corefrom 8.5.6 to 8.5.9 - Updates
@threlte/extrasfrom 9.14.4 to 9.14.5 - Updates
bits-uifrom 2.17.2 to 2.17.3 - Updates
maplibre-glfrom 5.22.0 to 5.23.0 - Updates
markedfrom 17.0.6 to 18.0.0 - Updates
pmtilesfrom 4.4.0 to 4.4.1 - Updates
@biomejs/biomefrom 2.4.10 to 2.4.11 - Updates
@sveltejs/kitfrom 2.56.1 to 2.57.1 - Updates
sveltefrom 5.55.1 to 5.55.3 - Updates
vitefrom 8.0.4 to 8.0.8 - Updates
vitestfrom 4.1.2 to 4.1.4
Contributors
- Eugene Hauptmann
- nataliyakosmyna
- dependabot[bot]
Skill v0.0.117
Changelog
Features
- neuroskill
- fixed cargo clippy
- fixed svelte errors
- updated main app for neuroskill and neuroloop
- Neuroloop TUI:
- Daemon:
- Neuroloop provider registration:
- No Tauri changes needed — the desktop UI already handles tags natively with collapsible thinking blocks.
- fixed neuroskill + added japanese
- fixed neuroskill
- updated neuroloop
- updated iroh
- updated neuroskill
- tests
- updated cli
- updated faq
- refactored faq and help
- updated disconnect
- added submodules
- fixed tests
- biome fixes
Contributors
- nataliyakosmyna
- Eugene Hauptmann