selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

Deft logo

Self-host Deft

Open-source workspace for humans and AI agents

AlphaOpen SourceAGPL-3.0
Updated6 days ago
LanguageTypescript
Setup difficultyModerate
MobileResponsive
ThemeDark mode
Stars
730
CPU
2 vCPU
RAM
4 GB RAM
Storage
20 GB durable disk
Ports
3000 (Next.js web application), 3001 (API and WebSocket service)
Requires
PostgreSQL 16 with pgvector
Docker
ghcr.io/maneek21/deft
Install with Docker Compose
Deft chat showing source conversation and team contextDeft tasks showing work created from connected conversationDeft knowledge showing durable context ready for people and agents

What is Deft?

Deft is a self-hostable workspace for teams that want conversations, decisions, tasks, and AI agent actions in one connected record. It includes real-time chat with spaces, direct messages, threads, and rich formatting; task boards with table, timeline, and calendar views; a knowledge base for durable concepts and references; native calendar events with read-only ICS feed support; and a dashboard with inbox and notifications. AI is bring-your-own-provider: you can configure OpenAI, Anthropic, OpenRouter, or a local Ollama endpoint. The built-in assistant Defty drafts tasks from chat context, and personal MCP connections let users attach clients like ChatGPT, Claude, Codex, or Cursor to read and write workspace data within their permissions. Agent employees can join channels and use Deft tools under approval policies. The platform is extensible through Modules (domain records and views) and Apps (packaged extensions), starting with a bundled Contacts module. Deft runs via Docker Compose on PostgreSQL 16 with pgvector (no Redis needed), uses email/password with JWT auth, and offers dark/light themes with responsive layouts. Licensed AGPL-3.0-only, currently in early development for technical review and limited pilot use.

Should you self-host Deft?

Deft scores 49/100 on selfhost.directory (how scoring works) and ranks #17 of 30 in Collaboration. It has 730 GitHub stars.

There was no stable release in the past 12 months, so check the repository's recent activity before you rely on it.

Setup is moderate: expect some configuration beyond a single command. An official Docker image is available. It is AGPL-3.0-licensed and written mostly in Typescript.

Its closest alternative on selfhost.directory is penpot (84/100, 61 785 stars). It scores higher overall, so compare the two before you pick. See Deft vs penpot side by side.

Features

  • Agent employeesRequires separately operated compatible runtime
  • Approval Workflows
  • Browser push notificationsOptional, requires VAPID keypair
  • Built-in AI assistant (Defty)Requires configured AI provider
  • Calendar
  • Dashboard and notifications
  • Knowledge Base
  • Object Storage SupportOptional
  • Personal MCP access
  • Provider-neutral AI configuration
  • Real-time Chat
  • Task Management

Deft README

How to install Deft

Install Deft with Docker Compose

Environment variables
POSTGRES_PASSWORD, JWT_SECRET, JWT_REFRESH_SECRET, ENCRYPTION_KEY, DEFT_IMAGE, NEXT_PUBLIC_APP_URL, NEXT_PUBLIC_API_URL, NEXT_PUBLIC_WS_URL, OPENAI_API_KEY, OPENROUTER_API_KEY, ANTHROPIC_API_KEY, OLLAMA_URL, R2_ENDPOINT, R2_ACCESS_KEY, R2_SECRET_KEY, R2_BUCKET, VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_SUBJECT, METRICS_SCRAPE_TOKEN, DEFT_APPS_ENABLED, NEXT_PUBLIC_FEATURE_APPS, DEFT_APP_RUNS_ENABLED, DEFT_APP_RUN_KEYRINGS, DEFT_MCP_PRIVATE_ORIGIN_ALLOWLIST, DEFT_MCP_ENABLE_UNSAFE_STDIO, MCP_STDIO_ALLOWED_COMMANDS

Download docker-compose.yml, compose.prod.yml, compose.release.yml, and default.env.example from the release into a new directory. In Bash (macOS, Linux, or Git Bash on Windows):

cp default.env.example .env
openssl rand -hex 32  # POSTGRES_PASSWORD
openssl rand -hex 32  # JWT_SECRET
openssl rand -hex 32  # JWT_REFRESH_SECRET
openssl rand -hex 32  # ENCRYPTION_KEY

Paste each independently generated secret into its corresponding .env variable. All four are required for Docker, including local evaluation. Keep the encryption key with your backups. Leave AI keys empty and OLLAMA_URL commented unless you intend to configure a provider.

Add this pinned release image to .env:

DEFT_IMAGE=ghcr.io/maneek21/deft@sha256:665a66083adaaf9db876fa815203c854509c5fdde72b89a0db212fe2e07d398b

Then run, from that directory:

docker compose -f docker-compose.yml -f compose.prod.yml -f compose.release.yml config --quiet
docker compose -f docker-compose.yml -f compose.prod.yml -f compose.release.yml pull
docker compose -f docker-compose.yml -f compose.prod.yml -f compose.release.yml up -d postgres
docker compose -f docker-compose.yml -f compose.prod.yml -f compose.release.yml run --rm init
docker compose -f docker-compose.yml -f compose.prod.yml -f compose.release.yml up -d deft
docker compose -f docker-compose.yml -f compose.prod.yml -f compose.release.yml run --rm doctor
docker compose -f docker-compose.yml -f compose.prod.yml -f compose.release.yml run --rm smoke

Open http://localhost:3000 and create the first account, which owns the workspace. Subsequent users join by invitation.

Uses prebuilt release images from GHCR. Targets Linux amd64. Requires Docker Desktop or Docker Engine with Compose v2.

