[{"data":1,"prerenderedAt":96},["ShallowReactive",2],{"$f10urub5t0d2qd":3},{"site":4,"app":16,"alternatives":70,"compose":91,"log":92,"changelog":93},{"hourly_rate_usd":5,"break_even_window_mo":6,"reference_env":7,"attribution":8},20,18,"Fresh Debian 12, Docker + Compose preinstalled, 2 GB RAM \u002F 2 vCPU ($5-class VPS)",{"caniselfhostit":9},{"name":10,"url":11,"repo":12,"license":13,"author":14,"note":15},"caniselfhostit.com","https:\u002F\u002Fcaniselfhostit.com","https:\u002F\u002Fgithub.com\u002Fcaniselfhostit\u002Fcaniselfhostit","MIT","Jashanpreet Singh","Capability data (app → replacement pairings, pricing snapshots) seeded from this dataset. They answer 'can you run it, and how' — go there for guided installs.",{"id":17,"name":18,"domain":19,"category":20,"price_usd_mo":21,"price_plan":22,"price_unit":23,"price_source":24,"price_checked":25,"jobs":26,"verdict":32,"verdict_reason":33,"what_you_lose":34,"alternatives":39,"economics":41,"hardware_tier":45,"provenance":46,"verified":49,"compose":57,"links":61,"notes":63,"derived":64},"slack","Slack","slack.com","team-chat",8.75,"Pro","per-seat","https:\u002F\u002Fslack.com\u002Fpricing","2026-08-05",[27,28,29,30,31],"channels & DMs","mobile apps with reliable push","search across full history","integrations & incoming webhooks","huddles\u002Fcalls","KINDA","Per-seat pricing means the math flips hard around 4 seats — a 10-person team escapes $1,050\u002Fyr for one weekend of setup. Worth it if someone genuinely owns the pager; chat is the one service your team notices being down within 90 seconds.",[35,36,37,38],"Slack's mobile push reliability — Mattermost push routes through their relay or you build your own, and half-working push kills adoption","The integration directory: webhooks exist, but every SaaS ships a Slack app and maybe a Mattermost one","Huddles-grade calls without extra setup","Message history import is one-way and lossy — the escape is easier before the archive matters",[40],"mattermost",{"vps_share_usd_mo":42,"storage_usd_mo":43,"maint_min_mo":44},2,0.5,45,"vps",{"capability_seed":47,"decision_layer":48},"caniselfhostit","original",{"by":50,"at":51,"protocol":52,"setup_min":53,"assistant":54,"evidence":55,"what_broke":58},"zernonia","2026-08-10","v1",65,"claude-code",[56,57],"logs\u002Fslack-mattermost.md","compose\u002Fslack-mattermost.yml",[59,60],"The image ships no shell, curl or wget, so a CMD-SHELL healthcheck fails forever while the server is fine — exec-form mmctl system status --local (with local mode enabled) is the probe that works","First admin account creation is a UI step — plan it into the rollout, whoever clicks first owns the workspace",{"caniselfhostit":62},"https:\u002F\u002Fcaniselfhostit.com\u002Fslack","The economics inputs above are for ONE seat, which is the honest per-person floor — multiply the price by your seat count and the self-host cost barely moves. That asymmetry is the whole argument.",{"hourly_rate_usd":5,"self_host_cost_usd_mo":65,"net_saving_usd_mo":66,"setup_cost_usd":67,"break_even_months":68,"break_even_date":68,"markup_index":43,"primary_abandoned":69,"verdict_stale":69},17.5,-8.75,21.67,null,false,[71],{"id":40,"name":72,"tagline":73,"repo":74,"site":75,"license":13,"category":76,"resources":77,"provenance":81,"metrics":82},"Mattermost","Channels, threads and file sharing for a team, on a server you own, with no per-seat meter and no ninety-day history cliff.","mattermost\u002Fmattermost","https:\u002F\u002Fmattermost.com","comms-scheduling",{"ram_min_mb":78,"disk_gb":79,"arm64":69,"containers":42,"external_db":80},2048,10,true,{"capability_seed":47,"decision_layer":48},{"id":40,"stars":83,"last_commit":84,"latest_release":85,"docker_pulls":68,"open_issues":89,"fetched_at":90},38721,"2026-08-10T22:22:59Z",{"tag":86,"published_at":87,"url":88},"v11.9.0","2026-07-08T06:02:46Z","https:\u002F\u002Fgithub.com\u002Fmattermost\u002Fmattermost\u002Freleases\u002Ftag\u002Fv11.9.0",979,"2026-08-11T03:55:26.973Z","# Mattermost Team Edition — self-hosted team chat (replaces Slack)\nservices:\n  mattermost:\n    image: mattermost\u002Fmattermost-team-edition:latest\n    container_name: mattermost\n    restart: unless-stopped\n    depends_on:\n      mm-postgres:\n        condition: service_healthy\n    environment:\n      MM_SQLSETTINGS_DRIVERNAME: postgres\n      MM_SQLSETTINGS_DATASOURCE: postgres:\u002F\u002Fmmuser:mmpass@mm-postgres:5432\u002Fmattermost?sslmode=disable&connect_timeout=10\n      MM_SERVICESETTINGS_SITEURL: http:\u002F\u002Flocalhost:8065\n      MM_SERVICESETTINGS_ENABLELOCALMODE: \"true\"\n    ports:\n      - \"8065:8065\"\n    volumes:\n      - mm-data:\u002Fmattermost\u002Fdata\n      - mm-logs:\u002Fmattermost\u002Flogs\n      - mm-config:\u002Fmattermost\u002Fconfig\n      - mm-plugins:\u002Fmattermost\u002Fplugins\n      - mm-client-plugins:\u002Fmattermost\u002Fclient\u002Fplugins\n      - mm-bleve:\u002Fmattermost\u002Fbleve-indexes\n    healthcheck:\n      # The image ships no shell, curl or wget — exec-form mmctl over the local socket\n      # is the only probe that works (requires MM_SERVICESETTINGS_ENABLELOCALMODE above).\n      test: [\"CMD\", \"\u002Fmattermost\u002Fbin\u002Fmmctl\", \"system\", \"status\", \"--local\"]\n      interval: 5s\n      timeout: 10s\n      retries: 36\n      start_period: 30s\n\n  mm-postgres:\n    image: postgres:16-alpine\n    restart: unless-stopped\n    environment:\n      POSTGRES_USER: mmuser\n      POSTGRES_PASSWORD: mmpass\n      POSTGRES_DB: mattermost\n    volumes:\n      - mm-pg:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U mmuser\"]\n      interval: 5s\n      timeout: 5s\n      retries: 12\n\nvolumes:\n  mm-data:\n  mm-logs:\n  mm-config:\n  mm-plugins:\n  mm-client-plugins:\n  mm-bleve:\n  mm-pg:\n","# Timed setup log: Slack → Mattermost\n\n**Protocol:** v1 · **Verified by:** zernonia · **Date:** 2026-08-10\n**Assistant:** claude-code · **Environment:** containerized runner, 2 vCPU class, Docker 29.3 \u002F Compose v5.1\n\n## Timeline\n\n| Step | Time |\n|---|---|\n| Draft compose (mattermost + postgres, datasource string, site URL) | 15 min |\n| **Boot #1: server up and serving, but never reported healthy** (see What broke) | 15 min to diagnose |\n| Switch healthcheck to `mmctl system status --local`, re-up | 3 min |\n| Boot #2 to healthy + core workflow: create admin + team, post in a channel, second browser sees it live | 25 min |\n| Re-run from clean volumes | 7 min |\n| **Total: ~65 min** | |\n\n## Measurements\n\n- 2 containers · Mattermost idle RAM ~450 MB + postgres ~40 MB — wants the full 2 GB box\n- Server boots and serves within ~60 s; plugin unpacking continues for a while after\n\n## What broke\n\n1. **The image ships no shell, curl or wget** — a `CMD-SHELL` healthcheck fails with\n   \"stat \u002Fbin\u002Fsh: no such file or directory\" forever while the server is actually fine.\n   Exec-form `mmctl system status --local` (with `MM_SERVICESETTINGS_ENABLELOCALMODE=true`)\n   is the healthcheck that works.\n2. **First admin is a race**: whoever completes the first-run screen owns the workspace.\n   Plan the rollout; don't send the URL to the team before you've clicked through.\n\n## Verdict-relevant notes\n\n- Channels, DMs, search, webhooks: solid. Mobile push routes through Mattermost's relay (or\n  you run your own push proxy) — test it before you migrate anyone who matters.\n- The KINDA is arithmetic: per-seat pricing versus a flat server cost. At 1 seat you're\n  losing money; at 10 seats you're keeping ~$1,000\u002Fyr for one weekend plus ops ownership.\n",[94],{"date":51,"app":17,"from":68,"to":32,"reason":95},"Initial verdict: per-seat math flips hard at ~4 seats, if someone owns the pager.",1786459422169]