Skip to main content
ReferenceVerified against core 1.2.8, measured on one stack holding 4,203 records

Sizing

What the stack needs from its machine: a fixed base for the services, and disk that grows with the records you keep. Measured on one stack; treat the per-record figures as a starting estimate and check your own with the commands at the end.

The base: the stack itself​

The stack runs fourteen services. Each has a memory limit in the compose file, so no service can take the whole machine:

ServiceWhat it doesMemory limit
ememory-postgresthe database (encrypted at rest)1.5 GB
gatewaythe model gateway1.5 GB
ememory-worker, ememory-worker-ingestbackground jobs: tagging, embedding, ingest1 GB each
local-embedthe local embedding model1 GB
ememory-apithe engine's API and MCP endpoint512 MB
archive-storethe archive512 MB
plugin-wordnetword senses for tagging512 MB
ememory-redis, ememory-worker-archive, ememory-worker-maintenancethe job queue and two workers384 MB each
chrono-engine, plugin-chrono, consoletime reading, and the web console256, 128, 128 MB

The limits add up to about 9 GB, but they are ceilings, not use: measured at rest with 4,203 records, the whole stack used about 2.7 GB. That is why 4 GB is the minimum and 8 GB is comfortable — it leaves room for the bursts a large import or a re-embedding causes.

CPU: 2 CPUs run it; 4 make ingest and re-embedding noticeably faster, because the local embedding model runs on the CPU. There is no GPU requirement.

Disk for the images: about 6 GB, pulled once.

What grows: your records​

Measured on one stack, 4,203 records averaging about 1,200 characters each, with full history, vectors and audit:

WhereSizePer record
the database106 MBabout 25 KB
the archive folder (ARCHIVE_DIR)88 MBabout 21 KB

Records much longer or shorter than 1,200 characters move these figures roughly in proportion. A rough guide from these measurements:

RecordsDatabaseArchive folderMemory for the engine
10,000about 250 MBabout 210 MB4–8 GB
100,000about 2.5 GBabout 2.1 GB8 GB
1,000,000about 25 GBabout 21 GB16 GB, with the database's own settings raised

These rows are extrapolated in a straight line from one measured stack; the larger ones are estimates, not measurements. Plan disk for the database and the archive folder separately: the archive folder is the one you back up and keep, the database is rebuilt from it.

Check your own​

docker stats --no-stream # memory per service, now
du -sh "$ARCHIVE_DIR" # the archive folder
docker compose exec ememory-postgres sh -c \
'psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "select pg_size_pretty(pg_database_size(current_database()))"'
curl -s http://localhost:8765/health # the record count is sr_count