Aperture
Diagnostic tui for Windows power users

Quick Navigation

Installation (standalone/portable)
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 stylebending.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 (may be behind in version)
choco install aperture
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] [Env] β Keys β
ββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€
β β Find and kill processes holding file locks β Navigation β
β β 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 βΌ CPU: 45.2% Mem: 4.2/31.9GB β β
ββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββ
Controller Tab - Service Management
ββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββ
β ... [Controller] ... [Nexus] [Env] β Keys β
ββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€
β β Start, stop, and manage Windows services β Navigation β
β β j/k Move β
β β β/β 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 β² CPU: 45.2% Mem: 4.2/31.9GB β β
ββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββ
Env Tab - Environment Variables
ββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββ
β ... [Nexus] [Env] β Keys β
ββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€
β β View user, system, and process environment β Navigation β
β variables β j/k Move β
β β β/β Move β
β ββββββββββββββββββββββββββββββββββββββββ β ... β
β β Environment [74/74 | Name β²] β β Actions β
β β β β / Search β
β β ALLUSERSPROFILE C:\ProgramData Sys β β s/S Sort β
β β APPDATA C:\Users\Me\... Usr β β a Add β
β β JAVA_HOME C:\Java\... Usr β β E Edit β
β β PATH C:\Windows\... Sys β β D Delete β
β β MY_VAR some value Usr β β r Refresh β
β β TEMP C:\Temp Sys β β Esc ClearFilt β
β β ZENDATA_HOME C:\zend\... Prc β β β
β ββββββββββββββββββββββββββββββββββββββββ β Quit β
β Sort: Name β² CPU: 45.2% Mem: 4.2/31.9GB β q Exit β
ββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββ
Scope colors: System=Cyan, User=Green, Process=Yellow. Process-only entries shown when not backed by registry.
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.
Acknowledgements
This project wouldn't be possible without:
- Rust - Systems programming language making Windows API access safe and fast
- ratatui - The beautiful terminal user interface framework powering Aperture
- crossterm - Cross-platform terminal manipulation and event handling
- tokio - The asynchronous runtime enabling responsive UI updates
- windows-rs - Microsoft's official Windows API bindings for Rust
- Vim / Neovim - For the motion-based navigation philosophy
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
f to 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
Enter to search
- See which processes have the file locked
- Navigate with
j/k and press K to 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
Tab until you see "Locker")
- Sort by CPU usage: Press
s until title shows "CPU", then S to toggle direction
- Find the process using high CPU
- Press
K to kill it (requires admin privileges)
Manage Services
- Switch to Controller tab
- Sort by Status: Press
s until title shows "Status"
- Find the service you want to control
- Press
Enter to toggle start/stop (requires admin)
View Process Tree
See hierarchical process relationships (parent/child):
- Switch to Locker tab
- Press
t to toggle Tree View
- Navigate the tree with
j/k
- Press
Space to expand/collapse nodes (> / v indicators)
- Search/filter still works in tree view - shows matching processes and their ancestor chain
View Process Details
See detailed information about a process:
- Switch to Locker tab
- Navigate to a process with
j/k
- Press
d to open Process Details modal
- View loaded modules, parent PID, CPU, and memory usage
- Press
K in the modal to kill the process (requires admin)
- Press
Esc or q to close
Manage Environment Variables
View, add, edit, and delete environment variables across scopes:
- Switch to Env tab (press
Tab until you see "Env")
- See System (cyan), User (green), and Process (yellow) variables
- Sort by: Name or Scope β press
s to cycle, S to toggle order
- Filter with
/ β search by name, value, or scope
- Process-only variables (set by current shell, no registry backing) shown in yellow
- Registry-backed variables only show once (Process copy hidden when redundant)
- Add a new variable: press
a to open the edit modal with empty fields
- Edit a variable: navigate to an entry and press
E
- Delete a variable: navigate to an entry and press
D
- System scope operations require admin elevation
- Process-only entries are session-only β press
a to persist one
Export Data
Export all data to JSON or CSV format:
- Press
e to open the Export modal
- Press
j to export as JSON
- Press
c to export as CSV
- Files are saved to your Documents folder with timestamps
- Press
Esc or q to cancel
Export includes: All processes, services, and network connections from all tabs
Filter and Search
- Press
/ to enter search mode
- Type to filter the current list
- Press
Enter to apply the filter and exit search mode
- Press
Esc to clear the filter
Example workflow:
- In Locker tab, press
/
- Type "chrome" - list filters to show only Chrome processes
- Navigate with
j/k
- Press
Esc to clear filter and see all processes again
Navigate Large Lists
j/k or β/β - Move one item at a time
Ctrl+D - Page down (jump 10 items)
Ctrl+U - Page up (jump 10 items)
gg - Jump to first item
G - Jump to last item
Tab/Shift+Tab - Switch between tabs
Sort Data
Each tab supports different sorting:
Locker (Processes):
- Press
s to cycle: Name β PID β CPU β Memory
- Press
S (Shift+s) to toggle ascending/descending
- Default: CPU descending (highest first)
Controller (Services):
- Press
s to cycle: Name β Status β Type
- Press
S to toggle order
- Default: Status ascending (Running first)
Nexus (Connections):
- Press
s to cycle: State β PID β Protocol β Process
- Press
S to toggle order
- Default: State ascending (ESTABLISHED first)
Env (Environment Variables):
- Press
s to cycle: Name β Scope
- Press
S to toggle order
- Default: Name ascending
Keybindings
| Category | Key | Action | Context | Description |
|---|
| Navigation | Tab / Shift+Tab | Switch tabs | Global | Move between Locker/Controller/Nexus/Env |
| 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 |
| e | Export | Global | Open export format modal |
| Locker | t | Tree view | Locker only | Toggle hierarchical process tree view |
| Space | Expand/Collapse | Locker only | Expand/collapse tree node (tree mode only) |
| d | Details | Locker only | Show process details modal |
| K | Kill process | Locker only | Kill selected process (admin) |
| Controller | Enter | Toggle service | Controller only | Start/stop selected service (admin) |
| Env | a | Add var | Env only | Add new environment variable (User/System) |
| E | Edit var | Env only | Edit selected environment variable |
| D | Delete var | Env only | Delete selected environment variable |
| Env Edit Modal | Tab/Shift+Tab | Cycle fields | Modal | Switch between Name, Value, Scope fields |
| Space | Toggle scope | Modal | Switch between User and System scope |
| Enter | Save | Modal | Save changes to registry (green status) |
| Esc | Cancel | Modal | Discard changes |
| 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 character
Enter - Apply filter and exit search
Esc - 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 processes
j/k or β/β - 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
Export Modal
When export modal is open (e):
j - Export to JSON format
c - Export to CSV format
Esc or q - Close modal without exporting
Export Location: Files are saved to your Documents folder with timestamps (e.g., aperture_export_1234567890.json)
Process Details Modal
When process details modal is open (d in Locker tab):
- View process information: PID, name, parent PID, CPU%, memory
- View loaded modules (first 10, with count of additional modules)
K - Kill the process (requires admin)
Esc or q - Close modal
Env Var Edit Modal
When env var add/edit modal is open (a or E in Env tab):
- Name field: type the variable name
- Value field: type the variable value
- Scope field: press
Space to toggle User/System
Tab/Shift+Tab - Cycle between Name, Value, Scope fields
Enter - Save to registry and broadcast changes
Esc - Cancel and discard changes
- System scope changes require admin elevation
- Process-scoped entries cannot be edited (read-only)
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
β β βββ env.rs # Environment variables tab UI
β βββ sys/ # Windows API abstractions
β β βββ process.rs # Process enumeration, CPU/memory metrics
β β βββ service.rs # SCM/Service control
β β βββ network.rs # IP Helper/TCP-UDP connections
β β βββ env.rs # Registry and process environment variables
β β βββ 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
β βββ env.rs # Environment variable state, filter, sort
βββ Cargo.toml
βββ README.md
Win32 APIs Used
| Feature | API |
|---|
| Process Enumeration | EnumProcesses, QueryFullProcessImageNameW, CreateToolhelp32Snapshot, Process32FirstW |
| Process Tree/Parent PID | CreateToolhelp32Snapshot, Process32FirstW/NextW |
| Process Metrics | GetProcessTimes, GetProcessMemoryInfo |
| Process Details | EnumProcessModules, GetModuleBaseNameW, GetModuleFileNameExW |
| Elevation Check | OpenProcessToken, GetTokenInformation |
| Service Management | OpenSCManagerW, EnumServicesStatusExW, ControlService |
| Network Connections (IPv4) | GetExtendedTcpTable, GetExtendedUdpTable |
| Network Connections (IPv6) | GetExtendedTcpTable (AF_INET6), GetExtendedUdpTable (AF_INET6) |
| File Lock Detection | RmRegisterResources, RmGetList (Restart Manager) |
| Environment Variables (Read) | RegOpenKeyExW, RegEnumValueW, RegQueryInfoKeyW, RegCloseKey |
| Environment Variables (Write) | RegSetValueExW, RegDeleteValueW, SendMessageTimeoutW |
Roadmap
Completed β
In Progress / TODO
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)
- Process tree view - Hierarchical parent/child relationships (press
t)
- Process details - View loaded modules and detailed info (press
d)
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 (IPv4 and IPv6)
- 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
The Env (Environment Variables)
- View all environment variables from System, User, and Process scopes
- Scope coloring: System (cyan), User (green), Process (yellow)
- Process-only variables (set by current shell, not in registry) shown in yellow
- Registry-backed variables (System/User) hide their redundant Process copy β one entry per name
- Add, Edit, and Delete User and System-scoped variables (press
a, E, D)
- Process-only entries are read-only β press
a to persist one to the registry
- System scope operations require admin elevation
- Sort by: Name, Scope
- Filter by name, value, or scope
- Registry writes broadcast
WM_SETTINGCHANGE so running apps pick up changes
UI Features
- Vim Motions keybindings for easy navigation
- Four tabs - Locker (processes), Controller (services), Nexus (network), Env (environment)
- Permanent sidebar with context-aware keybindings
- System metrics in the status bar - Total CPU and memory usage visible from any tab
- 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
- Export data - Save all tab data to JSON or CSV (press
e)
License
MIT