Repository navigation
Releases: J000K3R/probeglass
Release list
v0.2.1
Container image: ghcr.io/j000k3r/probeglass:0.2.1
Every change since the first release, in full. This is
CHANGELOG.md
as it stands at this tag.
Changelog
All notable changes to this project are documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
What each release holds, one line each. Every version below is written out in
full; the release page for a tag carries its own section of this file, so what is
here and what the release says are the same document.
| Version | Released | In one line |
|---|---|---|
| [Unreleased] | — | Nothing yet |
| 0.2.1 | 2026-10-16 | A sensor under maintenance says so |
| [0.2.0] | 2026-10-16 | Maintenance windows, a second interface language, and the container as the only thing that ships |
| [0.1.0] | 2026-10-12 | The first release: sensors, history, incidents, alerts, accounts, and the dashboard |
[Unreleased]
Nothing yet.
0.2.1 - 2026-10-16
Added
-
A sensor inside a maintenance window says so. Its card and its row carry a
violet Maintenance badge beside the status, the card is ringed in the same
colour, and the tree, the wall and the map pick it up too. The status itself does
not change: a box that is not answering is still red, because that is true — what
the badge adds is the sentence somebody needs in order to decide whether to get up.This was a gap rather than a change of mind. 0.2.0's API published the flag from the
day the feature landed and the dashboard used it in one place, the "running now" mark
in the window list, and nowhere on a sensor — so a window did everything it promised
and nothing on screen admitted it. Reported by the first person to use the feature.
Fixed
- Switching the language no longer races the settings page. The page is rebuilt
when the language changes, and the redraw was not waited for, so a control could be
replaced under whoever was using it. The rebuild is awaited now. - Long sensor names are no longer broken mid-word. The card's header wraps the
badges onto a second line rather than squeezing the name until "Internet gateway"
comes out as "Inter net gate way".
[0.2.0] - 2026-10-16
Added
-
Maintenance windows. Tell the installation in advance that a box is allowed
to be away — the nightly snapshot, the Saturday the disk gets swapped — and the
checks that fail in that period open no incident, send no alert, and are left out
of the uptime figure.- A window covers one sensor or a whole group, repeats weekly on chosen
days or covers one stretch of time, and is created in Settings →
Monitoring → Maintenance windows. A weekly window is read in the zone the
person making it is in; the form fills that in from the browser, because a
container has no idea where its operator lives. - The probe keeps running. A window is not a pause: the result is still
recorded, so a box that comes back early shows up in its chart as having come
back. What is suppressed is the claim that somebody needs to do something. - The arithmetic follows the marker into the rollups. A sample left out of
today's figure has to stay left out of next month's too, and the raw rows are
gone by then — so the count is carried into the hourly and daily tables by the
rollup itself, in two columns rather than one, because a window is a period and
not a promise and the box may come back early. - An outage that was already open when a window begins is closed with a note
saying why, and nothing is sent — the message that opened it already went out.
If the box stays away, a new outage opens once it has failed its way past the
retries again, dated from after the window. A recovery inside a window is
silent, because no "down" was ever sent. - A window applies from the moment it is saved. The checks already recorded
are not rewritten, which is stated in the documentation rather than left to be
discovered.
- A window covers one sensor or a whole group, repeats weekly on chosen
-
A second interface language, and the switch for it. German joins English.
Every word the dashboard draws now comes out of a message catalogue rather than
out of the markup, so the next language is one file and one entry in a list,
and no code at all:internal/web/assets/i18n.<code>.jsbeside the English reference in
i18n.js, holding the same keys in the same order with the same placeholders.
A test compares the two key by key, in order, and compares both against the
keys the interface actually asks for — inindex.htmland in everyt('…')
call in the scripts — so a missing word and a mistyped one both fail the build
rather than reaching the screen.- The code in the two lists that already say what the interface offers: the Go
whitelist that validates a stored preference, and theavailablelist the
picker is drawn from.
-
The switch, in Settings and in the account menu, taking effect on the view
you are already looking at rather than on the next page load. Each language is
named in its own language — "Deutsch", not "German" — because the reader who
needs that entry is the one who cannot read the rest of the list. -
Dates, numbers and relative times follow it too.
Intlreads the browser's
language rather than the document's, so every formatter is now handed the chosen
one explicitly, and "5 min ago" under a card is a catalogue message like any
other word.
Changed
- A stored language follows the account, like the theme, the accent, the
density and the layout, rather than the installation. An installation that has
never chosen one behaves exactly as before and reads English.
Removed
-
The binary releases for darwin, windows, freebsd and linux. 0.1.0 shipped
seven zip files; a release now ships the container image and nothing else. The
archives promised a second way to run ProbeGlass that no document described,
and two things would not have survived it: thedockersensor talks to the
Docker Engine over a unix socket, which Windows does not have, anddoctor
tells you to run it withdocker exec. What is gone is the publishing of other
platforms, not the ability to compile —make buildstill builds for whatever
machine you are on.The
checksums.txtfile and its Sigstore signature went with the archives,
because there was nothing left to check a download of. The release workflow no
longer requests an OIDC token at all. The image itself is not signed; if that
is wanted it would be a small addition of its own.
Notes
Three surfaces are deliberately still English, and are meant to stay that way:
- the watchdog's own page, which has to be readable in exactly the situation
where the dashboard's scripts did not load; - the
doctorfindings, which are the CLI's output; - the channel types and their setup recipes, which the server sends as its own
text.
The probe messages the server writes into the history — HTTP 200 OK, no such host — are data rather than interface and read the same in every language.
[0.1.0] - 2026-10-12
The first release: a working foundation that monitors, records, and alerts, with
the structure in place to grow. What follows is the whole of it — the feature set
it lands with, and every change made on the way to the tag.
Added
- Sensors — HTTP(S), TCP (with optional TLS handshake and send/expect
exchange), ICMP ping, and DNS (A, AAAA, CNAME, MX, TXT, NS, SRV, PTR, with an
optional custom resolver). Each type validates its own target and options, in
the UI as well as on save. - Dashboard — live status grid fed by Server-Sent Events, per-sensor
response-time charts, uptime bars, sparklines, incident timeline, search,
grouping, and tags. Theme (auto/dark/light), accent colour, density, and
layout are selectable in Settings. - History — three resolutions with retention: raw samples for 7 days, hourly
rollups for 90 days, daily rollups forever. Exactly one resolution answers any
given range, so no probe is counted twice; gaps are reported as gaps. - Incidents — a state machine per sensor: a configurable number of
consecutive failures before an incident opens, repeat alerts while it stays
open, and a recovery alert naming how long the sensor was down. State is
rebuilt from the database on restart, so a restart neither loses an outage nor
re-announces one. - Alerts — Telegram, Discord, Matrix, ntfy, Slack, and generic webhooks with
HMAC-SHA256 request signing. Per-sensor channel assignment, per-sensor reminder
intervals, custom title and body templates with a safe fallback when a template
is broken, and a test button per channel. - Authentication — first-run setup screen, bcrypt password hashing,
HMAC-signed session cookies, an API key for scripts, cross-site protection for
cookie-authenticated writes, and an in-memory login rate limit. - Configuration — YAML file,
PROBEGLASS_*environment variables, and
command-line flags with a documented precedence order, plus day and week
duration suffixes for retention settings. - Declarative sensors and channels — declare them in the configuration file
and they are re-applied on every start. - API — a documented JSON API for sensors, history, incidents, channels,
settings, and an SSE event stream. Sensor updates are partial: a body changes
only the fields it sends, and an explicit empty value clears a field. - CLI —
serve,version,healthcheck(used by the image's
HEALTHCHECK, so no shell is needed), andseed --demofor a synthetic week
of history. - Packaging — multi-arch container image (amd64...
v0.2.0
Container image: ghcr.io/j000k3r/probeglass:0.2.0
Every change since the first release, in full. This is
CHANGELOG.md
as it stands at this tag.
Changelog
All notable changes to this project are documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
What each release holds, one line each. Every version below is written out in
full; the release page for a tag carries its own section of this file, so what is
here and what the release says are the same document.
| Version | Released | In one line |
|---|---|---|
| [Unreleased] | — | Nothing yet |
| [0.2.0] | 2026-10-16 | Maintenance windows, a second interface language, and the container as the only thing that ships |
| [0.1.0] | 2026-10-12 | The first release: sensors, history, incidents, alerts, accounts, and the dashboard |
[Unreleased]
Nothing yet.
[0.2.0] - 2026-10-16
Added
-
Maintenance windows. Tell the installation in advance that a box is allowed
to be away — the nightly snapshot, the Saturday the disk gets swapped — and the
checks that fail in that period open no incident, send no alert, and are left out
of the uptime figure.- A window covers one sensor or a whole group, repeats weekly on chosen
days or covers one stretch of time, and is created in Settings →
Monitoring → Maintenance windows. A weekly window is read in the zone the
person making it is in; the form fills that in from the browser, because a
container has no idea where its operator lives. - The probe keeps running. A window is not a pause: the result is still
recorded, so a box that comes back early shows up in its chart as having come
back. What is suppressed is the claim that somebody needs to do something. - The arithmetic follows the marker into the rollups. A sample left out of
today's figure has to stay left out of next month's too, and the raw rows are
gone by then — so the count is carried into the hourly and daily tables by the
rollup itself, in two columns rather than one, because a window is a period and
not a promise and the box may come back early. - An outage that was already open when a window begins is closed with a note
saying why, and nothing is sent — the message that opened it already went out.
If the box stays away, a new outage opens once it has failed its way past the
retries again, dated from after the window. A recovery inside a window is
silent, because no "down" was ever sent. - A window applies from the moment it is saved. The checks already recorded
are not rewritten, which is stated in the documentation rather than left to be
discovered.
- A window covers one sensor or a whole group, repeats weekly on chosen
-
A second interface language, and the switch for it. German joins English.
Every word the dashboard draws now comes out of a message catalogue rather than
out of the markup, so the next language is one file and one entry in a list,
and no code at all:internal/web/assets/i18n.<code>.jsbeside the English reference in
i18n.js, holding the same keys in the same order with the same placeholders.
A test compares the two key by key, in order, and compares both against the
keys the interface actually asks for — inindex.htmland in everyt('…')
call in the scripts — so a missing word and a mistyped one both fail the build
rather than reaching the screen.- The code in the two lists that already say what the interface offers: the Go
whitelist that validates a stored preference, and theavailablelist the
picker is drawn from.
-
The switch, in Settings and in the account menu, taking effect on the view
you are already looking at rather than on the next page load. Each language is
named in its own language — "Deutsch", not "German" — because the reader who
needs that entry is the one who cannot read the rest of the list. -
Dates, numbers and relative times follow it too.
Intlreads the browser's
language rather than the document's, so every formatter is now handed the chosen
one explicitly, and "5 min ago" under a card is a catalogue message like any
other word.
Changed
- A stored language follows the account, like the theme, the accent, the
density and the layout, rather than the installation. An installation that has
never chosen one behaves exactly as before and reads English.
Removed
-
The binary releases for darwin, windows, freebsd and linux. 0.1.0 shipped
seven zip files; a release now ships the container image and nothing else. The
archives promised a second way to run ProbeGlass that no document described,
and two things would not have survived it: thedockersensor talks to the
Docker Engine over a unix socket, which Windows does not have, anddoctor
tells you to run it withdocker exec. What is gone is the publishing of other
platforms, not the ability to compile —make buildstill builds for whatever
machine you are on.The
checksums.txtfile and its Sigstore signature went with the archives,
because there was nothing left to check a download of. The release workflow no
longer requests an OIDC token at all. The image itself is not signed; if that
is wanted it would be a small addition of its own.
Notes
Three surfaces are deliberately still English, and are meant to stay that way:
- the watchdog's own page, which has to be readable in exactly the situation
where the dashboard's scripts did not load; - the
doctorfindings, which are the CLI's output; - the channel types and their setup recipes, which the server sends as its own
text.
The probe messages the server writes into the history — HTTP 200 OK, no such host — are data rather than interface and read the same in every language.
[0.1.0] - 2026-10-12
The first release: a working foundation that monitors, records, and alerts, with
the structure in place to grow. What follows is the whole of it — the feature set
it lands with, and every change made on the way to the tag.
Added
-
Sensors — HTTP(S), TCP (with optional TLS handshake and send/expect
exchange), ICMP ping, and DNS (A, AAAA, CNAME, MX, TXT, NS, SRV, PTR, with an
optional custom resolver). Each type validates its own target and options, in
the UI as well as on save. -
Dashboard — live status grid fed by Server-Sent Events, per-sensor
response-time charts, uptime bars, sparklines, incident timeline, search,
grouping, and tags. Theme (auto/dark/light), accent colour, density, and
layout are selectable in Settings. -
History — three resolutions with retention: raw samples for 7 days, hourly
rollups for 90 days, daily rollups forever. Exactly one resolution answers any
given range, so no probe is counted twice; gaps are reported as gaps. -
Incidents — a state machine per sensor: a configurable number of
consecutive failures before an incident opens, repeat alerts while it stays
open, and a recovery alert naming how long the sensor was down. State is
rebuilt from the database on restart, so a restart neither loses an outage nor
re-announces one. -
Alerts — Telegram, Discord, Matrix, ntfy, Slack, and generic webhooks with
HMAC-SHA256 request signing. Per-sensor channel assignment, per-sensor reminder
intervals, custom title and body templates with a safe fallback when a template
is broken, and a test button per channel. -
Authentication — first-run setup screen, bcrypt password hashing,
HMAC-signed session cookies, an API key for scripts, cross-site protection for
cookie-authenticated writes, and an in-memory login rate limit. -
Configuration — YAML file,
PROBEGLASS_*environment variables, and
command-line flags with a documented precedence order, plus day and week
duration suffixes for retention settings. -
Declarative sensors and channels — declare them in the configuration file
and they are re-applied on every start. -
API — a documented JSON API for sensors, history, incidents, channels,
settings, and an SSE event stream. Sensor updates are partial: a body changes
only the fields it sends, and an explicit empty value clears a field. -
CLI —
serve,version,healthcheck(used by the image's
HEALTHCHECK, so no shell is needed), andseed --demofor a synthetic week
of history. -
Packaging — multi-arch container image (amd64, arm64, armv7) on a
distroless, non-root base with the dashboard embedded; static binaries for
Linux, macOS, Windows, and FreeBSD; CI running formatting, vetting,
go test -race, a seven-platform build, andgolangci-lint. -
The examples a fresh installation starts with stand at two places. The four
invented sensors carried a week of past but nowhere to be, so the map — the one
screen a new installation had nothing at all to say about — was empty behind the
button that draws it. They stand on the two places the demo data set uses, a
"Homelab" and a rented server somewhere else, each with real coordinates, because
a pin in the Gulf of Guinea is what a missing coordinate pair would look like and
is the one thing on that map that reads as a bug. Both carry the example mark with
the sensors, so the removal button takes them along rather than leaving two empty
pins behind, and the panel that counts the example data counts them now: a place
the removal would leave holding a sensor of your own stays, and the number on the
button is that same number. The names and the coordinates are asked of the demo
data set rather than copied from it, which matters the first time somebody loads
that data after a fresh install: the loader leaves a place that is already there
alone, so the two sets fold into one pin each instead of drawing a second on...
v0.1.0
Full Changelog: https://github.com/J000K3R/probeglass/commits/v0.1.0