The 18 MB drop-in Sentry alternative for indie hackers.
Your Sentry SDKs keep working. Your server bill doesn't.
🌍 Read in: 🇬🇧 English | 🇷🇺 Русский
🇬🇧 English
🔥 The Problem
Self-hosting Sentry is an infrastructure nightmare:
| What you need | What it costs |
|---|---|
| 40+ Docker containers | Hours of DevOps work |
| Kafka, Redis, ClickHouse, PostgreSQL, Zookeeper… | 16 GB+ RAM minimum |
docker-compose.yml from hell |
Constant maintenance |
You just wanted to catch a TypeError in your side project. Not deploy a distributed system.
💡 The Solution
PocketSentry is a single, self-contained binary that speaks the Sentry protocol. Your existing SDKs (sentry-python, @sentry/browser, sentry-go, etc.) connect to it without any code changes — just swap the DSN.
| Official Sentry (Self-hosted) | PocketSentry | |
|---|---|---|
| Deploy | 40+ containers, Compose/K8s | 1 file, ./pocketsentry |
| RAM | 16 GB+ | < 20 MB |
| Database | PostgreSQL + ClickHouse + Redis | SQLite (WAL mode + Deduplication) |
| Binary size | Gigabytes of images | ~18 MB |
| Dependencies | Kafka, Zookeeper, Snuba… | Zero |
| Time to deploy | 30+ minutes | 3 seconds |
| CGO | N/A | None — pure Go |
✨ Features
- 🔌 Drop-in compatible — works with official Sentry SDKs out of the box
- 📦 Single binary — templates embedded via
go:embed, zero external files - 🪶 Ultra-lightweight — ~18 MB binary, < 20 MB RAM at runtime
- 🗄️ Embedded SQLite — pure-Go driver (modernc.org/sqlite), no CGO hassle
- 🔄 Auto-deduplication — identical errors are grouped by
(project, message, level)with a hit counter - 📊 Real-time dashboard — dark-themed UI with HTMX auto-refresh (every 2s)
- 🔍 Detailed Stacktraces — Clickable rows to view full error details and raw JSON payloads
- 📈 Analytics & Filters — Interactive charts and instant HTMX filtering by error level
- 🛡️ Basic Auth — Built-in dashboard protection via username and password (ingestion API remains open)
- 🧹 Retention Policy — Background auto-cleanup of old events from the database
- 🔒 Graceful shutdown — SIGINT/SIGTERM → drain connections → close DB
- 🌐 Full CORS — browser SDKs work without proxy hacks
- 🗜️ Gzip support — transparent decompression of compressed payloads
- 🧩 Both endpoints —
/api/{id}/store/(legacy) and/api/{id}/envelope/(modern) - 🏥 Health Check —
/healthendpoint for uptime monitoring and orchestration - 🔔 Webhooks — Instant error alerts in Telegram and Discord (only for new unique errors)
- 🛠️ Error Lifecycle — Resolve errors directly from the dashboard (automatically reopens if the error reoccurs)
- 📂 Project Management — Create isolated workspaces for your different apps and fetch dynamic DSNs
- 🗺️ Source Maps — Automatic demangling of minified JavaScript stacktraces via local
.mapfiles - ⚡ Performance Monitoring — Track slow transactions with waterfall visualization of nested spans
- 👁️ Interactive Stacktraces — Prism.js syntax highlighting and toggle to collapse/expand third-party library frames
- 🍞 Breadcrumbs Timeline — Visual history of user actions (UI clicks, HTTP requests, console logs) preceding an error
- 🏷️ Release Tracking — Track errors associated with specific app versions (releases) with badges
- 🤖 Interactive Telegram Bot — Resolve errors directly from the Telegram chat with action buttons
- ⚙️ Notification Routing — Project-specific webhook target overrides (Discord/Telegram) for smart alerting
- 💬 Local Issue Notes — Add team comments and debugging notes directly to errors in the dashboard
- 🚀 Smart Resolving — Mark errors as "Resolved in Next Release" and let PocketSentry automatically detect regressions
🚀 Quick Start
1. Download and run:
Option A: Standalone Binary
./pocketsentry --port 8080
Option B: Docker
That's it. Open http://localhost:8080 to see the dashboard.
2. Point your SDK:
🐍 Python
import sentry_sdk sentry_sdk.init( dsn="http://public@localhost:8080/1", traces_sample_rate=0, ) # Test it raise ValueError("Hello from PocketSentry!")
🟨 JavaScript / Node.js
const Sentry = require("@sentry/node"); Sentry.init({ dsn: "http://public@localhost:8080/1", }); // Test it Sentry.captureException(new Error("Hello from PocketSentry!"));
🌐 Browser (@sentry/browser)
import * as Sentry from "@sentry/browser"; Sentry.init({ dsn: "http://public@localhost:8080/1", }); // Test it throw new Error("Hello from PocketSentry!");
🐹 Go
import "github.com/getsentry/sentry-go" func main() { sentry.Init(sentry.ClientOptions{ Dsn: "http://public@localhost:8080/1", }) defer sentry.Flush(2 * time.Second) sentry.CaptureMessage("Hello from PocketSentry!") }
⚙️ CLI Options
| Flag | Default | Description |
|---|---|---|
--port |
8080 |
HTTP server port |
--db |
pocketsentry.db |
Path to SQLite database file |
--admin-user |
"" |
Dashboard admin username (empty = auth disabled) |
--admin-pass |
"" |
Dashboard admin password |
--retention-days |
30 |
Auto-delete events older than N days (0 = disabled) |
--checkupd |
false |
Check for a newer release on GitHub and update if confirmed |
--discord-webhook-url |
"" |
Discord Webhook URL for error notifications |
--tg-token |
"" |
Telegram Bot Token for error notifications |
--tg-chat-id |
"" |
Telegram Chat ID for error notifications |
Environment variables PORT and DB_PATH are also supported (flags take priority).
The server handles graceful shutdown: press Ctrl+C and it will finish in-flight requests, close the database, and exit cleanly.
$ ./pocketsentry --port 9090 --db /data/errors.db
___ _ _ ___ _
| _ \ ___ __ | | __ __| |_/ __| ___ _ __ | |_ _ _ _ _
| _// _ \/ _|| |/ // _| __\__ \/ _ \ '_ \| _| '_| || |
|_| \___/\__||_\_\\__|\__|___/\___/_||_|\__|_| \_, |
|__/
──────────────────────────────────────────────────
🛡️ Version : 3.2.0
🌐 Dashboard : http://localhost:9090
📦 Database : /data/errors.db
🔗 DSN : http://public@localhost:9090/1
🔓 Auth : disabled
🗑️ Retention : 30 days
──────────────────────────────────────────────────
Point your Sentry SDK to the DSN above.
Press Ctrl+C to stop.
🔨 Build from Source
git clone https://github.com/apvcode/pocketsentry.git cd pocketsentry go mod tidy go build -o pocketsentry . ./pocketsentry
Requirements: Go 1.22+ (no CGO, no external C libraries).
🗺️ Roadmap
General Roadmap:
- ⚡ HTTP Latency Auto-Discovery via eBPF: Measure transaction response times (p50/p90/p99) directly in the Linux kernel without SDKs or changes to application code.
- 🔓 SSL/TLS Decryption via eBPF: Trace secure HTTPS connections by hooking SSL libraries (OpenSSL/Go TLS) at the kernel level.
✅ Completed Features
- 📡 Real-time Log Tail (SSE): Stream logs to the UI in real-time with Live Tail mode.
- 🔑 Log-based Alerting Rules: Instant Telegram/Discord alerts when specific regex patterns appear in logs.
- 🗑️ Comprehensive Log & Transaction Retention: Automated cleanup for logs, transactions, spans, attachments, and replays.
- 🔭 OpenTelemetry OTLP Ingest: Native endpoints (
/v1/traces,/v1/logs) for direct OpenTelemetry SDK and Collector ingestion. - 📈 Prometheus Metrics Endpoint: Built-in
/metricsexporter for infrastructure monitoring. - 🐳 Docker & Kubernetes eBPF Metadata: Enrich connection topology with container names and pod namespace info using Docker/k8s APIs.
- 🪵 Centralized Log Streaming: Act as a lightweight log aggregator (like Loki) to query stdout/stderr application logs inside the UI.
- 🎥 Session Replay: Support and visualize user session recordings (sent by Sentry SDK via
rrweb) to see exactly what the user did before the crash. - Linux eBPF Agent: Catch 500 Internal Server Errors and connection tracking directly from the Linux kernel without SDKs (run with
--enable-ebpf). - Network Topology Map: Visual dashboard showing how your Docker containers/services interact.
- Smart Alerting Rules: Conditional routing for webhooks (e.g., notify only if an error occurs > 10 times in 5 minutes).
- Source Maps API Upload: Dedicated API endpoint to upload
.mapfiles directly from CI/CD pipelines. - Latency Analytics: Interactive dashboard graphs showing transaction percentile metrics (p50, p90, p99).
- Smart Grouping: Custom regex-based rules to merge similar events (e.g. stripping dynamic IDs or hashes from messages).
- System & DB Metrics: Dashboard charts for SQLite database size, error ingestion rates (RPS), and retention cleanup stats.
- Attachments Support: Store and display screenshots, logs, and other files uploaded via the Sentry SDK.
- Event detail page with full stacktrace
- Retention policies (auto-delete old events)
- Authentication
- Project management (create/delete projects)
- Source maps support
- Docker image
- Data Export (CSV)
- Project-specific notification routing (different chats for different projects)
- Interactive Telegram bot (resolving bugs directly from the chat)
- Transactions support (Performance Monitoring)
- Local Issue Notes (comments directly on errors)
- Snooze Alert (Mute error notifications for a specific time)
📄 License
MIT — use it, fork it, ship it.
🇷🇺 Русский
🔥 Проблема
Самостоятельный хостинг Sentry — это инфраструктурный ад:
| Что нужно | Чем платишь |
|---|---|
| 40+ Docker-контейнеров | Часы работы DevOps |
| Kafka, Redis, ClickHouse, PostgreSQL, Zookeeper… | 16+ ГБ RAM минимум |
docker-compose.yml из преисподней |
Постоянное обслуживание |
Ты просто хотел поймать TypeError в своём пет-проекте. А не деплоить распределённую систему.
💡 Решение
PocketSentry — это один автономный бинарник, который говорит на протоколе Sentry. Твои существующие SDK (sentry-python, @sentry/browser, sentry-go и др.) подключаются к нему без изменений в коде — просто замени DSN.
| Sentry (Self-hosted) | PocketSentry | |
|---|---|---|
| Деплой | 40+ контейнеров, Compose/K8s | 1 файл, ./pocketsentry |
| RAM | 16+ ГБ | < 20 МБ |
| База данных | PostgreSQL + ClickHouse + Redis | SQLite (WAL-режим + Дедупликация) |
| Размер | Гигабайты образов | ~18 МБ |
| Зависимости | Kafka, Zookeeper, Snuba… | Ноль |
| Время деплоя | 30+ минут | 3 секунды |
| CGO | — | Не нужен — чистый Go |
✨ Возможности
- 🔌 Drop-in совместимость — работает с официальными Sentry SDK из коробки
- 📦 Один бинарник — шаблоны встроены через
go:embed, никаких внешних файлов - 🪶 Ультралёгкий — ~18 МБ бинарник, < 20 МБ RAM в рантайме
- 🗄️ Встроенный SQLite — pure-Go драйвер (modernc.org/sqlite), без CGO
- 🔄 Авто-дедупликация — одинаковые ошибки группируются по
(project, message, level)со счётчиком - 📊 Дашборд реального времени — тёмная тема, HTMX автообновление каждые 2 секунды
- 🔍 Detailed Stacktraces — Кликабельные строки для просмотра детальной информации об ошибке и сырого JSON-пейлоада
- 📈 Analytics & Filters — Интерактивные графики и мгновенная фильтрация ошибок по уровням (HTMX)
- 🛡️ Basic Auth — Встроенная защита дашборда логином и паролем (API для приема логов остается открытым)
- 🧹 Retention Policy — Фоновая авто-очистка старых логов из базы данных
- 🔒 Graceful Shutdown — SIGINT/SIGTERM → дождаться запросов → закрыть БД
- 🌐 Полный CORS — браузерные SDK работают без проксирования
- 🗜️ Gzip — прозрачная декомпрессия сжатых payload'ов
- 🧩 Оба эндпоинта —
/api/{id}/store/(legacy) и/api/{id}/envelope/(modern) - 🏥 Health Check — эндпоинт
/healthдля мониторинга аптайма и оркестрации - 🔔 Уведомления — Мгновенные алерты об ошибках в Telegram и Discord (только для новых уникальных ошибок)
- 🛠️ Жизненный цикл ошибок — Возможность отмечать ошибки как «решенные» прямо из дашборда (автоматически переоткрываются, если баг повторится)
- 📂 Управление проектами — Создание отдельных воркспейсов для разных приложений со своими DSN.
- 🗺️ Source Maps — Автоматическая расшифровка минифицированных JS-ошибок (просто положите
.mapфайлы в папкуsourcemaps/). - ⚡ Мониторинг производительности — Отслеживание медленных транзакций с визуализацией дерева спанов (Waterfall chart).
- 👁️ Интерактивные стек-трейсы — Подсветка синтаксиса (Prism.js) и скрытие системного кода (library frames) одной кнопкой.
- 🍞 Лента хлебных крошек — Визуальный таймлайн действий пользователя (клики, запросы, консоль лог) перед ошибкой.
- 🏷️ Отслеживание релизов — Отображение версии приложения для каждой ошибки с фиолетовыми бейджами релизов.
- 🤖 Интерактивный Telegram-бот — Решайте ошибки прямо из чата с помощью кнопок действий.
- ⚙️ Роутинг уведомлений — Указание индивидуальных Telegram/Discord вебхуков для каждого проекта.
- 💬 Локальные заметки — Оставляйте комментарии и заметки по дебагу прямо на странице ошибки.
- 🚀 Умный авто-резолв — Отмечайте баг как «решенный в следующем релизе», и система сама откроет его при регрессии.
🚀 Быстрый старт
1. Скачай и запусти:
Вариант А: Обычный бинарник
./pocketsentry --port 8080
Вариант Б: Docker
Всё! Открой http://localhost:8080 и смотри дашборд.
2. Подключи свой SDK:
🐍 Python
import sentry_sdk sentry_sdk.init( dsn="http://public@localhost:8080/1", traces_sample_rate=0, ) # Проверка raise ValueError("Привет от PocketSentry!")
🟨 JavaScript / Node.js
const Sentry = require("@sentry/node"); Sentry.init({ dsn: "http://public@localhost:8080/1", }); // Проверка Sentry.captureException(new Error("Привет от PocketSentry!"));
🌐 Браузер (@sentry/browser)
import * as Sentry from "@sentry/browser"; Sentry.init({ dsn: "http://public@localhost:8080/1", }); // Проверка throw new Error("Привет от PocketSentry!");
🐹 Go
import "github.com/getsentry/sentry-go" func main() { sentry.Init(sentry.ClientOptions{ Dsn: "http://public@localhost:8080/1", }) defer sentry.Flush(2 * time.Second) sentry.CaptureMessage("Привет от PocketSentry!") }
⚙️ Параметры CLI
| Флаг | По умолчанию | Описание |
|---|---|---|
--port |
8080 |
Порт HTTP-сервера |
--db |
pocketsentry.db |
Путь к файлу базы данных SQLite |
--admin-user |
"" |
Логин для защиты дашборда (пусто = отключено) |
--admin-pass |
"" |
Пароль для дашборда |
--retention-days |
30 |
Количество дней хранения логов (0 = хранить вечно) |
--checkupd |
false |
Проверить наличие новой версии на GitHub и обновиться при подтверждении |
--discord-webhook-url |
"" |
URL вебхука Discord для уведомлений об ошибках |
--tg-token |
"" |
Токен Telegram-бота для уведомлений об ошибках |
--tg-chat-id |
"" |
ID чата Telegram для уведомлений об ошибках |
🗺️ Поддержка Source Maps
PocketSentry умеет автоматически расшифровывать минифицированный JavaScript код из браузера, превращая его в читаемый исходный код с указанием реальных файлов и строк. Для этого используется максимально простой подход (без сложных загрузок через API):
- Создайте папку
sourcemapsрядом с бинарником (или примонтируйте её как Volume в Docker). - Положите туда ваши
.mapфайлы (например,main.min.js.map). - При открытии ошибки сервер автоматически найдет карту, восстановит оригинальный код и подсветит нужную строчку в красивом блоке кода прямо в UI.
Также поддерживаются переменные окружения PORT и DB_PATH (флаги имеют приоритет).
Сервер поддерживает Graceful Shutdown: нажми Ctrl+C, и он корректно завершит текущие запросы, закроет базу данных и выйдет с кодом 0.
$ ./pocketsentry --port 9090 --db /data/errors.db
___ _ _ ___ _
| _ \ ___ __ | | __ __| |_/ __| ___ _ __ | |_ _ _ _ _
| _// _ \/ _|| |/ // _| __\__ \/ _ \ '_ \| _| '_| || |
|_| \___/\__||_\_\\__|\__|___/\___/_||_|\__|_| \_, |
|__/
──────────────────────────────────────────────────
🛡️ Version : 3.2.0
🌐 Dashboard : http://localhost:9090
📦 Database : /data/errors.db
🔗 DSN : http://public@localhost:9090/1
🔓 Auth : disabled
🗑️ Retention : 30 days
──────────────────────────────────────────────────
Point your Sentry SDK to the DSN above.
Press Ctrl+C to stop.
🔨 Сборка из исходников
git clone https://github.com/apvcode/pocketsentry.git cd pocketsentry go mod tidy go build -o pocketsentry . ./pocketsentry
Требования: Go 1.22+ (без CGO, без внешних C-библиотек).
🗺️ Дорожная карта
Ближайшие планы:
- ⚡ Автоматический замер задержек через eBPF: Измерение времени ответа (p50/p90/p99) транзакций на уровне сетевого стека ядра Linux без SDK.
- 🔓 Расшифровка SSL/TLS трафика через eBPF: Перехват и трассировка защищенных соединений HTTPS с помощью eBPF uretprobes на OpenSSL и Go TLS.
✅ Выполненные задачи
- 📡 Живой стриминг логов (SSE): Динамическое отображение логов на дашборде в режиме Live Tail в реальном времени.
- 🔑 Алерты на основе логов: Мгновенная отправка алертов в Telegram/Discord при обнаружении регулярных выражений или критических событий в логах.
- 🗑️ Полная ротация и очистка логов/транзакций: Автоматическое удаление старых логов, транзакций, спанов, вложений и реплеев.
- 🔭 Поддержка OpenTelemetry OTLP: Эндпоинты (
/v1/traces,/v1/logs) для прямого приема данных от OTel Collector и SDK. - 📈 Prometheus Метрики: Встроенный эндпоинт
/metricsдля мониторинга состояния PocketSentry. - 🐳 eBPF-интеграция с Docker и K8s: Отображение реальных имен Docker-контейнеров и Kubernetes-подов на карте сети вместо сырых IP/PID.
- 🪵 Сбор сырых логов (Log Aggregation): Полноценный поиск по логам приложений (stdout/stderr) в реальном времени прямо на дашборде.
- 🎥 Воспроизведение сессий (Session Replay): Поддержка записей действий пользователей (через
rrwebв Sentry SDK) с воспроизведением «видео» прямо в деталях ошибки. - eBPF Агент (Linux): Перехват 500-х HTTP ошибок из ядра Linux без изменения кода приложения (запуск с флагом
--enable-ebpf). - Карта сети (Topology): Визуальный дашборд взаимодействия ваших Docker-контейнеров с подсветкой узких мест.
- Умные правила уведомлений: Настройка условий отправки алертов (например, отправлять уведомление только если ошибка произошла более 10 раз за 5 минут).
- Загрузка Source Maps через API: API-эндпоинт для автоматической отправки
.mapфайлов напрямую из CI/CD пайплайнов. - Аналитика задержек (Latency): Графики перцентилей (p50, p90, p99) для отслеживания деградации скорости ответа транзакций на дашборде.
- Умное группирование: Пользовательские правила на основе регулярных выражений для объединения похожих ошибок.
- Здоровье системы и БД: Графики размера базы SQLite, объема входящих запросов (RPS) и детальной статистики очистки устаревших данных.
- Поддержка вложений: Сохранение и отображение скриншотов, логов и файлов, отправленных клиентом через Sentry SDK.
- Страница детального просмотра ошибки со стектрейсом
- Политика хранения (авто-удаление старых событий)
- Аутентификация
- Управление проектами (создание/удаление)
- Поддержка Source Maps
- Docker-образ
- Экспорт данных логов (CSV)
- Умный роутинг уведомлений (разные чаты для разных проектов)
- Интерактивный Telegram-бот (кнопки решения прямо из чата)
- Поддержка Транзакций (Performance Monitoring)
- Локальные заметки (комментарии прямо на странице ошибки)
- Заглушить на время (Snooze для подавления уведомлений)
📄 Лицензия
MIT — используй, форкай, шипь.
