NAPSAC (Notion Agent Persistent Store for Accessible Context) provides persistent AI memory using Notion as the storage backend. Use this skill when the user asks to initialize, read, write, search, or list their persistent memory — or when starting any conversation (call memory_list automatically). Trigger on: "remember this", "save this to memory", "what do you know about", "check your memory", "memory init", "search memory", "update memory", "list memory", or any reference to persistent context. Also trigger at conversation start to load context automatically. NAPSAC is a lightweight alternative to PACK — it uses Notion as the only backend with zero config, no GitHub, no MCP server, no API tokens.
A persistent memory system that uses Notion as the only storage backend. Zero config, zero infrastructure. Works immediately with Claude's native Notion connector.
Named for the knapsack — the lightweight daypack you grab when you don't need the full PACK. Part of the Alpine toolkit.
NAPSAC stores memory as Notion sub-pages under a user-designated root page. It provides five tools that match PACK's signatures so system prompts work interchangeably between the two products.
The plugin is the authoritative implementation. It provides validated naming, enforced page structure, and guaranteed index regeneration after every write. The system prompt approach (for ChatGPT, Cursor, Claude mobile) is a best-effort fallback — it relies on AI compliance with conventions, which varies by tool.
Tools:
memory_init — Set up a new memory root in Notionmemory_list — List all memory files (call at session start)memory_get — Read a specific memory filememory_update — Write or create a memory filememory_search — Search across all memory filesNAPSAC uses Notion exclusively. All reads and writes go through Claude's native Notion connector (Notion MCP tools).
Required Notion MCP tools:
notion-search — Find pages by titlenotion-get-page / notion-fetch — Read page contentnotion-create-page / notion-create-pages — Create new pagesnotion-update-page — Update existing pagesNo other infrastructure. No GitHub, no local server, no API tokens, no config files. If the user has Notion connected, NAPSAC works.
Memory is organized as Notion sub-pages under a root page:
[Memory Root Page]
├── _index (auto-managed, lists all files with links)
├── _conventions (naming/formatting rules — system page)
├── contacts/
│ └── contacts/key-people
├── context/
│ ├── context/general
│ └── context/preferences
├── profiles/
│ └── profiles/mynah-styles
└── projects/
├── projects/project-alpha
└── projects/project-beta
Conventions:
/ and contain
child pages. They are organizational containers only.context/preferences)._index page is auto-generated on every memory_update._conventions page is created once during memory_init and never
modified during normal operations. It is a system page.Purpose: Set up a new memory root in Notion.
Input:
page (required) — Notion page URL or ID to use as the memory rootBehavior:
"Notion connector is not connected. Enable it in Settings → Connectors → Notion to use NAPSAC memory."_index — Empty index page (will be populated on first update)_conventions — Naming and formatting rules (see _conventions content below)context/general — Starter memory file with content:
## General Context
This is the default memory file. Save general context and preferences here.
*Created by NAPSAC on [date].*
context/ directory page as a container._conventions page content:
# NAPSAC Memory Conventions
This page defines how memory is structured, named, and formatted.
Every AI tool reading this memory must follow these rules.
## Page Naming
- Leaf pages use full paths as titles: context/preferences, projects/alpha
- Directory pages use trailing slash: context/, projects/
- No file extensions (Notion pages don't have them)
- _index and _conventions are system pages -- never delete or rename
## Directory Taxonomy
- context/ -- Stable background: role, preferences, tooling
- projects/ -- Active and archived project memory
- profiles/ -- Style/format profiles (MYNAH, BINER)
- contacts/ -- People, accounts, org references
- New directories can be created freely
## Content Format
- Write as native Notion blocks, not raw markdown
- Headings, bullets, code blocks, quotes use native block types
- Pages must be readable in Notion UI without cleanup
## Index (_index)
- Regenerated after every memory write
- Lists all files with: path, description, tags, last updated
- Target: ~700 tokens for ~25 files
- If _index drifts, the next write auto-corrects it
## Profiles
- MYNAH: profiles/mynah-{context-id} (schema matches PACK)
- BINER: profiles/notion-design (schema matches PACK)
- Profiles are portable between PACK and NAPSAC
Error handling:
Purpose: Return a lightweight list of all memory files. This is the first call at every session start.
Input:
tag (optional) — Filter by tagtopic (optional) — Filter by topicdir (optional) — Filter by directory prefix (e.g., projects/)Behavior:
_index page under the memory root.Output format: The index content, which lists all files with:
Target: ~700 tokens for ~25 files.
Error handling:
"Memory root not configured. Run memory_init with a Notion page URL to get started."_index not found: "No index found. Run memory_init to set up your memory root."Purpose: Read a specific memory file by path.
Input:
path (optional) — File path (e.g., context/preferences).
If omitted, concatenates all files and returns them (v1 compat).all (optional, boolean) — If true, concatenate and return all files.Behavior:
path is provided:
a. Search for a child page under the root whose title matches the path.
b. Path resolution: If no exact match, attempt fuzzy resolution:
path has no /, search for context/{path}, projects/{path},
etc. If exactly one match is found, use it. If multiple matches,
return an error listing the ambiguous options.
c. Fetch the page content.
d. Convert Notion blocks to clean readable text.
e. Return the content.path is omitted or all is true:
a. Read the _index page.
b. Fetch all linked pages.
c. Concatenate their content with section headers.
d. Return the combined content.Output: