Releases: AHS12/heka
Release list
0.8.5
What's Changed
[0.8.5] - 2026-09-06
Heka learns to introduce itself and to scale: a first-run tour, a What's New
dialog fed by the changelog embedded right in the binary, a hidden heka dev
toolbox for rehearsing both, and — the big one — server-side search with
cursor pagination for the tasks and schedules lists, so the pages stay fast
and complete even with hundreds of entries. Freshness is engineered rather
than polled: a tiny revision pulse catches scheduled runs, CLI commands, and
on-disk YAML edits without ever refetching the pages you're scrolling.
Added
- What's New dialog. CHANGELOG.md ships inside the binary. After an
update the shell greets you with every release newer than the one you last
saw (newest first), rendered as proper markdown; a fresh install shows this
release's notes right after the first tour. The About page carries a
"View changelog" button that opens the whole file, plus Website and Docs
buttons (heka.ahs12.xyz) beside the existing GitHub link. - First-run tour. A five-step spotlight tour over the always-visible
chrome — nav pills, daemon status, theme toggle, Settings — with
high-contrast popover and arrow styling that stays legible on every theme
variant, plus a visible ring around the highlighted element. Replayable
from Settings → Appearance or the About page; the tour hands straight over
to the release notes on a fresh install. - Server-side search and cursor pagination for the tasks and schedules
lists. Search is debounced (one request per settled query — tasks match
name and slug, schedules match slug and task slug) and runs on the daemon;
type and enabled filters (tasks) and the kind filter (schedules) moved into
SQL as well. The lists load 50 rows at a time over stable slug keyset
cursors and keep every page already scrolled into memory as you scroll for
more, with a "X shown · Y total" footer and honest loading states: a
spinner in the search field while a query is in flight, a "Loading more…"
row while the next page arrives. - Revision pulse. A new
/v1/revisionendpoint exposes one cheap
aggregate signature per domain (tasks, schedules, runs). The GUI diffs it
every few seconds and invalidates exactly the list whose signature moved —
so a scheduled run firing in the background, aheka runfrom another
terminal, or a YAML file edited on disk all appear in the open lists within
seconds, without refetching a single page.
Changed
- Tasks and schedules lists no longer poll. Freshness comes from mutation
invalidations (Run Now, enable/disable, delete, create/update/import,
reconcile) plus the revision pulse for everything outside the GUI;
window focus still refetches as a safety net. Run-toggling stays
optimistic — chips flip instantly and roll back on failure, now correct
across every loaded page. /v1/tasksand/v1/schedulesnow return{items, total, next_cursor}
envelopes instead of bare arrays. Calls without alimit(the CLI, the
dashboard's next-run panel, the schedule-form picker) still receive full
lists —heka list --jsonoutput is byte-identical. Schedules'kind
filter moved from the handler's in-memory loop into SQL.- Schedule cards lead their header with the enable switch; edit and delete
sit side by side next to it. - Reconcile schedules now refreshes the tasks list too, since reconciled
runs change task chips.
Fixed
- New IPC query parameters are URL-encoded properly, so search text
containing spaces,%, or&reaches the daemon intact (the older runs
filter path keeps its behavior).
Full Changelog: 0.8.2...0.8.5
0.8.2
What's Changed
[0.8.2] - 2026-09-05
The schedule creator grows out of its dropdowns: a pattern-first builder that
can express any standard cron — including things like "September 23rd through
26th at 9:00" — with a live preview of the next runs, and schedules can now be
edited instead of deleted and recreated.
Added
- Pattern-based schedule builder. The create dialog now starts with six
sections — Every N, Daily, Weekly, Monthly, Once, and Cron — each with
purpose-built inputs instead of single-choice dropdowns:- Monthly picks days of the month from a 1–31 grid, supports ranges
("23rd–26th" →0 9 23-26 * *) and an optional month restriction
(0 9 23-26 9 *), with honest notes for months that have no 29th/30th/31st. - Weekly multi-selects weekdays (contiguous picks emit ranges:
Mon–Fri →30 8 * * 1-5) with Weekdays/Weekend presets. - Daily, Weekly, and Monthly accept multiple times per day
(09:00 and 17:00 →0 9,17 * * *). - Cron is the full-power escape hatch: raw 5- or 6-field expressions
with per-field breakdown, live validation, and grammar hints (lists,
ranges, steps, names,@every). Steps, names, and other shapes the
builder doesn't model stay available here.
- Monthly picks days of the month from a 1–31 grid, supports ranges
- Live preview in the builder. Every keystroke shows a plain-language
description ("At 09:00, on day 23–26, in Sep"), the generated expression
with a copy button, and the next five run times with relative offsets. When
multiple times would cross-fire (9:05 and 10:42 also means 9:42 and 10:05),
the preview says so explicitly. - Schedule editing. Schedule cards gain an Edit button; the same dialog
reopens prefilled and saves through the existing update API. Schedules
created in the app round-trip back into their builder section; foreign
expressions open in the Cron section unchanged. - A cron engine for the frontend (parsing, validation, next-run computation,
description) that mirrors the daemon's robfig parser exactly, verified
expression-by-expression against it via a generated golden fixture.
Changed
- Schedule cards and the dashboard's next-run panel describe recurring rules
in plain language, keeping the raw expression underneath (list) or as a
tooltip (dashboard) for precision. - Cron validation in the schedule form now runs the same grammar the daemon
will apply, with field-accurate messages ("end of range (7) above maximum
(6)") before anything is saved.
Full Changelog: 0.8.1...0.8.2
0.8.1
What's Changed
[0.8.1] - 2026-09-04
A correctness pass over notifications and run artifacts: every webhook
payload now identifies the task it came from, notifications report the real
trigger, and the declared-but-dead capture_output setting is gone. Dark
themes get a precision pass of their own: CRT Dark replaces Gradient Dark,
and both dark themes now paint every page consistently.
Changed
- Gradient Dark is replaced by CRT Dark: an accent-phosphor dark theme
with scanlines and an accent-tinted ambient wash (pick the green accent
for a classic terminal). Users who had Gradient Dark are migrated
automatically. CRT Dark's scanlines are drawn as faint light lines so the
texture is actually visible on a near-black screen. - Khaki Dark joins the dark roster — the warm brown twin of the light
Khaki default — and High Contrast is now available in light mode too
(near-black text on pure white with strong dark borders, mirroring the
dark variant). Variants survive mode switches via the quick-toggle. - Every surface, border, and text color across the app now derives from the
theme tokens instead of hardcoded grays — previously only the Dashboard
did. High Contrast (light or dark) and CRT Dark now look identical in
quality on every page and dialog: true-black panels, light borders,
properly bright text. Light themes are visually unchanged.
Fixed
- Webhook notifications name the task and its outcome. Payloads read like
the desktop toast — "deploy — Failed • Trigger: schedule • Duration:
5.1s" — instead of a bare "Trigger: … • Duration: …" that gave no way to
tell which task ran. - Scheduled runs no longer notify as "Trigger: manual". The completion
callback now receives the actual trigger (manual, schedule, cli, system)
through the executor's group result. - Missed-run reconciliation and the NEXT RUN display evaluate cron specs in
the daemon's local timezone. Stored windows are UTC while the running
engine fires local ticks, so on a UTC+6 machine a daily 9:00 schedule that
fired while the PC was off reported "0 caught up" at boot and silently
dropped the missed run. - Webhook format "pumble" validates again. Pumble incoming webhooks accept
Slack-style payloads, so the editor now offers a single "Slack / Pumble"
option that saves the canonical "slack" format; existing YAML with
"pumble" loads as-is and re-exports as "slack". - Per-run artifacts (stdout.log, stderr.log, run.json) land under the
global runs folder (<data_dir>/runs, configurable via
run_artifacts_dir) unless a task setsoutput_dir. They previously went
to the task's working directory, leaving the configured runs root — and
the "run artifacts" part of backups — empty.
Removed
- The
capture_outputtask field. It had no behavioral effect (output is
always capped and stored on the run row). Existing YAML files keep
parsing; the field is dropped the next time the task is saved.
[0.8.0] - 2026-09-04
Backup & restore, plus a proper home for a growing vault. Every archive is an
AES-256-encrypted zip that captures the complete Heka state — a consistent
SQLite snapshot, the vault key, the canonical task YAML files, and the user
config — so a restore brings back exactly what was there, secrets included.
Added
- Automatic backups on a configurable schedule — every N hours (up to a
year), daily, weekly, or monthly at a local time — with missed-run
catch-up: if Heka was closed at the scheduled time, the missed backup
runs once at startup. - Local destination (custom folder + keep-latest retention, default inside
the data directory) and an S3-compatible remote destination — AWS S3,
Cloudflare R2, Backblaze B2, MinIO — with its own keep-latest pruning and
a one-click "Test connection" that exercises the bucket end to end. - S3 credentials live in the secrets vault (
BACKUP_S3_ACCESS_KEY_ID,
BACKUP_S3_SECRET_ACCESS_KEY), same write-only discipline as every other
secret. - Archive encryption with a passphrase stored in the vault
(BACKUP_PASSPHRASE) so scheduled backups run unattended — with a loud
warning that losing it means losing the backups, since restore on a new
machine asks for it. - Manual "Back up now" with live status, a job history view (trigger,
status, size, per-destination outcomes), and desktop notifications when a
scheduled backup fails. - A guided restore flow: pick an archive, verify it with the passphrase,
preview exactly what it contains (created when, which Heka version, task
counts), choose optional parts (config.yaml, run artifacts), and let the
app stop the daemon, restore, and prompt to start it again. A safety
backup of the previous state is written automatically before anything is
overwritten; archives from newer Heka versions are refused, and checksums
guard against truncated or tampered archives. - A dedicated Backup section in Settings with all of the above, and
heka backup create|status|history|testplusheka restorein the CLI. - A dedicated secrets manager page (
/secrets, linked from Settings →
Secrets) built for large vaults: search, sort, "unused only" filter,
per-key usage tracking (which tasks reference${KEY}), bulk delete with
confirmation, pagination, and per-key value replacement. Keys stay the
only thing ever displayed — values remain write-only.
Changed
- Backup catch-up is now part of the missed-run reconcile pipeline: a missed
auto-backup runs once on daemon start, on wake from sleep, on the periodic
reconcile cadence, and from the "Reconcile now" button — not only via the
backup loop's own tick. A reconciled backup is labeled "catch-up" in the
job history, and the missed window is recorded in the system log
(Logs → System), alongside new events for manual starts and schedule
arming. - The backup time-of-day picker is a themed segmented field (HeroUI
TimeField) instead of the native browser time dropdown, which overflowed
the panel.
Fixed
- The Schedules page no longer shows a stale NEXT RUN after a missed run
was caught up. Reconcile closed the miss window without re-deriving
next_run_at, and the startup path read a cron entry that only carries a
value once the engine starts — so a daily 9:00 schedule kept showing
yesterday's 9:00 as next. Both paths now compute the next occurrence
directly from the cron spec. - S3 "Test connection" now saves pending edits first (endpoint, bucket,
keys, Use HTTPS), so it tests exactly what is on screen. Enabling the S3
destination also defaults to HTTPS — plain HTTP is 301-redirected by
Cloudflare and friends, which previously surfaced as a wall of HTML; the
redirect now produces a clear, actionable error instead.
Full Changelog: 0.7.7...0.8.1
0.7.7
What's Changed
[0.7.7] - 2026-09-04
A fresh coat of paint: the app icon — window, executable, installer, tray,
and About page — is replaced with the new artwork (yellow "H" with the robot,
clock, browser, and gear).
Changed
- New application icon everywhere it appears: the executable and installer
icons (multi-size ICO rebuilt at 16–256 px), the Wails app icon, the system
tray icon (now generated from an exact 32 px source for crisper results),
and the About page logo.
Fixed
- The dashboard "Last 7 Days" chart no longer reshuffles on every poll. The
stats endpoint flattened its per-date build map in randomized Go map
order, so the days arrived scrambled (e.g. 09-03 first) each time the
dashboard re-fetched; run history is now sorted by date ascending.
[0.7.6] - 2026-09-03
A reliability patch for the missed-run machinery, prompted by a field report:
a daily 9:00 schedule missed its activation while the daemon was down, and
reconcile kept insisting there was nothing to catch up.
Fixed
- Missed-run reconciliation no longer masks the next occurrence when the
previous run finished within the same second it started. Such sub-second
runs storestarted_at == finished_at == last_run_at(RFC 3339 has second
precision), and the inclusive window boundary counted that already-
accounted run as "fired" in the next window — somissedcomputed as
1 - 1 = 0and the missed activation was never caught up. The boundary is
now exclusive. - The periodic reconcile pass now logs its outcome every tick to
Logs → System (reconcile (periodic): checked N schedule(s), M caught up),
proving the loop is alive; previously it stayed silent unless it actually
caught something.
Full Changelog: 0.7.5...0.7.7
0.7.5
What's Changed
[0.7.5] - 2026-09-03
This release is about the part of Heka you see first. The Home screen, the
task list, and the task dialogs got a full pass to feel like a proper desktop
app — quicker to read, quicker to act.
Added
- A reworked Home screen. Up top you'll find the state of the engine at a
glance (is the daemon up, is the scheduler running) and three quick
actions: create a task, create a schedule, or run any task right from a
small picker — no need to visit other pages for the everyday stuff. - The next scheduled run now gets the spotlight it deserves: which task,
when it fires, and how long from now ("in 14h 2m"), with a one-click
"Run now" if you can't wait. - Recent activity rows now open the exact run they refer to — one click from
the dashboard straight to that run's output — and show friendly times like
"2m ago" (the full timestamp appears when you hover). - Hovering the status dot in the top bar — or the engine badge on Home —
now tells you what's actually going on: the version, the state of the
core and scheduler, and how long the daemon has been up. When the
scheduler is paused, it says so plainly. - The task list is now made of cards instead of a dense table. Each card
shows the task, its type, when it last ran and how it went, with Run,
enable/disable and delete right on the card. Clicking a card opens the
editor.
Changed
- Creating and editing tasks now happens in a dialog, the same way for both.
Editing no longer navigates away from the task list, and importing a task
file drops you straight into the editor to review it. - The task dialog is wider, so the form breathes and the YAML editor has
room to work. - The default window size is larger, and Tasks and Schedules use the extra
room. On small laptop screens the window quietly shrinks to fit — the
shape stays the same. - Statuses are written the way people say them — "Timed out" instead of
"timed_out" — everywhere, including the charts and the log filters. The
status chart now shows readable labels with aligned counts, and the log
filters use the same wording.
Fixed
- The status dot in the top bar ignored the mouse entirely — hovering it
never showed anything. It now has a proper hover area and reveals the
health details described above.
Full Changelog: 0.7.2...0.7.5
0.7.2
What's Changed
[0.7.2] - 2026-09-02
Added
- Heka now remembers your window. The size and position you leave it in are
restored the next time you open the app, including whether it was
maximized. If the monitor you last used is no longer connected, the window
reopens centered on a visible screen instead of getting lost off-screen. - A "Pause scheduler" switch in Settings → Reliability. Pausing used to be
possible only from the tray icon; the switch mirrors that state, so you
can pause and resume without hunting for the tray. Both controls stay in
sync, and a paused scheduler survives daemon restarts.
[0.7.1] - 2026-09-02
This release makes Heka more dependable day to day. The daemon — the
background part of Heka that runs and schedules your tasks — now stays
reachable no matter how it was started, and it explains itself clearly when
something is wrong.
Fixed
- Fixed the confusing "heka daemon is not running" error that could appear
even when the daemon was actually running. If Heka had been started as
administrator (for example, to get notification sounds working), the CLI
and GUI could not connect to it. Heka now grants your Windows account
permission to reach the daemon regardless of how it was started. heka daemon stopnow actually stops the daemon. Previously it was
silently ignored whenever the daemon was running with a tray icon.- Fixed a small race when logging into Windows: the automatic startup and
the watchdog could briefly overlap when bringing the daemon up. That can
no longer lead to tasks running twice. heka daemon statusnow tells you what is actually wrong and what to do
next, instead of always reporting "not running".
Added
- You can now choose how often the watchdog checks on the daemon, in
Settings → Reliability. Pick anywhere from every minute to once an hour —
the change applies right away, no restart needed.
Changed
- Command-line error messages are clearer: they now tell you whether the
daemon needs to be started, was started with administrator rights, or is
simply busy.
[0.7.0] - 2026-09-02
Added
- Schedules now catch up automatically. If your computer was off, asleep, or
the app was in the background when a recurring task should have fired,
Heka will run the missed schedule as soon as you return — no more wondering
why the 9 AM task never happened. You can choose how often to check
(every 2, 5, 8, or 10 minutes) in Settings → Reliability. - Heka now notices when your PC wakes from sleep and catches up missed runs
right away, instead of waiting for the next check. Resuming the scheduler
after a pause does the same. - A new System view on the Logs page shows what the scheduler has been up
to: when the daemon started, when it woke from sleep, and exactly what it
caught up — which schedule missed how many runs and what was done about it.
Manual checks and the check at startup always report their result, even
when nothing was missed. - If a missed task fails to start (for example the script was temporarily
unavailable), the catch-up stays pending and is retried on the next check
instead of being silently dropped. - "Reconcile now" button on the Schedules page lets you catch up on missed
runs without waiting for the next tick. - New
heka schedules reconcilecommand for the same on demand from the
terminal. It now points you to Logs → System to see what was caught up. heka schedules missedcommand for debugging. Lists schedule runs the
daemon recorded as missed or skipped, so you can see exactly which
schedules didn't fire (and when) after the PC was off, asleep, or when an
overlap was skipped. Supports--since(default 168h/7d),--status(default
missed,skipped),--task, and--limit, with both human-readable and
--jsonoutput.- Each schedule row now shows whether missed runs will fire (Run now) or
just be logged (Skip), so you know what will happen after downtime.
Changed
- Missed-run checks now run every 2 minutes by default (was 10), so
catch-up after a nap or short sleep happens within moments of returning. - The log retention and notification settings now also include the new
reconciliation interval, keeping the settings shape consistent.
Full Changelog: 0.6.9...0.7.2