Releases: lifedever/TaskTick
Release list
TaskTick v1.21.0
What's Changed
Automatic execution log retention (#52 by @techblack)
- The configured retention period is now enforced automatically at launch and every 24 hours — no more relying on the manual "Clean History Logs" button
- New per-task history cap (default 1,000) and an automatic-cleanup switch under Settings › Logs
- Cleanup runs in 500-row background batches, never removes a running log, and leaves tasks that end after a fixed run count alone
- The scheduler and executor now read the persisted run counter instead of walking every log on each run
Faster log views
- Every log surface reads through bounded database queries instead of loading a task's entire history: list rows fetch one row, the detail page ten
- The per-task log sheet and the global Logs window page 50 rows at a time with a "Load more" row; "Export all" still exports everything
- Global Logs window: new task filter beside the status filter, both applied in the query
- "Clear logs" deletes in batches so large histories no longer spike memory
Thanks to @techblack for the PR and @yixiay for the review that led to the follow-up.
更新内容
执行日志自动保留(#52,@techblack 贡献)
- 设置的保留天数现在会在启动时和每 24 小时自动生效,不再依赖手动点「清理历史日志」
- 新增每个任务的日志条数上限(默认 1000)和「自动清理」开关,位于 设置 › 日志
- 清理在后台按 500 条一批进行,不会删除正在运行的日志,也不会动「执行 N 次后结束」的任务
- 调度器和执行器改读持久化的执行计数,不再每次运行都遍历全部日志
日志视图提速
- 所有日志界面改走有界数据库查询,不再一次加载任务的全部历史:列表行只取 1 条,详情页只取 10 条
- 任务日志页和全局日志窗口改为每页 50 条 +「加载更多」;「导出全部」仍导出全部
- 全局日志窗口新增按任务筛选,与状态筛选并列,两者都在查询里完成
- 「清空日志」改为分批删除,大量历史不再造成内存峰值
感谢 @techblack 的 PR 和 @yixiay 的评审。
Full Changelog: v1.20.0...v1.21.0
TaskTick v1.20.0
What's Changed
Push channels: Gotify and custom webhooks (#51)
Remote push used to be Bark and only Bark. It's now a list of channels you configure once and pick from per task.
- Gotify — self-hosted push. Enter your server URL and an application token; TaskTick appends
/messageitself and works with sub-path deployments behind a reverse proxy. - Custom Webhook — a plain HTTP request you shape yourself.
{{title}}and{{body}}are substituted into both the URL and the body, escaped to match the Content-Type. One webhook covers ntfy, Telegram, Slack, Discord and anything else that accepts HTTP. - Bark — unchanged, now just one channel among others.
Each task picks which channels it notifies, so a critical backup job and a chatty poller no longer have to share a destination.
New Notifications settings tab
System notifications and push channels now live together in their own tab. General is back to appearance, language, startup and defaults.
Fixes
- Settings window width is now measured from the current language's tab titles instead of a number hardcoded from English. Russian and Spanish were silently folding the last tabs into a
»overflow menu; languages that already fit are unaffected.
Upgrading
Your existing Bark URL is converted into a channel automatically on first launch, and tasks that had Bark enabled stay pinned to it — adding a second channel later won't make them start double-pushing. Nothing to reconfigure.
更新内容
推送渠道:支持 Gotify 与自定义 Webhook(#51)
远程推送以前只有 Bark 一种。现在是一个渠道列表,配置一次,每个任务自行选择推送到哪几个。
- Gotify —— 自托管推送。填服务器地址和 application token 即可,
/message由 TaskTick 自动补全,反向代理下的子路径部署也支持。 - 自定义 Webhook —— 形状完全由你决定的 HTTP 请求。URL 和请求体里的
{{title}}、{{body}}会被替换,并按 Content-Type 自动转义。一条 webhook 即可对接 ntfy、Telegram、Slack、Discord、企业微信、钉钉等任何接受 HTTP 请求的服务。 - Bark —— 行为不变,只是变成了众多渠道中的一个。
每个任务可单独选择推送到哪些渠道,重要的备份任务和话痨的轮询脚本不必再共用同一个出口。
设置页新增「通知」标签页
系统通知开关和推送渠道合并到了同一处。「通用」页回归外观、语言、启动项和默认值。
修复
- 设置窗口宽度改为按当前语言的标签文字实测计算,不再沿用按英文写死的数值。此前俄语和西班牙语会把末尾的标签页悄悄折进
»溢出菜单;本来就装得下的语言宽度不受影响。
升级说明
首次启动会自动把你原有的 Bark 地址转换成一条渠道,原先开启了 Bark 推送的任务会继续钉在这条渠道上——日后新增其他渠道也不会让它们悄悄开始多推。无需重新配置。
Full Changelog: v1.19.1...v1.20.0
TaskTick v1.19.1
What's Changed
Script files now run under the interpreter their shebang names
Pointing a task at a .py / .rb / .js file used to fail with zsh: parse error near ')': the file's contents were handed to the shell, which then tried to parse Python as shell script. TaskTick now reads the shebang and runs the file with the interpreter it actually names.
#!/usr/bin/env python3and friends resolve against the same PATH your terminal uses, so you get the Python you installed rather than the system 3.9- Shell scripts behave exactly as before
- Pre-run commands, environment variables, working directory and rc files all still apply
- Timeouts and cancellation act on the interpreter process itself, so stopping a task really stops the work
Validate Script now checks the script's own language
The Validate Script button picked its checker from the shell chosen in the dropdown — which can never be Python, since that list comes from /etc/shells. Every non-shell script was therefore parsed by zsh -n and reported as broken. The checker is now chosen from the script's shebang: -n for shells, compile() for Python, --check for Node, -c for Ruby / Perl.
- Pre-run commands are validated separately as shell code instead of being pasted in front of the script — previously any task combining a pre-run command with a non-shell script could never pass validation
- Interpreters with no known syntax check are now reported as skipped, instead of being run through the wrong parser and flagged as errors
更新内容
脚本文件按 shebang 指定的解释器运行
任务指向 .py / .rb / .js 文件时会报 zsh: parse error near ')' 而无法运行——文件内容被直接交给 shell,于是 zsh 去解析 Python。现在 TaskTick 会读取 shebang,用它指定的解释器来运行脚本。
#!/usr/bin/env python3这类写法按终端里的 PATH 解析,命中的是你自己装的 Python,而不是系统自带的 3.9- Shell 脚本行为完全不变
- 前置命令、环境变量、工作目录、rc 文件照常生效
- 超时与取消作用在解释器进程本身,停止任务是真的停止
「校验脚本」按脚本自身的语言校验
「校验脚本」原先根据下拉框里选的 shell 决定校验方式,而该列表来自 /etc/shells、永远不可能是 Python,因此所有非 shell 脚本都被 zsh -n 解析并报错。现在改为按脚本的 shebang 选择校验器:shell 用 -n,Python 用 compile(),Node 用 --check,Ruby / Perl 用 -c。
- 前置命令作为 shell 代码单独校验,不再拼接到脚本正文之前——此前只要同时设置了前置命令和非 shell 脚本,就永远无法通过校验
- 没有已知语法检查方式的解释器会如实提示「已跳过」,而不是交给错误的解析器得出错误结论
Full Changelog: v1.19.0...v1.19.1
TaskTick v1.19.0
What's Changed
Per-Task Global Shortcuts (#49)
- Assign a global keyboard shortcut to any task: Edit Task → Basic → Global Shortcut. Press it from any app to run the task — works whenever TaskTick is running, including menu-bar-only mode
- Native macOS shortcut recorder (Esc to cancel, ⌫ to clear) with automatic warnings for shortcuts already taken by the system or the app's main menu
- Conflicts with the Quick Launcher or other tasks are flagged before saving; conflicts with other third-party apps cannot be detected — if a shortcut doesn't fire, please pick another combination
- A system banner confirms each shortcut-triggered run; pressing while the task is already running shows a notice instead
- Shortcuts of disabled tasks stay inactive; deleting a task releases its shortcut
- Bound shortcuts are shown in the task list and detail view
更新内容
任务全局快捷键 (#49)
- 可为任意任务设置全局快捷键:编辑任务 →「基本」→「全局快捷键」。在任意应用中按下即可运行该任务——TaskTick 运行期间有效,仅驻留菜单栏时同样生效
- 原生 macOS 快捷键录制控件(Esc 取消、⌫ 清除),自动警告已被系统或应用主菜单占用的组合
- 与快捷启动器、其他任务的冲突在保存前提示;与其他第三方应用的冲突无法检测——若按下无反应请更换组合
- 快捷键触发运行时弹出系统横幅确认;任务已在运行时按下会提示而非静默
- 停用任务的快捷键不生效;删除任务自动释放其快捷键
- 任务列表与详情页显示已绑定的键位
Full Changelog: v1.18.0...v1.19.0
TaskTick v1.18.0
What's Changed
Custom notification content (#48)
A task can now define its own reminder text instead of the built-in script-output summary. Turn on Custom Notification Content in the task's Notification tab and write a template — one piece of content feeds every channel at once: the system notification, the Bark push and the strong-reminder panel. The channel only decides how a reminder shows up; this decides what it says.
Available placeholders:
| Placeholder | Value |
|---|---|
{{output}} |
Script output (stdout on success, stderr on failure) |
{{firstLine}} / {{lastLine}} |
First / last meaningful line of the output |
{{name}} |
Task name |
{{duration}} |
Elapsed time |
{{exitCode}} |
Exit code |
{{status}} |
Succeeded / Failed |
Off by default — existing tasks keep their current wording. Turning the switch back off keeps the template you wrote, so you can flip between custom and default text without losing it.
Last Output card
The task detail sidebar now shows the newest run's output right under the run list — monospaced, selectable, with one-click copy of the full output and a jump straight into that run's log entry. Long output is previewed at 4000 characters so the detail view stays responsive.
更新内容
自定义通知内容(#48)
脚本输出很长时,提醒里被整段输出刷屏。现在可以在任务的「通知」标签页打开自定义通知内容开关,自己写一段文案——这一份内容同时供给三个渠道:系统通知、Bark 推送、强提醒面板。渠道只决定提醒怎么弹,内容由你决定。
可用变量:
| 变量 | 含义 |
|---|---|
{{output}} |
脚本输出(成功取 stdout,失败取 stderr) |
{{firstLine}} / {{lastLine}} |
输出的首行 / 末行有效内容 |
{{name}} |
任务名 |
{{duration}} |
耗时 |
{{exitCode}} |
退出码 |
{{status}} |
成功 / 失败 |
默认关闭,已有任务的通知文案不受影响。关掉开关不会丢弃已写好的模板,可以随时在自定义与默认文案之间切换。
「最后一次输出」卡片
任务详情右栏在「最近执行」下方新增一张卡片,直接显示最近一次执行的输出:等宽字体、可选中、一键复制完整输出,也能跳到该条执行的日志详情。输出过长时预览前 4000 字符,避免详情页卡顿。
Full Changelog: v1.17.0...v1.18.0
TaskTick v1.17.0
What's Changed
🔔 Bark Push Notifications
Push task results to your iPhone via Bark — contributed by @WhiteBalance2800K in #47. Thanks!
- Settings → General: paste the device URL from the Bark app (or just the device key), with a "Send Test" button. Self-hosted Bark servers are supported, including plain-http LAN addresses (
http://192.168.x.x,http://nas,http://xxx.local) - Per-task toggle: each task opts in individually in the editor's Notification tab — existing tasks stay unchanged
- Only When Output Changes: optionally push only when the script output differs from the previous run — ideal for polling/monitoring tasks
- Bark is independent of macOS system notifications; either channel can be used alone
更新内容
🔔 Bark 推送
任务执行结果可推送到 iPhone(Bark)——由 @WhiteBalance2800K 在 #47 中贡献,感谢!
- 设置 → 通用:粘贴 Bark App 里复制的设备地址(或只填设备 Key),提供「发送测试」按钮。支持自建 Bark 服务器,包括内网 http 地址(
http://192.168.x.x、http://nas、http://xxx.local) - 按任务开关:每个任务在编辑器「通知」页单独开启,已有任务不受影响
- 仅在输出有变动时通知:可选,只有脚本输出与上次不同才推送——适合轮询/监控类任务
- Bark 与 macOS 系统通知互相独立,可任选其一使用
Full Changelog: v1.16.1...v1.17.0
TaskTick v1.16.1
What's Changed
Fixed
- The New Task button disappeared into the toolbar overflow menu (#46) — macOS 26 measures toolbar overflow against the sidebar column width, not the window width. At narrow sidebar widths the sort menu and the "+" button stopped fitting together, so "+" was folded into the "»" overflow menu — while "»" itself renders on the far right of the window, leaving the odd picture of a button being hidden next to a wide empty space. The sort menu has moved down to the filter bar, and the sidebar toolbar now carries only "+".
Added
- Enable / Disable from the right-click menu — no need to open the task first.
- Tooltips on the status icon — hovering explains what the icon means: Running / Disabled / Last run: Success, Failure, Timeout, Cancelled / Enabled.
Changed
- Disabled tasks read as disabled at a glance — a uniform grey pause icon (instead of a dimmed result icon), a greyed-out name, and they now sink to the bottom of their section. "This won't fire on its own" is the more useful signal there than "did it succeed last time".
- Status icons align to the task name rather than centring on the whole two-line block.
- The timeout icon is no longer oversized — it is the only badged symbol in the set and rendered a size larger than the rest; it is now scaled to match.
更新内容
修复
- 新建任务按钮被折叠进溢出菜单(#46)—— macOS 26 计算工具栏溢出时用的是侧边栏列宽,不是窗口宽度。侧边栏较窄时「排序菜单 + 新建按钮」放不下,新建按钮就被折叠进
»溢出菜单;而»渲染在窗口最右侧,于是出现「右边一大片空白、按钮却被藏起来」的违和画面。现在排序菜单下移到筛选栏,侧边栏工具栏只保留新建按钮。
新增
- 右键菜单可直接启用 / 禁用任务 —— 不必先打开任务详情。
- 状态图标悬停提示 —— 鼠标停在图标上会说明含义:运行中 / 已禁用 / 最近执行:成功、失败、超时、已取消 / 已启用。
变更
- 禁用的任务一眼可辨 —— 改用统一的灰色暂停图标(不再是压暗的执行结果图标)、名称置灰,并沉到所在分组底部。对禁用任务来说,「这个不会自动跑」比「上次跑成功没」更值得一眼看到。
- 状态图标对齐任务名,不再居中于「名称 + 副标题」整个两行块。
- 超时图标不再大一号 —— 它是这组图标里唯一带徽章的符号,同字号下比其他图标大一圈,现已缩放对齐。
Full Changelog: v1.16.0...v1.16.1
TaskTick v1.16.0
What's Changed
Sidebar: latest execution status at a glance (#44, #45)
Each task's status dot in the sidebar now shows the result of its most recent run — green check for success, red cross for failure, orange clock for timeout — using the same icon set as the Recent Executions list. Tasks that have never run keep the plain enabled/disabled dot, and running tasks show a live running indicator. Thanks @iF2007 for the proposal and contribution!
Fixes
- Release tooling: non-interactive invocations no longer silently skip publishing.
更新内容
侧边栏:任务最近执行状态一目了然(#44、#45)
侧边栏每个任务左侧的状态点升级为最近一次执行结果图标——成功绿勾、失败红叉、超时橙钟,与「最近执行」列表同一套视觉。从未运行的任务保持原有圆点,运行中的任务显示实时运行指示。感谢 @iF2007 的提议与贡献!
修复
- 发版工具:非交互调用不再静默跳过发布。
Full Changelog: v1.15.0...v1.16.0
TaskTick v1.15.0
新功能
- 日志列表支持选择性删除(#43)——右键单条删除,或按住 ⌘/⇧ 多选后批量删除。删除后焦点自动落到下一条,删的是末尾则回退到上一条。导出也顺带支持了多选批量导出。
- 脚本文件支持手填/粘贴路径——来源选「本地文件」时路径框可直接输入,不必每次都走文件选择面板。支持
~展开、自动清理粘贴带入的引号与转义空格;路径无效时会内联提示。
修复
- 日志输出区随窗口高度伸展(#42)——输出区原先被固定在 600pt,窗口拉高只会在下方留出空白。现在输出区会吃掉剩余高度,拉高窗口即可看到更多日志行。全局日志窗口与单任务日志面板均已修复。
Full Changelog: v1.14.0...v1.15.0
TaskTick v1.14.0
What's Changed
Per-Task Time Zone (#41)
- Each task's schedule can now be interpreted in a chosen IANA time zone (default: follow the system). Useful when your Mac's system time zone differs from the wall clock you actually plan by.
- Searchable time zone picker with localized zone names and GMT offsets, available for both regular and cron schedules. Switching the zone keeps your configured times unchanged (09:00 stays 09:00).
- Task detail and list views annotate non-system zones; "Next Run" stays in your Mac's local time.
- Backups and exports now round-trip the time zone.
Fixes
- DST spring-forward no longer permanently shifts day-aligned schedules set inside the skipped hour (e.g. daily at 02:30 in a DST zone used to drift to 03:30 forever; it now adjusts only on the transition day and recovers the next day).
- Duplicating a task now copies all settings, including Shortcut name, legacy interval, date/time toggles, environment variables, and notification options that were previously dropped.
更新内容
任务级时区(#41)
- 每个任务的计划时间可按指定时区解释(默认跟随系统)。适合系统时区与实际作息时区不一致的场景。
- 可搜索的时区选择器,显示本地化时区名(如"中国标准时间")与 GMT 偏移,普通计划和 cron 模式均可用。切换时区时已配置的时间保持不变(9:00 还是 9:00)。
- 详情页对非系统时区的任务显示时区标注;"下次运行"仍按本机时间显示。
- 备份与导出会完整保留时区设置。
修复
- 修复夏令时春季跳变导致的计划时间永久漂移:设在被跳过时段内的每日任务(如纽约 02:30)此前会永久漂到 03:30,现在仅跳变当天顺延、次日自动回落。
- 修复复制任务时部分设置丢失的问题(快捷指令名、旧版间隔、日期/时间开关、环境变量、通知选项等)。
Full Changelog: v1.13.0...v1.14.0