Skip to content

Releases: PCBZ/polymnemo

v1.5.0 — Search modes

Choose a tag to compare

@PCBZ PCBZ released this 27 Oct 23:58
ed6634f

Search modes — recall now takes a mode, so you can find an exact ID, name or error message that search by meaning ranks poorly.

  • similarity (default, unchanged) — by meaning, across languages
  • keyword — rows containing every word, case-insensitively
  • rrf — both, fused by rank

The default is unchanged, so existing callers see no difference. keyword may return fewer results than limit, or none, and paging through rrf reaches at most about 100 results.

This release also fixes how filtered vector search is configured when the database is reached through Neon's connection pooler. The setting from v1.4.1 was applied per connection, which the pooler does not honour; it is now applied per search.

It adds a pg_trgm extension and an index to the database schema, applied automatically before the deploy.

Full changelog: v1.4.1...v1.5.0

v1.4.1 — Filtered search fix

Choose a tag to compare

@PCBZ PCBZ released this 24 Oct 04:06
b684711

Filtered searches no longer come up short — a recall into a large namespace could return fewer memories than exist, and now keeps scanning until it has enough.

This is insurance rather than a repair: nothing is known to be affected today, and the database is empty. It turns on pgvector's iterative scan for every connection, and logs one warning if the database's pgvector is older than 0.8.

Full changelog: v1.4.0...v1.4.1

v1.4.0 — Secret scanning

Choose a tag to compare

@PCBZ PCBZ released this 21 Oct 18:54
63c5a5d

Secret scanning — memories can now be scanned for credentials before they are stored, so a refused write was never written rather than deleted afterwards.

It is off by default. Set POLYMNEMO_RSP_CONFIG to turn it on; the image ships a config at /app/plugins/rsp.toml using two scanners — one for polymnemo's own API tokens, and gitleaks for cloud and service credentials.

It covers the text of a memory: remember, save_session, update, and a media memory's description. The contents of uploaded files are not scanned — those bytes go straight to object storage and never pass through the server.

Full changelog: v1.3.0...v1.4.0

v1.3.0 — Sign in with Google

Choose a tag to compare

@PCBZ PCBZ released this 21 Sep 01:08
f75da79

Sign in with Google — a second way to sign in on the token page, alongside GitHub.

A GitHub login and a Google login are separate accounts with separate memory.
MCP clients still authorise through GitHub or a bearer token.

Full changelog: v1.2.7...v1.3.0

v1.2.7 — Right-sized containers

Choose a tag to compare

@PCBZ PCBZ released this 19 Sep 06:24
bfc2929

Right-sized containers — 0.5 vCPU / 1Gi per replica, and a 60s cooldown instead of 300s. No change in behaviour.

Full changelog: v1.2.6...v1.2.7

v1.2.6 — Non-root container

Choose a tag to compare

@PCBZ PCBZ released this 19 Sep 04:04
8acea80

Non-root container — the server now runs as uid 10001 instead of root.

Full changelog: v1.2.5...v1.2.6

v1.2.5 — Structured per-call logging

Choose a tag to compare

@PCBZ PCBZ released this 17 Sep 04:56
1202716

Two things: every MCP call is now logged as JSON, and releases are gated on a test deployment.

Structured per-call logging (#93)

One line per call — who called, what they called, how long it took:

A test deployment, gating production (#129)

The image is built once, deployed to a test app with its own database branch and media bucket, smoke-tested against its real routes, and only then applied to production. Nothing in the image changed for this — it is all pipeline.

Note on v1.2.3 and v1.2.4

Both have the same contents as this release. Each failed in the new smoke gate, so production was never updated from either; 1.2.5 carries the fixes to the gate itself (#135, #136, #138). Nothing in the image differs between the three.

Full changelog: v1.2.2...v1.2.5

v1.2.4 — Structured per-call logging

Choose a tag to compare

@PCBZ PCBZ released this 17 Sep 04:37
6c30b93

Two things: every MCP call is now logged as JSON, and releases are gated on a test deployment.

Structured per-call logging (#93)

One line per call — who called, what they called, how long it took:

{"logger":"polymnemo.calls","event":"request_success","method":"tools/call",
 "target":"list_memories","duration_ms":1.32,"user_id":"alice"}

Turn it on with POLYMNEMO_LOG_FORMAT=json; the Terraform module sets it for you. Payloads are never logged, and POLYMNEMO_LOG_LEVEL cannot silence the auth and audit lines.

A test deployment, gating production (#129)

The image is built once, deployed to a test app with its own database branch and media bucket, smoke-tested against its real routes, and only then applied to production. Nothing in the image changed for this — it is all pipeline.

Note on v1.2.3

Same content. Its deploy failed in the smoke gate, so production was never updated from it; this release carries the fix (#135) plus a pipeline simplification (#136). Nothing in the image differs between the two.

Full changelog: v1.2.2...v1.2.4

v1.2.3 — Structured per-call logging

Choose a tag to compare

@PCBZ PCBZ released this 17 Sep 03:55
514fa8d

Two things: every MCP call is now logged as JSON, and releases are gated on a test deployment.

Structured per-call logging (#93)

One line per call — who called, what they called, how long it took:

A test deployment, gating production (#129)

The image is built once, deployed to a test app with its own database branch and media bucket, smoke-tested against its real routes, and only then applied to production. Nothing in the image changed for this — it is all pipeline.

Full changelog: v1.2.2...v1.2.3

v1.2.2 — API tokens, via GitHub login

Choose a tag to compare

@PCBZ PCBZ released this 15 Sep 05:27
c8a95c5

Sign in with your GitHub account at <server>/tokens to create an API token.

That's the whole feature. It exists because GitHub OAuth (1.2.0) needs a browser and a human — CI jobs, cron and server-side agents have neither, so they need a token instead.

Using it

  1. Open <server>/tokens and sign in with GitHub — same account, same user_id as OAuth, so memories are shared either way.
  2. Create a token. It's shown once and stored only as a hash.
  3. Use it like any bearer key:
Authorization: Bearer pmn_…

The same page lists and revokes your tokens. Tokens are browser-only by design — a secret should never travel an LLM channel, so there are no MCP tools for this. The tool surface is unchanged.

If you run a server

  • Add a second redirect URI to your GitHub OAuth App: https://<your-host>/tokens/callback. Keep the existing /auth/callback — that one is for MCP clients, and neither path covers the other.
  • No OAuth configured → the pages return 404, by design: without GitHub login there's no way in.
  • POLYMNEMO_API_KEYS still works. Keep it as your break-glass path — it's the only credential that doesn't need the database.

Full changelog: v1.2.1...v1.2.2