Faut-il créer votre propre Instatus ?
Pages d'état hébergées avec mises à jour d'incidents et notifications aux abonnés pour vos utilisateurs.
La page elle-même est la partie facile : composants, pastilles de couleur, chronologie des incidents, barre de disponibilité sur 90 jours ; un agent vous fournira cela en un après-midi. La diffusion des notifications est là où les choses se compliquent : pour l'e-mail, il suffit d'un compte Resend et d'une boucle, mais vous héritez de la double confirmation d'inscription, des désabonnements, de la gestion des rejets et des explications à fournir sur l'e-mail d'incident arrivé dans les spams pendant la panne. L'hébergement est l'autre moitié : une page d'état sur la même infrastructure que le service qu'elle décrit n'est que décorative ; il vous faut donc un hébergeur et un domaine séparés, ainsi que la discipline de garder l'ensemble simple et prévisible. Ajoutez le workflow qu'Instatus vous fournit discrètement : publier une mise à jour depuis votre téléphone à 2am, gérer les préférences des abonnés par composant, Slack, RSS et les webhooks. Réalisable en un week-end pour un projet personnel ; ce n'est pas l'outil à bricoler soi-même si un véritable contrat client contient les mots « page d'état ».
EN → FRAnalyse traduite automatiquement de l’anglais. Prompt original conservé en anglais.
Build a self-hosted status page app in an empty folder. Stack, no substitutions: Node 20, Fastify, better-sqlite3, server-rendered HTML via Fastify's reply.type('text/html') and plain template literal functions, vanilla CSS in one file. No React, no build step, no ORM.
What it does:
1. Public page at / showing a list of components (name, description, status: operational, degraded, partial_outage, major_outage) with an overall banner computed from the worst component status.
2. Under that, incidents newest first. An incident has a title, impact, current status (investigating, identified, monitoring, resolved), and an append-only list of timestamped updates.
3. A 90 day uptime strip per component rendered from a daily_status table (one row per component per day, worst status seen that day). Fill it from the poller below.
4. GET /api/status returning the same data as JSON, and GET /feed.rss as a valid RSS 2.0 feed of incident updates.
5. Admin at /admin behind a single bearer token from ADMIN_TOKEN in .env, checked with a constant-time compare. Forms to: set component status, open an incident, append an update, resolve it. HTML forms, no JS framework.
6. Subscribers: POST /subscribe takes an email, stores it unconfirmed with a random token, emails a confirm link. GET /confirm/:token confirms. Every email includes a working GET /unsubscribe/:token link. When an admin appends an incident update, queue one email per confirmed subscriber and send them sequentially with a small delay, logging failures to a sends table. Use Resend via fetch with RESEND_API_KEY from .env; if the key is absent, write the emails to ./outbox/ as .txt files instead so it runs offline.
7. Optional poller: a setInterval that HTTP GETs each component's check_url if set, marks degraded on slow responses over 2s and major_outage on non-2xx or timeout, and writes daily_status.
In scope: SQLite schema created on boot with migrations as plain SQL strings, seed script with three components and one resolved incident, a README that says in one sentence to deploy this somewhere other than the infrastructure it monitors.
Out of scope, do not build: multi-tenancy, SMS, Slack or Discord integrations, OAuth, custom domain automation, an analytics or telemetry call of any kind, Docker, a JS bundler.
Secrets only in .env, with a .env.example committed and .env gitignored. Include npm scripts: dev, seed, poll. It must run with npm install and npm run dev on a clean machine.Le prompt s’ouvre prérempli dans votre agent. Relisez-le avant de l’exécuter. · ce prompt est généré à partir du plan de construction · améliorez-le via une PR
Comment créer votre propre version ?
Une page d'état hébergée séparément qui affiche la santé des composants et les mises à jour d'incidents depuis une petite base de données, avec un formulaire d'administration pour publier des mises à jour et un envoi groupé d'e-mails aux abonnés confirmés.
Ce dont vous aurez besoin
- Un hébergeur distinct de l'infrastructure dont vous rendez compte, idéalement un fournisseur entièrement différent
- Un domaine ou sous-domaine séparé sur un DNS distinct
- Un fournisseur d'e-mails transactionnels avec domaine d'envoi vérifié, par exemple Resend ou Postmark
- Un emplacement de stockage des abonnés qui résiste à un redémarrage
Parce qu'une page d'état est la seule page qui doit fonctionner quand plus rien d'autre ne fonctionne, et que payer un tiers est le moyen le moins cher d'acheter cette indépendance. C'est aussi une page que les clients et les auditeurs consultent ; être un peu laide ou un peu en retard coûte donc davantage en confiance que l'abonnement ne coûte en argent. La plupart des équipes qui construisent la leur finissent avec une page qui leur appartient techniquement mais qui n'est pratiquement pas entretenue, avec un fil d'incidents dont la dernière entrée remonte à quatorze mois.
xUne délivrabilité que quelqu'un d'autre prépare et surveille : votre premier e-mail d'incident est aussi votre premier test de réputation d'envoi
xLes canaux de notification au-delà de l'e-mail : SMS, application Slack, Teams, Discord, webhooks natifs, RSS, tous fournis d'emblée par Instatus
xLes abonnements par composant, la gestion des désabonnements et la double confirmation d'inscription dont vous n'avez pas à vous préoccuper
xLa finition : plages de maintenance programmées, modèles d'incidents, gestion des fuseaux horaires, widgets intégrables, API publique
xUne véritable indépendance, à moins de faire réellement le travail d'héberger la page à l'écart de votre propre pile
Rien qui mérite d’être cité. C’est pour cela que le prompt existe.
Combien coûte Instatus ?
- Facturation mensuelle
- 20 $US/mois20 $US/mois
- Par an
- 240 $US/an240 $US/an
- Avec une carte brésilienne, IOF de 3,5% inclus
- 105 R$/mois1 254 R$/an
Enregistré dans Ma liste. Un avis s’affichera ici si le prix change.
Vous finalisez l’achat sur le site de Instatus. Vibe Radar ne gère aucun paiement.
Construire ou s’abonner à Instatus ?
Ajustez les chiffres : heures de développement, taux horaire, coûts d’exploitation et prix de l’abonnement.
Sur 24 mois, l’abonnement coûte moins cher.
Heures estimées d’après l’analyse (un week-end). Ne chiffre pas ce que vous perdez (support, intégrations, sécurité).
Puis-je recréer Instatus ?
En partie. Le cœur de Instatus se construit en un week-end avec le prompt de cette page, mais il reste de vraies lacunes : Une délivrabilité que quelqu'un d'autre prépare et surveille : votre premier e-mail d'incident est aussi votre premier test de réputation d'envoi, Les canaux de notification au-delà de l'e-mail : SMS, application Slack, Teams, Discord, webhooks natifs, RSS, tous fournis d'emblée par Instatus. Lisez la liste ci-dessus avant de vous lancer.
Combien coûte Instatus ?
Instatus coûte environ 20 $US/mois (Pro, vérifié le 20/10/2026), soit 240 $US par an.
Que perd-on en remplaçant Instatus ?
Honnêtement : Une délivrabilité que quelqu'un d'autre prépare et surveille : votre premier e-mail d'incident est aussi votre premier test de réputation d'envoi; Les canaux de notification au-delà de l'e-mail : SMS, application Slack, Teams, Discord, webhooks natifs, RSS, tous fournis d'emblée par Instatus; Les abonnements par composant, la gestion des désabonnements et la double confirmation d'inscription dont vous n'avez pas à vous préoccuper; La finition : plages de maintenance programmées, modèles d'incidents, gestion des fuseaux horaires, widgets intégrables, API publique; Une véritable indépendance, à moins de faire réellement le travail d'héberger la page à l'écart de votre propre pile. Si l’un de ces points compte pour vous, continuez à payer.
Existe-t-il une alternative open source à Instatus ?
Aucune alternative open source mature à recommander, et c’est précisément pour cela que le prompt de cette page existe.