$ _

a personal AI agent
as one Go binary

A nanobot-class personal agent with none of the Python. joshbot is a single ~19MB static binary — no venv, no runtime dependencies. Self-hosted, curl to running in under a minute, and scriptable enough to test in CI.

Install Now How It Works
curl -fsSL https://raw.githubusercontent.com/bigknoxy/joshbot/main/install.sh | bash
joshbot — interactive session
$ joshbot agent
> what was that article about Go concurrency patterns?
[memory_search] Found 3 relevant facts...
You asked about this on March 12th. Key patterns: goroutines (cheap threads), channels (communicate via shared memory), and select (multiplex). Want me to fetch the full article?
>

ReAct loop,
real results

joshbot uses a ReAct (Reasoning + Acting) loop — it thinks, uses tools, learns from results, and iterates — all within a single conversation.

01

You speak

Send a message via CLI, Telegram, or script. Every channel feeds into a common message bus.

02

It reasons

The LLM core analyzes your intent with full context — past conversations, stored memories, available skills and tools.

03

It acts

Runs tools (search files, fetch web pages, execute code, delegate subagents) and observes results.

04

It learns

Key facts are extracted and saved to long-term memory. Repeated tool patterns auto-create reusable skills.

~19MB
Single static binary
0
Runtime dependencies
100%
Self-hosted

What can it do?

From daily productivity to deep research — joshbot handles the spectrum.

Daily Briefing

Summarizes calendar, tasks, and priorities into a morning plan. Flag urgent items and draft replies.

🔬

Deep Research

Gathers information across multiple sources, cross-references, and returns a structured brief with citations.

🧠

Cross-Session Memory

Retains facts, preferences, and decisions across days. Retrieves relevant context without being reminded.

🛠️

Code & Engineering

Generates, explains, debugs, and refactors code. Runs lint/tests on results. Investigates bugs systematically.

📡

Scheduled & Proactive

Schedule reminders in plain durations (30m, 2h, 1d), one-off or repeating. A heartbeat scans for unchecked tasks and follows up on its own.

🧩

Auto Skill Creation

Observes repeated tool-use patterns and generates reusable skills. Common tasks become one-command operations.

🤖

Subagent Delegation

Fans out independent tasks to parallel subagents or chains steps sequentially. Each gets focused context.

Streaming Replies

The interactive CLI and Telegram print the answer as it is generated instead of after the turn ends. On by default since v1.48.0 — set streaming: false to restore whole-reply delivery. Scripted output is unaffected either way.

⌨️

Interactive Line Editor

In a real terminal, joshbot agent gives you Tab slash-command completion, Up/Down history, multiline editing (Alt+Enter) and a prompt that shows the current model.

🧭

Slash Commands

Switch models or personalities per-session (/model, /personality), summarize context (/compact) and inspect status (/status) — in the CLI and from the Telegram menu.

📱

Telegram & Discord

Chat from anywhere via Telegram or Discord. Full skill and memory access from your phone. Telegram uses long-polling, Discord an outbound gateway websocket — no webhooks or inbound ports either way. Both channels fail closed — an empty allowlist rejects everyone. Enable one at a time: the bus has a single outbound channel that both read competitively, so running them together has them steal each other's replies.

🖼️

Images

Attach a picture with joshbot agent -m "what is this?" --image shot.png (repeatable), or just send a photo on Telegram. The type is decided by sniffing the bytes, never by the extension or by what the sender declared — PNG, JPEG, GIF and WebP, 5 MB per image and 20 MB per request. If no configured model is known to accept images, the run fails before any provider call with an error naming the models it tried; unknown models count as not vision-capable, so a typo reads as a typo rather than a provider 400. Sessions record what was sent — type, size, SHA-256 — not the bytes.

🔀

Named Profiles

Define profiles for a hosted model and your local Ollama, then pick one per run with --profile — on agent, gateway and preflight. A profile stores the name of the environment variable holding its key, never the key, and a typo, a disabled profile or an unset variable stops the run at startup instead of surfacing as a 401 mid-conversation. joshbot profiles list shows what each would dial and is safe to paste into a bug report.

📜

Scriptable & Agent-Testable

Every command runs non-interactively. Pipe one message with agent -m, get machine-readable output with --output-format json or NDJSON with stream-json, and thread turns with --resume. Meaningful exit codes make it safe to gate CI on.

🛡️

Redacted Output

API keys, auth headers and your home directory are stripped from logs and joshbot status before you ever see them — so a bug report is safe to paste. Conversations on disk stay verbatim, owner-only.

Get Started

One command to install

Downloads a single binary for your platform (Linux/macOS, amd64/arm64), verifies it, and points you at joshbot onboard. Open source, MIT licensed. Your data stays on your machine.

curl -fsSL https://raw.githubusercontent.com/bigknoxy/joshbot/main/install.sh | bash