Brainy Brainy
Docs Brainy

License Artifacts

In this section

There is one artifact: your license key. This page is the complete inventory of everything the engine reads or writes on its account, what a legacy install needs to migrate, and what the key issuer must mint.

The inventory

Artifact

Location

Written by

Required

The key, as BRAINY_LICENSE

process environment

you

one of these two

The key, as a file

~/.config/soulcraft/brainy-license (mode 0600)

you

one of these two

That is the whole list. The engine writes no license state to disk — no cache, no grace file, no activation record. There is nothing to clean up, nothing to copy when you move a deployment, and nothing that can go stale and give a wrong answer later.

The key

A license key is a complete, self-contained Ed25519-signed JWT. It verifies offline, against a public key compiled into the engine's binary: no network call, at install, at first boot, or ever. Air-gapped deployments are a first-class case, not a workaround.

Resolution order — first hit wins:

  1. BRAINY_LICENSE — the environment variable. Always wins, so a deploy can inject the key with no filesystem write at all: CI, immutable images, serverless, Vault / Secret Manager.

  2. ~/.config/soulcraft/brainy-license — the machine file. One key per machine. Mode 0600; contents are the key itself, and a trailing newline is fine (echo "$KEY" > file does the right thing).

# either one — the env var is the recommended shape for anything deployed
export BRAINY_LICENSE="sc_brainy_..."

mkdir -p ~/.config/soulcraft
printf '%s\n' "sc_brainy_..." > ~/.config/soulcraft/brainy-license
chmod 600 ~/.config/soulcraft/brainy-licenseBASH

Check what the engine actually sees — the same resolver, the same verifier a real open uses, so the readout cannot disagree with a running database:

npx brainy license statusBASH

It prints the source, product, tier, expiry, renewal window and a key fingerprint. It never prints the key, writes no file, and opens no socket.

Expiry, and what it does not do

state

what happens

more than 30 days left

opens; silent

within 30 days

opens at full speed, and says how many days remain — one line at open, one a day after

expired

the engine REFUSES to open — no native providers, no store touched, no JS fallback running underneath the refusal. Prints why, once, loudly, naming the exit door, then stops.

A running database is never darkened. The key is checked when the engine opens and at no other moment, so a key that lapses under a serving brain changes nothing: queries keep being answered and writes keep landing, for as long as that process lives. Nothing on a timer, on a network, or on disk can revoke a database that is already up.

And nothing here locks your data. A license buys the right to open with native acceleration — not the data itself. An unlicensed or expired install refuses to open (David ruled 2026-09-17: no fallback, ever — "unlicensed would just stop"), but the refusal names the way out: Open Brainy reads and writes the identical store with no key at all, so the data was never hostage to begin with. There is no kill switch.

Perpetual coverage (paidThrough)

LICENSE clause 3(a) is a term, not just a behavior: every version of the Software released while a key was valid keeps running with full native acceleration forever, even after that key lapses. Renewing buys coverage for future releases — it never revokes what a key already covered.

A key that carries the optional paidThrough claim (a Unix-seconds coverage boundary) is verified against this build's own release date — a value baked into the binary at build time — instead of against wall-clock time:

comparison

verdict

key.paidThrough >= build.releaseDate

valid, perpetually, for THIS build — independent of wall-clock. A key that has long since lapsed still opens every build it once covered.

key.paidThrough < build.releaseDate

refused — loudly, and never locking: this build was published after the key's coverage window closed. Cure: renew, or run any release from inside the covered window at full speed forever.

paidThrough absent from the key

the key is judged on exp alone — the law exactly as it was before this claim existed. Issued keys never break.

Wall-clock time still matters while a build IS covered: the same 30-day renewal-window narration this page describes above for exp applies to paidThrough too — once now is inside 30 days of the coverage boundary, brainy license status narrates a countdown, purely informational, telling you when future releases will need a renewed key. It can never turn a build that already cleared the table above back into a refusal.

A release's date is its UTC calendar day, taken at 00:00:00Z; the issuer mints paidThrough for the END of a covered day (23:59:59Z, the same convention exp already uses) so a coverage boundary landing on the same calendar day as a release still covers it.

There is no telemetry

None. Not opt-out, not opt-in. The engine contains no beacon, no analytics, no phone-home of any kind: license verification is offline, and nothing in the engine ever contacts Soulcraft. (An optional beacon existed in a pre-release draft of 11.0.0 and was removed before the cut — the absence is pinned by a test, so it cannot quietly grow back. If you carried BRAINY_LICENSE_TELEMETRY=off from that draft, the variable is now meaningless and can be deleted.)

