A Claude Code plugin for context persistence between sessions.
When sessions end, chats get compacted, or days pass between work blocks, Claude forgets everything. This plugin solves that by writing structured "handoff letters" to a local .memory/ folder that Claude reads on startup.
Result: Less re-explaining, fewer repeated mistakes, smoother "back into flow" experience.
Save structured session summaries with a single command:
- What we did (high-signal summary)
- Why we did it (decisions + reasoning)
- Pain Log (critical errors, root causes, workarounds)
- State that matters (variables, constraints, risks)
- Next steps (actionable, ranked)
Automatically transform session memories into public-ready blog posts via GitHub Actions + Claude API. Perfect for "building in public" with zero friction.
git clone https://github.com/mrwind-up-bird/letter-for-my-future-self.git
cd letter-for-my-future-self
chmod +x install_agents.sh
./install_agents.shOr install as a local plugin:
claude plugin install . --scope userCopy the template to your project:
cp /path/to/letter-for-my-future-self/CLAUDE_TEMPLATE.md /path/to/your-project/CLAUDE.mdIf you already have a CLAUDE.md, merge the relevant sections.
Start Claude Code in your project:
cd /path/to/your-project
claudeWhen ending a session, run:
/checkpoint
Or say "wrap up", "exit", or "end session".
A memory file appears in .memory/letter_YYYYMMDDHHMMSS.md.
claudeClaude reads the latest letter and picks up where you left off.
| Command | Description |
|---|---|
/checkpoint |
Save a session memory to .memory/ |
/letter-init |
Set up the Letter to Blog CI/CD pipeline |
| Flag | Description |
|---|---|
--file, -f |
Convert a specific memory file (filename or path) |
--setup |
Configure global API key (~/.config/letter-for-my-future-self/) |
--setup-project |
Configure project-specific API key (.letter-config.json) |
--status |
Show current API key configuration status |
Transform private session memories into polished blog posts automatically.
.memory/letter_03.md → GitHub Actions → Claude API → drafts/blog_2026-01-29_letter_03.md
- You work normally — Claude saves memories to
.memory/ - Git push triggers — GitHub Actions detects
.memory/**changes - Claude transforms — blog_gen.py calls Anthropic API
- PR created — Generated blog post appears in
drafts/ - You review & publish — Edit if needed, then merge
Initialize the pipeline:
/letter-init
This creates:
.github/scripts/blog_gen.py— Python generator script.github/scripts/vibe_requirements.txt— Dependencies.github/workflows/vibe_publisher.yml— GitHub Actions workflowdrafts/— Output directory
Add your API key to GitHub Secrets:
- Go to Settings → Secrets and variables → Actions
- Add secret named
ANTHROPIC_API_KEY - Value: Your key from https://console.anthropic.com
Commit and push:
git add .github/ drafts/
git commit -m "feat: add letter to blog pipeline"
git pushSee LETTER_TO_BLOG.md for full documentation.
Each checkpoint creates a file like .memory/letter_20260130143200.md:
# Letter to Myself (Session Handoff)
**Date:** 2026-01-30 14:32
## 1. Executive Summary
* **Goal:** Building a REST API for user authentication
* **Current Status:** Stopped at JWT refresh token implementation
## 2. The "Done" List (Context Anchor)
* Implemented user registration endpoint in `src/routes/auth.ts`
* Added password hashing with bcrypt
* Created PostgreSQL schema in `migrations/001_users.sql`
## 3. The "Pain" Log (CRITICAL)
* **Tried:** jsonwebtoken library for JWT signing
* **Failed:** "Algorithm not supported" error with RS256
* **Workaround:** Switched to HS256 with environment secret
* *Note:* Do not retry RS256 without proper key configuration.
## 4. Active Variable State
* PORT=3000, DATABASE_URL in .env
* Test user: test@example.com / password123
## 5. Immediate Next Steps
1. [ ] Implement refresh token rotation
2. [ ] Add rate limiting to auth endpoints
3. [ ] Write integration testsTrack .memory/ in Git to maintain a timeline of your project's decisions.
mkdir -p .memory
git add .memory
git commit -m "chore(memory): start tracking session memory"mkdir -p .memory/shared .memory/private
echo ".memory/private/" >> .gitignore- Shared: Architecture decisions, sync with team
- Private: Personal scratchpad, local only
rg -n --hidden --glob ".memory/**" \
-e "AKIA[0-9A-Z]{16}" \
-e "BEGIN( RSA)? PRIVATE KEY" \
.memory || echo "Clean"See MEMORY_VERSIONING.md for comprehensive workflows.
.
├── .claude-plugin/
│ ├── plugin.json # Plugin manifest (v1.0.5)
│ └── marketplace.json # Marketplace listing metadata
├── skills/
│ ├── letter-checkpoint/
│ │ └── SKILL.md # /checkpoint command
│ └── letter-init/
│ └── SKILL.md # /letter-init command
├── agents/
│ └── letter-for-myself.md # Agent persona
├── hooks/
│ └── hooks.json # Setup & SessionStart hooks
├── scripts/
│ ├── setup-api-key.sh # First-time setup (agent + API key)
│ └── check-project-key.sh # Per-project initialization
├── .github/
│ ├── scripts/
│ │ ├── blog_gen.py # Blog generator (CLI with --setup/--status/--file)
│ │ └── vibe_requirements.txt
│ └── workflows/
│ └── vibe_publisher.yml
├── CLAUDE_TEMPLATE.md # Template for user projects
├── QUICK_START.md # Installation guide
├── LETTER_TO_BLOG.md # Blog pipeline docs
└── MEMORY_VERSIONING.md # Git workflow guide
| Document | Description |
|---|---|
| QUICK_START.md | Step-by-step installation guide |
| LETTER_TO_BLOG.md | Blog pipeline documentation |
| MEMORY_VERSIONING.md | Git workflows for .memory/ |
| CLAUDE_TEMPLATE.md | Template for your projects |
Plugin commands don't appear
- Restart Claude Code
- Check plugin is installed:
claude plugin list - Verify
.claude-plugin/plugin.jsonexists
No .memory/ output
- Run
/checkpointexplicitly - Check
CLAUDE.mdincludes the template
Blog pipeline doesn't trigger
- Verify pushing to
mainbranch - Check
ANTHROPIC_API_KEYsecret is set - Look at Actions tab for errors
MIT
Built for developers who want Claude to remember what matters.