Documentation Index
Fetch the complete documentation index at: https://docs.crewship.ai/llms.txt
Use this file to discover all available pages before exploring further.
Encryption at rest
Crewship stores per-agent memory on the host filesystem — under$CREWSHIP_DATA_DIR/output/crews/{crewID}/agents/{slug}/.memory/
— as plaintext markdown plus a SQLite database next to it. That’s
the right default for ergonomics (operators can grep, back up,
edit), but it leaves the operator on the hook for at-rest
encryption when the deployment carries PII.
PR-E F6 (PERSONA.md + per-user peer cards) deliberately keeps the
encryption layer out of the application — application-layer
encryption of small markdown files would bloat the codebase, add a
key-management problem, and break the “operators can grep their
own data” affordance. Instead we recommend filesystem-layer
encryption configured at deployment time. Two production-proven
options are documented below.
Threat model
The encryption-at-rest layer protects against ONE thing: a host disk leaving the data centre (stolen drive, decommissioned VM, unmounted backup tape) with the data unrecoverable to whoever finds it. It does NOT protect against:- A live Crewship process being compromised (the encryption keys are in RAM by definition).
- An operator with shell access to the host (the mount is transparent once unlocked).
- An attacker who can mount the volume via
crewshipditself (the bind mount sees plaintext). - A backup tool that copies the unmounted/unlocked filesystem (it sees plaintext too).
When you should turn this on
- Always for production deployments handling EU customer data (GDPR Article 32 baseline). The default for new EU-region installs is encryption-on, configured at provisioning time.
- Strongly recommended for any deployment carrying customer
PII in agent memory (
AGENT.mdcontent, peer cards naming specific operators). - Optional for single-operator local development setups where the laptop disk is already FileVault / BitLocker / LUKS encrypted at the OS layer.
Option A — LUKS (block-level, recommended for new hosts)
LUKS is the canonical Linux block-encryption layer. Configure it on the disk hosting$CREWSHIP_DATA_DIR BEFORE the first
crewship process starts; migrating an existing plaintext volume
in place is possible but slow and risky.
One-time setup
Boot-time unlock
For unattended boot, add an entry to/etc/crypttab:
Option B — eCryptfs (per-directory, for existing hosts)
eCryptfs encrypts at the filesystem layer above an existing mount, useful when you can’t (or don’t want to) reformat the underlying volume. Slower than LUKS for large workloads but trivial to layer onto an existing crewship install.Boot-time mount
Add an/etc/fstab entry referencing the eCryptfs auto-mount
helper, or use pam_ecryptfs to mount on first login.
Verifying
After setup, do two sanity checks before declaring success. The commands differ between Option A (LUKS, block-device) and Option B (eCryptfs, filesystem overlay) because there’s no/dev/mapper/...
device under eCryptfs — the encryption happens in the filesystem
layer over a regular directory.
Verify LUKS (Option A)
Verify eCryptfs (Option B)
Backups
Backups taken viacrewship backup create read the volume while
it’s unlocked, so the resulting tarball is plaintext. If you
need at-rest protection for the backup itself, run the tarball
through GPG / age before storing it off-host:
Application-layer encryption (deliberately out of scope)
PRs that add per-row encryption insidecrewshipd for these
small markdown files have come up and been rejected. The
trade-off ratio doesn’t work:
- Cost: a key-management surface, a per-row encrypt/decrypt path,
a migration story for existing plaintext, broken
grep/crewship memory searchergonomics. - Benefit: marginal over filesystem encryption for the dominant threat (lost disk), zero benefit for the other threats already enumerated above.