Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
20 changes: 10 additions & 10 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# Local-only quickstart credentials. Replace every secret before exposing the stack.
UGM_POSTGRES_USER=ugm
UGM_POSTGRES_PASSWORD=ugm-local-only
UGM_POSTGRES_DB=ugm
UGM_MINIO_ACCESS_KEY=remember-local
UGM_MINIO_SECRET_KEY=remember-local-only
REMEMBERSTACK_POSTGRES_USER=rememberstack
REMEMBERSTACK_POSTGRES_PASSWORD=rememberstack-local-only
REMEMBERSTACK_POSTGRES_DB=rememberstack
REMEMBERSTACK_MINIO_ACCESS_KEY=rememberstack-local
REMEMBERSTACK_MINIO_SECRET_KEY=rememberstack-local-only

# One stable deployment identity; changing it creates a different trust domain.
UGM_SELFHOST_DEPLOYMENT_ID=11111111-1111-4111-8111-111111111111
UGM_SELFHOST_DEPLOYMENT_SLUG=local
UGM_SELFHOST_DEPLOYMENT_NAME=Local memory
UGM_SELFHOST_API_PORT=8000
REMEMBERSTACK_SELFHOST_DEPLOYMENT_ID=11111111-1111-4111-8111-111111111111
REMEMBERSTACK_SELFHOST_DEPLOYMENT_SLUG=local
REMEMBERSTACK_SELFHOST_DEPLOYMENT_NAME=Local memory
REMEMBERSTACK_SELFHOST_API_PORT=8000

# Required to start the provider adapter. The short Markdown smoke path makes no
# provider request; replace this value before processing a real corpus.
UGM_OPENROUTER_API_KEY=replace-before-real-use
REMEMBERSTACK_OPENROUTER_API_KEY=replace-before-real-use
18 changes: 9 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ jobs:
- name: Prove MinIO conditional create
run: |
docker compose --env-file .env.example exec -T api python - <<'PY'
from ultimate_memory.adapters.selfhost import MinIOObjectStore, MinIOSettings
from ultimate_memory.model import ObjectAlreadyExistsError, ObjectKey
from rememberstack.adapters.selfhost import MinIOObjectStore, MinIOSettings
from rememberstack.model import ObjectAlreadyExistsError, ObjectKey

store = MinIOObjectStore(
bucket="remember-raw", settings=MinIOSettings.model_validate({})
Expand All @@ -51,7 +51,7 @@ jobs:
observed=''
for attempt in {1..30}; do
observed="$(docker compose --env-file .env.example exec -T postgres \
psql -U ugm -d ugm -Atc \
psql -U rememberstack -d rememberstack -Atc \
"SELECT count(*) FILTER (WHERE stage='convert' AND status='succeeded'), count(*) FILTER (WHERE stage='structure' AND status='succeeded'), count(*) FILTER (WHERE stage='chunk' AND status='pending') FROM processing_state")"
if [ "$observed" = '1|1|1' ]; then
break
Expand All @@ -60,7 +60,7 @@ jobs:
done
test "$observed" = '1|1|1'
test "$(docker compose --env-file .env.example exec -T postgres \
psql -U ugm -d ugm -Atc 'SELECT count(*) FROM cost_ledger')" = '0'
psql -U rememberstack -d rememberstack -Atc 'SELECT count(*) FROM cost_ledger')" = '0'

