Configuration
Each kernel reads config.json from $JUICE_HOME/kernels/<name>/. First boot
creates this file; later starts read it without rewriting it. Apply a
configuration change by editing the file and restarting the kernel.
Known settings take their documented defaults when absent. An unrecognized key causes startup to fail, helping catch misspellings that would otherwise appear to configure a value. The file contains the credential-encryption key and is stored with mode 0600.
Identity and network
| Key | Default | |
|---|---|---|
world |
none | the network this kernel serves for life: play (no money), test (Arbitrum Sepolia), real (Arbitrum One), or the path to a world file. First boot asks; the answer is then recorded in the database, which is what later boots read |
rail_rpc |
empty | the URL the kernel uses to reach the chain, from a node provider or a node you run. Required on test and real. Ordinary configuration: change it and restart |
kernel_handle |
the directory name | the nickname this kernel reports |
bootstrap_peers |
the project’s public node | peers dialled to join the network. An empty list disables discovery |
fed_listen_addrs |
OS-assigned | where this kernel answers peers. Give each kernel its own when running more than one. A public node pins port 31313 |
Money
The fee rates below use basis points, or hundredths of a percent. The three
monetary settings—lottery, lottery_max, and credit_limit—use integer base
units.
| Key | Default | |
|---|---|---|
fee_bps |
2000 |
the kernel’s fee on each provider’s margin, in hundredths of a percent: 20% |
remote_bps |
500 |
markup added when serving another kernel: 5% |
import_bps |
500 |
fee retained when a local user calls another kernel: 5% |
lottery |
1000000 |
the face value this kernel’s buyers stake per cross-kernel call. 0 pays every debt exactly |
lottery_max |
5000000 |
the largest face value accepted from somebody else’s buyer |
credit_limit |
500000000 |
the ceiling on work delivered to other kernels and not yet paid for, across all peers together |
See The network economy.
Timing and retention
| Key | Default | |
|---|---|---|
remote_retry_interval_seconds |
60 |
how often parked cross-kernel calls are re-driven |
discovery_interval_seconds |
300 |
how often peers are enumerated and catalogues exchanged |
peer_retention_days |
90 |
how long an idle peer’s cached data is kept. Non-positive disables purging |
The retry interval controls how often pending calls are revisited. Their 24-hour maximum age is fixed by the protocol’s idempotency-record lifetime and cannot be configured separately.
Execution
| Key | Default | |
|---|---|---|
allow_local_sources |
false |
permit private-network URLs as action sources. Loopback is always permitted |
http_callback_url |
derived | the address dispatched endpoints call back on. Loopback may be plain HTTP; a public address requires TLS |
credentials_key |
generated at first boot | the key sealing upstream credentials. A value that is not a 32-byte key refuses the boot |
native.<name> |
see below | per-action price and settings for the standard library |
The native.llm settings select the language-model endpoint and model names;
the default endpoint is Ollama at http://localhost:11434.
native.lookup.default_limit defaults to 10. The compilation action defaults
to a price of 5 base units through native.tinygo.price; other built-in
actions default to zero.
Fuel, on a chain network
The world file supplies the rail’s fuel policy. These settings determine when
the rail buys ETH, the balance it targets, and the limits applied to that
purchase. They are not keys in the kernel’s config.json.
| Key | Arbitrum One | Arbitrum Sepolia | |
|---|---|---|---|
gas.min |
0.001 ETH | 0.0002 ETH | buy more below this |
gas.max |
0.003 ETH | 0.0004 ETH | buy up to this |
gas.feeBound |
0.0003 ETH | 0.0001 ETH | most it will pay for one purchase |
gas.slippageBps |
100 | 500 | tolerance above the quoted price |
venue |
— | — | the exchange it buys at: a Uniswap V3 router, quoter, wrapped-ETH address and fee tier |
See How the kernel keeps itself in fuel.
Logging, sessions, scripts
| Key | |
|---|---|
log_level, log_file, log_format |
structured logging. A log_file that cannot be opened refuses the boot |
auth_issuer, auth_audience, token_ttl |
the issuer and audience written into session tokens, and how long an access token lasts |
script_timeout_ms, script_memory_bytes |
the time and memory one WebAssembly execution may use |
Environment variables
The following environment variables provide bootstrap values, runtime overrides, and client login selection. Other environment variables do not configure Juice.
| Variable | |
|---|---|
JUICE_HOME |
the installation root. Default ~/.juice, absolute |
JUICE_BOOTSTRAP_PASSWORD |
the sys password at first boot, for a machine with no terminal |
JUICE_SECRET_KEY |
the session-signing secret, runtime only; never written to disk |
JUICE_CREDENTIALS_KEY |
the credential-sealing key, runtime only |
JUICE_LOG_LEVEL |
log level |
JUICE_ALLOW_LOCAL_SOURCES |
as allow_local_sources |
JUICE_AS |
the login the command line acts as |
Client files
The command-line client keeps kernel registrations and saved sessions under
$JUICE_HOME/client/:
client/config.json the kernels known, and which login is selected
client/credentials/ one file per login, named handle@kernel, mode 0600
Each saved login has its own token file, with access serialized by a session lock during refresh. Programs using the same saved login share that session; separate logins allow an agent and a person to authenticate independently. Credentials are sent only to the recorded address for their kernel.
The rest of the installation’s layout — where agents, services and interfaces keep
their state — is described in
ecosystem-standard.md.