Public-facing status page for HydraDB, deployed at status.hydradb.com.
incident.io Widget API
|
v
+---------------+ writes JSON +----------+
| Cron Job | -------------------> | AWS S3 |
| (Vercel) | every 5 min | (public)|
+---------------+ +----------+
|
reads JSON (ISR)
|
v
+---------------------+
| status.hydradb.com |
| Next.js on Vercel |
| ISR (60s revalidate)|
+---------------------+
Key design principle: The frontend makes zero runtime API calls to incident.io. All data is pre-computed by the cron job and stored as a static JSON file in S3. If app.hydradb.com goes down, status.hydradb.com is completely unaffected.
- 6 component groups: Query & Retrieval, Knowledge Ingestion, Memories, Dashboard, Documentation, Website
- 90-day uptime history with 30/60/90 day rolling metrics
- Real-time incident display with status badges and update timeline
- Scheduled maintenance windows
- Dark theme matching HydraDB brand
- Node.js 18+
- AWS S3 bucket with public read access
- Vercel account
- (Optional) incident.io account with Widget API
Create an S3 bucket and add a public read policy for the status data.
Important: New S3 buckets block all public access by default. You must first go to the bucket's Permissions > Block public access settings and disable "Block all public access" (you can leave the other sub-options off too, or just uncheck the top-level toggle). Then add this bucket policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadStatusJson",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/status.json"
}
]
}The cron job's AWS credentials also need read/write access. Create an IAM policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/status.json"
}
]
}Attach this policy to the IAM user whose credentials you use for AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY.
Copy .env.example and fill in:
cp .env.example .env.local| Variable | Required | Description |
|---|---|---|
AWS_ACCESS_KEY_ID |
Yes | AWS credentials with S3 read/write access |
AWS_SECRET_ACCESS_KEY |
Yes | AWS secret key |
S3_REGION |
Yes | S3 bucket region (e.g., us-east-1) |
S3_BUCKET_NAME |
Yes | S3 bucket name |
CRON_SECRET |
Yes | Secret for authenticating Vercel cron requests |
INCIDENT_IO_WIDGET_URL |
No | incident.io Widget API URL (omit to use defaults) |
# Install Vercel CLI
npm i -g vercel
# Deploy
vercel --prodSet all environment variables in the Vercel dashboard under Settings > Environment Variables.
The cron job is configured in vercel.json to run every 5 minutes at /api/cron.
Add a CNAME record pointing status.hydradb.com to your Vercel deployment URL, then add the custom domain in Vercel's dashboard.
npm install
npm run devWithout S3 credentials, the page renders in an unconfigured fallback state showing default component groups.
npx jest --verbose- Next.js 14 (App Router, ISR)
- TypeScript (strict mode)
- AWS S3 (static data storage)
- Tailwind CSS (utility classes + CSS variables for theming)
- Jest (unit testing)