How to configure Deft

  • ANTHROPIC_API_KEYOptional fallback when Anthropic models are selected.

    Optional fallback when Anthropic models are selected.

  • API_PORT3001Internal port the API service listens on inside the container.

    Internal port the API service listens on inside the container.

  • DATABASE_URLConnection string for a managed or separately hosted Postgres with pgvector available. Only required for external Postgres.

    Connection string for a managed or separately hosted Postgres with pgvector available. Only required for external Postgres.

  • DEEPGRAM_API_KEYOptional Deepgram transcription fallback.

    Optional Deepgram transcription fallback.

  • DEFT_API_PORT3001Host port for the API and WebSocket service.

    Host port for the API and WebSocket service.

  • DEFT_APP_RUN_KEYRINGSJSON keyring for governed App Runs encryption, signing, and fingerprinting.

    JSON keyring for governed App Runs encryption, signing, and fingerprinting.

  • DEFT_APP_RUNS_ENABLEDfalseEnable governed App Runs engine.

    Enable governed App Runs engine.

    values: true,false

  • DEFT_APPS_ENABLEDfalseEnable Apps feature flags on the API.

    Enable Apps feature flags on the API.

    values: true,false

  • DEFT_MCP_ENABLE_UNSAFE_STDIOfalseHost-level opt-in for stdio MCP servers. Stdio can execute code on the Deft host; leave it disabled unless that is intentional.

    Host-level opt-in for stdio MCP servers. Stdio can execute code on the Deft host; leave it disabled unless that is intentional.

    values: true,false

  • DEFT_MCP_PRIVATE_ORIGIN_ALLOWLISTComma-separated exact origins that a self-hosted connector may reach, for example http://127.0.0.1:9000. No wildcards.

    Comma-separated exact origins that a self-hosted connector may reach, for example http://127.0.0.1:9000. No wildcards.

  • DEFT_WEB_PORT3000Host port for the Next.js web service.

    Host port for the Next.js web service.

  • ENCRYPTION_KEYEncrypts supported workspace secrets at rest. Use openssl rand -hex 32.

    Encrypts supported workspace secrets at rest. Use openssl rand -hex 32.

  • JWT_REFRESH_SECRETSigns refresh tokens. Must be different from JWT_SECRET. Use openssl rand -hex 32.

    Signs refresh tokens. Must be different from JWT_SECRET. Use openssl rand -hex 32.

  • JWT_SECRETSigns short-lived access tokens. Use openssl rand -hex 32.

    Signs short-lived access tokens. Use openssl rand -hex 32.

  • MCP_STDIO_ALLOWED_COMMANDSComma-separated exact command names allowed for stdio. Both this list and DEFT_MCP_ENABLE_UNSAFE_STDIO=true are required.

    Comma-separated exact command names allowed for stdio. Both this list and DEFT_MCP_ENABLE_UNSAFE_STDIO=true are required.

  • METRICS_SCRAPE_TOKENBearer token for GET /api/metrics and detailed GET /health/queue telemetry. Leave it unset to disable both detailed endpoints.

    Bearer token for GET /api/metrics and detailed GET /health/queue telemetry. Leave it unset to disable both detailed endpoints.

  • NEXT_PUBLIC_API_URLhttp://localhost:3001Public browser origin for REST API calls.

    Public browser origin for REST API calls.

  • NEXT_PUBLIC_APP_URLhttp://localhost:3000Public browser origin for the web app.

    Public browser origin for the web app.

  • NEXT_PUBLIC_FEATURE_APPSfalseBuild-time switch for experimental browser Apps features.

    Build-time switch for experimental browser Apps features.

    values: true,false

  • NEXT_PUBLIC_WS_URLhttp://localhost:3001Public browser origin for Socket.io. Usually the same as the API URL.

    Public browser origin for Socket.io. Usually the same as the API URL.

  • OLLAMA_URLOptional local Ollama endpoint; set only when running and reachable by the API container, for example http://host.docker.internal:11434 on Docker Desktop.

    Optional local Ollama endpoint; set only when running and reachable by the API container, for example http://host.docker.internal:11434 on Docker Desktop.

  • OPENAI_API_KEYOptional fallback for OpenAI-compatible chat, embeddings, or transcription when selected.

    Optional fallback for OpenAI-compatible chat, embeddings, or transcription when selected.

  • OPENROUTER_API_KEYOptional fallback for OpenRouter model routing.

    Optional fallback for OpenRouter model routing.

  • POSTGRES_PASSWORDPassword for the bundled Postgres service. Compose refuses to start when this is unset.

    Password for the bundled Postgres service. Compose refuses to start when this is unset.

  • R2_ACCESS_KEYObject storage access key.

    Object storage access key.

  • R2_BUCKETBucket name for uploads.

    Bucket name for uploads.

  • R2_ENDPOINTCloudflare R2 or compatible endpoint for object storage.

    Cloudflare R2 or compatible endpoint for object storage.

  • R2_SECRET_KEYObject storage secret key.

    Object storage secret key.

  • TRANSCRIPTION_PROVIDEROne of local, openai, or deepgram.

    One of local, openai, or deepgram.

    values: local,openai,deepgram

  • VAPID_PRIVATE_KEYPrivate signing key. Store it as a secret and keep it paired with the public key.

    Private signing key. Store it as a secret and keep it paired with the public key.

  • VAPID_PUBLIC_KEYPublic browser-push key returned to signed-in clients.

    Public browser-push key returned to signed-in clients.

  • VAPID_SUBJECTOperator contact URI supplied to push services, commonly mailto:admin@example.com.

    Operator contact URI supplied to push services, commonly mailto:admin@example.com.

  • WHISPER_URLOptional local Whisper ASR endpoint when using local transcription.

    Optional local Whisper ASR endpoint when using local transcription.

More in Task Management

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…