Artemis

Channels

How Artemis connects to the outside world.

Most AI setups trap you in a single interface. Artemis separates the "brain" (the core agent) from the "mouth" (the channels).

They all connect back to the central Gateway via WebSockets or REST, which means they share the same memory, the same tool registry, and the same context.

CLI

This is my everyday driver. It's built with Ink (React for the terminal) rather than just being a raw text stream.

Instead of just running a loose script, the CLI is now packaged as a fully-fledged @artemis/cli terminal app. Once linked globally, you interact with the agent natively:

artemis chat      # Interactive chat TUI (default)
artemis channels  # Manage active channel connections
artemis config    # View configuration & LLM providers
artemis brain     # Browse your ~/.artemis memory files safely
artemis gateway   # Stop, start, and restart the background daemon

The chat interface is the heavy lifter. It supports hot-reloading active sessions across channels, gracefully handles manual tool confirmation prompts, and uses a dynamic shimmer effect to look premium while the LLM reasons.

Web UI

A robust Next.js 16 chat interface. It leverages a fully synchronized cmdk-based session dropdown so you can seamlessly hop between CLI history, WhatsApp replies, Web UI conversations, and Gmail threads natively.

pnpm web

WhatsApp

The WhatsApp implementation uses whatsapp-web.js. It runs a headless browser under the hood to handle the connection.

pnpm whatsapp

On the first run, it drops a QR code in your terminal. Scan it with your phone, and the agent becomes a contact you can text. I lowered the verbosity in the system prompt for this channel specifically, because wall-of-text replies in WhatsApp are annoying.

Discord

A simple Discord integration restricted to DMs.

pnpm discord

You'll need a bot token from the Discord Developer Portal. Make sure you set DISCORD_OWNER_ID in your .env, or the bot will refuse to talk to anyone. I didn't build this to be a public server bot—it's meant to be your personal assistant.

Telegram

A Telegram bot integration that supports streaming replies, thinking trace updates, and image inputs.

pnpm telegram

You will need a bot token from Telegram's BotFather. Set TELEGRAM_BOT_TOKEN in your .env file. You can also specify TELEGRAM_PROVIDER and TELEGRAM_MODEL. Centralized admin authorization applies on first contact, requiring OTP or admin approval.

Gmail

The most complex channel. It uses a local OAuth2 flow to authenticate, caches the token, and then periodically polls your inbox in the background.

pnpm gmail

It can read threads, draft replies, and send emails directly. More importantly, email threads are directly surfaced alongside your regular conversations in the Web UI, allowing you to converse with email recipients identically to chatting in the terminal.

The Architecture

Each channel roughly follows the same pattern. There is a listener that catches incoming events (a CLI keystroke, a WhatsApp message, a Discord webhook). That event gets pushed over WebSocket to the Gateway. The Gateway wakes up the Agent Core, which does whatever tool-calling and reasoning it needs, then pushes chunks of the response back down the socket to be rendered by the channel.