Skip to content

Neo environment variables

This file is generated-from / must-match src/runtime/env-settings.ts's ENV_SETTINGS table. Every NEO_* var Neo reads has one row below, transcribed from that registry (name, default, parse convention, description, where it applies). A drift-guard test (tests/runtime/env-settings.test.ts) asserts every ENV_SETTINGS entry name appears in this file, so the two cannot silently diverge — if you add or rename a var in the registry, update this table in the same change.

Non-NEO_* env vars (provider API keys, TELEGRAM_BOT_TOKEN, SystemRoot, PATH, …) are out of scope for this table — see docs/channels.md for channel gateways and provider docs for keys.

Parse conventions (kind column)

Chip 15 centralizes reads but deliberately does not unify parse semantics — each var keeps its exact historical behavior. The kind column names the convention; see src/runtime/env-settings.ts's parse-helper docstrings (offSentinel, strictOne, truthy, positiveIntMs, strictPositiveInt, nonNegativeIntMs, cron, multiSentinelFalsy, bypassKillswitchTruthy) for the exact rules of each:

kindmeaning
flag-off-sentinelenabled unless the value is the literal string 'off'
flag-on-sentinelenabled iff the value is the literal string 'on'
flag-oneenabled iff the value is the literal string '1'
flag-one-or-trueenabled iff '1' or 'true' (exact strings, no trim/case-fold)
flag-truthytrim + lowercase, 1/true/yes[/on] enable — variant differs per site, see description
multi-sentinel-falsyunset ⇒ enabled; else trim + lowercase, disabled iff off/false/0/''
int-positivepositive integer with a fallback (parseInt or Number() — see description)
int-nonnegnon-negative integer; invalid/unset falls through to the next precedence level
stringraw (possibly trimmed) string passthrough
pathfilesystem path override
cron5-field cron expression, validated; invalid falls back to the default
custombespoke semantics — see the description

Daemon-scoped variables

Daemon lifecycle, budget, gates, job timeouts, and Tier-0 cron overrides are listed in daemon.md as well as the table below — daemon.md adds operational narrative (what each gate protects, failure modes); this table is the flat, authoritative inventory.

Full inventory