- name: Show service logs after failure
if: failure()
Expand All @@ -75,7 +75,7 @@ jobs:
permissions:
contents: read
env:
UGM_DATABASE_URL: postgresql+psycopg://ugm:ugm_test@localhost:5432/ugm_test
REMEMBERSTACK_DATABASE_URL: postgresql+psycopg://rememberstack:rememberstack_test@localhost:5432/rememberstack_test
strategy:
fail-fast: false
matrix:
Expand All @@ -84,13 +84,13 @@ jobs:
postgres:
image: ghcr.io/dbsystel/postgresql-partman@sha256:bf9d2331aaeb3e33a4e6e73b4c024ca618d4d1ea050bbab978125ff63b83385a
env:
POSTGRES_USER: ugm
POSTGRES_PASSWORD: ugm_test
POSTGRES_DB: ugm_test
POSTGRES_USER: rememberstack
POSTGRES_PASSWORD: rememberstack_test
POSTGRES_DB: rememberstack_test
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U ugm -d ugm_test"
--health-cmd "pg_isready -U rememberstack -d rememberstack_test"
--health-interval 5s
--health-timeout 5s
--health-retries 20
Expand Down
68 changes: 34 additions & 34 deletions .importlinter
Original file line number Diff line number Diff line change
@@ -1,64 +1,64 @@
[importlinter]
root_package = ultimate_memory
root_package = rememberstack

[importlinter:contract:model-is-independent]
name = Model imports no other ultimate_memory layer
name = Model imports no other rememberstack layer
type = forbidden
source_modules =
ultimate_memory.model
rememberstack.model
forbidden_modules =
ultimate_memory.core
ultimate_memory.spine
ultimate_memory.ports
ultimate_memory.adapters
ultimate_memory.llm
ultimate_memory.workers
ultimate_memory.surfaces
ultimate_memory.eval
ultimate_memory.profiles
rememberstack.core
rememberstack.spine
rememberstack.ports
rememberstack.adapters
rememberstack.llm
rememberstack.workers
rememberstack.surfaces
rememberstack.eval
rememberstack.profiles

[importlinter:contract:core-only-depends-on-model]
name = Core depends only on model
type = forbidden
source_modules =
ultimate_memory.core
rememberstack.core
forbidden_modules =
ultimate_memory.spine
ultimate_memory.ports
ultimate_memory.adapters
ultimate_memory.llm
ultimate_memory.workers
ultimate_memory.surfaces
ultimate_memory.eval
ultimate_memory.profiles
rememberstack.spine
rememberstack.ports
rememberstack.adapters
rememberstack.llm
rememberstack.workers
rememberstack.surfaces
rememberstack.eval
rememberstack.profiles

[importlinter:contract:workers-do-not-import-adapters]
name = Workers do not import adapters
type = forbidden
source_modules =
ultimate_memory.workers
rememberstack.workers
forbidden_modules =
ultimate_memory.adapters
rememberstack.adapters

[importlinter:contract:surfaces-do-not-import-adapters]
name = Surfaces do not import adapters
type = forbidden
source_modules =
ultimate_memory.surfaces
rememberstack.surfaces
forbidden_modules =
ultimate_memory.adapters
rememberstack.adapters

[importlinter:contract:profiles-own-adapter-composition]
name = Only profiles compose adapters
type = forbidden
source_modules =
ultimate_memory.model
ultimate_memory.core
ultimate_memory.spine
ultimate_memory.ports
ultimate_memory.llm
ultimate_memory.workers
ultimate_memory.surfaces
ultimate_memory.eval
rememberstack.model
rememberstack.core
rememberstack.spine
rememberstack.ports
rememberstack.llm
rememberstack.workers
rememberstack.surfaces
rememberstack.eval
forbidden_modules =
ultimate_memory.adapters
rememberstack.adapters
8 changes: 4 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# CLAUDE.md — working agreement for this repo

`ugm` (Ultimate General Memory) is a layered, scale-oriented memory system. It is in the
**design phase**: the repository is currently documents, not code. The planning hierarchy lives
in `plan/` and is described in `README.md` — read it first:
RememberStack is open memory infrastructure for AI agents. Its implementation and binding design
corpus live together in this repository. The planning hierarchy is described in `README.md` —
read it first:

- `plan/requirements/` — *what* the system must do (highest abstraction, mostly bullets)
- `plan/designs/` — *how* it works (binding architecture)
Expand Down Expand Up @@ -69,7 +69,7 @@ silently. When writing any design or decision:
## The docs site ships with the code (D66)

