{"id":51974451,"url":"https://github.com/edde746/bugs","last_synced_at":"2026-07-30T03:30:26.148Z","repository":{"id":350765353,"uuid":"1208183904","full_name":"edde746/bugs","owner":"edde746","description":"Lightweight, self-hosted error tracking compatible with Sentry SDKs","archived":false,"fork":false,"pushed_at":"2026-05-31T04:29:45.000Z","size":744,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-31T05:11:07.625Z","etag":null,"topics":["error-tracking","rust","self-hosted","sentry","solidjs","sqlite"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/edde746.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-11T23:47:17.000Z","updated_at":"2026-05-31T04:29:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/edde746/bugs","commit_stats":null,"previous_names":["edde746/bugs"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/edde746/bugs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edde746%2Fbugs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edde746%2Fbugs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edde746%2Fbugs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edde746%2Fbugs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/edde746","download_url":"https://codeload.github.com/edde746/bugs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edde746%2Fbugs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36059044,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-30T02:00:05.956Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["error-tracking","rust","self-hosted","sentry","solidjs","sqlite"],"created_at":"2026-07-30T03:30:23.735Z","updated_at":"2026-07-30T03:30:26.057Z","avatar_url":"https://github.com/edde746.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bugs\n\nA lightweight, self-hosted error tracking system compatible with Sentry SDKs.\n\nBugs receives, processes, and visualizes application errors with source map support, release management, and alerting — all backed by SQLite in a single binary.\n\n## Comparison\n\nResource usage of Docker images, measured idle after startup.\n\n| | Bugs | [Rustrak](https://github.com/AbianS/rustrak) | [Bugsink](https://github.com/bugsink/bugsink) | [GlitchTip](https://gitlab.com/glitchtip/glitchtip-backend) |\n|---|---|---|---|---|\n| **Language** | Rust | Rust + Node.js | Python | Python |\n| **Database** | SQLite (embedded) | SQLite or PostgreSQL | SQLite or PostgreSQL | PostgreSQL (required) |\n| **Docker image size** | 40 MB | 443 MB | 649 MB | 1.05 GB |\n| **Idle RAM** | ~3 MB | ~68 MB | ~285 MB | ~145 MB |\n| **Total RAM (with deps)** | ~3 MB | ~100 MB | ~285 MB | ~190 MB |\n| **Containers needed** | 1 | 3 | 1 | 2+ |\n\n### Features\n\n| | Bugs | Rustrak | Bugsink | GlitchTip |\n|---|---|---|---|---|\n| **Sentry SDK compatible** | ✓ | ✓ | ✓ | ✓ |\n| **Source maps** | ✓ | ✗ | ✓ | ✓ |\n| **Releases \u0026 deploys** | ✓ | ✗ | ✓ | ✓ |\n| **Performance monitoring** | ✓ | ✗ | ✗ | ✓ |\n| **Alerts** | ✓ | ✓ | ✓ | ✓ |\n| **User feedback** | ✓ | ✗ | ✓ | ✓ |\n| **Full-text search** | ✓ | ✗ | ✓ | ✓ |\n| **Environments** | ✓ | ✓ | ✓ | ✓ |\n| **Multi-user / teams** | ✗ | ✗ | ✓ | ✓ |\n| **Uptime monitoring** | ✗ | ✗ | ✗ | ✓ |\n| **Retention policies** | ✓ | ✗ | ✓ | ✓ |\n\n## Quick start\n\n### Docker\n\n```bash\n# Using the pre-built image from GitHub Container Registry\ndocker run -p 9000:9000 -v bugs-data:/data ghcr.io/edde746/bugs:latest\n\n# Or build from source\ndocker build -t bugs .\ndocker run -p 9000:9000 -v bugs-data:/data bugs\n```\n\n### From source\n\n```bash\n# Build frontend\ncd frontend \u0026\u0026 bun install --frozen-lockfile \u0026\u0026 bun run build \u0026\u0026 cd ..\n\n# Build and run\ncargo build --release\n./target/release/bugs\n```\n\nThe UI is available at `http://localhost:9000`.\n\n## Configuration\n\nConfiguration is loaded from (highest precedence first):\n\n1. Environment variables prefixed with `BUGS_` (nested keys split by `__`)\n2. A `bugs.toml` file in the working directory\n3. Built-in defaults\n\n### Options\n\n| Variable | TOML key | Default | Description |\n|----------|----------|---------|-------------|\n| `BUGS_BIND_ADDRESS` | `bind_address` | `0.0.0.0:9000` | Listen address |\n| `BUGS_DATABASE_PATH` | `database_path` | `./data/bugs.db` | SQLite database path |\n| `BUGS_ARTIFACTS_DIR` | `artifacts_dir` | `./data/artifacts` | Release file storage |\n| `BUGS_RETENTION_DAYS` | `retention_days` | `90` | Days to keep events |\n| `BUGS_ENVELOPE_RETENTION_HOURS` | `envelope_retention_hours` | `24` | Hours to keep raw envelopes |\n| `BUGS_WORKER_THREADS` | `worker_threads` | `4` | Background processing threads |\n| `BUGS_AUTH__ADMIN_TOKEN` | `auth.admin_token` | *(empty)* | Bearer token for management API |\n\n### SQLite tuning\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `BUGS_SQLITE__SYNCHRONOUS` | `NORMAL` | SQLite synchronous mode |\n| `BUGS_SQLITE__CACHE_SIZE_MB` | `64` | Page cache size |\n| `BUGS_SQLITE__READER_CONNECTIONS` | `8` | Read connection pool size |\n| `BUGS_SQLITE__MMAP_SIZE_MB` | `256` | Memory-mapped I/O size |\n| `BUGS_SQLITE__CHECKPOINT_INTERVAL_BATCHES` | `10` | WAL checkpoint frequency |\n\n### Ingest limits\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `BUGS_INGEST__MAX_RAW_REQUEST_BYTES` | `20 MB` | Max raw request body |\n| `BUGS_INGEST__MAX_ENVELOPE_BYTES` | `10 MB` | Max decompressed envelope |\n| `BUGS_INGEST__MAX_EVENT_ITEM_BYTES` | `1 MB` | Max single event item |\n| `BUGS_INGEST__MAX_ITEMS_PER_ENVELOPE` | `100` | Max items per envelope |\n\n### Admin upload limits\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `BUGS_UPLOADS__MAX_BYTES` | `2 GB` | Max size for admin-authenticated uploads (dSYMs, release artifacts) |\n| `BUGS_UPLOADS__CHUNK_RETENTION_HOURS` | `12` | Hours to keep chunk-upload blobs after last use; active uploads refresh this TTL |\n\n## Authentication\n\n### Admin API\n\nSet `BUGS_AUTH__ADMIN_TOKEN` to secure the management API and web UI. Requests must include `Authorization: Bearer \u003ctoken\u003e`. The web UI will show a login page when auth is enabled. If no token is configured, the management API is open — a warning is logged at startup.\n\n### Ingest\n\nIngest endpoints authenticate via Sentry DSN keys. Create a project in the UI to get a DSN, then configure your Sentry SDK with it.\n\n## Sentry SDK integration\n\nPoint any Sentry SDK at your Bugs instance:\n\n```javascript\nSentry.init({\n  dsn: \"http://\u003cpublic_key\u003e@\u003cbugs-host\u003e:9000/\u003cproject_id\u003e\",\n});\n```\n\nThe DSN is shown in project settings after creating a project.\n\n## Database migrations\n\nSchema changes live in `migrations/` as numbered SQL files. They are applied once in order on startup and tracked in the `_migrations` table.\n\nThe migration runner is **forward-only** — there is no rollback mechanism and no down migrations. To change an existing schema object, add a new migration that performs the alteration (SQLite often requires the full table-rebuild pattern: new table, `INSERT SELECT`, drop, rename; see `014_event_tags_project_fk.sql`). Don't edit files that have already been released.\n\n## Development\n\n```bash\n# Backend (auto-reloads with cargo-watch)\ncargo watch -x run\n\n# Frontend dev server (proxies /api to localhost:9000)\ncd frontend \u0026\u0026 bun run dev\n```\n\n## Production Docker Compose\n\n```yaml\nservices:\n  bugs:\n    image: ghcr.io/edde746/bugs:latest\n    restart: unless-stopped\n    ports:\n      - \"9000:9000\"\n    volumes:\n      - bugs-data:/data\n    environment:\n      BUGS_AUTH__ADMIN_TOKEN: \"change-me-to-a-secret-token\"\n      BUGS_RETENTION_DAYS: \"90\"\n\nvolumes:\n  bugs-data:\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedde746%2Fbugs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedde746%2Fbugs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedde746%2Fbugs/lists"}