AltFreeStack
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:
View Mattermost's full profile
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:
View Zulip's full profile
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:
View Plane's full profile
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:
View Vikunja's full profile
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:
View Outline's full profile
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:
View AppFlowy's full profile
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:
View Vaultwarden's full profile