Native C# desktop aim trainer with:
- a low-latency
Raylib-csgameplay shell - a testable core simulation for scoring, spawning, and session lifecycle
- a plugin-style gamemode catalog with built-in and external mode discovery
- built-in training presets for every mode
- local JSON session history for improvement tracking
- richer per-hit telemetry for cursor travel, path efficiency, health, and score flow
- persisted shell state for live settings, preset selection, and display profile
- an AimLabs-style top-nav and control hub for play, modes, presets, run setup, display, and analytics
- branded app/window icons and a versioned Windows installer flow
- in-app reaction graph and recent-session trend panel
- OS: Windows (x64)
- .NET SDK: 10.x (
global.jsonpins to10.0.201,rollForward: latestPatch)
All modes ship as part of the built-in VRT Built-In Modes plugin.
Pressure-driven reactive aim on a free-spawn sheet:
- touch the target to start
- pressure drains health over time
- each hit records elapsed time and reaction time
- score is cheese-corrected by the configured threshold
- max-eat analytics are computed from rolling 5-second windows
- the sheet targets a
1200pxarena and auto-fits to the active display mode - spawns enforce a minimum distance from the last target by default
Closer reactive spawns with a 30-second fixed-time round for fast VRT cleanup — same BallSheet Classic mechanics, tuned for pace.
Fixed-time grid drills where targets appear only on cell centres. Three variants ship out of the box:
| Mode | Grid | Live targets | Default round |
|---|---|---|---|
3x3 Quick |
3 × 3 | 1 | 30 s |
5x5 Quick |
5 × 5 | 1 | 30 s |
5x5 Triple |
5 × 5 | 3 | 45 s |
Each mode ships with a set of named presets accessible from the Presets page.
BallSheet Classic
| Preset | Focus |
|---|---|
| BallSheet Classic Default | Balanced baseline |
| VRT Reactive Wide | Wide-sheet reactive reps with more spread and tempo |
| Micro Corrections | Smaller targets, tighter punishment for micro-adjustments |
| Smoothness Lanes | Larger travel lanes, lower pressure for full-sheet tracking |
| Endurance Builder | Longer reactive runs with more health |
VRT Speed
| Preset | Focus |
|---|---|
| VRT Speed Default | Balanced baseline |
| Close Burst | Faster short-range spam for cleanup speed |
| Micro Rush | Smaller targets, higher pace for close-quarters corrections |
| Stable 30 | Softer punishment for repeatable 30-second reps |
3x3 Quick
| Preset | Focus |
|---|---|
| 3x3 Quick Default | Balanced baseline |
| Snap Lines | Bigger targets, shorter rounds for raw lane-switch speed |
| Control Hold | Precise confirmations with a calmer tempo |
5x5 Quick
| Preset | Focus |
|---|---|
| 5x5 Quick Default | Balanced baseline |
| Precision Ladder | Smaller balls, sharper threshold for clean precision reps |
| Tempo Builder | Larger targets with more score throughput for pace building |
5x5 Triple
| Preset | Focus |
|---|---|
| 5x5 Triple Default | Balanced baseline |
| Selective Chaos | Higher pressure triple-target work for faster target triage |
| Endurance Grid | Longer blocks with larger targets to sustain accuracy |
| Key | Action |
|---|---|
TAB |
Cycle the control-hub pages |
F1 |
Jump straight to Analytics |
R |
Reset the live controller to pregame |
E |
Finish the current run and show results |
F11 |
Toggle between borderless fullscreen and the default 1080p window |
Esc |
Open a quit warning instead of closing instantly |
Play— surfaces local benchmarks and reset/finish controls for the active runModes— switch between built-in and external plugin-backed gamemodes; change takes effect immediatelyPresets— apply a named preset for the active mode; change takes effect immediatelyRun Setup— tune cursor size, score per hit, pressure, starting health, round time, and cheese threshold; slider changes apply on releaseMouse— choose the aim response (Linear or Projected), tune sensitivity orcm/360+DPI+FOV+ aspect ratio, per-axis scaling, and vertical inversion; applies live without touching presetsSheet— tune sheet width, sheet height, ball size, ball spread, edge padding, and top/bottom safe padding; slider changes apply on releaseDisplay— switch between1080p,1440p, and borderless fullscreenAnalytics— view the reaction trend and recent saved sessions
Aiming reads raw mouse input on Windows (via the Raw Input API), so it is unaffected by the "Enhance pointer precision" pointer-acceleration setting: a fast flick always covers proportionally more distance than a slow one, never disproportionately more. During a run the OS cursor is locked and hidden; outside a run it is free so the menus stay usable.
Two aim response modes are selectable on the Mouse page:
- Linear — a raw 1:1 mapping. A fixed number of mouse counts always moves the crosshair the same distance, anywhere on the sheet, independent of sheet and display size.
- Projected — simulates an FPS camera: raw counts drive a constant angular yaw/pitch that is projected onto the sheet, so the crosshair speeds up toward the edges exactly like a real game. Tuned with
cm/360+ mouseDPI(to match your game's hand speed), horizontalFOV, and aspect ratio. A monitor-distance coefficient field is stored for future zoom/scope scenarios.
The desktop app version is defined once in:
.\Version.props
The executable, publish artifacts, and installer package all read from that version.
dotnet build .\VrtAimTrainer.slnx
dotnet run --project .\src\VrtAimTrainer.Desktop\VrtAimTrainer.Desktop.csprojdotnet test .\VrtAimTrainer.slnxBuild a Windows release bundle:
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\install\Publish-VrtAimTrainer.ps1That produces:
.\artifacts\releases\<version>\win-x64\apppublished app files.\artifacts\releases\<version>\win-x64\packageinstallable folder with scripts.\artifacts\releases\<version>\win-x64\VrtAimTrainer-<version>-win-x64.zipzipped installer bundle
Install the packaged build:
powershell -NoProfile -ExecutionPolicy Bypass -File .\artifacts\releases\<version>\win-x64\package\Install-VrtAimTrainer.ps1Or double-click:
.\artifacts\releases\<version>\win-x64\package\Install-VrtAimTrainer.cmd
Default install layout:
%LOCALAPPDATA%\Programs\VrtAimTrainer\VrtAimTrainer.cmdstable launcher%LOCALAPPDATA%\Programs\VrtAimTrainer\current-version.txtactive version pointer%LOCALAPPDATA%\Programs\VrtAimTrainer\versions\<version>\...side-by-side installed builds
Switch to any installed version without reinstalling:
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\install\Switch-VrtAimTrainerVersion.ps1 -Version <version>List installed versions:
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\install\Switch-VrtAimTrainerVersion.ps1 -ListRemove a version or wipe all installs:
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\install\Uninstall-VrtAimTrainer.ps1 -Version <version>
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\install\Uninstall-VrtAimTrainer.ps1 -AllSessions are stored as JSON under:
%LOCALAPPDATA%\VrtAimTrainer\Sessions
Shell state is stored under:
%LOCALAPPDATA%\VrtAimTrainer\State\app-state.json
External gamemode plugins are discovered from:
%LOCALAPPDATA%\VrtAimTrainer\Plugins
Each saved session includes:
- final settings
- summary metrics
- per-hit samples with elapsed time, reaction time, score contribution, spawn distance, cursor travel, health flow, and score flow
- session telemetry for median and p95 reaction, total cursor travel, average spawn distance, and path efficiency
Any assembly that exports a public, no-arg class implementing IAimGamemodePlugin (from VrtAimTrainer.Core) is loaded automatically from the plugins directory. Drop the compiled .dll (and any dependencies) into:
%LOCALAPPDATA%\VrtAimTrainer\Plugins\<your-plugin-folder>\
A plugin's CreateGamemodes() returns one or more IAimGamemodes. You rarely need a custom IAimGamemode implementation — the built-in AimGamemode is fully data-driven. Construct one with:
- an id, display name, and description;
- default
AimSessionSettings; - a target-provider factory (
IRandomSource -> ITargetProvider) that defines the mode's mechanic — reuse the built-inFreeSpawnTargetProvider/GridTargetProvider, or implement your ownITargetProviderfor a brand-new mechanic; - optional presets (a
GamemodePresetlist) shipped with the mode, surfaced automatically on thePresetspage; - optional
IPressureModel/IScoringRule(these default to the built-in logarithmic pressure and cheese-corrected scoring).
The session loop — timing, health, scoring, reaction/analytics, and cursor travel — is shared by AimSessionEngine; a mode only supplies the parts that differ, and the settings UI renders itself from the parameter schema. The app discovers all matching assemblies on startup and registers their gamemodes (and their presets) alongside the built-in ones. Duplicate gamemode IDs are skipped with a load-failure notice shown on the Modes page.
src/VrtAimTrainer.Core— the shared simulation engine (AimSessionEngine+ITargetProvider/IPressureModel/IScoringRule), the data-drivenAimGamemodeandBuiltInGamemodes, the settings parameter schema, analytics, and persistencesrc/VrtAimTrainer.Desktop— rendering loop, immediate-mode UI, plugin loader, and installer toolingtests/VrtAimTrainer.Core.Tests— scoring, spawn-rule, analytics, and GridShot session coveragetools/install— PowerShell publish, install, switch, and uninstall scripts
PolyForm Noncommercial 1.0.0 — free for personal and non-commercial use; selling or other commercial use requires permission.