VariableKindDefaultDescriptionOriginal site
NEO_MEMORY_DREAMINGflag-off-sentinelonSoul capability: weekly dream/consolidation passruntime/capability-flags.ts:64
NEO_REFLECTIONflag-off-sentinelonSoul capability: cross-session reflection passruntime/capability-flags.ts:64
NEO_ATTUNEMENTflag-off-sentinelonSoul capability: emotional-attunement heuristicsruntime/capability-flags.ts:64
NEO_HEARTBEATflag-off-sentinelonSoul capability: proactive heartbeat jobruntime/capability-flags.ts:64
NEO_SIGNALSflag-off-sentinelonSoul capability: Gmail/Calendar signal pollerruntime/capability-flags.ts:64
NEO_HOMEpath~/.neoRoot ~/.neo directory override (test isolation)runtime/paths.ts:20 (canonical)
NEO_DAEMONflag-on-sentineloff (unset)Always-on daemon explicit opt-inruntime/daemon/spawn.ts:84
NEO_DAEMON_SINGLE_HOSTflag-oneoff (unset)Skip the synced-filesystem daemon refusalruntime/daemon/daemon.ts:139 + spawn.ts:87
NEO_DAEMON_DAILY_TOKEN_BUDGETcustom2000000Daily Tier-0 token cap; off/0 = unlimitedruntime/daemon/budget.ts:183-191
NEO_DAEMON_ACTIVITY_GATEflag-off-sentinelonSkip dream/reflect passes on a quiet houseruntime/daemon/activity-gate.ts:71-73
NEO_HEARTBEAT_CONTENT_GATEflag-off-sentinelonSkip heartbeat LLM call when content is unchangedruntime/daemon/heartbeat-content-gate.ts:79-82
NEO_JOB_TIMEOUT_MSint-nonneg1200000 (20m)Global daemon-job wall-clock ceiling (0 disables)runtime/daemon/job-timeout.ts:72-80
NEO_JOB_TIMEOUT_MS_<JOBNAME>int-nonnegfalls through to NEO_JOB_TIMEOUT_MSPer-job ceiling override (e.g. NEO_JOB_TIMEOUT_MS_DREAM)runtime/daemon/job-timeout.ts:72-80
NEO_DREAM_MIN_INTERVAL_MSint-nonneg3600000 (1h)Dream job re-entry throttle floorruntime/daemon/jobs/dream-job.ts:61-69
NEO_HEARTBEAT_MIN_INTERVAL_MSint-nonneg1800000 (30m)Heartbeat job re-entry throttle floorruntime/daemon/jobs/heartbeat-job.ts:135-143
NEO_REFLECTION_MIN_INTERVAL_MSint-nonneg3600000 (1h)Reflection job re-entry throttle floorruntime/daemon/jobs/reflection-job.ts:85-93
NEO_SIGNALS_MIN_INTERVAL_MSint-nonneg600000 (10m)Signal-poller job re-entry throttle floorruntime/daemon/jobs/signal-poller-job.ts:88-96
NEO_EFFICIENCY_ATTEST_MIN_INTERVAL_MSint-nonneg60000 (1m)Monitoring-attestation job re-entry throttle floorruntime/daemon/jobs/attestation-job.ts
NEO_HEARTBEAT_ACTIVE_HOURSstringalways activeHeartbeat active-hours window "START-END" (local 24h)runtime/daemon/jobs/heartbeat-job.ts:324
NEO_MEMORY_DREAMING_CRONcron0 2 * * 0Dream pass cron overrideruntime/dream-scheduler.ts:53-57
NEO_HEARTBEAT_CRONcron*/30 * * * *Heartbeat cron overrideruntime/heartbeat-scheduler.ts:37-41
NEO_REFLECTION_CRONcron0 3 * * *Reflection pass cron overrideruntime/reflect-scheduler.ts:35-39
NEO_SIGNALS_CRONcron*/15 * * * *Signal-poll cron overrideruntime/signal-scheduler.ts:39-43
NEO_EFFICIENCY_ATTESTflag-off-sentinelonContext-efficiency monitoring-attestation refresh job (default-on)runtime/reflect-scheduler.ts (efficiencyAttestationEnabled)
NEO_EFFICIENCY_ATTEST_CRONcron*/10 * * * * (every 10m)Monitoring-attestation refresh cron overrideruntime/reflect-scheduler.ts (efficiencyAttestCron)
NEO_SESSION_IDLE_MSint-positive1800000 (30m)Agent-server idle-session eviction windowruntime/agent-cli.ts:174
NEO_SESSION_SWEEP_MSint-positive60000 (1m)Agent-server idle-sweep cadenceruntime/agent-cli.ts:176
NEO_REQUEST_TIMEOUT_MSint-positive0 (disabled)Agent-server per-request hard cap (0 = disabled)runtime/agent-cli.ts:184
NEO_DEBUG_TOOL_SCHEMAflag-oneoff (unset)Tool-schema cache determinism guardruntime/tool-schema-cache.ts:42-44
NEO_PRINT_MODE_LOGSflag-oneoff (unset)Keep structured logs (stderr) in print moderuntime/cli.ts:149
NEO_DEBUG_CODEX_BODYflag-oneoff (unset)Dump Codex request bodies to stderrproviders/openai-oauth-http-provider.ts:845
NEO_EGRESS_GATE_DEBUGflag-oneoff (unset)Egress-gate diagnostic logging (never weakens the gate)security/egress-gate/gate.ts (new in Wave R1a)
NEO_MODELstringunset (providers.json defaultModel)One-shot default-model override (/model command)runtime/config-loader.ts:333
NEO_PROVIDERstringunset (providers.json defaultProvider)One-shot default-provider overrideruntime/config-loader.ts:334
NEO_PROVIDER_TIMEOUT_MSint-positive600000 (10m, Number() convention)Provider SDK client timeoutproviders/provider-timeout.ts:34-40
NEO_UNATTENDED_RETRYflag-one-or-trueoff (unset)Persistent retry for unattended (daemon) runsproviders/retry.ts:113-116
NEO_VERSIONstring0.1.0Version stamped into the Codex-facing user agentproviders/openai-oauth-http-provider.ts:139 + openai-image-client.ts:121
NEO_MEMORY_RAG_MIN_SIMILARITYcustom0.15RAG cosine-similarity floor; off disablesmemory/embeddings/retrieval.ts:42-58
NEO_MEMORY_RAG_DECAY_RANKINGflag-off-sentinelonRAG decay-aware (retrievability) rankingmemory/embeddings/retrieval.ts:66-68
NEO_REFLECTION_FEEDBACKflag-off-sentinelonInject reflection insights into the agent loopcore/agent-loop/core.ts:49-51
NEO_ATTUNEMENT_LIVEcustomoff (heuristic floor only)Opt-in per-turn LLM live-state read (=== 'llm')runtime/agent-sections.ts:309-311
NEO_MEMORY_RAGcustomauto (on iff embedder configured)RAG prefetch mode (on/ensemble/off; unset = auto)memory/prefetch.ts:100
NEO_MEMORY_EMBEDDING_CONFLICTSmulti-sentinel-falsyonEmbedding-similarity conflict detection in dreammemory/embeddings/conflict-detector.ts:60-65
NEO_MEMORY_CONFLICT_ADJUDICATIONmulti-sentinel-falsyonLLM conflict adjudication in dreammemory/distillation/dream.ts:98-103
NEO_MEMORY_ARCHIVE_BACKSTOPflag-off-sentinelonDream archive backstop for stale memoriesmemory/distillation/dream.ts:881-883
NEO_MEMORY_ARCHIVE_BACKSTOP_CYCLESint-positivemodule default (3)Archive-backstop cycle threshold (int >= 1, parseInt)memory/distillation/dream.ts:886-892
NEO_AUTO_MEMORY_DIRpathgetNeoDir()Auto-memory base directory overridememory/auto-memory/paths.ts:35-37
NEO_TOOL_RESULTS_DIRpath~/.neo/tool-resultsTruncated-tool-result persistence directorycore/executor/helpers.ts:453-455
NEO_MEDIA_DIRpath~/.neo/mediaInbound channel-media persistence directorychannels/_media-store.ts:52
NEO_TELEMETRY_FILEpath~/.neo/telemetry/events.jsonlTelemetry events.jsonl path (token-report)bin/token-report.ts:22
NEO_PROFILEstringmobile_minimalChannel gateway tool-policy profile namebin/neo-tg.ts:61 + bin/neo-wa.ts:78
NEO_BINpathunset (required by channels)Path to compiled neo.js for NdjsonChild spawnschannels/_ndjson-child.ts:17
NEO_ENGINEcustomembeddedChannel endpoint engine ('isolated' opts out of embedded)channels/_endpoint.ts:51
NEO_DISABLE_BYPASSflag-truthyoff (1/true/yes/on, trim+ci)Kill-switch for bypass permissions modepermissions/bypass-killswitch.ts:21-25
NEO_LIVE_DRIVER_ENABLEflag-oneoff (unset)Consent gate for the live eval driver (real LLM calls)eval/live-driver/scheduler.ts:81
NEO_BEHAVIOR_EVAL_DIRpath./.neo/behavior-evalBehavior-eval output directoryruntime/live-queue.ts:294
NEO_BUNDLED_SKILLS_ROOTpathresolved from package layoutBundled-skills root override (non-empty string)skills/bundled-extractor.ts:64-68
NEO_POWERSHELL_PATHpathauto-detectedPowerShell executable path override (non-empty string)util/powershell-path.ts:81-85
NEO_WINDOWS_JOB_CONTAINMENTflag-off-sentinelonWindows managed-Job containment; literal off selects observable direct-root-only rollbackruntime/windows-job-containment.ts
NEO_UPDATE_CHECKflag-off-sentinelonPassive npm-registry version check that powers the TUI update banner; off disablesruntime/update-check.ts
NEO_EFFICIENCY_CHECKPOINT_LEVELlever-ceilingoffCompaction-checkpoint lever (W1) operator ceiling — can only narrow behavior below the provisioned policy, never enable beyond itruntime/env-settings.ts (new — Context-Efficiency W0)
NEO_EFFICIENCY_COMPRESSION_LEVELlever-ceilingoffCommand-output-compression lever (W2) operator ceiling — can only narrow behavior below the provisioned policy, never enable beyond itruntime/env-settings.ts (new — Context-Efficiency W0)
NEO_EFFICIENCY_READ_CACHE_LEVELlever-ceilingoffRead-cache lever (W3) operator ceiling — can only narrow behavior below the provisioned policy, never enable beyond itruntime/env-settings.ts (new — Context-Efficiency W0)
NEO_EFFICIENCY_ROUTING_LEVELlever-ceilingoffModel-routing-downshift lever (W4) operator ceiling — can only narrow behavior below the provisioned policy, never enable beyond itruntime/env-settings.ts (new — Context-Efficiency W0)
NEO_EFFICIENCY_BEHAVIORAL_LEVELlever-ceilingoffBehavioral-steering lever (W5) operator ceiling — can only narrow behavior below the provisioned policy, never enable beyond itruntime/env-settings.ts (new — Context-Efficiency W5)
NEO_EFFICIENCY_CONSERVE_LEVELlever-ceilingoffQuota-conserve lever (R2b) operator ceiling — can only narrow behavior below the provisioned policy, never enable beyond itruntime/env-settings.ts (new — Context-Efficiency R2b)
NEO_EFFICIENCY_DUPLICATE_GUARD_LEVELlever-ceilingoffDuplicate-guard lever (R3b) operator ceiling — can only narrow behavior below the provisioned policy, never enable beyond itruntime/env-settings.ts (new — Context-Efficiency R3b)
NEO_CODE_HARNESS_SELF_HEALflag-off-sentinelonCross-backend self-heal (R3a): re-dispatch a transport-killed delegated run once on a sibling backend serving the same model class. Set to off to restore hard-failruntime/env-settings.ts (new — Context-Efficiency R3a)
NEO_SUPPRESS_WARNINGSflag-truthyoff (1/true/yes, trim+ci; module-cached with refresh hook)Suppress warn-level structured-log output. Left owned by logger.ts: it is module-cached at logger-module load with its own live-refresh hook, and importing it into env-settings.ts would risk a circular import back into the logger every other module (including this one, transitively via errors) depends on.observability/logger.ts:55
NEO_FLAG_<NAME>flag-truthyfalls through to flags.json then call-site defaultFeature-flag env override family (truthy/falsy pair). Left owned by feature-flags.ts: it is a dynamic family (one var PER flag name, resolved at runtime from flags.json keys), not a fixed set of named vars a static registry entry can enumerate.runtime/feature-flags.ts:42-48 (dynamic family — stays owned there)

