Last Updated: 7/23/2026
Jolli Memory in CI and Automation
Jolli Memory runs headless. Everything you do interactively - install, sign in, enable, commit, view - also works from a script or a CI job with no editor and no browser. This page covers the pieces that are specific to unattended runs: non-interactive auth, the one timing gotcha to know about, and how commits with no AI transcript are handled.
Install and authenticate without a browser
Install the CLI (Node 22.5+):
npm install -g @jolli.ai/cliSummaries need an LLM credential. In CI, provide one of:
- Your own Anthropic key (simplest): set
ANTHROPIC_API_KEYin the job environment. Memory calls Anthropic directly, no Jolli account required. - A Jolli API key:
jolli configure --set jolliApiKey=sk-jol-.... This one key covers both summary generation (via the Jolli LLM proxy) and publishing memories to a team Space (below) - use it if you want CI memories to reach your team. Create the key at Settings → Jolli Memory → Create Key.
Heads up: JOLLI_AUTH_TOKEN (the OAuth token) only sets your account identity, it does not provide a summary-generation path. A CI run needs ANTHROPIC_API_KEY or jolliApiKey, not just JOLLI_AUTH_TOKEN.
Enable non-interactively
jolli enable -y-y skips the interactive prompts. Run it from the repo root; jolli status confirms the result.
Wait for summaries to finish (the important part)
A commit returns instantly and the summary is generated by a detached background worker. That is exactly what you want interactively, but in CI it is a trap: if the job commits and then exits, the runner can tear the worker down before the summary is written.
After your commit, block until the queue drains:
jolli queue-status --wait --timeout 120--wait blocks until every pending summary is generated or the timeout (default 120 seconds) elapses. Add --format json for a machine-readable result you can gate on.
Persist the memories off the runner
On a stateless CI runner the memory is written locally (the git orphan branch and the Memory Bank folder) and then thrown away when the job ends. To keep CI-generated reasoning, publish the branch’s memories to a team Jolli Space - that is the intended way to get them off the runner and in front of your team:
jolli spaces # find your Space id or slug
jolli push --space <space-id-or-slug>Run push after queue-status --wait so the summaries exist first. push binds the repo to the Space on first use, and because the binding is stored server-side by your repo’s URL, later CI runs just push - no re-bind. Publishing requires a Jolli API key (BYOK-only setups cannot share); the same key you use for generation covers it.
(If you run on a persistent or self-hosted runner and only want memories stored with the repo, you can skip this - the local orphan branch survives there.)
Commits with no AI transcript
CI commits usually have no AI coding session behind them. That is fine: when there is no transcript, Memory generates a diff-only summary from the git diff alone, as long as a credential is available. You still get a structured Memory for the commit, just built from the change itself rather than a conversation.
Generating Memories in batch
To create Memories for commits made before Jolli was enabled, or to fill gaps, use backfill. It runs synchronously in-process (no detached worker), so no queue-status wait is needed:
jolli backfill --last 50 # the most recent 50 commits (default 20)
jolli backfill --all # every commit missing a Memory
jolli backfill --dry-run # report what would be generated, no LLM callsBackfill attributes on-disk Claude Code transcripts; commits without an attributable transcript get a diff-only summary. --min-confidence <high|medium|low> controls how loosely a transcript is matched to a commit.
Environment variables
| Variable | What it does |
|---|---|
ANTHROPIC_API_KEY | BYOK LLM credential; Memory calls Anthropic directly. |
JOLLI_AUTH_TOKEN | OAuth-token override for account identity (not a summary credential). |
JOLLI_URL | Override the Jolli server origin (allowlisted, HTTPS-only). |
JOLLI_NO_PLUGINS | Set to 1 to disable plugin discovery (the Site and Space commands). |
XDG_DATA_HOME | Base dir for OpenCode’s session database. Default ~/.local/share. |
DO_NOT_TRACK | Set to any non-empty value other than 0 to opt out of usage telemetry. |
(ANTHROPIC_BASE_URL is honored by the Anthropic SDK itself, not by Jolli, so treat it as SDK-level rather than a documented Jolli setting.)
Other automation notes
- Target a specific repo with
--cwd <dir>on any command (enable,status,view,recall,backfill, and the rest), instead of relying on the current directory. jolli cleanrefuses to delete in a non-interactive shell unless you pass-y/--yes; use--dry-runfirst to preview.
Example: GitHub Actions
This example generates memories in CI and publishes them to a team Space, using one Jolli API key for both:
- name: Install Jolli Memory
run: npm install -g @jolli.ai/cli
- name: Configure and enable
run: |
jolli configure --set jolliApiKey=${{ secrets.JOLLI_API_KEY }}
jolli enable -y
# ... your steps that commit to the repo ...
- name: Wait for memories, then publish to the team Space
run: |
jolli queue-status --wait --timeout 120
jolli push --space ${{ vars.JOLLI_SPACE_ID }}The jolli push step is what persists the reasoning: on a stateless runner, without it the memory is discarded when the job ends. (For generation only, on a persistent runner, an ANTHROPIC_API_KEY in the job environment is enough and you can drop the push step.)
Related
- Getting Started with Jolli Memory - install, sign in, and your first Memory.
- Reference - every config key, command, and flag.
- Supported AI Assistants and Capture - how sessions are captured, and the diff-only fallback.