commits
* refactor: report-templates to guides
* fix: cmdk search
* chore: add vercel skills
* chore: add hono skill
* chore: more skills
* chore: copywriting skills
* feat(proto): add status page service proto definitions
Add Protocol Buffer definitions for the status page service including:
- StatusPage and StatusPageSummary messages
- PageComponent and PageComponentGroup messages
- PageSubscriber message
- Full CRUD service definition with 17 RPC methods
* feat(server): implement status page RPC service
Add ConnectRPC service implementation for status pages including:
- Page CRUD operations (create, get, list, update, delete)
- Component management (add monitor/external, remove, update)
- Component groups (create, delete, update)
- Subscriber management (subscribe, unsubscribe, list)
- Content and status endpoints (getStatusPageContent, getOverallStatus)
Includes converters, error handling, and comprehensive test suite with 68 tests.
* feat(server): add workspace limits check for status pages
Add limit validation when creating status pages:
- Check status page count against workspace plan limit
- Add helper functions for feature limits (custom domain, password protection, email domain protection)
- Add test case for limit exceeded scenario using free plan workspace
* refactor(proto): rename token to id in UnsubscribeFromPageRequest
- Rename 'token' field to 'id' in the proto definition
- Update server implementation to use subscriber ID instead of token
- Update tests to use the new field name
* fix(server): improve code quality in status page service
- Fix type mismatch by removing redundant undefined assignment
- Use Drizzle's count() function instead of raw SQL
- Standardize ID validation with trim pattern
- Fix duplicate ternary expressions in error messages
- Wrap subscriber reactivation in transaction for atomicity
- Standardize string coercion patterns using nullish coalescing
* feat(server): add public access validation and maintenance support
- Add public access checks for unpublished and protected pages
- Implement maintenance querying in getStatusPageContent
- Add proper overall status calculation based on reports and maintenances
- Calculate individual component statuses (degraded/maintenance/operational)
- Add new error types for access denied scenarios
- Add tests for public access restrictions
* small fix
* small fix
* chore: clean up
* chore: clean up
* chore: more clean up
* refactor: external to static page component type
* fix: tsc
* fix: sync
* chore: form-components
* refactor: move configuration to page components
* fix: nullable
* fix: tsc
* chore: constraint db migration
* chore: events
* chore: third-party
* chore: add warning on component removal
* chore: add docs
* chore: remove migration note
* chore: introduction page components blog post
* fix: tsc
* chore: add pricing section
* fix: image layout shift
* fix: image dimensions
* fix: missing suspense fallback
* chore: report template content
* fix: metadata base path
* chore: clean up
* chore: clean up
* chore: more clean up
* refactor: external to static page component type
* fix: tsc
* fix: sync
* chore: form-components
* refactor: move configuration to page components
* fix: nullable
* fix: tsc
* chore: constraint db migration
* chore: events
* chore: third-party
* chore: add warning on component removal
* chore: add docs
* chore: remove migration note
* fix: logger
* refactor: migrate getPageBySlug to statusPage router with pageComponents
Move `getPageBySlug` from page router to statusPage router and refactor
to use the modern pageComponents architecture with a single database query.
Changes:
- Add `selectPublicPageLightSchemaWithRelation` schema with pageComponents support
- Implement `statusPage.getPageBySlug` procedure with optimized single query
- Deprecate `page.getPageBySlug` with JSDoc notice
- Update consumers (feed routes, OG image) to use new procedure
- Add comprehensive tests for pageComponents architecture
- Maintain backwards compatibility with legacy monitors array
Performance: Reduces 7 DB queries to 1 query (~50-60% faster)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* chore: remove test
* fix: test
* chore: public status
* fix: tests
* ci: apply automated fixes
* chore: add limits
* chore: product page
* chore: clean up
* ci: apply automated fixes
* fix: unsubscribed users
* fix: missing components in pricing
---------
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Remove unused and deprecated dependencies
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
* Remove unnecessary packages from email
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
* Updated pnpm
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
---------
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
* small fix
* ci: apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* docs: add status report proto implementation plan
Add PLAN.md documenting the design for StatusReportService RPC with:
- CRUD operations (Create, Get, List, Update, Delete)
- AddStatusReportUpdate for timeline entries
- Message definitions following existing patterns
- Offset-based pagination and status filtering
* feat(proto): add status report service proto definitions
Add protobuf definitions for StatusReportService with:
- StatusReportStatus enum (investigating, identified, monitoring, resolved)
- StatusReport, StatusReportSummary, StatusReportUpdate messages
- 6 RPC methods: Create, Get, List, Update, Delete, AddUpdate
- buf.validate rules for request validation
- Generated TypeScript bindings and package exports
* feat(server): implement status report RPC handler
Add StatusReportService implementation following monitor handler pattern:
- CreateStatusReport with initial update and page component associations
- GetStatusReport with full update timeline
- ListStatusReports with offset pagination and status filtering
- UpdateStatusReport for metadata changes (title, page components)
- DeleteStatusReport with cascade delete
- AddStatusReportUpdate for timeline entries
- Error helpers and DB-to-proto converters
* test(server): add status report RPC handler tests
Add comprehensive test coverage for StatusReportService:
- 25 tests covering all 6 RPC methods
- Authentication and authorization tests
- Workspace isolation verification
- Pagination and filtering tests
- Input validation error cases
* ci: apply automated fixes
* feat(proto): add pageId field to CreateStatusReport
- Add required pageId field to CreateStatusReportRequest proto
- Make pageComponentIds field optional (was required)
- Update handler to use pageId directly from request
- Update tests to include pageId in requests
* remove .claude
* ci: apply automated fixes
* refactor(status-report): wrap database operations in transactions
Ensure atomicity for create, update, and add-update operations by using
database transactions. This prevents partial writes if any step fails.
* implement pr review
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* feat(proto): add Update*Monitor RPC definitions for partial updates
Add proto definitions for UpdateHTTPMonitor, UpdateTCPMonitor, and
UpdateDNSMonitor RPCs that support partial updates with optional
nested monitor fields.
* feat(rpc): implement update methods for HTTP, TCP, and DNS monitors
Add UpdateHTTPMonitor, UpdateTCPMonitor, and UpdateDNSMonitor RPC
procedures that support partial updates - only provided fields are
changed while preserving existing values.
- Add getCommonDbValuesForUpdate helper for partial update field extraction
- Add error types: MONITOR_UPDATE_FAILED, MONITOR_TYPE_MISMATCH, MONITOR_ID_REQUIRED
- Skip protovalidate for update methods to allow optional nested fields
- Verify monitor type matches the update method being called
- Add comprehensive tests for all update scenarios
* improve typing
* plan mode
* proto
* ci: apply automated fixes
* improve api
* ci: apply automated fixes
* fix build
* something
* use rpc
* ci: apply automated fixes
* improve api
* :proper api
* vibing
* ci: apply automated fixes
* refactor: extract monitor utilities into separate module
Extract shared monitor utility functions (buildRegions, buildAssertions, etc.)
into a dedicated monitor-utils.ts file. Reorganize monitor.ts to use these
utilities and add new tests for monitor RPC handlers.
* feat: enhance proto definitions with validation and new monitor fields
- Add buf validation dependency and interceptor for gRPC validation
- Expand HTTP monitor proto with timing, TLS, response headers, and assertions
- Add DNS and TCP monitor proto improvements with validation rules
- Regenerate TypeScript protobuf types with updated field mappings
* feat: add create and update monitor support for all monitor types
- Implement createDnsMonitor and createTcpMonitor utility functions
- Add updateHttpMonitor, updateDnsMonitor, and updateTcpMonitor handlers
- Reorganize proto definitions with separate Create/Update request messages
- Regenerate TypeScript types with cleaner nested message structures
* docs: add proto field documentation for monitor types
Add descriptive comments to DNS, HTTP, and TCP monitor proto fields
explaining their purpose and expected values.
* refactor: rename GEMINI.md to CLAUDE.md and improve monitor handlers
- Rename AI instructions file from GEMINI.md to CLAUDE.md
- Refactor monitor-utils.ts for better code organization
- Enhance monitor.ts with improved error handling and type safety
- Add comprehensive tests for monitor RPC handlers
* test: update monitor RPC handler tests
Refactor and improve test assertions for monitor RPC handlers.
Update CLAUDE.md with additional project instructions.
* test: add database reset utility and improve API test isolation
- Add reset-db.ts utility for cleaning database state between tests
- Update bunfig.toml with test configuration
- Enhance test files across v1 API routes to use database reset
- Improve test isolation for monitors, maintenances, notifications,
pages, pageSubscribers, and statusReports endpoints
* chore: lint
* ci: apply automated fixes
* chore: lint
* chore: lint
* ci: apply automated fixes
* fix
* fix: bug pr
* ci: apply automated fixes
* chore: improve logging
* api improvment
* Add active field to DNS, HTTP, and TCP monitor protos
* Add CreateMonitor RPC handler with tests
* Refactor RPC handlers into services structure with converters
* Refactor assertions converter
* Add GetMonitor RPC endpoint with tests
* Add ListMonitors and DeleteMonitor RPC endpoints
* ci: apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* feat: page-components dashboard page
* fix: description
* chore: disable external components
* fix: monitor description
* fix: upsert component instead of delete and recreate
* chore: update status-page note
* chore: reverse sync
* fix: sync only active monitors
* fix: devin review
* fix: typo
* fix: typo
* feat: page-components tracker statuspage
* fix: filter
* fix: unused var
* fix: status-banner prefix link
* chore: clean up legacy trpc calls
* fix: test and imports
* feat: page-components status report emails
* fix: trpc router
* feat: page-components status-page feed
* fix: wrong zod schema field
* fix: relation
* chore: add tests
Co-authored-by: Maximilian Kaske <mxkaske@Mac.fritz.box>
* feat: page-components api
* fix: test
* fix: seed
* chore: more tests
* fix: reset status report affected monitors on reorder
* fix: group error
* feat: page-components status-page
* fix: status page and maintenance to monitor transformation
* chore: apply zod schema on noop
* feat: page-components status-report and maintenance
* fix: typo
* fix: sync test
* fix: column badge link
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* feat: page-components status-page
* fix: status page and maintenance to monitor transformation
* chore: apply zod schema on noop
* chore: review updates
* Revert " chore: review updates"
This reverts commit 4ba6fcb430d02a890578009cdb5d645d10fda360.
* fix: nullable groupOrder
* chore: review updates
* feat: status-banner last update display
* chore: remove dot
* chore: dot separator
* Update router referesh
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
* Update status report to client component
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
* ci: apply automated fixes
* fix: invalide queries
* fix: build
* fix: build
* chore: comments
---------
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Maximilian Kaske <maximilian@kaske.org>
Co-authored-by: Maximilian Kaske <56969857+mxkaske@users.noreply.github.com>
* fix: checker update status missing latency
* fix: typo
* fix: undefined res
* feat: add @openstatus/notification-base package
Create shared types and utilities for notification providers:
- NotificationContext, FormattedMessageData types
- formatDuration() for human-readable duration formatting
- formatTimestamp() using date-fns for consistent time display
- getIncidentDuration() for calculating resolved incident durations
- buildCommonMessageData() for centralized message formatting
- formatStatusCode() with HTTP status descriptions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: update alerting to fetch and pass incident data to notification providers
- Add logic to fetch incident by ID for recovery/degraded notifications in alerting.ts
- Update SendNotification type signature to use incident?: Incident instead of incidentId?: string
- Update all 11 notification providers to accept incident?: Incident parameter
- Providers using incidentId for dedup keys (opsgenie, pagerduty) now use incident?.id
- Incident is only fetched when notifType is recovery/degraded and incidentId is present
- Add error handling for failed incident fetches (logs warning, doesn't block notification)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: add Slack block builder utilities for enhanced notifications
Create block builder functions for Slack notifications with rich formatting:
- escapeSlackText() for safe mrkdwn escaping
- buildAlertBlocks() with header, monitor link, 4-field grid, error code block, dashboard button
- buildRecoveryBlocks() with optional downtime duration display
- buildDegradedBlocks() with optional previous incident duration
Add @openstatus/notification-base dependency to Slack package.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: update Slack provider to use enhanced blocks and incident data
- Import buildCommonMessageData from @openstatus/notification-base
- Import block builders (buildAlertBlocks, buildRecoveryBlocks, buildDegradedBlocks)
- Update sendAlert to use buildCommonMessageData and buildAlertBlocks
- Update sendRecovery to pass incident for duration calculation
- Update sendDegraded to pass incident for duration calculation
- Rich Slack notifications now include formatted fields, error blocks, and dashboard buttons
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: add Discord embed builder utilities for enhanced notifications
Add Discord embed builders that create rich embed messages with proper
formatting including colored embeds, inline fields, markdown links, and
incident duration tracking.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: update Discord provider to use enhanced embeds and incident data
- Import buildCommonMessageData from @openstatus/notification-base
- Import embed builders from ./embeds
- Update postToWebhook to accept embeds array instead of plain content
- Update sendAlert to build context, call buildCommonMessageData and buildAlertEmbed
- Update sendRecovery to pass incident for duration calculation
- Update sendDegraded to pass incident for duration calculation
- Update sendTestDiscordMessage to use embed format
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: mark duration formatting tests task as complete
The unit tests for duration formatting already exist in
packages/notification-base/src/utils/duration.test.ts with
complete coverage of all required test cases.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test: add unit tests for incident duration calculation
Add comprehensive unit tests for getIncidentDuration() utility function,
covering null cases, resolved incidents, different time formats, and
edge cases.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: verify package dependencies and workspace configuration
Verified that the @openstatus/notification-base package is properly
integrated into the monorepo workspace. All workspace dependencies
are correctly linked and imports work as expected.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: verify backward compatibility for all notification providers
- Applied biome formatting fixes to all 11 notification provider files
- Applied biome formatting fixes to notification-base utility files
- Verified all providers have incident?: Incident optional parameter
- Confirmed all providers compile and lint successfully
- Updated PRD to mark backward compatibility task as complete
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: verify all notification providers have the newly created utils/types
- Verified Slack and Discord providers fully integrate with @openstatus/notification-base
- Confirmed all 11 providers have consistent function signatures with incident?: Incident
- Documented which providers use notification-base and rationale for those that don't
- Fixed biome formatting issue in types.ts (import sorting)
- Updated progress.txt with comprehensive verification summary
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: verify implementation follows official Slack and Discord documentation
- Verified Slack Block Kit best practices (mrkdwn/plain_text types, emoji, escaping)
- Verified Discord embed guidelines (ISO 8601 timestamps, decimal colors, inline fields)
- Fixed trailing comma formatting issues in blocks.ts and embeds.ts (biome)
- Updated PRD task to passes: true
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* perf: verify database query performance for incident fetching
Verified that the incident fetching in alerting.ts:
- Uses primary key lookup on incidentTable.id (O(log n), <1ms)
- Only runs for recovery/degraded notifications, not alerts
- Gracefully handles missing incidents (continues with undefined)
- Catches and logs errors without blocking notifications
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: format and pnpm lock
* chore: examples
* wip:
* refactor: package location
* fix: incident id
* fix: dockerfile
* fix: remove ralph files
* fix: packages
* fix: opsgenie test
* fix: dofigen
* fix: test alerts
* fix: test
* fix: review
* fix: remove action
* fix: send dashboard test
* fix: review
* chore: dedupe key
* fix: color grading
* fix: review
* chore: docs logo asset
* fix: color test
* fix: degraded
* chore: minor stuff
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* chore: read more event timeline link
* fix: id
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* ci: apply automated fixes
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* feat(workflows): add incident cleanup endpoint to auto-resolve stale incidents
Add /incident/cleanup endpoint that finds active monitors with unresolved
incidents and automatically resolves them by setting resolvedAt and
autoResolved=true.
* refactor(checker): extract incident helpers for findOpenIncident and resolveIncident
- Add findOpenIncident() to query open incidents by monitorId
- Add resolveIncident() to handle incident resolution with logging and audit
- Replace duplicated incident query and resolution code with helper calls
- Fix typo: change 'return' to 'break' in error case
- Remove redundant monitor status update in error handling
* ci: apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* improve logging
* trying it
* fixing bug
* claude vibing
* ci: apply automated fixes
claude vibing
* claude vibing
* ci: apply automated fixes
* me crying
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* improve private-location :
* some change
* add tcp monitor
* add dns monitor
* add tests
* add logging to private-regions app
* Update apps/private-location/internal/server/routes.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update apps/private-location/internal/server/server.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update apps/private-location/internal/server/routes.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update apps/private-location/internal/server/routes.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix it
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This reverts commit e90079b5aa0ef8fb3300ba18e7191b30b2476ed9.
* "Claude PR Assistant workflow"
* "Claude Code Review workflow"
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* only allow claude tagging
---------
Co-authored-by: Thibault Le Ouay <thibaultleouay@gmail.Com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Initial plan
* Add external_name field to Monitor struct in models.go
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
* Add external_name field to Monitor struct in Go models
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
* Initial plan
* Add GitHub workflow for deploying private-location app
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
* Add explicit permissions to deploy-private-location workflow
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
* try loggingsucks
* ci: apply automated fixes
* try loggingsucks
* ci: apply automated fixes
* trying loging sucks
* upgrade logtap
* ci: apply automated fixes
* fix test
* improve logging
* improve logging
* ci: apply automated fixes
* improve logging
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* fix(docker): update Dockerfile to install curl for health check
* use dofigen
---------
Co-authored-by: Thibault Le Ouay <thibaultleouay@gmail.com>
* feat(proto): add status page service proto definitions
Add Protocol Buffer definitions for the status page service including:
- StatusPage and StatusPageSummary messages
- PageComponent and PageComponentGroup messages
- PageSubscriber message
- Full CRUD service definition with 17 RPC methods
* feat(server): implement status page RPC service
Add ConnectRPC service implementation for status pages including:
- Page CRUD operations (create, get, list, update, delete)
- Component management (add monitor/external, remove, update)
- Component groups (create, delete, update)
- Subscriber management (subscribe, unsubscribe, list)
- Content and status endpoints (getStatusPageContent, getOverallStatus)
Includes converters, error handling, and comprehensive test suite with 68 tests.
* feat(server): add workspace limits check for status pages
Add limit validation when creating status pages:
- Check status page count against workspace plan limit
- Add helper functions for feature limits (custom domain, password protection, email domain protection)
- Add test case for limit exceeded scenario using free plan workspace
* refactor(proto): rename token to id in UnsubscribeFromPageRequest
- Rename 'token' field to 'id' in the proto definition
- Update server implementation to use subscriber ID instead of token
- Update tests to use the new field name
* fix(server): improve code quality in status page service
- Fix type mismatch by removing redundant undefined assignment
- Use Drizzle's count() function instead of raw SQL
- Standardize ID validation with trim pattern
- Fix duplicate ternary expressions in error messages
- Wrap subscriber reactivation in transaction for atomicity
- Standardize string coercion patterns using nullish coalescing
* feat(server): add public access validation and maintenance support
- Add public access checks for unpublished and protected pages
- Implement maintenance querying in getStatusPageContent
- Add proper overall status calculation based on reports and maintenances
- Calculate individual component statuses (degraded/maintenance/operational)
- Add new error types for access denied scenarios
- Add tests for public access restrictions
* small fix
* small fix
* chore: clean up
* chore: clean up
* chore: more clean up
* refactor: external to static page component type
* fix: tsc
* fix: sync
* chore: form-components
* refactor: move configuration to page components
* fix: nullable
* fix: tsc
* chore: constraint db migration
* chore: events
* chore: third-party
* chore: add warning on component removal
* chore: add docs
* chore: remove migration note
* chore: introduction page components blog post
* fix: tsc
* chore: add pricing section
* chore: clean up
* chore: clean up
* chore: more clean up
* refactor: external to static page component type
* fix: tsc
* fix: sync
* chore: form-components
* refactor: move configuration to page components
* fix: nullable
* fix: tsc
* chore: constraint db migration
* chore: events
* chore: third-party
* chore: add warning on component removal
* chore: add docs
* chore: remove migration note
* fix: logger
* refactor: migrate getPageBySlug to statusPage router with pageComponents
Move `getPageBySlug` from page router to statusPage router and refactor
to use the modern pageComponents architecture with a single database query.
Changes:
- Add `selectPublicPageLightSchemaWithRelation` schema with pageComponents support
- Implement `statusPage.getPageBySlug` procedure with optimized single query
- Deprecate `page.getPageBySlug` with JSDoc notice
- Update consumers (feed routes, OG image) to use new procedure
- Add comprehensive tests for pageComponents architecture
- Maintain backwards compatibility with legacy monitors array
Performance: Reduces 7 DB queries to 1 query (~50-60% faster)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* chore: remove test
* fix: test
* chore: public status
* fix: tests
* ci: apply automated fixes
* chore: add limits
* chore: product page
* chore: clean up
* ci: apply automated fixes
* fix: unsubscribed users
* fix: missing components in pricing
---------
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Remove unused and deprecated dependencies
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
* Remove unnecessary packages from email
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
* Updated pnpm
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
---------
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
* docs: add status report proto implementation plan
Add PLAN.md documenting the design for StatusReportService RPC with:
- CRUD operations (Create, Get, List, Update, Delete)
- AddStatusReportUpdate for timeline entries
- Message definitions following existing patterns
- Offset-based pagination and status filtering
* feat(proto): add status report service proto definitions
Add protobuf definitions for StatusReportService with:
- StatusReportStatus enum (investigating, identified, monitoring, resolved)
- StatusReport, StatusReportSummary, StatusReportUpdate messages
- 6 RPC methods: Create, Get, List, Update, Delete, AddUpdate
- buf.validate rules for request validation
- Generated TypeScript bindings and package exports
* feat(server): implement status report RPC handler
Add StatusReportService implementation following monitor handler pattern:
- CreateStatusReport with initial update and page component associations
- GetStatusReport with full update timeline
- ListStatusReports with offset pagination and status filtering
- UpdateStatusReport for metadata changes (title, page components)
- DeleteStatusReport with cascade delete
- AddStatusReportUpdate for timeline entries
- Error helpers and DB-to-proto converters
* test(server): add status report RPC handler tests
Add comprehensive test coverage for StatusReportService:
- 25 tests covering all 6 RPC methods
- Authentication and authorization tests
- Workspace isolation verification
- Pagination and filtering tests
- Input validation error cases
* ci: apply automated fixes
* feat(proto): add pageId field to CreateStatusReport
- Add required pageId field to CreateStatusReportRequest proto
- Make pageComponentIds field optional (was required)
- Update handler to use pageId directly from request
- Update tests to include pageId in requests
* remove .claude
* ci: apply automated fixes
* refactor(status-report): wrap database operations in transactions
Ensure atomicity for create, update, and add-update operations by using
database transactions. This prevents partial writes if any step fails.
* implement pr review
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* feat(proto): add Update*Monitor RPC definitions for partial updates
Add proto definitions for UpdateHTTPMonitor, UpdateTCPMonitor, and
UpdateDNSMonitor RPCs that support partial updates with optional
nested monitor fields.
* feat(rpc): implement update methods for HTTP, TCP, and DNS monitors
Add UpdateHTTPMonitor, UpdateTCPMonitor, and UpdateDNSMonitor RPC
procedures that support partial updates - only provided fields are
changed while preserving existing values.
- Add getCommonDbValuesForUpdate helper for partial update field extraction
- Add error types: MONITOR_UPDATE_FAILED, MONITOR_TYPE_MISMATCH, MONITOR_ID_REQUIRED
- Skip protovalidate for update methods to allow optional nested fields
- Verify monitor type matches the update method being called
- Add comprehensive tests for all update scenarios
* improve typing
* plan mode
* proto
* ci: apply automated fixes
* improve api
* ci: apply automated fixes
* fix build
* something
* use rpc
* ci: apply automated fixes
* improve api
* :proper api
* vibing
* ci: apply automated fixes
* refactor: extract monitor utilities into separate module
Extract shared monitor utility functions (buildRegions, buildAssertions, etc.)
into a dedicated monitor-utils.ts file. Reorganize monitor.ts to use these
utilities and add new tests for monitor RPC handlers.
* feat: enhance proto definitions with validation and new monitor fields
- Add buf validation dependency and interceptor for gRPC validation
- Expand HTTP monitor proto with timing, TLS, response headers, and assertions
- Add DNS and TCP monitor proto improvements with validation rules
- Regenerate TypeScript protobuf types with updated field mappings
* feat: add create and update monitor support for all monitor types
- Implement createDnsMonitor and createTcpMonitor utility functions
- Add updateHttpMonitor, updateDnsMonitor, and updateTcpMonitor handlers
- Reorganize proto definitions with separate Create/Update request messages
- Regenerate TypeScript types with cleaner nested message structures
* docs: add proto field documentation for monitor types
Add descriptive comments to DNS, HTTP, and TCP monitor proto fields
explaining their purpose and expected values.
* refactor: rename GEMINI.md to CLAUDE.md and improve monitor handlers
- Rename AI instructions file from GEMINI.md to CLAUDE.md
- Refactor monitor-utils.ts for better code organization
- Enhance monitor.ts with improved error handling and type safety
- Add comprehensive tests for monitor RPC handlers
* test: update monitor RPC handler tests
Refactor and improve test assertions for monitor RPC handlers.
Update CLAUDE.md with additional project instructions.
* test: add database reset utility and improve API test isolation
- Add reset-db.ts utility for cleaning database state between tests
- Update bunfig.toml with test configuration
- Enhance test files across v1 API routes to use database reset
- Improve test isolation for monitors, maintenances, notifications,
pages, pageSubscribers, and statusReports endpoints
* chore: lint
* ci: apply automated fixes
* chore: lint
* chore: lint
* ci: apply automated fixes
* fix
* fix: bug pr
* ci: apply automated fixes
* chore: improve logging
* api improvment
* Add active field to DNS, HTTP, and TCP monitor protos
* Add CreateMonitor RPC handler with tests
* Refactor RPC handlers into services structure with converters
* Refactor assertions converter
* Add GetMonitor RPC endpoint with tests
* Add ListMonitors and DeleteMonitor RPC endpoints
* ci: apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* feat: page-components status-page
* fix: status page and maintenance to monitor transformation
* chore: apply zod schema on noop
* feat: page-components status-report and maintenance
* fix: typo
* fix: sync test
* fix: column badge link
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update router referesh
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
* Update status report to client component
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
* ci: apply automated fixes
* fix: invalide queries
* fix: build
* fix: build
* chore: comments
---------
Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Maximilian Kaske <maximilian@kaske.org>
Co-authored-by: Maximilian Kaske <56969857+mxkaske@users.noreply.github.com>
* feat: add @openstatus/notification-base package
Create shared types and utilities for notification providers:
- NotificationContext, FormattedMessageData types
- formatDuration() for human-readable duration formatting
- formatTimestamp() using date-fns for consistent time display
- getIncidentDuration() for calculating resolved incident durations
- buildCommonMessageData() for centralized message formatting
- formatStatusCode() with HTTP status descriptions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: update alerting to fetch and pass incident data to notification providers
- Add logic to fetch incident by ID for recovery/degraded notifications in alerting.ts
- Update SendNotification type signature to use incident?: Incident instead of incidentId?: string
- Update all 11 notification providers to accept incident?: Incident parameter
- Providers using incidentId for dedup keys (opsgenie, pagerduty) now use incident?.id
- Incident is only fetched when notifType is recovery/degraded and incidentId is present
- Add error handling for failed incident fetches (logs warning, doesn't block notification)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: add Slack block builder utilities for enhanced notifications
Create block builder functions for Slack notifications with rich formatting:
- escapeSlackText() for safe mrkdwn escaping
- buildAlertBlocks() with header, monitor link, 4-field grid, error code block, dashboard button
- buildRecoveryBlocks() with optional downtime duration display
- buildDegradedBlocks() with optional previous incident duration
Add @openstatus/notification-base dependency to Slack package.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: update Slack provider to use enhanced blocks and incident data
- Import buildCommonMessageData from @openstatus/notification-base
- Import block builders (buildAlertBlocks, buildRecoveryBlocks, buildDegradedBlocks)
- Update sendAlert to use buildCommonMessageData and buildAlertBlocks
- Update sendRecovery to pass incident for duration calculation
- Update sendDegraded to pass incident for duration calculation
- Rich Slack notifications now include formatted fields, error blocks, and dashboard buttons
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: add Discord embed builder utilities for enhanced notifications
Add Discord embed builders that create rich embed messages with proper
formatting including colored embeds, inline fields, markdown links, and
incident duration tracking.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: update Discord provider to use enhanced embeds and incident data
- Import buildCommonMessageData from @openstatus/notification-base
- Import embed builders from ./embeds
- Update postToWebhook to accept embeds array instead of plain content
- Update sendAlert to build context, call buildCommonMessageData and buildAlertEmbed
- Update sendRecovery to pass incident for duration calculation
- Update sendDegraded to pass incident for duration calculation
- Update sendTestDiscordMessage to use embed format
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: mark duration formatting tests task as complete
The unit tests for duration formatting already exist in
packages/notification-base/src/utils/duration.test.ts with
complete coverage of all required test cases.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test: add unit tests for incident duration calculation
Add comprehensive unit tests for getIncidentDuration() utility function,
covering null cases, resolved incidents, different time formats, and
edge cases.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: verify package dependencies and workspace configuration
Verified that the @openstatus/notification-base package is properly
integrated into the monorepo workspace. All workspace dependencies
are correctly linked and imports work as expected.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: verify backward compatibility for all notification providers
- Applied biome formatting fixes to all 11 notification provider files
- Applied biome formatting fixes to notification-base utility files
- Verified all providers have incident?: Incident optional parameter
- Confirmed all providers compile and lint successfully
- Updated PRD to mark backward compatibility task as complete
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: verify all notification providers have the newly created utils/types
- Verified Slack and Discord providers fully integrate with @openstatus/notification-base
- Confirmed all 11 providers have consistent function signatures with incident?: Incident
- Documented which providers use notification-base and rationale for those that don't
- Fixed biome formatting issue in types.ts (import sorting)
- Updated progress.txt with comprehensive verification summary
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: verify implementation follows official Slack and Discord documentation
- Verified Slack Block Kit best practices (mrkdwn/plain_text types, emoji, escaping)
- Verified Discord embed guidelines (ISO 8601 timestamps, decimal colors, inline fields)
- Fixed trailing comma formatting issues in blocks.ts and embeds.ts (biome)
- Updated PRD task to passes: true
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* perf: verify database query performance for incident fetching
Verified that the incident fetching in alerting.ts:
- Uses primary key lookup on incidentTable.id (O(log n), <1ms)
- Only runs for recovery/degraded notifications, not alerts
- Gracefully handles missing incidents (continues with undefined)
- Catches and logs errors without blocking notifications
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: format and pnpm lock
* chore: examples
* wip:
* refactor: package location
* fix: incident id
* fix: dockerfile
* fix: remove ralph files
* fix: packages
* fix: opsgenie test
* fix: dofigen
* fix: test alerts
* fix: test
* fix: review
* fix: remove action
* fix: send dashboard test
* fix: review
* chore: dedupe key
* fix: color grading
* fix: review
* chore: docs logo asset
* fix: color test
* fix: degraded
* chore: minor stuff
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* chore: read more event timeline link
* fix: id
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* ci: apply automated fixes
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* feat(workflows): add incident cleanup endpoint to auto-resolve stale incidents
Add /incident/cleanup endpoint that finds active monitors with unresolved
incidents and automatically resolves them by setting resolvedAt and
autoResolved=true.
* refactor(checker): extract incident helpers for findOpenIncident and resolveIncident
- Add findOpenIncident() to query open incidents by monitorId
- Add resolveIncident() to handle incident resolution with logging and audit
- Replace duplicated incident query and resolution code with helper calls
- Fix typo: change 'return' to 'break' in error case
- Remove redundant monitor status update in error handling
* ci: apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* add logging to private-regions app
* Update apps/private-location/internal/server/routes.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update apps/private-location/internal/server/server.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update apps/private-location/internal/server/routes.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update apps/private-location/internal/server/routes.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix it
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* "Claude PR Assistant workflow"
* "Claude Code Review workflow"
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* only allow claude tagging
---------
Co-authored-by: Thibault Le Ouay <thibaultleouay@gmail.Com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Initial plan
* Add external_name field to Monitor struct in models.go
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
* Add external_name field to Monitor struct in Go models
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
* Initial plan
* Add GitHub workflow for deploying private-location app
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
* Add explicit permissions to deploy-private-location workflow
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: thibaultleouay <13894054+thibaultleouay@users.noreply.github.com>
* try loggingsucks
* ci: apply automated fixes
* try loggingsucks
* ci: apply automated fixes
* trying loging sucks
* upgrade logtap
* ci: apply automated fixes
* fix test
* improve logging
* improve logging
* ci: apply automated fixes
* improve logging
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>