GHOSTWORK
Your terminal is your weapon. Your rig is your character sheet.
Your operating system is your class.
A single-player hacking simulation where you build your rig, choose your OS, and breach procedurally generated networks using real methodology — all through a fully diegetic CRT terminal interface.
$ Game Pillars
Five design principles govern every system in GHOSTWORK. No feature ships unless it serves at least one pillar.
-
01
Accessible Depth — Three tiers of realism let anyone play. A script kiddie sees guided prompts; an APT operator sees raw protocol. The simulation underneath is identical.
-
02
Authentic Methodology — Real cybersecurity methodology as core gameplay: reconnaissance, scanning, enumeration, exploitation, privilege escalation, and post-exploitation. Every tool and workflow reflects actual practice.
-
03
Agency Through Systems — Interconnected systems create emergent strategy. Hardware, heat, economy, factions, and contracts interact in ways the player discovers, not ways the designer prescribes.
-
04
The Interface Is The Game — No menus floating over the game world. The CRT terminal is your entire interface. Seven mood states drive atmosphere through the shader alone — no HUD icons, no alert popups.
-
05
Progression Crosses Thresholds — Tier advancement is a shift in working depth, not a power increase. Everything the player does at T3, the machine was already doing at T1 on their instruction. Advancing means taking the controls.
$ How to Play
The Core Loop
GHOSTWORK operates on three nested loops that create its gameplay rhythm:
Moment-to-Moment
Type commands into the terminal. Each command costs ticks (time) and generates heat (noise). Read output. Make decisions. Every keystroke matters.
Session Loop
Accept a contract from the BBS. Scan the target. Find vulnerabilities. Exploit them. Complete objectives. Extract cleanly. Get paid. Get graded.
Long-Term Arc
Upgrade your rig. Build faction reputation. Take harder contracts. Uncover the conspiracy. Decide who to trust in a world where everyone is compromised.
Getting Started
When you boot GHOSTWORK for the first time:
- Choose your OS — each has a distinct visual identity and gameplay modifiers. LinuxForge is a solid default; PhantomBSD rewards stealth play.
- Choose your tier — start at Tier 1 (Script Kiddie) if you're new to hacking games. You can switch tiers at any time.
- Type
helpto see available commands. Typeman <command>for detailed usage on any command. - Type
contractsto browse the BBS board. View a contract withcontracts <number>. Accept one withcontracts accept <number>. - Complete the contract — scan, connect, exploit, extract. Monitor your
heatthroughout. - Get paid, upgrade, repeat. Use
upgradeto browse hardware. Userigto see your current setup.
The CRT Experience
There are no menus. There is no HUD. The CRT shader reacts to gameplay through seven distinct mood states:
| State | Visual Effect |
|---|---|
| Calm | Steady phosphor glow, minimal noise |
| Focus | Phosphor brightens, scanlines sharpen |
| Tension | Subtle static rises, glow intensifies |
| Alert | Scanlines intensify, color shifts toward danger palette |
| Danger | Heavy static, screen flicker, phosphor instability |
| Compromised | Screen goes cold — desaturated, flickering |
| Triumph | Clean, bright, steady — the screen rewards a clean extraction |
$ Tier System
Tiers control abstraction depth, not difficulty. The simulation engine is identical at every tier. Tier determines how information is presented and how much the system does on your behalf. Switch freely at any time.
T1 Script Kiddie
Guided commands with auto-completion. Verbose help text. Step-by-step scaffolding. The terminal guides you through each operation with suggestions and explanations.
hack (auto-exploit)T2 Operator
Standard command-line workflow. Realistic flags and options. No hand-holding, but clear feedback. The way a working pentester operates day-to-day.
T3 APT
Protocol-level operations. Packet crafting. Exploit development. Shell scripting. Minimal UI chrome. Real cybersecurity concepts, real methodology, maximum depth.
$ Operating Systems
Six operating systems, each with a distinct philosophy, visual identity, and gameplay personality. Your OS choice affects your phosphor palette (CRT color theme), window manager style, starting hardware, and gameplay modifiers.
LinuxForge
Open source, community-drivenGreen phosphor CRT. Tiling window manager. Community-refined tools generate less noise.
PhantomBSD
Paranoid securityAmber phosphor CRT. Tiling window manager. Minimal attack surface — hardened against both detection and counter-hacking.
SpecterOS
Corporate polishClean white-on-blue. Floating window manager. Ships with upgraded network hardware for deeper reconnaissance.
Aether
Experimental, adaptiveCyan accent phosphor. Floating window manager. Faster command execution, but unstable — commands can glitch unpredictably.
NullOS
Bare metalWhite phosphor. Tiling window manager. No identity until you give it one. No bonuses, no penalties — pure skill, no crutches.
CypherOS
Enterprise networkingBlue-on-black. Floating window manager. Windows backbone with enterprise networking — supports extra concurrent sessions.
Phosphor Palettes
Each OS defines 10 semantic color keys that control the CRT visual identity:
| Key | Purpose |
|---|---|
bg | Terminal background |
fg_primary | Primary text color |
fg_secondary | Secondary / dimmed text |
accent | Highlights, prompts, active elements |
border | Pane borders and dividers |
selection | Text selection background |
comment | Comments, hints, muted annotations |
alert_low | Low-severity alerts |
alert_mid | Medium-severity alerts |
alert_high | High-severity / critical alerts |
$ Hardware & Rig
Your hardware is your character sheet. Six slots, three upgrade tiers each. Every component creates real mechanical constraints that shape your approach. Hardware upgrades are purchased from the market — gated by contracts_completed, not by tier.
| Slot | Effect | Tier 1 | Tier 2 | Tier 3 |
|---|---|---|---|---|
| CPU | Command execution speed (tick multiplier) | 1.0× | 0.75× 3,000 CR | 0.5× 8,000 CR |
| RAM | Max terminal panes open simultaneously | 2 panes | 3 panes 800 CR | 5 panes 4,000 CR |
| NIC | Scan depth into target networks | Depth 1 | Depth 2 2,000 CR | Depth 3 5,000 CR |
| STORAGE | Local disk for scripts and exfiltrated data | 256 KB | 1,024 KB 1,200 CR | 4,096 KB 4,000 CR |
| GPU | Password cracking speed (tick cost divisor) | ÷1 | ÷2 4,000 CR | ÷3 10,000 CR |
| COOLING | Thermal capacity before throttling | 4 units | 8 units 2,500 CR | 15 units 6,000 CR |
floor(price × 0.4). Upgrading a slot replaces the previous component — installing a Tier 2 NIC swaps out your Tier 1. Use rig to view your installed hardware at any time.
$ Commands
GHOSTWORK ships with 139 verb commands across twenty categories. Every command has a base_heat cost (noise generated) and base_ticks cost (time consumed). Type help for a full listing or man <command> for detailed usage.
System & Info
| Command | Description |
|---|---|
help | List all available commands |
man <cmd> | Detailed manual page for a command |
whoami | Display player identity and current tier |
uptime | Show session duration |
clear | Clear terminal output |
history | Show command history |
rig | Display current hardware configuration |
heat | Show current heat / OpSec level |
tier | View or switch working tier |
rep | Show faction reputation standings |
wallet | Show credit balance |
File Operations
| Command | Description |
|---|---|
ls | List files in current directory |
cd <dir> | Change directory |
pwd | Print working directory |
cat <file> | Display file contents |
grep <pattern> | Search file contents |
touch <file> | Create an empty file |
mkdir <dir> | Create a directory |
rm <file> | Delete a file |
download <file> | Download file from target to local storage |
Network & Reconnaissance
| Command | Description |
|---|---|
scan <target> | Scan a host or subnet for open ports and services |
connect <host> | Open a connection to a remote host |
disconnect | Close the active session |
ssh <host> | Open an SSH session |
sessions | List all active sessions |
ifconfig | Display network interfaces |
netstat | Show active network connections |
ping <host> | Check host reachability |
traceroute <host> | Trace route to target |
nslookup <domain> | DNS lookup |
dig <domain> | Detailed DNS query |
whois <domain> | Domain registration lookup |
ipconfig CypherOS | Display IP configuration (Windows-style — CypherOS only) |
netsh CypherOS | Network shell — firewall rules, interface config (CypherOS only) |
tcpdump | Packet capture — inspect live network traffic with BPF-like filters |
Exploitation
| Command | Tier | Description |
|---|---|---|
hack <target> | T1 | Compound auto-exploit — scans, finds vulns, and exploits in one step |
exploit <vuln> | T2+ | Exploit a specific known vulnerability |
inject <payload> | T3 | Inject a custom payload |
escalate | T2+ | Attempt privilege escalation on current session |
pivot <host> | T2+ | Pivot to another host through current session |
msfconsole | T2+ | Interactive payload browser — search, configure, and deploy exploit payloads |
msfvenom | T3 | Payload generator with encoding — create custom payloads with evasion encoding |
Password Cracking
Four cracking tools, each with different characteristics. All are accelerated by GPU tier.
| Command | Tier | Type | Description |
|---|---|---|---|
bruteforce <svc> | T1+ | Online | Simple brute-force password attack against a service |
hydra <svc> | T3 | Online | Parallelized online brute-force (THC Hydra style) |
john <hashes> | T3 | Offline | Offline hash cracking with rules and wordlists |
hashcat <hashes> | T3 | Offline | GPU-accelerated hash cracking with attack modes |
Contract & Extraction
| Command | Description |
|---|---|
contracts | Browse the BBS contract board |
contracts <id> | View contract details |
contracts accept <id> | Accept a contract |
extract | Exfiltrate data to complete objectives |
scrub | Clean traces from the target system |
upgrade | Browse and purchase hardware upgrades |
Defense & Hardening
| Command | Tier | Description |
|---|---|---|
firewall | T2+ | Inspect or modify firewall rules on a compromised host |
ids | T2+ | Query intrusion detection system status and signatures |
patch | T2+ | Apply or check security patches on a target system |
harden | T3 | Apply security hardening configuration to a host |
audit | T2+ | Run security audit on target configuration |
tripwire | T3 | Install or check file integrity monitoring |
backup | T1+ | Create or list backups on a system |
restore | T2+ | Restore a system from backup |
Forensics & Analysis
| Command | Tier | Description |
|---|---|---|
forensics | T2+ | Run forensic analysis on a compromised host |
evidence | T2+ | Collect, examine, or plant digital evidence |
volatility | T3 | Memory forensics — dump and analyze RAM artifacts |
autopsy | T3 | Disk forensics — recover deleted files and timeline analysis |
timeline | T2+ | Reconstruct event timeline from system logs |
chainofcustody | T3 | Establish evidence chain of custody for legal proceedings |
memdump | T3 | Memory dump — capture volatile RAM artifacts from a compromised host |
bloodhound | T2+ | Attack graph visualization — map network topology and attack paths |
case_status | T3 | Check law enforcement investigation threads and evidence correlation |
Social Engineering
| Command | Tier | Description |
|---|---|---|
phish | T1+ | Craft and send phishing messages to targets |
vish | T2+ | Voice phishing — social-engineer targets via phone pretexts |
pretexting | T2+ | Build and deploy social engineering pretexts |
dumpster | T1+ | Dumpster dive for credentials and sensitive documents |
Malware & Persistence
| Command | Tier | Description |
|---|---|---|
implant | T2+ | Deploy a backdoor implant on a compromised host |
rootkit | T3 | Install kernel-level rootkit for deep persistence |
keylogger | T2+ | Deploy keystroke logger to capture credentials |
rat | T3 | Deploy remote access trojan with full C2 capability |
persist | T2+ | Establish persistence mechanism (cron, service, registry) |
c2 | T3 | Command and control — manage deployed implants |
Cloud Operations
Cloud commands require the corresponding CLI tool to be installed on your rig via install. Available tools depend on your storage tier.
| Command | Tier | Description |
|---|---|---|
cloud | T2+ | Enumerate cloud resources and IAM configurations |
aws | T2+ | AWS CLI — S3, EC2, IAM, Lambda operations |
az | T2+ | Azure CLI — storage, VMs, AD, Functions |
gcloud | T2+ | Google Cloud CLI — GCS, GCE, IAM operations |
terraform | T3 | Infrastructure as code — plan and modify cloud infra |
kubectl | T3 | Kubernetes cluster management and container orchestration |
docker | T2+ | Container operations — inspect, exec, escape |
Web Application Testing
Full OWASP Top 10 attack surface: SQL injection, XSS, SSRF, and more. Web apps are modeled with routes, parameters, and WAF detection.
| Command | Tier | Description |
|---|---|---|
nikto | T2+ | Web vulnerability scanner — enumerate routes, frameworks, and injectable params |
gobuster | T2+ | Directory brute-forcer — discover hidden paths and endpoints |
sqlmap | T2+ | SQL injection tool — detect, enumerate databases, dump tables, extract creds |
burp | T2+ | Web proxy — scan, spider, intercept requests, fuzz parameters for XSS/injection |
Privilege Escalation
Misconfiguration-based privesc: SUID binaries, sudo rules, cron jobs, writable paths. Full GTFOBins database with 12 binary entries.
| Command | Tier | Description |
|---|---|---|
linpeas | T2+ | Enumerate SUID binaries, sudo rules, cron jobs, and writable paths |
crontab | T2+ | List cron jobs (-l), edit writable cron scripts (-e) for payload injection |
Supply Chain
Package registry attacks: typosquatting, dependency confusion, integrity bypass. Supports npm, PyPI, RubyGems, and Cargo registries.
| Command | Tier | Description |
|---|---|---|
npm | T1+ | npm CLI — install, audit, publish, info. Full registry interaction |
pip | T1+ | pip CLI — install, show, list, check. PyPI registry integration |
Encryption & Crypto
TLS/SSL analysis, certificate chain validation, MITM interception, and cryptographic attacks. Full A-F grading system.
| Command | Tier | Description |
|---|---|---|
encrypt | T1+ | Encrypt files or communications |
decrypt | T2+ | Decrypt intercepted encrypted data |
steganography | T3 | Hide data within images, audio, or other files |
sslscan | T2+ | TLS scanner — enumerate protocols, cipher suites, certificate details, grade |
sslstrip | T3 | HTTPS downgrade proxy — strip TLS to intercept credentials via MITM |
System Administration
| Command | Tier | Description |
|---|---|---|
sudo <cmd> | T1+ | Execute a command with elevated privileges |
su <user> | T2+ | Switch user identity on a compromised host |
install <tool> | T1+ | Install a software tool to your rig (uses storage) |
apt / yum / pacman | T2+ | OS-specific package managers for target hosts |
Scripting & Automation
| Command | Tier | Description |
|---|---|---|
script <file> | T3 | Execute a player-written automation script |
alias | T1+ | Define command aliases for faster workflows |
env | T1+ | View or set shell environment variables |
jobs | T2+ | List background jobs |
bg / fg | T2+ | Move jobs between background and foreground |
Active Directory
Domain attack chain: extract Kerberos tickets, replicate credentials, forge golden tickets for persistent domain admin access. Targets hosts with ad_domain configuration.
| Command | Tier | Description |
|---|---|---|
kerberoast | T2+ | Extract Kerberos TGS tickets from service accounts on a domain controller |
pass_the_ticket | T2+ | Replay stolen Kerberos tickets to authenticate on domain-joined hosts |
dcsync | T3 | Replicate domain credentials via Directory Replication Service — captures krbtgt hash |
golden_ticket | T3 | Forge a Kerberos TGT for persistent domain admin access (requires krbtgt hash) |
Wireless Attacks
WiFi and Bluetooth attack surface: crack wireless encryption, deploy evil twin access points, deauthenticate clients. Targets hosts with wireless_ap configuration.
| Command | Tier | Description |
|---|---|---|
aircrack | T2+ | Crack wireless encryption — success varies by protocol (WEP > WPA2 > WPA3-SAE) |
deauth | T2+ | Deauthentication attack — force clients to disconnect and capture handshakes |
evil_twin | T3 | Deploy rogue access point to intercept client traffic and harvest credentials |
$ Contracts
Contracts are jobs posted to an anonymous BBS (Bulletin Board System). Each contract is posted by a faction handle, has a risk level, payout, time limit, and one to four objectives. GHOSTWORK ships with 45 contracts spanning all four factions and three risk levels.
Contract Lifecycle
AVAILABLE → ACCEPTED → ACTIVE → PENDING_EXTRACT → COMPLETE | FAILED / ABANDONED
You can only run one active contract at a time. Completed contracts are appended to your permanent history.
Objective Types
| Type | Description |
|---|---|
FILE_EXFILTRATE | Locate and extract specific files from the target |
SESSION_ESTABLISH | Establish a persistent session on a target host |
SERVICE_EXPLOIT | Exploit a specific service or vulnerability |
EVIDENCE_PLANT | Plant forensic evidence on a target system |
EVIDENCE_DESTROY | Eliminate forensic evidence from a compromised host |
CLOUD_COMPROMISE | Breach a cloud environment and exfiltrate resources |
SUPPLY_CHAIN | Compromise a software supply chain component |
SOCIAL_ENGINEER | Obtain access through social engineering pretexts |
CUSTOM_CONDITION | Meet a scenario-specific objective |
Grading
Contracts grade you on three dimensions: stealth (low heat at completion), speed (ticks used vs. time limit), and precision (clean execution). Your approach matters as much as your success — a sloppy victory pays less than a clean one.
Risk Levels
| Risk | Security | Notes |
|---|---|---|
| LOW | Level 1 | Weak defenses. Good for learning and building rep. |
| MED | Level 2 | Active monitoring. IDS present. Sysadmin AI watches for patterns. |
| HIGH | Level 3 | Adaptive firewalls. Honeypots. Counter-hacking. One mistake and you're traced. |
Procedural Networks
Every target network is procedurally generated with guaranteed solvability — at least two viable attack vectors exist for every objective. Networks have active defenses: intrusion detection systems, sysadmin AI that learns your patterns, firewalls that adapt, and honeypots that trap the careless.
$ CVE Catalog
GHOSTWORK features a fictional vulnerability catalog using the ZD-YYYY-NNNN identifier format. Every exploitable service in the game maps to one or more catalog entries, each with a severity score, affected versions, and exploit requirements.
ZD- prefix (e.g., ZD-2038-0042) to maintain the fiction while teaching real methodology.
Catalog Entry Structure
| Field | Description |
|---|---|
zd_id | Unique identifier (ZD-YYYY-NNNN) |
title | Short vulnerability description |
severity | CVSS-style score (0.0–10.0) |
affected_service | Service and version range affected |
exploit_type | Category: RCE, LPE, info_leak, DoS, auth_bypass |
requires_auth | Whether authenticated access is needed |
tier_minimum | Minimum tier to exploit directly |
Players discover vulnerabilities through scan (finds affected services), cross-reference them with the catalog using exploit --list, and target specific entries with exploit ZD-YYYY-NNNN. At T3, players can chain vulnerabilities for multi-stage attacks.
Exploit Resolution
When a player targets a vulnerability, the engine evaluates: Does the target run the affected service? Is the version in range? Does the player meet the tier and tool requirements? Success probability factors in the player's rig, OS modifiers, and the target's patch level — a fully patched host is immune.
$ Heat & OpSec
Every action generates noise. Every tool leaves traces. The Heat system creates constant tension between getting the job done and staying invisible.
Multi-Dimensional Heat
Heat is tracked on two independent dimensions. Each action specifies which dimension it affects:
| Dimension | What It Measures | Raised By |
|---|---|---|
| Network Heat | Traffic analysis signature — how visible you are on the wire | Scans, connections, data exfiltration, noisy exploits |
| Host Heat | Forensic footprint — traces left on compromised systems | File access, privilege escalation, persistence, log tampering |
Both dimensions use the same 0–100 scale and band system. Some actions affect BOTH dimensions. Detection triggers when either dimension enters the HIGH band — a stealthy network approach means nothing if you leave forensic evidence everywhere.
Heat Bands
| Band | Range | Decay | Consequences |
|---|---|---|---|
| LOW | 0–33 | 0.8/tick | Normal operations. No additional attention. |
| MED | 34–66 | 0.5/tick | IDS correlating. Slower decay. Rising sysadmin attention. |
| HIGH | 67–99 | 0.2/tick | Active counter-hacking. Session kills. Trace-back attempts. |
Heat sources: every command has a base_heat value. Aggressive actions (exploits, brute-force) generate more heat. Passive actions (ls, cat, pwd) generate less. Your OS may modify heat generation — PhantomBSD generates 25% less, LinuxForge 10% less.
Heat scope: tracked per contract. Completing a contract resets heat, but residual_heat can carry over based on how sloppy the exit was.
Decay: heat decays passively on every tick-advancing command, but the rate depends on your current band. Higher heat = slower decay. Use scrub to reduce network heat by cleaning traces, and use forensic tools to manage host heat.
Idle Heat & Alert Fatigue
Inactive sessions still generate small amounts of heat — open connections are detectable. Extended idle time in a high-security network triggers sysadmin patrol checks. Conversely, defenders suffer alert fatigue: sustained medium-heat activity can cause IDS operators to lower their guard, slightly reducing detection sensitivity over time.
Surveillance Countermeasures
High-security targets deploy active surveillance: traffic analysis, behavioral profiling, and honeypot networks. Counter-surveillance commands let you detect and evade these measures — but counter-surveillance itself generates heat.
Active Defense AI
Every target network has an autonomous Sysadmin AI — not a scripted boss, but a tick-scheduled defender running on its own clock. It doesn't know you're there until it observes something wrong.
| Behavior | Trigger | Player Impact |
|---|---|---|
| Patrol Inspection | Recurring (cadence tightens with alert state) | Detects exploit sessions, crashed services, persistent access |
| Credential Rotation | Fixed schedule (not alert-scaled) | Cracked passwords silently expire — plan your timing |
| Patch Cycling | Fixed schedule | Vulnerabilities you haven't exploited yet can get patched |
| Lockdown Sweep | Entry into HIGH heat band | Full-network scan: every host inspected, mass credential rotation |
| Monitored Traps | Detection at ELEVATED/LOCKDOWN | Host marked for 85% detection chance & 2.5× heat — a honeypot |
| Host Isolation | Detection at LOCKDOWN | All sessions killed, host blocked for 80 ticks — network segmentation |
The sysadmin's routine is deterministic and learnable. Read auth.log timestamps to reconstruct patrol intervals. Notice when credentials rotate to predict the next window. The defender never cheats — they only react to what they can observe in ground truth. Your job is to read their patterns and work around them.
$ Forensic Evidence
Every action you take on a target system can leave forensic evidence — artifacts that persist after you disconnect. Evidence accumulates independently of heat and can be discovered during incident response, potentially leading to contract failure or law enforcement attention even after a successful extraction.
Evidence Types
| Type | Left By | Persistence |
|---|---|---|
| Log entries | Any command executed on target | Until logs rotated or scrubbed |
| File artifacts | Downloads, uploads, file modifications | Until explicitly deleted |
| Memory traces | Running processes, injected payloads | Until reboot or memory dump |
| Network artifacts | Connection records, DNS queries | Until traffic logs expire |
| Persistence mechanisms | Implants, rootkits, cron jobs | Indefinite — survives reboots |
Clean extraction matters. Use scrub for log cleanup, carefully remove tools you deployed, and avoid leaving persistence mechanisms behind unless the contract requires it. A clean post-exploitation phase reduces your evidence footprint and improves contract grades.
Volatile Artifacts
Five additional evidence types persist only in host RAM — cleared by reboot but detectable by memory forensics tools. The tradeoff: a reboot erases volatile evidence but generates noise that alerts the Sysadmin AI. See Memory Forensics for full details.
$ Law Enforcement
Sloppy operations attract attention beyond the target's defenders. The Law Enforcement Pressure system tracks cumulative evidence across contracts. Get traced too many times or leave too much evidence, and you'll face escalating consequences.
Pressure Levels
| Level | Threshold | Consequences |
|---|---|---|
| UNKNOWN | Default | No law enforcement attention. Operate freely. |
| MONITORED | Repeated traces | Higher base heat on new contracts. Faction contacts warn you. |
| INVESTIGATED | Sustained evidence | Some contracts become unavailable. Hardware market prices increase. |
| HUNTED | Critical exposure | Aggressive counter-operations. Shortened contract timers. Faction trust drops. |
Pressure decays slowly over time through clean operations. Lying low, completing stealth contracts, and doing work for Cold Iron (security contractors) can actively reduce pressure. The scrub and evidence management commands are your primary tools for keeping the heat off.
Evidence-Chain Investigation
Law enforcement doesn't just track a scalar "heat" score. The Evidence Linker correlates patterns across contracts — same technique, same tools, same network range, overlapping timing, traceable cryptocurrency. Each pattern spawns an investigation thread with its own strength that builds over time. See Evidence Chains for full details.
$ Economy
Credits (CR) are earned from contracts and spent on hardware upgrades. The economy uses an append-only transaction ledger — every income and expense is permanently recorded.
| Rule | Detail |
|---|---|
| Starting balance | 100 CR |
| Precision | Integer only — no floating-point credits |
| Floor | Balance can never go negative |
| Sell refund | floor(price × 0.4) |
| Contract payout | Base payout modified by grade (stealth, speed, precision) |
Use wallet to check your balance. The market is gated by contracts_completed, not tier. Better hardware requires finishing more jobs.
Cryptocurrency
Some contracts pay in cryptocurrency instead of (or in addition to) credits. Crypto earnings are stored in a separate wallet with its own volatility mechanics — the exchange rate fluctuates based on in-game market conditions.
| Feature | Detail |
|---|---|
| Volatility | Exchange rate shifts between contracts based on deterministic market simulation |
| Conversion | Convert crypto to credits at current rate via wallet convert |
| Risk/reward | Holding crypto can yield higher returns — or losses — compared to immediate conversion |
| Black market | Some Undermarket items are crypto-only, bypassing the standard economy |
| Laundering | Large crypto transactions increase law enforcement pressure unless laundered |
$ Cloud Resources
The 2039 internet runs on consolidated cloud infrastructure. Cloud targets represent high-value contract objectives with their own attack surface, distinct from traditional on-premise networks.
Cloud Providers (In-Game)
Apex Cloud
Dominant IaaS provider. Object storage, compute instances, IAM, serverless functions.
awsBastion Platform
Enterprise-focused. Active Directory integration, managed databases, compliance controls.
azCirrus Systems
Developer-friendly. Container orchestration, CI/CD pipelines, ML infrastructure.
gcloudSoftware Tools
Cloud CLIs and infrastructure tools must be installed before use. Use install <tool> to download and configure tools to your rig. Each tool consumes storage space and some require minimum hardware tiers.
aws s3 ls without installing the AWS CLI returns an error, not a silent failure — just like the real world.
$ Web Application Attacks
Full OWASP Top 10 attack surface simulation. Every web application on a target host is modeled with routes, parameters, and vulnerability types. A configurable WAF (Web Application Firewall) tracks failed injection attempts and blocks attackers who trigger too many alerts.
Attack Surface Model
| Component | Description |
|---|---|
| Web Apps | Each host can run multiple web applications with distinct frameworks, versions, and route sets |
| Routes | Paths with HTTP methods and parameters — some injectable, some not |
| WAF Detection | Failed injection attempts accumulate; cross the threshold and the WAF blocks all requests for configurable ticks |
| Vulnerability Types | SQLi, XSS, SSRF, RFI, XXE, Template Injection — each with distinct exploitation mechanics |
Workflow
nikto / gobuster → discover routes and params → sqlmap / burp fuzz → exploit injectable params → extract data or pivot. Each step generates heat (NETWORK dimension). Stealth flags and tool bonuses modify success chances.
$ Privilege Escalation
Misconfiguration-based privilege escalation — the most common real-world attack vector after initial access. Hosts now have privesc vectors: SUID binaries, sudo rules, writable cron jobs, and interesting file paths.
GTFOBins Database
12 binary entries (nmap, find, vim, python3, perl, less, awk, env, bash, cp, tar, wget) with SUID and sudo exploitation methods. Each entry specifies the command sequence for shell escape.
Vectors
| Vector | Tool | Mechanic |
|---|---|---|
| SUID Binaries | linpeas + find -perm -4000 | Discover SUID bit on GTFOBins-listed binary → shell escape → root |
| Sudo Rules | sudo -l + manual exploit | List NOPASSWD sudo rules → GTFOBins lookup → escalate |
| Cron Jobs | crontab -l + crontab -e | Identify world-writable cron script → inject payload → wait for execution |
| Writable Paths | linpeas | Systemd units, init scripts, LD_PRELOAD paths — write payloads to run as root |
$ Supply Chain Attacks
Package registry simulation with full dependency trees, integrity checking, and social engineering. Registries live at the topology level (shared infrastructure, not per-host), supporting npm, PyPI, RubyGems, and Cargo ecosystems.
Attack Vectors
| Attack | Tool | Mechanic |
|---|---|---|
| Typosquatting | npm publish / pip | Create a package with edit-distance ≤2 from a popular name. Detection chance scales inversely with distance. |
| Dependency Confusion | npm publish | Publish a higher-version internal package name to the public registry |
| Integrity Bypass | npm audit | MD5 checksums are weak — 30% bypass chance. SHA-256 checksums cannot be bypassed. |
| CI Pipeline Injection | Contracts | Exploit pull_request_target workflows to exfiltrate secrets from CI runners |
Blast Radius
Every supply chain attack computes a blast radius score (0–100) based on direct dependents, transitive dependents, and weekly downloads. Higher blast radius means higher payout — and higher heat.
$ PKI & Encryption Infrastructure
Deep TLS/SSL simulation. Every service can have a TLS configuration with protocol version, cipher suite, key strength, HSTS, and certificate chain. The system grades each configuration A through F, matching real-world assessment methodology.
Grading Criteria
| Grade | Requirements |
|---|---|
| A | TLSv1.2+, 2048-bit+ RSA, strong ciphers only, HSTS enabled |
| B | TLSv1.2+, 2048-bit+ RSA, no broken ciphers |
| C | TLSv1.0+, 1024-bit+ RSA |
| D | Broken ciphers or weak keys |
| F | SSLv3 or below, self-signed certificate |
Attack Chain
sslscan → identify weak TLS config → sslstrip (if no HSTS) or MITM via weak protocol → intercept credentials or forge certificates. MITM requires same-subnet positioning. Certificate forging requires stolen CA key material and works only against weak (512-bit) RSA keys.
$ Player Scripting
At T3, players unlock the scripting runtime — the ability to write and execute automation scripts that chain commands together. Scripts are stored on your rig's local storage and executed via the script command.
Capabilities
| Feature | Description |
|---|---|
| Command chaining | Execute multiple commands in sequence with conditional logic |
| Variables | Store and reuse values: IPs, ports, credentials, file paths |
| Loops | Iterate over host lists, port ranges, or wordlists |
| Conditionals | Branch on command success/failure, heat thresholds, or output parsing |
| Functions | Define reusable procedures for common attack patterns |
| Heredoc support | Multi-line string literals for complex payloads |
Scripts are stored as plaintext on your rig's STORAGE — storage capacity limits how many scripts you can carry. Use ls ~/scripts to manage them.
$ TCP/IP Simulation
Every network action generates real packet metadata. The PacketLedger is a ring buffer (2000-packet capacity, configurable) that records every packet emitted by NSS action handlers — bridging the TrafficAnalysis IDS and powering tcpdump.
Packet Record
| Field | Type | Description |
|---|---|---|
src_host / dst_host | String | Source and destination host IDs |
src_port / dst_port | int | Port numbers |
protocol | String | tcp, udp, icmp, arp, dns |
flags | String | SYN, SYN-ACK, ACK, PSH-ACK, FIN, FIN-ACK, RST |
bytes | int | Packet size (action-specific estimates from config) |
action | String | Originating NSS action: scan_host, exploit_service, etc. |
payload_hash | String | Hash of attached payload (if any) |
encoding | String | Encoding applied to this packet (if any) |
Protocol Helpers
High-level methods emit realistic packet sequences for common operations:
| Method | Packets Emitted | Used By |
|---|---|---|
emit_handshake() | SYN → SYN-ACK → ACK | connect, ssh |
emit_teardown() | FIN → FIN-ACK | disconnect |
emit_port_probe() | SYN → SYN-ACK (open) or RST (closed) | scan |
emit_data_transfer() | PSH-ACK with byte payload | download, extract, exploit |
emit_icmp_echo() | ICMP echo request | ping, scan_subnet |
Commands
| Command | Tier | Description |
|---|---|---|
tcpdump | T2+ | Packet capture with BPF-like filters. Flags: -i (interface/host), -c (count), -n/-nn (no resolve), -X (hex dump). At T3, produces real pcap-style output with timestamps, protocol flags, seq/ack numbers, and window sizes. |
netstat | T1+ | Show active network connections with simulated TCP state (ESTABLISHED, TIME_WAIT, LISTEN). |
TrafficAnalysis.record_traffic() automatically. IDS anomaly detection now runs on real traffic volume, not estimates. Encoded packets carry their ids_evasion modifier through the bridge.
$ Payload Modules
Metasploit-style exploit/payload separation. CVEs define what breaks; payloads define what happens next. Twelve payload modules span shell, advanced shell, web, persistence, and data exfiltration categories.
Payload Properties
| Property | Description |
|---|---|
category | Payload type: shell, advanced_shell, web, persistence, data |
params | Configurable parameters: LHOST, LPORT, AutoRunScript, etc. |
detectability | AV signature match chance (0.0–1.0). Reduced by encoding. |
reliability | Execution success probability. Reduced by encoding stacking. |
size_bytes | Payload size — affects packet volume and transfer time. |
compatible_categories | CVE exploit types this payload works with (e.g., rce, buffer_overflow). |
Tier-Based Workflow
T1 Auto-Select
Payload auto-selected for you — simplest compatible option. hack handles everything.
T2 Choose
Pick your payload: exploit <target> --payload reverse_tcp
T3 Configure
Full control: exploit <target> --payload meterpreter_tcp --set LHOST=10.0.1.5 --set LPORT=4444
Commands
| Command | Tier | Description |
|---|---|---|
msfconsole | T2+ | Interactive payload browser. Search by category, show options, set params, deploy. |
exploit --payload | T2+ | Specify payload at exploit time. Combine with --set KEY=VALUE for params. |
$ Encoding & Evasion
Encoding transforms payloads and packets to evade detection. Six encoders span T1 through T3, each trading size increase and reliability loss for IDS/AV evasion. A 0.95 detection floor ensures there is always some chance of getting caught.
Encoder Catalog
| Encoder | Tier | IDS Evasion | AV Evasion | Size × | Reliability − |
|---|---|---|---|---|---|
xor | T1 | 0.30 | 0.20 | 1.1× | 0.00 |
base64 | T1 | 0.20 | 0.10 | 1.37× | 0.00 |
url_encode | T1 | 0.15 | 0.00 | 1.5× | 0.00 |
shikata_ga_nai | T2 | 0.60 | 0.50 | 1.25× | 0.05 |
unicode_bypass | T2 | 0.40 | 0.00 | 1.3× | 0.10 |
custom_packer | T3 | 0.70 | 0.80 | 0.8× | 0.15 |
Stacking & Diminishing Returns
Stack up to 3 encoders. Each additional layer applies at 50% effectiveness:
# Effective IDS evasion with 3-stack Layer 1: 100% effectiveness Layer 2: 50% effectiveness Layer 3: 25% effectiveness Cap: 0.95 maximum — always some detection chance
shikata_ga_nai, custom_packer) re-randomize their signature each tick, defeating static IDS pattern matching. But they cost reliability — a polymorphic triple-stack can fail to execute.
Command
| Command | Tier | Description |
|---|---|---|
msfvenom | T3 | Generate encoded payloads: msfvenom -p reverse_tcp -e shikata_ga_nai -i 3 |
$ Evidence Chains
Law enforcement doesn't track a single number. The Evidence Linker correlates patterns across contracts, spawning investigation threads that build strength over time — exactly how real LE builds cases through TTPs, tool reuse, and blockchain analysis.
Link Types
| Link Type | What Triggers It | Example |
|---|---|---|
| Technique | Same CVE or attack type used across 2+ contracts | Using ZD-2038-0042 on three different jobs |
| Tool | Same dropped tool or persistence mechanism | Deploying the same rootkit signature twice |
| Network | Evidence on hosts in the same subnet across contracts | Hitting 10.0.1.x in two unrelated jobs |
| Timing | Contracts completed within N ticks of each other | Rapid contract chaining without cooldown |
| Financial | Traceable cryptocurrency connecting contracts | Using QuickTumble (0.6 traceability) on both payouts |
Thread Lifecycle
DORMANT → ACTIVE → HOT → CLOSING strength 0-25 25-50 50-80 80-100
Thread strength maps to existing LE pressure levels. Threads decay per-contract (clean operations reduce strength). Identity Wipe burns threads with strength < 60 and weakens all others by 50 points.
| Command | Tier | Description |
|---|---|---|
case_status | T3 | Spend heat to check active LE investigation threads. Shows thread types and strengths (not full details). T1/T2 only see the overall exposure level. |
$ Memory Forensics
Five volatile evidence types live in host RAM, not on disk. They survive session disconnect but are cleared by reboot or service restart — creating a strategic tradeoff between evidence cleanup and operational noise.
Volatile Evidence Types
| Type | Generated By | Cleared By | Difficulty |
|---|---|---|---|
memory_resident_process | exploit, deploy persistence | reboot, kill session | Hard |
encryption_key_in_memory | TLS connections, exploit | reboot | Medium |
credential_cache | connect, domain credential use | reboot, credential rotation | Medium |
injected_dll | deploy (advanced persistence) | reboot | Hard |
network_socket_artifact | connect, scan | disconnect, reboot | Easy |
Commands
| Command | Tier | Description |
|---|---|---|
memdump <host> | T3 | Capture memory artifacts from a compromised host. Offensive forensics — see what's in RAM before deciding to scrub or reboot. |
volatility <dump> | T3 | Analyze memory dumps. Modeled on the real Volatility Framework — maps to plugins: pslist, cryptoscan, hashdump/mimikatz, malfind, netscan. |
scrub --type <volatile_type> | T3 | Anti-forensics for RAM artifacts. Targeted cleanup without a full reboot. |
$ Attack Graph
BloodHound-style network visualization. A GraphEdit-based panel shows your discovered attack surface as an interactive graph — hosts as nodes, sessions and credentials as edges, colored by access level.
Graph Elements
| Element | Represents | Visual |
|---|---|---|
| Nodes | Known hosts from reconnaissance | Colored by access: none (grey), user (blue), admin (amber), root (red) |
| Session edges | Active connections between hosts | Solid lines showing hop chains |
| Credential edges | Discovered credential relationships | Dotted lines showing access scope |
Features
- 01Node detail on click — known services, known vulnerabilities, evidence count, access level.
- 02Force-directed layout — auto-layout with manual drag repositioning.
- 03Filters — by subnet, access level, session status.
- 04Shortest path — highlight the hop chain between any two hosts.
Commands
| Command | Tier | Description |
|---|---|---|
bloodhound | T2+ | Open the attack graph panel. Builds graph from NSS knowledge tables. |
bloodhound --refresh | T2+ | Rebuild graph with latest reconnaissance data. |
bloodhound --path <src> <dst> | T2+ | Highlight the shortest attack path between two hosts. |
$ SIEM Log Forwarding
Enterprise targets don't just log locally — they forward evidence to a centralized SIEM (Security Information and Event Manager). Scrubbing a compromised host's logs doesn't erase what was already forwarded. This creates a race-against-the-clock mechanic: clean your traces before the forwarding delay expires, or the evidence becomes permanent.
How It Works
| Mechanic | Detail |
|---|---|
| Forward Delay | Evidence is queued for SIEM forwarding with a configurable tick delay (default: 3 ticks). Scrub before the timer expires and the evidence never reaches SIEM. |
| SIEM Store | Forwarded evidence lives in a separate, centralized store keyed by subnet. Local scrub commands cannot touch it — the SIEM host must be compromised separately. |
| Volatile Skip | Volatile evidence (RAM artifacts) is never forwarded to SIEM — it only exists in host memory. |
| Per-Host Config | Each host defines which evidence types are forwarded: log_entry, network_artifact, auth_event. |
Commands
| Command | Tier | Description |
|---|---|---|
siem_query | T3 | Query the SIEM store for forwarded evidence. Requires a session on the SIEM host itself. |
scrub | T1+ | Now warns when SIEM forwarding is active on the target — local scrub won't save you if the evidence already left. |
$ Service Enumeration
Real pentesting doesn't jump from scan to exploit. The enumeration phase sits between reconnaissance and exploitation — probing services for version strings, banners, login prompts, and directory listings that improve your attack accuracy.
Enumeration Bonus
Enumerating a service before exploiting it grants an additive exploit success bonus (typically +5% to +15%, depending on the protocol). Unenumerated exploits still work at base rate, but you're leaving accuracy on the table.
| Protocol | Banner Info | Bonus |
|---|---|---|
ssh | OpenSSH version, auth methods, key types | +10% |
http | Server header, framework, directory listing | +10% |
ftp | ProFTPD version, anonymous login status | +15% |
smtp | Postfix version, VRFY support, relay config | +10% |
smb | Samba version, share enumeration, signing | +10% |
Commands
| Command | Tier | Description |
|---|---|---|
enum <host> [service] | T1+ | Enumerate services on a target host. Tier gates output detail: T1 gets summaries, T3 gets raw protocol banners. |
enum targets the current session host. Enumeration generates moderate NETWORK heat — less than a scan, more than passive observation.
$ Signature-Based IDS
TrafficAnalysis now combines anomaly detection (volume-based) with signature matching (pattern-based). Fifteen signature rules watch for specific protocol+port+flag combinations that indicate known attack patterns.
How Signatures Work
| Field | Description |
|---|---|
matches | Protocol, port range, and TCP flag patterns to match against |
detection_base | Base probability of triggering on a matching packet (0.0–1.0) |
severity | LOW, MEDIUM, HIGH — affects alert escalation speed |
Evasion Mechanics
Encoding your payloads reduces signature match probability via the ids_evasion stat. Polymorphic encoders (shikata_ga_nai, custom_packer) get a 2× evasion multiplier against signatures specifically — their re-randomizing nature defeats static pattern matching.
$ Deep Encryption & PKI Operations
Beyond basic TLS scanning, GHOSTWORK now simulates certificate chain-of-trust, HSTS enforcement, cert pinning, mutual TLS, and certificate forgery. High-security targets use layered cryptographic defenses that must be peeled back methodically.
Attack Chain
certutil inspect <host>— scan the TLS configuration: protocol version, cipher suite, key strength, security flags, CA chain.- If HSTS is absent:
sslstripcan downgrade HTTPS connections to intercept credentials. - If cert pinning blocks MITM: exfiltrate the target's CA private key from the filesystem, then
certutil forge --ca-key <path> --target <host>to forge a trusted certificate. - With a forged cert: MITM attacks bypass cert pinning on that host. Intercepted traffic is visible.
Commands
| Command | Tier | Description |
|---|---|---|
certutil inspect <host> | T3 | Full certificate inspection: TLS grade, security flags (HSTS, cert pinning, mutual TLS), CA chain details. |
certutil forge --ca-key <path> --target <host> | T3 | Forge a certificate using stolen CA key material. Probabilistic — stronger keys are harder to forge. Generates significant heat. |
$ BBS Economy & Poster Reputation
The BBS board is no longer a passive job listing. Poster handles have reputation scores, contracts use escrow, jobs can expire from competing operators, and some posters are law enforcement fronts.
Poster Trust
Every poster has a trustScore (0–100) and confirmedJobs count. Trust shifts based on contract outcomes — completing a job raises trust, failing or abandoning lowers it.
| Trust Range | Label | Implications |
|---|---|---|
| 0–29 | Suspicious | Unproven poster. High payout + low trust = red flag. |
| 30–74 | Neutral | Mixed track record. Proceed with caution. |
| 75–100 | Trusted | Reliable poster. Escrow discount applied. |
Escrow System
When accepting a contract, the player deposits an escrow fee (15% of base payout, minimum 25 CR). Escrow is returned on successful completion, forfeited on failure or abandonment. Trusted posters (≥75 trust) offer a 50% escrow discount.
Contract Expiry
Contracts on the BBS board can expire after 200 ticks — taken by competing operators. This creates urgency: desirable contracts won't wait for you. A living underground market where you're not the only player.
LE Sting Operations
$ Active Directory
Domain attack chains modeled after real Active Directory penetration testing. Extract Kerberos tickets, replicate credentials via DCSync, and forge golden tickets for persistent domain admin access. All AD actions are configured via active_directory_config.json.
Attack Chain
kerberoast (extract TGS tickets) → dcsync (replicate creds, capture krbtgt) → golden_ticket (forge TGT, persistent admin) ↑ pass_the_ticket (replay stolen tickets on domain-joined hosts)
Commands
| Command | Tier | Heat | Prerequisite | Description |
|---|---|---|---|---|
kerberoast | T2 | 6.0 (HOST) | Domain user access | Extract TGS tickets from service accounts on a domain controller |
pass_the_ticket | T2 | 5.0 (HOST) | Stolen ticket | Replay Kerberos tickets to authenticate on domain-joined hosts |
dcsync | T3 | 12.0 (NETWORK) | Replication rights | Replicate domain credentials via DRS — captures all hashes including krbtgt |
golden_ticket | T3 | 15.0 (BOTH) | krbtgt hash | Forge a Kerberos TGT for persistent domain admin access |
Domain Model
Hosts with an ad_domain property are domain controllers. The domain defines service accounts (with SPNs for Kerberoasting), credential rotation intervals, and GPO update cycles. Stolen credentials and tickets are tracked per-host in the _ad_stolen state dictionary.
$ Wireless Attacks
WiFi and Bluetooth attack surface covering wireless encryption cracking, rogue access points, and deauthentication attacks. Protocol difficulty scales realistically: WEP is trivial, WPA2-PSK is moderate, WPA3-SAE is near-impossible without specific conditions. Configured via wireless_config.json.
Commands
| Command | Tier | Heat | Target | Description |
|---|---|---|---|---|
aircrack | T2 | Config-driven (HOST) | Wireless AP host | Crack wireless encryption — success varies by protocol difficulty multiplier |
deauth | T2 | Config-driven (NETWORK) | Wireless AP host | Force client disconnection and capture WPA handshakes for offline cracking |
evil_twin | T3 | Config-driven (BOTH) | Wireless AP host | Deploy rogue AP to intercept client traffic — credentials harvested per connected client |
Wireless AP Model
Hosts with a wireless_ap property are access points. The AP defines SSID, protocol (WEP/WPA2/WPA3-SAE), signal strength, connected clients, and channel. Protocol type determines the difficulty multiplier for aircrack and whether deauth can capture usable handshakes (WPA3-SAE uses SAE exchange, making captured handshakes less useful).
$ Assessment & Proctor Mode
GHOSTWORK includes a built-in proctored assessment system for cybersecurity education. Instructors run a proctor dashboard that connects to student game instances over a local network, enabling real-time monitoring, controlled lab environments, and automated grading.
How It Works
| Step | Instructor | Student |
|---|---|---|
| 1 | Opens Proctor Dashboard, gets a room code | Enters the room code to join |
| 2 | Selects a scenario and configures forced OS / tier / hardware | Sees roster confirmation |
| 3 | Pushes scenario and starts the assessment | Receives objectives and time limit |
| 4 | Monitors live command feed and student progress | Works through objectives in-game |
| 5 | Ends assessment and reviews graded results | Sees their grade breakdown |
Assessment Scenarios
Six built-in scenarios cover core cybersecurity skills. Each defines objectives, time limits, and grading weight distribution.
| Scenario | Difficulty | Time | Focus |
|---|---|---|---|
| Reconnaissance Fundamentals | Beginner | 10 min | Network scanning and host enumeration |
| Network Topology Mapping | Beginner | 10 min | Subnet scanning, DNS, route tracing |
| Complete Penetration Test | Intermediate | 20 min | Full pentest cycle: recon → exploit → exfil → cleanup |
| Password Cracking Lab | Intermediate | 15 min | Offline and online cracking techniques (GPU-2 provided) |
| Incident Response Analysis | Intermediate | 15 min | Forensic investigation of a compromised host |
| Stealth Operations | Advanced | 15 min | Complete a contract with heat below 20 |
4-Axis Grading
Every assessment is graded on four dimensions, each weighted per scenario:
| Axis | Measures | How It's Scored |
|---|---|---|
| Methodology | Did the student follow the correct phase order? | Recon → Enum → Exploit → Post-Exploit → Cleanup. Bonus for proper sequencing. |
| Stealth | How much noise did they generate? | Peak heat thresholds: ≤20 excellent, ≤50 good, ≤80 fair, >80 poor. |
| Efficiency | Did they avoid unnecessary or redundant commands? | Repeated commands within the same phase are penalized. |
| Completeness | How many objectives were achieved? | Ratio of completed objectives to total required. |
Letter grades: A ≥ 90%, B ≥ 80%, C ≥ 70%, D ≥ 60%, F < 60%.
Instructor Controls
| Feature | Description |
|---|---|
| Force OS | Lock all students to a specific operating system |
| Force Tier | Lock students to T1 Script Kiddie, T2 Operator, or T3 APT |
| Force Hardware | Presets: Default (all T1), Standard (all T2), Full (all T3), GPU Focus (GPU-3 only) |
| Live Feed | Real-time stream of every command every student executes |
| Package Mode | Sequence multiple scenarios into a single assessment session |
| Export Results | Simple, Standard, or Complete report formats |
$ New Game Plus
After completing the main progression, NG+ unlocks a second cycle with retuned difficulty. Your credits, faction reputation, and hardware carry over — but contracts hit harder, network defenses scale up, and heat thresholds tighten.
| Parameter | Base Game | NG+ |
|---|---|---|
| Heat multiplier | 1.0× | Configurable (default 1.5×) |
| Contract payout | 1.0× | Configurable (default 1.25×) |
| Detection sensitivity | Normal | Elevated |
| Hardware carry-over | — | Full rig retained |
$ Accessibility
GHOSTWORK is a text-heavy game — accessibility is not an afterthought. The following features are built in from day one:
| Feature | Description |
|---|---|
| Screen Reader (TTS) | Full text-to-speech support via the system TTS engine. All terminal output, menus, and status information is readable. |
| Colorblind Modes | Three correction matrices: protanopia, deuteranopia, and tritanopia. Applied as a post-process filter over the CRT shader. |
| High Contrast | Enhanced contrast mode that increases text/background separation across all OS palettes. |
| Font Scaling | Adjustable font size that scales all terminal text. Minimum size ensures readability at Steam Deck’s 1280×800. |
| Keyboard Navigation | All interactive elements are fully keyboard-navigable. No mouse required for any game function. |
All accessibility settings persist across sessions independently of game saves.
$ Localization
GHOSTWORK ships with 6 languages. All UI screens use the translation system — no hardcoded user-facing strings.
| Language | Code | Status |
|---|---|---|
| English | en | Complete (source language) |
| Spanish | es | Complete |
| French | fr | Complete |
| German | de | Complete |
| Japanese | ja | Complete |
| Chinese (Simplified) | zh | Complete |
$ Factions
Four factions operate in the underground, each with their own philosophy, contract style, and moral boundaries. Building reputation with a faction unlocks better contracts and deeper narrative threads.
Signal Collective
Hacktivists. Founded by nullsignal, crowbar, and hexwitch. Flat organizational structure. Expose corporate surveillance. Give power back to the public.
Contracts: data leaks, corporate exposure, whistleblower protection.
Meridian Group
Corporate espionage brokerage. Handle silkthread runs operations. Corporate hierarchy. Plausible deniability at every level. Information is a commodity.
Contracts: trade secret theft, competitive intelligence, insider data.
Cold Iron
Private security contractors. Handle warden leads. Ex-corporate security. Counter-intrusion specialists. The best defense is sometimes offense.
Contracts: counter-intrusion, threat assessment, security audits.
Undermarket
Black market data brokerage. The oldest faction — 15 years running. Handle broker_null. Everything has a price. Everything.
Contracts: data theft, exploit brokering, credential harvesting.
$ World Timeline
The year is 2039. The internet you knew is gone. Cloud consolidation, government surveillance acts, and corporate monopolies have reshaped the digital landscape. The underground is the last free space — and it's under siege.
Era 1 — Consolidation (2025–2030)
| Year | Event |
|---|---|
| 2025–28 | Major cloud providers merge into three mega-platforms. Independent hosting becomes unviable. |
| 2028 | The DISA (Digital Infrastructure Security Act) passes. Mandatory backdoors in all commercial encryption. |
| 2029 | LinuxForge v1.0 — first OS designed to operate outside DISA compliance. |
| 2030 | PhantomBSD appears. Origin unknown. Paranoid security model. |
Era 2 — Factions (2031–2034)
| Year | Event |
|---|---|
| 2031 | The Kestrel Leak — massive corporate-government surveillance dump. Signal Collective emerges. |
| 2032 | Meridian Group incorporates. Cold Iron follows within months. |
| 2033 | Undermarket launches the BBS board. SpecterOS appears. |
| 2034 | The First Ghost: delphic vanishes mid-operation. No body, no arrest, no trace. |
Era 3 — Protocol Zero (2035–2039)
The following reveals central narrative mysteries. Play the game first.
| Year | Event |
|---|---|
| 2035 | NullOS appears on underground channels. No author, no origin, no identity. |
| 2036 | AETHER v0.1 surfaces. archivist captured carrying pz_manifest.enc. |
| 2037 | Ghost frequency increases. 11 total — 7 turned, 4 detained or refused. |
| 2038 | forgeman broadcasts: "They're not arresting us. They're recruiting us." |
| 2039 | Protocol Zero is operational — a predictive capability-denial system by NSA/Arbor Systems. It captures and turns the best hackers. You are next. |
Protocol Zero doesn't catch hackers. It predicts who will become threats and moves to turn them before they peak. The factions are infiltrated. The BBS is monitored. And your growing reputation has already made you a target.
$ Modding Guide
GHOSTWORK supports a comprehensive addon system that lets modders add, extend, and override nearly every content type in the game. Addons are data-driven — most modifications require only JSON files, with optional GDScript for custom command logic.
user://addons/<addon_name>/. Each addon must contain an addon.json manifest at its root. The game discovers and loads addons automatically on startup.
Directory Structure
user://addons/ my_custom_addon/ addon.json # Required manifest commands/ # Custom verb definitions recon_tool.json recon_tool.gd # Optional: custom executor contracts/ # Custom contracts factions/ # New or extended factions hardware/ # New hardware components os/ # New operating systems narrative/ # Story fragments music/ # Music tracks (tracks.json) shell/ # Shell presets (presets.json) cves/ # Custom vulnerability catalog entries tools/ # Custom software tools market/ # Custom market items ids_signatures/ # IDS signature rules service_banners/ # Service enumeration banners poster_profiles/ # BBS poster profiles encoders/ # Custom encoding definitions configs/ # Config overrides (deep merge)
Operations: Add, Extend, Override
Every content type supports up to three operations:
| Operation | What It Does | Risk |
|---|---|---|
add | Introduces entirely new content (commands, contracts, factions, etc.) | Low — no conflicts |
extend | Patches specific fields of existing content (add flags, rivals, etc.) | Medium — depends on target |
override | Fully replaces existing content with your version | High — first override wins |
Load Order & Priority
- Core game content loads first. This is the baseline.
- Addon extensions apply in
load_ordersequence (lower numbers first). - First override wins. If two addons override the same content, the lower
load_ordertakes priority.
$ Manifest Schema
Every addon requires an addon.json manifest at its root:
{
"id": "my_recon_pack", // Unique identifier (snake_case)
"name": "Recon Tool Pack", // Human-readable display name
"version": "1.0.0", // SemVer version
"author": "YourName", // Author or team
"description": "Adds recon tools", // Short description
"game_version_min": "1.0.0", // Minimum game version required
"dependencies": [], // Other addon IDs this depends on
"load_order": 100, // Lower = loads earlier (default: 100)
"content": { // Maps content types to directories
"commands": "commands/",
"contracts": "contracts/",
"factions": "factions/",
"hardware": "hardware/",
"narrative": "narrative/",
"music": "music/",
"shell": "shell/",
"cves": "cves/",
"tools": "tools/",
"market_items": "market/",
"ids_signatures": "ids_signatures/",
"service_banners": "service_banners/",
"poster_profiles": "poster_profiles/",
"encoders": "encoders/",
"configs": "configs/"
}
}
id in the dependencies array. The game loads dependencies first regardless of load_order. Missing dependencies prevent the addon from loading.
$ Modding: Commands
Add new terminal commands, extend existing ones with new flags or subcommands, or fully override a built-in command.
Adding a New Command
Create a JSON verb definition in your addon's commands/ directory:
// commands/port_knock.json { "verb_id": "port_knock", "signature": "port_knock <host> <ports...>", "base_heat": 2, "base_ticks": 1, "widget_kind": "text_output", "intent_template": "Knock on ports {ports} at {host}", "execute_key": "port_knock", "presentation_tier": 2, "description": "Send a port knock sequence to open filtered services" }
Register it in your manifest:
"content": { "commands": { "add": [ { "file": "commands/port_knock.json" } ] } }
Custom Command Logic (GDScript)
For commands that need custom behavior beyond the standard pipeline, place a GDScript executor alongside the JSON:
# commands/port_knock.gd extends VerbExecutor func execute(args: Dictionary, context: CommandContext) -> VerbResult: var host := args.get("host", "") as String var ports := args.get("ports", []) as Array # Custom logic here return VerbResult.success("Knocked: %s" % [", ".join(ports)])
Data-Only Commands (Aliases)
Simple aliases need no GDScript — use alias_target:
{
"verb_id": "nk",
"alias_target": "port_knock",
"description": "Shorthand for port_knock"
}
Extending Existing Commands
"commands": { "extend": [ { "verb_id": "scan", "add_flags": ["--stealth", "--deep"], "add_subcommands": ["vuln"] } ] }
Overriding Commands
"commands": { "override": [ { "verb_id": "scan", "file": "commands/custom_scan.json" } ] }
$ Modding: Contracts
Add new contracts with custom network topologies, extend existing contracts, or override them.
Adding a Contract
{
"id": "custom_heist_01",
"title": "The Vault Job",
"poster_handle": "silkthread",
"briefing": "Meridian needs corporate R&D data. Hardened internal network. Get in, get files, get out clean.",
"risk_level": "HIGH",
"base_payout": 8000,
"time_limit_ticks": 200,
"target_security_level": 3,
"faction_tag": "meridian_group",
"objectives": [
{
"type": "FILE_EXFILTRATE",
"target_file": "/data/research/project_alpha.db",
"description": "Extract Project Alpha database"
},
{
"type": "SESSION_ESTABLISH",
"target_host": "10.0.1.50",
"description": "Persistent access to backup server"
}
],
"sysadmin_config": {
"base_patrol_interval_ticks": 40,
"hosts_inspected_per_patrol": 2,
"credential_rotation_interval_ticks": 150,
"patch_cycle_interval_ticks": 100,
"enabled": true
},
"network": {
"topology": "star",
"hosts": [
{ "ip": "10.0.1.1", "role": "gateway", "services": ["ssh", "http"] },
{ "ip": "10.0.1.10", "role": "workstation", "services": ["smb"] },
{ "ip": "10.0.1.50", "role": "server", "services": ["ssh", "ftp", "postgres"] }
]
}
}
The sysadmin_config field is optional. If omitted, the Active Defense AI difficulty is derived from target_security_level. Set "enabled": false to disable the defender entirely for your contract.
Hosts may include web_apps (attack surfaces for nikto/sqlmap), privesc_vectors (SUID/sudo/cron for linpeas), and tls_config (cipher suites for sslscan).
Extending Contracts
"contracts": { "extend": [ { "id": "existing_contract_id", "patch": { "briefing": "Updated briefing text...", "add_objectives": [ { "type": "CUSTOM_CONDITION", "description": "Leave no logs" } ], "add_hosts": [ { "ip": "10.0.1.99", "role": "honeypot" } ] } } ] }
$ Modding: Factions
Add entirely new factions, extend existing ones, or override (warned — affects narrative coherence).
Adding a Faction
{
"faction_id": "neon_circuit",
"display_name": "Neon Circuit",
"type": "hacktivist",
"description": "Digital artists turned hacktivists. Code is art, art is resistance.",
"handle": "pixel_prophet",
"rivals": ["meridian_group"],
"allies": ["signal_collective"],
"contract_style": "Digital art installations on corporate networks",
"will_not_do": ["Destroy creative works", "Target independent artists"]
}
Extending a Faction
"factions": { "extend": [ { "faction_id": "signal_collective", "add_rivals": ["neon_circuit"] } ] }
$ Modding: Hardware
Add new hardware components to any of the six slots, extend existing components, or override.
Adding Hardware
{
"component_id": "quantum_nic",
"slot": "NIC",
"tier": 4,
"display_name": "Quantum NIC",
"price": 15000,
"effects": {
"scan_depth": 4,
"scan_speed_multiplier": 0.5
},
"prerequisites": {
"contracts_completed": 30
},
"description": "Quantum-entangled network interface. Sees everything."
}
Extending Hardware
"hardware": { "extend": [ { "component_id": "gpu_3", "add_effects": { "hash_rate_bonus": 0.5 }, "add_prerequisites": { "faction_rep_undermarket": 50 } } ] }
$ Modding: Operating Systems
Add entirely new operating systems with custom phosphor palettes, window manager models, starting hardware, and gameplay modifiers.
Adding an OS
{
"os_id": "iron_os",
"display_name": "IronOS",
"shorthand": "IRON",
"tagline": "Forged in fire",
"dominant_phosphor": "red",
"wm_model": "TILING",
"phosphor_palette": {
"bg": "#0a0000",
"fg_primary": "#ff4040",
"fg_secondary": "#cc3030",
"accent": "#ff6020",
"border": "#401010",
"selection": "#602020",
"comment": "#804040",
"alert_low": "#ff8040",
"alert_mid": "#ff4020",
"alert_high": "#ff0000"
},
"starting_hardware": {
"CPU": 1, "RAM": 1, "NIC": 1,
"STORAGE": 1, "GPU": 2, "COOLING": 1
},
"gameplay_modifiers": {
"heat_multiplier": 1.1,
"cpu_speed_bonus": 0.9
}
}
All 10 palette keys are required when adding a new OS. When extending, provide only the keys you're changing.
Extending an OS
"os": { "extend": [ { "os_id": "linux_forge", "patch_palette": { "accent": "#40ff80" }, "patch_modifiers": { "heat_multiplier": 0.85 } } ] }
$ Modding: CVE Catalog
Add custom fictional vulnerabilities to the game's CVE catalog. All entries must use the ZD- prefix — entries without it are rejected at load time.
Adding a Vulnerability
{
"zd_id": "ZD-2039-1001",
"title": "QuantumDB Authentication Bypass",
"severity": 9.1,
"affected_service": "quantumdb",
"affected_versions": "2.0.0-2.4.3",
"exploit_type": "auth_bypass",
"requires_auth": false,
"tier_minimum": 2,
"description": "Malformed auth token causes QuantumDB to skip credential verification."
}
Extending Existing CVEs
"cves": { "extend": [ { "zd_id": "ZD-2038-0042", "patch": { "affected_versions": "1.0.0-3.2.1", "severity": 9.8 } } ] }
zd_id does not start with ZD-. This is enforced at load time to prevent real CVE identifiers from appearing in the game.
$ Modding: Software Tools
Add custom installable software tools that players can download to their rig. Tools are required by certain commands (especially cloud operations) and consume rig storage.
Adding a Tool
{
"id": "quantum_scanner",
"display_name": "QuantumScan",
"description": "Advanced vulnerability scanner with quantum-accelerated pattern matching",
"size_kb": 128,
"required_by": ["qscan"],
"tier_minimum": 2,
"install_ticks": 5
}
Extending Existing Tools
"tools": { "extend": [ { "id": "aws_cli", "patch": { "size_kb": 96, "required_by": ["aws", "s3cmd"] } } ] }
$ Modding: Narrative
Add narrative fragments that appear as discoverable content during gameplay, each with unlock conditions.
Adding Narrative
{
"fragment_id": "iron_lore_01",
"title": "The Forge Master's Log",
"content": "Day 47. The compiler is sentient. I'm sure of it now...",
"tags": ["lore", "iron_os", "ai"],
"unlock_conditions": {
"contracts_completed": 10,
"os_id": "iron_os"
}
}
Extending Narrative
"narrative": { "extend": [ { "fragment_id": "existing_fragment", "add_content": "Additional paragraph appended...", "add_tags": ["conspiracy"] } ] }
$ Modding: Music
GHOSTWORK uses a 3-intensity-layer music system powered by Ovani. Every track has a main layer (always audible), an intensity_1 layer (fades in during tense moments), and an intensity_2 layer (fades in at critical heat). Layers crossfade automatically based on the game's mood system — modders provide raw audio files and metadata only.
Declare "music": "music/" in your addon manifest's content map. Inside that directory, create a tracks.json file — a JSON array of track definitions.
Track Schema
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique track identifier (snake_case) |
display_name | string | Yes | Human-readable name shown in settings |
reverb_tail | float | No | Reverb tail in seconds (default 5.0) |
mode | string | No | "intensities" (default), "loop30", or "loop60" |
layers | object | Conditional | Required for "intensities" mode (see below) |
file | string | Conditional | Required for "loop30"/"loop60" — single loop file |
Intensities Mode (Default)
The layers object maps layer names to .ogg or .wav file paths relative to the music directory:
| Layer | Required | When It Plays |
|---|---|---|
main | Yes | Always audible — the base drone |
intensity_1 | No | Fades in at TENSE mood (falls back to main) |
intensity_2 | No | Fades in at CRITICAL mood (falls back to main) |
Example: tracks.json
// music/tracks.json [ { "id": "sample_ambient", "display_name": "Sample Ambient Track", "reverb_tail": 4.0, "mode": "intensities", "layers": { "main": "base_drone.ogg", "intensity_1": "tension.ogg", "intensity_2": "critical.ogg" } }, { "id": "lofi_loop", "display_name": "Lo-Fi Loop", "mode": "loop30", "file": "lofi_30s.ogg" } ]
.ogg (Vorbis) and .wav. All three intensity layers should be the same tempo and bar length so they stay in phase during crossfades. Addon tracks appear in the Settings track selector, participate in random rotation, and are indistinguishable from core tracks.
$ Modding: Shell Presets
Customize the terminal with shell presets that define command aliases and environment variables. Declare "shell": "shell/" in your addon manifest's content map, then create a presets.json file.
Example: presets.json
// shell/presets.json { "extends": "default", "aliases": { "ll": "ls -la", "cls": "clear", "ports": "scan --ports" }, "variables": { "EDITOR": "nano" } }
extends inherits from the named base preset ("default" gives you all built-in aliases). Aliases expand at parse time — typing ll runs ls -la. Variables are available to commands via the shell environment.
$ Modding: Market Items
Add consumable items to the in-game market. Items provide one-shot effects like heat reduction, intel scanning, or credential reveals.
Adding a Market Item
{
"id": "thermal_dampener",
"name": "Thermal Dampener",
"description": "Emergency heat dissipation module. Single use.",
"price": 2500,
"category": "defense",
"effect_type": "heat_reduce",
"effect_value": 15.0,
"tier_required": 2,
"reusable": false
}
Effect types: heat_reduce, scrub_all, intel_scan, credential_reveal, forged_access, heat_reduction. Items with reusable: true persist in inventory after use.
Extending Market Items
"market_items": { "extend": [ { "id": "burner_phone", "patch": { "price": 1500, "effect_value": 20.0 } } ] }
$ Modding: IDS Signatures
Add custom intrusion detection rules to the signature-based IDS engine. Signature rules fire alongside anomaly detection during packet analysis.
Adding a Signature Rule
{
"rules": [
{
"id": "SIG-ADDON-001",
"name": "Custom Backdoor Pattern",
"matches": {"protocol": "tcp", "dst_port_range": [31337, 31337]},
"severity": "CRITICAL",
"detection_base": 0.8
}
]
}
Rule IDs must be unique across core and addon rules. Addon rules are appended to the core rule set during TrafficAnalysis initialization. Polymorphic encoders get 2× evasion bonus against signature detection.
Extending a Rule
{
"rules": [
{
"extends": "SIG-001",
"detection_base": 0.5,
"severity": "MEDIUM"
}
]
}
$ Modding: Poster Profiles
Add BBS poster handles with trust scores, faction affiliations, and law enforcement front status. Poster trust affects contract risk assessment and payout reliability.
Adding a Poster
{
"posters": {
"addon_poster": {
"trustScore": 60,
"confirmedJobs": 10,
"faction": "shadow_guild",
"isLeFront": false,
"bio": "A mysterious new fixer on the board."
}
}
}
isLeFront: true makes the poster a law-enforcement sting operation — contracts from this poster apply a payout multiplier and heat penalty. Use for difficulty mods or narrative twists.
Extending a Poster
{
"posters": {
"extends": "d4rkm4tter",
"trustScore": 65,
"bio": "Updated bio after a big job."
}
}
$ Modding: Encoders
Add custom encoding schemes for payload evasion. Encoders interact with the IDS evasion cap (0.95), AV evasion cap (0.95), and reliability compounding per iteration.
Adding an Encoder
{
"encoders": {
"addon_encoder": {
"name": "Custom Encoder",
"tier": 2,
"sizeMultiplier": 1.2,
"idsEvasion": 0.45,
"avEvasion": 0.35,
"reliabilityPenalty": 0.08,
"polymorphic": false,
"description": "A custom encoding scheme."
}
}
}
New encoders are available to msfvenom -e at the specified tier. Use msfvenom preview to verify balance after changing evasion values.
Extending an Encoder
{
"encoders": {
"extends": "xor",
"reliabilityPenalty": 0.03,
"description": "Rebalanced XOR encoding."
}
}
$ Modding: Config Overrides
Tune subsystem parameters without writing code. Place JSON files in your addon's configs/ directory, each targeting a core config by name.
Example: Tuning Web Attack Detection
{
"target": "web_attack_config",
"detectionConfig": {
"baseWafBypassChance": 0.35
}
}
Available Targets
| Target | Subsystem | What It Tunes |
|---|---|---|
web_attack_config | Web Attack Surface | WAF bypass, SQL/XSS patterns, scan heat |
privesc_config | Privilege Escalation | GTFOBins database, SUID/cron limits, enumerate heat |
supply_chain_config | Supply Chain | Typosquat distance, dep tree depth, checksums |
pki_config | PKI / Encryption | Weak protocols, cipher lists, key thresholds |
sysadmin_ai_config | Active Defense AI | Patrol timing, detection chances, honeypot/firewall tuning |
encoding_config | Encoding Engine | Evasion caps, reliability penalties, iteration limits |
siem_config | SIEM Forwarding | Forward delay, forwarded evidence types, volatile skip |
bbs_payout_config | BBS Economy | Payout step, escrow ratio, access fee, time bonus |
traffic_analysis_config | Traffic Analysis | Anomaly thresholds, signature weights, alert cooldown |
cert_pinning_config | PKI / TLS | HSTS enforcement, cert chain depth, pin bypass rules |
active_directory_config | Active Directory | Kerberoast success rate, golden ticket heat, credential rotation interval |
wireless_config | Wireless Attacks | Protocol difficulty, deauth capture rates, evil twin interception chances |
Merge Rules
Scalars (strings, numbers, bools) are replaced. Dictionaries are recursively merged. Arrays are appended. Multiple addons targeting the same config merge in load order.
$ Advanced Modding
Complete Addon Example
A full addon that adds a new faction, commands, contracts, custom vulnerabilities, tools, music, and shell aliases:
// addon.json { "id": "neon_circuit_pack", "name": "Neon Circuit Faction Pack", "version": "1.0.0", "author": "ExampleModder", "description": "Adds Neon Circuit faction with custom contracts and tools", "game_version_min": "1.0.0", "content": { "commands": "commands/", "factions": "factions/", "contracts": "contracts/", "cves": "cves/", "tools": "tools/", "music": "music/", "shell": "shell/" } }
Content Type Support Matrix
| Content Type | Add | Extend | Override | Notes |
|---|---|---|---|---|
| Commands | ✓ | ✓ | ✓ | JSON + optional .gd executor |
| Contracts | ✓ | ✓ | ✓ | Includes network topology |
| Factions | ✓ | ✓ | ✓ | Override warned — narrative impact |
| Hardware | ✓ | ✓ | ✓ | Any of 6 slots, custom tiers |
| Operating Systems | ✓ | ✓ | ✓ | 10 palette keys required for add |
| CVE Catalog | ✓ | ✓ | ✓ | ZD- prefix enforced at load time |
| Software Tools | ✓ | ✓ | ✓ | Installable tools with storage cost |
| Narrative | ✓ | ✓ | ✓ | Fragments with unlock conditions |
| Music | ✓ | — | ✓ | tracks.json — intensities or loop mode |
| Shell | ✓ | ✓ | — | Aliases and environment variables |
| Market Items | ✓ | ✓ | ✓ | Consumables with one-shot effects |
| IDS Signatures | ✓ | ✓ | ✓ | Signature rules for intrusion detection |
| Service Banners | ✓ | ✓ | ✓ | Enumeration banners with exploit bonus |
| Poster Profiles | ✓ | ✓ | ✓ | BBS posters with trust & LE front status |
| Encoders | ✓ | ✓ | ✓ | Payload encoding schemes for evasion |
| Config Overrides | — | ✓ | — | Deep-merge tuning for 10 subsystem configs |
Best Practices
- Prefer
addoveroverride. New content creates no conflicts. Overrides can collide. - Use
extendfor small changes. Adjusting a price or adding a flag is cleaner than a full override. - Set
load_orderthoughtfully. Default is 100. Content packs: 100–200. Total conversions: 900+. - Prefix your IDs. Use
neon_circuit_art_bombnotart_bombto avoid collisions. - Respect faction
will_not_doconstraints when adding contracts for existing factions. - Follow the existing price/effect curve for hardware. Proportional improvement, not exponential.
- Include a README in your addon directory with install instructions and known incompatibilities.
- Test alongside core content. Your addon should enhance, not break, the base game.
$ Modding API Reference
Complete field-level schema for every moddable content type. Download the machine-readable spec or browse inline.
modding_api_schema.json ships with the game at res://assets/data/modding_api_schema.json. Use it for IDE validation, linting, or building addon authoring tools.
Addon Manifest (addon.json)
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
id | String | Yes | — | Unique addon identifier (snake_case) |
name | String | Yes | — | Human-readable display name |
version | String | Yes | — | SemVer version (e.g. "1.0.0") |
author | String | Yes | — | Author or team name |
description | String | Yes | — | Short description |
game_version_min | String | Yes | — | Minimum game version (SemVer) |
dependencies | Array[String] | No | [] | Required addon IDs (loaded first) |
load_order | int | No | 100 | Lower loads first. Content packs: 100–200. Total conversions: 900+ |
content | Dictionary | Yes | — | Maps content type keys to directory paths |
Content map keys: commands, contracts, factions, hardware, os, narrative, music, shell, cves, tools, market_items, ids_signatures, service_banners, poster_profiles, encoders, configs
Commands
Field reference — 15 fields
| Field | Type | Req | Default | Validation | Description |
|---|---|---|---|---|---|
verb_id | StringName | Yes | — | Unique, snake_case | Command identifier |
signature | Dictionary | No | {} | — | Positional args and flag definitions |
base_heat | float | Yes | — | ≥ 0.0 | Heat generated per execution |
base_ticks | int | Yes | — | ≥ 1 | Simulation ticks consumed |
widget_kind | StringName | No | "" | table, record, stream, meter, "" | Output widget type |
intent_template | Array | No | [] | — | Intent display templates |
presentation_tier | int | No | 1 | 1–3 | Min player tier for full output |
max_presentation_tier | int | No | 0 | 0 = no max | Max tier with special output |
help_text | String | No | "" | — | One-line help text |
description | String | No | — | — | Longer man page description |
skip_flag_parse | bool | No | false | — | Bypass centralized flag validation |
outside_resolution | bool | No | false | — | Run after tick resolution |
accepts_structured_stdin | bool | No | false | — | Accept piped structured input |
executor_type | String | No | — | "alias" for data-only | If alias, uses alias_target |
alias_target | String | Cond. | — | Existing verb_id | Required when executor_type = alias |
Extend: extension_flags[] merged (core wins on collision), extension_subcommands[] merged. Override: replaces definition + executor, drops extensions.
Contracts
Field reference — 11 top-level + nested objects
| Field | Type | Req | Validation | Description |
|---|---|---|---|---|
id | String | Yes | Unique, snake_case | Contract identifier |
title | String | Yes | — | Board display name |
poster_handle | String | Yes | Matches poster profile | BBS poster handle |
briefing | String | Yes | — | Flavor text briefing |
risk_level | String | Yes | LOW/MED/HIGH | Risk classification |
base_payout | int | Yes | > 0 | Base credit payout |
time_limit_ticks | int | Yes | > 0 | Ticks before contract expires |
target_security_level | int | Yes | 1–3 | Network difficulty tier |
faction_tag | String | No | Existing faction_id | Associated faction |
objectives | Array | Yes | ≥ 1 entry | ObjectiveSpec array |
network_topology | Dictionary | Yes | — | Subnets, hosts, routing, credentials |
sysadmin_config | Dictionary | No | Derived from SL | Active Defense AI config |
ObjectiveSpec: objective_id, type (SESSION_ESTABLISH/FILE_EXFILTRATE/CUSTOM_CONDITION), target_description, completion_condition{}.
Host objects support: web_apps, privesc_vectors, tls_config, siem_config, security_flags, ca_chain, ad_domain, wireless_ap.
Extend: scalars replaced (addon wins), objectives[] appended, hosts{}/subnets{}/credentials{} merged.
Factions
Field reference — 4 fields
| Field | Type | Req | Validation | Description |
|---|---|---|---|---|
faction_id | String | Yes | Unique, snake_case | Faction identifier |
display_name | String | Yes | — | Player-facing name |
archetype | String | Yes | — | Faction type description |
rival_faction_ids | Array | No | Existing faction_ids | Rival factions (appended on extend) |
Override warned — changing core factions breaks narrative coherence.
Hardware
Field reference — 6 fields
| Field | Type | Req | Validation | Description |
|---|---|---|---|---|
component_id | String | Yes | Unique, snake_case | Component identifier |
slot | String | Yes | CPU/RAM/NIC/STORAGE/COOLING/GPU | Hardware slot |
tier | int | Yes | 1–4 | Tier level |
price | int | Yes | ≥ 0 | Market price in credits |
effects | Dictionary | Yes | — | Effect name → value pairs |
prerequisites | Array | No | — | Required component_ids |
Extend: effects{} merged (new keys added, skip existing), prerequisites[] appended.
Operating Systems
Field reference — 14 fields, 13-key palette
| Field | Type | Req | Validation | Description |
|---|---|---|---|---|
os_id | String | Yes | Unique, snake_case | OS identifier |
display_name | String | Yes | — | Player-facing name |
shorthand | String | Yes | 2–4 chars uppercase | Short abbreviation |
tagline | String | Yes | — | Flavor tagline |
dominant_phosphor | String/Array | Yes | Hex or RGBA | Primary theme color |
wm_model | int | Yes | 0 = Tiling | Window manager model |
phosphor_palette | Dictionary | Yes | 13 required keys | Full color palette |
starting_hardware | Array | Yes | — | Starting rig component IDs |
gameplay_modifiers | Dictionary | No | {} | Modifier overrides |
filesystem_style | String | No | — | unix or windows |
package_manager | String | No | — | Package manager command |
13 palette keys: bg, fg_primary, fg_secondary, fg_metadata, accent, border, selection, comment, alert_critical, alert_high, alert_mid, alert_low, success. All required for add; provide only changed keys for extend.
CVE Catalog
Field reference — 12 fields
| Field | Type | Req | Validation | Description |
|---|---|---|---|---|
id | String | Yes | Must start with ZD- | Fictional CVE identifier |
title | String | Yes | — | Vulnerability title |
description | String | Yes | — | Technical description |
affected_service | String | Yes | Valid service type | Target service |
affected_versions | Dictionary | Yes | {min, max} | Vulnerable version range |
os_types | Array | Yes | — | Affected OS types |
attack_type | String | Yes | — | rce, lfi, auth_bypass, etc. |
severity | String | Yes | — | critical/high/medium/low |
cvss_score | float | Yes | 0.0–10.0 | CVSS score |
exploit_complexity | String | Yes | — | low/medium/high |
required_tier | int | Yes | 1–3 | Minimum player tier |
compatiblePayloadCategories | Array | No | [] | Compatible payload types |
Software Tools
Field reference — 8 fields
| Field | Type | Req | Validation | Description |
|---|---|---|---|---|
id | String | Yes | Unique, snake_case | Tool identifier |
name | String | Yes | — | Display name |
category | String | Yes | — | recon, exploit, web, cracking, cloud, etc. |
tier | int | Yes | 1–3 | Min tier to purchase |
price | int | Yes | ≥ 0 | Market price in credits |
description | String | Yes | — | Tool description |
enables | Array | Yes | — | Capability flags this tool provides |
os_restriction | Array | No | [] (all) | OS types that can install |
Market Items
Field reference — 9 fields
| Field | Type | Req | Validation | Description |
|---|---|---|---|---|
id | String | Yes | Unique, snake_case | Item identifier |
name | String | Yes | — | Display name |
description | String | Yes | — | Item description |
price | int | Yes | > 0 | Price in credits |
category | String | Yes | — | defense, intel, tools |
effect_type | String | Yes | — | heat_reduce, scrub_all, intel_scan, etc. |
effect_value | float/int | Yes | — | Effect magnitude |
tier_required | int | Yes | 1–3 | Minimum player tier |
reusable | bool | Yes | — | Persists after use? |
IDS Signature Rules
Field reference — 5 rule fields + match criteria
| Field | Type | Req | Validation | Description |
|---|---|---|---|---|
id | String | Yes | Unique (e.g. SIG-ADDON-001) | Rule identifier |
name | String | Yes | — | Human-readable rule name |
matches | Dictionary | Yes | — | Pattern to match (see below) |
severity | String | Yes | LOW/MEDIUM/HIGH/CRITICAL | Alert severity |
detectionBase | float | Yes | 0.0–1.0 | Base detection probability |
Match fields: protocol (tcp/dns/icmp), flags (SYN/PSH-ACK), dstPortMin/dstPortMax, action (exploit_service/scan_host/exfiltrate/etc.), minBytes.
Service Banners
Field reference — 4 fields per service
| Field | Type | Req | Validation | Description |
|---|---|---|---|---|
template | String | Yes | May contain {version}, {hostname} | Banner text template |
loginPrompt | bool | Yes | — | Shows login prompt? |
commonVersions | Array | Yes | — | Version strings for network gen |
enumerationBonus | float | Yes | 0.0–1.0 | Exploit success bonus after enum |
Keyed by service type (matches services[].type in contract hosts). Default bonus: 0.15. Heat cost: 1.5.
Poster Profiles
Field reference — 5 fields per poster
| Field | Type | Req | Validation | Description |
|---|---|---|---|---|
trustScore | int | Yes | 0–100 | Starting trust score |
confirmedJobs | int | Yes | ≥ 0 | Completed job count |
faction | String | Yes | Existing faction_id | Associated faction |
isLeFront | bool | Yes | — | Law enforcement front? (1.5× payout, +25 heat) |
bio | String | Yes | — | Poster biography |
Keyed by poster handle. Handle must be unique across core and addon profiles.
Encoders
Field reference — 8 fields per encoder
| Field | Type | Req | Validation | Description |
|---|---|---|---|---|
name | String | Yes | — | Display name |
tier | int | Yes | 1–3 | Min tier for msfvenom -e |
sizeMultiplier | float | Yes | > 0.0 | Payload size multiplier (< 1.0 = compression) |
idsEvasion | float | Yes | 0.0–1.0 | IDS evasion contribution (cap: 0.95) |
avEvasion | float | Yes | 0.0–1.0 | AV evasion contribution (cap: 0.95) |
reliabilityPenalty | float | Yes | 0.0–1.0 | Compounds per iteration: pow(1-penalty, N) |
polymorphic | bool | Yes | — | Re-randomizes signature each tick (2× vs IDS) |
description | String | Yes | — | Encoder description |
Keyed by encoder_id. Global limits from encoding_config.json: stackingMax: 3, iterationMax: 10, idsEvasionCap: 0.95, avEvasionCap: 0.95.
Config Overrides
10 valid targets
| Target | Subsystem | Source File |
|---|---|---|
web_attack_config | Web Attack Surface | assets/data/web_attack_config.json |
privesc_config | Privilege Escalation | assets/data/privesc_config.json |
supply_chain_config | Supply Chain | assets/data/supply_chain_config.json |
pki_config | PKI / Encryption | assets/data/pki_config.json |
sysadmin_ai_config | Active Defense AI | assets/data/sysadmin_ai_config.json |
encoding_config | Encoding Engine | assets/data/encoding_config.json |
siem_config | SIEM Forwarding | assets/data/siem_config.json |
bbs_payout_config | BBS Economy | assets/data/bbs_payout_config.json |
traffic_analysis_config | Traffic Analysis | assets/data/traffic_analysis_config.json |
cert_pinning_config | PKI / TLS | assets/data/cert_pinning_config.json |
Extend only (no add or override). Scalars replaced, dictionaries recursively merged, arrays appended. Multiple addons merge in load order.
Narrative, Music & Shell
Field reference — remaining content types
Narrative Fragments: fragment_id (String, req), arc_id (String, req), carrier (int, req), content_type (int, req), criticality (int, 0=optional/1=important), unlock_conditions (Dictionary, req — type/count/faction_id/min_standing), placement (Dictionary, req — thread_title/poster_handle), content (String, req), tags (Array, opt).
Music Tracks: id (String, req), display_name (String, req), mode (String, default "intensities"; also "loop30"/"loop60"), reverb_tail (float, default 5.0), layers (Dictionary, req for intensities: main req, intensity_1/intensity_2 opt), file (String, req for loop modes). Formats: .ogg (Vorbis) and .wav. Add and Override only.
Shell Presets: extends (String, opt — base preset name), aliases (Dictionary, key → expanded command), variables (Dictionary, key → value). Add and Extend only (core wins on collision).
$ GDScript Runtime API
Custom command executors are GDScript files that run alongside verb JSON definitions. This section documents the classes and methods available to addon scripts at runtime.
Verb Executor Contract
Every custom command GDScript must follow this exact contract:
# commands/my_verb.gd extends RefCounted static func get_verb_id() -> StringName: return &"my_verb" static func execute(ctx: ExecutionContext) -> void: # Your logic here. ctx provides all system access. var vm := PresentationViewModel.new() vm.widget_kind = &"stream" vm.producer_id = "my_verb" vm.payload = {"lines": [{"text": "Hello from addon!"}]} vm.complete() ctx.result_vm = vm
get_verb_id() returns the StringName matching your JSON's verb_id. execute(ctx) receives an ExecutionContext and sets ctx.result_vm to a PresentationViewModel before returning.
ExecutionContext
The context object passed to every verb executor. It provides parsed arguments, injectable system seams, and the submit_and_wait() coroutine for requesting game-world actions.
Properties — arguments & state
| Property | Type | Description |
|---|---|---|
verb_id | StringName | The executing verb's ID |
verb_definition | VerbDefinition | The loaded verb definition resource |
args | Array | Positional arguments from the command line |
flags | Dictionary | Parsed flags (e.g. {&"deep": true, &"port": 22}) |
stdin | Variant | Piped input (null, PresentationViewModel, or String) |
is_pipe_stage | bool | True if this verb is mid-pipeline (piped output expected) |
session_host | StringName | Host ID of the current SSH/connect session |
session_id | String | Current session ID |
cwd | String | Current working directory on the connected host |
pane_id | int | Terminal pane this command runs in |
capability_context | Dictionary | Hardware/OS capability flags for this verb |
result_vm | PresentationViewModel | Set this to your output before returning |
System seams — injectable Callables
All system access is through injectable Callables. Addon verbs receive the same seams as core verbs — no autoloads needed.
| Seam | Signature | Description |
|---|---|---|
heat | (source, amount, reason) | Add heat to the player |
heat_dimensional | (source, amount, reason, dimension) | Add heat with NETWORK/HOST/BOTH dimension |
heat_read | () → Dictionary | Get dimensional heat breakdown |
heat_preview | (amount) → Dictionary | Preview heat change without applying |
heat_band | () → int | Current heat band (0=clean, 1=warm, etc.) |
nss_read | Callable | Read from the Network Simulation Substrate |
os_read | () → StringName | Get the player's active OS |
tier_read | () → int | Get current player tier (1–3) |
economy_read | () → int | Current credit balance |
economy_expense | (amount, source, desc) → int | Deduct credits (returns txn ID) |
faction_read | () → Dictionary | Faction standings |
hardware_read | () → Array[Dict] | Market hardware listings |
hardware_status | () → Array[Dict] | Current rig components |
hardware_purchase | (component_id) → Dictionary | Purchase a hardware component |
bbs_query | (action, id, params) → Dictionary | Query BBS contract board |
local_fs | (action, params) → Dictionary | Local filesystem operations |
capability_check | (vid, os) → bool | Check if verb is available for build |
presentation | (kind, payload, id) | Create a PresentationViewModel |
le_read | () → Dictionary | Law enforcement pressure summary |
payload_registry_read | () → PayloadRegistry | Access payload module registry |
encoding_engine_read | () → EncodingEngine | Access encoding engine |
environment | ShellEnvironment | Shell env vars and aliases |
command_history | CommandHistory | Per-pane command history |
verb_registry | VerbRegistry | Verb definitions lookup |
Utility methods
| Method | Returns | Description |
|---|---|---|
get_tier() | int | Convenience wrapper for tier_read (defaults to 1) |
resolve_path(path) | String | Resolves relative paths against cwd (handles ~, .., drive letters) |
submit_and_wait()
The coroutine for requesting game-world actions through the EventScheduler. Returns a Dictionary with "success": bool and action-specific result data.
var outcome: Dictionary = await ctx.submit_and_wait(
&"scan_host", # action name
StringName(target_ip), # target
{"depth": true} # params (optional)
)
Available actions — 36 intent types
| Action | Category | Description |
|---|---|---|
list_subnets | Recon | List known subnets in the target network |
scan_subnet | Recon | Scan a subnet for hosts |
scan_host | Recon | Scan a host for services |
scan_web_app | Recon | Scan a web application for vulnerabilities |
enumerate_service | Recon | Enumerate a service (banner, version, details) |
enumerate_privesc | Recon | Enumerate privilege escalation vectors |
tls_scan | Recon | Scan TLS configuration (ciphers, certs, HSTS) |
exploit_service | Exploit | Exploit a vulnerability on a service |
exploit_privesc | Exploit | Escalate privileges via a discovered vector |
fuzz_parameter | Exploit | Fuzz a web app parameter (SQLi, XSS, etc.) |
pass_the_hash | Exploit | Authenticate using a captured credential hash |
forge_certificate | Exploit | Forge a TLS certificate with stolen CA material |
mitm_intercept | Exploit | Man-in-the-middle interception on a connection |
connect | Session | Establish a session on a compromised host |
disconnect | Session | Close a session |
establish_tunnel | Session | Create a network tunnel through a host |
list_sessions | Session | List active sessions |
harvest_credentials | Post-exploit | Harvest credentials from a compromised host |
ls | Filesystem | List files on a remote host |
stat | Filesystem | Get file metadata |
read_file | Filesystem | Read a file from a remote host |
write_file | Filesystem | Write a file to a remote host |
delete_file | Filesystem | Delete a file on a remote host |
read_logs | Forensics | Read log files on a host |
scrub_logs | Forensics | Scrub local log entries (SIEM copies persist) |
timestomp_files | Forensics | Modify file timestamps |
siem_correlate | Forensics | Query/delete SIEM forwarded logs (requires SIEM host access) |
patch_service | Defense | Patch a service to close a vulnerability |
kerberoast | Active Directory | Extract Kerberos TGS tickets from service accounts on a domain controller |
golden_ticket | Active Directory | Forge a Kerberos TGT for persistent domain admin access |
dcsync | Active Directory | Replicate domain credentials via Directory Replication Service |
pass_the_ticket | Active Directory | Replay stolen Kerberos tickets on domain-joined hosts |
aircrack | Wireless | Crack wireless encryption (success varies by protocol) |
evil_twin | Wireless | Deploy rogue access point to intercept client traffic |
deauth | Wireless | Deauthentication attack to capture handshakes |
All actions return {"success": true/false, ...}. On failure, check outcome.get("reason") for the StringName error code. The action "cancelled" means the sysadmin AI interrupted the operation.
PresentationViewModel
The output object your verb builds and assigns to ctx.result_vm. It drives the terminal widget display.
| Property / Method | Type | Description |
|---|---|---|
widget_kind | StringName | &"table", &"record", &"stream", &"meter", or &"" |
producer_id | String | Your verb_id (for display attribution) |
payload | Dictionary | Widget-specific data (see below) |
complete() | void | Mark output as finished (state → COMPLETE) |
fail(message) | void | Mark output as failed with error message |
update_payload(data) | void | Merge new data into payload (emits updated) |
append_stream_lines(lines) | void | Append lines to a stream widget |
set_meter_value(value) | void | Update a meter widget's current value |
Widget Payload Formats
| Widget | Payload Structure |
|---|---|
"stream" | {"lines": [{"text": "...", "color": "#hex"}], "clear": bool} |
"table" | {"columns": ["Col1", ...], "rows": [["val1", ...]]} |
"record" | {"fields": [{"label": "...", "value": "..."}]} |
"meter" | {"label": "...", "value": 0.0, "max": 1.0} |
.gd scripts are loaded.
GHOSTWORK — A hacking simulation by Broken Sigil Studio
139 commands · 52 contracts · 6 operating systems · 18 hardware components · 52 CVEs · 12 payload modules · 6 encoders · 6 languages · 16 moddable content types