Build email pipelines visually

Fetch, classify, route, and draft — all with a drag-and-drop canvas. epostAI connects IMAP, LLMs, and RAG into workflows you can see.

📥
IMAP
fetch email
Classifier
triage + RAG
🔀
Route
branch by category
📝
RAG Draft
AI reply
Each node is a block. Connect with edges. Click Run to execute.

How it works

Four steps from inbox to outbox
📥

Connect & fetch

Gmail or Outlook via IMAP. Enter credentials in the node panel, click Test, and pull the last N messages.

🤖

Classify with AI

LLM triages every email: needs reply or not, and suggests an action — archive, delete, flag, or reply. Optional RAG context from past emails.

🔀

Route by category

Action, Business, Junk, SaaS, Receipts — each takes a different path. Route nodes branch the flow based on the classifier's decision.

✍️

Draft & send

RAG Draft searches LanceDB for similar past emails, then writes a contextual reply. Review, edit, and send from the UI.

What's inside

The stack that powers each pipeline
🧩

Visual flow builder

React Flow canvas. Drag nodes, connect with edges, run the pipeline — no code.

🔐

IMAP & SMTP

Connect directly to Gmail or Outlook. App passwords only. No third-party API.

📚

RAG vector store

LanceDB in ephemeral storage. Embed with text-embedding-3-small. Search across past conversations.

🧠

LLM Agent node

Universal reasoning node. Place it anywhere in the flow to analyze upstream context and pass insights downstream.

🧪

Test pipeline

47 regression tests. pytest for backend, vitest for frontend. CI via GitHub Actions.

🆓

Free-tier LLM

OpenRouter free models. Embeddings via OpenAI. No paid API keys required to start.

Node types

Six blocks, infinite combinations
📥
IMAP Source
Fetch from Gmail or Outlook
AI Classifier
Triage with optional RAG
🔀
Route
Branch by category
📝
RAG Draft
Draft from email history
🧠
LLM Agent
Reason over upstream data
📁
Move to Folder
Archive or organize

Run it locally

Clone the repo, start backend + frontend, and build your first flow in minutes. No external services required.

View on GitHub →