···129129pnpm dx
130130```
131131132132-4. Launch the web app
132132+4. Launch whatever app you wish to:
133133134134```sh
135135pnpm dev:web
136136+pnpm dev:status-page
137137+pnpm dev:dashboard
136138```
137139140140+The above commands whill automatically run the libSQL client on `8080` so you might wanna kill the turso command from step 3.
141141+1381425. See the results:
139143140140-- open [http://localhost:3000](http://localhost:3000) for the web app
144144+- open [http://localhost:3000](http://localhost:3000) (default port)
141145142146### Videos
143147
+36-6
packages/theme-store/README.md
···11# Community Themes
2233+**Help us build epic status page themes!**
44+35This directory contains community-contributed themes for openstatus status pages. These themes allow users to customize the visual appearance of their status pages with different color schemes and design styles.
4657## What are Community Themes?
···12141315## Themes Examples
14161515-- **Default** - The standard openstatus theme
1717+- **Openstatus** - The standard openstatus theme
1818+- **Openstatus (Rounded)** - The rounded openstatus theme (similar to the legacy page)
1919+- **Supabase** - Theme matching Supabase's brand colors
1620- **GitHub (High Contrast)** - High contrast theme inspired by GitHub's design
1717-- **Supabase** - Theme matching Supabase's brand colors
18211922## Creating a New Theme
2023···23262427Want to contribute a theme? Follow these steps:
25282626-### 1. Fork the Repository
2727-Start by forking the openstatus repository to your GitHub account.
2929+### 1. Run the project
3030+3131+Start by forking the openstatus repository to your GitHub account and run the command `dev:status-page` locally following [Getting Started](https://github.com/openstatusHQ/openstatus?tab=readme-ov-file#getting-started-) steps.
3232+3333+Once you run the `@openstatus/status-page` app, e.g. via the following command in the root directory:
3434+3535+```bash
3636+pnpm dev:status-page
3737+```
3838+3939+You can either access [localhost:3000](http://localhost:3000) to see the theme explorer or [localhost:3000/status](http://localhost:3000/status) to have a status page with seeded entries. On the bottom right is a configration button which has access to settings, including the community theme.
4040+4141+> If something is off, our you think improvements can be made, feel free to raise an issue, join Discord, or DM us!
28422943### 2. Create Your Theme File
4444+3045Create a new TypeScript file in this directory (e.g., `my-theme.ts`). You can copy an existing theme file as a starting template.
31463247### 3. Define Your Theme
4848+3349Your theme file should export a constant that matches the `Theme` interface:
34503551```typescript
···4056 name: "My Awesome Theme", // Display name
4157 author: {
4258 name: "@yourusername",
4343- url: "https://github.com/yourusername"
5959+ url: "https://github.com/yourusername" // Add your personal website or a social link
4460 },
4561 light: {
4662 // CSS custom properties for light mode
···5773} as const satisfies Theme;
5874```
59757676+You don't need to add every single css var from the `THEME_VAR_NAMES` list.
7777+6078### 4. Add to Theme Registry
7979+6180Update `index.ts` to include your theme in the `THEMES_LIST` array.
62818282+```typescript
8383+const THEMES_LIST = [
8484+ OPENSTATUS_THEME,
8585+ OPENSTATUS_ROUNDED_THEME,
8686+ //...
8787+ MY_THEME
8888+] satisfies Theme[];
8989+9090+```
9191+6392### 5. Submit a Pull Request
9393+6494Create a pull request with your theme for review.
65956696## Design Guidelines
···941243. Check accessibility with browser dev tools
951254. Ensure all status indicators (operational, degraded, etc.) are clearly distinguishable
961269797-To test a theme, you can use the `sessionStorage.setItem("community-theme", "true");` on your stpg.dev or vercel preview link. It will open a floating button on the right left corner where you can choose between the themes and dark/light mode.
127127+To test a theme on non-development environment, you can use the `sessionStorage.setItem("community-theme", "true");`. It will open a floating button on the right left corner where you can choose between the themes and dark/light mode.
9812899129## Questions?
100130
···11export const THEME_VAR_NAMES = [
22+ // NOTE: default shadcn/ui colors
23 "--radius",
34 "--background",
45 "--foreground",
···1415 "--muted-foreground",
1516 "--accent",
1617 "--accent-foreground",
1717- "--destructive",
1818 "--border",
1919 "--input",
2020 "--ring",
2121+ "--destructive", // red, outage/error status
2222+ // NOTE: the following colors are used for the public monitors UI to differentiate the percentiles of the response times
2123 "--chart-1",
2224 "--chart-2",
2325 "--chart-3",
2426 "--chart-4",
2527 "--chart-5",
2626- "--sidebar",
2727- "--sidebar-foreground",
2828- "--sidebar-primary",
2929- "--sidebar-primary-foreground",
3030- "--sidebar-accent",
3131- "--sidebar-accent-foreground",
3232- "--sidebar-border",
3333- "--sidebar-ring",
3434- "--success",
3535- "--warning",
3636- "--info",
2828+2929+ // NOTE: the following colors are not part of shadcn/ui, but are essential part of the status page
3030+ "--success", // green, operational status
3131+ "--warning", // yellow, degraded status
3232+ "--info", // blue, monitoring status
3333+3434+ // NOTE: the following colors are used for the public monitors UI to differentiate the different regions
3535+ // It is not required to add them to your custom theme, but you can if you want to.
3636+ // DEFAULT: https://github.com/openstatusHQ/openstatus/blob/main/apps/status-page/src/app/globals.css#L98
3737 "--rainbow-1",
3838 "--rainbow-2",
3939 "--rainbow-3",
+13
packages/theme-store/src/utils.ts
···11+import type { Theme } from "./types";
22+33+export function assertUniqueThemeIds(themes: Theme[]) {
44+ const seen = new Set<string>();
55+ for (const theme of themes) {
66+ if (seen.has(theme.id)) {
77+ throw new Error(
88+ `Duplicate theme ID detected: "${theme.id}" in theme "${theme.name}". All theme IDs must be unique.`,
99+ );
1010+ }
1111+ seen.add(theme.id);
1212+ }
1313+}