{"slug": "show-hn-tanchi-open-source-ai-prospecting-agent-that-only-automates-email", "title": "Show HN: Tanchi – Open-source AI prospecting agent that only automates email", "summary": "Tanchi, an open-source AI prospecting agent that automates only email outreach, has been released on GitHub by tanchihq. The self-hostable system sources, researches, writes, and follows up on B2B prospects nightly, using verified intelligence from prospects' own websites or LinkedIn, and measures replies and meetings rather than opens. It runs in a single Docker image requiring only Docker and an Anthropic API key, with a setup wizard for configuration.", "body_md": "Autonomous B2B prospecting engine — open source, self-hostable.\n\nThe AI sources, researches, writes and follows up every night. You stay in control of what gets sent.\n\nThe system learns from what actually converts, not from what looks nice.\n\nTanchi takes the opposite stance to most AI prospecting tools:\n\n**Email-first.** The only channel that is genuinely safe to automate. Everything else is assisted (the AI drafts, a human sends).**Verified intelligence.** Every fact in a prospect dossier is sourced from the prospect's own website or LinkedIn. Never invented, never a filled-in gap.**Qualitative learning first.** We distill, in plain language, what converts per ICP before any statistics. Interpretable, correctable, effective from month one.**We measure replies and meetings, never opens.**\n\ntanchi(探知) means \"detection\" in Japanese — the radar sweeping the dark for signals.\n\nThe heart of the project — sourcing, the intelligence pipeline, the agents, the learning loop — is described in ** apps/api/README-moteur.md**.\n\nEverything (PostgreSQL, Redis, API, web) in a single image. You only need Docker and an Anthropic API key.\n\n```\ndocker run -it --name tanchi \\\n  -p 8080:8080 \\\n  -v tanchi-data:/var/lib/postgresql/data \\\n  tanchihq/tanchi\n```\n\nOn first run with a terminal attached (`-it`\n\n), a short setup wizard asks how you want to use Claude (API key or the `claude`\n\nCLI), for an optional Hunter.io key and optional SMTP, saves everything to the data volume, then starts. Next runs skip the wizard.\n\nPrefer a fully non-interactive start (CI, one-liner)? Pass the key as an env var instead — the wizard is skipped when no terminal is attached:\n\n```\ndocker run -d --name tanchi \\\n  -p 8080:8080 \\\n  -e ANTHROPIC_API_KEY=sk-ant-... \\\n  -v tanchi-data:/var/lib/postgresql/data \\\n  tanchihq/tanchi\n```\n\nTo reconfigure later: `docker exec -it tanchi entrypoint.sh setup`\n\n, then restart the container. If you picked the `claude`\n\nCLI provider, authenticate once with `docker exec -it tanchi claude`\n\n(mount `-v tanchi-claude:/root/.claude`\n\nto keep the session).\n\nOpen [http://localhost:8080](http://localhost:8080). Database migrations run automatically; session secrets are generated and persisted to the data volume on first boot. Because the web app and API are served same-origin behind one port, cookie auth works out of the box over `http://localhost`\n\n.\n\nEmail verification is off by default.Signing up logs you straight into the app: no confirmation email is sent and nothing asks you to click a link. Turn it on only if you have a mailer —`-e REQUIRE_EMAIL_VERIFICATION=true`\n\ntogether with`MAIL_SMTP_HOST`\n\n(or`RESEND_API_KEY`\n\n). With verification on, sign-up still logs you in, but the app shows a \"verify your email\" screen and the API answers 403 everywhere until the link is clicked. The API refuses to boot with verification on and no mailer, since no account could ever be verified.\n\n```\ngit clone git@github.com:tanchihq/tanchi.git\ncd tanchi\ncp .env.example .env\n# edit .env: ANTHROPIC_API_KEY, AUTH_SECRET, ENCRYPTION_KEY, POSTGRES_PASSWORD\ndocker compose up -d --build\n```\n\n- Web:\n[http://localhost:8080](http://localhost:8080) - API:\n[http://localhost:3000](http://localhost:3000)\n\nAuth behind a domain.For a real deployment, serve the web app and API over HTTPS on a shared parent domain (e.g.`app.tanchi.io`\n\n/`api.tanchi.io`\n\n) via a reverse proxy (Caddy, Traefik, nginx) and set`APP_URL`\n\n,`AUTH_BASE_URL`\n\n,`VITE_API_URL`\n\naccordingly in`.env`\n\n.\n\nStack: **Bun** everywhere (runtime, package manager, tests). No npm/pnpm/yarn.\n\n```\nbun install            # install the whole workspace\ncp .env.example .env   # single .env at the repo root, read by both apps\nbun run dev            # api + web in parallel\nbun run dev:api        # api only  (http://localhost:3000)\nbun run dev:web        # web only  (http://localhost:5173)\nbun run typecheck      # typecheck api + web\nbun run test           # api tests\n```\n\nThe API needs PostgreSQL and Redis. Simplest in dev:\n\n```\ndocker compose up -d postgres redis\nbun run migrate\n```\n\nOneBoth apps read the root`.env`\n\nat the repo root.`.env`\n\n(the API via`--env-file`\n\n, the web via Vite`envDir`\n\n). Required keys:`DATABASE_URL`\n\n,`AUTH_SECRET`\n\n(≥32 chars),`ENCRYPTION_KEY`\n\n(≥44 chars,`openssl rand -base64 32`\n\n).\n\nThe API test suite is end-to-end: it drives the real Hono app against a real PostgreSQL and Redis, and mocks only the external boundaries (LLM, sourcing, mailbox, outbound web fetch). It uses a dedicated `tanchi_test`\n\ndatabase so it never touches your dev data — every test truncates all tables between cases.\n\n```\ndocker compose up -d postgres redis\nbun run test            # runs the API suite (creates and migrates tanchi_test itself)\n```\n\nThe suite defaults to `postgres://postgres:postgres@localhost:5432/tanchi_test`\n\nand `redis://localhost:6379`\n\n; override `DATABASE_URL`\n\n/ `REDIS_URL`\n\nto point elsewhere. As a safety net it refuses any database whose name does not contain `test`\n\n, and rewrites the database name to `tanchi_test`\n\nwhen `DATABASE_URL`\n\npoints at a non-test database. Every route of every module is covered, with multi-tenant isolation, auth, input-validation and secret-non-leakage assertions.\n\n```\ntanchi/\n  apps/\n    api/          # Hono + Bun + PostgreSQL backend (raw SQL, no ORM) + BullMQ\n    web/          # React + Vite frontend\n  packages/\n    shared/       # vocabulary and types shared front/back (@app/shared)\n  docker/aio/     # all-in-one image (postgres + redis + api + web)\n  docker-compose.yml\n  .env.example\n  LICENSE         # AGPL-3.0\n```\n\nEach app keeps its own `README.md`\n\nand `CLAUDE.md`\n\n(the backend and frontend conventions differ). The backend follows strict rules: raw SQL without an ORM, errors as values, zero comments, everything immutable — see [apps/api/CLAUDE.md](/tanchihq/tanchi/blob/main/apps/api/CLAUDE.md).\n\nContributions are welcome — see [CONTRIBUTING.md](/tanchihq/tanchi/blob/main/CONTRIBUTING.md). In short: Bun only, follow each app's conventions, `bun run typecheck`\n\nand `bun run test`\n\ngreen before any PR.\n\n[AGPL-3.0](/tanchihq/tanchi/blob/main/LICENSE). You may host and modify Tanchi freely; if you offer a modified version as a network service, you must publish its source.\n\nStatus: early. Built for and battle-tested on our own company's prospecting. Expect rough edges — issues and PRs welcome.", "url": "https://wpnews.pro/news/show-hn-tanchi-open-source-ai-prospecting-agent-that-only-automates-email", "canonical_source": "https://github.com/tanchihq/tanchi", "published_at": "2026-08-12 16:28:30+00:00", "updated_at": "2026-08-12 16:42:04.789219+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-agents", "ai-products", "ai-tools"], "entities": ["Tanchi", "tanchihq", "Anthropic", "Docker", "GitHub", "Hunter.io", "PostgreSQL", "Redis"], "alternates": {"html": "https://wpnews.pro/news/show-hn-tanchi-open-source-ai-prospecting-agent-that-only-automates-email", "markdown": "https://wpnews.pro/news/show-hn-tanchi-open-source-ai-prospecting-agent-that-only-automates-email.md", "text": "https://wpnews.pro/news/show-hn-tanchi-open-source-ai-prospecting-agent-that-only-automates-email.txt", "jsonld": "https://wpnews.pro/news/show-hn-tanchi-open-source-ai-prospecting-agent-that-only-automates-email.jsonld"}}