Default-on capabilities (Wave 1 — "Waking the Soul")

NEO_MEMORY_DREAMING, NEO_REFLECTION, NEO_ATTUNEMENT, NEO_HEARTBEAT, and (since vision-waves W2.3) NEO_SIGNALS are default-ON. A 2026-07 audit found these capabilities existed, were tested, and worked — but were default-off, so on the live install user-profile.md was never generated after months of real use: built-but-off is, behaviorally, off. The fix is a polarity flip.

'off' is the only disable sentinel — capabilityEnabled() (src/runtime/capability-flags.ts) returns true for every other value: unset, 'on', garbage, or an empty string. There is no truthy/falsy parsing (contrast with the unrelated NEO_FLAG_<NAME> system above). To opt a capability back out, set it explicitly:

sh
NEO_MEMORY_DREAMING=off
NEO_REFLECTION=off
NEO_ATTUNEMENT=off
NEO_HEARTBEAT=off
NEO_SIGNALS=off

During neo login onboarding (src/cli/onboarding/always-on.ts), accepting always-on now asks "keep X enabled?" for each capability — declining writes NEO_X=off to ~/.neo/.env; accepting (or an unattended default) writes nothing, since the absence of the var already means enabled. Autostart (src/runtime/daemon/autostart.ts) forwards a live =off value into the baked launcher env so the opt-out survives service restarts — the failure mode is inverted from the old default-off world: forgetting to forward the flag now silently RE-enables a capability the user turned off, not the other way around.

