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".

Transfer rule for each new setting
New settingWhat carries overRuleLabels you may see
StyleOld 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 TransparencyA 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
OutlineOn 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
ThicknessConverted 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 DotOn 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
LengthConverted 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
GapConverted 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 LimitNothing. 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 DistanceNothing 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 AlphaA 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 AlphaA 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 RatioA 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 StyleOn 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 RecoilOn 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.

How each old style number is treated
Old numberCS:GO namePre-update CS2 nameNew styleWhy
0DefaultDefault (disabled)You choose (Needs your choice)Old style 0 (Default / Default (disabled)) has no matching new style number. Choose the new style you want.
1Default StaticDefault 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.
2ClassicClassicDynamic 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.
3Classic DynamicClassic 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.
4Classic StaticClassic StaticStatic 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.
5LegacyLegacyDynamic 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

Value origin labels
LabelMeaning
Carried over by the toolProposed by the tool's rules from your old settings.
Chosen by youYou chose or typed this value. It stays marked as your choice and is never presented as a conversion.
Editor sampleThe 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

Mapping outcome labels
LabelMeaning
Carried overThe old setting has a known new equivalent and carried over.
SuggestedA suggestion from the rules. It has not been confirmed to look or behave the same in game.
RoundedThe old value was rounded to fit the new setting's steps, for example to a whole number.
Limited to new rangeThe value was limited to the allowed range. The original stays visible beside it.
ChosenYou picked the value, so no old value was transformed into it.
Needs your choiceNeeds 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:

Evidence categories and how many items each has
CategoryMeaningItems
OfficialA current statement from Valve, cited with its link and the date it was checked.1
User observedSomething the site owner saw or did in the game: a menu screenshot, a console readback or a gameplay test.24
Locally checkedA 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
ProposedA decision about how this site behaves. It is not a claim about the game.3
UnverifiedNot 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.

Full evidence list
IDCategoryFindingSourceChecked
E-VALVE-UPDATEOfficialValve 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-RANGEUser observedLength 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-RANGEUser observedThickness 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-32User observedThickness 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-RANGEUser observedGap 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-TRUEUser observedT style accepts 1 as true
cl_crosshair_t 1 read back as true.
Owner console session
E-OWNER-OUTER-ALPHAUser observedOuter 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-ERRORUser observedOld 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-IDSUser observedEight 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-WORKAROUNDUser observedClassic 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-SCREENSHOTSUser observedMenu 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-CODESUser observedNo new-format codes collected
The owner did not export new-format codes, so new-code encoding stays unavailable.
Owner statement
E-OWNER-NO-MIGRATIONUser observedThe 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-BRANCHUser observedPre-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-1080Locally checkedMeasured 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-1080Locally checkedMeasured 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-1080Locally checkedOld-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-960Locally checkedNew 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-960Locally checkedMeasured 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-960Locally checkedOld-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-SCALINGUnverified4: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-1600Locally checkedMeasured 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-MATCHUser observedOne 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-01User observedImage 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-02User observedImage 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-03User observedImage 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-04User observedImage 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-05User observedImage 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-06User observedImage 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-07User observedImage 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-08User observedImage 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-09User observedImage 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-10User observedImage 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-CONVARSLocally checkedCurrent-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-CONVARSLocally checkedOld 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-LAYOUTLocally checkedCrosshair / 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-HOTFIXLocally checkedThickness 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-HELPLocally checkedSize 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-TOOLTIPLocally checkedMenu 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-COMMANDSLocally checkedConsole 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-SLIDERSLocally checkedMenu 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-LOCALIZATIONLocally checkedMenu 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-PICKERLocally checkedNew 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-UPDATELocally checkedPre-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-NAMESLocally checkedOld 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-MARKERUnverifiedNew-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-PINNEDLocally checkedPinned legacy codec
akiver/csgo-sharecode v5.0.0 at commit 753f16f (MIT). Layout inspected; source archived in research/reference.
Source link
E-FIXTURE-ALocally checkedFixture 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-BLocally checkedFixture 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-SAMPLEProposedEditor 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-FORMULAProposedNo 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-BLOCKSProposedConsole 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-MODELUnverifiedThird-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-RGBUnverifiedOld 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.

