Repository navigation
Releases: Codrihub/memora
Release list
Memora 1.3.8
A security and reliability pass: dependencies checked against published
advisories, Memora's own code reviewed for common vulnerability classes, and a
long load test for leaks. This covers what was found; it is not a guarantee
that nothing else is there.
Security
- Dependencies: updated rustls-webpki (RUSTSEC-2026-0382) and webpki-roots
(RUSTSEC-2026-0381), used by the release check and OAuth metadata fetch, and
zip (RUSTSEC-2026-0367, -0368, -0369; Memora never extracted archives, so it
was not exposed).cargo auditandnpm auditnow run in CI, Dependabot is
on, GitHub Actions are pinned to commits, and the Docker image is based on
Debian 13. - A note containing a crafted embed could crash the server every time it was
viewed. Fixed. - Behind a reverse proxy, a client-sent
CF-Connecting-IPorX-Real-IPcould
choose the caller's address, including127.0.0.1, and skip sign-in rate
limits. Memora now uses the right-mostX-Forwarded-Forentry that is not a
trusted proxy and ignores loopback addresses in headers. - Many failed sign-ins no longer lock the owner out: the server slows down
instead, and a correct password from a device without recent failures still
works. A wrong setup code no longer closes the setup window on the first try. - OAuth client registration is rate-limited per address and unused clients are
removed after an hour. The public client metadata fetch also refuses IPv4
addresses wrapped in IPv6 (such as NAT64). - Paths that pointed at
.gitor other store files through a symlink or a
Windows short name (GIT~1), and respelled paths that slipped past soft
locks, are refused. Windows device names,:streams and trailing dots or
spaces are refused too. - Privacy rules now also cover the trash, the activity log of
create_memory,
the history of a hidden note's former path, andimport_memoryreplies. - Text replacements (
bulk_replace, patchreplace, templates) are capped so
they cannot exhaust memory. /logoutaccepts POST only, with the same-origin check./_busrefuses
requests made by a browser.- Folder colours and icons read from
.folders.jsonare validated. - The state folder is tightened to owner-only, and Memora's own files in the
vault (.events.jsonl,.locks.jsonand others) are created owner-only.
Fixed
memora.loggrew without limit (one line per MCP request); it is now
bounded. The server raises its open-file limit so connection spikes do not
run out of file handles.- Memora's own files (
.events.jsonl,.locks.json) were committed to the
vault's git history on every write. - The activity log endpoint kept every parsed event of its window in memory.
- Leaving the Brain view kept its node card and controller in memory, and a
paused Activity page queued events without limit.
Changed
- The npm package needs Node.js 22 or newer (18 and 20 no longer get security
updates).
Install
curl -fsSL https://raw.githubusercontent.com/Codrihub/memora/v1.3.8/scripts/install.sh | sudo sh -s -- --version 1.3.8
docker pull ghcr.io/codrihub/memora:1.3.8
npm install -g @codrihub/memora@1.3.8Verify downloads with sha256sum -c SHA256SUMS --ignore-missing.
Memora 1.3.7
Added
- Drag and drop in the sidebar tree, with the mouse, a pen or touch (hold for a
moment, then drag): drop on a folder to move into it, on a note to move into
that note's folder, or on "All nodes" to move to the top level. A hint says
where the item will go, places it cannot go are marked, the list scrolls when
you drag near its top or bottom edge, and a closed folder opens when you hold
over it. Every drop asks "Move "X" to "Y"?" first; Escape cancels a drag. - A folder picker shaped like the sidebar tree in New node, Move to, Move
contents to and the folder delete dialog: expand and collapse, keyboard
navigation, and a search that finds folders by name or path at any depth. GET /api/folderslists every folder you can see, empty ones included.
Changed
- Very deep folder trees stay readable: indentation stops growing after six
levels and deeper rows show their level; long names end with an ellipsis and
show the full path on hover.
Fixed
- A new subfolder could not be chosen in New node (it only listed top-level
folders), and empty folders were missing from the sidebar, Move to and the
folder delete dialog. - A word made only of digits after
#(for example "PR #2") was read as a tag. - The sidebar kept jumping back to the top when the tree redrew.
Install
curl -fsSL https://raw.githubusercontent.com/Codrihub/memora/v1.3.7/scripts/install.sh | sudo sh -s -- --version 1.3.7
docker pull ghcr.io/codrihub/memora:1.3.7
npm install -g @codrihub/memora@1.3.7Verify downloads with sha256sum -c SHA256SUMS --ignore-missing.
Memora 1.3.6
Added
- Rows in the sidebar have a "⋯" button that opens the same menu as a right
click. It shows on hover and keyboard focus, and always on touch screens. - Copy path and Copy wikilink in every note and folder menu (sidebar, Nodes list,
node cards and the reader), so you can point an agent at an exact note. Copy
wikilink now copies the full path, e.g.[[Projects/Launch plan]]. - Deleting a folder that holds notes now asks what to do with them: move them to
the parent folder, the top-level folder, Root or any other folder, or send
everything to.Trash. The MCP tooldelete_folderand/api/delete-folder
take the same choice as optional arguments (into,mode: "trash"); without
them nothing changes. - An "Update & uninstall" guide in the documentation (web, console and
docs/INSTALL.md), including how to remove versions before 1.3.2 by hand,
safely: it stops Memora, removes only Memora's program and state folder by
exact path, asks before deleting, and keeps the vault unless you choose
otherwise. - A real "Page not found" / "Node not found" view instead of a silent redirect
to Overview.
Changed
- Windows is installed with npm (
npm install -g @codrihub/memora); releases no
longer carry a separate Windows zip. The npm package for Windows x64 is built
and tested as before. Zips of 1.3.0 to 1.3.5 stay on their release pages. - The note delete dialog says plainly that a note is deleted for good (there is
no trash for single notes) and when an agent can still restore it. memora-cli update,/updateand/restartdetect how Memora was installed
(npm, Docker, the installer, a release folder or a source build) and give the
matching steps. The npm launcher and the Docker image setMEMORA_INSTALL.memora-cli helplists start, stop, restart, update and uninstall, and an
unknown command prints the version and points tomemora-cli update.
Fixed
- An npm install was reported as "built from source" by
/update, and
/restartsuggested systemctl on Windows. memora-cli start,stop,restartanduninstallwithout--statecould
act on another install's running server (for example a systemd service). They
now name the state folder and service first, and refuse to drive a service
that belongs to a different kind of install.#tagsinside inline code, code blocks, URLs (…#install) and link targets
were read as tags, and a tag written twice was listed twice. Tag rename and
merge no longer rewrite text in code or URLs either.- Activity: rows of read-only calls (including
pin/unpin) no longer stay
"running"; the Live popover only says "now" for agents that are active; agent
colours match everywhere; counts that may be cut off by the log limit show
"2,000+". - The sidebar footer lines no longer overlap when they switch.
- Nodes list excerpts load as rows come into view instead of queueing; folder
paths and tags end with an ellipsis on phones. - Agent labels in the brain no longer cover the map controls on phones, and the
Overview Agents card no longer shows 0 while loading.
Install
curl -fsSL https://raw.githubusercontent.com/Codrihub/memora/v1.3.6/scripts/install.sh | sudo sh -s -- --version 1.3.6
docker pull ghcr.io/codrihub/memora:1.3.6
npm install -g @codrihub/memora@1.3.6Verify downloads with sha256sum -c SHA256SUMS --ignore-missing.
Memora 1.3.5
Fixed
- Memora slowed to a crawl under steady agent traffic: with a few hundred notes
and a few MCP calls per second, the web UI (tree, notes, agents) took tens of
seconds to answer. Tag lookups (search_by_tag,list_tags) re-rendered every
note while holding the vault lock, MCP calls and vault reads blocked the
server's async workers, and the note view walked the vault once per link. Tag
lookups now read the note cache, reads run off the async workers on a snapshot
of the vault, and a write refreshes only the note it changed. Under the same
traffic the tree and note requests answer in about 20 ms instead of 20-35 s. - The node card in Brain, Graph and Canvas no longer flashes its loading state
and refetches the note on every realtime update; it refreshes only when that
note changes. - The Tags page builds its index in one request instead of one per note.
Install
curl -fsSL https://raw.githubusercontent.com/Codrihub/memora/v1.3.5/scripts/install.sh | sudo sh -s -- --version 1.3.5
docker pull ghcr.io/codrihub/memora:1.3.5
npm install -g @codrihub/memora@1.3.5Verify downloads with sha256sum -c SHA256SUMS --ignore-missing.
Memora 1.3.4
Every MCP tool was tested against bad, missing, hidden and extreme input. This
release fixes what that found. Some calls that used to be accepted, and did
something other than what was asked, are now refused with a clear message.
Added
- Agent instructions come in five styles: Balanced (recommended), Remember
everything, Private, Session journal and Read only, each in a full and a
short version, on the docs page, in the connect guide and in the console.
Remember everything warns that secrets end up as plain Markdown and how to
hide them with privacy rules. Where to paste covers more clients. - The live panel in the header opens an agent's page; in Activity, an agent's
name on any row, the event drawer and an agent's activity page do too. list_trash(MCP): the notes in the trash, with where they came from.- Version history can be turned on with a plain
git initin the vault;
docs/CONFIGURATION.mdexplains how.
Changed
tools/callchecks arguments against the tool's schema: unknown names,
missing required arguments, wrong types, values outside an enum and numbers
below the minimum are refused. Every tool error starts with the tool name.- Search no longer keeps a
.fts.dbindex. Search and the graph, query and
digest tools read one in-memory cache that follows the files on disk, so
results are right at startup and include notes changed outside Memora.
Old.fts.dbfiles are removed. bulk_deletemoves notes to the trash, and refuses the whole call when any
path is wrong.restore_trashputs a note back where it was.- Moving or renaming a note or folder rewrites the wikilinks that pointed to
it, in MCP and in the web UI; results reportlinks_updated. delete_foldermoves notes to the parent folder and keeps their subfolders.- Soft locks are enforced: an agent cannot write to a note another agent has
locked, and only the holder (or the owner) can release a lock. - Tags may contain letters, digits and
- _ / .; tag tools ignore case.
Frontmatter fields refuse line breaks. follow_upsreturns{notes, count, truncated}and takeslimit; it also
countswaitingandblocked.digestreports all events and takeslimit.- Export and import use an exchange folder inside the state folder (0700),
not a folder shared by every instance in/tmp. template_createonly reads templates fromTemplates/.
Fixed
move_memorywithoutfoldermoved the note to the top level, and
create_memorywith an unknown argument created the note somewhere else.bulk_replacewith an emptyfindinserted text between every character.- Tags or fields with line breaks or YAML characters could break a note's
frontmatter;mention_agentcould add fake mention lines. privacy_setwith an empty agent list removed the rule, exposing a hidden
folder; an agent could take another agent's display name or "owner".- An agent could release or create locks in another agent's name.
template_createcould read any note, including hidden ones.- Search snippets mixed highlight tags with raw note HTML.
get_subgraphreversed edges, dropped one side of two-way links and
returned one node too many; nested folders were ignored byquery_memory,
digest,bulk_replaceandbulk_delete;list_memoryshowed nested
notes under their top-level folder.merge_memoryskipped missing sources silently, merged a note into itself
and pasted frontmatter into the body;batch_createignored typos.create_folderacceptedRoot;move_folderinto a note created a folder.- History tools returned empty results when the vault has no git repository;
they now say version history is off.snapshotexplains its refusals. - Many tools returned an empty success for paths that do not exist; they now
say what is missing. - Parallel calls of one tool could close each other's rows in Activity.
batch_createdid not tell open browsers about the notes it created.
Install
curl -fsSL https://raw.githubusercontent.com/Codrihub/memora/v1.3.4/scripts/install.sh | sudo sh -s -- --version 1.3.4
docker pull ghcr.io/codrihub/memora:1.3.4
npm install -g @codrihub/memora@1.3.4Verify downloads with sha256sum -c SHA256SUMS --ignore-missing.
Memora 1.3.3
Added
- Agents see new tools without reconnecting. The MCP session id now carries
the tool catalog it was issued for; when tools are added or switched off
(after an update, or in Settings), the next request on an older session is
answered as a short SSE stream that first sends
notifications/tools/list_changed, once, and then the normal response.
initializeadvertisestools.listChanged: true. Old sessions are never
refused, so clients that do not re-initialize keep working. This is what
madelist_pins,pinandunpinmissing for agents connected before
1.2.2. - Pins animate when they are added, moved or removed, in every open browser,
and a toast names the agent or person who pinned or unpinned (following the
activity toast setting). memora-cli stopstops a background server gracefully on every OS through
POST /_stop, a loopback-only request that needs the token the server
writes to<state>/stop.token. It falls back to SIGTERM ortaskkill.
Fixed
- Windows:
memora-cli stopwithout--forcecould not stop a server it
started, because Windows refuses a politetaskkillfor a process without
a console. - Windows:
memora-cli starthanded its console pipes to the server, so a
script or CI step reading its output waited until the server exited. - Windows: the vault chooser in the browser (first run and Settings) refused
paths such asC:\Users\you\memora; it accepts drive and UNC paths. - Windows:
memora-cli db backupalways failed with "Access is denied",
which also stopped the final backup during uninstall (nothing was
deleted).db restorefinds a server started bymemora-cli startand
says clearly when the database is in use. - Windows: paths are stored and printed without the
\\?\prefix
(memora-cli vault, uninstall output, the npm assets path in the log). - Windows: Ctrl+C in the console restores the console input mode, so the
shell never stays without echo after a password prompt.
Install
curl -fsSL https://raw.githubusercontent.com/Codrihub/memora/v1.3.3/scripts/install.sh | sudo sh -s -- --version 1.3.3
docker pull ghcr.io/codrihub/memora:1.3.3
npm install -g @codrihub/memora@1.3.3Verify downloads with sha256sum -c SHA256SUMS --ignore-missing.
Memora 1.3.2
Added
memora-cli start,stop(--force),restartanduninstall, and
/start,/shutdown(alias/stop),/restartand/uninstallin the
console. They detect how the install runs: a systemd service is driven
withsystemctl; an npm, release zip or source install runs the server in
the background withmemora.pidandmemora.login the state folder;
inside Docker the console prints the host commands.- Uninstall explains what it removes, then offers a checklist (space to
select) to also delete the settings and accounts and the vault. Both are
kept by default; deleting the vault needs its folder name typed, a final
database backup is offered before the state goes, and system folders, the
home folder and the program folder are never deleted. Without a terminal
it needs--yesand only deletes what--delete-configand
--delete-vaultsay. /guidegains a "Run and manage the server" step;memora-cli docs manage
covers it per install.
Changed
- The install guide's introduction names Windows and the npm and zip
installs and leads withmemora-cli setup.
Install
curl -fsSL https://raw.githubusercontent.com/Codrihub/memora/v1.3.2/scripts/install.sh | sudo sh -s -- --version 1.3.2
docker pull ghcr.io/codrihub/memora:1.3.2
npm install -g @codrihub/memora@1.3.2Verify downloads with sha256sum -c SHA256SUMS --ignore-missing.
Memora 1.3.1
Added
- Shut the server down from the browser: Settings, Server, Shut down (owner
only, after a confirmation). The server stops gracefully and exits with
status 0. When systemd (Restart=always) or Docker starts it again, the
confirmation says so and shows the stop command to use instead.
POST /api/server/shutdownrefuses API keys and cross-site requests. - One floating back-to-top button on every scrolling page, at the bottom
right and above the tab bar on phones.
Changed
- The welcome screen of a new instance is a wider two-column card, and its
steps usememora-cli setup(it prints the code and the link) with the
install's own command prefix. - At tablet widths the profile menu opens as a popover next to the sidebar
instead of a bottom sheet. - README and the install guide list start, stop and restart per install.
Fixed
- Code in reading themes: inline code and code blocks take the theme's
colours (Paper on the dark app was 1.3:1, now about 12:1). - The
web/node_modulessymlink of a work tree slipped into 1.2.3; it is no
longer tracked and the ignore rules now match a folder or a link.
Install
curl -fsSL https://raw.githubusercontent.com/Codrihub/memora/v1.3.1/scripts/install.sh | sudo sh -s -- --version 1.3.1
docker pull ghcr.io/codrihub/memora:1.3.1
npm install -g @codrihub/memora@1.3.1Verify downloads with sha256sum -c SHA256SUMS --ignore-missing.
Memora 1.3.0
Added
- Native Windows support:
memoraandmemora-clibuild and run on Windows
10/11 (x64), andnpm install -g @codrihub/memorainstalls the new
@codrihub/memora-win32-x64package there. The release workflow builds it
with a static C runtime. - A Windows zip on every GitHub release
(memora-<version>-x86_64-windows.zip, listed inSHA256SUMS) with
memora.exe,memora-cli.exeand the web UI: unzip and run, no installer
or Node needed.
Changed
- On Windows,
memora-cliruns database work in-process (there is no root
privilege drop), reports state files as private, and findssqlite3.exe
onPATHfordb shell. - The vault folder may be a Windows absolute path (
C:\...or
\\server\share). Migration 8 rebuilds thesettingstable so the
database accepts it; Unix paths are unchanged. On Windows, system folders
(%SystemRoot%,%ProgramFiles%,%ProgramData%) are refused as vaults. memorafinds its web UI in anassetsfolder next to the executable
(an unpacked release zip or tarball) whenMEMORA_ASSETSis not set.
Fixed
- The Windows system-folder check compares paths without regard to case, so
C:\Windowsis refused even when%SystemRoot%readsC:\WINDOWS.
Install
curl -fsSL https://raw.githubusercontent.com/Codrihub/memora/v1.3.0/scripts/install.sh | sudo sh -s -- --version 1.3.0
docker pull ghcr.io/codrihub/memora:1.3.0
npm install -g @codrihub/memora@1.3.0Verify downloads with sha256sum -c SHA256SUMS --ignore-missing.
Memora 1.2.3
Added
- Pins are saved on the server instead of in each browser. They follow a
note or folder when it is renamed, moved, trashed or deleted (including
everything inside a moved folder), show on every device, and update live
in open browsers. A pin whose item disappeared outside Memora stays
visible as "Not found" with a remove button. Existing browser pins are
uploaded once. Migration 7 adds thepintable. - Pins over HTTP (
GET/PUT /api/pins,POST /api/pins/pin,
POST /api/pins/unpin, signed-in owner only) and over MCP:list_pins
(read),pinandunpin(write), under the usual key scopes, tool grants
and privacy rules.
Changed
- Install in three steps: one command (the installer, a single
docker runwith named volumes, or npm),memora-cli setupfor a
one-time code, then the link it prints. README, the install guide and the
in-app Get started page lead with it. - The desktop sidebar is a little wider (288 px) and the profile menu fits
its width. While dragging onto Pinned, only the drop box is highlighted.
Fixed
patch_memory: an op missing a required field is an error instead of an
empty value. Areplacewithout its replacement used to delete the
matched text; an emptyfindor one that matches nothing now fails too.
replaceacceptsreplaceas an alias ofwith, and the tool
description lists every op and its fields.- Wikilinks written as
[[target\|alias]](the escape used inside tables)
no longer count the backslash as part of the target, so the graph,
backlinks and broken-link checks see the right note. docker-compose.ymlpointed at an old image; it now follows the release.
Install
curl -fsSL https://raw.githubusercontent.com/Codrihub/memora/v1.2.3/scripts/install.sh | sudo sh -s -- --version 1.2.3
docker pull ghcr.io/codrihub/memora:1.2.3
npm install -g @codrihub/memora@1.2.3Verify downloads with sha256sum -c SHA256SUMS --ignore-missing.