---
title: "Fix: SteamCMD 'Timeout downloading' Errors"
excerpt: "Why SteamCMD hangs with 'Timeout downloading. Retrying', the app 90 legacy-depot trap for CS 1.6, and the retry, platform and CDN fixes that finish the install."
category: "errors"
tags: "steamcmd, download"
image: ""
read_time: "8 min read"
---
<p>You run SteamCMD to install the CS 1.6 dedicated server (app <code>90</code>) and it stalls with <code>Timeout downloading. Retrying...</code>, loops forever, or bails with <code>Error! App '90' state is 0x606 after update job</code>. SteamCMD is generally reliable, so a persistent timeout is nearly always one of a few specific things: a flaky CDN edge, the notorious app 90 legacy-depot behaviour, or a platform/architecture mismatch. Here is how to get it to finish.</p><h2>1. Just retry — it is often a bad CDN edge</h2><p>The first and dullest fix works more often than it should. <code>Timeout downloading</code> frequently means Steam handed you a slow or dead content-server edge. Simply re-run the exact same command; SteamCMD resumes from where it stopped and usually gets a different, healthy edge:</p><pre>./steamcmd.sh +force_install_dir ./hlds +login anonymous +app_update 90 validate +quit</pre><p>If it times out again, run it a few more times — each retry resumes progress rather than restarting. Many "broken" installs finish on the third attempt with zero config changes.</p><h2>2. Handle the app 90 legacy-depot trap</h2><p>CS 1.6's app <code>90</code> is old and pulls legacy depots that behave badly with a single <code>app_update 90</code>. The classic symptom is it downloading, timing out, and re-downloading the base HLDS depot in a loop, never reaching the Counter-Strike content. The reliable workaround is to install the base first, then the mod depots, running the update repeatedly until the state settles:</p><pre>./steamcmd.sh +force_install_dir ./hlds +login anonymous +app_update 90 +quit
# run it again; app 90 often needs several passes to fully settle
./steamcmd.sh +force_install_dir ./hlds +login anonymous +app_update 90 validate +quit</pre><p>Do not add <code>validate</code> on the very first pass if it keeps looping — validate forces a re-check that can restart the loop. Get a clean pass first, then validate once at the end.</p><h2>3. Force the platform type</h2><p>On a 64-bit Linux box SteamCMD sometimes fetches the wrong platform depot and stalls. Pin it to the platform the CS 1.6 server actually needs:</p><pre>./steamcmd.sh +@sSteamCmdForcePlatformType linux +force_install_dir ./hlds +login anonymous +app_update 90 validate +quit</pre><p>You can substitute <code>windows</code> if you are deliberately pulling the Windows binaries under Wine. Setting the platform explicitly stops SteamCMD guessing and re-fetching the wrong depot, which is a frequent cause of an install that downloads a large amount and then loops back to the start without ever completing.</p><h2>4. Fix the environment causing timeouts</h2><p>If retries never help, the timeout is your side, not Steam's:</p><ul><li><strong>32-bit libraries missing</strong> — SteamCMD is 32-bit. On a 64-bit host without <code>lib32gcc</code>/<code>lib32stdc++</code> it can fail oddly during download. Install the i386 libs for your distro.</li><li><strong>Disk full</strong> — a partition running out of space mid-download reads as a timeout/loop. Check <code>df -h</code>.</li><li><strong>Firewall/proxy</strong> — a restrictive outbound firewall throttling Steam CDN traffic causes exactly this stall. Confirm the box has clean outbound HTTP to Steam content servers.</li><li><strong>Ancient SteamCMD</strong> — a stale binary can loop. Delete the SteamCMD directory and re-extract a fresh copy, letting it self-update on first run.</li></ul><h2>5. Point it at a fresh install dir</h2><p>A partially-corrupted download directory can make every subsequent run time out trying to reconcile broken state. Move the old directory aside and let SteamCMD build a clean one:</p><pre>mv hlds hlds.broken
./steamcmd.sh +force_install_dir ./hlds +login anonymous +app_update 90 validate +quit</pre><p>A clean directory removes any half-written depot metadata that was confusing the updater.</p><h2>Troubleshooting</h2><ul><li><strong><code>Timeout downloading. Retrying</code> loops forever</strong> — bad CDN edge or app 90 legacy behaviour. Re-run several times; run without <code>validate</code> first, then validate once at the end.</li><li><strong><code>Error! App '90' state is 0x606</code></strong> — the update did not complete. Re-run <code>app_update 90</code> until it reports up to date, then <code>validate</code>.</li><li><strong>Fails immediately, not a timeout</strong> — missing 32-bit libs or a stale SteamCMD binary. Install i386 libs and re-extract SteamCMD.</li><li><strong>Downloads then loops re-downloading the base depot</strong> — the classic app 90 trap. Run multiple passes; do not validate until it settles.</li><li><strong>Stalls at the same percentage every time</strong> — disk full or a proxy cutting the connection. Check <code>df -h</code> and outbound connectivity.</li></ul><h2>Verification</h2><p>A finished install prints <code>Success! App '90' fully installed</code> and drops the server files into your install dir. Confirm the launch binary and <code>cstrike/</code> exist, then start the server once to prove the content is complete:</p><pre>./hlds_run -game cstrike +map de_dust2 +maxplayers 12</pre><p>If it reaches a running console and loads the map, the download completed cleanly. From here, layer your <a href="/tutorials/setup-server-cfg-cs16">server.cfg</a> and content on a known-good base rather than fighting a half-installed one.</p>









