Download and run the latest release (1 MB executable)
That's all! Run as admin to access all features.
Just move Aperture.exe to a folder that is already in your user's PATH
Then restart your terminal and run aperture from anywhere!
winget install stylebending.aperture
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
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.
apertureLocker 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.
- 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
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.
- 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)
- 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)
See hierarchical process relationships (parent/child):
- Switch to Locker tab
- Press
tto toggle Tree View - Navigate the tree with
j/k - Press
Spaceto expand/collapse nodes (> / v indicators) - Search/filter still works in tree view - shows matching processes and their ancestor chain
See detailed information about a process:
- Switch to Locker tab
- Navigate to a process with
j/k - Press
dto open Process Details modal - View loaded modules, parent PID, CPU, and memory usage
- Press
Kin the modal to kill the process (requires admin) - Press
Escorqto close
View, add, edit, and delete environment variables across scopes:
- Switch to Env tab (press
Tabuntil you see "Env") - See System (cyan), User (green), and Process (yellow) variables
- Sort by: Name or Scope — press
sto cycle,Sto 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
ato 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
ato persist one
Export all data to JSON or CSV format:
- Press
eto open the Export modal - Press
jto export as JSON - Press
cto export as CSV - Files are saved to your Documents folder with timestamps
- Press
Escorqto cancel
Export includes: All processes, services, and network connections from all tabs
- 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
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
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)
Env (Environment Variables):
- Press
sto cycle: Name → Scope - Press
Sto toggle order - Default: Name ascending
| 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 |
When in search mode (/):
- Type characters to filter
Backspace- Delete last characterEnter- Apply filter and exit searchEsc- Cancel search
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
When export modal is open (e):
j- Export to JSON formatc- Export to CSV formatEscorq- Close modal without exporting
Export Location: Files are saved to your Documents folder with timestamps (e.g., aperture_export_1234567890.json)
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)Escorq- Close 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
Spaceto toggle User/System Tab/Shift+Tab- Cycle between Name, Value, Scope fieldsEnter- Save to registry and broadcast changesEsc- Cancel and discard changes- System scope changes require admin elevation
- Process-scoped entries cannot be edited (read-only)
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.
Aperture is designed for real-time performance on Windows:
- 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
- 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
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
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
| 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 |
- Process management with CPU/memory metrics
- Handle search using Restart Manager API
- Service management (start/stop)
- Network connection monitoring (IPv4 + IPv6)
- Smart sorting and filtering
- Persistent sidebar with keybindings
- Real-time navigation debounce (50ms)
- Change detection and smart updates
- Cached metrics to prevent flashing
- Process tree view - Hierarchical parent/child relationships with expand/collapse
- Process details view - Show loaded modules, parent PID, and process info
- Export to JSON/CSV - Export all tab data with timestamps
- IPv6 support - Full IPv6 TCP/UDP connection monitoring
- Environment variables viewer - Browse System, User, and Process env vars with filtering
- Environment variables management - Add, edit, and delete env vars with registry persistence
- Making as much configurable as possible, including colors/themes
- Real-time service status notifications via
NotifyServiceStatusChange- Currently polls every 2s; would show instant service state changes
- Configurable polling intervals
- Allow users to change 2s refresh rate
- 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)
- 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
- 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
- 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
ato 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_SETTINGCHANGEso running apps pick up changes
- 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)
MIT
