A beta Dota2 Bot Script aims to provide better bot game experience
289
stars
391
commits
Lua
primary language
Apr 17, 2026
updated
The most feature-rich custom bot script for Dota 2. Play against bots that actually fight, farm, push, and use items intelligently.
To play: Create a Custom Lobby and select Local Host as the server location. Bots should have names ending with ".OHA" when installed correctly.
Steam Workshop | GitHub | Feature Requests

For FretBots mode (harder bots, neutral items, chatbot): Manual installation guide
| Command | Description |
|---|---|
!pos X | Swap your role with a bot (e.g., !pos 2 for mid) |
!Xpos Y | Reassign bot positions (e.g., !3pos 5 = 3rd bot plays pos 5) |
!pick HERO | Pick a hero (!pick sniper, or /all !pick sniper for enemy) |
!ban HERO | Ban a hero from being picked |
!sp XX | Set bot language (en, zh, ru, ja) |
Use internal hero names if short names overlap (e.g., !pick npc_dota_hero_keeper_of_the_light). Batch commands work too: !pick io; !ban sniper.
Lobby slot order = position assignment (1-5):
| Position | Lane |
|---|---|
| Pos 1 (Carry) + Pos 5 (Hard Support) | Safe Lane |
| Pos 2 (Mid) | Mid Lane |
| Pos 3 (Offlane) + Pos 4 (Soft Support) | Offlane |
Customize picks, bans, and roles in Customize/general.lua.
| What | Where |
|---|---|
| General settings (picks, bans, names, roles) | Customize/general.lua |
| Per-hero settings (items, skills) | Customize/hero/viper.lua |
| FretBots difficulty tuning | FretBots/SettingsDefault.lua |
Permanent customization (survives Workshop updates): Copy the Customize folder to <Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/game/Customize>.
Supports most game modes (10+) . See full compatibility discussion.
You can start a bot game directly from the console without network or clicking UI buttons — useful for offline play, LAN parties, or quick testing. See play offline setup guide.
This project uses Claude Code for AI-assisted development. The CLAUDE.md file provides task-specific instructions for common operations like patch updates, hero fixes, and adding new heroes.
| Document | Description |
|---|---|
| docs/ARCHITECTURE.md | Complete codebase architecture, file map, naming conventions, all systems explained |
| docs/PATCH_UPDATE_GUIDE.md | Step-by-step runbook for updating when a new Dota 2 patch drops |
| docs/BOT_API_REFERENCE.md | Comprehensive Valve bot scripting API reference with examples |
| CLAUDE.md | AI coding assistant guide - common tasks, rules, and workflows |
Dota 2 bot scripts use internal code names for heroes, items, and abilities. These are different from the display names you see in-game. When updating builds or fixing bugs, always verify against authoritative sources:
| Resource | What It Contains |
|---|---|
| Liquipedia Cheats Page (Item Names) | Authoritative list of item_* internal names for all items including neutral items |
| d2vpkr npc_abilities.txt | All ability internal names and KV data |
| Dota 2 Patch Data API | Official patch notes in machine-readable format |
| Modifier Names (Valve Wiki) | modifier_* names for buff/debuff detection |
root: <Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts>
|
+-- bots/ All bot Lua scripts
| +-- hero_selection.lua Hero picking/banning
| +-- bot_generic.lua Per-bot entry point
| +-- ability_item_usage_generic.lua Ability/item usage for all heroes
| +-- item_purchase_generic.lua Item purchase state machine
| +-- mode_*_generic.lua Mode scripts (farm, push, defend, roam, etc.)
| +-- mode_assemble_generic.lua Human ping response
| |
| +-- BotLib/ Per-hero builds (items, skills, ability logic)
| | +-- hero_axe.lua, hero_crystal_maiden.lua, ...
| |
| +-- FunLib/ Core libraries and utilities
| | +-- jmz_func.lua Main utility library
| | +-- aba_item.lua Item system
| | +-- aba_skill.lua Skill/ability system
| | +-- aba_push.lua Push logic
| | +-- aba_defend.lua Defend logic
| | +-- localization.lua Chat translations (en/zh/ru/ja)
| |
| +-- FretBots/ Enhanced difficulty mode
| | +-- SettingsDefault.lua Difficulty tuning
| | +-- SettingsNeutralItemTable.lua Neutral items + enchantments
| |
| +-- Customize/ User-editable settings
| +-- general.lua Team-level settings
| +-- hero/ Per-hero overrides
|
+-- typescript/ TypeScript source for TS-generated Lua files
| +-- bots/ TS versions (compiled to bots/ via tstl)
| +-- post-process/ Post-compilation scripts
|
+-- game/ Valve defaults + permanent customization location
| +-- Customize/ Copy your Customize/ here to survive updates
|
+-- docs/ Developer documentation
+-- ARCHITECTURE.md
+-- PATCH_UPDATE_GUIDE.md
+-- BOT_API_REFERENCE.md
| Resource | Description |
|---|---|
| Dota2 AI Development Tutorial | Comprehensive guide by adamqqq |
| Valve Bot Scripting Intro | Official Valve documentation |
| Lua Bot APIs (moddota) | Community API docs |
| Liquipedia Cheats (Internal Names) | Item/hero/ability code names |
| npc_abilities.txt | Ability metadata |
| Enums & APIs (moddota) | Enum reference |
| Modifier Names | Buff/debuff modifier names |
Built on top of Valve's default bots + contributions from many talented authors:
Lua
92.9%
TypeScript
6.9%
A beta Dota2 Bot Script aims to provide better bot game experience
289
stars
391
commits
Lua
primary language
Apr 17, 2026
updated
The most feature-rich custom bot script for Dota 2. Play against bots that actually fight, farm, push, and use items intelligently.
To play: Create a Custom Lobby and select Local Host as the server location. Bots should have names ending with ".OHA" when installed correctly.
Steam Workshop | GitHub | Feature Requests