Migrating a pre-11 install

Everything below keeps working — you are not required to change anything. The migration is a tidy-up, not a break.

you have

still works?

do this when convenient

COR_LICENSE_KEY, CORTEX_LICENSE_KEY or SOULCRAFT_LICENSE set

yes, forever — with one log line naming the current variable

rename it to BRAINY_LICENSE

a key starting sc_cor_ or sc_cortex_

yes, forever — issued keys never break

nothing; it stays valid to its own expiry

.soulcraft.json with a cor (or cortex) key

no — retired in 11.0.0

move the key into BRAINY_LICENSE or the machine file, then delete the file

npx @soulcraft/cor activate … in a deploy script

no — retired in 11.0.0

delete the step; set the key directly

a short activation code (CO-… / CX-…)

no — retired in 11.0.0

get your full key from https://soulcraft.com/account

Retired artifacts, by name

None of these are read or written any more, and all are safe to delete:

artifact

retired in

replaced by

.soulcraft.json (cor / cortex key)

11.0.0

BRAINY_LICENSE, or the machine file

~/.soulcraft/cor/heartbeat-*.json

11.0.0

nothing — no license state is written to disk

<cwd>/.soulcraft/heartbeat.json (pre-4.2.0)

11.0.0

nothing

COR_LICENSE_CACHE_DIR

11.0.0

nothing to point anywhere

COR_LICENSE_EXCHANGE_URL

11.0.0

nothing — there is no exchange

cor activate / cor login / cor deactivate

11.0.0

brainy license status (read-only)

Containers, CI, and hermetic tests

Pass the key as BRAINY_LICENSE. That is the entire guidance — there is no cache directory to redirect, no writable $HOME required, and nothing to bake into an image. A read-only root filesystem is fine.

For a monorepo, the old "which directory did the process start in?" question is gone with .soulcraft.json: the env var is process-wide and the machine file is machine-wide, so neither depends on the working directory.

The issuer's contract

A key is minted as sc_brainy_<header>.<payload>.<signature> — a standard JWT, Ed25519 (alg: EdDSA), signed by the issuing key whose public half the engine carries.

claim

value

sub

licensee email

product

brainy

tier

indie | business | enterprise | enterprise-scale | internal — the flat annual bands (the 2026-07 ladder startup | pro | growth | scale stays accepted for keys already issued) (Indie, Business, Enterprise with SLA, Enterprise Scale for organisations of 1,000+ people with SLA and a named engineer) and the internal perpetual key; the engine treats the tier as a label and never gates a capability on it

iss

soulcraft

iat

issued-at, Unix seconds

exp

expiry, Unix seconds — 0 (perpetual) is accepted for internal only

jti

key id, for issuance tracking

sid

subscription id

paidThrough

optional — Unix seconds; the perpetual-coverage boundary (LICENSE clause 3a, see above). Absent = the key is judged on exp alone, unchanged. Present: paidThrough >= build.releaseDate → valid forever for that build, regardless of wall-clock; paidThrough < build.releaseDate → refused, loudly, non-lockingly, naming the cure — the engine does not open.

capabilities

optional — an array of add-on entitlement strings, e.g. ["services"]. Absent or empty = no add-on entitlements (every key minted before this claim existed, and any minted without it since). See "Add-on capabilities" below.

Every paid tier gets the same gate: full acceleration. Tiers price the scale a brain runs at; they never gate a runtime capability. Renew by minting a fresh key with a later exp (and, for a flat-annual key, a later paidThrough) — there is nothing to revoke, and nothing to synchronize.

Add-on capabilities

capabilities is the one deliberate exception to "a tier never gates a capability" — a short, optional list of ADD-ON doors a key is entitled to, orthogonal to tier and to paidThrough. Today it names one:

capability

gates

services

npx brainy embed-service — the bundled Rust model service (see The brainy CLI). Without it the subcommand refuses by name, naming the cure, before it looks at platform, packages or a GPU.

A key minted before this claim existed carries none, and there is no local cure for that beyond a freshly issued key that carries it — that absence is the entire point of an add-on SKU, not a bug to route around. Everything else about the key — tier, expiry, the paidThrough coverage rule — is completely unaffected by which capabilities it does or does not carry.