Keep the Practice · Rate settings

KTP Netcode Guide

Recommended rate settings for all KTP servers: Atlanta · Dallas · Denver · New York · Chicago
Released July 9, 2026 · by Nein_ · verified against the live fleet config & KTPCvarChecker 7.29
Read this first. These are recommendations, not gospel — your mileage may vary with your connection, hardware, and monitor. For every setting this page gives you the engine default, the server-allowed range, my recommendation and the reasoning, plus my own personal config and configs from other players that work for them. Treat the recommended block as the baseline and the allowed ranges as your room to experiment.

Some context on why the numbers changed: the servers this community played on for close to twenty years were 500-tick Windows boxes. The current fleet is 1500-systic Linux servers targeting a constant 1000 fps, running on a custom engine stack (KTP-ReHLDS) that has been in production since November 2025 — the entire life of the current server fleet. Different platform, different tick behavior, different optimal client settings.

I keep this page updated in good faith: whenever a server-side change affects anything relevant to hit registration, the recommendations here get re-verified against the live fleet config. I'm doing my best to get accurate information to you as fast as I can — if something here doesn't match what you see in-game, tell me.

Recommended settings

Paste this into your userconfig.cfg or run it in console. The server auto-corrects the locked values; the rest are the best choices inside the allowed ranges.

rate 100000 // locked by the server; anything else is auto-corrected
cl_updaterate 102 // the true client maximum (the game caps at 102 internally)
cl_cmdrate 101 // a hair above fps_max (engine renders fps_max+1); higher cap? round up: 240 → 250
ex_interp 0.01 // one update interval of buffer, shows enemies closest to true position
fps_max 100 // full physics fidelity; use your monitor refresh (144/240) if higher
cl_lc 1 // lag compensation for your shots; 0 means leading by your full ping
cl_lw 1 // client weapon prediction; 0 also disables lag compensation
cl_fixtimerate 7.5 // clock-sync speed (default); only change if weapons skip — try fps_max/10 (see card)
cl_smoothtime 0.01 // near-instant prediction-error correction; 0.1 = high-ping comfort option

If you run a frame cap above 100, raise cl_cmdrate to match it (fps_max 240 pairs with cl_cmdrate 250).

Heads up: cl_filterstuffcmd must be 0 so the server can correct your cvars. Locked values like rate are enforced by KTPCvarChecker; fighting them in your config just causes correction churn.

What each setting does

rate

default 30000locked at 100000set 100000

Maximum bytes/sec the server may send you. KTP locks this to exactly 100000 for every player (sv_minrate = sv_maxrate = 100000). Peak match traffic at our update rates is ~96 KB/s, so 100 KB/s never chokes, and identical bandwidth budgets remove rate variance as a hit-registration variable. The engine itself supports up to 1 MB/s (KTP-ReHLDS raised the 2004-era cap), kept as headroom for HLTV and future updaterate increases.

cl_updaterate

default 20allowed 100-120set 102

How many entity updates per second you request from the server. The game's client DLL hard-caps processing at 102 and no workaround exists, so 103-120 passes the check but does nothing. At 102 you receive a fresh snapshot every ~9.8 ms, the physical maximum your client can use.

cl_cmdrate

default 30allowed 100-1000set 101 (or a bit above your fps_max)

How many command packets (your movement, aim, and button presses) you send per second. This is a ceiling, not a scheduler: the client sends at most one packet per rendered frame, so your real send rate is always min(your fps, cl_cmdrate). Below your frame rate it throttles input; above it, the excess does nothing. The floor of 100 keeps input latency at ≤10 ms per packet; engine research indicates the Steam client caps effective cmdrate near ~100 anyway, so 101 covers most players.

Why "a bit above" and not exactly equal? The frame limiter's off-by-one (see the fps_max card) means a cap of 240 actually renders ~241 fps — so cl_cmdrate 240 would sit one below your true frame rate, the single worst value, quietly throttling about one packet a second. Since overshoot is free, round up with margin: fps_max 100 → 101, fps_max 240 → 250. Nothing is magic about the exact number — 242, 250, or 300 behave identically at a 240 cap; anything comfortably above your real frame rate is correct.

