2.2. JSON Configuration
config_template.json
The config template is the main configuration blueprint for your project. It is a JSON file with three top-level sections:
{
"run_message": { ... },
"default_agent_message": { ... },
"default_job_message": { ... }
}
run_message— controls the infrastructure: how many agents, how many jobs, resource limits.default_agent_message— the default configuration received by every agent (browser, proxy, fingerprint, and any custom fields).default_job_message— the default configuration received by every job dispatched to agents.
run_message — Infrastructure Settings
Controls how many agents and jobs are created, and their resource allocation.
"run_message": {
"image_name": "armada-agent",
"image_version": "latest",
"number_of_agents": 1,
"number_of_jobs": 1,
"agent_cpu": "500m",
"agent_memory": "512Mi"
}
| Field | Type | Description |
|---|---|---|
image_name |
string | Docker image name for agent pods |
image_version |
string | Image tag (e.g. "latest") |
number_of_agents |
int | Number of agent pods to deploy (parallelism) |
number_of_jobs |
int | Total number of job messages to dispatch to the queue |
agent_cpu |
string | CPU request per agent (Kubernetes notation, e.g. "500m") |
agent_memory |
string | Memory request per agent (Kubernetes notation, e.g. "512Mi") |
default_agent_message — Agent Configuration
This is the default configuration every agent receives. It typically includes browser, proxy, and fingerprint settings. You can add any custom fields your script needs — they will be accessible through agent_ctx.agent_message in your code.
"default_agent_message": {
"config_fantomas": {
"config_browser": {
"fantomas_browser_options": [
"--proxy-server=http://127.0.0.1:8081",
"--ignore-certificate-errors",
"--window-size=1500,1200",
"--start-fullscreen"
],
"fantomas_emulate_movement": 1,
"fantomas_show_cursor": 0,
"fantomas_emulate_keyboard": 1
},
"config_screen": {
"screen_visible": "$env_SCREEN_VISIBLE",
"screen_height": 1500,
"screen_width": 2000
}
},
"config_proxy": {
"upstream_proxy_enabled": 1,
"upstream_proxy_broker_type": "provider",
"proxy_provider_name": "iproyal",
"verify_ip": 0,
"verify_quality": 0,
"max_queries_number": 3
},
"config_fingerprint": {
"antibot_vendor": "arkose",
"website": "X",
"collection_date_day": "01",
"collection_date_month": "12",
"collection_date_year": "2025"
}
}
config_fantomas (Browser Automation)
| Field | Description |
|---|---|
fantomas_browser_options |
Chrome command-line flags |
fantomas_emulate_movement |
Enable WindMouse human-like cursor movement (1/0) |
fantomas_show_cursor |
Render cursor on screen for debugging (1/0) |
fantomas_emulate_keyboard |
Enable randomized keystroke emulation (1/0) |
screen_visible |
Show Xvfb display (1 = visible, 0 = headless). Use $env_SCREEN_VISIBLE for runtime control |
screen_height / screen_width |
Virtual display resolution |
For details on WindMouse and keystroke emulation, see the Fantomas Overview.
config_proxy (Proxy Layer)
Controls the local mitmproxy and optional upstream proxy. Key fields: upstream_proxy_enabled (0/1), upstream_proxy_broker_type ("provider"/"direct"), proxy_provider_name, proxy_location, verify_ip, verify_quality, quality_threshold, max_queries_number.
For the complete field reference, proxy modes, addon system, and usage examples, see the Proxy Provider guide.
config_fingerprint (Fingerprint Forging)
Controls browser fingerprint retrieval. Key fields: antibot_vendor, website, collection_date_day/_month/_year.
For the complete field reference and usage examples, see the Fingerprint Provider guide.
default_job_message — Job Configuration
This is the default payload every job receives. Add any fields your script needs at the job level — they will be accessible through job_ctx.job_message in your code.
"default_job_message": {
"job_content": "default_job_content"
}
You can add any arbitrary keys both in default_job_message and default_agent_message. They are all passed as-is to the agent.
Environment Substitution
Environment substitution lets the same config_template.json work across different environments (local development vs. Kubernetes production) without modification. Values that need to change between environments are expressed as $env_ placeholders and resolved at launch time.
How It Works
Any string value in config_template.json that starts with $env_ is a placeholder. At launch time, the system recursively walks the entire JSON tree — objects, arrays, nested structures — and replaces every $env_ string with the corresponding value from the selected config tune file (config_local.json or config_distant.json).
The resolution rule is simple:
- Strip the
$env_prefix → the remainder is the lookup key. - Search for that key in the config tune file.
- If found, replace the placeholder with the tune value. If not found, keep the original placeholder string unchanged.
Example
In config_template.json:
"screen_visible": "$env_SCREEN_VISIBLE"
In config_local.json (for local development):
{
"SCREEN_VISIBLE": 1
}
In config_distant.json (for Kubernetes production):
{
"SCREEN_VISIBLE": 0
}
Result: when launching in local mode (container or workbench), screen_visible becomes 1 (visible for debugging). When launching in distant mode, it becomes 0 (headless).
Type Substitution
Although the placeholder itself is always a JSON string ("$env_SCREEN_VISIBLE"), the replacement value takes the type defined in the config tune file. In the example above, the integer 1 replaces the string placeholder — the resulting config contains a number, not a string.
This means tune files can inject any JSON-compatible type: strings, numbers, booleans, objects, or arrays.
Where Substitution Happens
Environment substitution is performed in two places depending on the launch mode:
| Launch mode | Performed by | When |
|---|---|---|
| Frontend (distant mode or container mode) | configProcessor.ts → replaceEnvValues() |
Before sending the config to the orchestrator |
| Workbench (workbench mode) | get_messages.py → replace_env_values() |
When loading config from disk at startup (see Workbench Mode) |
Both implementations use the same recursive algorithm, so behavior is identical regardless of launch mode.
Adding a New Placeholder
- In
config_template.json, use a$env_-prefixed string as the value for any field:
"my_custom_field": "$env_MY_CUSTOM_VALUE"
- Add the corresponding key (without the
$env_prefix) to both config tune files:
In config_local.json:
{
"SCREEN_VISIBLE": 1,
"MY_CUSTOM_VALUE": "local_value"
}
In config_distant.json:
{
"SCREEN_VISIBLE": 0,
"MY_CUSTOM_VALUE": "production_value"
}
The placeholder name after $env_ must match the key name in the config tune file exactly.
Config Tune Files
Config tune files provide the environment-specific values that replace $env_ placeholders.
config_local.json — Local Development
Used when running via Docker Compose. Typically enables visible screens for debugging:
{
"SCREEN_VISIBLE": 1
}
config_distant.json — Kubernetes Production
Used when deploying to a Kubernetes cluster. Typically disables visible screens:
{
"SCREEN_VISIBLE": 0
}
You choose which config tune file to use in the frontend before launching. The default is config_distant.json.
Adding Custom Fields
Both default_agent_message and default_job_message accept arbitrary keys. To add a custom field:
- Add it to the appropriate section in
config_template.json:
"default_agent_message": {
"config_fantomas": { ... },
"config_proxy": { ... },
"my_custom_setting": "some_value"
}
- Access it in your script:
async def ctx_script(job_ctx, agent_ctx):
my_setting = agent_ctx.agent_message["my_custom_setting"]
The same applies to default_job_message — any key you add is accessible via job_ctx.job_message. See Python Files for the full AgentContext and JobContext APIs.