Agent skill

Memwal

by MystenLabs in MystenLabs/MemWal

Walrus Memory SDK — portable agent memory that works across apps, sessions, and workflows.

Apache-2.0Auto-check: notesAgent Workflows

Install Memwal

skills CLI
$ npx skills add MystenLabs/MemWal --skill memwal -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install MystenLabs/MemWal memwal --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
memwal
GitHub stars
116
Token cost
~5.4k tokens
SKILL.md length
1,886 words
Files
1,840 (incl. scripts)
Skills in repo
1
Repo updated
First seen
Licence
Apache-2.0

At a glance

Walrus Memory SDK — portable agent memory that works across apps, sessions, and workflows.

  • Works in 3 steps: Get Your Credentials → Initialize the SDK → Store and Recall Memories
  • Tasks that involve Agent memory
  • SKILL.md covers When to Use, When NOT to Use, Installation and Quick Start, plus 8 more sections
  • Calls pnpm and pip; reaches relayer.memory.walrus.xyz and relayer-staging.memory.walrus.xyz; needs MEMWAL_PRIVATE_KEY

What it does

Memwal is an agent skill from MystenLabs/MemWal. Walrus Memory SDK — portable agent memory that works across apps, sessions, and workflows. Use when users say: - "add memory to my app" - "portable agent memory" - "integrate Walrus Memory" - "AI agent memory" - "memory across agents" - "Walrus memory storage" - "setup Walrus Memory" - "recall memories"

Its SKILL.md is about 5.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1848 other files, including scripts (for example `.agents/plugins/marketplace.json`, `.changeset/README.md` and `.changeset/config.json`).

It sits in Agent Workflows, covering Agent memory. The licence is Apache-2.0.

When your agent uses it

  • Tasks that involve Agent memory

Example prompts

  • “add memory to my app”
  • “portable agent memory”
  • “integrate Walrus Memory”
  • “/memwal”

Requirements

  • A credential in MEMWAL_PRIVATE_KEY

Workflow steps

3 steps, taken from the step headings in SKILL.md.

  1. Get Your Credentials
  2. Initialize the SDK
  3. Store and Recall Memories

What it can do on your machine

Read from SKILL.md and the folder at commit 3e0534e. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/, which the agent can run.

    Shell commands in SKILL.md call:

    • pnpm
    • pip

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • relayer.memory.walrus.xyz
    • relayer-staging.memory.walrus.xyz

    Also links to:

    • memory.walrus.xyz
    • staging.memory.walrus.xyz
    • npmjs.com
    • docs.wal.app

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • MEMWAL_PRIVATE_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Memwal loads about 5.4k tokens when it runs. Until then it costs about 78 tokens; SKILL.md has 1,886 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~78
When it runs · the whole SKILL.md, loaded when a task matches
~5.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:577
    tch, or staging/mainnet mismatch. Check `.env.local` and dashboard credentials |

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from MystenLabs/MemWal at commit 3e0534e, republished under its Apache-2.0 licence (© MystenLabs). 1,886 words, ~5,354 tokens.

