MCPcopy Index your code
hub / github.com/canvasxai/sketch

github.com/canvasxai/sketch @v0.46.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.46.0 ↗ · + Follow
6,986 symbols 19,147 edges 986 files 298 documented · 4% 1 cross-repo links updated 1d agov0.46.0 · 2026-07-07★ 17930 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README
<img alt="Sketch" src="https://raw.githubusercontent.com/canvasxai/sketch/main/assets/sketch-dark.svg" width="200" />

One AI assistant for your entire team. Deploy once. Show up everywhere.

Apache 2.0 License version Node 24+ CI PRs Welcome Discord Built with Claude Agent SDK


The problem nobody talks about

AI assistants are incredible — until you try to share one with your team.

Right now, every person on your team sets up their own AI. Their own API keys. Their own context. Their own memory. Nobody's assistant knows what the company actually does. Nobody's assistant remembers the onboarding doc you uploaded last week. And when someone leaves, their carefully-built context walks out the door with them.

We kept watching teams duct-tape personal AI tools into workflows that clearly needed a shared brain. Founders answering the same customer question their assistant already answered for a teammate. Engineers re-explaining the codebase to a fresh Claude window every morning. Ops people copy-pasting the same SOPs into chat because the bot doesn't "know" yet.

It felt broken.

What Sketch actually is

Sketch is an open-source, self-hostable AI assistant built for teams. One deployment, every team member, any channel they already use.

Think of it as giving your entire org a shared AI teammate — one that remembers, learns, and works across Slack and WhatsApp — while still keeping everyone's private stuff private.

Here's what makes it different from "just another chatbot":

  • Isolated workspaces — each person gets their own files, memory, and sessions. Your stuff doesn't leak into mine.
  • Shared org knowledge — upload a doc once and everyone's assistant knows it. No more "hey can you send me that PDF again?"
  • Multi-channel, same brain — message it on Slack, pick up the thread on WhatsApp. It's the same assistant, same memory, wherever you are.
  • Per-user tool auth — each person connects their own integrations (Gmail, GitHub, etc.). The assistant acts on your behalf, not the org's.
  • Real memory — personal, channel, and org-level memory layers. It actually remembers things between conversations.
  • Skills system — deploy org-wide skills (like ICP discovery or CRM tools) that every team member gets automatically.
  • Genuinely self-hostable — a single Node.js process and SQLite. No Kubernetes thesis required.

Inspired by OpenClaw — a brilliant personal AI assistant. Sketch takes its multi-channel, local-first approach and adds the missing piece: a multi-user org layer.

Quick Start

Requires Node.js 24+ and pnpm. That's it.

git clone https://github.com/canvasxai/sketch.git
cd sketch
pnpm install
cp .env.example .env
pnpm dev

Open http://localhost:3000 — the onboarding wizard walks you through Slack/WhatsApp setup, API keys, and your first conversation.

How it works

  Slack / WhatsApp
        |
    Gateway (Bolt / Baileys)
        |
    Message Queue (per-channel, sequential)
        |
    Agent Runner
        |
    Claude Agent SDK
        |
    Workspace (scoped files, tools, memory)

Every user gets a sandboxed workspace at data/workspaces/{user_id}/. Every tool call passes through canUseTool — a runtime validator that checks file paths and permissions before anything executes. The agent literally cannot escape its sandbox.

Channels share workspaces too — @mention Sketch in a Slack channel and the whole channel gets a shared context with per-thread sessions. No conversation soup.

Channels

Channel Status
Slack Stable — DMs, @mentions in channels, threaded conversations
WhatsApp Stable — DMs and group chats, media support

Both channels support file attachments, images (with vision), and file sharing back to chat.

Self-Hosting

Sketch runs as a single Node.js process — API server, web UI, and agent runner all in one. No separate web server, no external database, no Docker Compose manifesto.

