How to Create Status Page Free
Tutorial: create a free status page for developers in 5 minutes. API setup, add components, embed a status badge, and manage incidents.
How to Create a Free Status Page for Developers
Last Tuesday at 3:12 PM, your API started returning 502 errors. You found out 47 minutes later -- not from your monitoring, but from a tweet that read "is @yourapp down or is it just me?" followed by 23 replies confirming the outage. By the time you acknowledged the issue publicly, your support inbox had 84 unread messages. A status page would have turned that 47-minute silence into a 2-minute acknowledgment. Your users would have checked the page, seen "Investigating," and gone back to their day instead of flooding Twitter and your inbox.
Setting up a status page used to mean paying $79/month for Atlassian StatusPage or self-hosting an open-source solution that takes a weekend to configure. Neither makes sense when your MRR is $200 and your time is worth more than fighting Kubernetes manifests. You can have a professional, publicly accessible status page running in under 5 minutes with zero cost using Luxkern StatusPage.
What the Free Tier Actually Includes
The free tier is not a demo. It is a fully functional status page with these limits:
yourapp.luxkern.comFor context, 92% of projects on Luxkern run on fewer than 3 components. The 50-subscriber cap covers your team, your most engaged users, and your investors -- the people who actually need proactive notifications. When you outgrow these limits, the Solo plan at EUR 19/month removes all caps.
Create Your Status Page via API
Sign up at luxkern.com (no credit card), grab your API key from the dashboard, and run this:
# Create a status page
curl -X POST https://api.luxkern.com/v1/statuspages \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $LUXKERN_API_KEY" \
-d '{
"name": "ShipFast Status",
"slug": "shipfast",
"description": "Real-time status for ShipFast services",
"settings": {
"allow_subscriptions": true,
"show_uptime_history": true,
"history_days": 90
}
}'The response gives you a
page_id and a live URL at shipfast.luxkern.com. Open it -- you will see "All Systems Operational" with an empty component list.Now add your components. For a typical SaaS, three components cover the user-facing surface area: your API, your web app, and authentication.
// add-components.js
const LUXKERN_API = "https://api.luxkern.com/v1";
const API_KEY = process.env.LUXKERN_API_KEY;
async function addComponents(pageId) {
const components = [
{ name: "API", description: "REST API and webhook endpoints", position: 1 },
{ name: "Web Application", description: "Dashboard and user interface", position: 2 },
{ name: "Authentication", description: "Login, signup, and sessions", position: 3 },
];
for (const comp of components) {
const res = await fetch(${LUXKERN_API}/statuspages/${pageId}/components, {
method: "POST",
headers: {
Authorization: Bearer ${API_KEY},
"Content-Type": "application/json",
},
body: JSON.stringify({
...comp,
status: "operational",
show_uptime: true,
}),
});
const data = await res.json();
console.log(Added component: ${data.name} (ID: ${data.id}));
}
}
// Replace with your actual page ID from the creation step
addComponents("page_abc123");Run
node add-components.js and refresh your status page. Three green components, each showing "Operational." Total elapsed time: about 2 minutes.Post Your First Incident
The incident workflow has four statuses: Investigating, Identified, Monitoring, and Resolved. Each update gets timestamped and displayed publicly. Here is the full lifecycle in one script:
import requests
import os
import time
API = "https://api.luxkern.com/v1"
KEY = os.environ["LUXKERN_API_KEY"]
HEADERS = {
"Authorization": f"Bearer {KEY}",
"Content-Type": "application/json",
}
PAGE_ID = "page_abc123"
API_COMPONENT_ID = "comp_xyz789"
Step 1: Create incident
incident = requests.post(
f"{API}/statuspages/{PAGE_ID}/incidents",
headers=HEADERS,
json={
"title": "Elevated API response times",
"status": "investigating",
"impact": "minor",
"body": "We are seeing p99 latency above 2s on write endpoints. Read operations are unaffected.",
"affected_components": [
{"id": API_COMPONENT_ID, "status": "degraded"}
],
"notify_subscribers": True,
},
).json()
print(f"Incident created: {incident['id']}")
Step 2: Update with root cause
time.sleep(5) # In reality, this is minutes later
requests.post(
f"{API}/statuspages/{PAGE_ID}/incidents/{incident['id']}/updates",
headers=HEADERS,
json={
"status": "identified",
"body": "Root cause: a long-running database migration is causing write contention. ETA for resolution: 15 minutes.",
},
)
Step 3: Resolve
time.sleep(5)
requests.post(
f"{API}/statuspages/{PAGE_ID}/incidents/{incident['id']}/updates",
headers=HEADERS,
json={
"status": "resolved",
"body": "Migration complete. API response times have returned to normal across all endpoints.",
"affected_components": [
{"id": API_COMPONENT_ID, "status": "operational"}
],
},
)
print("Incident resolved")Your status page now shows the full incident timeline with timestamps. Subscribers who opted in receive email notifications at each status change. The incident moves to the history section automatically.
Embed a Status Badge in Your App
A status badge is a small green/yellow/red indicator that sits in your app footer, docs site, or GitHub README. It links to the full status page so users find your status page before they find your support inbox.
Drop this HTML into your footer:
<a href="https://shipfast.luxkern.com" target="_blank" rel="noopener noreferrer">
<img
src="https://shipfast.luxkern.com/badge"
alt="Service Status"
height="20"
/>
</a>The badge image updates automatically. Green when all components are operational, yellow during degraded performance, red during outages. No JavaScript, no polling, no build step.
For React apps that need a dynamic badge with real-time updates:
import { useEffect, useState } from "react";
export function StatusBadge({ slug }) {
const [status, setStatus] = useState("operational");
useEffect(() => {
const check = async () => {
try {
const res = await fetch(
https://api.luxkern.com/v1/statuspages/${slug}/status
);
const data = await res.json();
setStatus(data.overall_status);
} catch {
// Fail open: show operational if we cannot reach the API
}
};
check();
const interval = setInterval(check, 60_000);
return () => clearInterval(interval);
}, [slug]);
const colors = {
operational: "#22C55E",
degraded: "#EAB308",
partial_outage: "#F97316",
major_outage: "#EF4444",
};
const labels = {
operational: "All Systems Operational",
degraded: "Degraded Performance",
partial_outage: "Partial Outage",
major_outage: "Major Outage",
};
return (
<a
href={https://${slug}.luxkern.com}
target="_blank"
rel="noopener noreferrer"
style={{
display: "inline-flex",
alignItems: "center",
gap: 6,
padding: "4px 10px",
borderRadius: 9999,
backgroundColor: ${colors[status]}15,
border: 1px solid ${colors[status]}40,
fontSize: 13,
fontWeight: 500,
color: colors[status],
textDecoration: "none",
}}
>
<span
style={{
width: 8,
height: 8,
borderRadius: "50%",
backgroundColor: colors[status],
}}
/>
{labels[status]}
</a>
);
}This component polls every 60 seconds and updates the badge color automatically. Drop
in your footer and forget about it.Set Up Notifications and Scheduled Maintenance
Email subscriptions are enabled by default. Your status page shows a "Subscribe to Updates" button that captures email addresses. On the free tier, you get 50 subscriber slots -- enough for your team plus your most vocal users.
For internal notifications, set up a webhook to push incident alerts to Slack or Discord:
# Add a Slack webhook subscriber
curl -X POST "https://api.luxkern.com/v1/statuspages/$PAGE_ID/subscribers" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $LUXKERN_API_KEY" \
-d '{
"type": "webhook",
"url": "'"$SLACK_WEBHOOK_URL"'",
"events": [
"incident.created",
"incident.updated",
"incident.resolved",
"maintenance.scheduled"
]
}'For scheduled maintenance, proactive communication prevents support tickets. Schedule a maintenance window and let subscribers know 24 hours and 1 hour before:
curl -X POST "https://api.luxkern.com/v1/statuspages/$PAGE_ID/maintenances" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $LUXKERN_API_KEY" \
-d '{
"title": "Database upgrade -- brief downtime expected",
"body": "Upgrading primary database for performance improvements. Expect 5-10 minutes of downtime on write operations.",
"scheduled_start": "2026-12-15T02:00:00Z",
"scheduled_end": "2026-12-15T02:30:00Z",
"affected_components": [{"id": "'"$API_COMPONENT_ID"'", "status": "maintenance"}],
"notify_subscribers": true,
"notify_before_minutes": [1440, 60]
}'The maintenance window appears on your status page with a countdown timer. Subscribers get notified at each interval you specify. When the window starts, affected components automatically switch to "Under Maintenance." When it ends, they revert to "Operational."
Practical Tips That Save You Support Tickets
Name components for users, not engineers. "API" is fine. "Redis Cluster Node 3" is not. Your users do not know what Redis is and they do not care. Map components to the functionality they experience: "File Uploads," "Email Delivery," "Dashboard."
Update incidents every 15-30 minutes. Even "Still investigating, no new information" is better than a stale incident with a timestamp from 2 hours ago. Silence makes users assume nobody is working on it.
Link your status page everywhere. Put it in your app footer, your 500 error page, your 503 error page, your documentation, your support auto-reply, and your email signature. The goal is that when something breaks, users find the status page before they find the tweet button. Teams that already have a clear understanding of what status pages do see 60% fewer support tickets during incidents.
Monitor your own status page. Set up an uptime check that pings your
yourapp.luxkern.com URL every minute. Hosted status pages rarely go down, but if yours does during an outage, you want to know immediately.When to Upgrade
The free tier handles most indie projects and early-stage startups comfortably. Consider upgrading when:
status.yourapp.com instead of yourapp.luxkern.comThe Solo plan at EUR 19/month removes all these limits. If you also need uptime monitoring, cron monitoring, and log management, the Builder plan at EUR 39/month bundles 9 tools. If you are evaluating alternatives, our comparison of StatusPage.io alternatives for 2026 breaks down pricing and features side by side.
Your status page is live. Your components are green. Your incident workflow is tested. The next time your API hiccups, your users will check
shipfast.luxkern.com instead of tweeting -- and you will have bought yourself the 10 minutes you need to actually fix the problem.Try Luxkern StatusPage free -- no credit card, no time limit.