Conversations
Append-only portable S-expressions with exact resume commands, crash-tail repair, and read-only replay navigation.
The agent that rewrites itself while it runs.
A terminal programming agent inside a live Common Lisp image it can read, edit, break, and recover.
nix run github:lambda-symbolics/autolithcurl -fsSL https://sh.lambda-symbolics.com/autolith | shgit clone https://github.com/lambda-symbolics/autolith && cd autolith && ./script/bootstrapLinux, macOS, FreeBSD, NetBSD, OpenBSD, and Windows. See more.
One image holds the provider client, the terminal, the tool registry, the MCP connections, the conversation store, the memories, the agenda, and the code that runs the turn. The agent reads and edits all of it at the same address.
Common Lisp provides describe, conditions, restarts, CLOS protocols, and source forms at runtime. The agent uses them to inspect and change its own implementation.
File search runs in-process through fff, a Rust library. Separate, persistent Lisp workers provide REPLs for experiments and scripts.
Prose, typed at the prompt. Autolith reads it as a call to (prompt). Talk to a specific agent using the :to parameter.
This browser demonstration wraps prose in a prompt call and leaves parenthesized input unchanged. It does not run Lisp.
Read as a call to (prompt), addressed to the primary agent.
You do not need to know Lisp. Prose works, and most people never type a form. If you want to learn it, this is a good place to start: the input is a real REPL, and the agent sees what you typed, what came back, and any condition it signalled, so you can ask it why.
Prose, commands, tools, and Common Lisp share one input. A form runs in the active image and the model sees the result. Read a prompt off disk, template it, or generate it from the program you are debugging.
;; a computed prompt (prompt (read-file "review-notes.org")) ;; a tool, called by hand (resource.read :uri "workspace:.") ;; introspection, right there (describe 'application)
Autolith keeps working while its children run. Address one by name to correct it mid-flight. Its next useful reply comes back to the primary terminal.
(prompt :to 'test-review
"Run the focused tests and
report only failures.")Autolith replaces complete functions, methods, classes, macros, conditions, and global settings in the image it runs in. The change is live at once. Whether it outlives the process depends on what happens next in the journal.
self.redefine compiles and installs one complete definition in the active image and appends it to the journal. self.exercise asserts against the pending change. self.diff collapses everything pending to its effective state. self.discard puts the newest change back. Being wrong is cheap.
self.commit turns the pending set into an immutable private image commit: a manifest plus a complete executable replay script, in a separate private Git history. A clean process replays that script and asserts the load-bearing surface survived before the commit becomes selectable. Your working tree is a different repository.
Give the formatter behind the live status row a bad redefinition and the process dies on the spot. Autolith writes a private crash capsule, boots a separately built pristine image, and selects a known-working generation from it.
The conversation comes back with the scrollback intact. The first turn afterwards reads only: bounded crash context, the workspace, tracked source, active state. It reports, then asks before it repairs anything.
When an ordinary form signals, the live restart debugger keeps the failed stack alive and puts Ask Autolith why this failed beside the restarts, with up to three validated recovery proposals.
Every model has a hard limit on how much it can read at once. Autolith works around it. Point it at a log, a codebase, or a folder of documents far too big to fit, and it will answer questions about the whole thing. The method comes from Recursive Language Models, by Alex L. Zhang, Tim Kraska, and Omar Khattab.
It does not try to read everything. It writes small programs to search and slice the material, sends the parts that matter to itself in separate side conversations, and keeps only the answers. Those side conversations never touch yours. A hundred of them add one line to your screen. You set the ceiling on calls and tokens before it starts, so a large question cannot turn into a runaway bill.
src/*.lisp filesinference:s2Wb1o2, readable in session:::. ::: AUTOLITH v0.35.0 ;;`;; ;;; ───────────────────────────────── ,[[ '[[, [[[ model gpt-5.6-terra c$$$cc$$$c $$' workspace /root/common-lisp/frob/ 888 888,o88oo,.__ YMM ""` """"YUMMMDownload recording
:::. ::: AUTOLITH v0.35.0 ;;`;; ;;; ───────────────────────────────── ,[[ '[[, [[[ model gpt-5.6-terra c$$$cc$$$c $$' workspace /root/common-lisp/frob/ 888 888,o88oo,.__ YMM ""` """"YUMMMDownload recording
root@lho-thinkpad: ~/common-lisp/frob # ./bin/autolith :::. ::: AUTOLITH v0.35.0 ;;`;; ;;; ───────────────────────────────── ,[[ '[[, [[[ model gpt-5.6-terra c$$$cc$$$c $$' workspace /root/common-lisp/frob/ 888 888,o88oo,.__Download recording
Every running Autolith publishes a private authenticated endpoint on loopback, keyed by the conversation identifier and guarded by a capability token. Detach and the session moves to a supervised process group that outlives your terminal.
From any other terminal on the machine
$ autolith localgroup status $ autolith localgroup tell SESSION "use the staging config" $ autolith localgroup attach SESSION --read-only $ autolith localgroup attach SESSION --take-over $ autolith localgroup pause SESSION $ autolith localgroup kill SESSION
Many observers, one controller. Take over and the previous controller loses the session. Output arrives in order for everyone watching. tell also wakes a paused session, pause cancels active work and holds the queue, kill asks for a graceful shutdown.
On Windows a session runs in the terminal that started it. The endpoint and these commands work the same.
$ autolith data export project.sexp --workspace ~/code/project $ autolith data import project.sexp --workspace ~/src/project
One readable S-expression archive: conversations, memories, agendas, plans, papercuts, and session assets. Import preserves stable identifiers and merges into local data.
Even self-modified cores can be rebuilt on another machine.
External commands pass through authorization checks before execution. Process isolation and scoped filesystem access limit accidental damage; they are not a hostile-code security boundary.
cl-exec-sandbox selects the backend: Bubblewrap on Linux, Seatbelt on macOS. The default policy gives a command no network, a read-only host, writes in the workspace and temporary directories, protected repository metadata, and sixty seconds. On Linux it adds process, user, IPC, UTS, and network namespaces, no_new_privs, and seccomp. --immutable pins the agent to one state: no evaluation, mutation, persistence, checkpoints, or rollback. Use it when you are integrating a fixed Autolith into something else, or running it unattended, and self-modification is not wanted. A fact you want forever, a commitment for this month, a step for this hour, and an exact heap expire on different schedules. Autolith writes them to separate readable stores rather than one database or one saved core.
Append-only portable S-expressions with exact resume commands, crash-tail repair, and read-only replay navigation.
Workspace or global facts and preferences, recalled under a bounded budget.
Durable commitments and blockers for one workspace, delivered in full on every request. An item can carry memory identifiers.
One ordered working list per workspace, at most thirty-two steps, replaced wholesale.
Complete replay scripts for durable definitions and settings, retained in private Git.
A saved core, the exact source commit, a reconstruction script, a manifest, and a journal position.
Immutable experimental cores with parentage and notes, for trying something at full size.
Every store is append-only or transactional. Shared-state transactions serialize across processes, so two agents can share one workspace.
Configuration is files and Lisp forms, and the running agent reads both.
SKILL.md with frontmatter, or native SKILL.sexp. Project skills win over yours, yours win over bundled.directory-scopes.sexp to let its own mcp.sexp load..autolith/agents/ and name the tools, models, and effort each one gets.autolith package, loaded after tracked code and your selected private commit, with your privileges.define-context-contributor attaches bounded standing notes to provider requests. A note shapes one request.define-application-command adds your own. The thirty-seven built-in slash commands are sugar for the same Lisp calls.AGENTS.md at the project root, refined by deeper ones, re-read on every request.The high testosterone, high estrogen way to install Autolith.
curl -fsSL https://sh.lambda-symbolics.com/autolith | shInstalls or updates the packaged release for your platform. Then run autolith.
irm https://sh.lambda-symbolics.com/autolith.ps1 | iexWindows gets packaged binaries from 0.50.0. A source checkout still works through script\bootstrap.ps1.
Then sign in to a provider
A web flow or an API key, whichever the provider offers. One is enough. Then run autolith.
(update) inside, autolith update outsideYes, piping a URL into a shell is evil. Read the installer first. Nix is the preferred installation method on worthy operating systems.