Connect StateJar to your tools
One setup page per tool: MCP clients, Claude Code, Codex, OpenCode, OpenClaw, Hermes Agent, the Python and Node SDKs and the CLI.
Every concept, control, provider and decline reason in StateJar. Every entry in full on one page. Not found here? Raise a ticket, or see the docs.
One setup page per tool: MCP clients, Claude Code, Codex, OpenCode, OpenClaw, Hermes Agent, the Python and Node SDKs and the CLI.
What the sections mean, what the colours mean, and why an empty panel is sometimes correct.
The Playground works with no key (StateJar default model). To use your own model, add one key on the API Keys screen; StateJar sends the minimal memory subset to it.
A memory layer that refuses to guess, records why it refused, and turns what it remembers into a portable handle.
Copy a handle from one session and open that exact memory in another.
Sign in, send one message, and read what the six panels tell you about it.
The field holds one value; everything it used to hold is kept separately.
One row per disclosure: what was sent, from which handle, to which model.
The one dotted address a concept resolves to, no matter how you phrase it.
Two values asserted for one field, recorded rather than silently resolved.
A value StateJar refused to store, kept with the reason it was refused.
A field for a concept nobody wrote a schema for. First-class, not a leftover.
Three extractors run in order of cost; the cheapest that succeeds wins.
One named slot holding one value, in one section.
A content address for one exact state: same bytes in, same handle out.
Equivalent values are stored identically, so the handle does not depend on phrasing.
The part of a concept that says which end, which side, or which bound.
Saying the same thing again strengthens it without changing anything.
Taking a value back, leaving the field genuinely empty.
Which slice of memory a read or write applies to.
A named conversation thread. State is scoped to it unless you move a handle across.
The structured memory for a session at one point in time.
A new value replaces the old one; the old one moves to history.
Three different baselines ship, they answer different questions, and a percentage without its baseline means nothing.
What kind of thing a value is: money, quantity, date, duration, percent, ratio, identifier, count, text.
What StateJar is, in three minutes, including what does not work yet.
The page an invitation e-mail links to: choose a password for the account an admin made for you.
The admin console's ten pages, who may open them (a console role, two-factor sign-in) and what is never shown.
The Logins tab of an account in Users: every sign-in attempt for 90 days, filterable and exportable as CSV, with addresses masked unless your role may see them.
Every admin action, newest first: who did what to which account, plan, key, flag or role.
The owner's page for an encrypted download of the whole database or one table, and a read-only SQL console.
The live queue, the failure log, the cloud and local share, the shared cloud keys and the model re-runs.
Named on/off switches the server's code reads, created, switched and deleted from the console.
Server errors, the sign-in log and the outbound mail log, without content.
The Overview page's figures and charts, and the rows each one is counted from.
Owner only. Enter a payment provider's credentials, switch it on or off and between test and live mode, and make a 1 to 10 rupee test payment.
The price list and its editor, accounts per plan, the payments state, and the history-retention job.
The cloud providers that read messages, their settings and terms, and the shared key rotator.
The permission matrix, the four built-in roles, custom roles, and who holds each.
The support queue: filter by status, priority, category and assignee, assign, reply, write internal notes and move tickets to resolved and closed.
Search accounts, see their last sign-in and sign-in history, add a user by invitation, and suspend, edit, change role or plan, sign out, reset two-factor, revoke keys, export or delete one, singly or in bulk; counts only, never memory.
The endpoint reference, with samples in curl, Python, JavaScript and Node.
Provider keys in, StateJar keys out.
Every disclosure — chat, queries, manual records and tier-3 extraction calls — across every session, filterable, with replay.
This session's disclosures, newest highlighted.
Your plan, the plans you can buy once billing opens, and every order with its receipt; while billing is closed (today) it offers no purchase, and the Android app never does.
A popup that shows and adds to a session's memory, restores a handle and copies the memory context. Not yet in the Chrome Web Store.
Empty the memory of a scope for testing, without deleting any history.
Profile asks an account made with a password to confirm its address with a code we e-mail it, so a later sign-in by e-mail never resets it.
Let OpenRouter make a key in your own account for StateJar instead of pasting one; its usage is billed to your OpenRouter credits.
The page an MCP client sends you to when it wants to use your memory, what you are allowing, and the list on API Keys where you disconnect an app.
How to reach StateJar by email; phone and address are still to be added.
Account-level counts and the most recent savings figure.
Profile → Delete account removes everything, permanently. The public /delete-account page explains what goes.
/docs opens with the integrations showcase, then getting started in seven steps, each with a recording of it running, then every docs page.
Each docs page (/docs/<page>.html) uses one template, and each also exists as Markdown at /docs/<page>.md for agents.
Profile → Download my data saves a JSON copy of everything your account holds, after your password.
Every version of this session's state, newest first.
The sun/moon button switches between the light and dark themes; this browser remembers the choice, and until you choose, your device setting decides.
The admin console's Login methods page: a switch per method, the Google and GitHub client credentials, the callback URL.
Everything currently remembered, by namespace.
Where you type. Every message goes through the full pipeline.
Choose which model answers, grouped by provider.
Ask the StateJar team for help, read its answers and close a ticket; replies also arrive by e-mail.
Choose whether a new Playground session continues your account memory or starts as a separate, empty test user.
The admin console's Payment orders, on its Plans and payments page — every order, a full refund for a paid one, and the reconcile pass on demand.
The working screen: chat on the left, the memory inspector on the right.
The plans (Free, Plus, Pro, Business, Enterprise) with their prices; billing is coming soon until a payment provider takes payments, every account is on Free, and the Free plan's limits are enforced.
Your privacy controls, what the service stores, what it never stores, who else sees data, how long it is kept, how to get a copy and how to delete it.
Ten one-time codes shown once when two-factor sign-in is turned on. Each replaces one authenticator code, once.
How cancellations and refunds will work once paid plans go on sale; no payment is taken today.
The Report button under each model reply in the Playground sends that reply to the StateJar team, with a reason, without leaving the page or the app.
Adopt a previously sealed state into the current session.
Pick a thread, or start an isolated one.
Profile's Sessions panel: every browser signed in to your account, and Log out everywhere.
The admin console's Logs → Sign-ins tab: attempts by method and outcome, and the newest rows.
`pip install statejar`, then `statejar login` opens statejar.com/device; approve once and your code has a key.
Links the StateJar SDK License (proprietary) and marks the service terms as not yet written.
Values StateJar refused to store, each with the reason.
Two scripted runs that exercise the real pipeline with no provider key.
The address of the state you are looking at.
Tabs on the landing page and on /docs for every way to use StateJar (SDK, agent harness, plugins, MCP, command line), each with a snippet to copy, a one-line benefit and its docs page.
Which memory the current session uses - your account memory, a fresh separate one, or the demo's.
A live trace of the seven stages, with a real sublabel on each.
Seven destinations, and what each is for.
/login/link: where a sign-in link lands. Press Sign in; nothing happens until you do.
Search, categories, deep links, and a coverage test that keeps it current.
Which extractors ran, how many fields each contributed, and which failed.
How much smaller the disclosed subset was, against a stated baseline.
The exact subset, and the memory_context text, sent to the model for the last question.
/try lets anyone try the real pipeline without an account; everything in it is deleted at 00:00 UTC.
The line under each of your messages: what it did to memory.
Optional authenticator-app codes at sign-in, ten one-time recovery codes, and the sign-in lockout. Required for admin accounts.
The login page's methods: a code or a link by e-mail, a password, Google or GitHub.
Under each reply: the handle, the fields, the retrieval mode and the exact context text.
Claude models, direct.
Google's models, direct.
Your own Ollama on your own machine, for replies; only on installs that turn SHOW_OLLAMA on, not on statejar.com.
An Ollama host we call on your behalf. Requires a key.
A direct connection if you already hold an OpenAI key.
One key, many models including free ones. The easiest place to start.
The model the Playground answers with when you have no key of your own — a cloud model through StateJar's provider pool, within an hourly limit; a 503 "busy" when no provider answers.
The status, and when done the result, of a message read in the background (async, or long).
POST /api/v1/auth/account/code e-mails the signed-in account an 8-digit code for one purpose (confirm the address, delete, export, 2FA changes).
Hands a browser that holds only the session cookie the JSON token the console runs on.
POST /api/v1/auth/invite/accept {token, password} opens the invitation link an admin sent, sets the account's password and signs in.
Counts for the Dashboard, plus the last chat's savings figure.
GET /api/v1/admin/users lists and searches accounts with usage counts; GET, PATCH and DELETE /api/v1/admin/users/{id} view one, change its address or plan, or delete it. Never memory content.
POST /api/v1/admin/users/invite {email, role?, plan_id?, name?, note?} makes the account now and mails an invite link; opening it lets the person choose a password.
GET /api/v1/admin/users/{id}/export — the admin row, usage against the plan and rows per table, as a file. Never the account's memory.
GET /api/v1/admin/users/{id}/logins lists an account's sign-ins (method, result, time, browser and system, country, address), filtered and exportable. Addresses are masked unless the role holds users.view_ips.
POST /api/v1/admin/users/bulk {ids, action, reason?, plan_id?, role?} suspends, unsuspends, changes the plan or role of, or exports up to 100 accounts; each is checked and audited on its own.
GET /api/v1/admin/data/download/{token} — the encrypted file an export made, once, within 10 minutes, by the owner who made it.
POST /api/v1/admin/users/{id}/disable suspends an account; nothing it owns is changed.
POST /api/v1/admin/data/export — the whole database as SQL, or one table as CSV or JSON, encrypted with a passphrase you type. Owner only, fresh two-factor code, single-use link.
POST /api/v1/admin/users/{id}/enable lifts a suspension.
GET /api/v1/admin/extraction — the live ingest queue, the failure log, the cloud and local share, the cloud keys' counters and the model re-run queue. No message, no session name, no job's error text.
GET, POST /api/v1/admin/flags and PATCH, DELETE /api/v1/admin/flags/{id} — named switches code reads with is_enabled(key, default). Every change audited.
PUT /api/v1/admin/users/{id}/role {"role": slug} makes an account an admin, support, viewer or a custom role; DELETE takes the role away. Owners are never changed here.
POST /api/v1/admin/data/query — one SELECT, run as a database user that can only read. Owner only, fresh two-factor code; 500 rows, 5 seconds. The query is kept, its results never.
GET /api/v1/admin/data/queries — the last 50 SQL console queries as typed, with outcome, row count and time; never their results.
POST /api/v1/admin/users/{id}/reset-2fa deletes the authenticator secret and recovery codes and signs the account out, for someone locked out of their authenticator.
POST /api/v1/admin/extraction/retry-now makes the model re-runs backing off in the answering process ready at once. Failed jobs are not re-run: their messages were never kept.
POST /api/v1/admin/users/{id}/revoke-keys revokes every developer key of an account; they stop working on the next request.
GET, POST /api/v1/admin/roles and PATCH, DELETE /api/v1/admin/roles/{id} — the permission list, the built-in roles (owner, admin, support, viewer) and custom roles with any set of permissions.
GET /api/v1/admin/errors lists recent server errors by route template, with counts.
POST /api/v1/admin/users/{id}/logout ends every session and console token of an account now. Developer keys keep working.
GET /api/v1/admin/audit lists every admin action: who, what, on which account or row, when.
GET /api/v1/admin/data/tables — the table names a download can hold, and whether the SQL console's read-only database user is set up. Owner only.
GET /api/v1/admin/overview — accounts, memory operations, model readings by side and model, the queue, server errors, the cloud cost estimate, model and server health. Aggregates only.
Your decision on the consent page: allow issues a one-use ten-minute code bound to the app, deny sends it access_denied; either way you are sent back to the app.
GET /api/v1/admin/status answers whether the signed-in session holds a console role, which role and permissions, and whether two-factor sign-in is on.
Memory operations this month vs the plan's allowance, active keys vs the plan's count, retention — counts only.
Issue a one-year developer key for the device and park it for the terminal to collect; the browser never sees the key.
Sends an 8-digit one-time code to an e-mail address. Always answers 202, whether or not the address has an account.
Sends a one-time sign-in link, bound to the browser that asked for it. Always answers 202.
Put an account on a plan; its limits apply on the next request through its existing keys.
The distinct values available to filter the audit trail by.
Every disclosure — chat, queries, manual records and tier-3 extraction calls —, filterable by session and scope.
GET /api/v1/admin/backup-spend returns each provider's computed spend per day and month against its monthly cap, and the real balance where a plain API key can read one (OpenRouter).
Your plan, the paid period in force, whether payments are open, and your orders newest first, each paid one with its receipt.
Which payment providers take payments, their names, the currency each is asked to charge in, and the mode (test or live); no account needed.
Create an order for a paid plan (the server takes the price from the plans table and asks the payment provider for a checkout), and read an order back; nothing here activates a plan.
An order for a top-up pack, which adds memory operations to this month's limit for an account on the pack's plan.
Closes an open, unpaid order at the payment provider and then here, so it can no longer be paid; a paid order is not cancelled, it runs to the end of its month.
Cancel a monthly subscription at the end of the month already paid for; that month is kept.
Query, then send the subset to a model and return its reply.
Which payment gateways are switched on, the currencies each takes, whether it sells subscriptions, the top-up packs on sale and the GST note every price carries.
Empty a memory scope by writing a new empty head; history is kept and the call is audited.
POST /api/v1/tickets/{id}/close closes one of your tickets; a closed ticket takes no more replies.
Whether extraction's cloud providers can read a message now; 503 with the reason when none of the enabled ones can.
The provider table behind extraction's cloud path — one row per supported provider with on/off, priority, model, base URL, timeout, a monthly cost limit and the provider's data-use terms; admin-only, every change audited.
The terminal asks every few seconds whether you approved; the key comes back exactly once.
The input tokens of the full chat history against the last N messages plus StateJar's memory_context, and what that input costs for one reply model at the listed price. No model call, nothing stored.
Count the input tokens of the full chat history against the last N messages plus StateJar's memory_context. No model call, nothing stored.
Answer a question StateJar asked about a value it was unsure of; yes writes it as a new version, no discards it.
POST /api/v1/auth/stepup — a fresh code from your authenticator app gives a 5-minute token for one sensitive area, such as the owner's database download.
POST /api/v1/auth/account/confirm-email takes a code e-mailed for confirm_email and marks the address confirmed, removing nothing.
Create a StateJar account with an email and a password.
Aggregates behind the dashboard charts: fields per namespace, declines by reason over time, and handle lineage.
DELETE /api/v1/account removes the account and every row keyed to it, in one transaction. Permanent.
Refuse a pairing you do not recognise; nothing is issued and the terminal is told.
POST /api/v1/account/export returns everything the account holds as one JSON file, table by table, without any credential.
The key rotator for extraction's cloud providers — many keys per provider, round-robin, cooldowns, per-key counters, a cost estimate and a Test button; masked after saving, admin-only, every change audited.
Whether extraction can read a message with its model right now; 503 with the reason when it cannot.
Hand over the code and state OpenRouter sent back; the server trades the code for a key in the user's own OpenRouter account and saves it.
Create a key for calling StateJar from your own code. Shown once.
Liveness probe.
Run the memory pipeline on a message: extract, canonicalize, hash, store.
POST /api/v1/admin/tickets/{id}/notes adds a note only admins can read; it is never returned to the user and sends no mail.
Every handle in a session's chain, oldest to newest.
Exchange email and password for a bearer token.
Ends this browser's session on the server and clears its cookie.
Revokes every session of the account at once, this one included.
Counts of sign-in attempts by method and outcome over 30 days, and the newest rows.
Read and change the switch per sign-in method and the Google/GitHub client credentials.
What the approval page shows before you decide: the device's name, the code's state and the key's lifetime.
Outgoing mail by kind and status for the last 24 hours and 7 days, and the newest failed or refused attempts with their error class — never an address, a name or a body.
POST /api/v1/admin/reports/{id}/reviewed marks one report as reviewed; it stays listed after the open ones.
Which models are available to you, grouped by provider.
Start a recurring monthly plan at a gateway that sells subscriptions; each charged month activates by the same rule as an order.
Replaces all recovery codes; needs your password and a code from the app.
An app exchanges its code (with the PKCE verifier) for an access token and a refresh token, and later rotates the refresh token. Form-encoded, RFC 6749.
A paid order's receipt (number, date, account, plan and period, price, amount charged, payment reference, refunds), also e-mailed once when the payment arrives.
You keep your model call; StateJar supplies the memory subset beside it.
StateJar makes the model call for you and returns the reply.
Expose StateJar as tools to an MCP-speaking client.
Where allapi tells our server an order was paid; a notice is signature-checked and then confirmed by a server-side status query before a plan changes. Off until the adapter is switched on.
Where Binance Pay tells our server that an order was paid, closed or refunded; every notice is checked against Binance's signature and our own order before anything changes. Off until a provider is switched on.
Where Razorpay, Stripe and PayU tell our server about a payment, refund or subscription; a notice is signature-checked, counted once by its event id, and confirmed by a server-side status check before a plan changes.
Every payment order, newest first, for the admin panel's Payments section; ids, plan, status, amounts, dates and payment references, never anything about the payer.
The owner enters a payment provider's credentials; they are kept encrypted and shown afterwards as their last four characters only.
The owner switches a payment provider on or off and between test mode (the default) and live mode.
Lists each payment provider with its on/off switch and why it cannot take payments, and switches one on or off; every change is audited.
A read-only report per provider: orders by status, money paid and refunded by currency, and what needs a person.
A session's everyday facts as rows: the people in your life and what passes between you and them.
The active plans as the admin last saved them; /pricing reads this on every load, so an edit is live without a deploy.
Create and edit plans — price in INR and USD, operations per month, cloud-extracted messages per month, retention, seats, keys, rate, features; saved in the database, audited, live at once.
What a model would be told for a sandbox visitor's question: the same query, with the same audit row, as an account's.
How a sandbox message's reading went: queued, running, done with what was stored, held and declined, or failed.
A sandbox visitor's message, secrets removed, read in the background by the same ingest as an account's message.
Starts a sandbox session for a visitor without an account; the answer's session_id names it in every other sandbox call.
Read and update the signed-in account's profile. Four optional fields, scoped to the caller.
Save, list and remove the model-provider keys StateJar calls on your behalf.
Retrieve the minimal subset relevant to a question, plus a prompt-ready context string. No model call.
The owner re-enters a two-factor code to open the Payment providers page for five minutes, in this session only.
What the consent page shows for a request id: the app's name, its redirect host, the scopes in words and your account. Signed-in only.
Fetch the exact state a handle addresses.
Every order as one CSV row, with what was refunded and what needs a person, to compare with each gateway's own settlement report.
Log a disclosure your client made without going through /chat.
Refunds a paid order, in full or in part, through the payment provider or as money already sent back by hand; the plan ends when the refund is confirmed.
A hint about the visitor's country, from a header a CDN or proxy may add; the pricing page uses it to show rupees and national gateways first. Never a gate.
Dynamic Client Registration (RFC 7591) for the MCP server's OAuth sign-in: an app registers its name and redirect addresses and gets a client id.
Reconstruct exactly what was disclosed for one audited response.
POST /api/v1/tickets/{id}/replies adds your message and up to 3 attachments to one of your tickets.
POST /api/v1/admin/tickets/{id}/replies answers a user's ticket and e-mails them; the first reply moves an open ticket to in progress.
POST /api/v1/reports sends the StateJar team a model's reply you found offensive, harmful or wrong, without leaving the app.
GET /api/v1/admin/reports lists the replies people reported, open ones first, with how many are open.
Adopt a sealed state into a session, verifying it on the way in.
An app gives a token back (RFC 7009): a refresh token takes its whole family with it; an access token goes alone. Always 200.
Runs the daily history-retention job at once and returns its counts; the job deletes memory versions and audit rows older than each account's plan window, never a session's current head.
Asks the payment provider about every open order and pending refund now, applying what it says through the same checks as a notice; it also runs by itself.
The people an account owner lets into their organisation, counted against the plan's seats; adding one past the count is refused with 403 plan_seat_limit.
Disk, memory, CPU load, uptime, each container's status and memory, the last backup, certificate expiry, the deployed commits — from a file the host writes every minute.
Per-turn provenance for a session. Contains no message text, by design.
Exchanges the mfa_token from /auth/login and a code for a session token.
Starts the provider's sign-in flow (state, PKCE, nonce) and sends the browser to the provider.
What `statejar login` calls first — a pairing code for the browser and a secret for the terminal.
Where an MCP client sends your browser: the request is checked (PKCE S256, exact redirect, the MCP resource), stored for ten minutes, and the consent page opens.
Begin OpenRouter's OAuth PKCE flow for the signed-in account and get the address of OpenRouter's authorization page.
Creates a new authenticator secret and returns it once, with its otpauth link and a QR code.
POST /api/v1/tickets files a support ticket; GET /api/v1/tickets lists yours and GET /api/v1/tickets/{id} reads one with its thread.
GET /api/v1/admin/tickets lists the queue with filters; GET and PATCH /api/v1/admin/tickets/{id} read one with its internal notes and change its status, priority or assignee.
The "Test key" button — one tiny schema call with the key, 15 seconds at most; the answer is the outcome, raw HTTP status and latency, never the key or the provider's reply.
Check a saved key really works, before you need it live.
The owner makes a 1 to 10 rupee order through a payment provider for their own account, to see its QR or payment link; it never activates a plan.
StateJar's memory as Model Context Protocol tools at https://statejar.com/mcp, with a developer key or an OAuth sign-in as the credential.
Where Google or GitHub send the browser back; checks the flow, finds or creates the account, redirects to the console.
GET /api/v1/admin/tickets/assignees lists the accounts a ticket can be assigned to: those whose role holds tickets.manage.
GET /api/v1/tickets/{id}/attachments/{attachment_id} downloads an attachment of your own ticket; png, jpg, pdf and txt only, 5 MB each, 3 per message.
GET /api/v1/admin/tickets/{id}/attachments/{attachment_id} downloads an attachment for a role holding tickets.read; each download is audited.
What StateJar sent to a model against what sending the whole memory state would have cost, from your own audit rows and verified states, with StateJar's extraction cost beside it.
The owner's top-up packs (extra memory operations for a plan's month): list them, add one, change its price or take it off sale.
Needs your password and a current code (or a recovery code); removes the secret and every recovery code.
Confirms setup with a 6-digit code; returns ten one-time recovery codes, once.
Whether two-factor sign-in is on for your account, how many recovery codes are left, and whether this session passed a code.
Aggregate disclosure volume across your audited calls.
The page's POST that turns a link's token into a session. Never on the mail scanner's GET.
Exchanges the e-mailed code for a session; creates the account on its first verified code.
GET /api/v1/auth/account says whether the account has a password it set, whether its address is confirmed, whether 2FA is on and whether codes can be e-mailed.
`statejar whoami` — the account, label and expiry behind the presented key, never the key.
Public: the methods the admin has enabled, for the login page.
The apps this account connected through OAuth, with their scopes and last use; disconnecting one revokes every token it holds for you.
Lists the account's live sessions, masked, and which one is this browser's.
List the keys you have generated, and revoke one.
Comma-separated emails whose accounts are the admin console's owners. Checked on the server on every request.
Environment variable AES_KEY. Default: change-me-32-bytes-key-required!
Environment variable ANTHROPIC_BASE_URL. Default: https://api.anthropic.com/v1
Which deployment the backend is, production or staging, as the deploy passes it; empty on a developer's machine. Payments' test mode is refused in production.
The key under which sign-in codes and link tokens are hashed before they are stored. Made once on the server; empty disables e-mail sign-in.
The Gemini model the extraction backup asks.
The OpenRouter model the extraction backup asks.
The master switch of extraction's cloud path and the providers that start enabled; empty = no cloud provider is asked.
The site the payment provider sends the buyer back to after its checkout (<url>/billing?order=<id>), and the links in receipts.
Whether the API runs the payment reconcile pass by itself (true, the default), asking the provider about open orders and pending refunds.
The public API base the payment provider's notices are sent to (<base>/billing/binance/webhook), given to the provider with each order and refund.
The Binance Pay merchant API key; a server secret written by the deploy from a GitHub secret, never shown, logged or stored in the database.
Where the server calls Binance Pay — its documented host in live mode, a stand-in on the server's own machine in test mode.
Which of a plan's prices Binance Pay is asked to charge, INR (the default) or USD; Binance converts it into USDT or USDC at its own rate.
The Binance Pay merchant secret that signs every request; a server secret written by the deploy from a GitHub secret, never shown, logged or stored.
The directory the backend processes share to keep extraction off the development local model while a reply runs (none runs on statejar.com).
The LoRA adapter llama-server holds beside the base model, by its tag; empty means none.
Which of Ollama's two request forms the backend sends llama-server: chat or completion.
The served model's own sampler values, as Ollama reads them, sent with every request to llama-server.
The llama-server slot extraction's proposals are pinned to, so replies and the verifier go first; -1 lets the server pick.
Development and eval only: where llama-server answers for the development local model when BUILTIN_SERVER is llama-server; a private address.
How many development-local-model replies (none runs on statejar.com) one backend process generates at once; the rest wait up to 20 s, then 503.
Development and eval only — a local Ollama model extraction v3 can read with; empty (the value in every deployed environment) means StateJar runs no model of its own.
Development and eval only: where a hand-built Ollama answers for the development local model; a private address, never a user's daemon.
Which server holds the development local model: Ollama, or llama-server on its own with one base model and one adapter.
The monthly cost cap, in US dollars, of every cloud provider that has no limit of its own; at the cap the provider is skipped until the month turns.
How many replies per account per hour StateJar's default model answers; HTTP 429 after that.
Whether each backend process watches extraction's cloud providers, so the cloud health check knows whether they can read.
How old a cloud provider's newest outcome may be before the watcher probes it; at most one probe per provider in this time.
Environment variable CONTEXT_BUDGET_TOKENS. Default: 200. The most a memory context sent to a model may cost, in tokens; 0 turns the cap off.
Environment variable CORS_ORIGINS. Default: localhost:5173, statejar.vercel.app, statejar.com
Environment variable DB_URL. Default: mysql+pymysql://root:@localhost:3306/statejar
Whether this server e-mails codes at all — sign-in codes and links, and an account's own codes. Off on the servers until a PR turns it on.
Which side reads a message first — the enabled cloud providers (the default) or, in development and eval only, a local model; no deployed environment runs a local model.
How long a message a client waits for gives the first-tried side (the cloud providers by default) before the other side is asked (seconds).
How long a background reading gives the first-tried side before the other side is asked (seconds).
Environment variable EXTRACTOR_LLM_FALLBACK. Default: False
Environment variable EXTRACTOR_LLM_FALLBACK_MODELS. Default: openrouter/anthropic/claude-haiku-4.5,openrouter/google/gemini-2.5-flash
Environment variable EXTRACTOR_LLM_MODEL. Default: openrouter/openai/gpt-4o-mini
Environment variable EXTRACTOR_MODE. Default: auto
Messages longer than this are read in the background (202 and a job); default 3000.
A stronger cloud model for extraction's verify step only; off by default.
A GLiNER checkpoint for extraction v3's span proposals; empty means none.
How many further messages a held fact waits to be said again; default 5.
Seconds a background ingest waits for one model call; default 300.
Extraction calls one backend process may have on the development local model at once; default 2.
The model extraction v3 asks; empty means the built-in model.
The adapter's scale on extraction v3's proposals when llama-server holds one; the verifier and replies use 0.
Seconds extraction v3 waits for one model call while a client waits; default 60.
Which extractor reads messages: rules (the rule tiers) or v3; default rules.
Environment variable GEMINI_BASE_URL. Default: https://generativelanguage.googleapis.com/v1beta
The request header in which the edge states a visitor's country. Empty (default) = a sign-in's country is recorded as unknown; no address is ever sent to a location service.
The total GST rate used for the tax lines once a GSTIN is set (default 18). Split into CGST and SGST halves within the supplier's state, IGST otherwise. The accountant confirms it.
The SAC printed on the invoice. Empty (the default) prints "To be confirmed by the supplier's accountant"; the code is never guessed.
The supplier GSTIN. Empty (the default) means not registered: receipts say "GSTIN: not yet registered" and "GST not charged: supplier not registered", and no tax line is computed. Set only after GST registration; a value that is not a valid GSTIN shape is ignored.
The seller name printed on a receipt and invoice. Default `StateJar`.
Seconds a recall waits for the session's unfinished ingests; default 5.
Environment variable JWT_SECRET. Default: change-me
The one address StateJar's mail comes from; the mail server accepts exactly this envelope sender.
How this server sends e-mail — smtp through StateJar's own mail server, log (nothing sent, one line in the log without the body), or off.
Messages to one address within an hour before the backend refuses to send another (429 mail_rate_limit).
The host the backend hands outgoing mail to when MAIL_MODE is smtp — the mail container's alias on the private network.
The port of the mail container the backend connects to — 25 inside the private network.
How many seconds one hand-over to the mail server may take before it counts as failed.
The Host headers the MCP server answers; any other host gets 421 (DNS-rebinding protection).
Whether the API serves the hosted MCP server at /mcp (default true).
Where the MCP server's bearer tokens come from; they are developer keys made in the API keys page.
The URL the MCP server names as its resource in its discovery document.
MCP requests one developer key may make per minute in one API process (default 240); then 429.
Environment variable ML_MODEL_DOWNLOADS. Default: False
Whether each backend process checks every minute that extraction's model is loaded, and loads it when not.
How long an OAuth access token for the MCP server lives (default 60 minutes).
How long an OAuth refresh token lives before the app must sign in again (default 30 days); each one works once.
Environment variable OLLAMA_BASE_URL. Default: http://localhost:11434
Environment variable OPENAI_BASE_URL. Default: https://api.openai.com/v1
Environment variable OPENROUTER_BASE_URL. Default: https://openrouter.ai/api/v1
The page OpenRouter sends the browser back to after Connect with OpenRouter. Default empty, meaning MCP_ISSUER_URL + /connect/openrouter.
Which payment providers take payments, comma-separated; empty (the default, and every environment today) means none, so no plan can be bought.
test (the default) runs payments against a stand-in on the server's own machine, with no money moved; live talks to Binance Pay's own host and takes real payments.
The public origin of this API, for the OAuth callback URL shown in the admin panel.
The website a link in an e-mail opens (never the API host).
Environment variable RATE_LIMIT_ENABLED. Default: True
The database URL of a user that can only read (statejar_ro), used by the owner's SQL console and database download. Set by the deploy.
Whether the API process runs the daily history-retention job (default true); off only in tests or when another process runs it.
Environment variable RETRIEVER_FULL_STATE_TOKENS. Default: 400. Up to this size a question is given your memory whole; a statement or a task only the fields it bears on.
Environment variable RETRIEVER_SEMANTIC. Default: False
The address the sandbox's visitor accounts are named after (default sandbox@statejar.com); signup refuses it and every sandbox+ form of it.
Sandbox actions a day for all visitors together (default 500): new sessions, messages and questions; one more answers 429 until 00:00 UTC.
Whether the sandbox at /try is open (default true); false answers 404 to every sandbox call.
The longest message the sandbox takes, in characters (default 500); a longer one answers 422.
Sandbox requests an hour per client address (default 30); one more answers 429.
Where the backend reads the host-written status JSON for the admin server panel; absent = the panel says so.
Environment variable SHOW_OLLAMA. Default: False
The directory where support-ticket attachments are stored, outside every served path; empty means a ticket-files folder beside the backend.
A Wayanad relief operation, built one fact at a time over seventeen turns.
Three turns are marked because they demonstrate the behaviours people doubt.
Four things on the right-hand side, and what each proves.
The value is there, but under a field name you did not expect.
You said something with a number in it and the Memory State panel does not show it.
A tier chip is amber and reads *unavailable*.
You sign in elsewhere and the memory is there but the conversation is gone.
You restored a handle and the state is not what you expected.
You expected [tier 3](#tier.llm) to run and there is no `llm` chip — only `rules`.
Ollama is running and `curl` works, but the browser cannot reach it.
The local Ollama card reports the daemon is not reachable.
A request fails with a rate-limit error.
Ten wrong passwords or codes for one email address in 15 minutes lock sign-in for that address for 15 minutes.
Only on long chats. On a short chat the memory block costs more than the history it replaces; the measured totals are 17 turns -72.8% and 40 turns +3.7%.
Search this page first; if the answer is not here, raise a ticket from My tickets. Replies arrive in the ticket and by e-mail.
How is this different from built-in model memory?
How is this different from RAG?
Not by StateJar. But your messages are sent to cloud model providers to be read, and each provider's own terms apply to what they receive.
Free forever, Plus, Pro, Business and Enterprise; billing is coming soon, so every account is on Free today and the Free limits are enforced.
What happens if StateJar is down?
Where is my chat history stored, and why not on the server?
StateJar runs no model of its own. Extraction and the default Playground reply go to cloud providers, paid Gemini first, then Mistral, then OpenRouter; your own key goes to your provider.
Why did it not remember something I said?
On a short chat StateJar sends more tokens than the plain history; it only comes out ahead as a chat grows. The measured figures, with what was counted.
User-visible changes, newest first, grouped by release.
You explicitly swapped one option for another, and both are recorded.
You said how much money you have, not what it is for; StateJar asks whether it is your budget instead of assuming.
The tier that proposed it was not sure enough for that field.
A number with a ceiling word but no currency ("under 50000") is asked about as a budget, never stored as one.
The clause was a question, a negation or a retraction, not a claim.
The field exists, but the value is the wrong kind of thing.
A money concept that only exists because a misspelling was corrected ("slary") is confirmed with you, not stored.
An amount of money was stated without saying what it is, so it was not stored.
Nothing in the registry claims that field name.
Every term used anywhere in the product, alphabetical, each linking to its full entry.
Deterministic patterns. Free, exact, narrow, identical on every machine.
Schema-guided neural extraction for what the patterns missed.
The rule pipeline's old third tier, off on statejar.com; extraction v3 reads with the cloud providers instead. StateJar runs no model of its own.
A field was named but no value was given.
A decision is explicitly outstanding.
You said you were not certain, so nothing was stored as settled.
A plain number of countable things.
A point in time.
A length of time.
A code that names something rather than measuring it.
An amount with a currency.
A proportion out of a hundred.
A number with a unit of measure.
A relationship between two numbers.
A value that is words rather than a measurement.
The classifier could not tell what kind of value this is.