Pharos / status engine / v1.0 / AGPL-3.0

Your status page is green.
Your server is not.

Every status page you know waits for a human to notice. Pharos runs the checks itself — HTTP, TCP and heartbeat — opens the incident when something fails and closes it when it recovers. On your hosting, including the shared cPanel account you already pay for.

No VPS required No human in the loop Cachet-compatible API
live· one incident, start to finish 16:52:04

Components

api.example.comOperational
mail.example.netOperational
web-06.example.netOperational

HTTP check · every 60s · last 88ms

Incidents

No open incidents.

web-06.example.net unreachable

  1. 16:53Investigating

    Automatic check failed twice: no response on HTTP.

  2. 16:53Webhook

    Delivered to n8n · 200

  3. 17:31Resolved

    Responded normally for three consecutive checks.

38 min · opened and closed by a check · nobody typed this

3check types, no agents
90days of uptime history
186automated tests
€0for the core, forever
01The product

It writes the incident before anyone asks.

A check fails twice, the component goes red, an incident opens with the probe error in it. The target comes back, three healthy checks later the incident closes itself and posts the closing update. Nobody logged in.

Fig. 01The public pagestatus.example.com
The public status page: an overall headline, a 90-day uptime bar, services grouped into collapsible rows, and incidents listed per day.
What a visitor sees. The headline, the bar and the first services fit above the fold; the incident history runs on below the crop.
Fig. 02Componentsadmin · components
The components screen with tiles showing what is down right now, average uptime, and how many components are checked automatically.
The tiles answer “what is wrong right now” before the table does — including how many components still rely on someone noticing.
Fig. 03Settingsadmin · settings
The settings screen with section toggles on the left and a live preview of the public status page on the right.
Tick a section off and it disappears from the preview beside it — the real page, rendered from values you have not saved yet.
02Why it exists

A page you update by hand is a page that lies.

  • Cachet 2.x has had no release since 2021. Nothing checks anything: a component turns red because a person made it red, so it is usually still green while the site is down.
  • Cachet 3.x is no longer open source. Its licence forbids removing its notices and forbids distributing it as a standalone product — which rules it out for resellers.
  • One incident, one component. A hypervisor failure that takes down four customer sites gets logged four times, or once while ignoring three of them.
  • And it runs where the outage is. A status page hosted on the infrastructure it watches goes down with it.
Fig. 04One scheduled runphp artisan pharos:check
$ php artisan pharos:check --force
  web-01 up HTTP 200
  web-06 down No response
  IMAP / SMTP up Connected
  Backups up Heartbeat received

→ incident #12 opened · web-06 unreachable
→ webhook sent · n8n
03Against what you know

Pharos and Cachet, side by side.

Only things that can be checked. Where Cachet 3.x publishes nothing, this says so rather than guessing.

 Pharos Cachet 2.xCachet 3.x
LicenceAGPL-3.0 MIT, unmaintained since 2021Proprietary
Redistribute under your own brandYes YesForbidden by its licence
Checks its own servicesHTTP, TCP, heartbeat No — set by handNot published
Opens and closes incidents itselfYes NoNot published
One incident, many componentsYes One per incidentNot published
Runs on shared cPanel hostingYes YesNot published
APICachet 2.x compatible The originalNot published
Signed updatesBoth install shapes NoNot published
04Where it runs

On the hosting you already pay for.

A VPS requirement is exactly what keeps a status page off a reseller’s stack. Pharos does not have one.

Fig. 05Shared cPanel hosting
# the entire scheduler
* * * * * cd ~/pharos && php artisan schedule:run

# PHP 8.3, SQLite or MySQL, no daemon
Fig. 06Docker
# the entire thing
docker compose up -d

# app + scheduler, one image

Put it somewhere else. A status page that runs on the infrastructure it watches goes down with it. External probe locations are on the roadmap rather than shipped — for now, host it away from what it is watching.

05It speaks Cachet

Your existing scripts keep working.

Same endpoints, same status integers, X-Cachet-Token accepted alongside Bearer. Point an old workflow at a new base URL and it carries on.

