An open-source integration hub for Lark / Feishu โ a Slack-grade ecosystem in one self-hosted binary.
One process supervises every integration and automation, with a React console for status, config, and one-shot actions.
Slack won startups on its ecosystem, not its chat. Thousands of integrations mean every tool a team already lives in shows up where they talk โ a PR, a deploy, a paid invoice, an on-call page, a CRM update.
But Lark's integration catalog is thin, especially outside China โ so choosing it too often means giving up that ecosystem.
Lark Stack closes that gap. A self-hosted, open-source hub that packs the missing Slack-grade integrations into one binary you toggle from a web console. And it's not only bridges: it also runs autonomous in-Lark automations (standup, meeting minutes, โฆ) โ growing the ecosystem deeper, not just wider. The App/Instance contract plus lark-kit make every new app a small, self-contained crate.
The goal: a startup or business can pick Lark and lose nothing โ every external tool bridged in, every recurring workflow run by a built-in automation, all where their team already works.
Apps are pluggable units the console supervises and toggles. Integrations bridge an external system into Lark; Automations run autonomously on a schedule or event. Click a name for its docs.
| App | Kind | What it does |
|---|---|---|
Linear |
Linear webhook โ Lark notification cards + issue link previews | |
GitHub |
GitHub webhook โ PR/issue/CI/security-alert cards + review-request DMs | |
X |
X (Twitter) link previews rendered as Lark cards (preview-only) | |
Minutes |
Auto-transcribe Lark VC recordings (STT) โ digest cards + optional Lark Doc | |
Standup |
Daily standup reminders + on-demand commands (announce/remind/urgent/check) |
The three integrations are served on the console port under /webhooks/<app>/ (e.g. /webhooks/linear/webhook, /webhooks/github/webhook, /webhooks/x/lark/event) โ no per-app ports.
The bridges above are a starting set; the ambition is category coverage that matches what a team expects from Slack's App Directory. Want one sooner โ or one that's not listed? Open an issue or send a PR: a new integration is one self-contained crate.
| Category | Shipped | Next up |
|---|---|---|
| Dev & code | Linear, GitHub | GitLab, Jira, Sentry |
| CI/CD & deploy | GitHub CI | Vercel, Netlify, generic webhook |
| Incident & on-call | โ | PagerDuty, Opsgenie, incident.io |
| Observability | โ | Datadog, Grafana, Alertmanager |
| Revenue & growth | โ | Stripe, HubSpot |
| Support | โ | Zendesk, Intercom |
| Social & feeds | X / Twitter | RSS, status pages |
| Team rituals | Standup | Polls, calendar digests, retros |
| Crate | Purpose |
|---|---|
crates/larkstack-core |
Plug-in contract (App/Instance/Manifest) + control plane (ControlPlane, EventStore) |
crates/larkstack |
Framework host โ per-app supervisor + axum API + embedded React UI |
crates/console |
Thin binary larkstack-console โ registers the bundled apps and runs the host |
crates/lark-kit |
Shared toolkit for the Lark integration apps (sink, inbound server, config, crypto) |
- Dashboard โ per-app state + last-error.
- Live event stream โ every
tracingevent from every subsystem, SSE with?since=/Last-Event-IDbackfill, persisted to SQLite (rolling 10k). - Config editor โ TOML editor in the UI; each app has an
enabledtoggle, and saving hot-restarts only the affected app. - Actions โ one-shot triggers per subsystem (
linear/github: ping/test-lark,x: ping,standup: announce/ensure/remind/urgent/check,minutes: process-meeting). - Auth โ sign in with Lark OAuth;
/api/*needs a session. The console is open until you bind a Lark app under[console], then restricted to theadminsallowlist.
# 1. Build
cd dashboard && pnpm install --frozen-lockfile && pnpm build && cd ..
cargo build -p console --release
# 2. Run (console is open until you set up Lark OAuth from the UI)
CONSOLE_SECRET=$(openssl rand -hex 32) \
LINEAR_WEBHOOK_SECRET=your_secret \
LARK_WEBHOOK_URL=https://open.larksuite.com/open-apis/bot/v2/hook/xxx \
./target/release/larkstack-console
# UI + API + webhooks all on http://localhost:8080 (webhooks at /webhooks/<app>/)
# CONSOLE_SECRET (optional) keeps sessions valid across restarts; a key is
# auto-generated and persisted if unset.Or with Docker:
docker compose up -dSee docs/deploy/console.md for the full env-var reference.
The automation apps keep their own [[bin]] for local/CLI use, reading config from env vars (LARK_*, STANDUP_*, โฆ). The integrations (linear/github/x) are libraries โ run them through the console.
cargo run -p standup # or minutesFor production, deploy the console โ one binary, all apps, toggled from the UI. See docs/deploy/console.md and docs/deploy/railway.md.
MIT or Apache-2.0, at your option.