# quantdale/tabdock architecture

> Architecture diagram of the GitHub repository quantdale/tabdock, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-10-01). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/quantdale/tabdock
- Repository: https://github.com/quantdale/tabdock

## Overview

TabDock is a Windows window-tab-grouping application. Users create or select a workspace, choose running windows in a capture picker, and TabDock shepherds them into a container where tabs can be switched, reordered, split, or released. Group state and tab metadata persist across launches; captured HWNDs themselves are not automatically restored. The README also documents command-line and in-process support diagnostics, plus supervised pending recovery. The graph follows documented workflows and indexed source references; unsampled implementation details are represented only where documented.

Main entry points: [`Services/GroupManager.cs`](https://github.com/quantdale/tabdock/blob/main/Services/GroupManager.cs) (Group manager), [`Views/ContainerWindow.xaml.cs`](https://github.com/quantdale/tabdock/blob/main/Views/ContainerWindow.xaml.cs) (Workspace container), [`ViewModels/GroupViewModel.cs`](https://github.com/quantdale/tabdock/blob/main/ViewModels/GroupViewModel.cs) (Tab presentation), [`Services/DiagnosticCommandLine.cs`](https://github.com/quantdale/tabdock/blob/main/Services/DiagnosticCommandLine.cs) (Diagnostic commands)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["Workspace experience"]
  node_mainwindow["Launcher window<br/>[MainWindow.xaml.cs]"]
  node_mainvm["Workspace launcher<br/>[MainViewModel.cs]"]
  node_picker["Capture picker"]
  node_container["Workspace container"]
  node_groupvm["Tab presentation<br/>[GroupViewModel.cs]"]
  node_tabvm["Tab item<br/>[TabViewModel.cs]"]
  node_splitview["Split presentation"]
  node_splitcontroller["Split controller"]
end

subgraph group_windowing["Window capture"]
  node_captured["Captured window<br/>[CapturedWindow.cs]"]
  node_shepherd["Window shepherd"]
end

subgraph group_state["Session state"]
  node_groupmanager["Group manager<br/>[GroupManager.cs]"]
  node_groupmodel["Workspace group<br/>[Group.cs]"]
  node_persistence[("State persistence")]
  node_persisted["Persisted state<br/>[PersistedState.cs]"]
end

subgraph group_support["Support and recovery"]
  node_diagnostics["Diagnostic commands"]
  node_environment["Environment snapshot"]
  node_diagnosticreport["Support report"]
  node_pending["Pending recovery"]
  node_telemetry["Runtime telemetry"]
  node_logging["Logging<br/>[LoggingService.cs]"]
end

subgraph group_platform["Windows integration"]
  node_native["Win32 interop<br/>[NativeMethods.cs]"]
  node_winevents["Window event monitor<br/>[WinEventMonitor.cs]"]
  node_hotkeys["Global hotkeys<br/>[HotkeyService.cs]"]
end

node_user(("User"))
node_windows["Running apps"]
node_diagnosticuser(("Support operator"))

node_user -->|"launches"| node_mainwindow
node_mainwindow -->|"uses"| node_mainvm
node_user -->|"selects windows"| node_picker
node_windows -->|"offers candidates"| node_picker
node_mainvm -->|"manages groups"| node_groupmanager
node_picker -->|"requests grouping"| node_groupmanager
node_groupmanager -->|"tracks groups"| node_groupmodel
node_groupmanager -->|"captures and releases"| node_shepherd
node_shepherd -->|"creates window state"| node_captured
node_shepherd -->|"calls Win32"| node_native
node_groupmanager -->|"saves state"| node_persistence
node_persistence -->|"serializes groups"| node_groupmodel
node_persistence -->|"reads and writes"| node_persisted
node_container -->|"coordinates groups"| node_groupmanager
node_container -->|"presents workspace"| node_groupvm
node_groupvm -->|"updates tabs"| node_groupmanager
node_groupvm -->|"projects tabs"| node_tabvm
node_groupvm -->|"projects split pair"| node_splitview
node_container -->|"controls split"| node_splitcontroller
node_splitcontroller -->|"operates on guests"| node_captured
node_user -->|"switches and splits"| node_container
node_groupmanager -.->|"requests monitoring"| node_winevents
node_groupmanager -.->|"supports navigation"| node_hotkeys
node_diagnosticuser -->|"runs commands"| node_diagnostics
node_diagnostics -->|"collects environment"| node_environment
node_diagnostics -.->|"produces reports"| node_diagnosticreport
node_diagnosticuser -->|"requests live bundle"| node_container
node_diagnostics -->|"runs recovery"| node_pending
node_pending -->|"checks window identity"| node_native
node_container -.->|"records events"| node_telemetry
node_groupmanager -->|"logs operations"| node_logging
node_environment -->|"summarizes journal health"| node_pending

click node_mainwindow "https://github.com/quantdale/tabdock/blob/main/Views/MainWindow.xaml.cs"
click node_mainvm "https://github.com/quantdale/tabdock/blob/main/ViewModels/MainViewModel.cs"
click node_picker "https://github.com/quantdale/tabdock/blob/main/ViewModels/CapturePickerViewModel.cs"
click node_container "https://github.com/quantdale/tabdock/blob/main/Views/ContainerWindow.xaml.cs"
click node_groupvm "https://github.com/quantdale/tabdock/blob/main/ViewModels/GroupViewModel.cs"
click node_tabvm "https://github.com/quantdale/tabdock/blob/main/ViewModels/TabViewModel.cs"
click node_splitview "https://github.com/quantdale/tabdock/blob/main/ViewModels/SplitCompositeViewModel.cs"
click node_splitcontroller "https://github.com/quantdale/tabdock/blob/main/Services/SplitPresentationController.cs"
click node_groupmanager "https://github.com/quantdale/tabdock/blob/main/Services/GroupManager.cs"
click node_groupmodel "https://github.com/quantdale/tabdock/blob/main/Models/Group.cs"
click node_captured "https://github.com/quantdale/tabdock/blob/main/Models/CapturedWindow.cs"
click node_shepherd "https://github.com/quantdale/tabdock/blob/main/Services/WindowShepherdService.cs"
click node_native "https://github.com/quantdale/tabdock/blob/main/NativeMethods.cs"
click node_winevents "https://github.com/quantdale/tabdock/blob/main/Services/WinEventMonitor.cs"
click node_hotkeys "https://github.com/quantdale/tabdock/blob/main/Services/HotkeyService.cs"
click node_persistence "https://github.com/quantdale/tabdock/blob/main/Services/PersistenceService.cs"
click node_persisted "https://github.com/quantdale/tabdock/blob/main/Models/PersistedState.cs"
click node_diagnostics "https://github.com/quantdale/tabdock/blob/main/Services/DiagnosticCommandLine.cs"
click node_environment "https://github.com/quantdale/tabdock/blob/main/Services/DiagnosticEnvironmentService.cs"
click node_diagnosticreport "https://github.com/quantdale/tabdock/blob/main/Services/DiagnosticReportService.cs"
click node_pending "https://github.com/quantdale/tabdock/blob/main/Services/PendingRecoveryService.cs"
click node_telemetry "https://github.com/quantdale/tabdock/blob/main/Services/RuntimeTelemetry.cs"
click node_logging "https://github.com/quantdale/tabdock/blob/main/Services/LoggingService.cs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_mainwindow,node_mainvm,node_picker,node_container,node_groupvm,node_tabvm,node_splitview,node_splitcontroller,node_user toneBlue
class node_captured,node_shepherd toneAmber
class node_groupmanager,node_groupmodel,node_persistence,node_persisted toneMint
class node_diagnostics,node_environment,node_diagnosticreport,node_pending,node_telemetry,node_logging toneRose
class node_native,node_winevents,node_hotkeys,node_windows,node_diagnosticuser toneIndigo
```

## Components

### Workspace experience

- [Launcher window](https://github.com/quantdale/tabdock/blob/main/Views/MainWindow.xaml.cs): `Views/MainWindow.xaml.cs`
- [Workspace launcher](https://github.com/quantdale/tabdock/blob/main/ViewModels/MainViewModel.cs): `ViewModels/MainViewModel.cs`
- [Capture picker](https://github.com/quantdale/tabdock/blob/main/ViewModels/CapturePickerViewModel.cs): `ViewModels/CapturePickerViewModel.cs`
- [Workspace container](https://github.com/quantdale/tabdock/blob/main/Views/ContainerWindow.xaml.cs): `Views/ContainerWindow.xaml.cs`
- [Tab presentation](https://github.com/quantdale/tabdock/blob/main/ViewModels/GroupViewModel.cs): `ViewModels/GroupViewModel.cs`
- [Tab item](https://github.com/quantdale/tabdock/blob/main/ViewModels/TabViewModel.cs): `ViewModels/TabViewModel.cs`
- [Split presentation](https://github.com/quantdale/tabdock/blob/main/ViewModels/SplitCompositeViewModel.cs): `ViewModels/SplitCompositeViewModel.cs`
- [Split controller](https://github.com/quantdale/tabdock/blob/main/Services/SplitPresentationController.cs): `Services/SplitPresentationController.cs`

### Window capture

- [Captured window](https://github.com/quantdale/tabdock/blob/main/Models/CapturedWindow.cs): `Models/CapturedWindow.cs`
- [Window shepherd](https://github.com/quantdale/tabdock/blob/main/Services/WindowShepherdService.cs): `Services/WindowShepherdService.cs`

### Session state

- [Group manager](https://github.com/quantdale/tabdock/blob/main/Services/GroupManager.cs): `Services/GroupManager.cs`
- [Workspace group](https://github.com/quantdale/tabdock/blob/main/Models/Group.cs): `Models/Group.cs`
- [State persistence](https://github.com/quantdale/tabdock/blob/main/Services/PersistenceService.cs): `Services/PersistenceService.cs`
- [Persisted state](https://github.com/quantdale/tabdock/blob/main/Models/PersistedState.cs): `Models/PersistedState.cs`

### Support and recovery

- [Diagnostic commands](https://github.com/quantdale/tabdock/blob/main/Services/DiagnosticCommandLine.cs): `Services/DiagnosticCommandLine.cs`
- [Environment snapshot](https://github.com/quantdale/tabdock/blob/main/Services/DiagnosticEnvironmentService.cs): `Services/DiagnosticEnvironmentService.cs`
- [Support report](https://github.com/quantdale/tabdock/blob/main/Services/DiagnosticReportService.cs): `Services/DiagnosticReportService.cs`
- [Pending recovery](https://github.com/quantdale/tabdock/blob/main/Services/PendingRecoveryService.cs): `Services/PendingRecoveryService.cs`
- [Runtime telemetry](https://github.com/quantdale/tabdock/blob/main/Services/RuntimeTelemetry.cs): `Services/RuntimeTelemetry.cs`
- [Logging](https://github.com/quantdale/tabdock/blob/main/Services/LoggingService.cs): `Services/LoggingService.cs`

### Windows integration

- [Win32 interop](https://github.com/quantdale/tabdock/blob/main/NativeMethods.cs): `NativeMethods.cs`
- [Window event monitor](https://github.com/quantdale/tabdock/blob/main/Services/WinEventMonitor.cs): `Services/WinEventMonitor.cs`
- [Global hotkeys](https://github.com/quantdale/tabdock/blob/main/Services/HotkeyService.cs): `Services/HotkeyService.cs`

### Other components

- **User**
- **Running apps**
- **Support operator**

## Connections

- User → Launcher window: launches (evidence: `README.md`)
- Launcher window → Workspace launcher: uses (evidence: `Views/MainWindow.xaml.cs`)
- User → Capture picker: selects windows (evidence: `README.md`)
- Running apps → Capture picker: offers candidates (evidence: `README.md`)
- Workspace launcher → Group manager: manages groups (evidence: `ViewModels/MainViewModel.cs`)
- Capture picker → Group manager: requests grouping (evidence: `ViewModels/CapturePickerViewModel.cs`)
- Group manager → Workspace group: tracks groups (evidence: `Services/GroupManager.cs`)
- Group manager → Window shepherd: captures and releases (evidence: `Services/GroupManager.cs`)
- Window shepherd → Captured window: creates window state (evidence: `Services/WindowShepherdService.cs`)
- Window shepherd → Win32 interop: calls Win32 (evidence: `Services/WindowShepherdService.cs`)
- Group manager → State persistence: saves state (evidence: `Services/GroupManager.cs`)
- State persistence → Workspace group: serializes groups (evidence: `Services/PersistenceService.cs`)
- State persistence → Persisted state: reads and writes (evidence: `Services/PersistenceService.cs`)
- Workspace container → Group manager: coordinates groups (evidence: `Views/ContainerWindow.xaml.cs`)
- Workspace container → Tab presentation: presents workspace (evidence: `Views/ContainerWindow.xaml.cs`)
- Tab presentation → Group manager: updates tabs (evidence: `ViewModels/GroupViewModel.cs`)
- Tab presentation → Tab item: projects tabs (evidence: `ViewModels/GroupViewModel.cs`)
- Tab presentation → Split presentation: projects split pair (evidence: `ViewModels/GroupViewModel.cs`)
- Workspace container → Split controller: controls split (evidence: `Views/ContainerWindow.xaml.cs`)
- Split controller → Captured window: operates on guests (evidence: `Services/SplitPresentationController.cs`)
- User → Workspace container: switches and splits (evidence: `README.md`)
- Group manager → Window event monitor: requests monitoring
- Group manager → Global hotkeys: supports navigation
- Support operator → Diagnostic commands: runs commands (evidence: `README.md`)
- Diagnostic commands → Environment snapshot: collects environment (evidence: `Services/DiagnosticEnvironmentService.cs`)
- Diagnostic commands → Support report: produces reports
- Support operator → Workspace container: requests live bundle (evidence: `README.md`)
- Diagnostic commands → Pending recovery: runs recovery
- Pending recovery → Win32 interop: checks window identity (evidence: `Services/PendingRecoveryService.cs`)
- Workspace container → Runtime telemetry: records events (evidence: `Views/ContainerWindow.xaml.cs`)
- Group manager → Logging: logs operations (evidence: `Services/GroupManager.cs`)
- Environment snapshot → Pending recovery: summarizes journal health (evidence: `Services/DiagnosticEnvironmentService.cs`)
