Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
d2396fe
docs(plan): add Hermes gap roadmap
penso Mar 28, 2026
56d801a
feat(tools): add cross-session search recall
penso Mar 28, 2026
cf96e0d
feat(tools): add automatic edit checkpoints
penso Mar 28, 2026
4a5a59e
docs(readme): sharpen persistent agent positioning
penso Mar 28, 2026
c9a6404
docs(plan): add remote reach execution roadmap
penso Mar 28, 2026
e0fc2ce
docs(plan): slice ecosystem and context work
penso Mar 28, 2026
d79d1e0
chore(beads): add worktree attach helper
penso Mar 28, 2026
975f956
feat(projects): harden context loading
penso Mar 28, 2026
fdea434
feat(skills): add portable bundle quarantine flow
penso Mar 28, 2026
b17ddc8
feat(exec): add ssh remote routing
penso Mar 28, 2026
360f97b
feat(web): add skills bundle ui and ssh target visibility
penso Mar 28, 2026
f8a03f4
feat(web): clarify ssh execution targets
penso Mar 28, 2026
c716651
feat(ssh): add managed deploy keys and targets
penso Mar 28, 2026
b1c2cf0
feat(nodes): add remote exec doctor panel
penso Mar 28, 2026
7285473
feat(ssh): harden managed targets and host pinning
penso Mar 28, 2026
beca74a
feat(nodes): repair active ssh host pins from doctor
penso Mar 28, 2026
ea19802
feat(ssh): add actionable runtime failure hints
penso Mar 28, 2026
2fff023
fix(security): address PR review feedback
penso Mar 28, 2026
2d0ff50
fix(ssh): tighten timeout and warning handling
penso Mar 28, 2026
39f8798
fix(ssh): address latest review follow-ups
penso Mar 28, 2026
0ca5d09
feat(web): add tools overview to settings
penso Mar 29, 2026
1c14460
Merge remote-tracking branch 'origin/main' into plant-diagram
penso Mar 29, 2026
afa2dbe
fix(gateway): collapse legacy ssh node lookup
penso Mar 29, 2026
d91b52c
fix(auth): guard ssh key deletion race
penso Mar 29, 2026
7adadfb
fix(httpd): satisfy ssh route lint
penso Mar 29, 2026
0266e0a
test(httpd): avoid expect in ssh route tests
penso Mar 29, 2026
6d53cb9
fix(ssh): reject option-like targets
penso Mar 29, 2026
a088581
fix(ssh): hide import passphrases from argv
penso Mar 29, 2026
c9bc565
refactor(ssh): use secrecy for imported key material
penso Mar 29, 2026
5e221b5
fix(ssh): quote known hosts path
penso Mar 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,20 @@ bd automatically syncs via Dolt:
- Use `bd dolt push`/`bd dolt pull` for remote sync
- No manual export/import needed!

### Worktrees

If you create a git worktree with plain `git worktree add`, Beads will not
automatically share the main checkout's `.beads` state. For an existing
worktree, run:

```bash
./scripts/bd-worktree-attach.sh
```

This writes `.beads/redirect` so the worktree uses the main repository's Beads
database. If you create worktrees through `bd worktree create`, it should set
up the redirect for you automatically.

### Important Rules

- ✅ Use bd for ALL task tracking
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 8 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<a href="https://moltis.org"><img src="https://raw.githubusercontent.com/moltis-org/moltis/main/website/favicon.svg" alt="Moltis" width="64"></a>

# Moltis — A Rust-native claw you can trust
# Moltis — A secure persistent personal agent server in Rust

One binary — sandboxed, secure, yours.

