How the conversion works
The recovery tool reads your old crosshair settings, carries over the ones that have a known equivalent in the new system, and asks you to choose the rest. This page explains each rule, the evidence behind it and what has not been measured yet. For what changed in the game itself, see the CS2 crosshair update.
The rules are fixed code, so the same input always produces the same proposal. The current rule set is assisted-2026-09-23.1.
A ready result is not an exact match. "Ready" means every setting your chosen style needs has a valid value for the new game. It does not mean the new crosshair looks or behaves exactly like your old one. Always check the result in game.
What carries over, setting by setting
The labels in the last column are the ones you may see next to each value in the tool. Any value you change yourself is labelled "Chosen by you".
| New setting | What carries over | Rule | Labels you may see |
|---|---|---|---|
| Style | Old styles 2, 4 and 5, as shown below. | Old style numbers are never passed through, because the numbering changed completely. Some old styles have a close new style; the others need your choice. | Carried over, Suggested, Needs your choice |
| Color and Transparency | A custom color (red, green and blue). | If your old color mode was custom, red, green and blue carry over unchanged; the new picker uses the same 0–255 channels. If it was a preset (Red, Green, Yellow, Blue, Light blue), you choose the color, because the new menu has no presets and the exact old preset shades are not documented. Red, green and blue given without the old color mode need your confirmation, because it is not known whether they were in use. With no old color, your game color is left unchanged. | Carried over, Needs your choice, Left unchanged |
| Color and Transparency (A) | Your transparency. | If transparency was off, the tool proposes alpha 255 (opaque) and labels it Suggested, because the old game may have blended the crosshair differently. If it was on, the old alpha carries over (the new range is 0–255), rounded to a whole number if needed. The separate on/off switch no longer exists. Blending may still look slightly different in game. | Suggested, Carried over, Rounded, Left unchanged |
| Outline | On or off. | Your old on/off choice carries over when your input includes it. Outline thickness does not: the new menu has no outline thickness setting, so it is listed as an old setting with no new equivalent. | Carried over, Left unchanged |
| Thickness | Converted for Classic Static crosshairs from pre-update CS2 at 1920×1080 and 1280×960 (4:3). Otherwise your old value is shown for reference. | The new Thickness is the number of pixels the old thickness drew: old thickness times the old game's scale (2.25 pixels per unit at 1920×1080 and 2 (the captures allow about 1.9643 to 2.0313) at 1280×960 (4:3)), rounded, at least 1. See how sizes are converted below. Otherwise choose a whole number from 0–31, or start with the editor sample. 0 is accepted by the game, but in tests at 1920×1080 and 1280×960 Thickness 0 drew no crosshair at all. | Converted, Closest possible, Needs your choice, Editor sample |
| Center Dot | On or off. | Your old center dot setting carries over when your input includes it. A missing setting is not treated as off: your game setting is left unchanged unless you choose one. | Carried over, Left unchanged |
| Length | Converted for Classic Static crosshairs from pre-update CS2 at 1920×1080 and 1280×960 (4:3). Otherwise your old value is shown for reference. | The new Length is the number of pixels the old size drew: old size times the old game's scale (2.25 pixels per unit at 1920×1080 and 2 (the captures allow about 1.9643 to 2.0313) at 1280×960 (4:3)), rounded. See how sizes are converted below. Otherwise choose a whole number from 0–255, or start with the editor sample. | Converted, Closest possible, Needs your choice, Editor sample |
| Gap | Converted for Classic Static crosshairs from pre-update CS2 at 1920×1080 and 1280×960 (4:3). Otherwise your old value is shown for reference. | The old gap left 4 + gap pixels (fractions dropped) between each bar and the crossing bar; the new Gap counts from the centre, so it is that space plus half the new thickness, rounded up. See how sizes are converted below. Otherwise choose a whole number from 0–128, or start with the editor sample. The new Gap cannot be negative, but an old negative gap usually still converts exactly. An old gap of −5 made the bars overlap, which the new game cannot draw, and gaps between −5 and −4 were not captured (they may have overlapped); for these the closest value makes the bars touch and is labelled Closest possible. Gaps below −5 were not measured and are left for you to choose. | Converted, Closest possible, Needs your choice, Editor sample |
| Dynamic Spread Limit | Nothing. The old game had no equivalent. | Left unchanged unless you choose a value from 0–255. The game default is 255. The tool never builds it from old split settings. | Left unchanged |
| Split Distance | Nothing automatically. | Needs your choice when your input includes an old split distance. The new range is 0–127 and its scale has not been compared with the old one. | Needs your choice, Left unchanged |
| Inner Split Alpha | A suggestion. | An old value inside the new range (0–1) is carried over as a suggestion, rounded to two decimals. Its behaviour has not been compared with the old game. A value outside the new range needs your choice. While the input is treated as pre-update CS2 (the starting answer), a value outside that game's own limits is first limited the way the old game did. | Suggested, Rounded, Limited to new range, Needs your choice, Left unchanged |
| Outer Split Alpha | A suggestion. | An old value inside the new range (0.3–1) is carried over as a suggestion, rounded to two decimals. Its behaviour has not been compared with the old game. A value outside the new range needs your choice. An old value below 0.3 is below the minimum that both pre-update CS2 and the new game enforce, so it likely displayed as the minimum before too. While the answer to where your crosshair is from is Pre-update CS2 (the starting answer), the tool uses the minimum and labels it; with CS:GO or Not sure it asks you to choose. While the input is treated as pre-update CS2 (the starting answer), a value outside that game's own limits is first limited the way the old game did. | Suggested, Rounded, Limited to new range, Needs your choice, Left unchanged |
| Split Size Ratio | A suggestion. | An old value inside the new range (0–1) is carried over as a suggestion, rounded to two decimals. Its behaviour has not been compared with the old game. A value outside the new range needs your choice. While the input is treated as pre-update CS2 (the starting answer), a value outside that game's own limits is first limited the way the old game did. | Suggested, Rounded, Limited to new range, Needs your choice, Left unchanged |
| T Style | On or off. | Your old T style setting carries over when your input includes it. A missing setting is not treated as off: your game setting is left unchanged unless you choose one. | Carried over, Left unchanged |
| Follow Recoil | On or off, except from CS:GO codes. | Carries over when your input includes it. CS:GO crosshair codes did not store Follow Recoil (it always reads as off), so for a code marked as coming from CS:GO the setting is left unchanged. If you are not sure where a code came from, the stored value is used with a warning. | Carried over, Left unchanged |
Color preset names: Red comes from community references only; the other preset names come from the old game files.
Old styles
Old style numbers meant slightly different things in CS:GO and in CS2 before the update. Whether you keep the starting answer, Pre-update CS2, or answer Not sure, the tool treats them as follows. Where you must choose, the tool may offer likely styles, but it never picks one for you.
| Old number | CS:GO name | Pre-update CS2 name | New style | Why |
|---|---|---|---|---|
| 0 | Default | Default (disabled) | You choose (Needs your choice) | Old style 0 (Default / Default (disabled)) has no matching new style number. Choose the new style you want. |
| 1 | Default Static | Default Static (disabled) | You choose (Needs your choice) | Old style 1 (Default Static / Default Static (disabled)) has no matching new style number. Choose the new style you want. |
| 2 | Classic | Classic | Dynamic Cross (Classic) (Suggested) | Old Classic is closest in name and controls to Dynamic Cross (Classic). Its movement and firing behavior has not been compared in game. |
| 3 | Classic Dynamic | Classic Dynamic (disabled) | You choose (Needs your choice) | Old style 3 (Classic Dynamic / Classic Dynamic (disabled)) has no matching new style number. Choose the new style you want. |
| 4 | Classic Static | Classic Static | Static Cross (Carried over) | Classic Static and Static Cross are both fixed crosses. The shape family carries over; sizes are converted where they were measured, otherwise you choose them. |
| 5 | Legacy | Legacy | Dynamic Cross (Legacy/Shot Feedback) (Suggested) | Old Legacy is closest to Dynamic Cross (Legacy/Shot Feedback). Its shot response has not been compared in game. |
Any other old number is not recognised. Your other settings are kept and you choose a new style.
The site owner tested one suggested workaround for Classic, Split Size Ratio 0 with Inner Split Alpha 1, and it did not widen the crosshair. It is not offered as a migration rule.
Old settings with no new equivalent
These old settings were removed by the update and have no replacement in the new menu. The tool keeps your old value visible and lists it in the settings checklist, so nothing disappears silently.
- Outline thickness. The new Outline control is only on or off.
- Use weapon gap. Your old gap may have changed with each weapon, so one old gap number may not describe what you saw.
- Fixed crosshair gap. There is no new setting for it.
- Color preset. The new menu has no presets; see the Color row above.
- Use transparency (on/off). The new alpha value alone sets opacity.
Why there is no single multiplier
Valve published no formula, and the measurements show why one multiplier cannot work:
- The old game drew size and thickness at 2.25 pixels per unit at 1920×1080 and 2 (the captures allow about 1.9643 to 2.0313) at 1280×960 (4:3), rounded, with thickness at least one pixel. That is the render height divided by 480; old-game captures at 1600×1200 (2.5 pixels per unit) fit it too, but no conversion is offered there because the new game was not captured at that resolution.
- The old gap was not scaled: the space next to the crossing bar was 4 + your gap setting in pixels, with fractions dropped.
- The new game draws Length and Thickness in pixels and counts Gap from the centre of the crosshair, not from the crossing bar.
- So the new Gap depends on the new Thickness, and any multiplier would be wrong for most gaps. The old sizes also scaled with the screen height, so the numbers for other resolutions are expected to differ and are not guessed.
Outside the measured setups, Length, Thickness and Gap start unresolved. You type your own values or choose Start with sample sizes, which fills Length 8, Thickness 3 and Gap 1. That sample is a starting point you chose. It is not a conversion of your old sizes and not the game default (Length 8, Thickness 2, Gap 4).
How each value is labelled
Every new value records two separate things: where it came from, and what happened to the old value on the way. Keeping them apart stops a value you chose from being presented as a conversion. In the tool, a value you or the editor sample supplied shows its origin label ("Chosen by you" or "Editor sample"); every other value shows its outcome label. Old settings the update removed appear in the side-by-side table as "No new equivalent".
Where a value came from
| Label | Meaning |
|---|---|
| Carried over by the tool | Proposed by the tool's rules from your old settings. |
| Chosen by you | You chose or typed this value. It stays marked as your choice and is never presented as a conversion. |
| Editor sample | The editor sample, which you chose to start from. It is not a conversion of your old sizes and not the game default. |
What happened to the old value
| Label | Meaning |
|---|---|
| Carried over | The old setting has a known new equivalent and carried over. |
| Suggested | A suggestion from the rules. It has not been confirmed to look or behave the same in game. |
| Rounded | The old value was rounded to fit the new setting's steps, for example to a whole number. |
| Limited to new range | The value was limited to the allowed range. The original stays visible beside it. |
| Chosen | You picked the value, so no old value was transformed into it. |
| Needs your choice | Needs your choice before the result is complete. For settings the tool can safely skip, the label is "Left unchanged" instead: your current game setting is not touched. |
Evidence categories
Every rule, range and command on this site cites evidence. Each piece of evidence belongs to one category:
| Category | Meaning | Items |
|---|---|---|
| Official | A current statement from Valve, cited with its link and the date it was checked. | 1 |
| User observed | Something the site owner saw or did in the game: a menu screenshot, a console readback or a gameplay test. | 24 |
| Locally checked | A check anyone can repeat, made while building this site. This includes reading the public GameTracking-CS2 mirror of the game files at a fixed version. | 22 |
| Proposed | A decision about how this site behaves. It is not a claim about the game. | 3 |
| Unverified | Not established. It is recorded so it is not forgotten, and it cannot become a conversion rule. | 4 |
Evidence list
Links to game files point to fixed versions of the public GameTracking-CS2 mirror. Screenshots and console sessions from the site owner are listed but not published.
| ID | Category | Finding | Source | Checked |
|---|---|---|---|---|
E-VALVE-UPDATE | Official | Valve patch notes, 22 September 2026 Crosshairs were updated to be resolution independent; a new Crosshair/Scopes settings tab and new crosshair styles were added; the default crosshair is now Dynamic Quad. No formula or command names are given. | Source link | |
E-OWNER-LENGTH-RANGE | User observed | Length is an integer 0–255 help cl_crosshair_length; 7.5 rejected; 999 stored as 255; -1 stored as 0. | Owner console session | |
E-OWNER-THICKNESS-RANGE | User observed | Thickness is an integer 0–31 through the console help cl_crosshair_thickness; 0 accepted; 0.5 rejected; 999 stored as 31. Help mentions a minimum rendered pixel. | Owner console session | |
E-OWNER-THICKNESS-MENU-32 | User observed | Thickness menu slider reached 32 Owner saw a slider maximum of 32. Public game data shows build 2000913 shipped max 32 and hotfix 2000914 changed it to 31 (E-GT-THICKNESS-HOTFIX). | Owner slider observation | |
E-OWNER-GAP-RANGE | User observed | Gap is an integer 0–128 help cl_crosshair_gap; 2.5 rejected; -5 and -50 stored as 0; 999 stored as 128. | Owner console session | |
E-OWNER-T-TRUE | User observed | T style accepts 1 as true cl_crosshair_t 1 read back as true. | Owner console session | |
E-OWNER-OUTER-ALPHA | User observed | Outer split alpha stored 0.3 after setting 0 Setting cl_crosshair_dynamic_splitalpha_outermod 0 read back 0.3. | Owner console session | |
E-OWNER-IMPORT-ERROR | User observed | Old example code rejected by the game The game's Share or Import dialog showed "Invalid or old crosshair code". This does not show the old code itself is corrupt. | Owner in-game test | |
E-OWNER-STYLE-IDS | User observed | Eight target style IDs Owner selected each menu style and read cl_crosshairstyle: 0 Dynamic Cross … 7 Dynamic Quad. Matches public game data (E-GT-LOCALIZATION). | Owner console session | |
E-OWNER-CLASSIC-WORKAROUND | User observed | Classic widening workaround failed Split Size Ratio 0 with Inner Split Alpha 1 did not widen the crosshair. Not offered as a workaround. | Owner gameplay observation | |
E-OWNER-SCREENSHOTS | User observed | Menu screenshots were taken at 16:9 Ten cropped menu captures (images 1–10). Exact resolution and pixel scale are unknown, so they cannot calibrate sizes. The image files were not present in this workspace; their content is taken from the PRD summary. | Owner screenshots (PRD section 7 summary) | |
E-OWNER-NO-NEW-CODES | User observed | No new-format codes collected The owner did not export new-format codes, so new-code encoding stays unavailable. | Owner statement | |
E-OWNER-NO-MIGRATION | User observed | The update did not convert existing crosshairs After the update the owner's old crosshair was gone and a new default crosshair (shown in pink) was in its place. The game did not carry the old settings over, so there are no game-converted values to learn a conversion from. | Owner in-game observation | |
E-OWNER-BETA-BRANCH | User observed | Pre-update CS2 still runs as a Steam beta The owner found the beta branch "1.41.8.1" under Steam > Counter-Strike 2 > Properties > Betas, installed it and started the game. In its console cl_crosshair_screen_height is an unknown command (it was added by the update) and the old cl_crosshairsize exists. The installed game reports ClientVersion 2000908, PatchVersion 1.41.8.1 (steam.inf, Steam buildid 25218825). Public Steam metadata lists the same branch. This makes real old/new screenshot pairs possible; Valve could remove the branch at any time. | Owner console session; game/csgo/steam.inf and appmanifest_730.acf on the owner's PC; https://api.steamcmd.net/v1/info/730 | build 2000908 |
E-CAPTURE-OLD-1080 | Locally checked | Measured old crosshair geometry at 1920x1080 The owner captured 59 Classic Static screenshots in pre-update CS2 (build 2000908, beta 1.41.8.1) at 1920x1080 native on 23 September 2026; each was measured from the full lossless image. All 59 match: bar length = round-half-even(2.25 x size) pixels; bar thickness = max(1, round-half-even(2.25 x thickness)) pixels (half-up rounding would miss thickness 2.0); empty gap between a bar end and the crossing bar = trunc(4 + gap) pixels, not scaled (rounding would miss 10 captures). Gap -4 makes the bars touch and -5 overlaps by one pixel. Odd-thickness crosshairs sit half a pixel down-right of the screen centre. Only 1080 render lines were measured, so how the old sizes scaled with other resolutions is still untested. | Owner capture session (docs/CAPTURE.md); measurements in research/calibration/runs/1920x1080-native/old-run.json via scripts/calibration/capture.mjs | build 2000908 |
E-CAPTURE-NEW-1080 | Locally checked | Measured new crosshair geometry at 1920x1080 The owner captured 27 Static Cross screenshots in the current game (build 2000914) at 1920x1080 native on 23 September 2026. All 26 visible ones match: bar length in pixels = Length; bar thickness in pixels = Thickness (1 to 8 tested); the inner end of each bar sits Gap pixels from the crosshair centre (half a pixel less for odd thickness, whose centre is a pixel centre), measured from the centre rather than from the crossing bar, and never inside the crossing bar (small gaps make the bars touch). Thickness 0 drew no crosshair at all (one capture, Length 16, Gap 4), although the help text mentions a minimum of 1 pixel. Odd-thickness crosshairs sit half a pixel up-left of the screen centre (the old game: down-right). | Owner capture session (docs/CAPTURE.md); measurements in research/calibration/runs/1920x1080-native/new-run.json via scripts/calibration/capture.mjs | build 2000914 |
E-CAPTURE-HOLDOUT-1080 | Locally checked | Old-to-new size rule checked pixel for pixel at 1920x1080 From E-CAPTURE-OLD-1080 and E-CAPTURE-NEW-1080: new Length = round-half-even(2.25 x old size); new Thickness = max(1, round-half-even(2.25 x old thickness)); new Gap = max(0, trunc(4 + old gap)) + ceil(new Thickness / 2). For 13 old Classic Static crosshairs held out from fitting (fractional sizes, thicknesses and gaps), new Static Cross captures at the predicted settings matched the old captures exactly in bar length, thickness, inner gap and outer extent (0 px error). A straight-line fit of the same data was within 1 px but exact for only 6 of 13. The truncation of fractional gaps was predicted by the third-party model recorded before the captures. Scope: Classic Static to Static Cross, build 2000908 to 2000914, 1920x1080 native. Old gaps of -5 or less overlapped the crossing bar, which the new game does not draw, so they come out 1 px apart. | Owner holdout captures; research/calibration/runs/1920x1080-native/hold-run.json with holdout-plan.json in the same folder | build 2000914 |
E-CAPTURE-NEW-960 | Locally checked | New crosshair geometry is the same at 1280x960 The owner repeated the 27 Static Cross captures of E-CAPTURE-NEW-1080 in the current game (build 2000914) at 1280x960 (4:3) on 23 September 2026. With the sizes entered while the game ran at 1280x960, all 26 visible captures drew exactly the same pixels as at 1920x1080 (bar length, thickness, inner gap, outer extent and centre offset): at both measured resolutions Length and Thickness drew that many pixels. Sizes entered at one resolution and viewed at another were not tested. Thickness 0 again drew nothing. | Owner capture session (docs/CAPTURE.md); research/calibration/runs/1280x960-stretch/new-run.json compared with research/calibration/runs/1920x1080-native/new-run.json | build 2000914 |
E-CAPTURE-OLD-960 | Locally checked | Measured old crosshair geometry at 1280x960 The owner ran the 59-step old session of E-CAPTURE-OLD-1080 in pre-update CS2 (build 2000908) at 1280x960 (4:3) on 23 September 2026. All 59 captures were read and match the 1080-line model with one shared scale for size and thickness: bar length = round-half-even(k x size), bar thickness = max(1, round-half-even(k x thickness)), empty gap = trunc(4 + gap) pixels, not scaled. Unlike at 1080 and 1200 lines, these captures do not fix k exactly: every k from 5.5 / 2.8 (about 1.9643, set by thickness 2.8 drawing 6 px) to 6.5 / 3.2 (2.03125, set by size 3.2 drawing 6 px) reproduces all 59. The site uses 2 (render height / 480, which E-CAPTURE-OLD-1080 and E-CAPTURE-OLD-1600 fix exactly at their heights) and does not convert an old size whose pixels differ within that range (15 sizes on the 0.1 grid, from 3.3 to 6.8; no thickness). Gap -4 makes the bars touch and -5 overlaps them, as at 1080 lines. | Owner capture session (docs/CAPTURE.md); measurements in research/calibration/runs/1280x960-stretch/old-run.json via scripts/calibration/capture.mjs | build 2000908 |
E-CAPTURE-HOLDOUT-960 | Locally checked | Old-to-new size rule checked pixel for pixel at 1280x960 From E-CAPTURE-OLD-960 and E-CAPTURE-NEW-960: new Length = round-half-even(2 x old size); new Thickness = max(1, round-half-even(2 x old thickness)); new Gap = max(0, trunc(4 + old gap)) + ceil(new Thickness / 2). The holdout settings were generated from the fitted rule (capture.mjs holdout --rule) before the new captures were taken. For the 13 held-out old Classic Static crosshairs, new Static Cross captures at those settings matched the old captures exactly in bar length, thickness, inner gap and outer extent (0 px error). The scale 2 used for the holdout plan was fitted without the held-out old captures; one of them (size 3.2, drawing 6 px) then set the upper end of the scale range in E-CAPTURE-OLD-960. Sizes whose pixels differ within that range stay unconverted. Scope: Classic Static to Static Cross, build 2000908 to 2000914, a 1280x960 render in Fullscreen; how the picture was scaled to the monitor was not recorded (see E-UNVERIFIED-RENDER-SCALING). Old gaps of -5 or less cannot be drawn by the new game, and gaps between -5 and -4 were not captured. | Owner holdout captures; research/calibration/runs/1280x960-stretch/hold-run.json with holdout-plan.json in the same folder | build 2000914 |
E-UNVERIFIED-RENDER-SCALING | Unverified | 4:3 stretched and 4:3 with black bars render the same pixels CS2 has no in-game stretch setting: the game renders at the chosen resolution and the graphics driver or monitor scales that picture to the screen, stretched or with black bars. The captures record only the render (for example 1280x960 screenshots), not how it was scaled, so the site treats both ways of playing 4:3 at a resolution as the same setup. This is an inference from how the game and drivers work, not a capture of both modes. | Owner capture sessions (render-size screenshots); CS2 video settings as described in docs/CAPTURE.md | |
E-CAPTURE-OLD-1600 | Locally checked | Measured old crosshair geometry at 1600x1200 The owner ran the 59-step old session of E-CAPTURE-OLD-1080 in pre-update CS2 (build 2000908) with the game at 1600x1200 (4:3) on 23 September 2026. All 59 captures match the 1080-line model with a scale of 2.5 instead of 2.25: bar length = round-half-even(2.5 x size), bar thickness = max(1, round-half-even(2.5 x thickness)), empty gap = trunc(4 + gap) pixels, not scaled. Both scales equal render height / 480. No new-game or holdout captures were taken at 1600x1200, so no conversion is offered for it. | Owner capture session; research/calibration/runs/1600x1200-stretch/old-run.json via scripts/calibration/capture.mjs (class 1600x1200-stretch) | build 2000908 |
E-OWNER-LEETIFY-MATCH | User observed | One crosshair matched by eye against a Leetify preview At 1920x1080 native (16:9) the owner set Static Cross Length 6, Thickness 1, Gap 3 (outline off, no dot, no T), side by side with Leetify's web preview of an old Classic Static code (size 2.1, thickness 0.3, gap -2). The code itself has the outline on at thickness 1, so the two sides differ. Leetify listed fixed gap 2.1, but the code decodes to 3.0; fixed gap only applied to old style 1. Leetify's preview is a third-party drawing at an unknown scale, not the old game, and one point per size cannot separate a scale from an offset. This is a plausibility check only, not a calibration pair. | Owner screenshots of the CS2 menu and Leetify, and owner statement | |
E-IMG-01 | User observed | Image 1: Static Circle menu with small preview Owner menu screenshot (16:9, cropped). Establishes which controls appear, not their rendering. | Owner screenshot (not included in this workspace; see PRD section 7) | |
E-IMG-02 | User observed | Image 2: Crosshair Settings (general) section Owner menu screenshot (16:9, cropped). Establishes which controls appear, not their rendering. | Owner screenshot (not included in this workspace; see PRD section 7) | |
E-IMG-03 | User observed | Image 3: Static Cross controls Owner menu screenshot (16:9, cropped). Establishes which controls appear, not their rendering. | Owner screenshot (not included in this workspace; see PRD section 7) | |
E-IMG-04 | User observed | Image 4: Static Circle controls Owner menu screenshot (16:9, cropped). Establishes which controls appear, not their rendering. | Owner screenshot (not included in this workspace; see PRD section 7) | |
E-IMG-05 | User observed | Image 5: Dot Only controls Owner menu screenshot (16:9, cropped). Establishes which controls appear, not their rendering. | Owner screenshot (not included in this workspace; see PRD section 7) | |
E-IMG-06 | User observed | Image 6: Dynamic Cross controls Owner menu screenshot (16:9, cropped). Establishes which controls appear, not their rendering. | Owner screenshot (not included in this workspace; see PRD section 7) | |
E-IMG-07 | User observed | Image 7: Dynamic Circle controls Owner menu screenshot (16:9, cropped). Establishes which controls appear, not their rendering. | Owner screenshot (not included in this workspace; see PRD section 7) | |
E-IMG-08 | User observed | Image 8: Dynamic Cross (Classic) controls, bottom cropped Owner menu screenshot (16:9, cropped). Establishes which controls appear, not their rendering. | Owner screenshot (not included in this workspace; see PRD section 7) | |
E-IMG-09 | User observed | Image 9: Dynamic Cross (Legacy/Shot Feedback) controls Owner menu screenshot (16:9, cropped). Establishes which controls appear, not their rendering. | Owner screenshot (not included in this workspace; see PRD section 7) | |
E-IMG-10 | User observed | Image 10: Dynamic Quad controls Owner menu screenshot (16:9, cropped). Establishes which controls appear, not their rendering. | Owner screenshot (not included in this workspace; see PRD section 7) | |
E-GT-CONVARS | Locally checked | Current-build console variable list DumpSource2/convars.txt at build 2000913 (identical in 2000914) lists every new crosshair command with default, min and max: style 0–7 (default 7), length 0–255 (8), thickness 0–31 (2), gap 0–128 (4), spread limit 0–255 (255), split distance 0–127 (3), inner split alpha 0–1 (0), outer split alpha 0.3–1 (1), split ratio 0–1 (1), color r/g/b 0–255 (0/255/0), color a 0–255 (255); outline, dot, T style and recoil are booleans (true/false/false/true). | Source link | build 2000913 |
E-GT-REMOVED-CONVARS | Locally checked | Old crosshair commands removed or hidden Removed in build 2000913: cl_crosshairgap, cl_crosshaircolor, cl_crosshairusealpha, cl_crosshair_outlinethickness, cl_fixedcrosshairgap, cl_crosshairgap_useweaponvalue. Now hidden: cl_crosshairsize, cl_crosshairthickness, cl_crosshairalpha. | Source link | build 2000913 |
E-GT-UI-LAYOUT | Locally checked | Crosshair / Scopes menu layout and per-style rows settings_crosshair.xml and settingsmenu_crosshair.js: Style, Color and Transparency, Outline and Thickness always shown. Extra rows per style: 0 dot/length/gap/T/spread limit; 1 dot/spread limit; 2 dot/length/gap/split distance/inner alpha/outer alpha/split ratio/T style; 3 dot/gap; 4 and 5 dot/length/gap/T; 6 none; 7 dot/length/gap/T/spread limit. The cropped last Classic row is T Style. | Source link | build 2000914 |
E-GT-THICKNESS-HOTFIX | Locally checked | Thickness slider changed from 32 to 31 Build 2000913 shipped a Thickness slider max of 32; hotfix build 2000914 changed it to 31. The console maximum was 31 in both. | Source link | build 2000914 |
E-GT-SIZE-HELP | Locally checked | Size help text and the hidden authoring-resolution setting Console help: Length and Thickness are scaled with screen resolution; Thickness has a minimum of 1 pixel; Gap is an offset added to the gap between the crosshair center and the bars, with nothing said about resolution. The spread limit help refers to a 128-pixel baseline. A hidden, per-user cl_crosshair_screen_height (default 1080, minimum 240) records the resolution at which the player authored their sizes and changes whenever a size setting is updated, so it is not a fixed reference. None of this is a formula; the units of Length, Thickness and Gap are not stated. | Source link | build 2000913 |
E-GT-SCALE-TOOLTIP | Locally checked | Menu tells players the size scale changed The menu marks Color and Transparency, Thickness, Length and Gap as updated, with a tooltip saying the setting's scale has changed and the player may want to adjust it. No public menu script converts old values, and the Import from CS:GO button was removed. | Source link | build 2000914 |
E-GT-CAPTURE-COMMANDS | Locally checked | Console commands used by the calibration capture files alias, bind, unbind, echo, say, condump, hideconsole, map, slot3, sv_cheats, bot_quota, bot_kick, mp_warmup_start, mp_warmup_pausetimer, mp_ignore_round_win_conditions, r_drawviewmodel (cheat) and setang (cheat, needs sv_cheats) are listed in the public console lists of both build 2000908 and build 2000914. The screenshot command is development-only in release builds, so captures use the Steam screenshot key. | Source link | |
E-GT-SLIDERS | Locally checked | Menu slider ranges Length 0–255, Thickness 0–31, Gap 0–128, Dynamic Spread Limit 0–255, Split Distance 0–127, Inner Split Alpha 0–1 (step 0.05), Outer Split Alpha 0.3–1 (step 0.05), Split Size Ratio 0–1 (2 decimals). Outline, Center Dot, T Style and Follow Recoil are Yes/No. | Source link | build 2000914 |
E-GT-LOCALIZATION | Locally checked | Menu labels Tab "Crosshair / Scopes"; style labels 0–7 match the owner registry; color row "Color and Transparency"; Color, Thickness, Length and Gap carry the note that their scale has changed. | Source link | build 2000914 |
E-GT-COLOR-PICKER | Locally checked | New color picker has no presets The Color and Transparency control is a free picker with R, G, B, hex and A entries writing cl_crosshaircolor_r/g/b/a as whole numbers. There is no color preset list. | Source link | build 2000914 |
E-GT-PRE-UPDATE | Locally checked | Pre-update crosshair commands and menu Build 2000908: cl_crosshairstyle help lists 0 and 1 and 3 as disabled, 2 as the default dynamic style, 4 default static, 5 legacy. Menu offered Classic (2), Classic Static (4) and Legacy (5). Menu slider limits (settings_game.xml): size 0–10, thickness 0.1–6, gap −5 to 5, outline thickness 0–3, split distance 0–16, fixed gap −5 to 5. Console bounds: outline thickness 0–3, alpha 0–255, inner split alpha 0–1, outer split alpha 0.3–1, split ratio 0–1; no bounds for size, thickness, gap or split distance. | Source link | build 2000908 |
E-GT-CSGO-COLOR-NAMES | Locally checked | Old color mode names The final CS:GO game_options.txt names color modes 1 Green, 2 Yellow, 3 Blue and 4 Lt Blue; pre-update CS2 color sliders force mode 5 (custom). Mode 0 = Red comes from community sources only. No file gives the RGB shades the game drew for modes 0–4. | Source link | build CS:GO 1569 |
E-GT-NEW-CODE-MARKER | Unverified | New-format game codes appear to use format byte 3 The game binary's built-in crosshair code changed with the update; the new one passes the old checksum but has format byte 3 instead of 1. Inferred only; the new layout is unknown. | Source link | build 2000913 |
E-CODEC-PINNED | Locally checked | Pinned legacy codec akiver/csgo-sharecode v5.0.0 at commit 753f16f (MIT). Layout inspected; source archived in research/reference. | Source link | |
E-FIXTURE-A | Locally checked | Fixture A (owner-reported rejected code) CSGO-FNOLG-fQcPX-V8P7K-VqtAf-ZbJaA decodes to style 4, length 1.5, thickness 0, gap −3 and re-encodes identically. Not confirmed to be the owner's own crosshair. | research/verified-legacy-fixtures.json | |
E-FIXTURE-B | Locally checked | Fixture B (upstream README example) CSGO-WsnnD-eHaMw-QNDf9-oxuDh-ydOUD decodes to the README values and re-encodes identically. | research/verified-legacy-fixtures.json | |
E-PROPOSED-SAMPLE | Proposed | Editor sample sizes Length 8, Thickness 3, Gap 1 is an editor sample a player may choose. It is not a conversion and not the game default (the game default is 8, 2, 4 per E-GT-CONVARS). | PRD section 5.2 | |
E-PROPOSED-NO-SIZE-FORMULA | Proposed | No size conversion without calibration Length, thickness and gap stay unresolved until a calibrated profile passes its holdout gate. No multiplier is applied. | PRD sections 8.1 and 9 | |
E-PROPOSED-CONSOLE-BLOCKS | Proposed | Console line length The game console line limit has not been verified. Long command lines are also offered as blocks of at most 120 characters, plus a CFG file. | PRD section 10.2 | |
E-UNVERIFIED-OLD-RENDER-MODEL | Unverified | Third-party pixel model of the old crosshair Some third-party crosshair tools draw old Classic Static bars as size and thickness times screen height / 480, rounded (thickness at least 1 pixel), with the gap as 4 + gap unscaled pixels. At least two say they ported it from CS:GO source code, which cannot be used as evidence, and the tools disagree on rounding and on the gap. Every published check is at 1080 lines, so the resolution-dependent part is untested. Captures by the owner now confirm the model at 1080 lines (E-CAPTURE-OLD-1080) and 1200 lines (E-CAPTURE-OLD-1600); only those measurements, not this model, may be used. | github.com/girlglock/cs2-crosshair, github.com/patriqcs/cursed-crosshair-generator, github.com/Chungmire/CS2-Crosshair-Overlay, dathost.com/tools/cs2-crosshair-generator | |
E-UNVERIFIED-PRESET-RGB | Unverified | Old color preset shades The RGB values the old game used for color presets 0–4 were not found in public game data. Preset crosshairs need the player to choose a color. | Searched GameTracking-CS2 pre-update files; see research/EVIDENCE.md |
Command coverage
Each new console command has one of these statuses:
- Verified: the site owner set or selected the value in the game and read it back in the console.
- Documented: the command, its type and its range appear in the public console variable list for the current build, and the game menu binds the matching control to it.
The tool only outputs commands with one of these two statuses. Reading back the whole documented set in game is still pending, so treat the game as the final check. Right now 4 settings have verified commands and 11 have documented ones.
| Setting | Command | Status | Output | Evidence |
|---|---|---|---|---|
| Style | cl_crosshairstyle | Verified | Included | E-OWNER-STYLE-IDS, E-GT-CONVARS, E-GT-LOCALIZATION |
| Color and Transparency | cl_crosshaircolor_rcl_crosshaircolor_gcl_crosshaircolor_b | Documented | Included | E-GT-CONVARS, E-GT-COLOR-PICKER |
| Color and Transparency (A) | cl_crosshaircolor_a | Documented | Included | E-GT-CONVARS, E-GT-COLOR-PICKER |
| Outline | cl_crosshair_drawoutline | Documented | Included | E-GT-CONVARS, E-GT-UI-LAYOUT |
| Thickness | cl_crosshair_thickness | Verified | Included | E-OWNER-THICKNESS-RANGE, E-GT-CONVARS |
| Center Dot | cl_crosshairdot | Documented | Included | E-GT-CONVARS, E-GT-UI-LAYOUT |
| Length | cl_crosshair_length | Verified | Included | E-OWNER-LENGTH-RANGE, E-GT-CONVARS |
| Gap | cl_crosshair_gap | Verified | Included | E-OWNER-GAP-RANGE, E-GT-CONVARS |
| Dynamic Spread Limit | cl_crosshair_dynamic_spread_limit | Documented | Included | E-GT-CONVARS, E-GT-UI-LAYOUT |
| Split Distance | cl_crosshair_dynamic_splitdist | Documented | Included | E-GT-CONVARS, E-GT-UI-LAYOUT |
| Inner Split Alpha | cl_crosshair_dynamic_splitalpha_innermod | Documented | Included | E-GT-CONVARS, E-GT-UI-LAYOUT |
| Outer Split Alpha | cl_crosshair_dynamic_splitalpha_outermod | Documented | Included | E-GT-CONVARS, E-GT-UI-LAYOUT, E-OWNER-OUTER-ALPHA |
| Split Size Ratio | cl_crosshair_dynamic_maxdist_splitratio | Documented | Included | E-GT-CONVARS, E-GT-UI-LAYOUT |
| T Style | cl_crosshair_t | Documented | Included | E-OWNER-T-TRUE, E-GT-CONVARS, E-GT-UI-LAYOUT |
| Follow Recoil | cl_crosshair_recoil | Documented | Included | E-GT-CONVARS, E-GT-UI-LAYOUT |
Command names come from a fixed list and values are checked against each command's range, so nothing you type can become part of a command. The old commands below are never included, because the update removed or hid them:
cl_crosshairsize, cl_crosshairthickness, cl_crosshairgap, cl_crosshairalpha, cl_crosshairusealpha, cl_crosshaircolor, cl_crosshair_outlinethickness, cl_fixedcrosshairgap, cl_crosshairgap_useweaponvalue
The longest line the game console accepts has not been checked. The tool therefore also splits a long command line into blocks of at most 120 characters, and offers the commands as a crosshair.cfg file.
Versions
| Target | CS2 update of 22 September 2026 (checked against public data for builds 2000913 and 2000914) |
|---|---|
| Update date | |
| Target schema | target-2026-09-22.2 |
| Mapping rules | assisted-2026-09-23.1 |
| Legacy code decoder | akiver/csgo-sharecode@753f16f (strict wrapper v1) |
| Size conversion profiles | legacy-geometry-1920x1080@0.1.0, validated (1920×1080); legacy-geometry-1280x960@0.1.0, validated (1280×960 (4:3)) |
Game builds checked
| Build | Client version | Patch version | Game files |
|---|---|---|---|
| Update | 2000913 | 1.41.8.2 | Commit 10f3693 |
| Hotfix | 2000914 | 1.41.8.2 | Commit 98da94f |
| Before the update | 2000908 | 1.41.8.1 | Commit d8e2c7a |
The console checks by the site owner did not record a build number.
The old code decoder
Old crosshair codes are decoded with the byte layout of akiver/csgo-sharecode at commit 753f16f (version 5.0.0), used under the MIT licence, Copyright (c) 2017-present AkiVer. Only its decoding logic is reproduced. Its command generator is not used, because it writes the old command names.
This site adds stricter checks that the reference does not make:
- Input is limited to 256 characters and must have the exact code shape.
- Every character is checked against the code alphabet before any decoding. Letter case is never changed.
- The decoded length, the checksum, the format marker byte, reserved bits and bytes, and the range of each field are all checked.
- Syntax errors, integrity errors and unsupported formats get different messages. A passing checksum alone does not prove a code is a crosshair, because match share codes use the same alphabet and length.
- Codes with the newer format marker are refused instead of being read as old settings.
Split distance: the reference reads split distance as a number from 0 to 7, but the old menu allowed up to 16. This site reads a wider part of the byte and flags any value above 7 as uncertain instead of refusing the code. In every checked fixture the split distance is between 3 and 7, where both readings agree.
The project's fixture file lists 9 old codes checked against the pinned reference; 9 of them decode and re-encode to the identical code. It also lists 3 codes that must not be read as old crosshairs: a new-format code from the updated game and match share codes. This establishes old-code decoding only. It does not show that the updated game imports those codes or that any conversion looks the same.
| Fixture | Code | Re-encodes identically |
|---|---|---|
| A | CSGO-FNOLG-fQcPX-V8P7K-VqtAf-ZbJaA | Yes |
| B | CSGO-WsnnD-eHaMw-QNDf9-oxuDh-ydOUD | Yes |
| CSGO-DEFAULT | CSGO-6G2cS-WzcxT-fH3dp-Rf7oq-X9oJN | Yes |
| CS2-PRE-UPDATE-DEFAULT | CSGO-cXRt7-URURp-wo2kd-n4VTi-oTc3K | Yes |
| UPSTREAM-1 | CSGO-Cn37R-YE7vo-pLCAL-aURmZ-z6zkG | Yes |
| UPSTREAM-2 | CSGO-LibdP-VCVEd-ESayK-rSivi-2UBtG | Yes |
| UPSTREAM-3 | CSGO-9JzcN-4dZtA-DdXis-8qz5T-rCnkP | Yes |
| UPSTREAM-4 | CSGO-fCUBz-CBHss-a74RP-SEdO8-mvZpG | Yes |
| UPSTREAM-5 | CSGO-ZrEjo-yASEP-OAdce-Sf44w-rhK5O | Yes |
How sizes are converted
Sizes are converted from measurements, not from a guessed formula. In a capture session the same crosshairs were set in CS2 before the update (still available as a Steam beta) and in the current game, a lossless full-size screenshot was taken of each, and a script measured every bar in pixels.
At each measured setup every crosshair fits these rules exactly. Only the old game's scale depends on the resolution: 2.25 pixels per unit at 1920×1080 and 2 (the captures allow about 1.9643 to 2.0313) at 1280×960 (4:3).
| Size | Old game (Classic Static) | New game (Static Cross) | Conversion |
|---|---|---|---|
| Length | size × scale pixels, rounded (halves to the even number) | Length pixels | new Length = old pixels |
| Thickness | thickness × scale pixels, rounded the same way, at least 1 | Thickness pixels (0 drew nothing) | new Thickness = old pixels |
| Gap | 4 + gap pixels between a bar and the crossing bar, fractions dropped, not scaled | bars start Gap pixels from the centre and never reach inside the crossing bar | new Gap = old space + half the new thickness, rounded up |
For example, at 1920×1080 the old Classic Static 2.1 / 0.3 / −2 drew bars 5 pixels long and 1 pixel thick with 2 pixels of space, so it becomes Length 5, Thickness 1, Gap 3. At 1280×960 the same crosshair drew bars 4 pixels long, so there it becomes Length 4, Thickness 1, Gap 3. For each setup, thirteen further crosshairs, kept out of the measurement and chosen with awkward fractions, were then set in the new game at the converted values: every one matched its old screenshot pixel for pixel.
| Profile | Screen setup | Old scale | State | Held-back check | Old values covered |
|---|---|---|---|---|---|
legacy-geometry-1920x1080@0.1.0 | 1920×1080 | 2.25 | validated | 13 held-back crosshairs, largest error 0 px | size 0.5 to 7, thickness 0.3 to 3, gap -5 to 3 |
legacy-geometry-1280x960@0.1.0 | 1280×960 (4:3) | 2 (the captures allow about 1.9643 to 2.0313) | validated | 13 held-back crosshairs, largest error 0 px | size 0.5 to 7, thickness 0.3 to 3, gap -5 to 3 |
The tool fills sizes in only when everything matches what was measured: an old Classic Static crosshair from CS2 before the update, the new Static Cross style, your resolution and values inside the covered range. It asks for the two facts it cannot read from a code: where your crosshair is from (Pre-update CS2 unless you change it) and the resolution you play at. Anywhere else you choose the sizes, and the measured values for 1920×1080 and 1280×960 (4:3) are shown as a guide. The switch for this build is on.
Sources: E-CAPTURE-OLD-1080; E-CAPTURE-NEW-1080; E-CAPTURE-HOLDOUT-1080; E-CAPTURE-OLD-960; E-CAPTURE-NEW-960; E-CAPTURE-HOLDOUT-960; E-CAPTURE-OLD-1600; E-OWNER-BETA-BRANCH.
How a setup is validated
A profile moves through three states:
| State | What it means |
|---|---|
| disabled | Never used. Sizes stay unresolved and you choose them. |
| estimated | Usable after documented evidence and tests, and always labelled as an estimate. |
| validated | Usable only inside the settings and display setup that were actually measured, after passing the holdout check. Not a claim of exactness elsewhere. |
Before a profile can become validated, the site's calibration plan requires at least:
- Paired captures of the same crosshair in the old and the new game under controlled conditions, recording the builds, the actual render resolution, aspect ratio, display mode (native, letterbox or stretched) and the full unresized image.
- At least five distinct values for each size dimension that is fitted separately.
- At least ten mixed configurations held back from fitting and used only for testing, for each style and resolution class.
- No more than one native pixel of error for each measured part of a static crosshair on those held-back tests.
These are a minimum starting point, not proof that a profile is good enough. A profile only applies to the styles, source versions and value ranges it was measured on, and only for the matching game version. One screen setup does not validate another: a 16:9 result says nothing about stretched 4:3. Dynamic behaviour and Follow Recoil need measurements over time, which static captures cannot provide.
Preview limits
The preview is a schematic, not a copy of the game's renderer. It is labelled "Schematic preview — check the result in CS2". It draws your settings in abstract units. Bars start Gap units from the centre and never reach inside the crossing bar, as measured for Static Cross at 1920×1080 and 1280×960. Thickness 0 draws no bars, as in the measurement.
| Style | Preview |
|---|---|
| Dynamic Cross | Illustrative shape at rest. Movement and firing are not simulated. |
| Dynamic Circle | Illustrative shape at rest. The in-game circle size depends on weapon spread. |
| Dynamic Cross (Classic) | Illustrative shape at rest. Movement and firing are not simulated. |
| Static Circle | Schematic drawing of your chosen settings. |
| Static Cross | Schematic drawing of your chosen settings. |
| Dynamic Cross (Legacy/Shot Feedback) | Illustrative shape at rest. Movement and firing are not simulated. |
| Dot Only | Schematic drawing of your chosen settings. |
| Dynamic Quad | Nothing is drawn, because no evidence documents the shape. Settings are listed instead. |
The preview never draws your old crosshair scaled by a guessed formula next to the new one.
New-format game codes
This site cannot read or create the new game's crosshair codes. Their layout is unknown; only a changed format marker has been inferred. The website link the tool creates is not a game code, and the console commands are not a game code either. The FAQ explains the difference.
Last checked
Evidence last checked on , against public game data for builds 2000913 and 2000914. Changes to rules and targeted builds are recorded in the changelog. If something here looks wrong, please use the contact page. For help using the tool, see how to use it.