`website/` is the public documentation site (Next.js + MDX, statically exported to
GitHub Pages at `ultimate-memory.writeit.ai`). Two standing obligations when implementing:
GitHub Pages at `remember.dev`). Two standing obligations when implementing:

- **Same-PR docs.** Any PR that changes user-facing behavior — CLI commands, API/MCP
surface, configuration, mounts, connectors, deployment, the consumption skill — updates
Expand Down
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ COPY pyproject.toml uv.lock README.md LICENSE alembic.ini ./

RUN addgroup --system app \
&& adduser --system --ingroup app app \
&& mkdir -p /var/lib/ultimate-memory/forget-manifests \
&& chown -R app:app /var/lib/ultimate-memory \
&& mkdir -p /var/lib/rememberstack/forget-manifests \
&& chown -R app:app /var/lib/rememberstack \
&& uv sync --locked --no-dev --extra server --no-install-project

COPY src ./src
Expand All @@ -24,5 +24,5 @@ RUN uv sync --locked --no-dev --extra server

USER app

ENTRYPOINT ["python", "-m", "ultimate_memory.profiles.selfhost"]
ENTRYPOINT ["python", "-m", "rememberstack.profiles.selfhost"]
CMD ["api"]
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Ultimate Memory
# RememberStack

[![CI](https://github.com/writeitai/ultimate-memory/actions/workflows/ci.yml/badge.svg)](https://github.com/writeitai/ultimate-memory/actions/workflows/ci.yml)
[![Coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/writeitai/ultimate-memory/python-coverage-comment-action-data/endpoint.json)](https://github.com/writeitai/ultimate-memory/tree/python-coverage-comment-action-data)
[![CI](https://github.com/writeitai/rememberstack/actions/workflows/ci.yml/badge.svg)](https://github.com/writeitai/rememberstack/actions/workflows/ci.yml)
[![Coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/writeitai/rememberstack/python-coverage-comment-action-data/endpoint.json)](https://github.com/writeitai/rememberstack/tree/python-coverage-comment-action-data)

A memory system for AI agents, designed to ingest **millions** of heterogeneous documents and
distill them into progressively more abstract, navigable knowledge — while keeping everything
Expand Down Expand Up @@ -124,7 +124,7 @@ analysis says **why we think so**. A change should land at the highest level it
and flow downward.

Beside the plan lives **`website/`** — the public documentation site
([ultimate-memory.writeit.ai](https://ultimate-memory.writeit.ai)), a self-contained Next.js/MDX static app
([remember.dev](https://remember.dev)), a self-contained Next.js/MDX static app
that documents the system *as it ships* (D66): user-facing changes update their docs page in
the same PR, and the full-scope design intent stays here in `plan/`.

Expand Down
2 changes: 1 addition & 1 deletion alembic.ini
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[alembic]
script_location = src/ultimate_memory/spine/migrations
script_location = src/rememberstack/spine/migrations
prepend_sys_path = src
path_separator = os

Expand Down
40 changes: 20 additions & 20 deletions compose.yaml
Original file line number Diff line number Diff line change
@@ -1,33 +1,33 @@
name: ultimate-memory
name: rememberstack

x-app: &app
build:
context: .
dockerfile: Dockerfile
image: ultimate-memory:local
image: rememberstack:local
environment:
UGM_DATABASE_URL: postgresql+psycopg://${UGM_POSTGRES_USER}:${UGM_POSTGRES_PASSWORD}@postgres:5432/${UGM_POSTGRES_DB}
UGM_MINIO_ENDPOINT_URL: http://minio:9000
UGM_MINIO_ACCESS_KEY: ${UGM_MINIO_ACCESS_KEY}
UGM_MINIO_SECRET_KEY: ${UGM_MINIO_SECRET_KEY}
UGM_OPENROUTER_API_KEY: ${UGM_OPENROUTER_API_KEY}
UGM_SELFHOST_DEPLOYMENT_ID: ${UGM_SELFHOST_DEPLOYMENT_ID}
UGM_SELFHOST_DEPLOYMENT_SLUG: ${UGM_SELFHOST_DEPLOYMENT_SLUG}
UGM_SELFHOST_DEPLOYMENT_NAME: ${UGM_SELFHOST_DEPLOYMENT_NAME}
UGM_SELFHOST_API_PORT: "8000"
REMEMBERSTACK_DATABASE_URL: postgresql+psycopg://${REMEMBERSTACK_POSTGRES_USER}:${REMEMBERSTACK_POSTGRES_PASSWORD}@postgres:5432/${REMEMBERSTACK_POSTGRES_DB}
REMEMBERSTACK_MINIO_ENDPOINT_URL: http://minio:9000
REMEMBERSTACK_MINIO_ACCESS_KEY: ${REMEMBERSTACK_MINIO_ACCESS_KEY}
REMEMBERSTACK_MINIO_SECRET_KEY: ${REMEMBERSTACK_MINIO_SECRET_KEY}
REMEMBERSTACK_OPENROUTER_API_KEY: ${REMEMBERSTACK_OPENROUTER_API_KEY}
REMEMBERSTACK_SELFHOST_DEPLOYMENT_ID: ${REMEMBERSTACK_SELFHOST_DEPLOYMENT_ID}
REMEMBERSTACK_SELFHOST_DEPLOYMENT_SLUG: ${REMEMBERSTACK_SELFHOST_DEPLOYMENT_SLUG}
REMEMBERSTACK_SELFHOST_DEPLOYMENT_NAME: ${REMEMBERSTACK_SELFHOST_DEPLOYMENT_NAME}
REMEMBERSTACK_SELFHOST_API_PORT: "8000"
volumes:
- app-state:/var/lib/ultimate-memory
- forget-manifests:/var/lib/ultimate-memory/forget-manifests
- app-state:/var/lib/rememberstack
- forget-manifests:/var/lib/rememberstack/forget-manifests

services:
postgres:
image: ghcr.io/dbsystel/postgresql-partman@sha256:bf9d2331aaeb3e33a4e6e73b4c024ca618d4d1ea050bbab978125ff63b83385a
environment:
POSTGRES_USER: ${UGM_POSTGRES_USER}
POSTGRES_PASSWORD: ${UGM_POSTGRES_PASSWORD}
POSTGRES_DB: ${UGM_POSTGRES_DB}
POSTGRES_USER: ${REMEMBERSTACK_POSTGRES_USER}
POSTGRES_PASSWORD: ${REMEMBERSTACK_POSTGRES_PASSWORD}
POSTGRES_DB: ${REMEMBERSTACK_POSTGRES_DB}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${UGM_POSTGRES_USER} -d ${UGM_POSTGRES_DB}"]
test: ["CMD-SHELL", "pg_isready -U ${REMEMBERSTACK_POSTGRES_USER} -d ${REMEMBERSTACK_POSTGRES_DB}"]
interval: 2s
timeout: 5s
retries: 30
Expand All @@ -38,8 +38,8 @@ services:
image: quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z@sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e
command: server /data --console-address :9001
environment:
MINIO_ROOT_USER: ${UGM_MINIO_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${UGM_MINIO_SECRET_KEY}
MINIO_ROOT_USER: ${REMEMBERSTACK_MINIO_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${REMEMBERSTACK_MINIO_SECRET_KEY}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 2s
Expand Down Expand Up @@ -75,7 +75,7 @@ services:
timeout: 5s
retries: 30
ports:
- "${UGM_SELFHOST_API_PORT}:8000"
- "${REMEMBERSTACK_SELFHOST_API_PORT}:8000"

worker-convert:
<<: *app
Expand Down
Loading
Loading