The Problem

Teams juggling docs, whiteboards, and databases across separate tools like Notion and Miro face context switching and data silos. AFFiNE addresses this by merging documents, infinite canvas, and structured tables into a single local-first workspace, giving users ownership of their data without forcing a cloud dependency.

What This Does

AFFiNE is a monorepo containing the client application and blocksuite/, a block-based editor framework. The core is TypeScript (70 files) with a Rust backend indicated by Cargo.toml and Cargo.lock. The blocksuite/affine/all/src/blocks/ directory shows the block architecture: each content type (paragraph, database, image, code, etc.) has a consistent index.ts / store.ts / view.ts structure, suggesting a clean separation between block logic, state, and rendering.

The repo includes substantial infrastructure for deployment and operations: Helm charts under .github/helm/affine/ for Kubernetes, Docker Compose setups in .docker/dev/ and .docker/selfhost/, and 12 GitHub Actions workflows covering CI, builds, and releases across cloud, desktop, and mobile targets. The project is a fork of toeverything/AFFiNE (71k stars), so this is the same mature codebase.

How To Use It

The repo provides multiple deployment paths, but the README and file structure point to Docker as the primary option.

Setup (Docker self-host): From .docker/selfhost/ cp .env.example .env docker compose up -d

Configuration: The self-host environment variables live in .docker/selfhost/.env.example. For Kubernetes, values are in .github/helm/affine/values.yaml with secrets managed through Helm templates (pg-secret.yaml, redis-secret.yaml).

Running it: The entry point is the frontend app served by the front Helm chart or Docker Compose. The README links to docs.affine.pro/self-host-affine for full instructions. For development, the .devcontainer/ setup and Cargo.toml indicate a Rust + TypeScript build, but no explicit dev commands are documented in the repo files.

Real-World Use

A team wanting full data control deploys AFFiNE via docker compose on their own server. They use it for meeting notes (paragraph blocks), sprint planning (database blocks with task views), and architecture diagrams (surface/edgeless canvas). The local-first nature means each user's data resides on their machine, with optional sync to the self-hosted server for collaboration.

Code Health & Issues

Med - Large monorepo complexity - 200 files with Rust, TypeScript, Helm, and Docker layers. Onboarding requires understanding multiple toolchains. The .yarn/patches/ directory (5 patches) shows dependency hacks that could break on upgrades. Low - Test coverage is narrow - 25 test files exist, but they're concentrated in blocksuite/affine/all/src/tests/ (adapters and database). The Rust backend and deployment infrastructure have no visible tests. Low - CI is heavy - 12 workflows cover cloud, desktop, and mobile releases. This is appropriate for a mature project but adds maintenance burden for a fork. Low - No obvious red flags - CI, license files (LICENSE, LICENSE-MIT), lockfiles, and a security policy (SECURITY.md) are all present. .dockerignore and .gitignore are configured.

The Bottom Line

This is a production-grade workspace application with serious engineering behind it — the block architecture is clean, and the deployment story is thorough. The main trade-off is operational weight: it's a full stack (Rust backend, TypeScript frontend, Kubernetes/Docker infra) better suited to a team wanting a self-hosted Notion/Miro replacement than to someone evaluating a lightweight library. The fork status means you inherit a large, actively-maintained codebase, but also its complexity.