Port made by the DOS.Zone team: dos.zone/reVCDOS
Official implementation: GitHub
Fast Start: Run the server in one click using Google Colab. Click the badge above, run the cell, and use the "Launch Game" button. The tunnel password will be copied automatically — just paste it on the page that opens.
Web-based port of GTA: Vice City running in browser via WebAssembly.
- Colab or Docker or Python 3.8+ or PHP 8.0+
- Dependencies from
requirements.txt
-
Clone the repository:
git clone https://github.com/Lolendor/reVCDOS.git cd reVCDOS -
Configure Assets (Optional):
By default, the project uses DOS Zone CDN — no local assets needed. For offline hosting you can use:
- Packed archive (
--packedor--unpacked) — single.binfile with all assets - Local folders (
--vcsky_local,--vcbr_local) — unpacked asset directories - Cache mode (
--vcsky_cache,--vcbr_cache) — download from CDN once, serve locally after
- Packed archive (
-
Launch the Application: Choose one of the setup methods below:
- Docker (Recommended for most users) — fast and isolated.
- PHP — Simply upload the folder to your web server (FTP/Hosting).
- Manual Installation — for development and customization.
The easiest way to get started is using Docker Compose:
PACKED=https://folder.morgen.qzz.io/revcdos.bin docker compose up -d --buildTo configure server options via environment variables:
# Set port, enable auth and custom saves
IN_PORT=3000 AUTH_LOGIN=admin AUTH_PASSWORD=secret CUSTOM_SAVES=1 docker compose up -d --build| Environment Variable | Description |
|---|---|
OUT_HOST |
External host (default: 0.0.0.0) |
OUT_PORT |
External port (default: 8000) |
IN_PORT |
Internal container port (default: 8000) |
AUTH_LOGIN |
HTTP Basic Auth username |
AUTH_PASSWORD |
HTTP Basic Auth password |
CUSTOM_SAVES |
Enable local saves (set to 1) |
VCSKY_LOCAL |
Serve vcsky from local directory (set to 1, or path like /data/vcsky) |
VCBR_LOCAL |
Serve vcbr from local directory (set to 1, or path like /data/vcbr) |
VCSKY_URL |
Custom vcsky proxy URL |
VCBR_URL |
Custom vcbr proxy URL |
VCSKY_CACHE |
Cache vcsky files locally while proxying (set to 1) |
VCBR_CACHE |
Cache vcbr files locally while proxying (set to 1) |
PACKED |
Serve from packed archive (filename or URL, e.g., revcdos.bin) |
UNPACKED |
Unpack archive to local folders (filename or URL, auto-sets vcsky/vcbr paths) |
PACK |
Pack a folder and serve from resulting archive (folder path or MD5 hash) |
- Install Python dependencies:
pip install -r requirements.txt- Start the server:
python server.py --packed https://folder.morgen.qzz.io/revcdos.binServer starts at http://localhost:8000
If you want to run the game from a hosted environment with PHP 8.0 or above, just copy the contents of this repo to your desired hosting
By default the index.php and .htaccess will get the job done.
| Option | Type | Default | Description |
|---|---|---|---|
--port |
int | 8000 | Server port |
--custom_saves |
flag | disabled | Enable local save files (saves router) |
--login |
string | none | HTTP Basic Auth username |
--password |
string | none | HTTP Basic Auth password |
--vcsky_local |
string/flag | disabled | Serve vcsky from local directory. Use flag for vcsky/ or specify path |
--vcbr_local |
string/flag | disabled | Serve vcbr from local directory. Use flag for vcbr/ or specify path |
--vcsky_url |
string | https://cdn.dos.zone/vcsky/ |
Custom vcsky proxy URL |
--vcbr_url |
string | https://br.cdn.dos.zone/vcsky/ |
Custom vcbr proxy URL |
--vcsky_cache |
flag | disabled | Cache vcsky files locally while proxying |
--vcbr_cache |
flag | disabled | Cache vcbr files locally while proxying |
--packed |
string | disabled | Serve from packed archive file. Accepts file path or URL |
--unpacked |
string | disabled | Unpack archive to unpacked/{hash}/ and serve from there. Accepts file path or URL |
--pack |
string | disabled | Pack a folder and serve from resulting {hash}.bin archive. Accepts folder path or MD5 hash |
Examples:
# Start on custom port
python server.py --port 3000
# Enable local saves
python server.py --custom_saves
# Enable HTTP Basic Authentication
python server.py --login admin --password secret123
# Use local vcsky and vcbr files
python server.py --vcsky_local --vcbr_local
# Cache files locally while proxying (hybrid mode) (recommended)
python server.py --vcsky_cache --vcbr_cache
# Serve from packed archive (local file)
python server.py --packed revcdos.bin
# Serve from packed archive (download from URL if not present)
python server.py --packed https://example.com/revcdos.bin
# Unpack archive and serve from unpacked files
python server.py --unpacked revcdos.bin
# Stream-unpack from URL (downloads and unpacks simultaneously)
python server.py --unpacked https://example.com/revcdos.bin
# Pack a folder and serve from the resulting archive
python server.py --pack /path/to/assets # Creates {folder_hash}.bin
# Pack from existing unpacked folder by MD5 hash
python server.py --pack a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 # Uses unpacked/{hash}/Note: HTTP Basic Auth is only enabled when both
--loginand--passwordare provided.
Note: By default, vcsky and vcbr are proxied from DOS Zone CDN. Use
--vcsky_localand--vcbr_localflags to serve files from local directories instead. You can optionally specify a custom path.
Note: Use
--vcsky_cacheand--vcbr_cacheto cache proxied files locally. Files are downloaded once and served from local storage on subsequent requests.
Note:
--packedserves files directly from a compressed archive without unpacking (faster and more compressed).--unpackedextracts the archive once and serves from local files (if you want edit assets).
Note: When using URL with
--unpacked, the archive is streamed and unpacked simultaneously during download usingdownloader_brotli.py.
Note: You can pass a raw MD5 hash (32 hex characters) to
--unpackedto use an existing unpacked folder without needing the original archive. Example: if you haveunpacked/a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6/, you can start the server with--unpacked a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6.
Note:
--packcreates a packed archive from a folder containing subfolders (likevcsky/andvcbr/). Each subfolder is packed sequentially: the first creates the archive, subsequent ones are appended. After packing, the server automatically uses the created archive via--packedmode.
| Parameter | Values | Description |
|---|---|---|
lang |
en, ru |
Game language |
cheats |
1 |
Enable cheat menu (F3) |
request_original_game |
1 |
Request original game files before play |
fullscreen |
0 |
Disable auto-fullscreen |
max_fps |
1-240 |
Limit frame rate (e.g., 60 for 60 FPS) |
configurable |
1 |
Show configuration UI before play button |
Examples:
http://localhost:8000/?lang=ru— Russian versionhttp://localhost:8000/?lang=en&cheats=1— English + cheatshttp://localhost:8000/?configurable=1— Show settings UI before play
├── server.py # FastAPI proxy server
├── index.php # PHP proxy server
├── .htaccess # Apache config for PHP
├── requirements.txt # Python dependencies
├── revcdos.bin # Packed archive (optional)
├── additions/ # Server extensions
│ ├── auth.py # HTTP Basic Auth middleware
│ ├── cache.py # Proxy caching and brotli decompression
│ ├── packed.py # Packed archive serving module
│ └── saves.py # Local saves router
├── utils/ # Utility modules
│ ├── packer_brotli.py # Archive packer with brotli compression
│ └── downloader_brotli.py # Archive packer with brotli compression
├── unpacked/ # Auto-created by --unpacked flag
│ └── {md5_hash}/ # Unpacked files organized by source hash
│ ├── vcsky/ # Decompressed game assets
│ └── vcbr/ # Brotli-compressed binaries
├── dist/ # Game client files
│ ├── index.html # Main page
│ ├── game.js # Game loader
│ ├── index.js # Module loader
│ ├── GamepadEmulator.js # Touch controls
│ ├── idbfs.js # IndexedDB filesystem
│ ├── jsdos-cloud-sdk.js # Cloud saves (DOS Zone)
│ ├── jsdos-cloud-sdk-local.js # Local saves (--custom_saves)
│ └── modules/ # WASM modules
│ ├── runtime.js # WASM runtime initialization
│ ├── loader.js # Asset/package loading
│ ├── fs.js # Virtual filesystem
│ ├── audio.js # Audio system
│ ├── graphics.js # Rendering pipeline
│ ├── events.js # Input events handling
│ ├── fetch.js # Network requests (Real-time asset streaming)
│ ├── syscalls.js # System calls
│ ├── main.js # Main entry point
│ ├── cheats.js # Cheat engine (F3)
│ ├── asm_consts/ # Language-specific ASM constants
│ │ ├── en.js
│ │ └── ru.js
│ └── packages/ # Language-specific data packages
│ ├── en.js
│ └── ru.js
├── vcbr/ # Brotli-compressed game data (optional)
│ ├── vc-sky-en-v6.data.br
│ ├── vc-sky-en-v6.wasm.br
│ ├── vc-sky-ru-v6.data.br
│ └── vc-sky-ru-v6.wasm.br
└── vcsky/ # Decompressed assets (optional)
├── fetched/ # English version files
│ ├── data/
│ ├── audio/
│ ├── models/
│ └── anim/
└── fetched-ru/ # Russian version files
├── data/
├── audio/
└── ...
- 🎮 Gamepad emulation for touch devices
- ☁️ Cloud saves via js-dos key
- 💾 Local saves (with
--custom_savesflag) - 🌍 English/Russian language support
- 🔧 Built-in cheat engine (memory scanner, cheats)
- 📱 Mobile touch controls
When local saves are enabled (--custom_saves flag), enter any 5-character identifier in the "js-dos key" input field on the start page. This identifier will be used to store your saves in the saves/ directory on the server.
Example: Enter mykey or 12345 — saves will be stored as mykey_vcsky.saves or 12345_vcsky.saves.
Touch controls appear automatically on mobile devices. Virtual joysticks for movement and camera, context-sensitive action buttons.
Enable with ?cheats=1, press F3 to open menu:
- Memory scanner (find/edit values)
- All classic GTA VC cheats
- AirBreak (noclip mode)
MIT. Do what you want (but credit the port authors and me). Not affiliated with Rockstar Games.
Authors: DOS Zone (@specialist003, @caiiiycuk, @SerGen)
Deobfuscated by: @Lolendor
Russian translation: GamesVoice
Added by the community:
- PHP Support by Rohamgames
Support me
If you find this project useful:
- TON / USDT (TON)
UQAyBchGEKi9NnNQ3AKMQMuO-SGEhMIAKFAbkwwrsiOPj9Gy - ETH / USDT (ERC-20)
0x69Ec02715cF65538Bb03725F03Bd4c85D33F8AC0 - TRX / USDT (TRC-20)
THgNWT9MGW52tF8qFHbAWN25UR6WTeLDMY