ex_interp

default 0.1allowed 0.01-0.05set 0.01

How far in the past (seconds) your client renders other players, so it always has two snapshots to interpolate between. At updaterate 102 a snapshot arrives every ~9.8 ms, and 0.01 is the smallest buffer that covers a full interval: you see enemies as close to their true position as possible, and lag compensation rewinds the minimum amount. The stock default of 0.1 shows you players 100 ms in the past, ten times more than needed here. The 0.05 cap blocks exploitative high-interp values.

When is raising it justified?

Only for loss or jitter on your own connection; check net_graph 1. Each +0.01 buys one more update interval of cushion at the cost of seeing everything ~10 ms later. That costs you reaction time, not hit registration: the server rewinds by ping + interp, so you still hit what you see.

Your connectionex_interp
Clean (0% loss, stable ping)0.01
Loss ~1%+ or enemies stutter at 0.010.02 (rides through a single lost packet invisibly)
Chronically jittery route (e.g. SA/EU long-haul)0.02-0.03 (covers uneven packet arrival)
Above 0.03No legitimate case. The 0.05 cap is a ceiling, not a target.

Ping alone, yours or your opponents', is not a reason. Latency delays the update stream uniformly (a stable 160 ms connection still gets a snapshot every ~9.8 ms) and lag compensation accounts for it. High-ping players often do need 0.02, but that's because long routes tend to be jittery, not because of the ping number. Raising interp also does nothing against high-ping opponents: their staleness is baked in server-side before your packet is ever sent, the buffer applies to every entity equally, and a choppy opponent's warpy movement just plays back the same, only later. The "shot me behind cover" effect is the shooter's rewind window (their ping plus their interp, capped server-side), and no setting of yours changes it.

fps_max

default 72allowed 60-750set 100 (or monitor refresh)

Client frame cap. GoldSrc's internal physics processing tops out around ~100 fps; frames above that buy rendering smoothness on high-refresh monitors, not physics fidelity, and the server's 1000 Hz lag compensation is authoritative regardless. 100 is full competitive fidelity. On a 144/240 Hz display, match your refresh and raise cl_cmdrate with it.

Why not 99.5? The old convention comes from an off-by-one in GoldSrc's frame limiter: it gates frames at 1/(fps_max + 1), so asking for 100 actually runs about 101. Back when leagues required staying at or under 100 fps, players set 99.5 so the overshoot landed on a true 100. Neither reason survives on KTP servers: the allowed range goes to 750, and nothing in the game cares whether your client renders 100 or 101 when the server simulates at 1000 Hz and its lag compensation decides what hits. A plain 100 is fine.

One exception — automatic-weapon stutter: separately from the 99.5 history, round fps caps are reported to interact badly with automatic-weapon fire timing on some setups. If your autos stutter, try a non-round cap (143.5 instead of 144) together with the cl_fixtimerate guidance below.

cl_lc & cl_lw

defaults 1not enforcedkeep both 1

cl_lc 1 enables server-side lag compensation: when you fire, the server rewinds opponents to where they were on your screen. With 0 you must lead targets by your full ping. cl_lw 1 enables client-side weapon prediction (instant fire feedback); setting it to 0 also disables lag compensation. Both became optional in 2026 after an engine audit confirmed that 0 only handicaps you. There is almost never a reason to change them.

cl_fixtimerate

default 7.5not enforcedkeep 7.5 — if weapons skip, try fps_max / 10

How aggressively your client corrects its local clock toward the server's timestamp, in ms of correction per frame. This has no competitive impact: clock sync happens either way. A mismatched client/server clock is, however, a known cause of weapon fire stutter in GoldSrc — shots firing, skipping, then firing again, most noticeable on automatics like the BAR — and the correction jumps themselves can make the viewmodel animation skip. This cvar used to be locked to 7.5 by the cvar checker; it's now unlocked so players can tune it.

If (and only if) you get weapon skipping: try scaling it to your frame cap — cl_fixtimerate = fps_max / 10:

