This commit is contained in:
Stefanescu Mihai
2026-03-19 19:29:20 +02:00
parent 70c3270a45
commit 2673552733
+85 -72
View File
@@ -10,18 +10,24 @@ A self-hosted error tracking application (inspired by [Bugsink](https://www.bugs
| Database | SQLite (dev), easily swappable to Postgres/MySQL | | Database | SQLite (dev), easily swappable to Postgres/MySQL |
| Frontend | Blade + Tailwind CSS 4 + Vite 8 | | Frontend | Blade + Tailwind CSS 4 + Vite 8 |
| Queue | Database driver (upgrade to Redis for production) | | Queue | Database driver (upgrade to Redis for production) |
| Auth | Laravel Breeze (to be installed) | | Auth | Laravel Breeze (installed) |
--- ---
## Phase 1 — Foundation & Auth ## Phase 1 — Foundation & Auth
### 1.1 Install Auth Scaffolding ### 1.1 Install Auth Scaffolding
- Install Laravel Breeze (Blade + Tailwind stack) for login, registration, password reset, email verification. - [x] Install Laravel Breeze (Blade + Tailwind stack) for login, registration, password reset, email verification.
- This gives us the authenticated layout, middleware, and user management out of the box. - [x] Authenticated layout, middleware, and user management.
### 1.2 Core Data Models & Migrations ### 1.2 Core Data Models & Migrations
- [x] `projects` migration & `Project` model
- [x] `project_user` pivot migration
- [x] `issues` migration & `Issue` model
- [x] `events` migration & `Event` model
- [x] `User` model updated with `projects()` and `ownedProjects()` relationships
#### `projects` table #### `projects` table
| Column | Type | Notes | | Column | Type | Notes |
|--------|------|-------| |--------|------|-------|
@@ -89,13 +95,18 @@ A self-hosted error tracking application (inspired by [Bugsink](https://www.bugs
Implement a `/api/{project_id}/store/` endpoint that accepts the Sentry event payload format. This allows using existing Sentry SDKs (for PHP, JS, Python, etc.) as clients without any custom SDK work. Implement a `/api/{project_id}/store/` endpoint that accepts the Sentry event payload format. This allows using existing Sentry SDKs (for PHP, JS, Python, etc.) as clients without any custom SDK work.
- **Route:** `POST /api/{project_id}/store/` - [ ] `POST /api/{project_id}/store/` route
- **Auth:** Validate DSN public key via `sentry_key` query param or `X-Sentry-Auth` header. - [ ] Validate DSN public key via `sentry_key` query param or `X-Sentry-Auth` header
- **Rate limiting:** Per-project throttle (e.g. 100 events/minute). - [ ] `AuthenticateDsn` middleware
- **No user auth required** — this is an SDK-to-server API. - [ ] `EventIngestController`
### 2.2 Event Processing Pipeline ### 2.2 Event Processing Pipeline
- [ ] `ProcessEventJob` (queued)
- [ ] `PayloadNormalizer` service
- [ ] `EventProcessor` service (find or create Issue, store Event, update counters)
- [ ] Regression detection (re-open resolved issues)
``` ```
Ingest Request Ingest Request
→ Authenticate DSN key → Authenticate DSN key
@@ -111,6 +122,8 @@ Ingest Request
### 2.3 Fingerprinting / Grouping Strategy ### 2.3 Fingerprinting / Grouping Strategy
- [ ] `Fingerprinter` service
Group events into issues using a fingerprint hash built from: Group events into issues using a fingerprint hash built from:
1. Exception type (class name) 1. Exception type (class name)
2. Exception message (with variable parts stripped, e.g. IDs, numbers) 2. Exception message (with variable parts stripped, e.g. IDs, numbers)
@@ -132,45 +145,45 @@ Clients configure this DSN in their Sentry SDK — no changes needed on the SDK
### 3.1 Layouts & Navigation ### 3.1 Layouts & Navigation
- Authenticated layout with sidebar navigation. - [ ] Authenticated layout with sidebar navigation
- Global project switcher in the sidebar/topbar. - [ ] Global project switcher in the sidebar/topbar
- Sections: **Issues**, **Project Settings**, **Team Members**. - [ ] Sections: **Issues**, **Project Settings**, **Team Members**
### 3.2 Issues List Page (`/projects/{project}/issues`) ### 3.2 Issues List Page (`/projects/{project}/issues`)
- Table/list of issues sorted by last seen (most recent first). - [ ] Table/list of issues sorted by last seen (most recent first)
- Columns: status badge, title, culprit, event count sparkline, times seen, last seen. - [ ] Columns: status badge, title, culprit, event count sparkline, times seen, last seen
- Filters: status (unresolved/resolved/ignored), level, environment, date range. - [ ] Filters: status (unresolved/resolved/ignored), level, environment, date range
- Search: full-text search on title and culprit. - [ ] Search: full-text search on title and culprit
- Bulk actions: resolve, ignore, mute, delete. - [ ] Bulk actions: resolve, ignore, mute, delete
- Pagination (cursor-based for performance). - [ ] Pagination (cursor-based for performance)
### 3.3 Issue Detail Page (`/projects/{project}/issues/{issue}`) ### 3.3 Issue Detail Page (`/projects/{project}/issues/{issue}`)
- Header: title, status controls (resolve / ignore / unresolve), level badge, first/last seen, times seen. - [ ] Header: title, status controls (resolve / ignore / unresolve), level badge, first/last seen, times seen
- **Stacktrace viewer:** collapsible frames, source context (if available), highlighted app frames vs vendor frames. - [ ] **Stacktrace viewer:** collapsible frames, source context (if available), highlighted app frames vs vendor frames
- **Breadcrumbs timeline:** chronological list of breadcrumb entries. - [ ] **Breadcrumbs timeline:** chronological list of breadcrumb entries
- **Tags panel:** key-value tag list with links to filter by tag. - [ ] **Tags panel:** key-value tag list with links to filter by tag
- **Context panels:** device, OS, browser, runtime, user info, request details. - [ ] **Context panels:** device, OS, browser, runtime, user info, request details
- **Events sub-list:** paginated list of individual occurrences with ability to view each one. - [ ] **Events sub-list:** paginated list of individual occurrences with ability to view each one
- **Activity:** timeline of status changes (resolved, regressed, etc.). - [ ] **Activity:** timeline of status changes (resolved, regressed, etc.)
### 3.4 Event Detail Page (`/projects/{project}/issues/{issue}/events/{event}`) ### 3.4 Event Detail Page (`/projects/{project}/issues/{issue}/events/{event}`)
- Full event data: raw JSON viewer + structured panels. - [ ] Full event data: raw JSON viewer + structured panels
- Navigation: previous/next event within the issue. - [ ] Navigation: previous/next event within the issue
### 3.5 Project Settings Page ### 3.5 Project Settings Page
- Rename project, change platform. - [ ] Rename project, change platform
- DSN display with copy button. - [ ] DSN display with copy button
- Regenerate keys. - [ ] Regenerate keys
- Delete project (with confirmation). - [ ] Delete project (with confirmation)
### 3.6 Dashboard / Overview Page ### 3.6 Dashboard / Overview Page
- Summary cards: total unresolved issues, events in last 24h, most active projects. - [ ] Summary cards: total unresolved issues, events in last 24h, most active projects
- Line chart: events over time (last 7/14/30 days). - [ ] Line chart: events over time (last 7/14/30 days)
--- ---
@@ -178,14 +191,14 @@ Clients configure this DSN in their Sentry SDK — no changes needed on the SDK
### 4.1 Notification Channels ### 4.1 Notification Channels
- **Email:** on first occurrence of a new issue (not on every event). - [ ] **Email:** on first occurrence of a new issue (not on every event)
- **Database (in-app):** notification bell with unread count. - [ ] **Database (in-app):** notification bell with unread count
- Extensible to Slack/webhooks later. - [ ] Extensible to Slack/webhooks later
### 4.2 Alert Rules (per project) ### 4.2 Alert Rules (per project)
- Notify on: new issue, regression, spike (N events in M minutes). - [ ] Notify on: new issue, regression, spike (N events in M minutes)
- Per-user mute controls. - [ ] Per-user mute controls
--- ---
@@ -193,68 +206,68 @@ Clients configure this DSN in their Sentry SDK — no changes needed on the SDK
### 5.1 Release Tracking ### 5.1 Release Tracking
- Parse `release` field from events. - [ ] Parse `release` field from events
- Show which release introduced an issue. - [ ] Show which release introduced an issue
- Mark issues as resolved-in-release; auto-regress if they appear in a newer release. - [ ] Mark issues as resolved-in-release; auto-regress if they appear in a newer release
### 5.2 Environment Filtering ### 5.2 Environment Filtering
- Global environment selector (production / staging / etc.). - [ ] Global environment selector (production / staging / etc.)
- Filter issues and events by environment. - [ ] Filter issues and events by environment
### 5.3 Retention & Cleanup ### 5.3 Retention & Cleanup
- Artisan command / scheduled job to delete events older than N days (configurable). - [ ] Artisan command / scheduled job to delete events older than N days (configurable)
- Keep issue summaries even after events are pruned. - [ ] Keep issue summaries even after events are pruned
### 5.4 Source Maps / Source Context (optional, stretch) ### 5.4 Source Maps / Source Context (optional, stretch)
- Upload source maps for JS projects. - [ ] Upload source maps for JS projects
- Store and display source context lines around each stacktrace frame. - [ ] Store and display source context lines around each stacktrace frame
### 5.5 API Tokens & External API ### 5.5 API Tokens & External API
- Personal API tokens for programmatic access. - [ ] Personal API tokens for programmatic access
- REST API for listing/resolving issues (useful for CI/CD integrations). - [ ] REST API for listing/resolving issues (useful for CI/CD integrations)
--- ---
## Implementation Order & Milestones ## Implementation Order & Milestones
### Milestone 1 — MVP (walking skeleton) ### Milestone 1 — MVP (walking skeleton)
1. Install Breeze, set up auth. - [x] 1. Install Breeze, set up auth
2. Create migrations for `projects`, `issues`, `events`, `project_user`. - [x] 2. Create migrations for `projects`, `issues`, `events`, `project_user`
3. Build models with relationships. - [x] 3. Build models with relationships
4. Build the ingest endpoint (`POST /api/{project_id}/store/`). - [ ] 4. Build the ingest endpoint (`POST /api/{project_id}/store/`)
5. Implement fingerprinting and the `ProcessEventJob`. - [ ] 5. Implement fingerprinting and the `ProcessEventJob`
6. Build a minimal issues list page and issue detail page. - [ ] 6. Build a minimal issues list page and issue detail page
7. Test with a real Sentry SDK (e.g. `sentry/sentry-laravel` on another app pointing at this tracker). - [ ] 7. Test with a real Sentry SDK (e.g. `sentry/sentry-laravel` on another app pointing at this tracker)
### Milestone 2 — Usable product ### Milestone 2 — Usable product
8. Project CRUD and settings pages. - [ ] 8. Project CRUD and settings pages
9. Team/member management (invite users to projects). - [ ] 9. Team/member management (invite users to projects)
10. Stacktrace viewer with collapsible frames. - [ ] 10. Stacktrace viewer with collapsible frames
11. Breadcrumbs, tags, context panels on issue detail. - [ ] 11. Breadcrumbs, tags, context panels on issue detail
12. Filters, search, bulk actions on issues list. - [ ] 12. Filters, search, bulk actions on issues list
13. Status management (resolve, ignore, mute, auto-regression detection). - [ ] 13. Status management (resolve, ignore, mute, auto-regression detection)
### Milestone 3 — Notifications & dashboard ### Milestone 3 — Notifications & dashboard
14. Email notifications on new issue / regression. - [ ] 14. Email notifications on new issue / regression
15. In-app notification system. - [ ] 15. In-app notification system
16. Overview dashboard with charts (events over time). - [ ] 16. Overview dashboard with charts (events over time)
### Milestone 4 — Production-readiness ### Milestone 4 — Production-readiness
17. Rate limiting on ingest. - [ ] 17. Rate limiting on ingest
18. Event retention / cleanup scheduler. - [ ] 18. Event retention / cleanup scheduler
19. Release tracking. - [ ] 19. Release tracking
20. Environment filtering. - [ ] 20. Environment filtering
21. Performance optimization (indexes, query tuning, caching). - [ ] 21. Performance optimization (indexes, query tuning, caching)
### Milestone 5 — Advanced (stretch) ### Milestone 5 — Advanced (stretch)
22. Source map upload & processing. - [ ] 22. Source map upload & processing
23. API tokens & external REST API. - [ ] 23. API tokens & external REST API
24. Webhook / Slack notifications. - [ ] 24. Webhook / Slack notifications
25. CQRS-style read models for heavy dashboards (if needed). - [ ] 25. CQRS-style read models for heavy dashboards (if needed)
--- ---