Team Ops
The Startup Ops & Async Team Stack
Team chat, project management, internal docs and a shared password manager — the operational backbone of a remote startup, without paying per seat for Slack, Notion or Jira.
Combined minimum RAM
~7GB
Estimated savings
Eliminates the $8-$15 per user/month cost of Slack and Notion
Overlapping tools
- Alternatives to each other for Slack: Mattermost, Zulip. You may only need one of them.
- Alternatives to each other for Asana: Plane, Vikunja. You may only need one of them.
- Alternatives to each other for Notion: Outline, AppFlowy. You may only need one of them.
Tools in this pack (7)
Mattermost
Security-focused team chat and collaboration, an alt. to Slack.
ProductivityOpen-Core🟡 Standard · ~1GB
docker-compose.yml
version: "3.9"
services:
mattermost:
image: mattermost/mattermost-team-edition:11.11.1
restart: unless-stopped
ports:
- "8065:8065"
environment:
- MM_SQLSETTINGS_DATASOURCE=postgres://mattermost:mattermost@mattermost-db:5432/mattermost?sslmode=disable
volumes:
- mattermost_data:/mattermost/data
depends_on:
- mattermost-db
mattermost-db:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=mattermost
- POSTGRES_PASSWORD=change-me-postgres-password # REQUIRED: generate a random secret before first run
- POSTGRES_DB=mattermost
volumes:
- mattermost_pg_data:/var/lib/postgresql/data
volumes:
mattermost_data:
mattermost_pg_data:
Zulip
Team chat organized by threads, an alternative to Slack.
Productivity100% FOSS🟢 Lightweight · ~512MB
docker-compose.yml
version: "3.9"
# NOTA: zulip/docker-zulip (Docker Hub) es la vía "legacy" — sigue soportada
# para Zulip Server 11.x, pero Zulip 12.x+ solo se publica en
# ghcr.io/zulip/zulip-server, con variables de entorno renombradas
# (DB_HOST, DISABLE_HTTPS, NGINX_WORKERS...). No cambiamos aquí la imagen
# porque migrar requiere también reescribir esas variables, y no queremos
# publicar un docker-compose con nombres de variable sin verificar contra
# la versión real del rework — mejor dejar la vía legacy que sí funciona.
services:
zulip:
image: zulip/docker-zulip:latest
restart: unless-stopped
ports:
- "80:80"
environment:
- SETTING_EXTERNAL_HOST=localhost # CHANGE THIS TO YOUR DOMAIN
- SECRETS_email_password=""
volumes:
- zulip_data:/data
volumes:
zulip_data:
Plane
Project and issue management, an alternative to Jira and Asana.
ProductivityOpen-Core🔴 Full · ~2GB
docker-compose.yml
version: "3.9"
services:
plane-app:
image: makeplane/plane-aio-community:v1.4.2
restart: unless-stopped
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://plane:change-me-postgres-password@plane-db:5432/plane # password must match the canonical db password below
- REDIS_URL=redis://plane-redis:6379
- SECRET_KEY=change-me-super-secret
depends_on:
- plane-db
- plane-redis
plane-db:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=plane
- POSTGRES_PASSWORD=change-me-postgres-password # REQUIRED: generate a random secret before first run
- POSTGRES_DB=plane
volumes:
- plane_pg_data:/var/lib/postgresql/data
plane-redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
plane_pg_data:
Vikunja
Task and project manager, an alternative to Todoist and Asana.
ProductivityOpen-Core🟢 Lightweight · ~256MB
docker-compose.yml
version: "3.9"
services:
vikunja:
image: vikunja/vikunja:2.6
restart: unless-stopped
ports:
- "3456:3456"
environment:
- VIKUNJA_DATABASE_TYPE=sqlite
- VIKUNJA_SERVICE_JWTSECRET=change-me-super-secret
volumes:
- vikunja_data:/app/vikunja/files
volumes:
vikunja_data:
Outline
Fast, elegant team wiki, an alternative to Confluence.
ProductivityOpen-Core🔴 Full · ~2GB
docker-compose.yml
version: "3.9"
services:
outline:
image: outlinewiki/outline:1.10
restart: unless-stopped
ports:
- "3000:3000"
environment:
- SECRET_KEY=change-me-super-secret
- DATABASE_URL=postgres://outline:change-me-postgres-password@outline-db:5432/outline # password must match the canonical db password below
- REDIS_URL=redis://outline-redis:6379
- URL=http://localhost:3000
depends_on:
- outline-db
- outline-redis
outline-db:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=outline
- POSTGRES_PASSWORD=change-me-postgres-password # REQUIRED: generate a random secret before first run
- POSTGRES_DB=outline
volumes:
- outline_pg_data:/var/lib/postgresql/data
outline-redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
outline_pg_data:
AppFlowy
Notes and database workspace, the open source alternative to Notion.
ProductivityOpen-Core🟡 Standard · ~1GB
docker-compose.yml
version: "3.9"
services:
appflowy-cloud:
image: appflowyinc/appflowy_cloud:0.18.11
restart: unless-stopped
ports:
- "8000:8000"
environment:
- APPFLOWY_DATABASE_URL=postgres://postgres:change-me-postgres-password@postgres:5432/postgres # password must match the canonical db password below
- APPFLOWY_GOTRUE_JWT_SECRET=change-me-super-secret
depends_on:
- postgres
postgres:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=change-me-postgres-password # REQUIRED: generate a random secret before first run
volumes:
- appflowy_pg_data:/var/lib/postgresql/data
volumes:
appflowy_pg_data:
Vaultwarden
Lightweight Rust Bitwarden server, a self-hosted alternative to 1Password.
Password Managers100% FOSS🟢 Lightweight · ~256MB
docker-compose.yml
version: "3.9"
services:
vaultwarden:
image: vaultwarden/server:1.37.3-alpine
restart: unless-stopped
ports:
- "8080:80"
environment:
- DOMAIN=https://vault.yourdomain.com # CHANGE THIS TO YOUR DOMAIN (required for the web vault and apps to work correctly)
- ADMIN_TOKEN=change-me-super-secret # REQUIRED: generate a random secret before first run
- SIGNUPS_ALLOWED=false
volumes:
- vaultwarden_data:/data
volumes:
vaultwarden_data: