Early Development - APIs, schemas, and features may change without notice. Use at your own risk.
A self-hosted productivity suite built with Django. Files, chat, email, calendar, AI assistants, and more - in a single platform you control.
From a Raspberry Pi to a Kubernetes cluster. One app, any scale.
Upload, organize, and preview files with drag & drop, folder nesting, and built-in viewers for PDF, Markdown, images, video, audio, and code. Includes favorites, trash with retention, thumbnails, mosaic view, file sharing, locking, comments, folder downloads as ZIP, and WebDAV access.
Direct and group messaging with real-time updates (SSE), emoji reactions, file attachments, message search, pinning, editing, read receipts, rich Markdown rendering with syntax highlighting, and AI bot integration.
Day, week, month, and agenda views. Recurring events, participants, RSVP, calendar subscriptions, scheduling polls, and iCalendar/iTIP support for email-based invitations.
IMAP/SMTP client with OAuth2 (Google, Microsoft), auto-discovery, compose with reply/forward, hierarchical folders, drag & drop, batch operations, contact autocomplete, and AI-powered summarization and reply suggestions.
Markdown editor with journal mode, folders, tags, favorites, and full-text search. Organize notes by folder or group, with a three-panel layout for quick navigation.
Kanban boards for tracking tasks, solo or as a team. Drag & drop cards between columns, prioritize with labels, priorities, due dates, and assignees, and park future work in a dedicated backlog view. Every user gets a personal board out of the box, and group projects support member roles and archiving.
An address book for the people around your data. Personal contacts and shared group address books, lists, contact photos, workspace account linking, and vCard import/export to move contacts to and from a phone, Google Contacts, or Nextcloud.
A timeline of the photos and videos you already keep in Files, ordered by the day they were taken. Albums shared with your groups or through a link, a map of where each photo was taken, search by description and similar photos, slideshows, phone backup over WebDAV, and opt-in face detection and grouping.
Screenshot photos licensed CC BY 2.0 by their authors: see the credits.
Configurable chat bots with system prompts, vision, function calling, extended thinking, image generation, and bot memory. Works with OpenAI API or any compatible provider (Ollama, LM Studio, etc.).
Vault (preview)
An end-to-end encrypted password manager. Names, logins, passwords and notes are sealed in the browser and the server never sees a key: it stores ciphertext, serves it back, and can neither read an entry nor forge one, because every record carries a signature made by your account. Unlocking derives the keys from your master password and a recovery key with Argon2id, and they leave memory again after the idle delay you choose, five minutes by default. Browse by folder or tag, copy a password behind a countdown that takes it back off the clipboard, and see immediately when a record no longer matches what you signed.
- Notifications - In-app + Web Push (VAPID), priority levels, read tracking
- Dashboard - Storage stats, recent files, conversation and event insights
- Unified search - Cross-module command palette (Ctrl+K) with extensible providers
- User profiles - Avatar upload, presence/status, per-module settings, 12 themes
- Shareable links - Password-protected file links with expiration
| Layer | Technology |
|---|---|
| Backend | Django 6.0, Django REST Framework |
| Frontend | Alpine.js, Tailwind CSS, DaisyUI, Lucide Icons |
| Real-time | Server-Sent Events (SSE) |
| Database | SQLite (WAL mode) or PostgreSQL |
| Cache / Broker | Redis (optional, for caching, sessions, and Celery tasks) |
| Task Queue | Celery with Redis broker, Celery Beat for periodic tasks |
| Server | Gunicorn with gevent workers, WhiteNoise, Brotli compression |
| AI | OpenAI API (or any compatible provider) |
| Imaging | Pillow, CairoSVG (thumbnail generation) |
| Monitoring | Prometheus metrics, Kubernetes health probes |
| Tooling | uv, Docker, drf-spectacular (OpenAPI) |
At its core, Workspace is Django + SQLite. One Docker container, done. No database servers to manage, no infrastructure lock-in.
The same codebase can switch to PostgreSQL for high-concurrency workloads. The architecture supports multiple deployment strategies:
- Personal - Run on a VPS with SQLite, or any PaaS with persistent volumes
- Teams - Docker Compose, one instance per team with isolated data
- Enterprise - Kubernetes with PostgreSQL, SSO/LDAP, dedicated infrastructure
Instead of complex multi-tenancy with tenant_id columns, Workspace uses instance-per-tenant: true data isolation, independent scaling, and simplified security.
git clone https://github.com/JaaJSoft/workspace.git
cd workspace
uv sync # Install dependencies
uv run python manage.py migrate # Run migrations
uv run python manage.py createsuperuser # Create admin account
uv run python manage.py runserver # Start dev serverVisit http://localhost:8000. No webpack, no npm, no build step.
- Python 3.14.1+ (a final release - a 3.14 release candidate is refused, see
requires-python) - uv (recommended package manager)
- Redis (optional, for caching and Celery)
docker run -d -p 8000:8000 \
-v workspace-db:/app/db \
-v workspace-files:/app/files \
-e SECRET_KEY=your-secret-key-here \
-e ALLOWED_HOSTS=yourdomain.com \
ghcr.io/jaajsoft/workspace:mainThe image is published for linux/amd64 and linux/arm64, so the same tag works on an x86 server, an Apple Silicon Mac and a Raspberry Pi 4/5. The Pi needs a 64-bit OS: there is no 32-bit (linux/arm/v7) build.
Prefer building the image yourself? Run docker build -t workspace . and use the workspace tag above.
Add AI by setting AI_API_KEY and AI_MODEL. Use a self-hosted LLM by pointing AI_BASE_URL to Ollama or LM Studio.
See docs/deployments/ for Docker Compose and Kubernetes examples.
The most common variables are listed below. For the full, annotated list - including AI model tiers, web search (SearXNG), OAuth2 mail providers, Web Push (VAPID), and chat call (STUN/TURN) settings - see .env.example.
| Variable | Description | Default |
|---|---|---|
SECRET_KEY |
Django secret key | required in production |
DEBUG |
Enable debug mode | True |
ALLOWED_HOSTS |
Comma-separated allowed hosts | * |
CSRF_TRUSTED_ORIGINS |
Comma-separated trusted CSRF origins | (none) |
DATABASE_URL |
Database connection string | sqlite:///db.sqlite3 |
DB_POOL_MAX_SIZE |
PostgreSQL connections per process (sizing) | 4 |
REDIS_URL |
Redis URL for cache and sessions | (none, in-memory fallback) |
PROCESS_TYPE |
What the image runs: web, worker or beat |
web |
GUNICORN_WORKERS |
Gunicorn worker count (Docker) | 2 |
CELERY_WORKER_CONCURRENCY |
Celery worker processes | (one per CPU the container may use) |
CELERY_WORKER_MAX_MEMORY_PER_CHILD |
KiB before a Celery process is replaced, 0 to disable |
524288 |
TRASH_RETENTION_DAYS |
Days before trashed items are permanently deleted | 30 |
METRICS_USER |
HTTP Basic user for /metrics |
(none, endpoint closed) |
METRICS_PASSWORD |
HTTP Basic password for /metrics |
(none, endpoint closed) |
AI_API_KEY |
OpenAI API key (or compatible provider) | (none, AI disabled) |
AI_BASE_URL |
Custom LLM API base URL (Ollama, LM Studio, etc.) | (OpenAI default) |
AI_MODEL |
Default LLM model | gpt-5 |
AI_MAX_TOKENS |
Maximum tokens per AI response | 2048 |
AI_IMAGE_MODEL |
Model for image generation | dall-e-3 |
AI_IMAGE_BASE_URL |
Custom image generation base URL | (same as AI_BASE_URL) |
Full documentation - per-module guides, deployment recipes, and how-tos - lives in docs/.
All endpoints are prefixed with /api/ with no trailing slashes. Interactive documentation is available at:
- Swagger UI -
/schema/swagger-ui/ - ReDoc -
/schema/redoc/ - OpenAPI Schema -
/schema/
/health/live- Liveness probe/health/ready- Readiness probe (checks database)/health/startup- Startup probe
/metrics- Prometheus exposition, behind HTTP Basic auth (METRICS_USER/METRICS_PASSWORD). Returns401until both are set. See Monitoring with Prometheus.
Workspace is modular. Each module registers itself at startup via AppConfig.ready():
from workspace.core.registry import registry, ModuleInfo
class MyModuleConfig(AppConfig):
def ready(self):
registry.register(ModuleInfo(
name='my_module',
display_name='My Module',
icon='sparkles',
color='primary',
url='/my-module/',
))Your module automatically appears in the sidebar, dashboard, and search results.
See IDEAS.md for the full roadmap. Planned modules include:
- Bookmarks - Save and organize links with automatic previews
Contributions are welcome! Fork the repository, create a feature branch, and open a Pull Request.
By contributing, you agree to the contributor license grant in CONTRIBUTING.md.
Source-available under the Business Source License 1.1 (BSL 1.1).
- Free to use, modify, and self-host for personal or internal business use.
- You may not offer Workspace as a hosted or managed service to third parties without a commercial license.
- This version converts to MIT License on 2029-10-17.








