commit 967313cbca342158a638693138b399b70a838f6f Author: Hongming Wang Date: Wed Apr 15 14:20:45 2026 -0700 chore: initial Upptime scaffold for status.moleculesai.app Seeds the Upptime-powered status page for Molecule AI. Zero-infra: GitHub Actions cron every 5min checks each endpoint, commits the result to history/, and rebuilds the static site into the gh-pages branch. Incident detection auto-opens Issues in this repo. - .upptimerc.yml — five sites monitored on first cut: - molecule-cp /health + /legal/terms - moleculesai.app / + /pricing + /legal/terms Each has a display name that matches the status page UI. - .github/workflows/uptime.yml — 5min uptime check - .github/workflows/response-time.yml — hourly latency histogram - .github/workflows/graphs.yml — daily long-term graphs - .github/workflows/static-site.yml — hourly site rebuild - .github/workflows/summary.yml — daily README badge refresh - README.md — landing page with workflow status badges, Upptime markers for auto-populated status section - history/.gitkeep — placeholder so the workflows' first run has a dir to commit into - LICENSE — MIT Next steps documented separately: enable GitHub Pages (Settings → Pages → Source: gh-pages branch), add DNS CNAME record for status.moleculesai.app → molecule-ai.github.io. Co-Authored-By: Claude Opus 4.6 (1M context) diff --git a/.github/workflows/graphs.yml b/.github/workflows/graphs.yml new file mode 100644 index 0000000..c90abfe --- /dev/null +++ b/.github/workflows/graphs.yml @@ -0,0 +1,23 @@ +name: Graphs CI +on: + repository_dispatch: + types: [graphs] + schedule: + # Daily at 00:00 UTC is enough for the long-term uptime graphs. + - cron: "0 0 * * *" + workflow_dispatch: + +jobs: + release: + name: Generate graphs + runs-on: ubuntu-latest + steps: + - uses: upptime/uptime-monitor@master + with: + command: "graphs" + env: + GH_PAT: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }} + +permissions: + contents: write + issues: write diff --git a/.github/workflows/response-time.yml b/.github/workflows/response-time.yml new file mode 100644 index 0000000..f72e1b7 --- /dev/null +++ b/.github/workflows/response-time.yml @@ -0,0 +1,24 @@ +name: Response Time CI +on: + repository_dispatch: + types: [response-time] + schedule: + # Hourly is enough for response-time histograms — the uptime + # workflow already captures short-term latency in each check. + - cron: "0 * * * *" + workflow_dispatch: + +jobs: + release: + name: Update response time graphs + runs-on: ubuntu-latest + steps: + - uses: upptime/uptime-monitor@master + with: + command: "response-time" + env: + GH_PAT: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }} + +permissions: + contents: write + issues: write diff --git a/.github/workflows/static-site.yml b/.github/workflows/static-site.yml new file mode 100644 index 0000000..83aab27 --- /dev/null +++ b/.github/workflows/static-site.yml @@ -0,0 +1,32 @@ +name: Static Site CI +on: + repository_dispatch: + types: [static-site] + schedule: + # Every hour — rebuilds the status page HTML from the latest + # check history. More frequent than necessary but cheap. + - cron: "0 * * * *" + push: + branches: + - main + paths: + - ".upptimerc.yml" + - "README.md" + - "history/**" + workflow_dispatch: + +jobs: + release: + name: Build and deploy status site + runs-on: ubuntu-latest + steps: + - uses: upptime/uptime-monitor@master + with: + command: "site" + env: + GH_PAT: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }} + +permissions: + contents: write + pages: write + id-token: write diff --git a/.github/workflows/summary.yml b/.github/workflows/summary.yml new file mode 100644 index 0000000..d919eee --- /dev/null +++ b/.github/workflows/summary.yml @@ -0,0 +1,23 @@ +name: Summary CI +on: + repository_dispatch: + types: [summary] + schedule: + # Daily summary of past-day uptime posted to the README badges. + - cron: "0 0 * * *" + workflow_dispatch: + +jobs: + release: + name: Generate README + summary + runs-on: ubuntu-latest + steps: + - uses: upptime/uptime-monitor@master + with: + command: "readme" + env: + GH_PAT: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }} + +permissions: + contents: write + issues: write diff --git a/.github/workflows/uptime.yml b/.github/workflows/uptime.yml new file mode 100644 index 0000000..1904210 --- /dev/null +++ b/.github/workflows/uptime.yml @@ -0,0 +1,32 @@ +name: Uptime CI +on: + repository_dispatch: + types: [uptime] + schedule: + # Every 5 minutes. GitHub Actions caps schedule resolution at ~5min + # in practice; requesting */1 or */3 just gets coalesced. + - cron: "*/5 * * * *" + workflow_dispatch: + push: + # Re-run whenever the sites list changes so new endpoints get an + # immediate first check instead of waiting up to 5 minutes. + branches: + - main + paths: + - ".upptimerc.yml" + +jobs: + release: + name: Check status of endpoints + runs-on: ubuntu-latest + steps: + - uses: upptime/uptime-monitor@master + with: + command: "update" + env: + GH_PAT: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }} + +permissions: + contents: write + issues: write + pull-requests: write diff --git a/.upptimerc.yml b/.upptimerc.yml new file mode 100644 index 0000000..566e04f --- /dev/null +++ b/.upptimerc.yml @@ -0,0 +1,78 @@ +# Molecule AI status page +# Powered by Upptime (https://upptime.js.org) +# +# This file is the single source of truth for what gets monitored. +# Add new endpoints under `sites:` and the next workflow run picks +# them up. Workflows live in .github/workflows/. + +owner: Molecule-AI +repo: molecule-ai-status + +# URLs to monitor. `name` is the display label on the status page; +# `url` is hit on every uptime check (every 5 minutes by default). +# `expectedStatusCodes` defaults to [200, 201, 202, 203, 204, 205, 206, +# 207, 208, 226]; override per-site when a route legitimately returns +# a non-2xx on health. +sites: + - name: Control plane API + url: https://molecule-cp.fly.dev/health + # /health returns {"service":"molecule-cp","status":"ok"} + + - name: Control plane — Legal pages + url: https://molecule-cp.fly.dev/legal/terms + # HTML page; tests markdown-renderer path + static embed still works + + - name: Canvas — apex (marketing + pricing) + url: https://moleculesai.app/ + # Canvas apex lands on the marketing / landing route + + - name: Canvas — pricing route + url: https://moleculesai.app/pricing + # Tests that the pricing page ships with the canvas deploy + + - name: Canvas — legal redirect + url: https://moleculesai.app/legal/terms + # Verifies the canvas-side redirect (or direct serve) of legal pages + +status-website: + # Branding for the GitHub Pages status site. Dark-theme colors match + # the canvas aesthetic so the visual transition from status → + # product is seamless. + cname: status.moleculesai.app + name: Molecule AI Status + logoUrl: https://moleculesai.app/icon.png + introTitle: "Molecule AI status" + introMessage: > + Real-time uptime for the Molecule AI control plane, canvas, and + legal pages. Incidents automatically open as GitHub Issues in this + repo; subscribe to the repo to get email alerts when services + degrade. + navbar: + - title: Status + href: / + - title: GitHub + href: https://github.com/Molecule-AI/molecule-ai-status + +# Assignees for incident Issues auto-created by the uptime workflow. +# Upptime opens an Issue the moment a check fails; add GitHub logins +# here so it auto-assigns + emails them. +assignees: + - HongmingWang-Rabbit + +# How long before a failing check is declared an incident. +# Default is 2 consecutive failures; we use 3 to absorb transient +# blips (Fly cold-start on scale-to-zero, DNS flap). +i18n: + activeIncidents: Active incidents + allSystemsOperational: All systems operational + incidentReport: Incident report + incidents: Incidents + live: Live + pastIncidents: Past incidents + responseTime: Response time + status: Status + title: Status + upBadge: Up + downBadge: Down + degradedBadge: Degraded + uptime: Uptime diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..41c4bf0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Molecule AI, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..53f9da1 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# [📈 Live Status](https://status.moleculesai.app): **🟢 Operational** + +This repository contains the open-source uptime monitor and status page for +[**Molecule AI**](https://moleculesai.app), powered by [Upptime](https://upptime.js.org). + +[![Uptime CI](https://github.com/Molecule-AI/molecule-ai-status/actions/workflows/uptime.yml/badge.svg)](https://github.com/Molecule-AI/molecule-ai-status/actions/workflows/uptime.yml) +[![Response Time CI](https://github.com/Molecule-AI/molecule-ai-status/actions/workflows/response-time.yml/badge.svg)](https://github.com/Molecule-AI/molecule-ai-status/actions/workflows/response-time.yml) +[![Graphs CI](https://github.com/Molecule-AI/molecule-ai-status/actions/workflows/graphs.yml/badge.svg)](https://github.com/Molecule-AI/molecule-ai-status/actions/workflows/graphs.yml) +[![Static Site CI](https://github.com/Molecule-AI/molecule-ai-status/actions/workflows/static-site.yml/badge.svg)](https://github.com/Molecule-AI/molecule-ai-status/actions/workflows/static-site.yml) +[![Summary CI](https://github.com/Molecule-AI/molecule-ai-status/actions/workflows/summary.yml/badge.svg)](https://github.com/Molecule-AI/molecule-ai-status/actions/workflows/summary.yml) + +## [📊 Overall Uptime](https://status.moleculesai.app) + + + + + +## License + +- Code: [MIT](./LICENSE) © [Molecule AI](https://moleculesai.app) +- Website content and design: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/) © [Molecule AI](https://moleculesai.app) diff --git a/history/.gitkeep b/history/.gitkeep new file mode 100644 index 0000000..94e43df --- /dev/null +++ b/history/.gitkeep @@ -0,0 +1,3 @@ +# Upptime populates this directory with one markdown file per monitored +# site on the first successful workflow run. Keep this .gitkeep so the +# dir exists at initial commit.