// changelog

What changed.

Every meaningful change to the hosted service, documented. Types are tagged: add for new features, fix for bug fixes, change for behaviour changes, perf for performance work.

Source on GitHub · issues
September 2025 Sep 2025 hosted oss

Public status pages got a full redesign: per-node sparkline graphs (CPU + memory over 60 minutes), a live summary banner, and an incident strip when nodes go offline. A new backend endpoint streams history data for the graphs without blocking the 5-second refresh cycle. The landing page was also rebuilt with a live dashboard preview, richer feature set, and proper roadmap and changelog pages.

status pages
  • add
    Per-node sparkline graphs on public status pages
    Each node card now shows a 60-minute CPU and memory trend as an inline SVG sparkline. The graph is built client-side from a new /api/public/status/<token>/history endpoint that returns downsampled data (max 30 points per node). The chart updates live — every 5-second poll appends a new point to the rolling buffer and redraws the SVG in place.
  • add
    Summary banner with online / total counters
    The top of the status page now shows a large status headline ("All systems operational" / "X of Y nodes online") and a red incident banner that appears only when nodes are offline. The banner is computed on every refresh from the API payload, not baked into the page at render time.
  • change
    Node cards show uptime, refactored partial-update logic
    The /api/public/status feed now includes uptime_seconds. Node cards display it as a human-readable string. Partial in-place updates to cards (badge, metric values, chart) prevent flicker on every 5-second refresh when the node list hasn't changed.
  • add
    GET /api/public/status/<token>/history endpoint
    New public endpoint returning the last 60 minutes of telemetry for every node in the workspace, downsampled to at most 30 points. The query hits a single compound index on (server_id, ts) to keep response times flat regardless of retention window.
landing & marketing
  • add
    Roadmap page at /roadmap
    Standalone page listing every shipped and planned feature with status indicators (live / coming soon / planned), tags, and detailed descriptions. Replaces the brief feature list that was buried in the landing page footer.
  • add
    Changelog page at /changelog
    Developer-facing changelog with tagged change types (add / fix / change / perf), release summaries, and links back to commits. Generated from the actual commit history.
  • change
    Landing page redesign — live dashboard preview, no emojis
    Replaced the fake ASCII terminal in the install section with a proper HTML/CSS node detail card that matches the real dashboard. Added a full fleet dashboard preview section with mini sparklines. Removed all emoji. Removed the "hosted" nav pill. Feature grid uses text kickers instead of emoji icons. Nav now links to /roadmap and /changelog.
commits: 451f43e c301c46
August 2025 Aug 2025 hosted

Three substantial additions to the hosted layer: opt-in SSE push for the overview dashboard, team roles (owner / admin / viewer), and per-workspace usage metering with public status share links. Ingest hardening with rate limiting and an audit log also shipped alongside a rollup system to keep long-range graphs fast.

dashboard
  • add
    SSE live push for the overview dashboard
    The fleet overview now updates via Server-Sent Events when opted in from settings. Previously the overview refreshed on a timer; SSE eliminates unnecessary polling and delivers changes within one agent interval. Each connection streams only the tenant's own data.
  • add
    Editable dashboard layout — reorder, show/hide panels
    Panels on the per-node dashboard can be reordered by drag and hidden individually. Layout is persisted per-user in localStorage. A "restore defaults" button resets the layout.
  • add
    Per-graph CSV and PNG export
    Each chart now has a context menu with options to download the underlying data as CSV or the rendered chart as PNG. The PNG export uses the Canvas API to composite the chart at 2x resolution.
  • change
    Compact density mode and adjustable refresh interval
    A density toggle reduces padding on the fleet overview to fit more nodes per viewport. The refresh interval (default 10s) is now adjustable from the toolbar without going to settings.
teams & sharing
  • add
    Team roles: owner / admin / viewer
    Workspace owners can invite GitHub users as admins (full write access) or viewers (read-only). Invites work before the invitee has signed in. Role is checked on every authenticated request — a downgraded member loses write access immediately without signing out.
  • add
    Public status share links
    Workspace owners can generate a shareable token from Settings. The token produces a public, no-login-required status page at /status/<token>. The token can be revoked from settings. Previously, status pages were only accessible to logged-in members.
  • add
    Per-workspace usage metering
    The admin console now tracks telemetry data volume ingested per tenant per day. Visible to workspace owners in Settings as a rolling 7-day summary. Used internally to identify unexpectedly high-volume workspaces before they stress the retention system.
