;
4 |
5 | function Shell({ children, className }: ShellProps) {
6 | return (
7 |
13 | {children}
14 |
15 | );
16 | }
17 |
18 | export { Shell };
19 |
--------------------------------------------------------------------------------
/apps/web/src/components/data-table/data-table-region-select.tsx:
--------------------------------------------------------------------------------
1 | export default function DataTableRegionSelect() {
2 | return ;
3 | }
4 |
--------------------------------------------------------------------------------
/apps/web/src/components/data-table/data-table-status-badge.tsx:
--------------------------------------------------------------------------------
1 | import { Badge } from "@openstatus/ui/src/components/badge";
2 |
3 | import { StatusCodeBadge } from "@/components/monitor/status-code-badge";
4 |
5 | export function DataTableStatusBadge({
6 | statusCode,
7 | }: {
8 | statusCode?: number | null;
9 | }) {
10 | if (!statusCode) {
11 | return Error;
12 | }
13 | return ;
14 | }
15 |
--------------------------------------------------------------------------------
/apps/web/src/components/data-table/data-table-toolbar-skeleton.tsx:
--------------------------------------------------------------------------------
1 | import { Skeleton } from "@openstatus/ui";
2 |
3 | export function DataTableToolbarSkeleton() {
4 | return (
5 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/apps/web/src/components/forms/shared/section-header.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 |
3 | export function SectionHeader({
4 | title,
5 | description,
6 | className,
7 | }: {
8 | title: string;
9 | description: React.ReactNode;
10 | className?: string;
11 | }) {
12 | return (
13 |
14 |
{title}
15 |
{description}
16 |
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/apps/web/src/components/layout/public-header.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import { BrandName } from "./brand-name";
3 | import { LoginButton } from "./login-button";
4 |
5 | interface Props {
6 | className?: string;
7 | }
8 |
9 | export function PublicHeader({ className }: Props) {
10 | return (
11 |
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/apps/web/src/components/monitor/tag-badge.tsx:
--------------------------------------------------------------------------------
1 | import { Badge } from "@openstatus/ui/src/components/badge";
2 |
3 | function getStyle(color: string) {
4 | return {
5 | borderColor: `${color}10`,
6 | backgroundColor: `${color}20`,
7 | color,
8 | };
9 | }
10 |
11 | interface TagBadgeProps {
12 | name: string;
13 | color: string;
14 | }
15 |
16 | export function TagBadge({ color, name }: TagBadgeProps) {
17 | return {name};
18 | }
19 |
--------------------------------------------------------------------------------
/apps/web/src/components/templates/email-template.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 |
3 | interface EmailTemplateProps {
4 | firstName: string;
5 | }
6 |
7 | // TODO: rename and content
8 | export const EmailTemplate = ({ firstName }: EmailTemplateProps) => (
9 |
10 |
Welcome, {firstName}!
11 |
12 | );
13 |
--------------------------------------------------------------------------------
/apps/web/src/components/theme-provider.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { ThemeProvider as NextThemesProvider } from "next-themes";
4 | import type { ThemeProviderProps } from "next-themes/dist/types";
5 | import * as React from "react";
6 |
7 | export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
8 | return {children};
9 | }
10 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/binary-payload.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Binary payload
3 | description: Send binary payloads with your HTTP synthetic check requests.
4 | image: /assets/changelog/content-type.png
5 | publishedAt: 2024-09-09
6 | ---
7 |
8 | You can now include binary payloads in your HTTP synthetic check requests, which is handy for sending files or other binary data in the request body.
9 |
10 | Additionally, you have the flexibility to set the Content-Type to your preference, such as `application/octet-stream` or `application/edn`.
11 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/check-run-api.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Run Check API
3 | description: Launch a check with our API to test your endpoint's latency.
4 | image: /assets/changelog/check-api.png
5 | publishedAt: 2024-06-18
6 | ---
7 |
8 | We have added a new API to launch a check with OpenStatus. You can now test your endpoint's latency programmatically.
9 |
10 | It's useful if you want to integrate OpenStatus with your CI/CD pipeline.
11 |
12 | You can read the [API documentation](https://api.openstatus.dev/v1#tag/monitor/POST/monitor/:id/trigger).
13 |
14 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/clone-monitor.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Clone Monitor
3 | description: No more work. Just a click.
4 | image: /assets/changelog/clone-monitor.png
5 | publishedAt: 2024-07-14
6 | ---
7 | Sometimes you need to create a copy of your monitor with the same settings quickly and easily.
8 |
9 | You can now clone a monitor directly from the action menu in the monitor table.
10 |
11 | We have added this feature to the monitor settings.
12 |
13 | Shout-out to [@Ipriyankrajai](https://x.com/Ipriyankrajai) for his contribution!
14 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/curl-builder-playground.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: cURL Builder
3 | description: An online curl command line builder. Generate curl commands to test your API endpoints.
4 | image: /assets/changelog/curl-builder-playground.png
5 | publishedAt: 2024-11-14
6 | ---
7 |
8 | An online curl command line builder. Generate curl commands to test your API endpoints.
9 |
10 | Go to the **[Playground](/play/curl)** and test it.
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/dark-theme-support.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Dark mode support
3 | description: Choose your favorite theme. Dark or light.
4 | image: /assets/changelog/dark-theme-support.png
5 | publishedAt: 2023-11-27
6 | ---
7 |
8 | You can now use dark mode on the website, after a long awaited pull request
9 | [#73](https://github.com/openstatusHQ/openstatus/pull/73) has been merged.
10 |
11 | The **default** theme will still be **light** mode. You can change the theme in
12 | the footer of the website.
13 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/individual-status-report-page.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Invidivual Status Report Page
3 | description: Every created status report now has its own page.
4 | publishedAt: 2023-12-22
5 | image: /assets/changelog/individual-status-report-page.png
6 | ---
7 |
8 | Every created status report now has its own page. That will make it easier to
9 | share the status report with your team and across your users.
10 |
11 | Additionally, we've addded a neutral blue color to the tracker whenever a status
12 | report has been published.
13 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/monitor-tags.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Monitor Tags
3 | description: Easily categorize your monitors with tags.
4 | image: /assets/changelog/monitor-tags.png
5 | publishedAt: 2024-03-20
6 | ---
7 |
8 | You can now create tags for your monitors to easily categorize them. Tags can be
9 | used to filter monitors on the dashboard and in the monitor list.
10 |
11 | Create, update or delete a tag via your monitor settings.
12 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/monitor-threshold.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Monitor Threshold
3 | description: Set custom request timeouts and degradation timing.
4 | image: /assets/changelog/monitor-threshold.png
5 | publishedAt: 2024-07-01
6 | ---
7 | Sometimes you need to get notified if your monitor is taking too long to respond or if it's degrading.
8 |
9 | You can set custom request timeouts and degradation timing for your monitors.
10 |
11 | We have added this feature to the monitor settings.
12 |
13 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/ntfy-sh-integration.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: ntfy.sh Integration
3 | description: Get notified via ntfy.sh if we detect an Incident.
4 | image: /assets/changelog/ntfy.png
5 | publishedAt: 2025-03-17
6 | ---
7 | You can now receive notifications via ntfy.sh when we detect an incident.
8 |
9 | [ntfy.sh](https://ntfy.sh/) is an open-source servicer that allows you to receive push notifications on your phone.
10 |
11 | We love open source, so we've added this integration to our free plan.
12 |
13 | Open source FTW 🚀
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/pagerduty-integration.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: PagerDuty Integration
3 | description: Get notified via PagerDuty if we detect an incident.
4 | image: /assets/changelog/pagerduty-integration.png
5 | publishedAt: 2024-06-25
6 | ---
7 |
8 | We've added a PagerDuty integration to the notification feature. This allows you to receive incident alerts through PagerDuty.
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/play-checker-improvements.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Speed Checker
3 | description: Improving the speed checker playground for a better experience.
4 | image: /assets/changelog/play-checker-improvements.png
5 | publishedAt: 2024-08-27
6 | ---
7 |
8 | We've refreshed the Playground for a better experience. Now, access real-time data without leaving the page.
9 |
10 | Check out the [Speed Checker](/play/checker).
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/response-time-charts.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Response Time Charts
3 | description: You have now access to new charts for better visualization.
4 | publishedAt: 2023-10-08
5 | image: /assets/changelog/response-time-charts.png
6 | ---
7 |
8 | You can now assess your monitor's response time using the new charts and get a
9 | better overview of your monitor's performance.
10 |
11 | Powered by [tremor.so](https://tremor.so).
12 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/slack-discord-notification.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Slack and Discord notifications
3 | description: You can now send notifications to your favorite channels.
4 | publishedAt: 2023-11-01
5 | image: /assets/changelog/slack-discord-notification.png
6 | ---
7 |
8 | We have just released a new feature that allows you to receive notifications in
9 | Slack or Discord when your monitor is down.
10 |
11 | Thanks [Kelvin](https://github.com/AmoabaKelvin) for the help 🔥
12 |
13 | Expect more integration to come soon!
14 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/status-page-colors-and-more.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Status Page rework
3 | description: New status specific colors, improved navigation and more.
4 | publishedAt: 2024-07-21
5 | image: /assets/changelog/status-page-colors-and-more.png
6 | ---
7 |
8 | We have reworked our status page!
9 |
10 | - **less flashy colors** for _operational_, _degraded_, _downtime_ and _maintenance_
11 | - **new sticky navigation** bar, merging _maintenances_ and _incidents_ into an _events_ page (your old links will still work)
12 | - redesign of **status reports**
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/status-page-feed.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Status Page Feeds
3 | description: Subscribe to status page updates via RSS and Atom feed.
4 | image: /assets/changelog/status-page-feed.png
5 | publishedAt: 2025-01-04
6 | ---
7 |
8 | You can now subscribe via RSS and Atom feed on any status page!
9 |
10 | S/o to [@washingtonserip](https://x.com/washingtonserip) for this contribution.
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/status-page-monitor-values-visibility.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Monitor values visibility
3 | description: Hide the uptime and number of request on your status pages.
4 | publishedAt: 2024-10-20
5 | image: /assets/changelog/status-page-monitor-values-visibility.png
6 | ---
7 |
8 |
9 | You can now hide your request values.
10 |
11 | We have added a checkbox within your Status Page settings to hide/show the number of total and failed requests incl. the average percentage for each monitor connected to the page.
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/status-report-location-change.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Status Report location change
3 | description: Each report is now saved within a Status Page.
4 | publishedAt: 2024-07-14
5 | image: /assets/changelog/status-report-location-change.png
6 | ---
7 |
8 | The location of your reports has changed. The can be found within the connected status page. No need to connect manually to a status page.
9 |
10 | If you encounter any issues. Please [contact us](mailto:ping@openstatus.dev).
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/status-update-subscriber.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Status Update Subscriber
3 | description: You can now subscribe to pro plan status updates via email.
4 | publishedAt: 2023-12-11
5 | image: /assets/changelog/status-update-subscriber.png
6 | ---
7 |
8 | You can now subscribe to pro plan status updates via email.
9 |
10 | As a subscriber, we require you to verify your email address to avoid spam. You
11 | can do this by clicking the link in the email we send you after you subscribe.
12 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/team-invites.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Team invites
3 | description: Invite your team members to your workspace
4 | image: /assets/changelog/team-invites.png
5 | publishedAt: 2023-12-08
6 | ---
7 |
8 | As a Pro plan user, you can now invite you favorite team members to your
9 | workspace and collaborate on your project together.
10 |
--------------------------------------------------------------------------------
/apps/web/src/content/changelog/webhook-integration.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Webhook Integration
3 | description: Get notified via webhook if we detect an Incident..
4 | image: /assets/changelog/webhook.png
5 | publishedAt: 2025-04-08
6 | ---
7 |
8 | When your monitor's status changes, you can receive notifications through a webhook.
9 |
10 | This feature is included in every plan.
11 |
12 | For more information, check our [documentation](https://docs.openstatus.dev/alerting/providers/webhook/).
13 |
--------------------------------------------------------------------------------
/apps/web/src/content/faq/about-us.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Who are we?
3 | order: 2
4 | ---
5 |
6 | We are [Thibault](https://bsky.app/profile/thibaultleouay.dev) and
7 | [Max](https://twitter.com/mxkaske) and we take you with us on our journey.
8 |
9 | Read more on our [about](/about) page.
10 |
--------------------------------------------------------------------------------
/apps/web/src/content/faq/functioning.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: How does it work?
3 | order: 3
4 | ---
5 |
6 | We ping your endpoints from multiple regions to calculate uptime and display the
7 | current status on your status page. We also collect response time data like
8 | `headers` and `timing` phases and display it on your dashboard.
9 |
10 | Try out the [Speed Checker](/play/checker).
11 |
--------------------------------------------------------------------------------
/apps/web/src/content/faq/limits.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: What are the limits?
3 | order: 1
4 | ---
5 |
6 | As free user you will start with a total of **1 monitor** and **1 status page**
7 | as well as cron jobs of min. `10m`. You can upgrade to a paid plan at any time.
8 | Check the pricing table for more details.
9 |
10 | **No credit card** is required to sign up and you can cancel at any time.
11 |
--------------------------------------------------------------------------------
/apps/web/src/content/unrelated/ci-cd-features-block.mdx:
--------------------------------------------------------------------------------
1 | ```ts
2 | test("should fail if slow", async () => {
3 | const data = await fetch("https://api.openstatus.dev/v1/monitor/:id/run", {
4 | method: "POST",
5 | headers: { "x-openstatus-key": process.env.OPENSTATUS_API_KEY },
6 | });
7 | const body = await data.json();
8 |
9 | expect(body.status).toBe(200);
10 | expect(body.latency).toBeLessThan(1000);
11 | });
12 | ```
13 |
--------------------------------------------------------------------------------
/apps/web/src/content/unrelated/cli-block.mdx:
--------------------------------------------------------------------------------
1 | ```bash
2 | openstatus monitors trigger [id]
3 | ```
4 |
--------------------------------------------------------------------------------
/apps/web/src/content/unrelated/github-action-block.mdx:
--------------------------------------------------------------------------------
1 | ```yaml
2 | name: Run OpenStatus Synthetics CI
3 |
4 | on:
5 | workflow_dispatch:
6 | push:
7 | branches: [main]
8 |
9 | jobs:
10 | synthetic_ci:
11 | runs-on: ubuntu-latest
12 | name: Run OpenStatus Synthetics CI
13 | steps:
14 | - name: Checkout
15 | uses: actions/checkout@v4
16 | - name: Run OpenStatus Synthetics CI
17 | uses: openstatushq/openstatus-github-action@v1
18 | with:
19 | api_key: ${{ secrets.OPENSTATUS_API_KEY }}
20 | ```
--------------------------------------------------------------------------------
/apps/web/src/content/unrelated/terraform-provider-block.mdx:
--------------------------------------------------------------------------------
1 | ```hcl
2 | provider "openstatus" {
3 | openstatus_api_token= "YOUR_API_TOKEN"
4 | }
5 |
6 | resource "openstatus_monitor" "my_monitor" {
7 | url = "https://www.openstatus.dev"
8 | regions= ["iad", "jnb"]
9 | periodicity = "10m"
10 | name = "test-monitor"
11 | active = true
12 | description = "This is a test monitor"
13 | }
14 | ```
--------------------------------------------------------------------------------
/apps/web/src/hooks/use-debounce.ts:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 |
3 | // consider using https://github.com/xnimorz/use-debounce
4 | export function useDebounce(value: T, delay?: number): T {
5 | const [debouncedValue, setDebouncedValue] = React.useState(value);
6 |
7 | React.useEffect(() => {
8 | const timer = setTimeout(() => setDebouncedValue(value), delay ?? 500);
9 |
10 | return () => {
11 | clearTimeout(timer);
12 | };
13 | }, [value, delay]);
14 |
15 | return debouncedValue;
16 | }
17 |
--------------------------------------------------------------------------------
/apps/web/src/instrumentation.ts:
--------------------------------------------------------------------------------
1 | import * as Sentry from "@sentry/nextjs";
2 |
3 | export async function register() {
4 | if (process.env.NEXT_RUNTIME === "nodejs") {
5 | await import("../sentry.server.config");
6 | }
7 |
8 | if (process.env.NEXT_RUNTIME === "edge") {
9 | await import("../sentry.edge.config");
10 | }
11 | }
12 |
13 | export const onRequestError = Sentry.captureRequestError;
14 |
--------------------------------------------------------------------------------
/apps/web/src/lib/github.ts:
--------------------------------------------------------------------------------
1 | import * as z from "zod";
2 |
3 | const schema = z.object({
4 | stargazers_count: z.number(),
5 | });
6 |
7 | export async function getGitHubStars() {
8 | const res = await fetch(
9 | "https://api.github.com/repos/openstatusHQ/openstatus",
10 | { next: { revalidate: 600 } }, // 10min
11 | );
12 | const json = await res.json();
13 | const github = schema.safeParse(json);
14 |
15 | if (!github.success) return 0;
16 | return github.data.stargazers_count;
17 | }
18 |
--------------------------------------------------------------------------------
/apps/web/src/lib/maintenances/utils.ts:
--------------------------------------------------------------------------------
1 | import type { Maintenance } from "@openstatus/db/src/schema";
2 |
3 | export function isActiveMaintenance(maintenances?: Maintenance[]) {
4 | if (!maintenances) return false;
5 | return maintenances.some((maintenance) => {
6 | return maintenance.from <= new Date() && maintenance.to >= new Date();
7 | });
8 | }
9 |
--------------------------------------------------------------------------------
/apps/web/src/lib/preferred-settings/shared.ts:
--------------------------------------------------------------------------------
1 | export const COOKIE_NAME = "preferred-settings";
2 |
--------------------------------------------------------------------------------
/apps/web/src/lib/preferred-settings/validation.ts:
--------------------------------------------------------------------------------
1 | import { z } from "zod";
2 |
3 | export const preferencesSchema = z
4 | .object({
5 | combinedRegions: z.boolean().nullable().default(false).optional(),
6 | // ... other settings to store user preferences
7 | // accessible via document.cookie in the client and cookies() on the server
8 | })
9 | .optional();
10 |
11 | export type PreferredSettings = z.infer;
12 |
--------------------------------------------------------------------------------
/apps/web/src/lib/stripe/client.ts:
--------------------------------------------------------------------------------
1 | import type { Stripe as StripeProps } from "@stripe/stripe-js";
2 | import { loadStripe } from "@stripe/stripe-js";
3 |
4 | import { env } from "@/env";
5 |
6 | let stripePromise: Promise;
7 |
8 | export const getStripe = () => {
9 | if (!stripePromise) {
10 | stripePromise = loadStripe(env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY);
11 | }
12 |
13 | return stripePromise;
14 | };
15 |
--------------------------------------------------------------------------------
/apps/web/src/next-auth.d.ts:
--------------------------------------------------------------------------------
1 | import type NextAuth from "next-auth";
2 |
3 | import type { User as DefaultUserSchema } from "@openstatus/db/src/schema";
4 |
5 | declare module "next-auth" {
6 | interface User extends DefaultUserSchema {}
7 | }
8 |
--------------------------------------------------------------------------------
/apps/web/src/public/fonts/CalSans-SemiBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openstatusHQ/openstatus/fa299c4801e04dd6701034928f6c587d4247bf39/apps/web/src/public/fonts/CalSans-SemiBold.ttf
--------------------------------------------------------------------------------
/apps/web/src/public/fonts/Inter-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openstatusHQ/openstatus/fa299c4801e04dd6701034928f6c587d4247bf39/apps/web/src/public/fonts/Inter-Light.ttf
--------------------------------------------------------------------------------
/apps/web/src/public/fonts/Inter-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openstatusHQ/openstatus/fa299c4801e04dd6701034928f6c587d4247bf39/apps/web/src/public/fonts/Inter-Medium.ttf
--------------------------------------------------------------------------------
/apps/web/src/public/fonts/Inter-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openstatusHQ/openstatus/fa299c4801e04dd6701034928f6c587d4247bf39/apps/web/src/public/fonts/Inter-Regular.ttf
--------------------------------------------------------------------------------
/apps/web/src/react-table.d.ts:
--------------------------------------------------------------------------------
1 | import "@tanstack/react-table";
2 |
3 | declare module "@tanstack/react-table" {
4 | interface ColumnMeta {
5 | headerClassName?: string;
6 | cellClassName?: string;
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/apps/web/src/types/utils.ts:
--------------------------------------------------------------------------------
1 | export type Writeable = { -readonly [P in keyof T]: T[P] };
2 |
--------------------------------------------------------------------------------
/apps/web/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/nextjs.json",
3 | "compilerOptions": {
4 | "baseUrl": ".",
5 | "paths": {
6 | "content-collections": ["./.content-collections/generated"],
7 | "@/*": ["./src/*"]
8 | },
9 | "plugins": [{ "name": "next" }],
10 | "strictNullChecks": true,
11 | "strict": true
12 | },
13 | "include": [
14 | "next-env.d.ts",
15 | "**/*.ts",
16 | "**/*.tsx",
17 | ".next/types/**/*.ts",
18 | "**/*.mjs"
19 | ],
20 | "exclude": ["node_modules", "env.ts"]
21 | }
22 |
--------------------------------------------------------------------------------
/apps/workflows/.dockerignore:
--------------------------------------------------------------------------------
1 | # This file is generated by Dofigen v2.3.2
2 | # See https://github.com/lenra-io/dofigen
3 |
4 | node_modules
5 | /apps/docs
6 | /apps/screenshot-service
7 | /apps/server
8 | /apps/web
9 | /packages/analytics
10 | /packages/api
11 | /packages/error
12 | /packages/tracker
13 |
--------------------------------------------------------------------------------
/apps/workflows/.env.test:
--------------------------------------------------------------------------------
1 | DATABASE_URL=http://127.0.0.1:8080
2 | DATABASE_AUTH_TOKEN=
3 | NODE_ENV=test
4 | UNKEY_TOKEN=test
5 | TINY_BIRD_API_KEY=test
6 | UPSTASH_REDIS_REST_URL=test
7 | UPSTASH_REDIS_REST_TOKEN=test
8 | QSTASH_CURRENT_SIGNING_KEY=test
9 | QSTASH_NEXT_SIGNING_KEY=test
10 | FLY_REGION=ams
11 | RESEND_API_KEY=test
12 | SQLD_HTTP_AUTH=basic:token
13 | SCREENSHOT_SERVICE_URL=http://your.endpoint
14 | NEXT_PUBLIC_OPENPANEL_CLIENT_ID=test
15 | OPENPANEL_CLIENT_SECRET=test
16 |
--------------------------------------------------------------------------------
/apps/workflows/.gitignore:
--------------------------------------------------------------------------------
1 | # deps
2 | node_modules/
3 |
--------------------------------------------------------------------------------
/apps/workflows/src/utils/audit-log.ts:
--------------------------------------------------------------------------------
1 | import { AuditLog, Tinybird } from "@openstatus/tinybird";
2 |
3 | import { env } from "../env";
4 |
5 | const tb = new Tinybird({ token: env().TINY_BIRD_API_KEY });
6 |
7 | export const checkerAudit = new AuditLog({ tb });
8 |
--------------------------------------------------------------------------------
/apps/workflows/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/base.json",
3 | "compilerOptions": {
4 | "jsx": "react-jsx",
5 | "jsxImportSource": "hono/jsx"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/config.openstatus.yaml:
--------------------------------------------------------------------------------
1 | tests:
2 | ids:
3 | - 1
4 | - 771
5 | - 2662
6 |
--------------------------------------------------------------------------------
/devbox.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.10.6/.schema/devbox.schema.json",
3 | "packages": ["turso-cli@latest", "nodejs@20", "bun@latest", "sqld@latest"],
4 | "env": {
5 | "DEVBOX_COREPACK_ENABLED": "true",
6 | "COREPACK_ENABLE_DOWNLOAD_PROMPT": "0"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/knip.ts:
--------------------------------------------------------------------------------
1 | /** @type {import('knip').KnipConfig} */
2 | const config = {
3 | workspaces: {
4 | "packages/shared": {
5 | includeEntryExports: true,
6 | },
7 | },
8 | };
9 |
10 | export default config;
11 |
--------------------------------------------------------------------------------
/packages/analytics/.env.example:
--------------------------------------------------------------------------------
1 | NEXT_PUBLIC_OPENPANEL_CLIENT_ID=something
2 | OPENPANEL_CLIENT_SECRET=something
--------------------------------------------------------------------------------
/packages/analytics/env.ts:
--------------------------------------------------------------------------------
1 | import { createEnv } from "@t3-oss/env-core";
2 | import { z } from "zod";
3 |
4 | export const env = createEnv({
5 | server: {
6 | OPENPANEL_CLIENT_SECRET: z.string(),
7 | },
8 | client: {
9 | NEXT_PUBLIC_OPENPANEL_CLIENT_ID: z.string(),
10 | },
11 | clientPrefix: "NEXT_PUBLIC_",
12 | runtimeEnv: {
13 | OPENPANEL_CLIENT_SECRET: process.env.OPENPANEL_CLIENT_SECRET,
14 | NEXT_PUBLIC_OPENPANEL_CLIENT_ID:
15 | process.env.NEXT_PUBLIC_OPENPANEL_CLIENT_ID,
16 | },
17 | });
18 |
--------------------------------------------------------------------------------
/packages/analytics/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/analytics",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "src/index.ts",
6 | "dependencies": {
7 | "@openpanel/sdk": "1.0.0",
8 | "@t3-oss/env-core": "0.7.0",
9 | "zod": "3.23.8"
10 | },
11 | "devDependencies": {
12 | "@openstatus/tsconfig": "workspace:*",
13 | "@types/node": "22.10.2",
14 | "typescript": "5.6.2"
15 | },
16 | "scripts": {},
17 | "keywords": [],
18 | "author": "",
19 | "license": "ISC"
20 | }
21 |
--------------------------------------------------------------------------------
/packages/analytics/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./events";
2 | export * from "./server";
3 | export * from "./utils";
4 |
--------------------------------------------------------------------------------
/packages/analytics/src/utils.ts:
--------------------------------------------------------------------------------
1 | export function parseInputToProps(
2 | json: unknown,
3 | eventProps?: string[],
4 | ): Record {
5 | if (typeof json !== "object" || json === null) return {};
6 |
7 | if (!eventProps) return {};
8 |
9 | return eventProps.reduce(
10 | (acc, prop) => {
11 | if (prop in json) {
12 | acc[prop] = json[prop as keyof typeof json];
13 | }
14 | return acc;
15 | },
16 | {} as Record,
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/packages/api/.env.test:
--------------------------------------------------------------------------------
1 | RESEND_API_KEY='test'
2 | NEXT_PUBLIC_OPENPANEL_CLIENT_ID='test'
3 | OPENPANEL_CLIENT_SECRET='test'
--------------------------------------------------------------------------------
/packages/api/src/lambda.ts:
--------------------------------------------------------------------------------
1 | import { emailRouter } from "./router/email";
2 | import { stripeRouter } from "./router/stripe";
3 | import { createTRPCRouter } from "./trpc";
4 | // Deployed to /trpc/lambda/**
5 | export const lambdaRouter = createTRPCRouter({
6 | stripeRouter: stripeRouter,
7 | emailRouter: emailRouter,
8 | });
9 |
10 | export { stripe } from "./router/stripe/shared";
11 |
--------------------------------------------------------------------------------
/packages/api/src/root.ts:
--------------------------------------------------------------------------------
1 | import { edgeRouter } from "./edge";
2 | import { lambdaRouter } from "./lambda";
3 | import { mergeRouters } from "./trpc";
4 |
5 | export const appRouter = mergeRouters(edgeRouter, lambdaRouter);
6 | export type AppRouter = typeof appRouter;
7 |
--------------------------------------------------------------------------------
/packages/api/src/router/user.ts:
--------------------------------------------------------------------------------
1 | import { eq } from "@openstatus/db";
2 | import { user } from "@openstatus/db/src/schema";
3 |
4 | import { createTRPCRouter, protectedProcedure } from "../trpc";
5 |
6 | export const userRouter = createTRPCRouter({
7 | getCurrentUser: protectedProcedure.query(async (opts) => {
8 | const currentUser = await opts.ctx.db
9 | .select()
10 | .from(user)
11 | .where(eq(user.id, opts.ctx.user.id))
12 | .get();
13 | return currentUser;
14 | }),
15 | });
16 |
--------------------------------------------------------------------------------
/packages/api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/nextjs.json",
3 | "include": ["src", "*.ts"],
4 | "compilerOptions": {
5 | "types": ["bun-types"]
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/packages/assertions/README.md:
--------------------------------------------------------------------------------
1 | Biggest props to [@chronark\_](https://twitter.com/chronark_/) for providing us
2 | the snippets.
3 |
--------------------------------------------------------------------------------
/packages/assertions/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/assertions",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "src/index.ts",
6 | "scripts": {},
7 | "dependencies": {
8 | "jsonpath-plus": "7.2.0"
9 | },
10 | "devDependencies": {
11 | "@openstatus/tsconfig": "workspace:*",
12 | "typescript": "5.6.2",
13 | "zod": "3.23.8"
14 | },
15 | "keywords": [],
16 | "author": "",
17 | "license": "ISC"
18 | }
19 |
--------------------------------------------------------------------------------
/packages/assertions/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./dictionary";
2 | export * from "./types";
3 | export * from "./serializing";
4 | export * from "./v1";
5 |
--------------------------------------------------------------------------------
/packages/assertions/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/base.json",
3 | "compilerOptions": {
4 | "lib": ["es2015", "dom"]
5 | },
6 | "include": ["src", "*.ts"]
7 | }
8 |
--------------------------------------------------------------------------------
/packages/db/.env.example:
--------------------------------------------------------------------------------
1 | DATABASE_URL=http://127.0.0.1:8080
2 | DATABASE_AUTH_TOKEN=any-token
3 |
--------------------------------------------------------------------------------
/packages/db/drizzle.config.ts:
--------------------------------------------------------------------------------
1 | import type { Config } from "drizzle-kit";
2 |
3 | import { env } from "./env.mjs";
4 |
5 | export default {
6 | schema: "./src/schema/index.ts",
7 | out: "./drizzle",
8 | dbCredentials: {
9 | url: env.DATABASE_URL,
10 | authToken: env.DATABASE_AUTH_TOKEN,
11 | },
12 | strict: true,
13 | dialect: "turso",
14 | } satisfies Config;
15 |
--------------------------------------------------------------------------------
/packages/db/drizzle/0001_brainy_beast.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE monitor ADD `regions` text DEFAULT '' NOT NULL;
2 |
3 |
--------------------------------------------------------------------------------
/packages/db/drizzle/0002_luxuriant_ser_duncan.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE user ADD `first_name` text DEFAULT '';--> statement-breakpoint
2 | ALTER TABLE user ADD `last_name` text DEFAULT '';--> statement-breakpoint
3 | ALTER TABLE user ADD `email` text DEFAULT '';--> statement-breakpoint
4 | ALTER TABLE user ADD `photo_url` text DEFAULT '';
--------------------------------------------------------------------------------
/packages/db/drizzle/0005_even_baron_strucker.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE workspace ADD `subscription_id` text;--> statement-breakpoint
2 | ALTER TABLE workspace ADD `plan` text(3);--> statement-breakpoint
3 | ALTER TABLE workspace ADD `ends_at` integer;--> statement-breakpoint
4 | ALTER TABLE workspace ADD `paid_until` integer;
--------------------------------------------------------------------------------
/packages/db/drizzle/0007_complex_frog_thor.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `integration` (
2 | `id` integer PRIMARY KEY NOT NULL,
3 | `name` text(256) NOT NULL,
4 | `workspace_id` integer,
5 | `credential` text,
6 | `external_id` text NOT NULL,
7 | `created_at` integer DEFAULT (strftime('%s', 'now')),
8 | `updated_at` integer DEFAULT (strftime('%s', 'now')),
9 | `data` text NOT NULL,
10 | FOREIGN KEY (`workspace_id`) REFERENCES `workspace`(`id`) ON UPDATE no action ON DELETE no action
11 | );
12 |
--------------------------------------------------------------------------------
/packages/db/drizzle/0009_small_maximus.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `incidents_to_pages` (
2 | `page_id` integer NOT NULL,
3 | `incident_id` integer NOT NULL,
4 | PRIMARY KEY(`incident_id`, `page_id`),
5 | FOREIGN KEY (`page_id`) REFERENCES `page`(`id`) ON UPDATE no action ON DELETE cascade,
6 | FOREIGN KEY (`incident_id`) REFERENCES `incident`(`id`) ON UPDATE no action ON DELETE cascade
7 | );
8 |
--------------------------------------------------------------------------------
/packages/db/drizzle/0010_lame_songbird.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `monitor_status` (
2 | `monitor_id` integer NOT NULL,
3 | `region` text DEFAULT '' NOT NULL,
4 | `status` text DEFAULT 'active' NOT NULL,
5 | `created_at` integer DEFAULT (strftime('%s', 'now')),
6 | `updated_at` integer DEFAULT (strftime('%s', 'now')),
7 | PRIMARY KEY(`monitor_id`, `region`),
8 | FOREIGN KEY (`monitor_id`) REFERENCES `monitor`(`id`) ON UPDATE no action ON DELETE cascade
9 | );
10 | --> statement-breakpoint
11 | CREATE INDEX `monitor_status_idx` ON `monitor_status` (`monitor_id`,`region`);
--------------------------------------------------------------------------------
/packages/db/drizzle/0012_tan_magma.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `invitation` (
2 | `id` integer PRIMARY KEY NOT NULL,
3 | `email` text NOT NULL,
4 | `role` text DEFAULT 'member' NOT NULL,
5 | `workspace_id` integer NOT NULL,
6 | `token` text NOT NULL,
7 | `expires_at` integer NOT NULL,
8 | `created_at` integer DEFAULT (strftime('%s', 'now')),
9 | `accepted_at` integer
10 | );
11 | --> statement-breakpoint
12 | ALTER TABLE users_to_workspaces ADD `role` text DEFAULT 'owner' NOT NULL;
--------------------------------------------------------------------------------
/packages/db/drizzle/0013_tired_paladin.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `page_subscriber` (
2 | `id` integer PRIMARY KEY NOT NULL,
3 | `email` text NOT NULL,
4 | `page_id` integer,
5 | `token` text,
6 | `accepted_at` integer,
7 | `expires_at` integer,
8 | `created_at` integer DEFAULT (strftime('%s', 'now')),
9 | `updated_at` integer DEFAULT (strftime('%s', 'now')),
10 | FOREIGN KEY (`page_id`) REFERENCES `page`(`id`) ON UPDATE no action ON DELETE no action
11 | );
12 |
--------------------------------------------------------------------------------
/packages/db/drizzle/0014_adorable_skaar.sql:
--------------------------------------------------------------------------------
1 | DROP TABLE IF EXISTS `page_subscriber`;
2 | --> statement-breakpoint
3 |
4 | CREATE TABLE `page_subscriber` (
5 | `id` integer PRIMARY KEY NOT NULL,
6 | `email` text NOT NULL,
7 | `page_id` integer NOT NULL,
8 | `token` text,
9 | `accepted_at` integer,
10 | `expires_at` integer,
11 | `created_at` integer DEFAULT (strftime('%s', 'now')),
12 | `updated_at` integer DEFAULT (strftime('%s', 'now')),
13 | FOREIGN KEY (`page_id`) REFERENCES `page`(`id`) ON UPDATE no action ON DELETE no action
14 | );
15 |
--------------------------------------------------------------------------------
/packages/db/drizzle/0018_neat_orphan.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE incident ADD `auto_resolved` integer DEFAULT false;
--------------------------------------------------------------------------------
/packages/db/drizzle/0019_dashing_malcolm_colcord.sql:
--------------------------------------------------------------------------------
1 | DROP INDEX IF EXISTS `incident_monitor_id_started_at_unique`;--> statement-breakpoint
2 | DROP INDEX IF EXISTS `composite_incident_new_id_started_at_unique`;--> statement-breakpoint
3 | CREATE UNIQUE INDEX `incident_id_monitor_id_started_at_unique` ON `incident` (`id`,`monitor_id`,`started_at`);
--------------------------------------------------------------------------------
/packages/db/drizzle/0020_flat_bedlam.sql:
--------------------------------------------------------------------------------
1 | DROP INDEX IF EXISTS `incident_id_monitor_id_started_at_unique`;--> statement-breakpoint
2 | CREATE UNIQUE INDEX `incident_monitor_id_started_at_unique` ON `incident` (`monitor_id`,`started_at`);
--------------------------------------------------------------------------------
/packages/db/drizzle/0022_chunky_rockslide.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE monitor ADD `assertions` text;
--------------------------------------------------------------------------------
/packages/db/drizzle/0023_dry_blink.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE incident ADD `incident_screenshot_url` text;--> statement-breakpoint
2 | ALTER TABLE incident ADD `recovery_screenshot_url` text;
--------------------------------------------------------------------------------
/packages/db/drizzle/0024_young_proudstar.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE monitor ADD `deleted_at` integer;
--------------------------------------------------------------------------------
/packages/db/drizzle/0025_strong_thunderball.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE monitor ADD `public` integer DEFAULT false;
--------------------------------------------------------------------------------
/packages/db/drizzle/0026_giant_absorbing_man.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE workspace ADD `dsn` text;--> statement-breakpoint
2 | CREATE UNIQUE INDEX `workspace_id_dsn_unique` ON `workspace` (`id`,`dsn`);
--------------------------------------------------------------------------------
/packages/db/drizzle/0027_bizarre_bastion.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE page ADD `password` text(256);--> statement-breakpoint
2 | ALTER TABLE page ADD `password_protected` integer DEFAULT false;
--------------------------------------------------------------------------------
/packages/db/drizzle/0029_regular_marrow.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `monitors_to_pages` ADD `order` integer DEFAULT 0;
--------------------------------------------------------------------------------
/packages/db/drizzle/0030_elite_barracuda.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `application` (
2 | `id` integer PRIMARY KEY NOT NULL,
3 | `name` text,
4 | `dsn` text,
5 | `workspace_id` integer,
6 | `created_at` integer DEFAULT (strftime('%s', 'now')),
7 | `updated_at` integer DEFAULT (strftime('%s', 'now')),
8 | FOREIGN KEY (`workspace_id`) REFERENCES `workspace`(`id`) ON UPDATE no action ON DELETE no action
9 | );
10 | --> statement-breakpoint
11 | CREATE UNIQUE INDEX `application_dsn_unique` ON `application` (`dsn`);
--------------------------------------------------------------------------------
/packages/db/drizzle/0032_hot_swordsman.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `check` (
2 | `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
3 | `regions` text DEFAULT '' NOT NULL,
4 | `url` text(4096) NOT NULL,
5 | `headers` text DEFAULT '',
6 | `body` text DEFAULT '',
7 | `method` text DEFAULT 'GET',
8 | `count_requests` integer DEFAULT 1,
9 | `workspace_id` integer,
10 | `created_at` integer DEFAULT (strftime('%s', 'now')),
11 | FOREIGN KEY (`workspace_id`) REFERENCES `workspace`(`id`) ON UPDATE no action ON DELETE no action
12 | );
13 |
--------------------------------------------------------------------------------
/packages/db/drizzle/0033_solid_colossus.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `monitor` ADD `timeout` integer DEFAULT 45000 NOT NULL;--> statement-breakpoint
2 | ALTER TABLE `monitor` ADD `degraded_after` integer;
--------------------------------------------------------------------------------
/packages/db/drizzle/0034_serious_shard.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `status_report` ADD `page_id` integer REFERENCES page(id);--> statement-breakpoint
2 |
3 | UPDATE `status_report` SET `page_id` = `t`.`page_id` from (select `page_id`, `status_report_id` from `status_reports_to_pages`) `t` where `t`.`status_report_id` = `id` ;
--------------------------------------------------------------------------------
/packages/db/drizzle/0035_open_the_professor.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `workspace` ADD `limits` text DEFAULT '{}' NOT NULL;
--------------------------------------------------------------------------------
/packages/db/drizzle/0036_gifted_deathbird.sql:
--------------------------------------------------------------------------------
1 | UPDATE `monitor` SET `job_type` = 'http' ;
--------------------------------------------------------------------------------
/packages/db/drizzle/0037_equal_beyonder.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `page` ADD `show_monitor_values` integer DEFAULT true;
--------------------------------------------------------------------------------
/packages/db/drizzle/0038_foamy_stardust.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `monitor_run` (
2 | `id` integer PRIMARY KEY NOT NULL,
3 | `workspace_id` integer,
4 | `monitor_id` integer,
5 | `runned_at` integer,
6 | `created_at` integer DEFAULT (strftime('%s', 'now')),
7 | FOREIGN KEY (`workspace_id`) REFERENCES `workspace`(`id`) ON UPDATE no action ON DELETE no action,
8 | FOREIGN KEY (`monitor_id`) REFERENCES `monitor`(`id`) ON UPDATE no action ON DELETE no action
9 | );
10 |
--------------------------------------------------------------------------------
/packages/db/drizzle/0039_lonely_jigsaw.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `monitor` ADD `otel_endpoint` text;--> statement-breakpoint
2 | ALTER TABLE `monitor` ADD `otel_headers` text;
--------------------------------------------------------------------------------
/packages/db/drizzle/0043_low_lily_hollister.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `monitor` ADD `retry` integer DEFAULT 3;
--------------------------------------------------------------------------------
/packages/db/env.ts:
--------------------------------------------------------------------------------
1 | const file = Bun.file("./.env.example");
2 | await Bun.write("./.env", file);
3 |
--------------------------------------------------------------------------------
/packages/db/src/db.ts:
--------------------------------------------------------------------------------
1 | import { drizzle } from "drizzle-orm/libsql/http";
2 |
3 | import { env } from "../env.mjs";
4 | import * as schema from "./schema";
5 |
6 | export const db = drizzle({
7 | connection: {
8 | url: env.DATABASE_URL,
9 | authToken: env.DATABASE_AUTH_TOKEN,
10 | },
11 | schema,
12 | });
13 |
--------------------------------------------------------------------------------
/packages/db/src/index.ts:
--------------------------------------------------------------------------------
1 | export * as schema from "./schema";
2 | export * from "drizzle-orm";
3 | export * from "./db";
4 | export * from "./utils";
5 |
--------------------------------------------------------------------------------
/packages/db/src/schema/applications/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./application";
2 | export * from "./validation";
3 |
--------------------------------------------------------------------------------
/packages/db/src/schema/applications/validation.ts:
--------------------------------------------------------------------------------
1 | import { createSelectSchema } from "drizzle-zod";
2 | import { application } from "./application";
3 |
4 | export const selectApplicationSchema = createSelectSchema(application);
5 |
--------------------------------------------------------------------------------
/packages/db/src/schema/check/constants.ts:
--------------------------------------------------------------------------------
1 | export const flyCheckerRegions = [
2 | // TODO: Add more regions
3 | "ams",
4 | "iad",
5 | "hkg",
6 | "jnb",
7 | "syd",
8 | "gru",
9 | ] as const;
10 |
--------------------------------------------------------------------------------
/packages/db/src/schema/check/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./check";
2 | export * from "./constants";
3 |
--------------------------------------------------------------------------------
/packages/db/src/schema/incidents/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./incident";
2 | export * from "./validation";
3 |
--------------------------------------------------------------------------------
/packages/db/src/schema/incidents/validation.ts:
--------------------------------------------------------------------------------
1 | import { createSelectSchema } from "drizzle-zod";
2 | import { z } from "zod";
3 |
4 | import { incidentTable } from "./incident";
5 |
6 | export const selectIncidentSchema = createSelectSchema(incidentTable).extend({
7 | monitorName: z.string().optional(),
8 | });
9 |
10 | export type Incident = z.infer;
11 |
--------------------------------------------------------------------------------
/packages/db/src/schema/invitations/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./invitation";
2 | export * from "./validation";
3 |
--------------------------------------------------------------------------------
/packages/db/src/schema/invitations/validation.ts:
--------------------------------------------------------------------------------
1 | import { createInsertSchema, createSelectSchema } from "drizzle-zod";
2 | import { z } from "zod";
3 |
4 | import { invitation } from "./invitation";
5 |
6 | export const insertInvitationSchema = createInsertSchema(invitation, {
7 | email: z.string().email(),
8 | });
9 |
10 | export const selectInvitationSchema = createSelectSchema(invitation);
11 |
12 | export type InsertInvitation = z.infer;
13 | export type Invitation = z.infer;
14 |
--------------------------------------------------------------------------------
/packages/db/src/schema/maintenances/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./maintenance";
2 | export * from "./validation";
3 |
--------------------------------------------------------------------------------
/packages/db/src/schema/monitor_run/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./monitor_run";
2 |
--------------------------------------------------------------------------------
/packages/db/src/schema/monitor_status/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./monitor_status";
2 | export * from "./validation";
3 | export type * from "./validation";
4 |
--------------------------------------------------------------------------------
/packages/db/src/schema/monitor_tags/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./monitor_tag";
2 | export * from "./validation";
3 |
--------------------------------------------------------------------------------
/packages/db/src/schema/monitor_tags/validation.ts:
--------------------------------------------------------------------------------
1 | import { createInsertSchema, createSelectSchema } from "drizzle-zod";
2 | import type { z } from "zod";
3 |
4 | import { monitorTag } from "./monitor_tag";
5 |
6 | export const selectMonitorTagSchema = createSelectSchema(monitorTag);
7 |
8 | export const insertMonitorTagSchema = createInsertSchema(monitorTag);
9 |
10 | export type InsertMonitorTag = z.infer;
11 | export type MonitorTag = z.infer;
12 |
--------------------------------------------------------------------------------
/packages/db/src/schema/monitors/constants.ts:
--------------------------------------------------------------------------------
1 | export const monitorMethods = [
2 | "GET",
3 | "POST",
4 | "HEAD",
5 | "PUT",
6 | "PATCH",
7 | "DELETE",
8 | "TRACE",
9 | "CONNECT",
10 | "OPTIONS",
11 | ] as const;
12 | export const monitorStatus = ["active", "error", "degraded"] as const;
13 |
14 | export const monitorJobTypes = [
15 | "http",
16 | "tcp",
17 | "imcp",
18 | "udp",
19 | "dns",
20 | "ssl",
21 | ] as const;
22 |
--------------------------------------------------------------------------------
/packages/db/src/schema/monitors/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./constants";
2 | export * from "./monitor";
3 | export * from "./validation";
4 | export type * from "./validation";
5 |
--------------------------------------------------------------------------------
/packages/db/src/schema/notifications/constants.ts:
--------------------------------------------------------------------------------
1 | export const notificationProvider = [
2 | "email",
3 | "discord",
4 | "ntfy",
5 | "pagerduty",
6 | "opsgenie",
7 | "slack",
8 | "sms",
9 | "webhook",
10 | ] as const;
11 |
--------------------------------------------------------------------------------
/packages/db/src/schema/notifications/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./constants";
2 | export * from "./notification";
3 | export * from "./validation";
4 | export type * from "./validation";
5 |
--------------------------------------------------------------------------------
/packages/db/src/schema/page_subscribers/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./page_subscribers";
2 | export * from "./validation";
3 | export type * from "./validation";
4 |
--------------------------------------------------------------------------------
/packages/db/src/schema/pages/constants.ts:
--------------------------------------------------------------------------------
1 | export const subdomainSafeList = [
2 | "api",
3 | "app",
4 | "www",
5 | "docs",
6 | "checker",
7 | "time",
8 | "help",
9 | "data-table",
10 | "light",
11 | "workflows",
12 | ];
13 |
--------------------------------------------------------------------------------
/packages/db/src/schema/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./page";
2 | export * from "./validation";
3 | export type * from "./validation";
4 | export * from "./constants";
5 |
--------------------------------------------------------------------------------
/packages/db/src/schema/status_reports/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./status_reports";
2 | export * from "./validation";
3 | export type * from "./validation";
4 |
--------------------------------------------------------------------------------
/packages/db/src/schema/users/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./user";
2 | export * from "./validation";
3 |
--------------------------------------------------------------------------------
/packages/db/src/schema/users/validation.ts:
--------------------------------------------------------------------------------
1 | import { createInsertSchema, createSelectSchema } from "drizzle-zod";
2 | import type { z } from "zod";
3 |
4 | import { user } from "./user";
5 |
6 | export const insertUserSchema = createInsertSchema(user);
7 |
8 | export const selectUserSchema = createSelectSchema(user);
9 |
10 | export type InsertUser = z.infer;
11 | export type User = z.infer;
12 |
--------------------------------------------------------------------------------
/packages/db/src/schema/workspaces/constants.ts:
--------------------------------------------------------------------------------
1 | export const workspacePlans = ["free", "starter", "team"] as const;
2 | export const workspaceRole = ["owner", "admin", "member"] as const;
3 |
4 | export const workspacePlanHierarchy: Record<
5 | (typeof workspacePlans)[number],
6 | number
7 | > = {
8 | free: 0,
9 | starter: 1,
10 | team: 2,
11 | };
12 |
--------------------------------------------------------------------------------
/packages/db/src/schema/workspaces/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./constants";
2 | export * from "./workspace";
3 | export * from "./validation";
4 | export type * from "./validation";
5 |
--------------------------------------------------------------------------------
/packages/emails/src/env.ts:
--------------------------------------------------------------------------------
1 | import { createEnv } from "@t3-oss/env-core";
2 | import { z } from "zod";
3 |
4 | export const env = createEnv({
5 | server: {
6 | RESEND_API_KEY: z.string().min(1),
7 | },
8 | runtimeEnv: {
9 | RESEND_API_KEY: process.env.RESEND_API_KEY,
10 | },
11 | });
12 |
--------------------------------------------------------------------------------
/packages/emails/src/utils.ts:
--------------------------------------------------------------------------------
1 | export const validateEmailNotDisposable = async (mailHost: string) => {
2 | const response = await fetch(
3 | `https://open.kickbox.com/v1/disposable/${mailHost}`,
4 | );
5 | const status = (await response.json()) as Record;
6 |
7 | return status.disposable;
8 | };
9 |
--------------------------------------------------------------------------------
/packages/emails/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/react-library.json",
3 | "include": [".", "src/env.ts"],
4 | "exclude": ["dist", "build", "node_modules"]
5 | }
6 |
--------------------------------------------------------------------------------
/packages/error/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./src/base-error";
2 | export * from "./src/error-code";
3 | export * from "./src/http-error";
4 | export * from "./src/schema-error";
5 | export * from "./src/utils";
6 |
--------------------------------------------------------------------------------
/packages/error/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/error",
3 | "version": "0.0.0",
4 | "description": "",
5 | "main": "index.ts",
6 | "scripts": {},
7 | "dependencies": {
8 | "zod": "3.23.8"
9 | },
10 | "devDependencies": {
11 | "@openstatus/tsconfig": "workspace:*",
12 | "typescript": "5.6.2"
13 | },
14 | "keywords": [],
15 | "author": "",
16 | "license": "ISC"
17 | }
18 |
--------------------------------------------------------------------------------
/packages/error/src/error-code.ts:
--------------------------------------------------------------------------------
1 | import { z } from "zod";
2 |
3 | export const ErrorCodes = [
4 | "BAD_REQUEST",
5 | "FORBIDDEN",
6 | "INTERNAL_SERVER_ERROR",
7 | "PAYMENT_REQUIRED",
8 | "CONFLICT",
9 | "NOT_FOUND",
10 | "UNAUTHORIZED",
11 | "METHOD_NOT_ALLOWED",
12 | "UNPROCESSABLE_ENTITY",
13 | ] as const;
14 |
15 | export const ErrorCodeEnum = z.enum(ErrorCodes);
16 |
17 | export type ErrorCode = z.infer;
18 |
--------------------------------------------------------------------------------
/packages/error/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/base.json",
3 | "include": ["src", "*.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/packages/header-analysis/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/header-analysis",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "src/index.ts",
6 | "scripts": {},
7 | "dependencies": {},
8 | "devDependencies": {
9 | "@openstatus/tsconfig": "workspace:*",
10 | "typescript": "5.6.2"
11 | },
12 | "keywords": [],
13 | "author": "",
14 | "license": "ISC"
15 | }
16 |
--------------------------------------------------------------------------------
/packages/header-analysis/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./parser/cache-control";
2 | export * from "./parser/cf-cache-status";
3 | export * from "./parser/cf-ray";
4 | export * from "./parser/fly-request-id";
5 | export * from "./parser/x-vercel-cache";
6 | export * from "./parser/x-vercel-id";
7 |
--------------------------------------------------------------------------------
/packages/header-analysis/src/types/index.ts:
--------------------------------------------------------------------------------
1 | export type Region = {
2 | code: string;
3 | location: string;
4 | flag: string;
5 | };
6 |
7 | export type ParserReturn =
8 | | { status: "success"; data: T }
9 | | { status: "failed"; error: Error };
10 |
--------------------------------------------------------------------------------
/packages/header-analysis/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/base.json",
3 | "include": ["src", "*.ts"],
4 | "compilerOptions": {
5 | "resolveJsonModule": true
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/packages/notifications/discord/README.md:
--------------------------------------------------------------------------------
1 | # @openstatus/notifications-discord
2 |
3 | To install dependencies:
4 |
5 | ```bash
6 | bun install
7 | ```
8 |
9 | To run:
10 |
11 | ```bash
12 | bun run src/index.ts
13 | ```
14 |
15 | This project was created using `bun init` in bun v1.0.0. [Bun](https://bun.sh)
16 | is a fast all-in-one JavaScript runtime.
17 |
--------------------------------------------------------------------------------
/packages/notifications/discord/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/notification-discord",
3 | "version": "1.0.0",
4 | "main": "src/index.ts",
5 | "dependencies": {
6 | "@openstatus/db": "workspace:*",
7 | "zod": "3.23.8"
8 | },
9 | "devDependencies": {
10 | "@openstatus/tsconfig": "workspace:*",
11 | "@types/node": "22.10.2",
12 | "typescript": "5.6.2"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/packages/notifications/discord/src/schema.ts:
--------------------------------------------------------------------------------
1 | import { z } from "zod";
2 |
3 | export const DataSchema = z.object({
4 | discord: z.string(),
5 | });
6 |
--------------------------------------------------------------------------------
/packages/notifications/discord/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/nextjs.json",
3 | "include": ["src", "*.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/packages/notifications/email/.env.example:
--------------------------------------------------------------------------------
1 | RESEND_API_KEY=1
2 |
--------------------------------------------------------------------------------
/packages/notifications/email/README.md:
--------------------------------------------------------------------------------
1 | #
2 |
--------------------------------------------------------------------------------
/packages/notifications/email/env.ts:
--------------------------------------------------------------------------------
1 | import { createEnv } from "@t3-oss/env-core";
2 | import { z } from "zod";
3 |
4 | export const env = createEnv({
5 | server: {
6 | RESEND_API_KEY: z.string().min(1),
7 | },
8 | runtimeEnv: {
9 | RESEND_API_KEY: process.env.RESEND_API_KEY,
10 | },
11 | skipValidation: process.env.NODE_ENV === "test",
12 | });
13 |
--------------------------------------------------------------------------------
/packages/notifications/email/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/nextjs.json",
3 | "include": ["src", "*.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/packages/notifications/ntfy/README.md:
--------------------------------------------------------------------------------
1 | # @openstatus/notification-ntfy
2 | To install dependencies:
3 |
4 | ```bash
5 | bun install
6 | ```
7 |
8 | To run:
9 |
10 | ```bash
11 | bun run src/index.ts
12 | ```
13 |
14 | This project was created using `bun init` in bun v1.0.0. [Bun](https://bun.sh)
15 | is a fast all-in-one JavaScript runtime.
16 |
--------------------------------------------------------------------------------
/packages/notifications/ntfy/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/notification-ntfy",
3 | "version": "1.0.0",
4 | "main": "src/index.ts",
5 | "dependencies": {
6 | "@openstatus/db": "workspace:*",
7 | "zod": "3.23.8"
8 | },
9 | "devDependencies": {
10 | "@openstatus/tsconfig": "workspace:*",
11 | "@types/node": "22.10.2",
12 | "typescript": "5.6.2"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/packages/notifications/ntfy/src/schema.ts:
--------------------------------------------------------------------------------
1 | import { z } from "zod";
2 |
3 | export const NtfySchema = z.object({
4 | ntfy: z.object({
5 | topic: z.string(),
6 | serverUrl: z.string().default("https://ntfy.sh"),
7 | token: z.string().optional(),
8 | }),
9 | });
10 |
--------------------------------------------------------------------------------
/packages/notifications/ntfy/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/nextjs.json",
3 | "include": ["src", "*.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/packages/notifications/opsgenie/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/nextjs.json",
3 | "include": ["src", "*.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/packages/notifications/pagerduty/.env.example:
--------------------------------------------------------------------------------
1 | PAGERDUTY_APP_ID=your_auth_token
2 |
--------------------------------------------------------------------------------
/packages/notifications/pagerduty/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/nextjs.json",
3 | "include": ["src", "*.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/packages/notifications/slack/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/notification-slack",
3 | "version": "0.0.0",
4 | "main": "src/index.ts",
5 | "dependencies": {
6 | "@openstatus/db": "workspace:*",
7 | "zod": "3.23.8"
8 | },
9 | "devDependencies": {
10 | "@openstatus/tsconfig": "workspace:*",
11 | "@types/node": "22.10.2",
12 | "typescript": "5.6.2"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/packages/notifications/slack/src/schema.ts:
--------------------------------------------------------------------------------
1 | import { z } from "zod";
2 |
3 | export const DataSchema = z.object({
4 | slack: z.string(),
5 | });
6 |
--------------------------------------------------------------------------------
/packages/notifications/slack/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/nextjs.json",
3 | "include": ["src", "*.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/packages/notifications/twillio-sms/.env.example:
--------------------------------------------------------------------------------
1 | TWILLIO_AUTH_TOKEN=your_auth_token
2 | TWILLIO_ACCOUNT_ID=your_account_id
3 |
--------------------------------------------------------------------------------
/packages/notifications/twillio-sms/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/notification-twillio-sms",
3 | "version": "0.0.0",
4 | "main": "src/index.ts",
5 | "dependencies": {
6 | "@openstatus/db": "workspace:*",
7 | "@t3-oss/env-core": "0.7.1",
8 | "validator": "13.12.0",
9 | "zod": "3.23.8"
10 | },
11 | "devDependencies": {
12 | "@openstatus/tsconfig": "workspace:*",
13 | "@types/node": "22.10.2",
14 | "@types/validator": "13.12.0",
15 | "typescript": "5.6.2"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/packages/notifications/twillio-sms/src/schema/config.ts:
--------------------------------------------------------------------------------
1 | import isMobilephone from "validator/lib/isMobilePhone";
2 | import { z } from "zod";
3 |
4 | export const SmsConfigurationSchema = z.object({
5 | sms: z.string().refine(isMobilephone),
6 | });
7 |
--------------------------------------------------------------------------------
/packages/notifications/twillio-sms/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/nextjs.json",
3 | "include": ["src", "*.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/packages/notifications/webhook/README.md:
--------------------------------------------------------------------------------
1 | # @openstatus/notification-webhook
2 | To install dependencies:
3 |
4 | ```bash
5 | bun install
6 | ```
7 |
8 | To run:
9 |
10 | ```bash
11 | bun run src/index.ts
12 | ```
13 |
14 | This project was created using `bun init` in bun v1.0.0. [Bun](https://bun.sh)
15 | is a fast all-in-one JavaScript runtime.
16 |
--------------------------------------------------------------------------------
/packages/notifications/webhook/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/notification-webhook",
3 | "version": "1.0.0",
4 | "main": "src/index.ts",
5 | "dependencies": {
6 | "@openstatus/db": "workspace:*",
7 | "@openstatus/utils": "workspace:*",
8 |
9 | "zod": "3.23.8"
10 | },
11 | "devDependencies": {
12 | "@openstatus/tsconfig": "workspace:*",
13 | "@types/node": "22.10.2",
14 | "typescript": "5.6.2"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/packages/notifications/webhook/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/nextjs.json",
3 | "include": ["src", "*.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/packages/react/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./widget";
2 |
--------------------------------------------------------------------------------
/packages/react/src/styles.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
--------------------------------------------------------------------------------
/packages/react/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: ["./src/**/*.{ts,tsx}"],
4 | theme: {
5 | extend: {},
6 | },
7 | plugins: [],
8 | };
9 |
--------------------------------------------------------------------------------
/packages/react/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/react-library.json",
3 | "exclude": ["node_modules"],
4 | "compilerOptions": {
5 | "esModuleInterop": true,
6 | "forceConsistentCasingInFileNames": true,
7 | "isolatedModules": true,
8 | "moduleResolution": "node",
9 | "preserveWatchOutput": true,
10 | "skipLibCheck": true,
11 | "noEmit": true,
12 | "strict": true
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/packages/react/tsup.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "tsup";
2 |
3 | export default defineConfig({
4 | entry: ["src/index.ts"],
5 | format: ["cjs", "esm"],
6 | splitting: false,
7 | sourcemap: true,
8 | clean: true,
9 | bundle: true,
10 | dts: true,
11 | });
12 |
--------------------------------------------------------------------------------
/packages/tinybird/_legacy/aggregated_monitor_per_day_mv.datasource:
--------------------------------------------------------------------------------
1 | # REMINDER: legacy
2 |
3 | # Data Source created from Pipe 'aggregated_monitor_day_mv'
4 | VERSION 0
5 |
6 | SCHEMA >
7 | `day` Int64,
8 | `monitorId` String,
9 | `avgLatency` AggregateFunction(avg, Int16),
10 | `count` AggregateFunction(count),
11 | `ok` AggregateFunction(count, Nullable(UInt8))
12 |
13 | ENGINE "AggregatingMergeTree"
14 | ENGINE_SORTING_KEY "day, monitorId"
15 |
--------------------------------------------------------------------------------
/packages/tinybird/_migration/tb_datasource_union.pipe:
--------------------------------------------------------------------------------
1 | NODE union_all
2 | SQL >
3 |
4 | SELECT count() FROM ping_response__v8
5 | UNION ALL
6 | SELECT count() FROM ping_response__v7
7 |
--------------------------------------------------------------------------------
/packages/tinybird/datasources/audit_log.datasource:
--------------------------------------------------------------------------------
1 | VERSION 0
2 |
3 | SCHEMA >
4 | `action` String `json:$.action`,
5 | `actor` String `json:$.actor`,
6 | `id` String `json:$.id`,
7 | `targets` Nullable(String) `json:$.targets`,
8 | `metadata` Nullable(String) `json:$.metadata`,
9 | `timestamp` Int64 `json:$.timestamp`,
10 | `version` Int16 `json:$.version`
11 |
12 | ENGINE "MergeTree"
13 | ENGINE_SORTING_KEY "id, timestamp, action"
14 |
--------------------------------------------------------------------------------
/packages/tinybird/datasources/external_status.datasource:
--------------------------------------------------------------------------------
1 |
2 | SCHEMA >
3 | `description` String `json:$.description`,
4 | `fetched_at` Int64 `json:$.fetched_at`,
5 | `indicator` String `json:$.indicator`,
6 | `name` String `json:$.name`,
7 | `time_zone` String `json:$.time_zone`,
8 | `updated_at` Int64 `json:$.updated_at`,
9 | `url` String `json:$.url`
10 |
11 | ENGINE "MergeTree"
12 | ENGINE_SORTING_KEY "description, time_zone, updated_at, url"
13 |
--------------------------------------------------------------------------------
/packages/tinybird/datasources/mv__http_status_45d.datasource:
--------------------------------------------------------------------------------
1 | VERSION 0
2 | # Data Source created from Pipe 'aggregate__http_status_45d__v0'
3 |
4 | SCHEMA >
5 | `time` DateTime('UTC'),
6 | `monitorId` String,
7 | `count` AggregateFunction(count),
8 | `ok` AggregateFunction(count, Nullable(UInt8))
9 |
10 | ENGINE "AggregatingMergeTree"
11 | ENGINE_PARTITION_KEY "toYYYYMM(time)"
12 | ENGINE_SORTING_KEY "monitorId, time"
13 | ENGINE_TTL "time + toIntervalDay(45)"
14 |
--------------------------------------------------------------------------------
/packages/tinybird/datasources/mv__http_status_7d.datasource:
--------------------------------------------------------------------------------
1 | VERSION 0
2 | # Data Source created from Pipe 'aggregate__http_status_7d__v0'
3 |
4 | SCHEMA >
5 | `time` DateTime('UTC'),
6 | `monitorId` String,
7 | `count` AggregateFunction(count),
8 | `ok` AggregateFunction(count, Nullable(UInt8))
9 |
10 | ENGINE "AggregatingMergeTree"
11 | ENGINE_PARTITION_KEY "toYYYYMM(time)"
12 | ENGINE_SORTING_KEY "monitorId, time"
13 | ENGINE_TTL "time + toIntervalDay(7)"
14 |
--------------------------------------------------------------------------------
/packages/tinybird/datasources/mv__tcp_14d.datasource:
--------------------------------------------------------------------------------
1 | VERSION 0
2 | # Data Source created from Pipe 'aggregate__tcp_14d__v0'
3 |
4 | SCHEMA >
5 | `time` DateTime,
6 | `latency` Int64,
7 | `error` Int16,
8 | `region` String,
9 | `trigger` Nullable(String),
10 | `timestamp` Int64,
11 | `cronTimestamp` Int64,
12 | `monitorId` Int32,
13 | `workspaceId` Int32
14 |
15 | ENGINE "MergeTree"
16 | ENGINE_PARTITION_KEY "toYYYYMM(time)"
17 | ENGINE_SORTING_KEY "monitorId, time"
18 | ENGINE_TTL "time + toIntervalDay(14)"
19 |
--------------------------------------------------------------------------------
/packages/tinybird/datasources/mv__tcp_1d.datasource:
--------------------------------------------------------------------------------
1 | VERSION 0
2 | # Data Source created from Pipe 'aggregate__tcp_1d__v0'
3 |
4 | SCHEMA >
5 | `time` DateTime,
6 | `latency` Int64,
7 | `error` Int16,
8 | `region` String,
9 | `trigger` Nullable(String),
10 | `timestamp` Int64,
11 | `cronTimestamp` Int64,
12 | `monitorId` Int32,
13 | `workspaceId` Int32
14 |
15 | ENGINE "MergeTree"
16 | ENGINE_PARTITION_KEY "toYYYYMM(time)"
17 | ENGINE_SORTING_KEY "monitorId, time"
18 | ENGINE_TTL "time + toIntervalDay(1)"
19 |
--------------------------------------------------------------------------------
/packages/tinybird/datasources/mv__tcp_30d.datasource:
--------------------------------------------------------------------------------
1 | VERSION 0
2 | # Data Source created from Pipe 'aggregate__tcp_30d__v0'
3 |
4 | SCHEMA >
5 | `time` DateTime,
6 | `latency` Int64,
7 | `error` Int16,
8 | `region` String,
9 | `trigger` Nullable(String),
10 | `timestamp` Int64,
11 | `cronTimestamp` Int64,
12 | `monitorId` Int32,
13 | `workspaceId` Int32
14 |
15 | ENGINE "MergeTree"
16 | ENGINE_PARTITION_KEY "toYYYYMM(time)"
17 | ENGINE_SORTING_KEY "monitorId, time"
18 | ENGINE_TTL "time + toIntervalDay(30)"
19 |
--------------------------------------------------------------------------------
/packages/tinybird/datasources/mv__tcp_7d.datasource:
--------------------------------------------------------------------------------
1 | VERSION 0
2 | # Data Source created from Pipe 'aggregate__tcp_7d__v0'
3 |
4 | SCHEMA >
5 | `time` DateTime,
6 | `latency` Int64,
7 | `error` Int16,
8 | `region` String,
9 | `trigger` Nullable(String),
10 | `timestamp` Int64,
11 | `cronTimestamp` Int64,
12 | `monitorId` Int32,
13 | `workspaceId` Int32
14 |
15 | ENGINE "MergeTree"
16 | ENGINE_PARTITION_KEY "toYYYYMM(time)"
17 | ENGINE_SORTING_KEY "monitorId, time"
18 | ENGINE_TTL "time + toIntervalDay(7)"
19 |
--------------------------------------------------------------------------------
/packages/tinybird/datasources/mv__tcp_status_45d.datasource:
--------------------------------------------------------------------------------
1 | VERSION 0
2 | # Data Source created from Pipe 'aggregate__tcp_status_45d__v0'
3 |
4 | SCHEMA >
5 | `time` DateTime('UTC'),
6 | `monitorId` Int32,
7 | `count` AggregateFunction(count),
8 | `ok` AggregateFunction(count, Nullable(UInt8))
9 |
10 | ENGINE "AggregatingMergeTree"
11 | ENGINE_PARTITION_KEY "toYYYYMM(time)"
12 | ENGINE_SORTING_KEY "monitorId, time"
13 | ENGINE_TTL "time + toIntervalDay(45)"
14 |
--------------------------------------------------------------------------------
/packages/tinybird/datasources/mv__tcp_status_7d.datasource:
--------------------------------------------------------------------------------
1 | VERSION 0
2 | # Data Source created from Pipe 'aggregate__tcp_status_7d__v0'
3 |
4 | SCHEMA >
5 | `time` DateTime('UTC'),
6 | `monitorId` Int32,
7 | `count` AggregateFunction(count),
8 | `ok` AggregateFunction(count, Nullable(UInt8))
9 |
10 | ENGINE "AggregatingMergeTree"
11 | ENGINE_PARTITION_KEY "toYYYYMM(time)"
12 | ENGINE_SORTING_KEY "monitorId, time"
13 | ENGINE_TTL "time + toIntervalDay(7)"
14 |
--------------------------------------------------------------------------------
/packages/tinybird/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/tinybird",
3 | "version": "0.0.0",
4 | "main": "src/index.ts",
5 | "license": "MIT",
6 | "dependencies": {
7 | "@chronark/zod-bird": "0.3.6",
8 | "zod": "3.23.8"
9 | },
10 | "devDependencies": {
11 | "@openstatus/tsconfig": "workspace:*",
12 | "@openstatus/utils": "workspace:*",
13 | "@types/node": "22.10.2",
14 | "typescript": "5.6.2"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/endpoint__http_get_30d.pipe:
--------------------------------------------------------------------------------
1 | VERSION 0
2 |
3 | TAGS http
4 |
5 | NODE endpoint
6 | SQL >
7 |
8 | %
9 | SELECT *
10 | FROM mv__http_full_30d__v0
11 | WHERE
12 | monitorId = {{ String(monitorId, '1', required=True) }}
13 | AND cronTimestamp = {{ Int64(cronTimestamp, 1709477432205, required=True) }}
14 | AND region = {{ String(region, 'ams', required=True) }}
15 | ORDER BY cronTimestamp DESC
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/endpoint__http_list_14d.pipe:
--------------------------------------------------------------------------------
1 | VERSION 0
2 |
3 | TAGS http
4 |
5 | NODE endpoint
6 | SQL >
7 |
8 | %
9 | SELECT * FROM mv__http_14d__v0
10 | WHERE
11 | monitorId = {{ String(monitorId, '1', required=True) }}
12 | ORDER BY cronTimestamp DESC
13 |
14 |
15 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/endpoint__http_list_1d.pipe:
--------------------------------------------------------------------------------
1 | VERSION 0
2 |
3 | TAGS http
4 |
5 | NODE endpoint
6 | SQL >
7 |
8 | %
9 | SELECT * FROM mv__http_1d__v0
10 | WHERE
11 | monitorId = {{ String(monitorId, '1', required=True) }}
12 | ORDER BY cronTimestamp DESC
13 |
14 |
15 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/endpoint__http_list_7d.pipe:
--------------------------------------------------------------------------------
1 | VERSION 0
2 |
3 | TAGS http
4 |
5 | NODE endpoint
6 | SQL >
7 |
8 | %
9 | SELECT * FROM mv__http_7d__v0
10 | WHERE
11 | monitorId = {{ String(monitorId, '1', required=True) }}
12 | ORDER BY cronTimestamp DESC
13 |
14 |
15 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/endpoint__tcp_get_30d.pipe:
--------------------------------------------------------------------------------
1 | VERSION 0
2 |
3 | TAGS tcp
4 |
5 | NODE endpoint
6 | SQL >
7 |
8 | %
9 | SELECT *
10 | FROM mv__tcp_full_30d__v0
11 | WHERE
12 | monitorId = {{ String(monitorId, '1', required=True) }}
13 | AND cronTimestamp = {{ Int64(cronTimestamp, 1709477432205, required=True) }}
14 | AND region = {{ String(region, 'ams', required=True) }}
15 | ORDER BY cronTimestamp DESC
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/endpoint__tcp_list_14d.pipe:
--------------------------------------------------------------------------------
1 | VERSION 0
2 |
3 | TAGS tcp
4 |
5 | NODE endpoint
6 | SQL >
7 |
8 | %
9 | SELECT * FROM mv__tcp_14d__v0
10 | WHERE
11 | monitorId = {{ String(monitorId, '1', required=True) }}
12 | ORDER BY cronTimestamp DESC
13 |
14 |
15 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/endpoint__tcp_list_1d.pipe:
--------------------------------------------------------------------------------
1 | VERSION 0
2 |
3 | TAGS tcp
4 |
5 | NODE endpoint
6 | SQL >
7 |
8 | %
9 | SELECT * FROM mv__tcp_1d__v0
10 | WHERE
11 | monitorId = {{ String(monitorId, '1', required=True) }}
12 | ORDER BY cronTimestamp DESC
13 |
14 |
15 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/endpoint__tcp_list_7d.pipe:
--------------------------------------------------------------------------------
1 | VERSION 0
2 |
3 | TAGS tcp
4 |
5 | NODE endpoint
6 | SQL >
7 |
8 | %
9 | SELECT * FROM mv__tcp_7d__v0
10 | WHERE
11 | monitorId = {{ String(monitorId, '1', required=True) }}
12 | ORDER BY cronTimestamp DESC
13 |
14 |
15 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/endpoint_audit_log.pipe:
--------------------------------------------------------------------------------
1 | VERSION 0
2 |
3 | NODE endpoint_audit_pipe_0
4 | SQL >
5 |
6 | % SELECT * FROM audit_log__v0 WHERE id = {{ String(event_id, 1) }} ORDER BY timestamp DESC
7 |
8 |
9 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/external_status.pipe:
--------------------------------------------------------------------------------
1 | VERSION 0
2 | NODE external_status_0
3 | SQL >
4 |
5 | %
6 | SELECT *
7 | FROM external_status
8 | WHERE name = {{ String(name, 'OpenAI') }}
9 | ORDER BY fetched_at DESC
10 | LIMIT {{ Int16(limit, 10000) }}
11 |
12 |
13 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/response_details.pipe:
--------------------------------------------------------------------------------
1 | VERSION 0
2 |
3 | NODE response_graph_0
4 | SQL >
5 |
6 | %
7 | SELECT *
8 | FROM ping_response__v7
9 | WHERE
10 | monitorId = {{ String(monitorId, '1') }}
11 | {% if defined(url) %} AND url = {{ String(url) }} {% end %}
12 | AND cronTimestamp = {{ Int64(cronTimestamp, 1706467215188) }}
13 | AND region = {{ String(region, 'ams') }}
14 |
15 |
16 |
--------------------------------------------------------------------------------
/packages/tinybird/pipes/single_checks_get.pipe:
--------------------------------------------------------------------------------
1 | VERSION 1
2 |
3 | NODE endpoint
4 | SQL >
5 |
6 | %
7 | SELECT *
8 | from check_response_http
9 | WHERE
10 | workspaceId = {{ Int16(workspaceId, 1) }}
11 | {% if defined(requestId) %} AND requestId = {{ Int16(requestId) }} {% end %}
12 | ORDER BY timestamp DESC
13 | LIMIT {{ Int32(pageSize, 10) }}
14 | OFFSET {{ Int32(page, 0) * Int32(pageSize, 10) }}
15 |
16 |
17 |
--------------------------------------------------------------------------------
/packages/tinybird/src/audit-log/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./client";
2 |
--------------------------------------------------------------------------------
/packages/tinybird/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./client";
2 | export * from "./audit-log";
3 | export * from "@chronark/zod-bird";
4 |
--------------------------------------------------------------------------------
/packages/tinybird/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/base.json",
3 | "exclude": ["node_modules"],
4 | "compilerOptions": {
5 | "esModuleInterop": true,
6 | "forceConsistentCasingInFileNames": true,
7 | "isolatedModules": true,
8 | "moduleResolution": "node",
9 | "preserveWatchOutput": true,
10 | "skipLibCheck": true,
11 | "noEmit": true,
12 | "strict": true
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/packages/tracker/README.md:
--------------------------------------------------------------------------------
1 | TODO: Update the different component/files to use the package as source of
2 | truth!
3 |
4 | - [x] public/status
5 | - [ ] package/react dev deps
6 | - [x] `status-check` on status page
7 | - [x] tracker `bar` on status page
8 | - [x] og image api `status-check`
9 | - [x] monitor (overview) dasboard
10 |
--------------------------------------------------------------------------------
/packages/tracker/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/tracker",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "src/index.ts",
6 | "scripts": {},
7 | "dependencies": {
8 | "@openstatus/db": "workspace:*",
9 | "@openstatus/tinybird": "workspace:*",
10 | "zod": "3.23.8"
11 | },
12 | "devDependencies": {
13 | "@openstatus/tsconfig": "workspace:*",
14 | "typescript": "5.6.2"
15 | },
16 | "keywords": [],
17 | "author": "",
18 | "license": "ISC"
19 | }
20 |
--------------------------------------------------------------------------------
/packages/tracker/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./tracker";
2 | export * from "./types";
3 | export * from "./config";
4 | export * from "./utils";
5 |
--------------------------------------------------------------------------------
/packages/tracker/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/base.json",
3 | "include": ["src", "*.ts"],
4 | "compilerOptions": {
5 | "target": "ES2021"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/packages/tsconfig/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/tsconfig",
3 | "version": "0.0.1"
4 | }
5 |
--------------------------------------------------------------------------------
/packages/tsconfig/react-library.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "display": "React Library",
4 | "extends": "./base.json",
5 | "compilerOptions": {
6 | "jsx": "react-jsx",
7 | "lib": ["ES2015", "DOM"],
8 | "module": "ESNext",
9 | "target": "es6"
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/packages/ui/src/components/collapsible.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
4 |
5 | const Collapsible = CollapsiblePrimitive.Root;
6 |
7 | const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
8 |
9 | const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;
10 |
11 | export { Collapsible, CollapsibleTrigger, CollapsibleContent };
12 |
--------------------------------------------------------------------------------
/packages/ui/src/components/skeleton.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "../lib/utils";
2 |
3 | function Skeleton({
4 | className,
5 | ...props
6 | }: React.HTMLAttributes) {
7 | return (
8 |
12 | );
13 | }
14 |
15 | export { Skeleton };
16 |
--------------------------------------------------------------------------------
/packages/ui/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import type { ClassValue } from "clsx";
2 | import { clsx } from "clsx";
3 | import { twMerge } from "tailwind-merge";
4 |
5 | export function cn(...inputs: ClassValue[]) {
6 | return twMerge(clsx(inputs));
7 | }
8 |
--------------------------------------------------------------------------------
/packages/ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/react-library.json",
3 | "include": ["."],
4 | "exclude": ["dist", "build", "node_modules"],
5 | "compilerOptions": {
6 | "paths": {
7 | "@/*": ["./src/*"]
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/packages/upstash/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/upstash",
3 | "version": "0.0.0",
4 | "license": "MIT",
5 | "main": "./src/index.ts",
6 | "dependencies": {
7 | "@upstash/kafka": "1.3.3",
8 | "@upstash/qstash": "2.6.2",
9 | "@upstash/ratelimit": "0.4.4",
10 | "@upstash/redis": "1.22.1"
11 | },
12 | "devDependencies": {
13 | "@openstatus/tsconfig": "workspace:*",
14 | "@types/node": "22.10.2",
15 | "tsup": "7.2.0",
16 | "typescript": "5.6.2"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/packages/upstash/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./redis/client";
2 | export * from "@upstash/redis";
3 |
--------------------------------------------------------------------------------
/packages/upstash/src/redis/client.ts:
--------------------------------------------------------------------------------
1 | import { Redis } from "@upstash/redis";
2 |
3 | // TO BE TESTED
4 | export const redis = Redis.fromEnv();
5 |
--------------------------------------------------------------------------------
/packages/upstash/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/base.json",
3 | "exclude": ["node_modules"],
4 | "compilerOptions": {
5 | "esModuleInterop": true,
6 | "forceConsistentCasingInFileNames": true,
7 | "isolatedModules": true,
8 | "moduleResolution": "node",
9 | "preserveWatchOutput": true,
10 | "skipLibCheck": true,
11 | "noEmit": true,
12 | "strict": true
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/packages/utils/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@openstatus/utils",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.ts",
6 | "scripts": {},
7 | "dependencies": {},
8 | "devDependencies": {
9 | "@openstatus/assertions": "workspace:*",
10 | "@openstatus/db": "workspace:*",
11 | "@openstatus/tsconfig": "workspace:*",
12 | "typescript": "5.6.2",
13 | "zod": "3.23.8"
14 | },
15 | "keywords": [],
16 | "author": "",
17 | "license": "ISC"
18 | }
19 |
--------------------------------------------------------------------------------
/packages/utils/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@openstatus/tsconfig/base.json",
3 | "include": ["src", "*.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/pnpm-workspace.yaml:
--------------------------------------------------------------------------------
1 | packages:
2 | - "apps/*"
3 | - "packages/**/*"
4 | - "packages/config/*"
5 | - "packages/emails/.react-email"
6 |
--------------------------------------------------------------------------------
/utils/api-bruno/Monitor Summary.bru:
--------------------------------------------------------------------------------
1 | meta {
2 | name: Monitor Summary
3 | type: http
4 | seq: 3
5 | }
6 |
7 | get {
8 | url: {{url}}/v1/monitor/1/summary
9 | body: none
10 | auth: none
11 | }
12 |
13 | headers {
14 | x-openstatus-key: 1
15 | }
16 |
--------------------------------------------------------------------------------
/utils/api-bruno/OpenApi.bru:
--------------------------------------------------------------------------------
1 | meta {
2 | name: OpenApi
3 | type: http
4 | seq: 1
5 | }
6 |
7 | get {
8 | url: {{url}}/v1/openapi
9 | body: none
10 | auth: none
11 | }
12 |
--------------------------------------------------------------------------------
/utils/api-bruno/bruno.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "1",
3 | "name": "OpenStatus",
4 | "type": "collection"
5 | }
6 |
--------------------------------------------------------------------------------
/utils/api-bruno/environments/local.bru:
--------------------------------------------------------------------------------
1 | vars {
2 | url: http://localhost:3000
3 | }
4 |
--------------------------------------------------------------------------------
/utils/api-bruno/environments/prod.bru:
--------------------------------------------------------------------------------
1 | vars {
2 | url: https://api.openstatus.dev
3 | }
4 |
--------------------------------------------------------------------------------
/utils/api-bruno/incident_update/Get Status Report Update.bru:
--------------------------------------------------------------------------------
1 | meta {
2 | name: Get Status Report Update
3 | type: http
4 | seq: 1
5 | }
6 |
7 | get {
8 | url: {{url}}/v1/status_report_update/{{updateId}}
9 | body: none
10 | auth: none
11 | }
12 |
13 | headers {
14 | x-openstatus-key: api-key
15 | }
16 |
17 | vars:pre-request {
18 | updateId: 32
19 | }
20 |
--------------------------------------------------------------------------------
/utils/api-bruno/incidents/All Status Reports.bru:
--------------------------------------------------------------------------------
1 | meta {
2 | name: All Status Reports
3 | type: http
4 | seq: 1
5 | }
6 |
7 | get {
8 | url: {{url}}/v1/status_report
9 | body: none
10 | auth: none
11 | }
12 |
13 | headers {
14 | x-openstatus-key: api-key
15 | }
16 |
--------------------------------------------------------------------------------
/utils/api-bruno/incidents/Get Status Report.bru:
--------------------------------------------------------------------------------
1 | meta {
2 | name: Get on status report
3 | type: http
4 | seq: 2
5 | }
6 |
7 | get {
8 | url: {{url}}/v1/status_report/{{id}}
9 | body: none
10 | auth: none
11 | }
12 |
13 | headers {
14 | x-openstatus-key: api-key
15 | }
16 |
17 | vars:pre-request {
18 | id: 31
19 | }
20 |
--------------------------------------------------------------------------------