- Tracker on a dedicated branch β
.pair/migrated from per-branch versioning to a worktree of an orphanpair-trackerbranch. Tickets persist acrossgit checkoutand no longer appear in code-branchgit status. One-click in-app migration with backup tag for rollback. Cross-branch divergence detection merges tickets scattered across legacy branches into the orphan during migration. Auto-trigger dialog at project switch when legacy state is detected - Branch filter & column β New
branchcolumn in IssueTable (visible by default, after favorite). New BranchFilterDropdown with 3-tier layout: "Current branch [HEAD]" pseudo-entry mapping to@headsentinel that followsgit checkoutautomatically, alphabetic by-name pins. Backend.git/HEADwatcher emitsgit-head-changedfor live UI sync - "Track issues in git" toggle at init β Opt-out of git versioning for tickets; the toggle conditions whether
pair-trackeris created at all - Workflow rule update β On migrated projects, the legacy "two separate commits" rule (code +
.pair/) becomes "two separate pushes":git pushthengit -C .pair push. Auto-deployed to every PaiR-managed project via.pair/AGENTS.md
- Dashboard Last Edit β Consistent cross-project ordering
- Orchestration β Internal session flash propagates correctly to SessionNode
- Update Download & Quit β Uses
destroy()to bypass the quit-confirmation dialog - Tracker migration β Multiple hardenings: SQLite cache rebuilt from JSONL post-migration, tombstones excluded from issue count, untracked files no longer block working-tree-clean check, Engine cache invalidated after migration/rollback, porcelain leading byte preserved,
.pair/.gitignoreself-healed at every Engine open - Migration on fresh repo β
git symbolic-ref --short HEADresolves the branch even on a 0-commit repo; backup tag silently skipped when there's nothing to roll back to - Filters legacy schema β
useFiltersnow re-normalizesFilterStateon every project switch, fixing a silent throw when projects had a storedfilterspredating later fields (e.g.branch === undefined)
- Paused status β New
pausedstatus in the issue workflow for work temporarily set aside - Search field highlight β Populated search inputs now stand out with a neon yellow style
- Table scrollToIssue β Programmatic navigation to any issue, with automatic section expand, page pagination, and parent epic unfold
- Workspace orchestration coverage β Workspace mode graph now includes projects associated with workspace-pinned projects, even when those associates have no pinned session (bidirectional)
- Release scripts β Auto-detect
CLAUDECODEto trim verbose output during release workflows
- Search reliability β
external_refis now indexed in FTS5; silent search errors are surfaced - Preview sidebar β Sidebar stays open when navigating to a closed child issue
- Terminal detach β Cross-window sync for active tab, workspace mode, and current project between main app and detached terminal panels. Single-location invariant: the internal section hides whenever any terminal is detached, and clicking the internal header re-attaches unconditionally. AI notifications and focus actions target the detached window when present. Detached header now surfaces tmux/Claude status badges
- Orchestration view β New graphical canvas (VueFlow) showing projects and their terminal sessions as interactive nodes with puzzle-piece connectors for cross-session communication
- Bidirectional session sync β Clicking a session in the graph focuses the terminal tab (and switches project); clicking a terminal tab highlights the session in the graph. Powered by a new
useActiveSessionglobal store - Workspace mode in graph β When workspace is active, the graph shows all projects with workspace-pinned sessions alongside the current project and associations
- Cross-session journal push β Linked tmux sessions can broadcast journal entries to each other, including PTY sessions. Link/unlink events are notified
- Cross-project favorites β Star issues from any project; favorites are stored globally in the catalog and displayed in the dashboard
- Auto-fit graph β ResizeObserver detects container changes (terminal open/close, sidebar resize) and auto-fits the viewport. Toggle button in bottom-right corner
- Issue title in graph β Sessions launched via Play show the issue title below the session name
- In-app documentation β New "Orchestration View" section in terminal docs (EN + FR)
- tmux issue ID persistence β
PAIR_ISSUE_IDwas never written to tmux env for root issue IDs. Sessions now survive app restarts with their issue association intact - Session click cross-project β Clicking a session in a non-active project now correctly switches both the project and the terminal tab
- VueFlow fitView timing β Replaced
nextTickwithsetTimeout(150ms)for fitView after node changes - Handle border masking β Added missing masking rects on source handles that caused border bleed
- Edge z-index β Edges now render above project nodes instead of being hidden behind backgrounds
- Session badge count β Corrected session badge count and cleanup logic
- Read-only directory handling β FolderPicker now detects write permissions and adapts the UI: on read-only directories, clicking "Init as PaiR" opens a terminal with
pair initpre-filled instead of failing silently - Real error messages β Tauri invoke errors now display the actual error message instead of a generic "Failed to initialize tracker"
- Catalog registration on init β
tracker_init(app) now callscatalog::auto_registerlike the CLI does, ensuring the project appears in the global catalog - CLI path resolution β Fixed CLI subprocess path resolution in production app (sidecar + extended PATH)
- Video demo on website β Interactive demo player on the landing page: play/pause/stop overlay on the screenshot, theme-aware (dark/light), auto-returns to image on end or theme/locale change
- CLI as single source of truth β All mutations (status changes, attachments, issue creation) now route through the CLI, ensuring consistent journal tracking and push notifications
- Enriched journal β Journal now tracks
status_changed,attachment_added, andattachment_removedevents in addition to issue creation/closing - Pagination indicator β Dashboard shows a visible count of displayed vs total issues above the table, with critical issues always visible regardless of pagination
- Dashboard refresh on CLI mutations β Status changes and attachments from CLI/agents now trigger immediate dashboard refresh
- Screenshot automation β Tmux sessions are cleaned before capture to prevent stale session badges
- Video capture system β New
capture-video.pyscript with scenario-based recording, journal polling for timing, variable interpolation (--var theme=light), pre-layout setup, and automatic speed-up (--speed 2) - Remote control commands β Added
terminal-type,terminal-close,terminal-switch,journal-open/close,pomodoro-open/start/reset,toast-dismiss-allfor screenshot and video automation
- Last Edit section β New collapsible section showing the 10 most recently modified issues. Populated automatically from journal entries and live push events (create, close, update, comment)
- Dashboard push event tracking β Issue create/update events from CLI and agents now correctly trigger a poll refresh and appear in Last Edit
- Cross-platform paths β Replaced hardcoded
$HOMEpaths withdirs::crate for proper cross-platform support (Windows, Linux, macOS) - Terminal auto-start default β Auto-start is now disabled by default for new users, preventing unexpected Claude launches
- Terminal multi-tab race condition β Replaced singleton callbacks (shellReadyResolve, claudeReadyResolve, pendingCommand) with per-session Maps, fixing race conditions when launching multiple terminal tabs rapidly
- Terminal session naming β Sessions now use the project folder name as prefix (e.g.,
MyProject 1,MyProject zsju.2). Visible in both PaiR tabs andtmux ls, making it easy to identify which project a session belongs to β especially useful in workspace mode - Hooks auto-journal β Git commits and session stops are automatically logged to the project journal via Claude Code hooks
- Journal context injection β Journal entries are auto-injected as context on Edit/Write tool calls via PreToolUse hooks
- Journal auto-refresh β Journal panel refreshes automatically on push events from external agents
- First keypress lost in tmux β Removed a stray Escape character sent during tmux initialization that was consumed by the shell, causing the first keystroke to be silently dropped
- Isolated tmux socket β PaiR sessions now run on a dedicated tmux socket (
pair), preventing interference with user's personal tmux sessions - Terminal section auto-open β Terminal panel no longer opens unexpectedly on hot-reload
- Comments panel visibility β Comments panel stays visible and resizes correctly in split screen
- Hook deduplication β Removed session_stop noise and deduplicated auto_commit journal entries
- Debounced resize β Terminal resize events are debounced, keydown handlers consolidated, and deep watchers replaced with targeted ones
- Activity journal β Every project gets a live activity feed. Issues created, changes made, decisions taken β logged automatically and manually via
pair journal. Collapsible panel in the footer with scroll-to-bottom, project name header, and auto-export to JSONL - Project catalog & associations β Global project catalog stored in Application Support. Link related projects together via
pair associateor the app settings. Bidirectional associations with UUID-based catalog - Cross-project orchestration β AI agents automatically read associated projects' journals at session start. Reply-to protocol enables asynchronous agent-to-agent communication across codebases
- Workspace mode β Pin terminal sessions from multiple projects side by side. Workspace toggle in terminal header, smart "+" button to attach existing sessions, chain link indicator between associated project tabs
- Workspace journal view β Merged chronological view of journal entries from all associated projects in the journal panel
- Detachable terminal window β Pop out terminal sessions into independent windows (PTY mode). Per-project geometry persistence, dynamic window title, and proper session sync
- Epics section β Dedicated Epics section in the issue table with automatic in-progress status when children are active
- Full-text search on comments & labels β FTS5 index now covers comments and labels, not just titles and descriptions
- Terminal session count badge β Sidebar shows the number of active terminal sessions per project
- Storage adapter abstraction β New storage layer for future migration to centralized catalog-based settings
- Journal panel β Entries now display in chronological order (oldest first) with UTC-to-local time conversion
- Terminal tmux rendering β Resize-bounce workaround for reliable rendering on project switch
- Log timestamps β Application logs now use local timezone instead of UTC
- Search on poll β FTS search re-runs on poll instead of silently overwriting results
- Detached window focus β AI notifications focus the detached window instead of reopening internally
- Catalog self-association β Prevented linking a project to itself
- App freeze on project switch β Column config watcher (
deep: true) triggered an infinite reactive loop when switching projects, causingMaximum recursive updates exceeded. Replaced with a stable ID-based watcher - Thread starvation on startup β
TRACKER_ENGINESglobal mutex blocked all concurrent project access. Replaced with per-projectArc<Mutex<Engine>>locking so different projects don't block each other - Startup overload β
initialScanfiredcliListfor all projects in parallel viaPromise.allSettled, saturating the Tauri thread pool. Serialized to sequential calls - Migration dialog crash β
useIssues()was called inside event handlers (switchWithoutMigration,migrate) instead of at setup level, causinguseI18nto throw - Filter watcher race β
reloadProjectStorageupdated filters during project switch, triggering a redundantfetchIssuescall that raced withdoPathChange. AddedisSwitchingProjectguard
- Play button missing β Run column now re-syncs when switching projects (no more Cmd+R needed)
- Shift+Enter in terminal β Works in both PTY and tmux modes (kitty keyboard protocol + tmux send-keys bypass)
- Claude Code icons β MesloLGS NF font loaded for Nerd Font glyphs (no more red rectangles)
- Accents in tmux β UTF-8 locale forced on all terminal sessions (LANG/LC_ALL + tmux -u flag)
- Pomodoro timer β Built-in timer in the footer bar (heart icon) with work/break cycles, persistent notifications with contextual actions, and a popover with play/pause/stop/skip controls
- "Start with app" setting β Optionally auto-launch a Pomodoro cycle when the app starts
- State persistence β Timer state survives app refreshes and restarts, resuming where it left off
- Healthy settings β New collapsible "Healthy" section in Settings with configurable work/break durations, cycle count, auto-start, and notification sound
- Website "Takes care of you" β New feature card combining sound alerts and Pomodoro, hero section mentions developer well-being
- Vue warnings β Fixed missing
isDevin SettingsDialog and missingrenderedemit in IssueTable - Silent notifications β Added
silentoption touseNotificationto prevent double sounds when the caller plays its own
- Settings uniformization β All settings sections (Language, Theme, Sound, AI Agent, Terminal, Healthy, Onboarding) now have consistent bordered containers
- "Visit Website" button β Clicking the button in the Check for Updates dialog caused an unhandled error on all platforms. The shell plugin was missing the
openscope configuration intauri.conf.json. - tmux terminal display β CLI tools (e.g. Claude Code) rendered degraded ASCII logos inside tmux sessions. Now forces
TERM=xterm-256colorinside tmux for consistent Unicode rendering.
- tmux 3.6+ compatibility β Terminal tmux mode failed with immediate EOF on systems with tmux 3.6+. The PTY attach command was missing the
TERMenvironment variable, causing tmux to refuse the connection.
- tmux mode β Persistent terminal sessions that survive app restarts and can be accessed from external terminals (Zed, iTerm, VS Code) via
tmux attach - Issue-named sessions β tmux sessions are automatically named after the issue ID (e.g.,
pair-xein-16intmux ls) - Smart session close β Detects when a tmux session is attached in another terminal and warns before killing. Switch defaults to "detach only" when session is used elsewhere
- Auto-close on issue close β Closing an issue automatically closes its associated terminal session, with persistent toast notification for poll-detected closes
- Natural language Run prompt β "Work on bug pair-xein.23: Fix login" instead of generic commands
- Mode switch confirmation β Changing terminal mode (PTY β tmux) shows a confirmation when sessions are open
- Kill switch on tab close β Toggle to also terminate the tmux session when closing a tab (enabled by default)
- tmux path resolution β Apps launched from Finder (not terminal) now correctly find the tmux binary
- tmux session restore β Fixed input routing, resize, and status bar on restored sessions
- tmux prompt detection β Fixed latency in Claude prompt detection and stale state
- Split border β Hidden border in single-tab mode
- tmux prefix key β Disabled tmux prefix to avoid conflicts with PaiR shortcuts
- Active tab persistence β Active tab is correctly persisted when closing an issue session
- Windows PTY PATH β CLI
pairis now in the PTY shell PATH on Windows - Parent validation β Creating a child issue on a non-existent parent is now rejected
- tmux mode documented in in-app help (EN/FR)
- tmux mode mentioned in website features and FAQ
- Issue comments traΓ§ability guidelines added to CLAUDE.md
- Windows CLI PATH β CLI install directory is now automatically added to user PATH on Windows
- Windows/Linux update dialog β "Download & Quit" button only shown on macOS; Windows/Linux show "Visit website" instead
- Linux PATH fix message β Onboarding PATH instructions now shown on Linux too (was macOS-only)
- Cross-platform PATH resolution β
get_extended_path()now uses correct separator and paths on Windows
- Windows terminal support β Terminal now detects and uses PowerShell Core, Windows PowerShell, or cmd.exe automatically
- Review onboarding β New button in Settings to review the getting started steps at any time
- Onboarding scroll on small screens β Onboarding panel now scrolls properly on low-resolution displays (Windows/small screens)
- CLI symlink auto-repair β App automatically repairs broken CLI symlink at startup
- French locale β Replaced "issues" with "tickets" throughout French locale for consistency
- Windows unsigned app notice on website download page (SmartScreen instructions)
- Updated in-app docs: hooks-setup, sync-conflicts, terminal β clarify Unix socket vs Windows polling
- Updated terminal shortcut to mention Linux/Windows
- Integrated multi-session terminals β Run multiple terminal sessions per project with tabbed interface. Launch Claude Code directly from issues, monitor AI agents in real time with visual and sound notifications when they need attention
- Terminal split view β Pin tabs to display terminals side by side. Built-in multiplexer experience with per-project persistence
- AI notification routing β Internal sessions flash and turn red, external sessions (Zed, Cursor, VS Code) show toast + sound only
- AI Text Transform β Transform text in any input field using AI. Smart interpretation: reformulate, translate, summarize. Works with any Claude subscription
- Markdown zoom β Zoom now scales all elements (headings, code, tables), not just normal text
- Dashboard charts β Charts expanded by default on first launch
- New "AI Text Transform" dedicated help page (EN/FR)
- Updated terminal docs (split view, pins, notifications, shortcuts) β EN/FR
- Added terminal section to keyboard shortcuts doc
- Issue focus borders β Active issue row highlighted with a visible focus border for better accessibility
- Project path navigation β PathSelector now supports keyboard navigation and direct project switching
- Keyboard shortcuts docs β Added keyboard shortcuts documentation page (EN/FR)
- Attachment list refresh β Attachment list in preview now refreshes correctly on add/delete
- Updated 15 dependencies (Nuxt, Vue, Tailwind, Vitest, Reka UI, etc.)
- Panel keyboard shortcuts β Navigate between panels with
1/2/3(+ Numpad, F13/F14/F15),Escapecloses details preview,Cmd/Ctrl+Rrefreshes issues - Mobile auto-focus β Switching tabs in mobile mode auto-focuses the container for immediate arrow key navigation
- Focused panel indicator β Subtle border-top highlight shows which panel is active on desktop
- Markdown preview refresh β Refresh button and external change detection for attached markdown files
- Blocked icon β Replaced blocked status icon with LockKeyhole padlock for better clarity
- Internal code cleanup and legacy naming removal
- Pinned issues in DB β Pin state moved from localStorage to SQLite, synced via git, visible from CLI and AI agents
- CLI pin/unpin β
pair pin <id>,pair unpin <id>,pair list --pinned - Undo on unpin β Toast with undo button + Cmd/Ctrl+Z keyboard shortcut (8s window)
- Notification action buttons β Toast notifications now support visible action buttons
- Campaign badge color β Changed from amber to pink to avoid confusion with P2 priority
- README rewrite β Features section restructured into themed subsections
- Removed
hookedstatus β Dead status type never used in production, fully removed from types, CSS, i18n, and tests - Removed
pinnedstatus β Pin is now a boolean flag, not a status value - Removed pinned sort modes β Simplified to updatedAt sort, removed drag-and-drop reorder
- Updated in-app docs β Dashboard, CLI reference, and AGENTS.md updated for pin/unpin
- Resizable comments panel β Comments split into dedicated resizable panel with source badges
- Unified zoom controls β New ZoomControl component, compact header/footer, sound toggle moved to footer
- Uniformized section buttons β Consistent collapsible section UI across all table sections
- Sync integration tests β Full roundtrip sync test coverage
- CLI sidecar lookup β Look for sidecar in exe dir instead of resource dir (GitHub #1)
- Linux Wayland β Auto-disable WebKitGTK compositing on Wayland
- Resync updates in-place β No longer deletes and recreates issues on resync
- Sync-repo config β Fix sync-repo detection without explicit sync-provider
- Reopen clears closed_at β Reopening an issue properly clears the closed date
- GitHub issue sync β One-way GitHub β PaiR issue synchronization with single-issue resync
- GitLab provider β GitLab issue sync support via API, auto-detected from git remote
- Spec issue type β Dedicated spec type with its own table section and
pair childrencommand - Comments fullscreen dialog β Expand comments in a full dialog with search (Cmd+F) and print (Cmd+P)
- AI session count β Dashboard shows active AI session count per project
- Specs dashboard section β New Specs panel in the project dashboard
- Issue title in all preview dialogs β Image, Markdown, PDF, and Comments dialogs now show the issue title in the header
- Shared search/print utilities β Extracted duplicated DOM search and print code into reusable modules
- Search highlight colors β Blue-themed highlights with proper dark/light mode contrast
- In-app help β Documented single-issue resync and spec type
- Sound alerts persistence β Fixed sound alerts saving to the wrong project path
- Dashboard AI column β Hidden when no AI sessions detected
- App freeze on rapid project switching β Prevent the app from freezing when switching between projects quickly
- Attachment downloads β Download button added to image and PDF preview modals
- PDF attachments β Full PDF support with preview, migrated to Tauri asset protocol
- In-progress badge β Sidebar project list shows count of in-progress issues
- Search regression β Fixed crash when searching (useI18n called outside setup), also resets pagination on search
- Deferred section β Issues with "deferred" status now appear in their own collapsible table section, placed after "Ready to Work"
- Bilingual interface (EN/FR) β Full i18n support with language switcher, all UI labels and table section headers translated
- Automated screenshot capture β Screenshots generated for the website with theme and locale variants (dark/light x en/fr)
- ConflictDialog visual testing β Mock conflict dialog for design iteration
- Website screenshots by locale β Website now serves screenshots matching the visitor's language and theme
- Screenshot deployment checks β Deploy and verify scripts validate all 4 theme/locale combinations
- Duplicate log entries β Eliminated redundant log lines in the native logger
- Table section headers β Section headers now properly translated in all locales
- Linux platform info β Corrected Linux installation instructions in FAQ
- Git sync safety β Skip git operations when
.pairis gitignored
- User-facing changelog page β Bilingual (EN/FR) changelog page on the website at
/changelog, with version badges and grouped features/fixes - Scroll spy navigation β Header nav links highlight based on visible section when scrolling the homepage
- Website-first approach β Release notes and changelog now live on the website, no longer synced to GitHub pair-dist
- Check for updates β Now uses release body directly instead of fetching CHANGELOG.md from GitHub. "View on GitHub" replaced by "Visit website"
- Centralized website URL β
WWW_BASE_URLfrom.envused as single source of truth across frontend (runtimeConfig) and scripts (changelog_utils.py) - Frontend constants β Added
app/utils/constants.tsfor shared GitHub distribution repo references - Release notes generation β New
scripts/changelog_utils.pygenerates user-facing release bodies fromwww/app/data/changelog.ts - FAQ updated β Added "Is PaiR open source?" and "Does PaiR work offline?" questions, reordered logically, clarified AI hooks support and Beads migration
- Removed CHANGELOG.md from pair-dist sync (SYNC_FILES in sync-releases.py and publish-local.py)
- Removed "All releases available on GitHub" mention from download section
- Removed GitHub link from header navigation (kept in footer)
- Soft delete by default β Deleting an issue now archives it (tombstone) instead of permanently removing it. Check "Delete permanently" in the confirmation dialog for hard delete. Dialog wording adapts contextually ("Archive" vs "Delete permanently").
- Updated in-app help docs (issue workflow, issue details) to reflect soft delete as default behavior
- Embedded help documentation β 10-page help system accessible via
?shortcut or Help menu, with table of contents navigation, cross-page search, and print support - Clickable AI toast notifications β Click on an AI notification toast to focus the agent's session window (macOS only)
- Help viewer UX β Wider dialog, resizable TOC sidebar, scroll spy, arrow key navigation between pages and sections
- Hidden internal statuses β Internal statuses (pinned, hooked) no longer appear in filters and edit form
- Mute icon zoom β Mute icon no longer scales disproportionately when zooming the interface
- Help viewer overflow β Content no longer overflows on narrow windows
- Website screenshot β Website now uses the most recent screenshot by date instead of a version-based path that could break on patch releases
- Why PaiR? β Project philosophy and manifesto
- Getting Started, Dashboard, Issue Details, Issue Workflow
- AI Agent Hooks, Sync & Conflicts, CLI Reference
- Settings (global + per-project), Keyboard Shortcuts
- AI agent hooks settings β Configure AI agent hooks (Claude Code, Cursor, Codex) directly from the global settings page
- Notification sound fallback β Fall back to global sound preset when a project has no notification config
- Linux audio crash β Prevent audio playback error from blocking toast notifications on Linux
- AI sound notifications β Per-project sound alerts when AI agents need attention, with 5 sound presets (Bell, Double beep, Rising, Soft chime, Alert), per-project volume override, and global mute toggle in header
- Centralized localStorage β All keys managed through
storage-keys.tswith active registries and automatic cleanup of stale keys - Non-destructive storage migration β
beads:βpair:key migration at boot, old keys preserved for backward compatibility - Path normalization β
hashPath()now strips trailing slashes, fixing per-project settings mismatches - Legacy rename β
useBeadsPathβuseCliPathacross the entire codebase - Cargo cache added to all CI builds (Windows, macOS, Linux)
- Added 21 tests for hash normalization, storage key registry, and migration logic
- Collapsible sections β Issue list organized into In Progress, Pinned, and Current sections with collapsible headers
- AI panel: unknown project/agent detection β Flag events from unrecognized projects or AI agents
- Compact header layout and refined table typography
- Harmonized primary color and simplified neon default theme
- Epic borders restored with child in_progress group promotion
- Centered KPI card content, neutral label badges
- Backend split into command modules for maintainability
- Frontend refactoring: extracted reusable utils, composables, and badge configs
- Linux build script now produces both amd64 and arm64
- Added tests for partition helpers, toggle/enrich utilities, and short ID generation
- Project pinning β Pin/unpin projects in sidebar, toggle "pinned only" filter to focus on starred projects. Drag-and-drop and sort hidden when filtered
- AI panel: brand icons β Per-event SVG icons for Claude, Cursor, Codex, Gemini, Vibe (+ generic fallback)
- AI panel: project name β Display project name (last path segment) after AI icon
- AI panel: Copy button β Copy filtered events to clipboard as text
- AI panel: cost & tokens on Stop β Show total cost and token counts when AI session ends
- AI panel: tool error detection β Highlight failed tool calls in red via
tool_errorevent type - AI panel: tool_use_id via meta β Pass tool_use_id on all tool events for future duration tracking
- SubagentStop hook β Capture agent completion events (
agent_stopin AI panel) - PreCompact hook β Capture context compaction events (
compactin AI panel) --ai-nameflag βpair notify --ai-name claudefor testing AI icons without actual AI process
- Throttle activity LED re-renders (200ms) to reduce DOM updates
- Increase AI panel MAX_EVENTS from 200 to 500
- Dual-theme colors for all event types (light + dark mode)
- Zoom support for AI and Debug panels (
.zoomable-panel) - Soften verbose event opacity (60% β 80%)
- Expand AI detection: add Gemini and Vibe to PPID chain walker
- Add disclaimer section to README
- Clarify non-destructive migration in README
- Add Features section and improve hero layout on website
- Add
pair --version/-Vto CLI (clap version flag)
- Fix CLI binary missing execute permission in Linux
.debpackage - Fix log file path for Linux (
~/.local/share/com.pair.app/logs/pair.log) - Rename log file from
beads.logtopair.log - Fix push socket stale detection (non-blocking connect check)
- Set socket permissions to world-writable so CLI can always connect
- Auto-fix CLI permissions on app startup (Linux
.debworkaround)
- README: add "Why PaiR?" section, mark AI features as experimental (macOS only), update platform availability (Windows coming soon)
- Claude Code hooks: recommend absolute path to
pairbinary on all platforms - Add Linux-specific note to AGENTS.md template
- Add
notifycommand and Claude Code hooks configuration to AGENTS.md template
- Fix stale data when external process (CLI script) modifies the database β invalidate cached SQLite connection on mtime change
- Add
relate/unrelatecommands to AGENTS.md template
- AI session tracking β Associate AI session PID with projects via push notifications. Walk PPID chain to detect AI CLI (Claude, Cursor, Codex) and editor (Zed, VS Code)
- Per-project activity LED β Each project line shows a LED that blinks green on AI notifications (replaces folder icon)
- Focus AI session window β Click the focus button or press ββ§F to switch to the editor window where AI is working (uses editor CLI for precise window targeting)
- AI Events panel β Renamed from "Claude Events" to "AI Events". Shows AI name badge (claude/cursor/codex) per event. Toggle with ββ§A
- Keyboard shortcuts β ββ§A (AI panel), ββ§F (focus AI session) added to app menu
- Blocked badge β Visual badge for blocked issues in the issue list
- README β Added Features section, merged Background & Compatibility
- AI name (
ai_name) and editor name (editor) fields added to PushEvent for richer notifications - Focus window uses 3 strategies: editor CLI from notification β detect editor from PID tree β AppleScript fallback
- Session focus button uses neutral gray style (white when project selected)
pair attachCLI command β attach files to issues from the command line, with real-time attachment refresh in the app
- Fix toast notification contrast in light theme
- Rename release artifacts + disable unavailable downloads on website
- Claude Events: native hook integration β
pair notify --hook <hook_type>reads JSON from stdin, classifies events (significant vs verbose), and forwards to the app. Replaces the bash/jq bridge script. pair notifyCLI β new--hookflag for Claude Code hooks, plus existing manual mode (-t/-m) preserved for backward compatibility- Self-call detection: Bash commands starting with
pair notifyare automatically skipped to prevent echo loops
- Mark
scripts/claude-hook.shas legacy (kept as reference) - Update AGENTS.md with
--hookmode documentation and simplified Claude Code config
- Print Markdown β print button +
Cmd+Pin Markdown preview modal (uses native print dialog via Tauri WebView) - Custom relations CLI β
pair relate <id1> <id2> --type <type>andpair unrelatefor non-blocking relations (relates-to, duplicates, supersedes, etc.) - Custom relations exported/imported in JSONL (
relationsfield) β survives sync round-trips
- Fix dynamic window title β add missing
core:window:allow-set-titlepermission - Fix print in Tauri WebView β rewrite from iframe (blocked) to permanent
@media printstyles - Print page breaks:
break-inside: avoidon code blocks, tables, headings
- Rebrand all docs from Beads to PaiR
- Rewrite README for public distribution + sync automation
- Document
pair relate/pair unrelatein AGENTS.md
- New Maintenance section in project settings dialog (separate from Actions)
- Repair database β re-sync SQLite with JSONL (auto-backup before repair)
- Fix CLI permissions β restore +x on the pair binary (resolves symlink)
- Re-initialize moved to Maintenance section (most destructive = last)
- Dynamic window title β shows "PaiR β ProjectName" when a project is selected
- Parse
.pair/config.yamlforissue-prefix(was hardcoded to defaults) - Toast notifications on all maintenance actions (success/error)
- Per-project settings dialog β click the cog icon on any project in the sidebar
- Project info: path, database status, issue count, legacy .beads/ detection
- Actions: remove from list, re-initialize database, migrate from .beads/
- All actions require confirmation before executing
- Read-only settings display (prefix, git tracking) β editing in a future version
- Migration dialog: add "Start fresh" option + skip if .pair/ already exists
- Onboarding: folder select triggers migration + remove "switch without migrating"
- Onboarding: cancel migration no longer creates .pair/ + git tracking choice preserved
- Check-for-updates broken on all platforms
- Fix sidecar binary not found on Linux β Tauri uses full target triple (
pair-x86_64-unknown-linux-gnu) but lookup only checkedpairandpair-x86_64
- New
pair dep tree <id>β recursive dependency tree with cycle detection - New
pair dep list <id>β direct blocks/blocked_by with issue details - Both commands support
--jsonfor structured output
- App icon now uses dark background (#1E1E2E) for better dock visibility
- Header logo aligned with left sidebar
- Search field now overrides status filters to show matching results
- New PaiR app icon (blue silhouette) for macOS dock, Windows taskbar, and all platforms
- New PaiR logo with name in app header (theme-aware: light/dark variants)
- New PaiR logo in About dialog (replaces plain icon)
- Chevron separator between logo and project name in header
- Added logo assets: light, dark, mono, and PSD sources
- Removed legacy bd/br backend code
- Removed unused Rust functions (4 compiler warnings fixed)
- Removed legacy attachment refs migration code
- Removed unused backendMode watcher in index.vue
First pre-release of PaiR β standalone issue tracker with built-in Rust engine.
- SQLite-based issue tracker with full CRUD (create, update, close, delete)
- Schema v1βv5 with automatic migrations
- Full-text search (FTS5) across titles, bodies, and notes
- JSONL export/import for portable data exchange
- Git sync cycle: export β commit β pull β import β push
- Merge conflict detection and resolution
- Sequential child IDs:
parent.1,parent.2,parent.3 - Auto-position on child creation
reorder_child()with sequential re-numberinglist_children()ordered by position (legacy fallback on created_at)
- Block dependencies:
blocked_by/blocks list_ready_issues()β open issues not blocked by any open issueis_blocked()β real-time blocking check- JSONL format:
blocked_by(replaces legacydependencies)
pair init/list/show/create/update/close/deletepair searchβ full-text searchpair readyβ unblocked open issuespair exportβ force DBβJSONL re-exportpair importβ JSONL import with mergepair reorderβ reorder child positionpair migrateβ unidirectional .beads β .pair migrationpair comments add/delete,pair label add/remove,pair dep add/remove- JSON output mode (
--json)
- Unix socket (
/tmp/pair.sock) for CLIβApp instant notifications - Event batching with selective toasts
- Auto-refresh on push events
- Tauri 2 desktop app (macOS)
- Vue 3 + Nuxt 4 frontend with shadcn UI
- Dashboard with KPIs, priority/status charts
- Issue table with filters (status, type, priority, assignee, labels)
- Keyboard navigation, sidebar resize, dark/light theme
- Attachment system (filesystem-based)
- AGENTS.md auto-update on project open
- 107 backend tests (Rust)
- 215 frontend tests (Vitest)
- Integration test suite (
scripts/test-suite.py)
- Rebranded from Beads Task-Issue Tracker to PaiR
- CLI binary:
pair, data folder:.pair/, prefix:pair-xxxx - App identifier:
com.pair.app