Everything below describes the application as it is built in this repository. Where behaviour could not be confirmed on shipped Windows hardware it is labelled as such rather than presented as fact.
Getting started
crshhx is a crosshair overlay for Windows with an editor behind it. Launching it starts two windows: the overlay, which draws only your reticle and sits above your games, and the studio, where you design, organise and switch crosshairs.
On first launch a small set of built-in presets is seeded so the studio opens with something usable. From there the workflow is: design in the editor, save to the library, then either select the crosshair in the overlay or assign it to a weapon slot.
No account. There is nothing to sign into and no server to talk to.
No telemetry. The application does not report usage, crashes or identifiers anywhere.
Offline. Fonts and assets are bundled with the application, so everything keeps working with no network connection.
Installation
Installer build
A one-click NSIS setup: double-click the downloaded file and it installs with no prompts, creating desktop and Start menu shortcuts. Your library is written to your roaming application-data directory rather than the install directory, so reinstalling, moving or upgrading the application never disturbs your data. Uninstalling removes the application and leaves your data behind.
Portable build
A single executable that can live anywhere, including removable storage. It uses the same roaming data directory as the installer build, so the two distributions share one library.
Upgrading
Saved data is migrated before any window is created. Migration is recorded as complete only when it either copies your data successfully or confirms there was nothing to copy; a probe that times out or errors is left unmarked so it is retried on the next launch. Existing settings, presets and slot profiles carry across an upgrade.
Creating a crosshair
The editor works directly on the overlay's own configuration, so what you see is what gets drawn. A crosshair has a shape — cross, dot, circle or T-shape — and a set of parameters for that shape.
Control
What it does
Length & thickness
Size of each arm. Asymmetric mode sets each arm individually, and every arm can be enabled or disabled on its own.
Gap
Distance from the centre point to the inner end of each arm.
Rotation & scale
Rotate the whole reticle clockwise in degrees, or scale it uniformly.
Outline
A contrast outline drawn behind each element (thickness 1–6) and an inner outline drawn inside it, each with its own colour.
Colour
Named swatches and a manual picker, with contrast verdicts against the target backdrop so a low-visibility colour is flagged as you choose it.
Centre dot
Optional, square or circular, with its own size and colour.
Spread ring
A circle around the reticle with adjustable radius and thickness.
Glow
An optional bloom behind the reticle (blur 1–20).
Offset
Move the reticle away from the exact centre of the overlay.
Changes are tracked in an undo history that coalesces continuous adjustments, so dragging a slider is one undo step rather than dozens. The compare panel holds a snapshot and diffs it against your working copy parameter by parameter.
Managing presets
The library holds the built-in vault plus everything you save. Each preset carries a name, an optional game tag, an optional description and its full crosshair configuration.
Folders and favourites. Stored in a sidecar keyed by preset identifier, so organising a built-in never modifies the built-in itself.
Search and sort. Filter by name, game, recency or favourite status; counts stay correct as the library changes.
Protected built-ins. Shipped presets cannot be overwritten or deleted through the editor or through an import.
One favourites store. Starring a crosshair anywhere stars it everywhere; a legacy key from an earlier build is migrated on first read.
Import and export
Export writes a versioned transfer file containing your presets as they are. Import never applies anything before you have seen the plan: the preview lists every entry, marks conflicts with presets you already have, and reports any value that had to be repaired to fall inside its allowed range.
Per-entry decisions. For a conflicting entry you choose keep mine, replace mine or skip. Replace is never the default.
A gate for large imports. Bringing in more than 25 crosshairs requires an explicit acknowledgement first.
Shared files. A file from another person is imported through the same preview with the same rules; there is no cloud or account involved.
Game profiles
Every crosshair can be tagged for Valorant, CS2, Fortnite, Apex or marked universal. Profiles group those tags and can switch automatically when their game comes to the foreground.
Automatic switching is optional. With it disabled, no process polling runs at all.
Restricted profiles fail closed. A profile set to switch only while a matched process is in front stops switching if process tracking becomes unavailable, rather than activating in the wrong game.
Manual selection wins. Choosing a profile by hand overrides auto-selection until the foreground game changes again.
Automatic switching matches on the foreground process name, so a game renamed or launched through an unusual wrapper may not match.
Weapon-slot switching
Assign a crosshair to each slot and record the key that selects that weapon. The defaults are:
Slot
Key
Shotgun
1
Rifle
2
SMG
3
Sniper
4
Utility
5
Every binding is rebindable and can use modifiers. Input is observed passively: crshhx watches for the recorded key and lets the event continue to the game, so your controls behave exactly as they would with crshhx closed.
Conflicts are refused. Assigning a key another slot already uses is rejected, and the interface names the conflicting slot.
Typing-critical keys. Keys that would disrupt typing while the studio has focus are handled by an explicit policy rather than by chance.
Visible degradation. If the passive hook cannot start, the Weapon Slots page says so and explains the fallback transport, which requires a modifier in front of a single-digit key.
Troubleshooting
The overlay is not visible. Press F10 to toggle it, then check the monitor selection and offset in the studio. In games using exclusive fullscreen, switch the game to borderless or windowed fullscreen.
Slot keys do nothing. Open Weapon Slots and read the transport banner. If the passive hook did not start, the fallback transport needs a modifier with single-digit keys.
A profile did not switch automatically. Confirm automatic switching is enabled, and that the profile is not restricted or that the game's process name matches it.
An import did not apply what you expected. Re-open the preview: conflicts default to keeping your version, and large imports require an explicit acknowledgement.
Your data after an upgrade. Settings live in your roaming application-data directory and are migrated before any window opens; a migration that cannot be confirmed is retried on the next launch.
FAQ
Does crshhx modify games or read their memory?
No. It draws its own overlay window and observes keyboard and mouse input passively. It does not inject into, patch or read any game process.
Is it safe with anti-cheat systems?
That cannot be guaranteed by this project. crshhx does not touch game processes and consumes no input, but whether a given anti-cheat accepts any third-party overlay or input observer is the vendor’s decision and can change at any time. Check the rules of each game you play.
Does it work with every game?
Compatibility cannot be promised for every title. Games that use exclusive fullscreen, that block topmost windows or that intercept input themselves can behave differently, and none of those cases has been validated on shipped Windows hardware.
Do I need an internet connection?
Only to download the application. After that it runs entirely offline: fonts and assets are bundled and nothing is synced.
Does it work with a controller?
No. Slot switching responds to keyboard and mouse input; gamepad support is not implemented.
Will my library survive an update?
Yes. Data lives outside the install directory, and the migration path confirms a copy before it records itself as complete. A migration that cannot be confirmed is retried on the next launch.