Getting started

Documentation

Everything you need to go from a fresh account to a monitor that pages the right person at the right time, and a public status page to share. It takes about ten minutes.

01 Create an account

Head to the dashboard and choose Create one on the sign-in screen.

  1. Register.

    Enter your email and a password of at least eight characters. A display name is optional. Complete the verification challenge and submit.

  2. Confirm your email.

    We send a confirmation link to your address, and a screen reminds you to check your inbox. Click the link to activate the account. You can't sign in until your email is confirmed.

  3. Sign in.

    Back on the sign-in screen, enter your details. We email you a six-digit code for two-factor authentication; enter it to finish signing in. The field submits as soon as the sixth digit lands, and the code expires after ten minutes.

You land on the Overview: live status and 30-day uptime for every monitor. It's empty for now. The account menu in the top right is where you manage your name, password, plan and status page, or delete your account. The Help button there links to these docs and to email support whenever you need a hand.

02 Add a connection

A connection is a place an alert can go, such as a Slack channel or an email address. You set one up once, then any notify step in any flow can point at it. Connections live in the right-hand sidebar of the editor.

Start here rather than with a monitor: notify modules only become available once a matching connection exists.

  1. Open the connection form.

    In the editor's right sidebar, choose + Add connection.

  2. Pick a type and name it.

    Choose from Slack, Discord, Microsoft Teams, Email, SMS, PagerDuty, Jira or a generic Webhook. Give it a clear name like ops-slack so it's easy to recognise later.

  3. Fill in the details.

    Each type asks for what it needs, for example an incoming webhook URL for Slack, or a recipient address for Email. Credentials such as tokens and API keys are encrypted at rest.

  4. Send a test.

    Use Send test to confirm the alert arrives before you rely on it. Then Save connection.

Email needs confirmation. When you add an email recipient, that address gets a confirmation link and shows as pending verification until it's clicked. Alerts won't send to an unconfirmed address. Use the resend button on the connection if the first email is missed. Your own account email is the exception: since it's already confirmed at signup, an email connection to that address works straight away.

03 Create a monitor

A monitor is one thing you watch, plus the escalation you draw around it. Each monitor is a single flow on its own canvas.

  1. Start a new monitor.

    Choose New monitor in the header, give it a name like Checkout API, and create it. You're dropped onto the canvas with one Monitor block already placed.

  2. Open the monitor block.

    Double-click it to set up the check itself.

  3. Choose the check type.

    Pick how Hesklo probes the target:

  • HTTP(S) — request a URL. Optionally require a specific status code or that the body contains some text. For HTTPS targets, Hesklo also tracks the TLS certificate and warns you as it nears expiry.
  • Ping — send a real ICMP echo to a host or IP and measure the round-trip time. No port needed; enter a hostname like example.com or an address like 192.0.2.1.
  • TCP port — check a host:port accepts a connection, for example a database at db.example.com:5432.
  • SSH command — run a command over SSH and treat exit code 0 as up. Optionally require the output to contain some text.

Then set the timing:

  • Every — how often to check, in seconds. The minimum depends on your plan.
  • Timeout — how long to wait for a response before treating the check as failed.
  • Confirm down after — how many checks must fail in a row before the monitor counts as down. Raise this to absorb the odd flaky check; it trades a little delay for fewer false alarms.

Choose Apply to save the check. Hesklo runs one check straight away so the status reflects your new settings without waiting for the next interval. The Monitor block now shows a summary, and its two output ports become meaningful: a red down port and a green up port.

About false alarms. A single network blip shouldn't wake anyone. HTTP checks that fail on a transport error, such as a timeout or refused connection, are retried once after a short pause before counting as a failure, and the Confirm down after setting adds a second layer across check cycles. Together they filter out transient hiccups while still catching real outages quickly.

04 Draw a flow

A flow is what happens when the monitor changes state. You build it by dragging modules from the left palette onto the canvas and wiring them together. The flow runs from the Monitor's ports: the down port drives your escalation, the up port sends the all-clear.

  1. Drag in a module.

    From the left palette, drag a logic, notify or action block onto the canvas. Notify blocks appear once you have a matching connection.

  2. Wire it up.

    Drag from an output port (the dot on the right of a block, or the down/up ports on the Monitor) to the input port on the left of the next block. A line connects them. Blocks that branch, like the Monitor or a condition check, have two output ports for their two outcomes.

  3. Configure each block.

    Double-click a block, or right-click it and choose Edit, to open its settings. Notify blocks let you choose the connection and the message, with placeholders like {flow}, {state}, {detail} and {duration}.

  4. Remove a block.

    Right-click a block and choose Remove. The Monitor block can't be deleted; it's the root of the flow.

A simple example

