Aperture
Diagnostic tui for Windows power users
Quick Navigation
Installation (standalone/portable)
Download and run the latest release (1 MB executable)
Thatβs all! Run as admin to access all features.
If you want to run the aperture command from any terminal:
Just move Aperture.exe to a folder that is already in your userβs PATH
Then restart your terminal and run aperture from anywhere!
Installation (package managers)
WinGet
winget install aperture
Scoop
Scoop requires 100 GitHub stars or 2000 downloads to be in their Extras bucket, for now please use this installation command:
scoop install https://raw.githubusercontent.com/stylebending/scoop-bucket/refs/heads/main/bucket/Aperture.json
Chocolatey
Coming very soon!
Installing with these package managers automatically adds Aperture to your path. After running one of those installation commands, just close and re-open your terminal and youβll immediately be able to run aperture from any terminal.
Usage
aperture
Screenshots
Locker Tab - Process Management
ββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββ
β Aperture [Locker] [Controller] [Nexus] β Keys β
ββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€
β β Find and kill processes holding file β Navigation β
β locks β j/k Move β
β β β/β Move β
β ββββββββββββββββββββββββββββββββββββββ β C-d/u Page β
β β Processes (Locker) [CPUβΌ] [45/230] β β Tab SwitchTab β
β β β β β
β β 1234 chrome.exe 15.2% 245.6MB β β Actions β
β β 5678 firefox.exe 8.1% 189.2MB β β / Search β
β β 9012 notepad.exe 0.5% 4.2MB β β s/S Sort β
β β 3456 code.exe 3.2% 56.8MB β β f FindLocks β
β β 7890 explorer.exe 2.1% 78.3MB β β K Kill β
β β ... β β r Refresh β
β ββββββββββββββββββββββββββββββββββββββ β Esc ClearFilt β
β Sort: CPU βΌ β β
ββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββ
Controller Tab - Service Management
ββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββ
β ... [Controller] ... β Keys β
ββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€
β β Start, stop, and manage Windows β Navigation β
β services β j/k Move β
β β ... β
β ββββββββββββββββββββββββββββββββββββββ β β
β β Services (Controller) [Statusβ²] β β Actions β
β β β β / Search β
β β Windows Update Running ... β β s/S Sort β
β β Print Spooler Running ... β β Enter Toggle β
β β Bluetooth Service Stopped ... β β r Refresh β
β β ... β β Esc ClearFilt β
β ββββββββββββββββββββββββββββββββββββββ β β
β Sort: Status β² β β
ββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββ
File Lock Search Modal
ββββββββββββββββββββββββββββββββββββββββββ
β Find Locking Processes β
ββββββββββββββββββββββββββββββββββββββββββ€
β Path: C:\Users\Me\Documents\file.txt β
β β
β Locking processes: β
β β
β PID: 5678 notepad.exe β
β βΆ PID: 9012 chrome.exe β
β PID: 12345 excel.exe β
β β
β [/] Edit Path [Enter] Search β
β [j/k] Navigate [K] Kill [Esc] Close β
ββββββββββββββββββββββββββββββββββββββββββ
Note: Press / to enter input mode and type a file path. Enter a folder path to scan all files in that directory.
Quick Start Guide
Find Whatβs Locking a File
Canβt delete a file because itβs βin useβ? Aperture can find the culprit:
- Press
fto open the File Lock Search modal - Press
/to enter input mode - Type the full path to the file (e.g.,
C:\Users\You\file.txt) - Press
Enterto search - See which processes have the file locked
- Navigate with
j/kand pressKto kill the process (requires admin)
Tip: Enter a folder path to scan all files in that directory and find all locks.
Kill a Runaway Process
- Switch to Locker tab (press
Tabuntil you see βLockerβ) - Sort by CPU usage: Press
suntil title shows βCPUβ, thenSto toggle direction - Find the process using high CPU
- Press
Kto kill it (requires admin privileges)
Manage Services
- Switch to Controller tab
- Sort by Status: Press
suntil title shows βStatusβ - Find the service you want to control
- Press
Enterto toggle start/stop (requires admin)
Filter and Search
- Press
/to enter search mode - Type to filter the current list
- Press
Enterto apply the filter and exit search mode - Press
Escto clear the filter
Example workflow:
- In Locker tab, press
/ - Type βchromeβ - list filters to show only Chrome processes
- Navigate with
j/k - Press
Escto clear filter and see all processes again
Navigate Large Lists
j/korβ/β- Move one item at a timeCtrl+D- Page down (jump 10 items)Ctrl+U- Page up (jump 10 items)gg- Jump to first itemG- Jump to last itemTab/Shift+Tab- Switch between tabs
Sort Data
Each tab supports different sorting:
Locker (Processes):
- Press
sto cycle: Name β PID β CPU β Memory - Press
S(Shift+s) to toggle ascending/descending - Default: CPU descending (highest first)
Controller (Services):
- Press
sto cycle: Name β Status β Type - Press
Sto toggle order - Default: Status ascending (Running first)
Nexus (Connections):
- Press
sto cycle: State β PID β Protocol β Process - Press
Sto toggle order - Default: State ascending (ESTABLISHED first)
Keybindings
| Category | Key | Action | Context | Description |
|---|---|---|---|---|
| Navigation | Tab / Shift+Tab |
Switch tabs | Global | Move between Locker/Controller/Nexus |
| Β | j / k |
Navigate | Lists | Move down/up one item |
| Β | β / β |
Navigate | Lists | Alternative to j/k |
| Β | Ctrl+D |
Page down | Lists | Jump down 10 items |
| Β | Ctrl+U |
Page up | Lists | Jump up 10 items |
| Β | gg |
Jump to first | Lists | Jump to first item |
| Β | G |
Jump to last | Lists | Jump to last item |
| Actions | / |
Toggle search | Global | Enter/exit search mode |
| Β | Esc |
Clear/Cancel | Global | Clear filter, exit search, or close modal |
| Β | s |
Cycle sort | Global | Change sort key (Name, PID, Status, etc.) |
| Β | S (Shift+s) |
Toggle order | Global | Switch ascending/descending |
| Β | r |
Refresh | Global | Force refresh current tab |
| Β | f |
Find locks | Global | Open file lock search modal |
| Locker | K |
Kill process | Locker only | Kill selected process (admin) |
| Controller | Enter |
Toggle service | Controller only | Start/stop selected service (admin) |
| File Lock Modal | / |
Edit path | Modal | Enter input mode to type path |
| Β | Enter |
Search | Modal | Execute search |
| Β | j/k |
Navigate | Modal | Move up/down results |
| Β | K |
Kill | Modal | Kill selected locking process |
| System | q |
Quit | Global | Exit application |
Search Mode Keybindings
When in search mode (/):
- Type characters to filter
Backspace- Delete last characterEnter- Apply filter and exit searchEsc- Cancel search
File Lock Search Modal
When file lock modal is open (f):
- Type file paths (one per line)
/- Enter input mode to edit path (any key including j/k can now be typed)Enter- Search for locking processesj/korβ/β- Navigate results (normal mode only)K- Kill selected process (admin)Esc- Close modal (or cancel input mode)
Directory Scanning:
- Enter a folder path to scan all files in that directory
- Shows βScanned X files - Found Y locksβ with the count of files checked
Configuration
Aperture currently uses sensible defaults optimized for real-time performance:
| Setting | Default | Description |
|---|---|---|
| Data refresh interval | 2 seconds | How often to poll for new data |
| Navigation debounce | 50ms | Delay after navigation before accepting updates |
| CPU metrics interval | 1 second | How often to update CPU/memory usage |
Note: Configurable polling intervals are on the roadmap. Currently, these values are optimized for smooth real-time performance without overwhelming the system.
Performance
Aperture is designed for real-time performance on Windows:
Smart Update System
- Change Detection: Uses data hashing to only update when data actually changes
- Navigation Debounce: 50ms delay after navigation prevents cursor jumping during active use
- Separate Concerns: Filter operations apply instantly; only navigation triggers debounce
- Cached Metrics: CPU and memory values are cached to prevent flashing during temporary data unavailability
Data Loading
- Preload All Tabs: Data for all tabs loads at startup, enabling instant tab switching
- Background Updates: All tabs refresh every 2 seconds in the background
- Initial Load Bypass: First data load happens immediately without debounce
Why Not WMI?
Aperture uses direct Win32 APIs instead of WMI for maximum performance:
- WMI queries can take 500ms-2s per call
- Win32 APIs respond in <50ms
- Essential for smooth TUI experience with 2-second refresh rates
Architecture
aperture/
βββ src/
β βββ main.rs # Entry point, event loop, keybindings
β βββ app.rs # Application state, tab management
β βββ ui/ # UI rendering
β β βββ mod.rs # Layout, sidebar, status bar
β β βββ locker.rs # Process tab UI with sorting
β β βββ controller.rs # Services tab UI with sorting
β β βββ nexus.rs # Network tab UI with sorting
β βββ sys/ # Windows API abstractions
β β βββ process.rs # Process enumeration, CPU/memory metrics
β β βββ service.rs # SCM/Service control
β β βββ network.rs # IP Helper/TCP-UDP connections
β β βββ handle.rs # File lock detection (Restart Manager)
β βββ state/ # Per-tab state with sorting
β βββ locker.rs # Process state, PID tracking
β βββ controller.rs # Service state, name tracking
β βββ nexus.rs # Connection state, key tracking
βββ Cargo.toml
βββ README.md
Win32 APIs Used
| Feature | API |
|---|---|
| Process Enumeration | EnumProcesses, QueryFullProcessImageNameW |
| Process Metrics | GetProcessTimes, GetProcessMemoryInfo |
| Elevation Check | OpenProcessToken, GetTokenInformation |
| Service Management | OpenSCManagerW, EnumServicesStatusExW, ControlService |
| Network Connections | GetExtendedTcpTable, GetExtendedUdpTable |
| File Lock Detection | RmRegisterResources, RmGetList (Restart Manager) |
Roadmap
Completed β
- Process management with CPU/memory metrics
- Handle search using Restart Manager API
- Service management (start/stop)
- Network connection monitoring
- Smart sorting and filtering
- Persistent sidebar with keybindings
- Real-time navigation debounce (50ms)
- Change detection and smart updates
- Cached metrics to prevent flashing
In Progress / TODO
- Real-time service status notifications via
NotifyServiceStatusChange- Currently polls every 2s; would show instant service state changes
- Process tree view (parent/child relationships)
- Show hierarchical process relationships
- IPv6 support for network connections
- Currently only shows IPv4 connections
- Configurable polling intervals
- Allow users to change 2s refresh rate
- Export data to JSON/CSV
- Save process/service/connection lists
- Process details view
- Show additional process info (command line, environment, etc.)
- Dark/light theme support
- Currently uses terminal default colors
Aperture bridges the gap between the Linux btop/lsof experience and Windowsβ deep diagnostic capabilities (Processes, Services, and Network). Unlike cross-platform tools, Aperture focuses on Windows-specific pain points: file locks, service management, and process-to-socket mapping.
Features
The Locker (Process Management)
- View all running processes with PID, name, path, CPU%, and memory usage
- Real-time CPU and memory metrics with intelligent caching
- Sort by: Name, PID, CPU usage, Memory usage
- Filter processes by name, path, or PID
- Kill processes (requires admin - press
K) - Find file locks - Identify which processes are locking specific files (press
f)
The Controller (Service Management)
- List all Windows services with status, start type, and process ID
- Start/Stop services (requires admin - press
Enter) - Sort by: Name, Status, Service Type
- Filter services by name or display name
The Nexus (Network Monitor)
- Real-time TCP/UDP connection listing
- Map connections to process PIDs and names
- View connection states (ESTABLISHED, LISTENING, etc.)
- Sort by: Connection State, PID, Protocol, Process Name
- Filter connections by address, port, PID, or process name
UI Features
- Vim Motions keybindings for easy navigation
- Permanent sidebar with context-aware keybindings
- Smart data caching - All tabs preload for instant switching
- 50ms navigation debounce - Smooth cursor movement without jitter
- Change detection - Only updates when data actually changes
- Cached metrics - CPU/memory values persist during temporary data unavailability
License
MIT