Config-backed behavior toggles (CLI-expansion follow-up)

The five soul-capability flags above, plus NEO_REFLECTION_FEEDBACK and NEO_MEMORY_RAG_DECAY_RANKING, are now ALSO settable through settings.json's behavior.* block — reachable via the generic neo config get/set/unset commands (see docs/cli.md's "Behavior toggles" subsection under Config). No new command was added; behavior is just a new dotted-path section under settings.

Precedence: env > config > default. When the env var is explicitly set it always wins (back-compat: anyone relying on the env var today keeps working unchanged); when unset, settings.behavior.<key> applies; when both are unset, the toggle defaults to enabled. This mirrors the existing applyProviderEnvOverrides convention for NEO_MODEL/NEO_PROVIDER (runtime/config-loader.ts) — an explicit env var is a live, restart-scoped override. The resolver lives in src/runtime/behavior-settings.ts (resolveCapabilityEnabled / resolveReflectionFeedbackEnabled / resolveRagDecayRankingEnabled); capability-flags.ts/env-settings.ts themselves stay env-only and pure (avoiding an import cycle with config-loader.ts — see that module's doc comment).

sh
neo config set behavior.reflection false   # same effect as NEO_REFLECTION=off
neo config get behavior.reflection
neo config unset behavior.reflection       # back to default (enabled)

Every other env var in this document (paths, secrets, ports, one-shot model overrides, debug toggles) is deliberately NOT bridged into config — this bridge is scoped to the vision-waves behavior/feature toggles only, per the CLI-expansion follow-up brief.