A common first flow: from the Monitor's down port, add a Wait of five minutes, then a Slack notify. From the up port, add an Email notify. The result: if something is down for five minutes you get a Slack page, and when it recovers you get an email all-clear. Nothing fires for a blip that clears inside five minutes.

Going further

The same building blocks compose into richer policies. A Repeat alert after your first page keeps paging every few minutes until someone fixes the problem. A Condition check probes a second endpoint mid-flow and routes on the result, so you can ask "the API is down, but is the database also down?" and page a different team for each answer. An HTTP action can even try to fix things first: call an endpoint to restart a service, then use a condition check to re-probe, and only page a human if it's still down.

Each notify step fires once per incident by default and resets on recovery, so a long outage doesn't bury you in repeats. A Repeat alert deliberately re-opens the steps after it so they can fire again on each interval. You can also switch any notify step to fire on every matching check in its editor.

05 Module reference

A small set of blocks combines into any policy. Logic blocks shape the flow, notify blocks send the alert, and action blocks do something about the problem.

MonitorThe check itself, with a down and an up port. One per flow, placed automatically.
If / elseBranch on state: is down, is up, just recovered, or down longer than N minutes. Routes to a true path and a false path.
Condition checkRun a probe right now (HTTP, TCP, ping or SSH) and route to a pass or fail port on the result. A point-in-time condition for the flow, not a tracked monitor.
WaitHold before the steps after it fire, so brief outages never page. Used to escalate after a delay.
Repeat alertWhile the monitor stays down, let the steps after it fire again every N minutes. Put a notify after it to keep paging until recovery. Resets when the monitor comes back.
Schedule gateOnly let alerts through on chosen days and hours, in your timezone. Set an end earlier than the start for an overnight window.
Log / annotateWrite a custom note to the monitor's history timeline without sending an alert. Handy for marking escalation stages.
Slack / Discord / TeamsPost a message to a channel via an incoming webhook.
EmailSend to a confirmed address, with a custom subject and message.
SMSText a number through your SMS connection.
PagerDutyTrigger an incident when down and resolve it automatically on recovery.
JiraOpen a ticket with a summary you choose.
WebhookPOST the alert to a URL of your own, with an optional bearer token.
HTTP actionCall an endpoint to take an action, such as restarting a service or triggering a runbook. Choose the method, headers and body. Fires once per incident unless set to repeat.

06 Run, save and watch

With the check set up and the flow drawn, put it to work.

  • Run check — probe the target immediately and see the full result, without waiting for the next scheduled check. Good for confirming the monitor is configured right.
  • Save — store the monitor. Changes also autosave as you work once the monitor exists.
  • Settings — rename the monitor, pause it for planned work, show it on your status page, or delete it.

Open a monitor and switch to its History tab for the full picture of that one check: a 30-day uptime chart, a 24-hour response-time graph, its incident list and a recent event log, all alongside a sidebar of vital signs like current state, uptime and certificate status. The event log also captures notes left by Log blocks and the calls made by HTTP actions, so the timeline shows everything the flow did. Hover any chart for the exact figure behind a point.

Pause before planned work. In the monitor's settings you can pause it, optionally until a set time, so a known outage during maintenance doesn't page anyone. It keeps its history and resumes exactly as it was.

Back on the Overview you'll see this monitor alongside the rest: status, 30-day uptime, certificate expiry and check interval, one row each. A second Incidents tab lists recent outages across all your monitors, with their start, duration and cause. Click any monitor row to open its flow again.

07 Publish a status page

A status page is a public, read-only page where anyone can check whether your services are up, no account required. It shows an overall banner, your chosen monitors with their 30-day uptime, and recent incidents. It's entirely opt-in: nothing is public until you set it up, and it's available on paid plans.

  1. Name your page and pick a subdomain.

    Open the account menu, choose the Status page tab, and set a page title and a subdomain. Your page goes live at yourname.status.hesklo.com. The page only publishes once both a title and a subdomain are set; clearing them takes it down again.

  2. Choose which monitors appear.

    Open a monitor's Settings and turn on Show on status page. Only the monitors you switch on are shown; everything else, including the incidents of private monitors, stays hidden.

  3. Share the link.

    That's it. Anyone with the URL sees a live, branded status page that updates as your monitors do.

Times on the status page, and everywhere in Hesklo, are shown in the viewer's own timezone. The underlying data is stored as absolute moments, so the same incident reads correctly for someone in Stockholm and someone in New York.

That's the whole loop. Add a connection, build a monitor, draw what happens when it breaks, let it run, and publish a page so everyone can see the state at a glance.

Ready to draw your first flow?

Add a monitor, wire it up, and let Hesklo handle the 3 a.m. part.

Open the dashboard