[{"data":1,"prerenderedAt":89},["ShallowReactive",2],{"$f9x08rgdxgzgs":3},{"site":4,"app":16,"alternatives":68,"compose":84,"log":85,"changelog":86},{"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,"links":26,"jobs":28,"verdict":33,"alternatives":34,"provenance":36,"verdict_reason":39,"what_you_lose":40,"economics":43,"hardware_tier":47,"verified":48,"compose":56,"derived":61},"sentry","Sentry","sentry.io","monitoring",26,"Team","usage","https:\u002F\u002Fsentry.io\u002Fpricing\u002F","2026-08-06",{"caniselfhostit":27},"https:\u002F\u002Fcaniselfhostit.com\u002Fsentry",[29,30,31,32],"error tracking (Sentry SDKs)","issue grouping & alerts","performance traces (basic)","uptime checks","YES",[35],"glitchtip",{"capability_seed":37,"decision_layer":38},"caniselfhostit","original","GlitchTip speaks the Sentry SDK protocol and fits on a normal VPS. Sentry's own self-host wants 16GB and a small ops team — the honest self-host answer is the compatible lightweight, and it breaks even in about two months.",[41,42],"Sentry's deep tracing\u002Fprofiling\u002Freplay product — GlitchTip is errors done well, not the whole observability suite","SaaS-side data retention muscle",{"vps_share_usd_mo":44,"storage_usd_mo":45,"maint_min_mo":46},2.5,0,30,"vps",{"by":49,"at":50,"protocol":51,"setup_min":52,"assistant":53,"evidence":54,"what_broke":57},"zernonia","2026-08-10","v1",90,"claude-code",[55,56],"logs\u002Fsentry-glitchtip.md","compose\u002Fsentry-glitchtip.yml",[58,59,60],"The container serves on 8000, not the 8080 several guides claim — map and probe accordingly","python-slim image has no curl\u002Fwget; the healthcheck probes \u002F_health\u002F with python urllib","Celery worker needs its own container with the same env — errors ingest but nothing processes without it; don't healthcheck it with celery inspect ping, which races broker registration forever",{"hourly_rate_usd":5,"self_host_cost_usd_mo":62,"net_saving_usd_mo":63,"setup_cost_usd":46,"break_even_months":64,"break_even_date":65,"markup_index":66,"primary_abandoned":67,"verdict_stale":67},12.5,13.5,2.22,"2026-10-17",2.08,false,[69],{"id":35,"name":70,"tagline":71,"repo":72,"site":73,"license":13,"category":20,"resources":74,"provenance":78,"metrics":79},"GlitchTip","Error tracking that speaks the Sentry SDK protocol, so your code keeps its instrumentation and changes one DSN.","burke-software\u002FGlitchTip","https:\u002F\u002Fglitchtip.com",{"ram_min_mb":75,"disk_gb":5,"arm64":76,"containers":77,"external_db":76},2048,true,3,{"capability_seed":37,"decision_layer":38},{"id":35,"stars":80,"last_commit":81,"latest_release":82,"docker_pulls":82,"open_issues":45,"fetched_at":83},172,"2026-02-10T14:09:19Z",null,"2026-08-11T03:55:22.144Z","# GlitchTip — Sentry-compatible error tracking that fits on a normal VPS (replaces Sentry's\n# Team plan; Sentry's own self-host wants ~16GB and a dozen containers — GlitchTip is the\n# sane answer)\nservices:\n  glitchtip-web:\n    image: glitchtip\u002Fglitchtip:latest\n    container_name: glitchtip-web\n    restart: unless-stopped\n    depends_on:\n      glitchtip-db:\n        condition: service_healthy\n      glitchtip-redis:\n        condition: service_healthy\n    environment: &gt-env\n      DATABASE_URL: postgres:\u002F\u002Fglitchtip:glitchtip@glitchtip-db:5432\u002Fglitchtip\n      REDIS_URL: redis:\u002F\u002Fglitchtip-redis:6379\n      SECRET_KEY: 2b1e6f9c8d7a5b4c3e2f1a0d9c8b7a6f5e4d3c2b1a0f9e8d # throwaway test value\n      GLITCHTIP_DOMAIN: http:\u002F\u002Flocalhost:8088\n      EMAIL_URL: consolemail:\u002F\u002F\n      ENABLE_USER_REGISTRATION: \"true\"\n    ports:\n      - \"8088:8000\" # glitchtip serves on 8000\n    healthcheck:\n      # python-slim image: no curl\u002Fwget, but python is right there\n      test: [\"CMD-SHELL\", \"python3 -c \\\"import urllib.request;urllib.request.urlopen('http:\u002F\u002Flocalhost:8000\u002F_health\u002F')\\\"\"]\n      interval: 5s\n      timeout: 5s\n      retries: 36\n      start_period: 30s\n\n  glitchtip-worker:\n    image: glitchtip\u002Fglitchtip:latest\n    container_name: glitchtip-worker\n    restart: unless-stopped\n    command: .\u002Fbin\u002Frun-celery-with-beat.sh\n    depends_on:\n      glitchtip-db:\n        condition: service_healthy\n      glitchtip-redis:\n        condition: service_healthy\n    environment: *gt-env\n    # No worker healthcheck: celery's inspect ping is unreliable as a container probe\n    # (broker registration races it forever). The web container's \u002F_health\u002F gate plus\n    # restart: unless-stopped is the honest signal here.\n\n  glitchtip-db:\n    image: postgres:16-alpine\n    restart: unless-stopped\n    environment:\n      POSTGRES_USER: glitchtip\n      POSTGRES_PASSWORD: glitchtip\n      POSTGRES_DB: glitchtip\n    volumes:\n      - glitchtip-pg:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U glitchtip\"]\n      interval: 5s\n      timeout: 5s\n      retries: 12\n\n  glitchtip-redis:\n    image: redis:7-alpine\n    restart: unless-stopped\n    healthcheck:\n      test: [\"CMD-SHELL\", \"redis-cli ping | grep PONG\"]\n      interval: 5s\n      timeout: 5s\n      retries: 12\n\nvolumes:\n  glitchtip-pg:\n","# Timed setup log: Sentry → glitchtip\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| Read upstream docs, draft compose with healthcheck | ~30 min |\n| **Boot: all services healthy in 13 s (measured, `compose up --wait`)** | — |\n| Endpoint-level workflow check (login\u002Fhealth\u002FAPI serve) + re-run from clean volumes | ~30 min |\n| **Total: ~90 min** | |\n\nBoot and endpoint checks are machine-verified; `setup_min` is the wall-clock total for this\nsession including authoring, diagnosis and re-runs. Endpoint-level ≠ full human UI workflow —\ndispute anything that doesn't reproduce (CONTRIBUTING.md).\n\n## What broke\n\n- The container serves on 8000, not the 8080 several guides claim — map and probe accordingly\n- python-slim image has no curl\u002Fwget; the healthcheck probes \u002F_health\u002F with python urllib\n- Celery worker needs its own container with the same env — errors ingest but nothing processes without it; don't healthcheck it with celery inspect ping, which races broker registration forever\n\n## Verdict-relevant notes\n\n- SDK setup is unchanged from Sentry: swap the DSN.\n",[87],{"date":50,"app":17,"from":82,"to":33,"reason":88},"Initial verdict: GlitchTip speaks the Sentry SDK protocol and fits on a normal VPS. Sentry's own self-host wants 16GB and a small ops team.",1786459422157]