by inngest
Universally Triggered Agent Harness - An OpenClaw-like Inngest-powered personal agent
# Add to your Claude Code skills
git clone https://github.com/inngest/utahUniversally Triggered Agent Harness
A durable AI agent built with Inngest and pi-ai. No framework. Just a think/act/observe loop — Inngest provides durability, retries, and observability, while pi-ai provides a unified LLM interface across providers.
Simple TypeScript that gives you:
connect(), no server neededChannel (e.g. Telegram) → Inngest Cloud (webhook + transform) → WebSocket → Local Worker → LLM (Anthropic/OpenAI/Google) → Reply Event → Channel API
The worker connects to Inngest Cloud via WebSocket. No public endpoint. No ngrok. No VPS. Messages flow through Inngest as events, and the agent processes them locally with full filesystem access.
No comments yet. Be the first to share your thoughts!
git clone https://github.com/inngest/utah
cd utah
npm install # or pnpm
cp .env.example .env
Edit .env with your keys:
ANTHROPIC_API_KEY=sk-ant-...
INNGEST_EVENT_KEY=...
INNGEST_SIGNING_KEY=signkey-prod-...
Then add the environment variables for your channel(s) — see setup guides below.
Start the worker:
# Production mode (connects to Inngest Cloud via WebSocket)
npm start
# Development mode (uses local Inngest dev server)
npx inngest-cli@latest dev &
npm run dev
On startup, the worker automatically sets up webhooks and transforms for each configured channel.
The agent supports multiple messaging channels. Each channel has its own setup guide:
src/
├── worker.ts # Entry point — connect() or serve()
├── client.ts # Inngest client
├── config.ts # Configuration from...