Otto’s memory system transforms it from an agent that starts fresh every session into a knowledgeable team member that remembers your environment, your conventions, and lessons learned from past interactions. Memory is stored locally as Markdown files split between your project repository and your home directory.
Memory lives in two places: your project repository and your home directory.
Each location serves a different purpose:
.astro/memory/): Conventions, architecture decisions, and environment details that should travel with the project. Committed to your repository so the whole team picks them up.~/.astro/memory/<project-slug>/): Your personal notes for one specific project. Lives in your home directory and isn’t committed.~/.astro/memory/): Preferences and patterns that apply to every project you work on. Lives in your home directory and isn’t committed.At the start of every session, Otto loads MEMORY.md from each location. Other .md files are indexed by name so Otto knows they exist, but they’re read on demand rather than loaded upfront.
In addition to .astro/memory/, Otto reads AGENTS.md and CLAUDE.md files for context. Otto loads them from ~/.astro/otto/AGENTS.md or ~/.astro/otto/CLAUDE.md, then walks up from the current working directory to /. When both files exist in the same folder, Otto prioritizes AGENTS.md over CLAUDE.md.
Otto creates memory in several ways:
/rememberRun /remember in an interactive session to have Otto review the conversation and generate memory files for the reusable learnings it identifies. Otto proposes the memories before writing them, and you approve or reject each one.
/bootstrapRun /bootstrap to seed shared project memory from your git history and available GitHub PR history (when the GitHub CLI is installed and authenticated). This is useful when you’re starting with Otto on an established project and want to capture existing team knowledge without building it up organically.
Platform teams can add Markdown files directly to .astro/memory/ to seed Otto with explicit constraints before organic memory accumulates. Upload files with conventions, approved operators, retry policies, and other standards, and add each file to MEMORY.md so Otto knows they exist.
For example:
Otto can also write memory on its own when it detects something worth retaining, without you running /remember or /bootstrap. This happens when Otto:
Each memory file is a Markdown file with the following structure:
The MEMORY.md file in each folder serves as an index. Otto reads it at the start of every session to understand what memory files are available, and adds entries for new memories as they’re created.
Otto avoids writing memory for:
README.md, CLAUDE.md, or committed documentation.Because shared project memory lives in .astro/memory/ within your project repository, it follows your team’s standard Git workflow:
Local project memory and local user memory are scoped to you and aren’t shared with the team.