Fig. 07n8n · HTTP Request
curl -X POST /api/v1/incidents \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "template": "server-unreachable",
    "vars": { "server": "web-06" },
    "status": "investigating",
    "components": { "7": "major_outage" }
  }'
  • Uptime Kuma — a push monitor calls in, silence turns the component red.
  • n8n — both directions, with an HMAC-signed outgoing webhook on every incident.
  • Zabbix and Grafana — through the same API, no plugin needed.
  • Heartbeats — one curl at the end of your backup cron.
  • Everything else — a token and a POST is the whole contract.
06Pricing

The product is free. The convenience is not.

Every feature is in the free version — no seat limits, no gates. What is paid is the work of not doing it yourself, and the one obligation the AGPL puts on companies.

Core

Free

AGPL-3.0 · self-hosted
  • Every feature, no exceptions
  • HTTP, TCP and heartbeat checks
  • Uptime history and the public page
  • Full REST API and integrations
  • Your name and accent colour
  • Carries a “Powered by Pharos” link
Read the install guide

Brand pack

€49

One-time · per installation
  • Your own logo and favicon
  • Your own sender address
  • The footer credit removed
  • Verified locally, no phone-home
  • Keeps working if our server does not
Buy the Brand pack

Supported

€119/year

Yearly · cancel any time
  • Signed updates, one click in the admin
  • Support beyond the public issues
  • Includes the Brand pack
  • Stop renewing and it keeps running
Start Supported

Commercial licence

from €599/year

For companies that modify it
  • The AGPL publication duty lifted
  • Keep your changes to yourself
  • Ship it inside your own service
  • Everything in Supported
Request a quote

You probably do not need the last one. The AGPL only asks you to publish changes if you modify Pharos and let others reach it over a network. Running it unmodified for your customers costs nothing and obliges nothing. The commercial licence exists for the reseller who wired it into their own systems and would rather not publish that.

07Questions

The things a hosting reseller asks first.

01Does Pharos need a VPS?

No. It runs on PHP 8.3 or later with SQLite or MySQL, which most shared cPanel hosting already supports, and one cron line drives the scheduled checks. Docker is also supported for anyone who prefers containers.

02What is actually wrong with Cachet?

Cachet 2.x has had no release since 2021 and requires a human to change a component’s status, so it can stay green while a site is down. Cachet 3.x is maintained but no longer open source: its licence forbids removing its notices and forbids distributing it as a standalone product, which rules out reselling or white-labelling it.

03Will my existing Cachet API integrations still work?

Yes. The API is Cachet 2.x compatible: the same endpoints, the same status integers, and X-Cachet-Token accepted alongside Authorization: Bearer. Existing n8n workflows and scripts that talk to a Cachet 2.x instance do not need to change.

04What is a heartbeat check?

It is a check aimed at things you cannot poll from outside, such as a backup job or a cron script. Your job calls a URL on its own schedule, and if that call stops arriving, Pharos treats the silence as the failure and opens an incident.

05Can I control what visitors see on the page?

Yes. Every section of the public page is a switch in Settings: the overall banner, uptime bar, services list, per-component bars, maintenance, incident history, empty days, subscribe button and API link. Visibility can also be set per service, and a live preview shows the real page as you toggle.

06Is Pharos really free?

The core is AGPL-3.0 and free to self-host, with every feature in it — no seat limits, no gates. Three things are paid and all three are optional: a one-time Brand pack (€49) to use your own logo and drop the credit, a yearly Supported plan (€119) for one-click signed updates and support, and a commercial licence (from €599/year) for companies that modify Pharos and would rather not publish the change.

07What does the Brand pack include?

Your own logo, favicon and sender address on the status page, with the footer credit removed. It is a one-time purchase, verified locally with an Ed25519 signature rather than a phone-home check, so it keeps working even if the licensing server is unreachable.

08How do updates work, and what if the update server is unreachable?

Pharos checks for a signed release manifest and shows what is available under Updates. On shared hosting it downloads the release, verifies the checksum, backs up the current version and replaces its own files. On Docker the host pulls the new image. If the release server cannot be reached, that reads as no update available, never as an error.

08Get started

Stop finding out from a customer.

Open source under AGPL-3.0, installed on the hosting you already run. Point it at your components, wire a heartbeat into the jobs nobody else can see, and let it write the incident before anyone has to ask.