ingest & storage
  • add
    Rate limiting on the telemetry ingest endpoint
    The POST /api/v1/telemetry endpoint now enforces a per-agent rate limit. Agents that exceed the limit receive a 429 with a Retry-After header. Bursts (batch payloads covering a catchup window) are allowed within the rate budget.
  • add
    Audit log for ingest failures
    Authentication failures, rate limit trips, and malformed payloads are written to an audit collection with a timestamp, server_id prefix, and reason. Visible in the admin console. Useful for diagnosing agents that are reporting with stale tokens.
  • add
    Time-bucketed rollups for long-range graphs
    Queries over 6 hours now hit a pre-aggregated collection bucketed at 5-minute intervals rather than raw telemetry. A background job runs the rollup continuously. This reduced p95 query time on 30-day graphs by roughly 12x on large tenants.
  • fix
    Long-range graphs going blank after rollup was enabled
    Rollup records used a different ts field format (UTC naive vs aware) than the raw telemetry query expected. Fixed by normalising all timestamps to UTC-aware datetimes at rollup write time and at query time.
  • add
    Batched telemetry ingest
    Agents can now POST an array of telemetry records in a single request (covering a backfill window). Ingest validates and inserts the batch atomically using insert_many. This allows agents to recover from a network outage without flooding individual requests.
  • perf
    gzip compression and ETag caching on JSON responses
    The main dashboard JSON feeds now return gzip-compressed responses when the client supports it, and include an ETag based on a hash of the response body. The fleet overview feed saves roughly 60% on wire size for typical 20-node fleets.
alerting
  • add
    Recovery emails
    When a metric that previously breached a threshold drops back below it, a recovery email is sent. Previously only breach emails were sent, leaving the on-call engineer to check manually whether the situation had resolved.
  • add
    Alert snooze
    Individual alerts can be snoozed for 30 / 60 / 120 minutes from the Alerts UI. Snooze state is stored per-tenant and respected by the alert evaluation loop — no emails are sent for a snoozed rule until the snooze expires.
  • add
    Node-reboot detection alerts
    A new alert type fires when uptime resets (uptime drops significantly between consecutive samples). Useful for detecting unexpected reboots on long-running production nodes.
  • fix
    Resend 403 / 1010 on alert emails
    The Resend HTTP client was not sending a User-Agent header, which caused some requests to be rejected by Cloudflare with a 1010. Fixed by adding a static User-Agent: peek-cloud/1 header to all Resend API calls.
  • fix
    Breach email HTML rendering broken
    The Jinja template for breach emails was escaping the node name HTML-safe string incorrectly, producing garbled output when the node name contained a hyphen. Fixed by using |e consistently and testing with a node named web-01.
data & export
  • add
    Data export (CSV) for the full telemetry archive
    Workspace owners can export all telemetry for a node or the full fleet as a CSV from Settings. The export streams directly to the browser as a chunked response — no server-side file is written. Large exports are bounded by the tenant's retention window.
  • add
    Total bandwidth and disk I/O aggregates over selected range
    The per-node detail page now shows total bytes received/transmitted and total disk bytes read/written over the selected time window, not just instantaneous rates. Computed server-side by summing the rate samples and multiplying by the sample interval.
  • add
    TTL index on the telemetry collection
    MongoDB now enforces data retention via a TTL index on telemetry.ts, keyed to the global PEEK_RETENTION_DAYS config value. Previously retention was enforced by a periodic cleanup job that could fall behind under high ingest load.
Earlier 2025 Jan – Jul 2025 oss hosted

Initial hosted service launch. Core agent and dashboard built from the open-source Peek project with a multi-tenant auth layer on top.

  • add
    GitHub OAuth sign-in and automatic workspace provisioning
    First login with GitHub creates an isolated tenant. All servers, tokens, and telemetry are scoped to the tenant. No invitation or admin approval needed.
  • add
    Multi-tenant telemetry isolation
    Every telemetry write and read is filtered by tenant_id. Install tokens carry the tenant at generation time. A server registered with one tenant's token can never appear in another tenant's dashboard.
  • add
    Per-node email alerts (CPU, memory, disk, offline)
    Configurable thresholds per node or fleet-wide. Alert state is debounced — a single sample spike does not send an email. Delivered via Resend.
  • add
    Admin console at /admin
    Maintainer-only view showing per-tenant usage (node count, data volume, last activity), global retention configuration, and the ability to revoke tenants. Gated by PEEK_ADMIN_LOGINS env var.
  • add
    Self-hosted ecosystem phone-home
    Self-hosted Peek instances can opt in to sending aggregate usage stats (total nodes, installs) to the hosted service. These are displayed in the admin console as an ecosystem-level view. No identifying data is sent.