For FretBots mode (harder bots, neutral items, chatbot): Manual installation guide
| Command | Description |
|---|---|
!pos X | Swap your role with a bot (e.g., !pos 2 for mid) |
!Xpos Y | Reassign bot positions (e.g., !3pos 5 = 3rd bot plays pos 5) |
!pick HERO | Pick a hero (!pick sniper, or /all !pick sniper for enemy) |
!ban HERO | Ban a hero from being picked |
!sp XX | Set bot language (en, zh, ru, ja) |
Use internal hero names if short names overlap (e.g., !pick npc_dota_hero_keeper_of_the_light). Batch commands work too: !pick io; !ban sniper.
Lobby slot order = position assignment (1-5):
| Position | Lane |
|---|---|
| Pos 1 (Carry) + Pos 5 (Hard Support) | Safe Lane |
| Pos 2 (Mid) | Mid Lane |
| Pos 3 (Offlane) + Pos 4 (Soft Support) | Offlane |
Customize picks, bans, and roles in Customize/general.lua.
| What | Where |
|---|---|
| General settings (picks, bans, names, roles) | Customize/general.lua |
| Per-hero settings (items, skills) | Customize/hero/viper.lua |
| FretBots difficulty tuning | FretBots/SettingsDefault.lua |
Permanent customization (survives Workshop updates): Copy the Customize folder to <Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/game/Customize>.
Supports most game modes (10+) . See full compatibility discussion.
You can start a bot game directly from the console without network or clicking UI buttons — useful for offline play, LAN parties, or quick testing. See play offline setup guide.
This project uses Claude Code for AI-assisted development. The CLAUDE.md file provides task-specific instructions for common operations like patch updates, hero fixes, and adding new heroes.
| Document | Description |
|---|---|
| docs/ARCHITECTURE.md | Complete codebase architecture, file map, naming conventions, all systems explained |
| docs/PATCH_UPDATE_GUIDE.md | Step-by-step runbook for updating when a new Dota 2 patch drops |
| docs/BOT_API_REFERENCE.md | Comprehensive Valve bot scripting API reference with examples |
| CLAUDE.md | AI coding assistant guide - common tasks, rules, and workflows |
Dota 2 bot scripts use internal code names for heroes, items, and abilities. These are different from the display names you see in-game. When updating builds or fixing bugs, always verify against authoritative sources:
| Resource | What It Contains |
|---|---|
| Liquipedia Cheats Page (Item Names) | Authoritative list of item_* internal names for all items including neutral items |
| d2vpkr npc_abilities.txt | All ability internal names and KV data |
| Dota 2 Patch Data API | Official patch notes in machine-readable format |
| Modifier Names (Valve Wiki) | modifier_* names for buff/debuff detection |
root: <Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts>
|
+-- bots/ All bot Lua scripts
| +-- hero_selection.lua Hero picking/banning
| +-- bot_generic.lua Per-bot entry point
| +-- ability_item_usage_generic.lua Ability/item usage for all heroes
| +-- item_purchase_generic.lua Item purchase state machine
| +-- mode_*_generic.lua Mode scripts (farm, push, defend, roam, etc.)
| +-- mode_assemble_generic.lua Human ping response
| |
| +-- BotLib/ Per-hero builds (items, skills, ability logic)
| | +-- hero_axe.lua, hero_crystal_maiden.lua, ...
| |
| +-- FunLib/ Core libraries and utilities
| | +-- jmz_func.lua Main utility library
| | +-- aba_item.lua Item system
| | +-- aba_skill.lua Skill/ability system
| | +-- aba_push.lua Push logic
| | +-- aba_defend.lua Defend logic
| | +-- localization.lua Chat translations (en/zh/ru/ja)
| |
| +-- FretBots/ Enhanced difficulty mode
| | +-- SettingsDefault.lua Difficulty tuning
| | +-- SettingsNeutralItemTable.lua Neutral items + enchantments
| |
| +-- Customize/ User-editable settings
| +-- general.lua Team-level settings
| +-- hero/ Per-hero overrides
|
+-- typescript/ TypeScript source for TS-generated Lua files
| +-- bots/ TS versions (compiled to bots/ via tstl)
| +-- post-process/ Post-compilation scripts
|
+-- game/ Valve defaults + permanent customization location
| +-- Customize/ Copy your Customize/ here to survive updates
|
+-- docs/ Developer documentation
+-- ARCHITECTURE.md
+-- PATCH_UPDATE_GUIDE.md
+-- BOT_API_REFERENCE.md
| Resource | Description |
|---|---|
| Dota2 AI Development Tutorial | Comprehensive guide by adamqqq |
| Valve Bot Scripting Intro | Official Valve documentation |
| Lua Bot APIs (moddota) | Community API docs |
| Liquipedia Cheats (Internal Names) | Item/hero/ability code names |
| npc_abilities.txt | Ability metadata |
| Enums & APIs (moddota) | Enum reference |
| Modifier Names | Buff/debuff modifier names |
Built on top of Valve's default bots + contributions from many talented authors:
Lua
92.9%
TypeScript
6.9%