Expand All @@ -25,7 +25,7 @@ Moltis recently hit [the front page of Hacker News](https://news.ycombinator.com

**Your hardware** — Runs on a Mac Mini, a Raspberry Pi, or any server you own. One Rust binary, no Node.js, no npm, no runtime.

**Full-featured** — Voice, memory, scheduling, Telegram, Discord, browser automation, MCP servers — all built-in. No plugin marketplace to get supply-chain attacked through.
**Full-featured** — Voice, memory, cross-session recall, automatic edit checkpoints, scheduling, Telegram, Discord, browser automation, MCP servers, SSH or node-backed remote exec, managed deploy keys with host pinning in the web UI, a live Settings → Tools inventory, Cursor-compatible project context, and context-file threat scanning — all built-in. No plugin marketplace to get supply-chain attacked through.

**Auditable** — The agent loop + provider model fits in ~5K lines. The core (excluding the optional web UI) is ~196K lines across 46 modular crates you can audit independently, with 3,100+ tests and zero `unsafe` code\*.

Expand Down Expand Up @@ -123,16 +123,17 @@ See [Security Architecture](https://docs.moltis.org/security.html) for details.

- **AI Gateway** — Multi-provider LLM support (OpenAI Codex, GitHub Copilot, Local), streaming responses, agent loop with sub-agent delegation, parallel tool execution
- **Communication** — Web UI, Telegram, Microsoft Teams, Discord, API access, voice I/O (8 TTS + 7 STT providers), mobile PWA with push notifications
- **Memory & Context** — Per-agent memory workspaces, embeddings-powered long-term memory, hybrid vector + full-text search, session persistence with auto-compaction, project context
- **Memory & Recall** — Per-agent memory workspaces, embeddings-powered long-term memory, hybrid vector + full-text search, session persistence with auto-compaction, cross-session recall, Cursor-compatible project context, context-file safety scanning
- **Safer Agent Editing** — Automatic checkpoints before built-in skill and memory mutations, restore tooling, session branching
- **Extensibility** — MCP servers (stdio + HTTP/SSE), skill system, 15 lifecycle hook events with circuit breaker, destructive command guard
- **Security** — Encryption-at-rest vault (XChaCha20-Poly1305 + Argon2id), password + passkey + API key auth, sandbox isolation, SSRF/CSWSH protection
- **Operations** — Cron scheduling, OpenTelemetry tracing, Prometheus metrics, cloud deploy (Fly.io, DigitalOcean), Tailscale integration
- **Operations** — Cron scheduling, OpenTelemetry tracing, Prometheus metrics, cloud deploy (Fly.io, DigitalOcean), Tailscale integration, managed SSH deploy keys, host-pinned remote targets, live tool inventory in Settings, and CLI/web remote-exec doctor flows

## How It Works

Moltis is a **local-first AI gateway** — a single Rust binary that sits
between you and multiple LLM providers. Everything runs on your machine; no
cloud relay required.
Moltis is a **local-first persistent agent server** — a single Rust binary that
sits between you and multiple LLM providers, keeps durable session state, and
can meet you across channels without handing your data to a cloud relay.

```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
Expand Down
2 changes: 2 additions & 0 deletions crates/agents/src/memory_writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ pub struct MemoryWriteResult {
pub location: String,
/// Total number of bytes written.
pub bytes_written: usize,
/// Automatic checkpoint ID created before the write, when available.
pub checkpoint_id: Option<String>,
}

/// Writes content to memory files with validation.
Expand Down
8 changes: 7 additions & 1 deletion crates/agents/src/silent_turn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ impl AgentTool for MemoryWriteFileTool {
let MemoryWriteResult {
location,
bytes_written,
checkpoint_id,
} = self.writer.write_memory(path_str, content, append).await?;

self.written_paths
Expand All @@ -111,7 +112,11 @@ impl AgentTool for MemoryWriteFileTool {
.push(PathBuf::from(&location));

debug!(location = %location, bytes = bytes_written, "silent memory turn: wrote file");
Ok(serde_json::json!({ "ok": true, "path": location }))
Ok(serde_json::json!({
"ok": true,
"path": location,
"checkpointId": checkpoint_id,
}))
}
}

Expand Down Expand Up @@ -310,6 +315,7 @@ mod tests {
Ok(MemoryWriteResult {
location: path.to_string_lossy().into_owned(),
bytes_written: bytes,
checkpoint_id: None,
})
}
}
Expand Down
Loading
Loading