Hooks
What ultan runs automatically, and when. A hook is a command Claude Code fires at a fixed moment, without you asking for it.
> /plugin marketplace add nickroci/ultan > /plugin install ultan@ultan
Ships with ultan. Installing the plugin gets these hooks.
What fires, and when
SessionStart
Fires once when a session begins, and again after a context compaction. It is where a plugin sets up its environment, or restores state the compaction dropped.
"${CLAUDE_PLUGIN_ROOT}/scripts/ensure-ultan.sh"[ -x "${CLAUDE_PLUGIN_DATA}/bin/ultan" ] && "${CLAUDE_PLUGIN_DATA}/bin/ultan" hook session-start || true
UserPromptSubmit
Fires before Claude sees each prompt you send. A plugin can use it to inject context, so the same instruction reaches the model every turn instead of only at session start.
if [ -x "${CLAUDE_PLUGIN_DATA}/bin/ultan" ]; then "${CLAUDE_PLUGIN_DATA}/bin/ultan" hook user-prompt-submit; else "${CLAUDE_PLUGIN_ROOT}/scripts/ensure-ultan.sh"; fi || true
PreToolUse
- Matches
Bash|Write|Edit|MultiEdit|NotebookEdit[ -x "${CLAUDE_PLUGIN_DATA}/bin/ultan" ] && "${CLAUDE_PLUGIN_DATA}/bin/ultan" hook pre-tool-use || true
Stop
[ -x "${CLAUDE_PLUGIN_DATA}/bin/ultan" ] && "${CLAUDE_PLUGIN_DATA}/bin/ultan" hook stop || true
PreCompact
[ -x "${CLAUDE_PLUGIN_DATA}/bin/ultan" ] && "${CLAUDE_PLUGIN_DATA}/bin/ultan" hook pre-compact || true
SessionEnd
[ -x "${CLAUDE_PLUGIN_DATA}/bin/ultan" ] && "${CLAUDE_PLUGIN_DATA}/bin/ultan" hook session-end || true
Ultan is a neuroscience-inspired, agentic memory system for Claude Code — a layered architecture that learns your preferences and coding conventions and recalls them across every session, project, and machine.

