Early betaVersion v0.8.128Agent Pandu is invitation-only while in beta.Request access

Personal agent · Persistent memory

Your decisions,
remembered.

A cited record of what you’ve decided — the role you’re aiming for, the people you promised, the places you’d go back to. Change your mind, and the old decision stays on the record, dated.

Invitation-only betaAI usage includedNo card to request access

An illustrated animation of one decision moving from conversation to a cited answer. Use the four stage buttons to step through it.
Agent PanduThe record in motion
Auto-playingSpecimen

01Said

Chat
Agent PanduListeningpersonal record
12 November 2025
You · 21:40

This blue-door biryani place off Lad Bazaar is unreal. Mutton biryani, mirchi ka salan. I was there with my sister. Next time Mom and Dad visit, we’re bringing them here.

You · 21:40

Remember this.

Agent Pandu · 21:40

Kept — because you asked. The place, the dish, your sister, and the promise. I’ll bring it up when they’re in Hyderabad.

Stored as spoken — the source stays attached.

Not a live account

Provider keys encrypted at restPer-account memorySelf-hostableEvery model call metered

Four moves,
every conversation.

The same loop you just watched, on a career record: capture what you say, turn it into facts, cite every answer, and keep the old version when you change your mind.

conversation-042✓ Episodic store
Targeting Staff+ nowReplacing Senior IC, dated 14 Sep
01

Capture

Conversations are kept as episodic records, so the source of a belief is never lost.

fact extractedsubject · predicate
roletargetStaff+
conf
0.91
02

Consolidate

Facts are extracted with a subject, a predicate, an object and a confidence score.

answerprovenance seam

aiming for Staff+ backend

§ conversation-042 · CONF 0.91
03

Cite

Answers carry inline citations that open the provenance of every fact they used.

validity windowtimeline kept
Senior ICStaff+ backend
Superseded · kept
04

Correct

Facts carry a validity window. New truth supersedes old, and any fact can be edited or retracted.

Time is
the schema.

Every fact carries a window. A newer fact closes the old one’s window; the old one stays on the record, dated, and still readable. Nothing is written without you: the agent proposes the goal or agenda item and asks for confirmation; a create is saved only when you confirm.

Personal record · specimenClick months to scrub time
CurrentSuperseded→Open
14 Sep 2026

Conversation-042 supersedes Senior IC. Old fact kept, dated, and permanent.

role · targetStaff+ backendsince 14 Sep
Staff+ backend
Current
goal · morningsprotect morning writingsince 22 Aug
protect mornings
Current
role · targetSenior IC1 May → 14 Sep
Senior IC
Superseded

A superseded fact is kept, not deleted: the record shows what you used to believe and when it changed.

The principle

A record that forgets
is not a record.

The parts you’d
want to check.

A personal record is only useful if you can trust where it lives. These are the defaults, not an enterprise add-on.

4 Invariants EnforcedAuditable seams · Zero shared tenant memory
Integrity: Verified by automated CI gate rules
  • 01KEY-DERIVED · AES-256-GCMVerified

    Encryption at rest

    Provider keys are encrypted with AES-256-GCM before they are stored, and the deployment reports whether its data key is configured.

    apps/api/src/cryptoUtils.tsAES-256-GCM CIPHER
    const cipher = crypto.createCipheriv("aes-256-gcm", encKey, iv);
    const tag = cipher.getAuthTag().toString("hex");
    // Authenticated ciphertext envelope
    prefix: "enc:v1:${iv}:${tag}:${ciphertext}"
    ✓ Key envelope activeCiphertext prefix: enc:v1
  • 02TENANT BOUNDARY · ADR-0053Air-Gapped

    Per-account isolation

    Memory is partitioned per account, so one tenant’s facts are never visible to another.

    apps/api/src/UserFactStoreRegistry.tsSTORE PARTITION
    const store = UserFactStoreRegistry.getStore(accountId);
    // Multi-tenant partition filter
    assert(store.tenantId === caller.accountId);
    isolation: 0 cross-tenant reads;
    ✓ Dedicated store per tenant0 shared sentinel memory
  • 03CONTAINER SPEC · DOCKERMulti-Target

    Self-hostable

    The API and the web app are containerized and run against a local store or a hosted one, from the same build.

    docker/DockerfileSINGLE BUILD
    FROM node:22-alpine
    USER 1001:1001 (non-root)
    ENTRY node apps/api/dist/index.js
    targets: ["local_store", "cloud_firestore"]
    ✓ Non-root execution (UID 1001)Targets: local store | hosted
  • 04AUDIT SEAM · ADR-0059Attributable

    Metered usage

    Every model call is logged with its task, model, tokens, cost and duration, so spend is attributable rather than estimated.

    apps/api/src/routes/chat/turnMetrics.tsMETERED SEAM
    recordPrompt({
     taskType: "chat", model: "gemini-2.5-flash",
     tokens: { in: 1180, out: 240 },
     durationMs: 412, costUSD: 0.0071
    });
    ✓ Real rate-card costAttributable per model call

Put yourself
on the record.

Create your account — Agent Pandu is in early beta, and account creation is invitation-only for now.

AES-256-GCM EnvelopeStrict Tenant IsolationAttributable Telemetry

Request an invitation

Account creation is invitation-only during the early beta. Leave your email; to confirm the address is yours we may send a link first. Every confirmed request is read by a person.

We use this address only to handle this request.