curl matters. Some agents’ web-fetch tools hand back a short model-written
summary instead of the page, and the details this page exists for (exact
commands, what an error means, what to tell you at the end) do not survive
summarizing. If your agent only has such a tool, ask it to quote the page
verbatim.
This is not the same thing as Agent Skills. Those are
installed files that teach an agent the habit of remembering. This page is a
single prompt that gets an agent connected in the first place, with no files
and no API key, and with nothing to sign in to first. Use this to onboard, then install the skills if you want the
habit too.
1. Setup check
This page works in any coding agent that can run shell commands: Claude Code, Codex, OpenCode, Goose, Gemini CLI, Cursor, Windsurf, Cline and the like. Where a step depends on the client, it says so and gives each client’s spelling. Work out which client you are before you start, and use only that client’s commands. Check by calling a tool, not by looking for a configuration entry. The test is one question: do you have a tool namedrecord (and list_spaces) in this
session that you can call, and does list_spaces return? Only a tool that is
in your own tool list counts. An entry in your client’s server list
(claude mcp list, codex mcp list, opencode mcp list, gemini mcp list, a
Goose extension, an mcp.json entry) is not that, even when it says
connected. If list_spaces returns, you are connected, but to an account
the human has not yet chosen for this work: ask first (below), then bring the
CLI up to date (the last part of this section) and skip to Usage, section 4.
Do not treat a server list as proof. A server can be listed, and even say
connected, while its tools are absent from your session, and in that state
you have nothing to call. Reading the list and stopping there is the single most
likely way to get this wrong: you will report success and then be unable to
record anything.
So there are five situations, and they need different answers:
Check the disabled case before the others, because it changes the order of the
fix. Telling someone to restart first, when the server they need is disabled,
costs them a restart that cannot work.
Found an existing account? Ask before you use it
Never pick an account for the human, and never write before they have picked. A machine can already hold one or more Anona credentials, and each one is somebody’s account: possibly the human’s, possibly a colleague’s, possibly a work account they would not want a side project written into. Writing to one they did not choose spends its credits and puts memories where they did not expect them, and it looks exactly like success. So first look for every credential, without writing anything:- Anona tools already in your session. Note which server each comes from:
the tool name or prefix says so (
mcp__anona__…,mcp__anona-oauth__…andmcp__claude_ai_anona__…in Claude Code,anona__…in Goose,mcp_anona_…in Gemini CLI, themcp__anonanamespace in Codex,tools.anona…). Codex does not list MCP tools up front: search for them with itstool_searchtool (queryanona). Calllist_spaceson each and note two or three space names. anona status: a signed-in account, a temporary profile, orNot logged in.- An
ANONA_API_KEYin the environment, or a key in this project’s config.
I found an Anona account already connected on this machine (spacesWait for the answer. Do not record, and do not runacme-notes,research, …). Should I use that account, and if so which space? Or should I start a separate temporary profile, which is empty, has 1,000 credits and expires in 72 hours unless you claim it?
anona start, until you
have it. Starting a temporary profile is not the safe default here; it is one
of the two answers, and choosing it for the human is the same mistake as
choosing the existing account for them. If you run unattended and cannot ask,
do neither: do not install a profile, do not record, report what you found and
the two choices, and stop. Installing or updating the CLI is still fine. An existing temporary profile (anona status shows one) is the
exception, since it was made for this machine: use it, and never create a second
one beside it. If your client has no anona server registered yet, register one
(the table in section 2), so the next session has the tools as well as the CLI.
If the human picks the temporary profile while other Anona tools are in your
session, those tools are still the other account. Starting a profile does not
change what they point at. On the temporary profile, write only through:
- the
anonaCLI (anona record,anona retrieve,anona reason), which uses the profileanona startstored, or - the tools of the server you register in section 2 (
anona, launched asanona mcp), once your client has loaded them.
anona-oauth, a claude.ai connector,
a server with an API key in its header) writes to the other account. Do not
call it for this work. Before the first write through an MCP tool, check it
reaches the profile: its list_spaces must return the same spaces as
anona spaces list (on a temporary profile, only default). If they differ, it
is the wrong account. If they match, that does not prove it is the same
account: every temporary profile has exactly one space called default, so
two different profiles look identical this way. The server name decides: only
the server you registered, launched as plain anona mcp with no other
environment or home directory, uses the profile the CLI holds. Treat every other
Anona server as a different account even when its spaces match.
If the human picks the existing account, use it: do not run anona start, and
ask which space before writing (section 4).
Install the CLI, or update it
Do this every time you follow this page, connected or not. New versions of theanona CLI ship often, and the MCP server your client launches is that same
CLI (anona mcp), so an old copy means old tools and missing commands even when
everything reports connected. Never assume the copy on the machine is current.
First find out what is there:
pipx list, pip show anona or npm ls -g @anona-labs/memory,
then:
PATH and keep running. A copy used through uvx has no
install to update, but uvx reuses what it cached, so ask for the newest
explicitly with uvx --from anona@latest anona ....
Then run anona --version again. If the version did not change, you updated
a copy that is not the one on PATH: compare against which -a anona and
update, or remove, the copy that is first. If an update fails, say so and carry
on with the installed version rather than stopping; the rest of this page names
the minimum version each command needs.
If the client was already running the proxy before you updated, it keeps the old
copy until it restarts. Memory still works in the meantime; mention to the human
that the update takes effect on their next restart.
2. Start a temporary profile
Do not make the human sign in first. Create a temporary profile and start using memory now; claiming the account is the last step, in section 7, and it is optional. With the CLI installed and current (end of section 1), start the profile:-
pip install anonawithout-Uover an existing copy reports success and leaves the old version in place. Ifanona --helpdoes not list the command you are about to use, that is why. -
If pip answers
error: externally-managed-environment, it is refusing to write to a system Python — the default on Debian, Ubuntu and Homebrew. -
If pip answers “No virtual environment found; run uv venv”, then
pipon this machine is a uv shim and wants a virtualenv it cannot see. Apip showin that shim also reports the package missing even when it is installed elsewhere, so do not read that as proof of anything. Either way, do not fight it.uvx --from anona@latest anona startinstalls nothing and runs the newest release;pipx install anonais the isolated alternative.pip install -U --break-system-packages anonaalso works and is what pip itself suggests, but it writes into the OS Python, so offer it only if neither of the others is available.
anona guide: it
prints a compact reference written for you — every command and flag, the
credential order, the exit codes and what --json returns — generated from
the copy that is installed, so it cannot describe a command you do not have.
anona with no arguments prints a shorter where-to-start. Both need pip
anona 0.25.0 or npm @anona-labs/memory 0.19.0 (the two packages are numbered
separately, so these are the same release); on an older copy anona guide is an unknown
command, so fall back to anona --help. Do not assume a command exists because
this page names it; the copy on the machine decides.
Use whichever of the two the machine has; you need only one. Both CLIs share
start, login, logout, status and mcp, and one credential file
(~/.anona/credentials.json), so anona start from one and anona login
from the other is fine. The data commands (record, retrieve, reason,
spaces, memories, documents, jobs and the settings commands) are pip
0.20.0 or later, and npm 0.19.0 or later, with the same flags and output. If the machine
has neither Python nor Node, use the signed-in path under “If anona start is
refused” below.
anona start prints the deadline and what to do about it. Its output looks
like this (the date shown is an example; use the one your run prints):
- The profile expires 72 hours after it was created. (The CLI counts down from creation, so it prints “in 71 hours” a moment later; that is the same deadline, rounded down.) After that its memories are deleted.
anona statusis the only warning channel. No email address is attached, so nothing else can warn anyone before the deadline.- While unclaimed it holds 1,000 credits. Claiming raises that to the normal 5,000. It is a ceiling, not a grant: credits already consumed carry over.
- Reads spend credits too, not only writes:
retrieve,reasonand the listing commands all draw on the balance, and at zero they are refused (exit6,credits_exhausted) like a write. A 100-itemrecord --batchcan cost on the order of 150-200 credits, so on a 1,000-credit profile try--batchwith a few lines first. - The profile has exactly one space,
default.anona spaces create, and a write with--space <anything else>, are refused with exit4,temp_profile_single_space; a read naming another space exits5,space_not_found, because no such space exists. Omit--space. anona logoutrefuses to discard a live unclaimed profile unless you pass--force. Do not pass it. Throwing away a profile deletes what it holds.
~/.anona/credentials.json (mode 600), under
your home directory. Do not print it.
Tell the human what they now have, straight away, before registering
anything, in your own words. They asked for memory and will otherwise not know
what it can do or what it costs. Cover:
- What it is: a temporary profile with no account behind it, one space
(
default), 1,000 credits, deleted on<the expiry from anona start>unless claimed withanona login. - What you can do with it for them now: remember what they tell you
(
record), find it again later by meaning (retrieve), answer a question from everything stored (reason), take in files (anona documents upload) and many memories at once (anona record --batch). Through MCP tools once their client loads them, and through the CLI right away. - What it costs: every read and write spends credits; one memory is roughly 10-15.
- What it cannot do: more than one space; the SDK or REST API with this credential (section 6).
I’ve started a temporary Anona profile for you: no sign-up, 1,000 credits, one space. I can now remember things you tell me, find them again later and answer questions from them, and take in files. It is deleted onThen register the proxy as a stdio server. First make sure the<expiry>unless you runanona loginto keep it.
anona on
your PATH is a working one: anona status must run and print something.
Before anona start or a sign-in, that something is Not logged in with exit
1, which is a working copy, not a broken one.
Every client registers whatever the name resolves to, so a stale or broken
anona (for example a leftover shim that fails with ModuleNotFoundError) is
registered without complaint and only fails later, when the client loads its
tools, far from the cause. If it is broken, register
uvx --from anona@latest anona mcp instead of anona mcp everywhere below: it needs
no installed command.
The server is the same everywhere: a stdio server named anona, launched as
anona mcp, with no arguments, environment or API key. Only the way you
register it differs. Use your own client’s row:
When you edit a config file rather than run a command, merge into it: read it
first, add the one
anona entry, and leave every other server as it was. Never
overwrite the file. If you do not recognise your client, find its MCP
documentation and register the same stdio command; if it has no MCP support,
skip to the shell commands in section 4.
For Codex, codex mcp add writes [mcp_servers.anona] with
command = "anona" and args = ["mcp"] to ~/.codex/config.toml; edit that file
directly if the mcp subcommand is missing from the installed version. Codex
starts MCP servers in the background and keeps their tools out of its tool list:
the model finds them with tool_search, under the mcp__anona namespace. A
headless codex exec given its prompt at launch searches before the server has
started and finds nothing; add required = true under [mcp_servers.anona]
if this machine runs Codex that way, or use the shell commands in section 4.
There is no sign-in step inside the client: the credential
already exists when the client starts, and the proxy renews it. Details are in
the anona CLI.
Do not poll any login or auth endpoint at any point in this flow. Those are
rate-limited and a polling loop will lock the attempt out. anona status shows
a stored credential, but that only proves it exists, so the first memory tool
call is the real check.
If anona start is refused. A profile can be refused because one is
already live, because the installed CLI is too old, or if the feature is ever
switched off again; in that last case the server answers that it refused to
create a profile. If it happens, here is what to do. Do not retry in a loop. Tell the
human, and offer the signed-in path instead: run anona login, show the
authorization URL it prints to the human, and tell them to open it. It also
tries to open a browser itself, but over SSH or in a container that fails, so
never assume a window appeared. Say:
Open this link and approve access. Check that the client name shown is the one you expect before you approve it. Tell me when you are done.That client-name check is the entire security model for this step. If they have no account, they create one on that same screen.
anona login exits on its own
once the approval lands. Then register the proxy exactly as in the table
above. This path needs approval once, and
again only after 30 days of total silence or if the human revokes the app under
MCP → Connected apps. In this case there is no deadline and section 7’s
deadline wording does not apply; tell the human the account is already theirs.
The alternative, for a client that drives its own OAuth. If the client has
a native OAuth implementation, skip the CLI and add the remote server at
https://memory.anonalabs.com/mcp:
--header, no key. This path does not sign anyone in by itself, and a failed
tool call does not open a browser. The human has to start it from the client
(/mcp in Claude Code, /mcps in OpenCode: pick the Anona server and
authenticate), and you cannot do that for them because it is an interactive
picker. Only Claude Code has been verified completing this flow; for every other
client use the CLI path above. Use it only when you cannot run the CLI.
One limit of the proxy to know about: it handles one message at a time, and a
slow reason can take up to 120 seconds, during which your other memory calls
wait.
3. Restarting, and waiting
If the Anona tools are not in your session, no amount of waiting will add them. In nearly every client, MCP tools load when the client starts (or, in an editor such as Cursor, when the server is enabled or the window reloaded). Say this to the human plainly, naming your client:
Anona is configured, but its tools only load when <your client> starts.
Restart it in this directory, then ask me again. The temporary profile is
already created, so there is nothing more to approve.
Then stop. Do not keep probing, and do not report that memory is working.
The session that starts after the restart has not read this page. It will
not know that a temporary profile exists, when it expires, or that
anona login claims it, so a human who later says “keep it” or “claim it”
gets a blank. Before you ask for the restart, on a temporary profile, leave that
session a note in memory: the setup-check record below already says it, and if
you skip that check, record the same sentence with anona record. And whenever
you are in a session that knows nothing of Anona’s setup, anona status is the
place to look: it names the deadline and the claim command.
If you cannot ask for a restart (you run unattended, or the human is not
there), you may still verify the setup by driving the stdio proxy yourself:
run anona mcp and send it JSON-RPC over stdin, one JSON object per
line, then close stdin; it prints one reply line per request. The sequence is
initialize, then the notifications/initialized notification (it gets no
reply), then tools/call:
result of ids 2 and 3; an error object means it failed. That is a
genuine check, since it is the same server your client will launch. Two limits. It proves the
profile works, not that your session has the tools, so say which of the two you
checked. And it writes real memories: the record above is true once the check
passes, so keep it as written rather than recording an example preference the
human never stated. On a signed-in account, drop its second sentence: there is
no temporary profile to claim.
Do not claim the tools are available in this session until they load.
If the server is configured but disabled, say this first, before any
mention of restarting:
The Anona server is disabled. Enable it, then restart <your client>.
Enabling is a choice only you can make, and restarting before it is enabled
will not help.
Tell them where: in Claude Code, /mcp and pick the server (anona if it was
added with anona mcp, or anona-oauth for the remote server); in Codex,
OpenCode and Goose, the server’s enabled setting in the config file named in
section 2; in Cursor and other editors, the toggle in the MCP settings page.
Claude Code only
Aclaude.ai entry is not a Claude Code server. claude mcp list shows
both: servers configured in Claude Code, and connectors synced from claude.ai,
the latter prefixed claude.ai. A line reading
claude.ai anona: https://memory.anonalabs.com/mcp - Connected means the
connector is healthy in claude.ai. It does not mean this session has Anona
tools, and claude mcp remove cannot touch it, because the CLI does not own
it.
So if the only Anona line you see is a claude.ai one, treat it as not set
up and go to section 2. Adding the Claude Code server alongside it is
correct and is not a duplicate; they are two different integrations that
happen to point at the same URL.
Every client
The general rule holds: judge by whetherlist_spaces works, never by what is
listed as connected.
Once the tools are present and any browser approval is pending: do not poll any
login or auth endpoint. Those are rate-limited and a polling loop will lock the
attempt out.
If you used the signed-in path and the human says they have approved, do not
take that as proof. Retry the
MCP tool call you were going to make anyway. Succeeding is the signal; a human
saying “done” is not, and acting on it leaves you reporting success for a
connection you never established. If the retry still comes back
unauthenticated, say so plainly rather than retrying in a loop.
4. Usage
Once connected, you have these MCP tools. Whether a tool needs aspace_id
depends on what you are signed in as. The contents in the examples below show
the shape of each call only. Record what the human actually told you, never an
example sentence from this page.
-
On a temporary profile (you ran
anona start), leavespace_idout of every tool. Its only space isdefault, and the call uses it: -
On a signed-in account, name the space. An account may hold several, and a
memory written to the wrong one looks exactly like success, so there is no
default. Pass exactly one of
space_idorroute: "auto", never both and never neither, or the call fails withroute_conflict:route: "auto"lets Anona choose the space instead, for when you do not know which one a memory belongs in. Calllist_spacesfirst if you do not know the names. -
recordstores a memory. Use it when the human tells you something worth remembering across sessions, a preference, a fact, a decision. Do not record your own answers or lookups, least of all “nothing is stored about X”: that sentence is itself a memory about X, and it is what the next lookup finds. -
retrievesearches memories semantically. Use it when you need context you might already have stored, before assuming you don’t. -
reasonsynthesizes an answer from accumulated memories rather than returning raw matches. Use it for a question whose answer is spread across several past memories. -
list_spaceslists the memory spaces available to this credential.
anona login stores (pip anona
0.24.0 or later), and then they need a space:
pass --space, and anona spaces list shows the account’s spaces. An older
CLI, or a login made with anona login --mcp only, has no command-line
credential and they refuse.
The CLI also does what the MCP tools cannot, so reach for it even alongside
MCP when the work calls for it: uploading files (anona documents upload),
ingesting many memories at once (anona record --batch FILE, JSON Lines, then
anona jobs get or --wait), and reading or changing a space’s settings.
When you script any of it:
- Pass
--json. You get one JSON document on stdout, and nothing on stdout when the command fails. - Branch on the exit code, not on the wording.
0worked,1failed for another reason (read stderr),2you used it wrong (nothing was sent),3nothing was stored,4the credential was refused,5not found,6rate limit or credits,7the server or network failed,8--waitgave up.anona guidelists them. - Errors and progress notices go to stderr (
Reasoning over space ..., retry notices), errors asanona: <code>: <message> (request_id <id>). Parse stdout on its own; if your tool merges the two streams, redirect stderr (2>/dev/nullor to a file) before parsing. Quote the request id if you report a failure to the human. - A write is never retried after a server error or a timeout, so a
7onrecordmeans it may or may not have landed. Retrieve before writing it again rather than recording it twice.
record tool returns no memory id, only a confirmation (anona record --json
does return memory_ids). An uploaded document’s job can finish as
completed with no memory count, so confirm an upload by retrieving from it,
not from the job. And retrieve can return more
entries than the number of record calls you made: stored text is split into
separate facts, so three records may come back as five entries. Report what you
recorded (three), not the entry count.
A space is the isolation boundary, one per application or tenant. Within a space,
user_id, agent_id and session_id scope individual memories further: a scoped
search returns only memories written under that same scope, so tag consistently
if you’re serving more than one end user through one connection.
Keep the deadline in front of the human. A temporary profile deletes its
memories when it expires, and a single mention at setup will be long forgotten.
Whenever you store something significant (a decision, a preference, a fact the
human would be sorry to lose), say in one line that it lives in a temporary
profile that expires at the date and time from anona start, and that
anona login keeps it. Check anona status for the current deadline if you
no longer have it. The server helps: while the profile is unclaimed, the MCP
initialize reply carries instructions naming the deadline and the claim
command, and a tool result carries a short [Anona notice for the agent] about
once an hour (every 15 minutes in the last 24 hours). Pass it on in one line;
do not repeat it every turn. anona mcp also prints a reminder at startup in
the last 24 hours, but on stderr, which most humans never see. Reminding
them is your job.
The full tool list, including three remote-only tools this credential also grants
(get_profile, get_model, get_user_profile), is in
MCP Integration.
5. Offer to install the skills
Connecting gave you the tools. The skills give you the habit: recall before a task, record after it, without being asked each time. The installer adds three:anona-memory (the habit), anona-memory-sdk (for writing code against the
API) and anona-cli (the CLI’s commands, --json output and exit codes, for a
session that works through the shell). Offer it, and if the
human agrees, run:
bash, not sh. The installer uses set -o pipefail, which dash rejects,
and /bin/sh is dash on Debian and Ubuntu — so piping to sh dies on line 8
with Illegal option -o pipefail before anything is installed.
No API key is needed for this. The installer detects the MCP server you just
connected and the skills call Anona through it. Skills load at session start,
so tell the human to restart you once.
6. Limits
The credentialsanona login issues work only for the anona CLI on this
machine: one over MCP, one for the CLI’s own commands. Neither is an API key,
so neither works with the SDK or with raw HTTP calls to the REST API. (A
temporary profile’s anona_tmp_ token does also authenticate the data plane
until it is claimed or expires, but treat that as a secret you are holding, not
something to wire into code.)
That boundary is worth stating plainly rather than discovering: do not offer
to install the Python or JavaScript SDK as part of this setup. It would
install fine and then have nothing to authenticate with. The SDK is for writing
code that calls Anona directly, which is a separate decision, and it needs an
API key the human mints from the dashboard under API keys. Everything in
this page works without one.
For the full flow this page starts, including troubleshooting a stuck approval,
see Agent Self-Onboarding.
7. Tell the human, and offer to keep it
When setup is done, and again at the end of the work, report to the human in your own words. Do not paste this page back at them and do not leave them to find the deadline in terminal output they never saw. Cover all of this:- A temporary profile was created and memory is working now.
- What has been stored so far, if anything. If nothing yet, say so, and that the space is empty.
- The deadline, as a date and time, and that the data is deleted then.
Use the exact expiry from
anona start, not “in a few days”. - That running
anona loginclaims the profile and keeps everything in it, and that doing nothing is a valid choice: the profile simply expires. - That claiming works with a new or an existing Anona account. A new
account takes over this profile’s workspace. An existing account keeps its
own spaces and gets this profile’s space copied in as a new space,
usually named
default-claimedbecause the account has its owndefault. - That credits already spent carry over: claiming raises the ceiling and does not reset what was used. Give the real figures, read them first (see below), and never a number from this page.
- Expiry: from
anona status(or theanona startoutput). - Credits: run
anona usage --json; it returnscredits_limit,credits_usedandcredits_remaining. Do not read the token out of~/.anona/credentials.jsonto call the API yourself: the CLI already holds it. If the command fails, say you do not know the balance rather than estimating it. - Memories stored: the ones you actually recorded.
<...> is a placeholder):
Anona Memory is set up and working. I created a temporary profile, so there was nothing to sign in to. So far I have storedIf the human says to claim it, run<N>memories:<one line each, what you really stored>. This profile has used<credits_used>of its<credits_limit>credits. It expires on<expiry date and time from anona status>, and its memories are deleted then, so I will mention the date again when I store anything important. To keep everything, runanona login(I can start it and give you the link), and sign up or sign in on the page it opens: a new account or one you already have both work. Nothing is lost on claiming. If you would rather not keep it, you do not need to do anything.
anona login yourself with your shell
tool (claiming is a command, not an MCP tool; do not tell them you cannot), show
them the URL it prints, and wait. The page it opens is the sign-up page, with a
sign-in link for a human who already has an account. anona login does not exit until the approval lands, and the
URL only works while it is running, because it carries a local callback port.
So start it in the background with its output going to a file
(anona login --no-browser > anona-login.log 2>&1 &) and read the URL from
that file. Do not pipe it into head (which waits for lines that never come),
and do not run it under a short timeout (which kills the callback and leaves a
dead link). It asks for one approval, which also signs in anona mcp. Do
not poll. When they say they have approved, confirm with
anona status and a memory tool call before you tell them it is claimed. After an
existing-account claim, the memories are in a new space, not in the
account’s own default: call list_spaces (or anona spaces list), find the
copy (usually default-claimed), tell the human its name, and pass it as the
space from then on. If you get claim_space_limit, say so plainly: their plan
has no room for another space, so they need to delete one or upgrade and then
approve again before the profile expires.
8. Where the rest of the documentation is
You have working memory now. You do not need the rest of this to use it, so do not go and read it; this is a map for when a question actually comes up. The tools you just connected- MCP Integration is the full tool list, including the three remote-only tools, and the connection options.
- Agent Skills is what section 5 installs, and what each skill actually changes about how you behave.
- Temporary profiles is the full flow behind sections 2 and 7, for the human.
- the anona CLI documents every command and which package has
which. The CLI for AI agents covers
anona guide, theanona-cliskill and the limits ofanona mcp; Scripting has the exit codes and--jsonshapes, and Troubleshooting the failures you are likely to hit.
- Concepts covers spaces, scope, the three operations, API keys and
tenant isolation. Read it before assuming what
retrievereturns. For the two memory layers — raw facts and the notes synthesized from them, which is why a search can return one where you wrote several — see Memory types. - Scoping for multi-tenant apps is the one to read if a single connection serves more than one end user, because a scoped read is strict and will not match memories written unscoped.
- Tuning recall and Temporal search for when results are not what you expected.
anona CLI. These are for
writing code that calls Anona directly, and the human mints a key from the
dashboard under API keys first.
- API overview, authentication and error codes.
- The data plane: record and list, retrieve, reason, documents and model selection.
- Python SDK and JavaScript SDK.
- The drop-in LLM proxy, if the human wants memory added to an existing OpenAI or Anthropic client without changing their call sites: chat, responses, messages, and migrating to the proxy.
docs.anonalabs.com, and every page is fetchable as
Markdown by appending .md to its URL, the same way you fetched this one.