fps_max 100 → cl_fixtimerate 10
fps_max 143.5 → cl_fixtimerate 14.4
fps_max 200 → cl_fixtimerate 20

Some players instead report smoother viewmodels lowering it toward 0 (gentler corrections). Honest status: this one is player-report territory, not settled engine science — treat it as an experiment, keep whichever value is smooth for you, and tell Nein_ what worked so this section improves. If you have no skipping, leave it at 7.5.

cl_smoothtime

default 0.1not enforcedset 0.01

When the server disagrees with where your client predicted you are (teammate bumps, knockback, edge landings), this is how long in seconds the correction is visually blended. During that window your rendered position lags the server-authoritative one, which creates a small aim discrepancy. 0.01 blends the correction over about one update interval: near-instant accuracy without a single-frame snap. It's the same smallest-honest-buffer logic as ex_interp, and the old league convention. High-ping players (100 ms+) can keep the 0.1 default for comfort, since their corrections are larger and more frequent.

How it fits together

cl_cmdrate cl_updaterate (you → server) (server → you) ┌──────────┐ UDP packets ┌──────────┐ │ CLIENT │ ──────────────────► │ SERVER │ │ │ │ (1000 Hz) │ │ your PC │ ◄─────────────────── │ │ └──────────┘ UDP packets └──────────┘ you send: movement, aim, server sends: where everyone is, buttons, weapon actions hits, scores, game events

When your shot arrives, the server computes your effective latency (ping + ex_interp), rewinds every opponent to where they were on your screen at that moment (up to 500 ms), and runs the shot against those positions. If your crosshair was on the target on your screen, it hits. That's why the settings above aim for the smallest honest buffers: less rewind, fewer "how did that hit me" moments on both ends.

June 2026 change: lag compensation now uses your single most recent latency sample (sv_unlagsamples 1) instead of averaging a window of samples. The old averaging smeared stale ping history into the rewind, and one ping spike inside the window could silently zero out compensation for that shot. One fresh sample tracks your actual current ping.

KTP server settings (for reference)

You don't set these. They're the fleet-wide server config your client talks to.

SettingValuePurpose
sys_ticrate1500Requested tick ceiling; achieves ~1000 real fps of physics
sv_maxupdaterate / sv_minupdaterate120 / 100Entity update band offered to clients
sv_maxcmdrate / sv_mincmdrate500 / 100Command packet band accepted from clients
sv_maxrate / sv_minrate100000 / 100000Bandwidth locked: identical budget for every player
sv_unlag / sv_maxunlag1 / 0.5Lag compensation on, max 500 ms rewind
sv_unlagsamples1Latest latency sample used: tracks your real current ping

Player configs

What specific KTP players actually run. The recommended block above is the baseline; these show the personal variations experienced players make inside the allowed ranges — mostly frame caps matched to monitors, with cl_cmdrate raised alongside.

Nein_

KTP admin240 Hz monitor
rate 100000
cl_updaterate 100
cl_cmdrate 250
ex_interp 0.01
fps_max 287.5 // high cap for render smoothness; cmdrate 250 rides along
cl_lc 1
cl_lw 1
cl_fixtimerate 7.5 // engine default (not set in config)
cl_smoothtime 0.01

Sean

Seanality
rate 100000
cl_updaterate 102
cl_cmdrate 105
ex_interp 0.02 // one extra interval of cushion (see the interp ladder above)
fps_max 400
cl_lc 1
cl_lw 1
cl_fixtimerate 10
cl_smoothtime 0.02

jrod

rate 100000
cl_updaterate 101
cl_cmdrate 725 // matched to the frame cap, per the guidance above
ex_interp 0.01
fps_max 719
cl_lc 1
cl_lw 1
cl_fixtimerate 7.5 // engine default (not set in config)
cl_smoothtime 0.1 // engine default — the comfort option

Your config here?

Want your settings featured (and sanity-checked)? DM Nein_ on Discord.

Troubleshooting

Players are teleporting / stuttering
My shots don't register
net_graph shows choke
net_graph shows loss
My weapon animations skip / stutter (shots fire, skip, fire again — worst on automatics like the BAR)