An open API service indexing awesome lists of open source software.

https://github.com/veloxico/wikso

Open-source, self-hosted alternative to Confluence — real-time collaboration, page trees, full-text search, version history
https://github.com/veloxico/wikso

collaborative-editing confluence docker knowledge-base nestjs nextjs self-hosted tiptap typescript wiki

Last synced: 3 months ago
JSON representation

Open-source, self-hosted alternative to Confluence — real-time collaboration, page trees, full-text search, version history

Awesome Lists containing this project

README

          


Wikso logo

Wikso


Open-source, self-hosted alternative to Confluence.

Real-time collaborative editing, page trees, spaces, full-text search, version history, AI assistant, and more.


GitHub Release
Docker Pulls BE
Docker Pulls FE
License
GitHub Sponsors
Ko-fi
Crypto Donate

> **Live Demo:** [wikso.veloxico.com](https://wikso.veloxico.com)

## Tech Stack

| Layer | Technology |
|-------|-----------|
| **Frontend** | Next.js 16, React 19, TailwindCSS 4, shadcn/ui, TipTap, Yjs |
| **Backend** | NestJS 11, Prisma 6, PostgreSQL 16 |
| **Real-time** | Hocuspocus (Yjs WebSocket server) |
| **Search** | Meilisearch |
| **File Storage** | S3 / MinIO |
| **Cache & Queues** | Redis |
| **AI** | Anthropic Claude, OpenAI, Google Gemini, Ollama — API key or subscription OAuth |
| **Auth** | JWT + Refresh tokens, Google OAuth, GitHub OAuth, SAML SSO |
| **Monorepo** | pnpm workspaces + Turborepo |
| **Containerization** | Docker Compose |

## Features

### Content & Editing
- **Spaces & Page Trees** — organize content in workspaces with nested page hierarchies
- **Real-time Collaboration** — multiple users can edit the same page simultaneously (Yjs + Hocuspocus)
- **Rich Text Editor** — TipTap-based editor with tables, code blocks, callouts, images, mentions, task lists, Mermaid diagrams, and Excalidraw drawings
- **Version History** — automatic snapshots every 5 minutes + manual save, with diff view and one-click restore
- **Full-text Search** — powered by Meilisearch with instant results and command palette (Ctrl+K)
- **Favorites & Recent Pages** — quick access to your most-used content
- **Comments & Reactions** — threaded discussions on any page with emoji reactions
- **Drag & Drop** — reorder pages in the tree via drag and drop
- **Templates** — create pages from predefined templates
- **Page Export** — export pages to PDF / Markdown
- **File Attachments** — upload and attach files to pages (S3 / MinIO), configurable size limit (up to 100 MB)
- **Confluence Import** — migrate from Confluence Cloud with a single ZIP upload (Beta)

### AI Assistant
- **AI Text Transformations** — select text in the editor and apply AI operations: expand, summarize, fix grammar, change tone
- **Custom Prompts** — write your own instruction to transform selected text with AI
- **Streaming Responses** — real-time SSE streaming shows AI output as it generates
- **7 AI Providers** — Claude (Subscription), OpenAI (Subscription), Gemini (Subscription), Anthropic (API Key), OpenAI (API Key), Google Gemini (API Key), Ollama (Self-hosted)
- **Subscription-based Auth** — connect your Claude, ChatGPT, or Google account via OAuth — no API key needed
- **Admin AI Configuration** — enable/disable AI, switch providers, test connections, disconnect accounts

> **Note:** Subscription-based providers (Claude, OpenAI, Gemini) use unofficial OAuth flows and may be subject to rate limits or changes by the vendor. For production use, API key-based providers are recommended.

### Admin Panel
- **Dashboard** — system stats with 30-day activity charts (pages, views, users)
- **User Management** — create, invite, suspend, delete users; bulk operations; last login & IP tracking
- **Group Management** — organize users into groups with member management
- **Space Administration** — search, filter by type, edit properties, transfer ownership
- **Trash** — restore or permanently delete pages; bulk operations; filter by space
- **Audit Log** — filterable activity log with CSV export
- **Security & Access** — registration control, domain whitelist, email verification, password policy
- **Auth Providers** — Google OAuth, GitHub OAuth, SAML SSO configuration status
- **Email Configuration** — SMTP setup with provider presets and test email
- **Webhooks** — full CRUD: create, edit, delete, enable/disable webhook integrations
- **System Health** — live service status, uptime, memory usage, Node.js version
- **AI Provider Settings** — configure AI providers (API keys, OAuth connections, models), test connections, set active provider
- **Confluence Import** — upload Confluence Cloud XML export ZIP with real-time progress tracking (Beta)

### Platform
- **Multi-language** — UI available in English, Russian, Belarusian, Spanish, Spanish (AR), Portuguese, Portuguese (BR), Polish, Ukrainian, Chinese, Turkish
- **Dark Mode** — full dark theme support with system preference detection
- **Responsive** — works on desktop, tablet, and mobile
- **SSO** — Google, GitHub, SAML authentication
- **Notifications** — in-app notifications for page changes
- **Avatar Upload** — profile photo with built-in image cropping
- **Keyboard Shortcuts** — editor shortcuts, command palette, global navigation
- **Multi-arch Docker** — images available for amd64 and arm64

## Quick Start (Docker)

The fastest way to run Wikso — a single command, no build required. Pre-built images are pulled from Docker Hub. Works on **Linux**, **macOS**, and **Windows (WSL2)**.

### Requirements

- [**Docker**](https://docs.docker.com/get-docker/) >= 20.10 and **Docker Compose** v2 (`docker compose` — no hyphen)

### Launch

```bash
git clone https://github.com/veloxico/wikso.git && cd wikso
docker compose up -d
```

That's it. Docker Compose pulls pre-built images from Docker Hub (`veloxico/wikso-be`, `veloxico/wikso-fe`) and starts all 6 services with health-check ordering. No local build, no Node.js, no pnpm required.

### Docker Hub Images

| Image | Architectures | Description |
|-------|---------------|-------------|
| [`veloxico/wikso-be`](https://hub.docker.com/r/veloxico/wikso-be) | amd64, arm64 | Backend — NestJS API + Hocuspocus WS |
| [`veloxico/wikso-fe`](https://hub.docker.com/r/veloxico/wikso-fe) | amd64, arm64 | Frontend — Next.js application |

### Service URLs

| Service | URL |
|---------|-----|
| **Frontend** | [http://localhost:3001](http://localhost:3001) |
| **Backend API** | [http://localhost:3000/api/v1](http://localhost:3000/api/v1) |
| **MinIO Console** | [http://localhost:9001](http://localhost:9001) |
| **Meilisearch** | [http://localhost:7700](http://localhost:7700) |

### What happens automatically

1. **PostgreSQL, Redis, MinIO, Meilisearch** start and pass health checks
2. **Backend** image is pulled from Docker Hub (no local build)
3. **Backend** runs Prisma migrations (`prisma migrate deploy`) on first boot
4. **Backend** auto-creates the MinIO S3 bucket (`wikso-uploads`) if it doesn't exist
5. **Frontend** image is pulled from Docker Hub and starts after the backend is healthy
6. **Setup Wizard** — on first launch, open the frontend URL and you'll be guided through creating your admin account. No default credentials or manual seeding required.

### Useful commands

```bash
docker compose up -d # Start all services (pulls images on first run)
docker compose down # Stop all services (data is preserved in volumes)
docker compose down -v # Stop and delete all data (clean slate)
docker compose pull # Pull latest images from Docker Hub
docker compose logs backend # View backend logs
docker compose logs frontend # View frontend logs
```

## Local Development

### Prerequisites

- **Node.js** >= 20
- **pnpm** >= 9.15 (`corepack enable && corepack prepare pnpm@9.15.0 --activate`)
- **Docker** (for PostgreSQL, Redis, MinIO, Meilisearch)

### 1. Start infrastructure

```bash
# Start only the databases / services (without app containers)
docker compose up postgres redis minio meilisearch -d
```

### 2. Install dependencies

```bash
pnpm install
```

### 3. Configure environment

```bash
# Backend
cp apps/backend/.env.example apps/backend/.env
# Edit apps/backend/.env — update DATABASE_URL host from "postgres" to "localhost":
# DATABASE_URL="postgresql://postgres:password@localhost:5432/wikso"
# Also update S3_ENDPOINT, REDIS_HOST, MEILISEARCH_HOST to use localhost

# Frontend
cp apps/frontend/.env.example apps/frontend/.env.local
# Usually no changes needed — defaults point to localhost
```

### 4. Setup database

```bash
cd apps/backend
npx prisma db push # Apply schema to database
npx prisma generate # Generate Prisma client
cd ../..
```

### 5. Run development servers

```bash
# Start both frontend and backend in parallel
pnpm dev

# Or start them separately:
pnpm dev:backend # Backend on http://localhost:3000 + Hocuspocus on ws://localhost:1234
pnpm dev:frontend # Frontend on http://localhost:3001
```

### Building & publishing Docker images

```bash
# Build locally
docker compose build

# Tag and push to Docker Hub
docker tag wikso-backend veloxico/wikso-be:latest
docker tag wikso-frontend veloxico/wikso-fe:latest
docker push veloxico/wikso-be:latest
docker push veloxico/wikso-fe:latest
```

## Environment Variables

### Backend (`apps/backend/.env`)

| Variable | Description | Default |
|----------|-------------|---------|
| `PORT` | HTTP server port | `3000` |
| `DATABASE_URL` | PostgreSQL connection string | — |
| `JWT_SECRET` | Secret for access tokens | — |
| `JWT_REFRESH_SECRET` | Secret for refresh tokens | — |
| `JWT_EXPIRES_IN` | Access token TTL | `15m` |
| `JWT_REFRESH_EXPIRES_IN` | Refresh token TTL | `7d` |
| `EMAIL_VERIFICATION_REQUIRED` | Require email verification | `false` |
| `REDIS_HOST` | Redis hostname | `redis` |
| `REDIS_PORT` | Redis port | `6379` |
| `S3_ENDPOINT` | S3/MinIO endpoint | `http://minio:9000` |
| `S3_ACCESS_KEY` | S3 access key | `minioadmin` |
| `S3_SECRET_KEY` | S3 secret key | `minioadmin` |
| `S3_BUCKET` | S3 bucket name | `wikso-uploads` |
| `MEILISEARCH_HOST` | Meilisearch URL | `http://meilisearch:7700` |
| `MEILISEARCH_API_KEY` | Meilisearch API key | `masterKey` |
| `HOCUSPOCUS_PORT` | WebSocket server port | `1234` |
| `GOOGLE_CLIENT_ID` | Google OAuth client ID | — |
| `GITHUB_CLIENT_ID` | GitHub OAuth client ID | — |
| `SAML_ENTRY_POINT` | SAML IdP entry point | — |
| `ENCRYPTION_KEY` | Key for encrypting stored credentials (32+ chars) | falls back to `JWT_SECRET` |

### Frontend (`apps/frontend/.env.local`)

| Variable | Description | Default |
|----------|-------------|---------|
| `NEXT_PUBLIC_API_URL` | Backend API URL (browser) | `http://localhost:3000` |
| `NEXT_PUBLIC_WS_URL` | Hocuspocus WebSocket URL | `ws://localhost:1234` |

## Architecture

```mermaid
graph LR
FE["🖥 Frontend
Next.js 16 · React 19
TailwindCSS 4 · shadcn/ui"]
BE["⚙ Backend
NestJS 11 · Prisma 6
Hocuspocus · Yjs"]

FE --> BE

BE --> PG["🐘 PostgreSQL 16"]
BE --> RD["⚡ Redis 7"]
BE --> MS["🔍 Meilisearch"]
BE --> S3["📦 MinIO / S3"]
BE --> AI["🤖 AI Providers
Claude · OpenAI · Gemini · Ollama"]
```

## Project Structure

```
wikso/
apps/
backend/ # NestJS API + Hocuspocus WS server
src/
auth/ # JWT, OAuth, SAML authentication
ai/ # AI providers, text transformations, SSE streaming
admin/ # Admin panel APIs (users, spaces, AI settings, trash, audit)
pages/ # Pages CRUD, versions, tree
spaces/ # Spaces management
comments/ # Threaded comments
search/ # Meilisearch integration
notifications/ # In-app notifications
webhooks/ # External webhook events
users/ # User profiles, avatars
hocuspocus/ # Real-time collaboration server
prisma/ # Database schema & migrations
frontend/ # Next.js application
src/
app/ # App router pages & layouts
components/ # UI & feature components
ui/ # shadcn/ui primitives
features/ # Business logic components
editor/ # AI menu, editor extensions
hooks/ # Custom React hooks
store/ # Zustand stores (auth, sidebar, language)
i18n/ # Translations (en, ru, be, es, esAR, pt, ptBR, pl, uk, zh, tr)
lib/ # Utilities, API client
docker-compose.yml # Full-stack containerized setup
package.json # Monorepo root (Turborepo)
```

## Available Scripts

```bash
pnpm dev # Start all apps in dev mode
pnpm build # Build all apps
pnpm lint # Lint all apps
pnpm test # Run all tests
pnpm dev:backend # Start only backend
pnpm dev:frontend # Start only frontend
pnpm format # Format code with Prettier
```

## Support the Project

If you find Wikso useful, consider supporting its development:

[![GitHub Sponsors](https://img.shields.io/badge/GitHub_Sponsors-Support-ea4aaa?style=for-the-badge&logo=githubsponsors)](https://github.com/sponsors/veloxico)
[![Ko-fi](https://img.shields.io/badge/Ko--fi-Buy_me_a_coffee-ff5e5b?style=for-the-badge&logo=ko-fi)](https://ko-fi.com/alexkoss)

| Network | Address |
|---------|---------|
| **BTC** | `bc1qt5zu44m43f2ca07tedwgund0dxhtpcqkl92afz` |
| **ETH** | `0xaAbcc0B714742525BB97d0594bc4d1DD90Ef5601` |
| **USDT (TRC-20)** | `TAhDQw64uCDdCXKLUmfyjAe1comFPVDj99` |
| **USDT (ERC-20)** | `0xaAbcc0B714742525BB97d0594bc4d1DD90Ef5601` |
| **TON** | `UQA5Z9Lasm_Ke61wYLSuXy7wQnrX7Pefd4RNbDyzBWY9VFjj` |

## License

Apache License 2.0 — see [LICENSE](LICENSE) for details.

© 2025-2026 Aleks Koss / Veloxico