All notable changes to Copyosity are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Keyboard focus rings — focus rings appear only when navigating by keyboard (
Tab/ shortcuts), not after mouse clicks; slimmer ring styling via sharedfocus-rings.css; the overlay and command palette reset focus when hidden or minimized so rings do not linger. - Overlay tag filters during search — the tag chip row hides when a search returns no matches (it stays visible while results are still loading); catalog cards are hidden during that pending window so a stale row cannot be pasted.
- Command palette — Agent vs Web mode tint the send button and empty-state icon; status and errors sit in a fixed rail above the composer (center placeholders hide while a message is shown); empty states use stroke icons instead of emoji; the hub model list refreshes when the palette reopens or Settings emits
hub-settings-changed(skips refetch when hub credentials are unchanged). - Settings hotkey fields — save confirmation and errors slide in below the field in an animated footer (hints and inputs stay fixed); a full-width inset-list divider separates the status row; ok/fail tone; transient notices clear when you switch sidebar panes. The same footer pattern applies to excluded-app feedback in History → Privacy.
- Settings icons — General uses its own sidebar icon; launch-at-login and language subsections pick up matching section icons.
- Tray menu first click — after the upstream merge, the first tray click could fail to open the menu reliably because tray Down reused full paste-target capture that raced deferred
show_menu(). Tray Down now records the frontmost app PID only, without AX/mouse capture. - Settings → NeuralDeep palette hotkey — saving the command-palette shortcut from Settings failed with an IPC ACL error (
get_palette_shortcut/set_palette_shortcutwere missing from the settings window capability). - Agent chat failed turns — a failed send no longer leaves an orphaned user bubble in the transcript; the composer text is restored, and a disabled or misconfigured hub shows an upfront message instead of failing mid-request.
- Agent session history — sessions are saved only after the assistant has replied (user-only threads are not stored).
First stable release — reliable in-app auto-update, full multi-turn agent chat with tools and reasoning, and the macOS menu-bar experience from 0.8.x onward.
- Auto-update from a mounted DMG — if Copyosity still runs from the read-only disk image (
/Volumes/…), the updater now detects the non-writable location up front and tells you to quit, drag the app to Applications, and update from there — instead of failing with a cryptic “Read-only file system (os error 30)”.
- Update log on launch — the startup auto-check now records the running version (
launch: running 0.9.9, checking for updates…) in Settings → Updates → Update log, so support reports can tell which build was active when a silent check ran.
- In-app install across volumes (EXDEV) — the updater extracted to
$TMPDIRon a different APFS volume than the app bundle, sorename()failed with “Cross-device link (os error 18)” and downloads never replaced the bundle. A new Rustinstall_updatecommand setsTMPDIRto the app’s own folder (intra-volume renames), emits progress, then relaunches; Settings → Updates → Download & install now uses it instead of the JS plugin flow.
- Settings → Updates copy now says updates come from the vkovalskii.com mirror with GitHub Releases as fallback (was “GitHub Releases” only).
- In-app update log — Settings → Updates → Update log records every step of the updater (launch check, manual check, download, unpack/install, relaunch) plus the full text of any error, with Copy / Clear; persisted in
localStorageso silent launch-time failures are visible afterward.
- Command palette — after the agent finishes a turn, focus returns to the composer so you can type a follow-up immediately.
- Updater tarballs contained AppleDouble (
._*) entries — macOStar czfafter codesign/staple embedded resource-fork sidecars that the Rust unpacker rejected (failed to unpack), so downloads succeeded but the bundle was never replaced. Release tarballs are now packed withCOPYFILE_DISABLE=1 tar --no-mac-metadata --no-xattrs(0 AppleDouble entries verified end-to-end).
- Palette model picker — the hub model
<select>lived inside the drag header; mousedown started a window drag instead of opening the menu, so the model could not be changed. Interactive controls (select/input/textarea/ links) are now excluded from drag initiation. - Model list noise — the hub
/v1/modelsdropdown now shows chat models only (embedding / reranker entries likebge-*,e5-*,*embedding*,frida,giga-*are hidden).
- Agent chat blocked by CSP — the client-side AI SDK loop fetches the NeuralDeep hub directly from the webview, but
connect-srconly allowedipc:/localhost, so every send was blocked. The hub host is now allowed in the palette CSP; streaming + tool loop verified against the live hub.
- Auto-update restart swallowed — the menu-bar app prevented every
ExitRequested(so closing the last window keeps it in the tray), but the updater’srelaunch()usesapp.restart()withRESTART_EXIT_CODE, which was blocked too — “Download & install” downloaded the build but never applied it. Only user-driven, code-less exits are prevented now; programmatic restart/exit passes through.
- Multi-turn streaming chat — Agent mode is a proper conversation assistant (not single-shot Q→A): input at the bottom (auto-grow textarea,
Enter= send /Shift+Enter= newline), transcript scrolls above it; follow-ups keep context in an AI SDKChat. - Client-side ReAct loop —
streamText+@ai-sdk/openai-compatibleagainst the NeuralDeep hub, with tools bridged to Rust (web_search, Notes, Reminders, Calendar, screenshot capture); up to 12 steps per turn. - Visible tool calls — collapsible chips with input/output and running / done / error state.
- Visible reasoning — models that return
reasoning_content(e.g. qwen3.6) show a collapsible Reasoning block. - Stop while streaming — Stop button cancels an in-flight turn; typing indicator before the first token.
- Session history — restores full AI SDK message arrays (whole conversations, not just the last answer).
- Minimized palette — collapsed state is an amorphous morphing blob, not a dark square dot.
- Palette capability gaps —
get_app_settings/hub_list_modelsand the new agent tool commands are allowed for the palette window; missing ACL entries had silently forced the model picker into “Hub disabled”.
- Release mirror for auto-update — the Tauri updater tries vkovalskii.com/copyosity/latest.json first (nginx static, no redirect hop), then GitHub Releases
latest.jsonas fallback. GitHub asset URLs redirect toobjects.githubusercontent.com, which was intermittently failing under the updater’s rustls stack.
- Launch at login — a new Settings → General toggle starts Copyosity automatically when you log in to your Mac (macOS LaunchAgent via
tauri-plugin-autostart). The former Language pane is now General and holds both launch-at-login and the interface-language picker.
- Interface language switching — a new Settings → Language pane with 7 languages (English, Русский, Español, 中文, Deutsch, Français, 日本語). The choice applies instantly across the overlay, command palette, and settings; native (system) menus keep the system language. Falls back to English for any untranslated string; auto-detects the system language on first run.
- Resizable overlay panel — drag the bottom-right (bottom-left on the vertical board) corner grip to resize the clipboard panel; the chosen width is remembered across reopens and app restarts. Settings → History → Restore default size resets it back to the built-in width/height.
- Quick Look preview — press
Spaceor⌘Yon a selected overlay card to open a larger, scrollable preview (full text or image with dimensions/OCR); same shortcuts orEscclose it;←/→/↑/↓keep browsing while it's open.⌘Yworks from the search field (unlikeSpace, which still types a space there).↓(or→on the horizontal board) from search blurs the field and selects the first visible card. Mouse: hover the type chip (PNG / Text) for an eye overlay, or right-click the card → Preview (Alfred-style contextual action). Card click still copies. Images load at full resolution (not the small list thumbnail) and animated GIFs now play; images with recognised text get an Image / Recognised text toggle instead of a cramped combined view.
- Overlay keyboard —
Spaceon a selected card opens Quick Look instead of pasting (use↵, double-click, or Paste). - Horizontal board — trackpad scroll clears card selection instead of auto-selecting the leading card; the first
→or↓after scrolling selects the leading visible card (vertical board: use↑/↓after scrolling). - Segment controls — History/Starred, content-kind, and Quick Look tabs share one control style; the selected segment no longer shows hover/press feedback.
- Command palette — raised the minimum expanded size (380×160 → 480×220) so its layout no longer feels cramped at the smallest resize; agent status hints live in the session-history panel and clear when you reopen the palette.
- Vertical board — arrow-down keyboard browsing no longer loops back to the top instead of loading the full list; removed a per-card
backdrop-filterand an always-running spinner animation that made the vertical board laggy; cards no longer render blank on reopening the overlay (stale WKWebView compositing layer forced to repaint). - Overlay — clearing search or tags no longer leaves an empty grid when history still has entries (display list syncs from the warm catalog).
- Quick menu — pastes snippets and history into Brave and Chromium; flips upward when opened near the bottom of the screen; hides the clipboard overlay and command palette before the native menu opens.
- Settings → Quick Menu — each snippet folder renders in its own inset card; row dividers restored inside folder panels; scroll position is preserved when deleting snippets.
- Settings window no longer forces a macOS Space switch when opened from the tray while another app owns a fullscreen Space, and no longer follows you to other screens/Spaces afterward — it relocates once, then stays put like a normal window.
- Tray menu — no longer blinks on the first or second click.
- Configurable palette hotkey — set it in Settings → NeuralDeep (default
⌘⇧Space), stored and re-registered like the quick-menu hotkey. - Model picker in the palette — choose the agent's hub model on the fly from the top bar; the choice persists and defaults to the hub chat model (the agent no longer hardcodes one).
- Screenshot for the agent — a camera button attaches a screenshot of the app that was frontmost when the palette opened, sent to the agent as a multimodal image so it can reason about what's on screen.
- Sticky-to-edges — the palette window snaps to the nearest screen work-area edge when dragged close.
- Transparency (glass) mode — a top-bar toggle makes the panel more translucent; the choice persists.
- Session history — recent sessions list with click-to-restore and a Clear action.
- App no longer quits after voice transcription —
hide_voice_overlay()(an AppKitNSPanelcall) was running on a worker thread; it now hops to the main thread, so the app survives every transcription. - Version shows in Settings → Updates — the settings window was missing the
core:appcapability, sogetVersion()failed and the pane readCurrent: …. - Settings window gets a Dock icon and no longer vanishes — while Settings is open the app switches to the
Regularactivation policy (Dock icon, stable window), reverting toAccessory(menu-bar-only) when it closes.
- Added
docs/TESTING.md(full pre-release functional plan) and node:test coverage for overlay search/escape, display-query keys, clear-history confirmations, and content-kind session persistence.
- Auto-update restart now works — added the
processcapability sorelaunch()after "Download & install" actually restarts Copyosity into the new version instead of failing silently.
- App version now shows in Settings → Updates — added the
core:appcapability sogetVersion()resolves; the pane no longer showsCurrent: ….
- Switching apps hides the overlay — Cmd+Tab, clicking another window, or the Dock now dismisses the clipboard overlay (it's a transient picker). The panel still opens over the frontmost app without stealing focus, and Cmd+↑ still hides it.
- Voice transcripts land in history + clipboard — every VoiceMod transcription is recorded in clipboard history and written to the pasteboard with retries, so it's never lost even if the paste into the target app fails.
- Transcribing indicator — the voice capsule now shows a spinner + "Transcribing…" while the transcript is being produced.
- Auto-update on launch — Copyosity checks for updates at startup, installs them in the background, and posts a native notification (applied on next launch).
- Cmd+↑ hides the overlay — press Cmd+↑ to dismiss the clipboard board (works whether or not the board has focus).
- Hub transcription toggle in Voice settings — "Transcribe with NeuralDeep Hub" now sits next to the voice activation toggle.
- Default hub model is now qwen3.6-35b-a3b with reasoning disabled (
/no_think) for snappy voice polishing and tagging. - Faster board scrolling — pages are prefetched ~2 viewports ahead so fast scrolling no longer stutters at the edge.
- Microphone entitlement — release builds are signed with the microphone (and Apple Events) entitlements so voice recording works under the hardened runtime.
- Hub rate limits (429) — a clear "raise your tariff" message (honoring
Retry-After) instead of a bare HTTP code; voice transcription failures now surface as a native notification.
- Quick menu — native Clipy-style pop-up at the cursor on a global hotkey (default
⌘⇧C): recent clipboard history with number keys 1–9, overflow in submenus (up to 100 entries), and snippets grouped by folder; pick an item to paste into the app that was frontmost when the menu opened — two clicks, no overlay. - Snippets — reusable text templates in folders; Settings → Quick Menu editor; snippets appear in the quick menu; Edit Snippets… from the menu opens that settings pane.
- Image cards — Copy recognised text action copies Vision OCR text to the clipboard when available.
- Menu bar app — no Dock icon and no Cmd+Tab entry; Copyosity runs from the menu bar only.
- Command palette — Spotlight-style query field with toolbar and search grouped in a header strip; updated session-history, new-session, compact-to-dot, and close icons; status hints and errors use the same secondary-line style as the overlay and settings (larger status text, no dividers under the query, consistent spacing); voice and loading indicators sit in the query row; hints clear when you type and do not persist after close or reopen; keyboard-hints footer stays visible whenever the palette is open without an answer (including during history, loading, and agent progress).
- Command palette min-dot — drag anywhere on the dot to move it; double-click or Enter expands; palette restores centered on the screen where you left the dot; expanded size is remembered across minimize and app restarts (user-resized dimensions, not the default).
- Image cards — slightly tighter vertical padding on OCR text previews under thumbnails; format badge (PNG / JPG / GIF) in the header with a reworked action row so icons stay aligned when OCR copy is shown.
- Settings → Quick Menu — quick-menu hotkey and snippets editor share one pane with inset-list layout; modifier-key hints and Save on Enter for the shortcut field.
- Settings → Voice — dedicated hotkey subsection with the same shortcut field pattern; Recording / Microphone labels; polish model and custom-instructions fields stay grouped when polish is enabled.
- Settings — deep-link to a pane via
?pane=(e.g. from the quick menu); sidebar title Hub (was NeuralDeep Hub). - Snippets editor — collapsible folders (state remembered) and inline folder rename.
- Overlay & collections — tooltips on Settings, Close, Pin, Add collection, and Remove; close icon sized to match other header controls.
- Keyboard hints — improved wrapping and spacing in overlay and palette footers.
- Settings → Accessibility — trust check no longer falsely reports "not granted" when Copyosity is already enabled in System Settings (uses
AXIsProcessTrustedinstead of a live AX probe that could returnkAXErrorCannotComplete). - Command palette min-dot — rectangular window shadow no longer lingers after minimizing to the dot.
- Command palette min-dot — expanding after dragging the dot restores the palette on the same display (not the primary screen).
Fork merge release: upstream v0.5.1 plus macOS clipboard/paste pipeline, overlay filters, security hardening, and HIG polish from the fork.
- Overlay filters — server-side search, tag, and format filters with DB-wide chip counts; tag bar with PNG / GIF / JPG chips and semantic AI tags when tagging is on; infinite scroll with Try again on failed pages; stale tag filters auto-clear when the grid is empty but history still has entries.
- Overlay search —
⌘Fand/; two-step Escape (clear query, then dismiss); Unicode case-insensitive search including OCR text on images; horizontal scroll-snap; optional keyboard-hints footer (Settings → History); 28×28 pt clear-button hit target. - History / Starred tabs — macOS segmented control for pinned vs unpinned; custom collection pills with 7 px color dot and compact remove control.
- Image clipboard — PNG / JPG / GIF from pasteboard and Finder (~20 MB); animated GIFs; format badges; dimensions and file size on cards; OCR preview under thumbnails; format tags always visible in the filter bar.
- Primary Paste on cards — accent Paste button; Enter, Space, and double-click paste the selected entry; card actions on hover or keyboard focus (not bare selection).
- macOS paste pipeline (
clipboard_macos/on objc2) — paste-target remember/restore, AX tree walk, synthetic Cmd+V, concealed-pasteboard detection; overlay, command palette, and voice paste into the app that was frontmost when opened; improved paste into Messages and Electron apps. - Unified clipboard writes (
clipboard_write.rs) — Copy / Paste modes shared by copy, activate, paste, and voice flows. - Clipboard capture — Finder image files store pixels (not the file icon); ignore concealed clipboard content; suppress duplicate entries and Copyosity's own copy/paste from history; hash reset on history clear.
- NeuralDeep Hub master switch — one toggle for command palette, hub transcription/polish, and tray Agent Search.
- Privacy — native app picker for excluded apps; bundle IDs as stable keys; Exclude [App] from the overlay; clear unpinned or all history with confirmation and live count sync.
- Settings toggles — AI tagging and voice transcription (off by default); overlay keyboard hints; Ollama onboarding states and model validation before download;
is_tagging_readyIPC for gated Retag. - Intel Mac builds — x86_64 DMG alongside Apple Silicon (
make build-macos-intel, arch-specific artifacts indist/macos/). - Per-window Tauri capabilities — scoped IPC for
main,settings,voice_overlay, andpalette(paste_entry/activate_entryon main only;clear_historyand Ollama on settings only). - Design system —
tokens.css,form-controls.css,button-interaction.css,.inset-listgrouped rows; input-modality tracking for pointer vs keyboard focus rings; rem-based typography scale. - Developer toolchain — Oxlint, Oxfmt, Stylelint, Lefthook pre-commit,
make fix/make lint/make check; Vite 8; optionalsccachefor Rust dev builds. - Tray menu — Open Clipboard
⌘⇧V; Agent Search disabled when hub is off. - Command palette — Agent/Web mode switch; session history; streaming agent progress and markdown answers; draggable top bar, resize grip, minimize-to-dot; voice input; Insert / Copy / Close actions; HIG hover/focus on mode badge, history, actions, and toolbar.
- Accessibility — focus-visible rings on cards, tabs, and search; search in Tab order; roving
tabindexand selection chrome separated from keyboard focus; voice HUDaria-livebaseline;prefers-reduced-motion,prefers-reduced-transparency, andprefers-contrast: moresupport.
- Merge — integrated upstream v0.5.1 with fork overlay, ACL, and platform gating; image-pipeline reconciliation deferred to a follow-up backlog item.
- Overlay — Raycast-style open/close motion; sparkles icon opens command palette; outside-click dismiss; semantic tag chips when NeuralDeep Hub tagging is configured; abbreviated tag labels; synonym merge in filter counts (e.g.
javascript/js); format chips sorted by count; fixed panel height 415 / 450 px; All / Text / Images content-kind segment temporarily hidden; vertical board shows tag chips in the header strip; contextual empty states per filter. - Tagging — auto-tag and Retag work with NeuralDeep Hub or local Ollama; with AI tagging off, semantic tags are hidden in the UI; tag backfill when tagging is enabled.
- Cards — fixed-height preview and footer layout; single-click copies; SF Pro for plain text previews, SF Mono for code-like content; filter chips visually distinct from card metadata badges; improved search-field readability on vibrancy.
- Iconography — macOS SF Symbols in overlay actions, settings section icons, and voice HUD mic (upstream stroke SVG layout preserved elsewhere).
- Command palette & Settings — visible over fullscreen apps on all Spaces.
- Settings — inset-list HIG layout; native title bar; boolean toggles apply immediately without losing unsaved edits; hub switch updates shortcuts and tray; unified form controls and multi-line field sizing; Ollama actions on background threads with visible busy states; app display names from installed bundle metadata.
- Clipboard monitor — captures only on real pasteboard changes; ignores Copyosity's own writes and when Copyosity is frontmost.
- Tray — left-click opens menu only; open the overlay via Open Clipboard or
⌘⇧V.
- Paste into Cursor, Messages, and other Electron/native targets (no double paste, compose-field focus, background-thread timing).
- Voice and command palette paste into the stale overlay target instead of the app active at hotkey/open time.
- Finder image capture via
public.file-urlpasteboard type (no filename-only text cards); re-copy after clear/delete. - History clear and last-card delete no longer re-insert stale clipboard content.
- Image backfill for legacy rows (full-size data, format, dimensions,
jpgnormalization). - Settings partial updates no longer wipe Whisper or voice settings; accessibility enable hint persists until granted; Ollama unload and tagging test reliability; Save button layout jump.
- Overlay dismissal on Space switch; invisible cards on panel open; selection/focus desync during search; card scroll clipping at grid edges; mouse pin no longer leaves the action toolbar stuck open; pinned star hover distinct from unpinned.
- Excluded-app add-by-name errors and bundle-ID resolution; clear-history menu counts, notices, and confirm-dialog keyboard leak.
- Settings Storage/Privacy spacing and clear-notice layout.
- Per-window IPC command scoping via Tauri capabilities (
main/settings/voice_overlay/palette). - Ollama model name validation before
ollama pulland settings persistence. cargo auditin the release workflow before artifacts ship.- Tauri 2.11 upstream IPC ACL hardening.
- Voice overlay capsule — pulse dot, live scrolling waveform, elapsed timer (replaces mic + EQ HUD).
- Active-screen board + vertical mini-clipboard (
board_vertical) — docked-right list, compact cards,↑/↓hints.
- Emerald accent theme (
#10b981/#34d399) — NeuralDeep-style palette refresh.
- Voice polishing — context-aware LLM cleanup of transcriptions; selected-text command mode.
- Settings sidebar — NeuralDeep · Voice · Local AI · History · Permissions panes; live model dropdowns from hub
/v1/models. - Agent tools — macOS Notes, Reminders, Calendar via
osascript. - Command palette — minimize-to-dot; draggable minimized dot (double-click to restore); more agent steps with guaranteed final answer.
- Settings layout refactor; voice and hub sections reorganized.
- Command palette session history — local persistence, resize grip, remembered window position.
- Palette draggable with real window move; hide keeps agent state; markdown answers; clearer hub auth flow.
- Hub multimodal image tagging — vision model tags image clipboard entries when hub tagging is enabled.
- Command palette / ReAct agent —
⌘⇧Spaceresearch agent loop in a draggable, resizable palette window.
- NeuralDeep Hub default URL and settings aligned with API docs.
- NeuralDeep Hub — settings pane, hub tagging / transcription / search,
/v1/modelslist. - Command palette web search — real hub search results in the palette.
- On-device OCR (macOS Vision) — overlay search includes recognized image text; live updates as OCR completes.
- Settings promote NeuralDeep Hub to the top; local AI settings grouped below.
- Voice transcription — dictate from the voice overlay into the active app.
- Model pull progress — non-blocking Ollama download with live progress in Settings.
- Accessibility permission check in Settings with explicit request action.
- Panel visible over fullscreen apps on all Spaces.
- Wider Settings window; auto-save model before tagging test; spinner and loading hints in Settings.
- Ollama lookup searches common install paths when running from a
.appbundle.
- Image copy used thumbnail instead of original resolution.
- Model presets, pull error handling, and unload-model button behavior.
- Tagging test timeout (60 s for cold model load); status refresh after save.
- Quit button uses
std::process::exitto bypassprevent_exit.
- Paste reliability, copy button behavior, scroll position reset, and ghost windows after hide.
- NSPanel-based main window (no focus stealing).
- Dedicated Settings window.