Command status for each new setting
SettingCommandStatusOutputEvidence
Stylecl_crosshairstyleVerifiedIncludedE-OWNER-STYLE-IDS, E-GT-CONVARS, E-GT-LOCALIZATION
Color and Transparencycl_crosshaircolor_r
cl_crosshaircolor_g
cl_crosshaircolor_b
DocumentedIncludedE-GT-CONVARS, E-GT-COLOR-PICKER
Color and Transparency (A)cl_crosshaircolor_aDocumentedIncludedE-GT-CONVARS, E-GT-COLOR-PICKER
Outlinecl_crosshair_drawoutlineDocumentedIncludedE-GT-CONVARS, E-GT-UI-LAYOUT
Thicknesscl_crosshair_thicknessVerifiedIncludedE-OWNER-THICKNESS-RANGE, E-GT-CONVARS
Center Dotcl_crosshairdotDocumentedIncludedE-GT-CONVARS, E-GT-UI-LAYOUT
Lengthcl_crosshair_lengthVerifiedIncludedE-OWNER-LENGTH-RANGE, E-GT-CONVARS
Gapcl_crosshair_gapVerifiedIncludedE-OWNER-GAP-RANGE, E-GT-CONVARS
Dynamic Spread Limitcl_crosshair_dynamic_spread_limitDocumentedIncludedE-GT-CONVARS, E-GT-UI-LAYOUT
Split Distancecl_crosshair_dynamic_splitdistDocumentedIncludedE-GT-CONVARS, E-GT-UI-LAYOUT
Inner Split Alphacl_crosshair_dynamic_splitalpha_innermodDocumentedIncludedE-GT-CONVARS, E-GT-UI-LAYOUT
Outer Split Alphacl_crosshair_dynamic_splitalpha_outermodDocumentedIncludedE-GT-CONVARS, E-GT-UI-LAYOUT, E-OWNER-OUTER-ALPHA
Split Size Ratiocl_crosshair_dynamic_maxdist_splitratioDocumentedIncludedE-GT-CONVARS, E-GT-UI-LAYOUT
T Stylecl_crosshair_tDocumentedIncludedE-OWNER-T-TRUE, E-GT-CONVARS, E-GT-UI-LAYOUT
Follow Recoilcl_crosshair_recoilDocumentedIncludedE-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

Version identifiers used by the tool
TargetCS2 update of 22 September 2026 (checked against public data for builds 2000913 and 2000914)
Update date
Target schematarget-2026-09-22.2
Mapping rulesassisted-2026-09-23.1
Legacy code decoderakiver/csgo-sharecode@753f16f (strict wrapper v1)
Size conversion profileslegacy-geometry-1920x1080@0.1.0, validated (1920×1080); legacy-geometry-1280x960@0.1.0, validated (1280×960 (4:3))

Game builds checked

Game builds whose public data was checked
BuildClient versionPatch versionGame files
Update20009131.41.8.2Commit 10f3693
Hotfix20009141.41.8.2Commit 98da94f
Before the update20009081.41.8.1Commit 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.

Legacy decoding fixtures
FixtureCodeRe-encodes identically
ACSGO-FNOLG-fQcPX-V8P7K-VqtAf-ZbJaAYes
BCSGO-WsnnD-eHaMw-QNDf9-oxuDh-ydOUDYes
CSGO-DEFAULTCSGO-6G2cS-WzcxT-fH3dp-Rf7oq-X9oJNYes
CS2-PRE-UPDATE-DEFAULTCSGO-cXRt7-URURp-wo2kd-n4VTi-oTc3KYes
UPSTREAM-1CSGO-Cn37R-YE7vo-pLCAL-aURmZ-z6zkGYes
UPSTREAM-2CSGO-LibdP-VCVEd-ESayK-rSivi-2UBtGYes
UPSTREAM-3CSGO-9JzcN-4dZtA-DdXis-8qz5T-rCnkPYes
UPSTREAM-4CSGO-fCUBz-CBHss-a74RP-SEdO8-mvZpGYes
UPSTREAM-5CSGO-ZrEjo-yASEP-OAdce-Sf44w-rhK5OYes

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).

Measured size rules
SizeOld game (Classic Static)New game (Static Cross)Conversion
Lengthsize × scale pixels, rounded (halves to the even number)Length pixelsnew Length = old pixels
Thicknessthickness × scale pixels, rounded the same way, at least 1Thickness pixels (0 drew nothing)new Thickness = old pixels
Gap4 + gap pixels between a bar and the crossing bar, fractions dropped, not scaledbars start Gap pixels from the centre and never reach inside the crossing barnew 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.

Size conversion profiles
ProfileScreen setupOld scaleStateHeld-back checkOld values covered
legacy-geometry-1920x1080@0.1.01920×10802.25validated13 held-back crosshairs, largest error 0 pxsize 0.5 to 7, thickness 0.3 to 3, gap -5 to 3
legacy-geometry-1280x960@0.1.01280×960 (4:3)2 (the captures allow about 1.9643 to 2.0313)validated13 held-back crosshairs, largest error 0 pxsize 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:

Calibration profile states
StateWhat it means
disabledNever used. Sizes stay unresolved and you choose them.
estimatedUsable after documented evidence and tests, and always labelled as an estimate.
validatedUsable 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.

What the preview shows for each style
StylePreview
Dynamic CrossIllustrative shape at rest. Movement and firing are not simulated.
Dynamic CircleIllustrative 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 CircleSchematic drawing of your chosen settings.
Static CrossSchematic drawing of your chosen settings.
Dynamic Cross (Legacy/Shot Feedback)Illustrative shape at rest. Movement and firing are not simulated.
Dot OnlySchematic drawing of your chosen settings.
Dynamic QuadNothing 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.