ChatCLI uses a unified history — a single message array shared across all modes (chat, agent, coder). When saving a session, the entire context is preserved regardless of the mode in which it was generated. Use
/compact to reduce size and /rewind to go back to earlier points.Session Commands
All session management commands start with/session.
/session save <name>
Saves the current conversation (the entire history of prompts and responses) with a name of your choice.
/session load <name>
Loads a previously saved session. The current conversation is replaced by the loaded session’s history.
/session new (or /newsession)
Clears the current history and starts a completely new conversation. Perfect for starting a task from scratch without being tied to any named session.
/session fork <new-name>
Creates an independent copy of the current session with a new name. The original remains untouched and you automatically switch to working on the fork.Ideal for experimenting with different approaches without losing current progress, or branching a conversation in different directions.
Where Sessions Are Stored
Sessions are saved as JSON files in the current working directory (CWD) — that is, the directory from which you launched ChatCLI. The file naming pattern is:/session save debug-api creates the file:
The
SessionManager is the internal component responsible for all session file I/O. It handles read/write errors (permissions, full disk, malformed JSON) and displays clear messages if something fails./compact.
Data Format (v2)
Session files use the v2 format, defined by theSessionData struct in the models package. The JSON structure is:
Message Fields
| Field | Type | Description |
|---|---|---|
role | string | "user", "assistant", "system", or "tool" |
content | string | Text content of the message |
meta.is_summary | bool | true if the message is a summary generated by /compact |
meta.summary_of | int | Number of original messages this summary represents |
meta.mode | string | Mode in which the message was generated ("chat", "agent", "coder") |
tool_calls | array/null | List of tool calls (agent/coder mode) |
tool_call_id | string | ID of the tool call this message responds to (for role: "tool" messages) |
Format Evolution
- v1 (older versions): Maintained separate histories per mode —
chat_history,agent_history, andcoder_historyeach with their own messages. - v2 (current version): Uses a unified history. The
chat_historyfield contains all messages from all modes. Theagent_historyandcoder_historyfields exist for compatibility but are empty in new sessions.
Unified History and Sessions
ChatCLI uses a single message array for all interaction modes. This means:- When saving a session, the entire unified history is serialized — including messages from chat, agent, and coder mode.
- System messages, tool call results, and compacted summaries are all preserved in the file.
- When loading a session, the current history is completely replaced by the loaded session’s history.
Interaction with Other Systems
Sessions interact with several other ChatCLI subsystems. Here is how each one behaves:Compaction (/compact)
The /compact command reduces history size by creating summaries of older messages. If you save a session after compacting, the resulting file will be significantly smaller, as it contains summaries instead of the original messages.
Rewind (/rewind)
The checkpoints used by /rewind exist only in memory during the current run. They are not saved in the session file. When loading a session, you will not have rewind points available until you create new ones during the conversation.
Bootstrap (SOUL.md, etc.)
Bootstrap files are not part of the session. They are loaded automatically on every ChatCLI startup, regardless of which session is active. This ensures that the AI’s base behavior is always consistent.Memory (/memory)
Memory is global — it is not tied to any specific session. Data saved with /memory save is available across all sessions and survives ChatCLI restarts.
Context (/context attach)
Contexts attached via /context attach are not saved in the session file. When loading a session, you need to re-attach the necessary contexts manually.
Quick summary: Sessions only save the message history. Bootstrap, memory, contexts, and rewind checkpoints are managed separately.
Auto-Save and Persistence
If you close ChatCLI without saving, the conversation history will be permanently lost. There is no automatic recovery mechanism.The .chatcli_history File (Don’t Confuse)
ChatCLI maintains a separate file called .chatcli_history that stores the command input history (similar to ~/.bash_history). This file:
- Contains only the text you typed at the prompt, not the AI’s responses
- Is controlled by the
HISTORY_FILEandHISTORY_MAX_SIZEenvironment variables - Has no relation to session files (
.chatcli_session_*.json)
| Aspect | Sessions (.chatcli_session_*.json) | Command History (.chatcli_history) |
|---|---|---|
| Content | Complete conversation (user + assistant + tool) | Only what you typed |
| Saving | Manual (/session save) | Automatic |
| Format | Structured JSON (v2) | Plain text, one line per command |
| Control | /session commands | HISTORY_FILE, HISTORY_MAX_SIZE variables |
Recommended Workflow
To get the most out of the session system, follow these practices:Name sessions after the task
Use descriptive names that clearly identify the objective. Examples:
fix-auth-bug, refactor-api, docs-v2, debug-memory-leak.Compact before saving
Use
/compact before /session save to reduce file size and keep only the essential information.Start clean before switching sessions
Use
/session new before loading another session. This ensures the previous context doesn’t interfere.Session Encryption
Session files can be encrypted at rest using AES-256-GCM to protect sensitive conversation data:| Variable | Description | Default |
|---|---|---|
CHATCLI_ENCRYPTION_KEY | Encryption key (32 bytes, base64-encoded) | "" (disabled) |
Key derivation uses HKDF (HMAC-based Key Derivation Function) to generate unique per-session keys from the master key. This ensures that compromising one session does not compromise others.
Automatic Cleanup
ChatCLI can automatically remove old sessions on startup:| Variable | Description | Default |
|---|---|---|
CHATCLI_SESSION_TTL | Maximum session lifetime | 90d (90 days) |
CHATCLI_SESSION_TTL are automatically removed when ChatCLI starts. This prevents indefinite accumulation of old sessions on disk.
Name Validation
Session names are validated with a strict regex to prevent path traversal and problematic characters:- Allowed characters: letters (a-z, A-Z), numbers (0-9), hyphens (
-), underscores (_), and dots (.) - Length: 1 to 128 characters
- Forbidden: spaces, slashes, special characters,
..sequences
Frequently Asked Questions
Are sessions shared between machines?
Are sessions shared between machines?
Is there a size limit for sessions?
Is there a size limit for sessions?
Technically, the limit is defined by the
HISTORY_MAX_SIZE variable (default: 100MB), but in practice sessions rarely exceed a few megabytes. If the history is too large, use /compact before saving to significantly reduce the size.Can I manually edit the session JSON file?
Can I manually edit the session JSON file?
Yes, but with care. The file follows the v2 format described above. You can remove messages, edit content, or adjust metadata. Make sure to keep the JSON valid and the structure intact (especially the
version field).What happens if I load a session from an older version?
What happens if I load a session from an older version?
ChatCLI automatically detects sessions in the v1 format (with separate per-mode histories) and performs an automatic migration to v2, merging all messages in chronological order into the unified history. The process is transparent and requires no action from the user.
Can I have sessions with the same name in different directories?
Can I have sessions with the same name in different directories?
Yes. Since files are saved in the CWD, each directory has its own session namespace. A session called
debug in /project-a is completely independent from a session called debug in /project-b.Next Steps
Conversation Control
Use /compact and /rewind to manage history size and state.
Persistent Context
Save, attach, and reuse project snapshots with the /context command.
Bootstrap and Memory
Customize the AI and maintain long-term context.
One-Shot Mode
Use ChatCLI in scripts, automations, and CI/CD pipelines.