SQLite by default (Postgres when you outgrow it). Throw it on a $5 VPS and you're done.

See the full Self-Hosting Guide for production deployment with systemd and Caddy.

Tech Stack

What How
Runtime Node.js 24, TypeScript
Agent brain Claude Agent SDK
Database SQLite (Kysely query builder)
HTTP Hono
Frontend React, Vite
Build tsdown, pnpm monorepo
Lint + Format Biome
Tests Vitest (800+ tests)

Project Structure

sketch/
  packages/
    server/src/
      slack/          -> Bolt adapter (Socket Mode, DMs, channels, threads)
      whatsapp/       -> Baileys adapter (QR pairing, media, groups)
      agent/          -> Claude Agent SDK runner, workspace isolation, prompts
      db/             -> Kysely + SQLite, migrations, repositories
      http.ts         -> Hono app with API routes
      queue.ts        -> Per-channel sequential message queue
    web/src/          -> React admin UI (onboarding, channels, settings)
    shared/src/       -> Shared types
  data/               -> Runtime data (workspaces, SQLite DB) — gitignored

Contributing

We'd genuinely love your help. Whether it's a new channel adapter, a skill, a bug fix, or telling us our error messages are confusing — all of it matters.

Join us on Discord to chat with the team, ask questions, or just hang out.

See CONTRIBUTING.md for dev setup, code style, and PR guidelines.

License

Apache License 2.0 — see LICENSE.

Extension points exported contracts — how you extend this code

SyncSchedulerHandle (Interface)
(no doc) [7 implementers]
packages/server/src/connectors/sync.ts
LogoProps (Interface)
* Brand SVG logos for connector integrations. * * All icons use viewBox="0 0 24 24" and fill="currentColor" so they *
packages/web/src/components/connector-logos.tsx
McpServerRecord (Interface)
(no doc)
packages/shared/src/mcp-servers.ts
TabButtonProps (Interface)
(no doc)
packages/ui/src/components/ui/tab-button.tsx
ConnectorCredentialProvider (Interface)
(no doc) [5 implementers]
packages/server/src/connectors/credential-providers.ts
Register (Interface)
(no doc)
packages/web/src/router.ts
IntegrationApp (Interface)
(no doc)
packages/shared/src/mcp-servers.ts
ThemeContext (Interface)
(no doc)
packages/ui/src/hooks/use-theme.tsx

Core symbols most depended-on inside this repo

get
called by 1128
packages/server/src/connectors/name-normalize.ts
request
called by 986
packages/server/src/connectors/otter.ts
create
called by 525
packages/server/src/db/repositories/users.ts
createTestLogger
called by 517
packages/server/src/test-utils.ts
createApp
called by 366
packages/server/src/http.ts
add
called by 334
packages/server/src/connectors/name-normalize.ts
destroy
called by 298
packages/server/src/test-pglite-dialect.ts
createTestDb
called by 279
packages/server/src/test-utils.ts

Shape

Function 5,464
Interface 979
Method 399
Class 144

Languages

TypeScript100%

Modules by API surface

packages/web/src/lib/api.ts268 symbols
packages/server/src/agents/service.ts124 symbols
packages/server/src/api/web-chat.ts89 symbols
packages/web/src/components/sketch/chat-thread.tsx84 symbols
packages/server/src/db/schema.ts79 symbols
packages/server/src/connectors/otter.ts72 symbols
packages/server/src/connectors/google-calendar.ts66 symbols
packages/web/src/routes/chat.tsx64 symbols
packages/server/src/db/repositories/entities.ts64 symbols
packages/web/src/routes/scheduled-tasks.tsx61 symbols
packages/server/src/connectors/zoho-crm.ts60 symbols
packages/server/src/whatsapp/bot.ts58 symbols

Used by 1 indexed graphs manifest dependencies, hub-wide

Datastores touched

sketchDatabase · 1 repos

For agents

$ claude mcp add sketch \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page