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) <noreply@anthropic.com>
This commit is contained in:
Hongming Wang 2026-04-15 14:20:45 -07:00
commit 967313cbca
9 changed files with 257 additions and 0 deletions

23
.github/workflows/graphs.yml vendored Normal file
View File

@ -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

24
.github/workflows/response-time.yml vendored Normal file
View File

@ -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

32
.github/workflows/static-site.yml vendored Normal file
View File

@ -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

23
.github/workflows/summary.yml vendored Normal file
View File

@ -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

32
.github/workflows/uptime.yml vendored Normal file
View File

@ -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

78
.upptimerc.yml Normal file
View File

@ -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

21
LICENSE Normal file
View File

@ -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.

21
README.md Normal file
View File

@ -0,0 +1,21 @@
# [📈 Live Status](https://status.moleculesai.app): <!--live status--> **🟢 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)
<!--start: status pages-->
<!-- Auto-populated by the Upptime workflow on first run. -->
<!--end: status pages-->
## 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)

3
history/.gitkeep Normal file
View File

@ -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.