Download SKILL.mdSave it as .claude/skills/memwal/SKILL.md (or your agent's skills folder). This skill also uses 1839 other files; get the full folder from GitHub.
name
memwal
description
Walrus Memory SDK — portable agent memory that works across apps, sessions, and workflows. Use when users say: - "add memory to my app" - "portable agent memory" - "integrate Walrus Memory" - "AI agent memory" - "memory across agents" - "Walrus memory storage" - "setup Walrus Memory" - "recall memories"
version
0.0.1
keywords
memwal, walrus memory, memory sdk, ai memory, portable memory, walrus storage, sui blockchain, delegate key, semantic search, vercel ai sdk

Walrus Memory — Portable Agent Memory

Walrus Memory enables AI agents to operate reliably across apps and sessions, without losing context. It stores memories on Walrus (decentralized storage), encrypts them with SEAL, enforces ownership onchain via Sui smart contracts, and retrieves them with semantic (vector) search. Memory is portable by design — not tied to a single runtime or provider — and scoped by owner + namespace for isolation and coordination.


When to Use

Use Walrus Memory when your app or agent needs:

  • Portable memory — persists outside prompts and context windows, moves across agents, apps, and workflows
  • Full owner control — programmable permissions and explicit ownership define how memory is shared and accessed
  • Agent coordination — shared memory spaces help agents coordinate across long-running and multi-step workflows
  • Semantic recall — retrieve memories by meaning, not just keywords
  • Verifiable integrity — memory integrity can be independently verified without centralized trust
  • Cross-app memory — not tied to a single runtime or provider, share memory between apps via delegate keys

When NOT to Use

  • Temporary conversation context that only matters in the current session
  • Large file storage (Walrus Memory is optimized for text memories)
  • Use cases that don't need encryption or decentralization

Installation

bash
# Install the SDK
pnpm add @mysten-incubation/memwal

# Optional: for Vercel AI SDK integration
pnpm add ai zod

# Optional: for manual client (client-side SEAL encryption)
pnpm add @mysten/sui @mysten/seal @mysten/walrus

Quick Start

1. Get Your Credentials

You need a delegate key (Ed25519 private key) and account ID (Walrus Memory account object ID on Sui).

Generate them at:

2. Initialize the SDK
ts
import { MemWal } from "@mysten-incubation/memwal";

const memwal = MemWal.create({
  key: process.env.MEMWAL_PRIVATE_KEY!,
  accountId: process.env.MEMWAL_ACCOUNT_ID!,
  serverUrl: process.env.MEMWAL_SERVER_URL ?? "https://relayer.memory.walrus.xyz",
  namespace: "my-app",
});
3. Store and Recall Memories
ts
// Store one already-distilled fact and wait until it is indexed.
await memwal.rememberAndWait(
  "User prefers dark mode and works in TypeScript.",
  undefined,
  { timeoutMs: 30_000 },
);

// Recall by meaning
const result = await memwal.recall({ query: "What are the user's preferences?" });
console.log(result.results);

// Extract facts from free-form text and wait until all accepted facts are indexed.
const analyzed = await memwal.analyzeAndWait(
  "I live in Hanoi and prefer dark mode.",
  undefined,
  { timeoutMs: 30_000 },
);
console.log(analyzed.facts.map((fact) => fact.text));

// Check relayer health
await memwal.health();

Use *AndWait when a workshop UI saves and then immediately recalls in the same flow. Indexing can lag by a few seconds, so remember() / analyze() may return before recall can find the new memory. Manual polling is still available for advanced async UIs:

ts
const accepted = await memwal.remember("User likes Sui.");
const stored = await memwal.waitForRememberJob(accepted.job_id, {
  pollIntervalMs: 750,
  timeoutMs: 30_000,
});

SDK Entry Points

Entry PointImportDescription
MemWal@mysten-incubation/memwalDefault. Relayer handles embedding, SEAL encryption, Walrus upload, vector search
MemWalManual@mysten-incubation/memwal/manualManual flow — client handles embedding and SEAL encryption
withMemWal@mysten-incubation/memwal/aiVercel AI SDK middleware — auto recall + save around AI conversations
Account utils@mysten-incubation/memwal/accountAccount creation, delegate key management

API Surface

Walrus Memory Methods
MethodDescriptionReturns
remember(text, namespace?)Accept one memory job immediately{ job_id, status }
rememberAndWait(text, namespace?, opts?)Store one memory and wait for completion{ id, job_id, blob_id, owner, namespace }
recall({ query, limit?, topK?, namespace?, maxDistance? }) (preferred) or recall(query, limit?, namespace?)Semantic search for memories{ results: [{ blob_id, text, distance }], total }
analyze(text, namespace?)Extract facts and accept one memory job per fact{ job_ids, facts, fact_count, status, owner }
analyzeAndWait(text, namespace?, opts?)Extract facts and wait for all fact jobs to complete{ results, facts, total, succeeded, failed, owner }
restore(namespace, limit?)Rebuild missing index entries from Walrus{ restored, skipped, failed, total, namespace, owner, truncated }
health()Check relayer health{ status, version }
getPublicKeyHex()Get hex-encoded public keystring
Lower-Level Methods
MethodDescription
rememberManual({ encryptedData, vector, namespace? })Send SEAL-encrypted bytes + pre-computed vector; relayer uploads
recallManual({ vector, limit?, namespace? })Search with pre-computed vector (returns blob IDs only)
embed(text)Generate embedding vector (no storage)
All Response Shapes
ts
interface RememberAcceptedResult {
  job_id: string;
  status: string;
}

interface RememberJobStatus {
  job_id: string;
  status: "pending" | "running" | "uploaded" | "done" | "failed" | "not_found";
  owner?: string;
  namespace?: string;
  blob_id?: string;
  error?: string;
}

interface RememberResult {
  id: string;
  job_id?: string;
  blob_id: string;
  owner: string;
  namespace: string;
}

interface RecallMemory {
  blob_id: string;
  text: string;
  distance: number;
}

interface RecallResult {
  results: RecallMemory[];
  total: number;
}

interface RecallOptions {
  limit?: number;
  topK?: number; // alias of limit; if both are set, topK wins
  namespace?: string;
  maxDistance?: number;
}

// `topK` and `limit` are aliases for the same value; if both are provided, `topK` takes precedence.

interface RememberBulkAcceptedResult {
  job_ids: string[];
  total: number;
  status: string;
}

interface AnalyzedFact {
  text: string;
  id: string;
  job_id?: string;
  blob_id?: string;
}

interface AnalyzeResult {
  job_ids: string[];
  facts: AnalyzedFact[];
  fact_count: number;
  status: string;
  owner: string;
}

interface RememberBulkStatusItem {
  job_id: string;
  status: "pending" | "running" | "uploaded" | "done" | "failed" | "not_found";
  blob_id?: string;
  error?: string;
}

interface RememberBulkStatusResult {
  results: RememberBulkStatusItem[];
}

interface RememberBulkItemResult {
  id: string;
  blob_id: string;
  status: "done" | "failed" | "timeout";
  namespace: string;
  error?: string;
}

interface RememberBulkResult {
  results: RememberBulkItemResult[];
  total: number;
  succeeded: number;
  failed: number;
}

interface AnalyzeWaitResult extends RememberBulkResult {
  facts: AnalyzedFact[];
  owner: string;
}

interface EmbedResult {
  vector: number[];
}

interface RestoreResult {
  restored: number;
  skipped: number;
  failed: number;
  total: number;
  namespace: string;
  owner: string;
  truncated: boolean;
}

interface HealthResult {
  status: string;
  version: string;
  mode?: string;
  prompt_versions?: {
    extract: string;
    ask: string;
  };
  relayerVersion?: string;
  apiVersion?: string;
  minSupportedSdk?: {
    typescript: string;
    python: string;
    mcp: string;
  };
  featureFlags?: Record<string, boolean>;
  deprecations?: Array<{
    surface: string;
    deprecatedSince: string;
    removalApiVersion: string;
    guidance: string;
  }>;
  build?: {
    commit?: string;
    buildTimestamp?: string;
  };
}

facts[].text is the extracted fact text to render in UIs. job_ids[] aligns with the accepted fact jobs; use analyzeAndWait() when the UI needs those facts indexed before continuing.

Namespace Semantics

A namespace is an opaque, flat string label scoped to a single owner. It is the unit of memory isolation: a recall in namespace A will never surface entries written to namespace B, even for the same owner, and never surfaces other owners' entries even in the same namespace.

Validation

Omit namespace and the server uses the literal string "default". An explicit empty string is rejected with HTTP 400 (namespace cannot be empty).

The server then accepts any non-empty UTF-8 string except:

  • more than 255 bytes (UTF-8 byte length, not character count — Rust str::len()) → HTTP 400 namespace exceeds maximum length of 255 bytes
  • a NUL byte (\0) → HTTP 400 namespace contains a NUL byte (WALM-439). Tabs, newlines, and other control characters are still allowed so older namespaces stay readable.

There is no character whitelist, no case folding, no trim, and no Unicode normalization. Whatever passes validation is stored verbatim and matched with exact equality.

Implication: "my-app", " my-app" (leading space), "My-App", and "my-app/" are four distinct namespaces. Pick a convention and stick to it. Multi-byte characters (CJK, emoji) consume more than one byte each, so they hit the 255-byte cap sooner than a character count would suggest.

Flat, not hierarchical

Slashes and dots have no special meaning. "chat/user-42" is a single opaque label, not a path. The server uses WHERE namespace = $1 exact-equality for every read; there is no prefix matching, no parent/child traversal, and no wildcard query. If you need hierarchy, build it in the application layer (e.g. recall across known namespaces and merge client-side).

Overwrite behavior — remember() is always append, never upsert

Every accepted remember() call creates a new memory entry with a freshly generated UUID. Sending the same text to the same (owner, namespace) twice will produce two separate entries that both surface in future recalls. The namespace is metadata for filtering, not a key for deduplication.

ts
await memwal.remember("I prefer dark mode", "prefs");
await memwal.remember("I prefer dark mode", "prefs");
// recall("preferences", { namespace: "prefs" }) → 2 entries, both with the same text

If you need uniqueness, either dedupe before calling remember(), or delete the prior entry first.

Isolation guarantees
ScenarioVisible to recall?
Same owner, same namespace✅
Same owner, different namespace❌
Different owner, same namespace❌
Different owner, different namespace❌

Cross-namespace and cross-owner reads are not just filtered out of results — the server's SQL WHERE clause excludes them entirely, so they are never decrypted or transferred.

Restore Semantics

restore(namespace, limit?) rebuilds missing local index entries for a namespace from Walrus. It is a recovery operation, not a sync — already-indexed blobs are left alone.

Response fields
FieldCountsNotes
restoredBlobs the relayer just rebuilt this callPulled from Walrus → SEAL decrypted → re-embedded → inserted as a new row
skippedOn-chain blobs already in the local success indexNo work needed; relayer left them as-is. Does not include decrypt/UTF-8 failures.
failedPermanent decrypt/UTF-8 failuresOn-chain blobs in this page that are negative-cached, plus new permanent failures this call. Older relayers omit the field; SDKs default it to 0.
totalAll on-chain blobs the relayer saw for (owner, namespace)Before the limit was applied
namespaceEcho of the request
ownerResolved owner address
truncatedKnown-retryable-incompletetrue is not a hard failure; false is not completeness

truncated=true means this restore is known-retryable-incomplete: more missing blobs than limit allowed this call to restore, or the sidecar's owner-wide candidate fetch hit its cap and raising limit can still expand that fetch (limit < 20). Once the sidecar cap is saturated (limit >= 20, cap pinned at 100), truncation follows this call's missing-blob page length, not onchain total. A fully restored namespace does not loop. truncated=false is not proof the sidecar saw every onchain blob; blobs beyond the owner-wide sidecar candidate cap can still be missing. WALM-451 tracks a sourceCapped field for that case. Relayers older than WALM-319 omit truncated; SDKs default it to false.

Permanent decrypt or invalid-UTF-8 failures count in failed, not skipped. Transient download/decrypt/embed errors are still not counted in restored, skipped, or failed and may be retried (truncated=true when a page yields only those). restored + skipped + failed therefore never exceeds total, and falls short of it whenever transient errors leave blobs uncounted.

Show full SKILL.md (720 more words)Show less
Default and limit
  • limit defaults to 10 in both TypeScript and Python SDKs and matches the server-side default. The Python SDK historically defaulted to 50; it is now realigned with the server.
  • limit caps the inspected blob set, newest-first. It does not cap restored independently — if all 10 inspected blobs are already indexed, restored = 0 and skipped = 10.
  • The relayer clamps limit to 1–100 (values outside that range are clamped, not rejected).
Pagination

Restore is single-shot — there is no cursor. To rebuild a namespace larger than your chosen limit, call again with a larger limit, or delete local rows you want re-imported first. Pagination is on the roadmap; until it lands, treat restore() as a "top up to N most recent" operation.

Performance

Latency scales linearly in limit:

  • Up to 10 concurrent Walrus aggregator downloads
  • Up to 3 concurrent SEAL decrypts (CPU-bound, capped intentionally)
  • Embedding requests in parallel (bounded by the relayer's embedding pool)

Expect seconds per blob on a cold cache. Use small limits (≤ 50) for interactive flows and run larger restores out-of-band.

Recall Distance and Filtering

recall() returns the closest K memories by vector distance. There is no default relevance threshold, so small namespaces may return weak filler results because they are still the closest available matches.

Lower distance means more similar:

DistanceRough meaning
< 0.25Duplicate or very close
0.25 - 0.55Related
0.55 - 0.8Weak/noisy
>= 0.8Usually unrelated

Use SDK-side filtering when you only want clearly relevant results. 0.8 is a starting point; calibrate it against your own memories and queries because useful matches can vary by phrasing and dataset:

ts
const memories = await memwal.recall({
  query: "what did I eat yesterday?",
  limit: 10,
  namespace: "reading-tracker",
  maxDistance: 0.8,
});

Equivalent manual filtering:

ts
const memories = await memwal.recall({
  query: "what did I eat yesterday?",
  limit: 10,
  namespace: "reading-tracker",
});
const relevant = memories.results.filter((memory) => memory.distance < 0.8);

Configuration

MemWalConfig
FieldTypeRequiredDefaultDescription
keystringYes—Ed25519 delegate private key in hex
accountIdstringYes—Walrus Memory account object ID on Sui
serverUrlstringNohttps://relayer.memory.walrus.xyzRelayer URL
namespacestringNo"default"Default namespace for memory isolation
Managed Relayer Endpoints
NetworkRelayer URL
Production (mainnet)https://relayer.memory.walrus.xyz
Staging (testnet)https://relayer-staging.memory.walrus.xyz
Framework and Key Handling

Delegate private keys belong on the server only. In Next.js App Router, call Walrus Memory from server actions, route handlers, or other server-only modules that read MEMWAL_PRIVATE_KEY from server env.

"use server" files can only export async functions; keep constants, schemas, and reusable client builders in a separate server-only module.

ts
// app/actions/memory.ts
"use server";

import { getMemWal } from "@/lib/memwal";

export async function savePreference(text: string) {
  const memwal = getMemWal();
  return memwal.rememberAndWait(text, "my-app", { timeoutMs: 30_000 });
}
ts
// lib/memwal.ts
import "server-only";
import { MemWal } from "@mysten-incubation/memwal";

export function getMemWal() {
  return MemWal.create({
    key: process.env.MEMWAL_PRIVATE_KEY!,
    accountId: process.env.MEMWAL_ACCOUNT_ID!,
    serverUrl: process.env.MEMWAL_SERVER_URL ?? "https://relayer.memory.walrus.xyz",
    namespace: "my-app",
  });
}

Namespace strategy: owner + namespace is the isolation boundary. Use one namespace per app by default, then split by user, team, or feature when a single app needs separate memory spaces.

Relayer choice: use staging/testnet for learning and prototypes; use production/mainnet for production data. Do not mix staging credentials with mainnet relayer configs.


Vercel AI SDK Integration

ts
import { openai } from "@ai-sdk/openai";
import { streamText } from "ai";
import { withMemWal } from "@mysten-incubation/memwal/ai";

const model = withMemWal(openai("gpt-4o"), {
  key: "<your-delegate-key>",
  accountId: "<your-account-id>",
  serverUrl: "https://relayer.memory.walrus.xyz",
  namespace: "chat",
  maxMemories: 5,
  autoSave: true,
  minRelevance: 0.3,
});

const result = streamText({
  model,
  messages: [{ role: "user", content: "What do you remember about me?" }],
});

The middleware automatically:

  • Recalls relevant memories before generation
  • Extracts and saves facts from conversations after generation

OpenClaw / NemoClaw Plugin

For OpenClaw agent integration, use the @mysten-incubation/oc-memwal plugin.

Install
bash
openclaw plugins install @mysten-incubation/oc-memwal
Configure

Add to ~/.openclaw/openclaw.json:

json
{
  "plugins": {
    "slots": { "memory": "oc-memwal" },
    "entries": {
      "oc-memwal": {
        "enabled": true,
        "config": {
          "privateKey": "${MEMWAL_PRIVATE_KEY}",
          "accountId": "0x...",
          "serverUrl": "https://relayer.memory.walrus.xyz"
        }
      }
    }
  }
}

Lifecycle hooks run automatically:

  • before_prompt_build — injects relevant memories as context
  • agent_end — captures last response

Troubleshooting

SymptomFix
health() returns errorCheck relayer URL is correct and reachable
recall() returns emptyVerify namespace matches what was used in remember()
recall() returns unrelated fillerRecall is top-K without a default relevance threshold; filter by distance, for example distance < 0.8, and calibrate the cutoff against your data
401 UnauthorizedUsually wrong MEMWAL_PRIVATE_KEY, key not registered on the account, account ID mismatch, or staging/mainnet mismatch. Check .env.local and dashboard credentials
SDK import errorsRun pnpm add @mysten-incubation/memwal — check Node.js ≥ 18
Manual client errorsInstall peer deps: @mysten/sui @mysten/seal @mysten/walrus
Direct Sui reads fail or examples look stalePrefer SuiGrpcClient from @mysten/sui/grpc; JSON-RPC snippets using SuiClient / getFullnodeUrl may be stale
forget expectations are unclearCurrent relayer POST /api/forget removes vector index rows so memories are unrecallable; Walrus blobs persist until epoch expiry

Brand Terminology

Until product confirms a canonical naming pass, these are the working assumptions reflected across this doc, the SDKs, and the relayer. Treat them as descriptive, not authoritative.

SurfaceCanonical termNotes
Product / docs / UIWalrus MemoryUsed in marketing copy, user-facing dashboards, and prose docs
Package / env vars / internal shorthandmemwalUsed in @mysten-incubation/memwal, pip install memwal, MEMWAL_* env vars, internal logs, and codepaths

If you're writing user-facing copy, prefer "Walrus Memory". If you're writing an env var, import path, or grep-target, prefer memwal. Don't mass-rename existing identifiers — that requires a coordinated migration outside this skill's scope.

© MystenLabs, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1,839 other files (scripts) in the repository root of MystenLabs/MemWal.

  • SKILL.md
  • .agents/plugins/marketplace.json
  • .changeset/README.md
  • .changeset/config.json
  • .claude-plugin/marketplace.json
  • .cursor-plugin/marketplace.json
  • .dockerignore
  • .github/ISSUE_TEMPLATE/bug.yml
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/feature.yml
  • .github/actions/setup-js/action.yml
  • .github/actions/setup-playwright
  • … and 1,828 more

Open the folder on GitHubat commit 3e0534e

Compare with similar skills

Memwal next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Memwal compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Memwal this skillMystenLabs/MemWal116—~5.4kAutomated safety check: NotesApache-2.0
Neat-Freak Knowledge CloseoutKKKKhazix/khazix-skills21k—~1.9kAutomated safety check: PassMIT
Beads Task Memorygastownhall/beads28k—~1.2kAutomated safety check: PassMIT
Reflect on Session Learningscursor/plugins10k5 repos~1.2kAutomated safety check: PassNone
MemPalace Memory SearchMemPalace/mempalace59k—~1.4kAutomated safety check: PassMIT
Compound Learning WriterEveryInc/compound-engineering-plugin25k—~2kAutomated safety check: PassMIT

Similar skills

  • Neat-Freak Knowledge Closeout

    KKKKhazix/khazix-skills

    Brings project docs, agent rule files, authorized memory and leftover workspace files back in line with what the code and runtime actually do at the end of a work session.

    21k GitHub stars~1.9k tokensUpdated 7 days ago
    Agent WorkflowsAuto-check passed
  • Beads Task Memory

    gastownhall/beads

    Tracks multi-session work with dependencies in the bd issue tracker so the agent can find ready tasks and recover its context after conversation compaction.

    28k GitHub stars~1.2k tokensUpdated today
    Agent WorkflowsAuto-check passed
  • Official

    Starts three parallel reviewer subagents over the current conversation transcript, then turns their findings into concrete edits to existing skills.

    10k GitHub starsUsed in 5 repos~1.2k tokens
    Agent WorkflowsAuto-check passed
  • MemPalace Memory Search

    MemPalace/mempalace

    Mines project files and conversation exports into a local, searchable memory palace and recalls past work by semantic search through the mempalace CLI.

    59k GitHub stars~1.4k tokensUpdated yesterday
    Agent WorkflowsAuto-check passed
  • Compound Learning Writer

    EveryInc/compound-engineering-plugin

    Records one solved and verified problem as a durable learning in the repository, but only when the reasoning is not already clear from the final code, tests or docs.

    25k GitHub stars~2k tokensUpdated yesterday
    Agent WorkflowsAuto-check passed
  • Searches past Claude Code, Codex and Cursor sessions and summarizes what was worked on, tried or decided, using extraction scripts instead of reading raw logs.

    24k GitHub stars~3.1k tokensUpdated today
    Agent WorkflowsAuto-check passed

Categories

Questions about Memwal

What does Memwal do?

Walrus Memory SDK — portable agent memory that works across apps, sessions, and workflows. Memwal is an agent skill from MystenLabs/MemWal. Walrus Memory SDK — portable agent memory that works across apps, sessions, and workflows.

When should I use Memwal?

Memwal fits situations like: tasks that involve Agent memory.

How do I install Memwal in Claude Code?

Run `npx skills add MystenLabs/MemWal --skill memwal -a claude-code`. Or copy the skill folder (the MystenLabs/MemWal repository) into .claude/skills/memwal in your project. Claude Code loads it when a task matches its description.

How do I install Memwal in Codex?

Run `npx skills add MystenLabs/MemWal --skill memwal -a codex`. Or copy the skill folder (the MystenLabs/MemWal repository) into .agents/skills/memwal in your project. Codex loads it when a task matches its description.

Can I use Memwal in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add MystenLabs/MemWal --skill memwal -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/memwal, .gemini/skills/memwal, .github/skills/memwal and .opencode/skills/memwal in your project.

What does Memwal need to run?

Going by SKILL.md and its folder, Memwal needs the command-line tools its instructions call (pnpm and pip) and credentials named MEMWAL_PRIVATE_KEY. Our summary lists: A credential in MEMWAL_PRIVATE_KEY.

Does Memwal access the network?

SKILL.md names 6 domains. In commands or code: relayer.memory.walrus.xyz and relayer-staging.memory.walrus.xyz; the agent is likely to contact these when it follows the instructions. As links in the text: memory.walrus.xyz, staging.memory.walrus.xyz, npmjs.com and docs.wal.app. This is read from the text; nothing was executed.

Is Memwal safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Memwal use?

Memwal is published under the Apache-2.0 licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Memwal use?

About 5.4k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Memwal?

Skills that share tags, products or a category with Memwal: Neat-Freak Knowledge Closeout (KKKKhazix/khazix-skills, 21k stars), Beads Task Memory (gastownhall/beads, 28k stars), Reflect on Session Learnings (cursor/plugins, 10k stars) and MemPalace Memory Search (MemPalace/mempalace, 59k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Memwal?

MystenLabs (a GitHub organization) maintains it in MystenLabs/MemWal, which has 116 GitHub stars. The repository was last updated on October 7, 2026.

Source: MystenLabs/MemWal on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.