Contributors of the month October 2026
46 community contributors had 143 PRs merged in October! From "won't do" tasks, repeat end dates and multi-task dragging to a much bigger Local REST API, faster long task lists, new community plugins and translation updates, this was our biggest month yet by number of contributors.
A massive thank you to everyone who invested their time in making Super Productivity better.
Outstanding contributions
@tiliakoos had a remarkable month with 28 PRs. Highlights include an alarm-style looping bell for reminders on desktop (#11015), New task, Today and Inbox in the macOS dock menu and Windows jump list (#11017), configurable trusted proxy ranges and daily cleanup hour for the SuperSync server (#10297, #10301), and enforcing plugins' minimum app version (#11019). Recurrence got a lot of care too: monthly repeats no longer skip short months (#10919), deleted instances are skipped in the next-occurrence tooltip (#10603), tasks copied by Duplicate Project no longer link to the original's repeat config (#11004), and recurrence date logic is now shared (#11022). The rest spans bug fixes, performance, accessibility, translations, tests and docs.
@steindvart contributed 14 PRs, many of them polishing plugins and the side nav. The sync state is now one clear glyph instead of a checkmark overlay (#10430); projects and tags are indented under their section headers, archived projects appear at the bottom of the projects list, and collapsing those lists is animated (#10712, #10713, #10518). On the plugin side: a confirmation before clearing uploaded plugins, clearer naming for that action, translated Community Plugins cards, and plugin language names shown in the UI language (#10558, #10962, #10557, #10559). Short syntax now only suggests @ options the parser actually understands (#10460).
@davidvornholt delivered 13 PRs with a focus on the Local REST API and performance. The API can now manage task repeat configs (#10510), correct or remove a day's tracked time (#10890), and read and update simple counters (#10891). A series of performance PRs cut the per-row cost of long task lists (#11105), skip per-second work that changes nothing while tracking or in Focus Mode (#11104), and avoid needless recomputation for due-date colors, archive checks, counter charts and Flowtime animations (#11103, #11107, #11108, #10519). Focus Mode sessions also got more robust (#10995, #11040).
@Zoriot contributed 9 PRs: multi-tag filtering in the task view customizer (#11095), making "move to top/bottom" work for tasks in a section (#10747), preserving subtask due dates and undated subtasks when duplicating a task (#10302, #10741), mapping plannedAt to dueWithTime in the Local REST API (#11093), closing note editors before the desktop add-task bar opens (#10300, #10632), and listing the standalone Markdown notes and monday.com plugins in the community catalog (#11096, #11133).
@GabeSilvaDev contributed 9 PRs: new repeat instances now appear where the previous one was, including in sections (#11197, #11243); issue-provider plugins can declare their own done states (#10470); the Local REST API waits for archive removal before answering a task restore and keeps reminders in sync when dueWithTime changes (#10967, #11013); settings search reopens hand-collapsed sections (#10601); the Planner shows distinct weekday labels in the app locale (#10629); task lists reject a dragged section (#10900); and missing Brazilian Portuguese strings were translated (#10543).
@siemieniuk delivered 6 PRs: an undo button for unscheduling a task (#10450), a localized heatmap with local date formatting (#10329), a thorough Polish translation overhaul (#10324), HTML formatting that showed as raw tags in several translations (#10320), darkening of background images under the Liquid theme (#10466), and reopening a project from its archived project details (#10946).
@H1manshu01 contributed 6 PRs: projects and tags now show up in search results (#10606), yearly repeats handle leap days (#10724), checklist items insert reliably on repeated toolbar clicks and hover controls stay clear of note text (#10566, #10605), and several Vietnamese strings were fixed (#10565, #10723).
New features and everyday workflows
- @anandghegde added "Finish as won't do" for tasks you decide not to do (#10708), an optional end date for repeating tasks (#10276), and kept short-syntax tokens out of auto-created issue titles (#10273).
- @ac9492 added dragging selected tasks together between sections and projects (#10505), relative-date colors for scheduled dates and Today icons (#10494), and an opt-in desktop app-icon badge for due tasks (#10921).
- @MannXo made the repeat dialog show the next instance and the subtasks it will inherit (#10279) and deferred remote issue deletion until the undo window has passed (#10192).
- @nilay1221 added nth-weekday short syntax such as @2monday (#10308).
- @ParthibanRajasekaran brought deadlines into the Schedule view (#10310) and let task titles wrap in portrait mode on iOS (#10173).
- @symonbaikov added a done/total badge on collapsed subtask toggles (#7115), precomputed ordered task groups in the work view (#8437), and routed plugin PATCH requests through native HTTP on Android (#8590).
- @dschodits made deadlines discoverable in the Add Task bar with a hint and a button (#11146).
- @artemc added a separate volume setting for Focus Mode sounds (#10568).
- @MaiwulanjiangMaiming reworked the side-nav collapse/expand animation and repaired macOS window-drag dead zones (#10303, #10176).
- @Zhong-fan kept priorities on recurring tasks and let configured keyboard navigation continue across task groups (#10821, #10822).
- @akshit-codes made projects hidden from the side menu selectable in the add-task bar's project picker (#11092).
Local REST API, integrations and calendars
- @SaintChris added notes routes and POST /tasks/:id/time for logging time on a given day to the Local REST API (#10827, #10826).
- @costajohnt let the local create_task assistant tool take a due date, time and repeat, and fixed moving existing tasks picked in the add-task bar in project contexts (#10899, #10898).
- @sespiros included plugin calendar providers in the Schedule filter and event colors, and made paginated tab headers scroll with wheel and trackpad gestures (#7813, #11132).
- @michaelkcarlson added per-calendar colors to Planner calendar events (#10965).
- @SulimanAbdulrazzaq listed multi-day all-day events on every date they cover in the Planner (#10299).
- @Zombiehamser let plugins list their synced data keys and exposed the existing sync request to typed iframe clients (#11044, #11053).
Mobile, desktop and self-hosting
- @BigWebstas added the currently tracked task to the Android home-screen widget, kept bottom-anchored overlays attached to their trigger on Android, and exposed getAllSimpleCounters to iframe plugins (#10327, #10205, #10321).
- @d0g2342 fixed the iOS "Could not import shared content" error by carrying the App Group entitlement into the exported IPA (#10893).
- @artemis-mike added arm64 images for the SuperSync server, so it can run on a Raspberry Pi (#10218).
Reliability and correctness
- @jashkarangiya fixed date-only keys being read as the previous day west of UTC in the habit and focus dialogs, and made plugin counter reads and writes use the logical day (#10419, #11037).
- @BhavayGoyal keyed simple-counter streaks on the logical day and flagged empty translation values (#11195, #11196).
- @Lay-quq stopped the Planner from double-counting subtasks planned on other days (#10923).
- @FadhilR12 kept disabled features from being reachable via direct URL (#10585).
- @Hrushikesh-ramilla made Schedule navigation start from the displayed logical month (#10536).
Interface fixes and polish
- @stepanstipl showed the project title in single-select triggers and stopped untouched checkboxes from rendering as indeterminate (#10647, #10763).
- @mvanhorn gave see-through task hover controls an opaque underlay (#10564).
- @leafybees made the shortcut open the task view customizer's header filter (#11205).
- @edu-zamora gave the Zen Focus Mode notes panel an opaque background (#10761).
- @akshar27 allowed a leading space before the URL in Markdown =WxH image sizing (#10154).
- @Ibitier and @irontaek cleaned up code in the tag editor and removed write-only maps (#10133, #10607).
- @zenoprax clarified the docs on editing date and time fields and on Docker (#10538).
Community plugins and translations
- @AshrafByte added Timesheet to the community catalog for weekly tracked-time overviews with targets and CSV export (#11224).
- @SileboxUnderfined added SuperGile, a YouGile integration (#10996).
- @owarimono added Auto Tag Manager, which tags new tasks based on title keywords (#10705).
- @SilverGreen93 updated the Romanian translation (#9938).
- @Cyber-Syntax updated the Turkish translation (#10769).
- @Mingqi-111 localized the sound option labels in settings (#10809).
Thank you to every contributor, and to everyone reporting bugs, testing fixes, and helping other users. All of that work matters, and I really appreciate it.
See you next month! <3
24 points
Stadium Mode - a roaring crowd and a stadium announcer for finishing your everyday tasks
I maintain Super Productivity, an open source task manager, and I've started a small series of slightly ridiculous plugins for it called Ridonculous. This is Stadium Mode.
It turns your task list into a football match:
- Start a task: whistle, and the announcer calls "Ladies and gentlemen... now taking the field... your task!"
- Finish one: the crowd erupts, "GOAL!", confetti
- Finish three within 90 seconds: "HAT TRICK!"
- Reschedule something: the whole stadium goes "ooooh"
- Delete a task: red card
- Finish Day: final whistle and the day's score
The crowd, whistle and organ are all synthesized with the Web Audio API, so the plugin ships no audio files. The announcer is your system voice, or, if you opt in, Kokoro, a small neural voice model that runs on your device (about 110 MB downloaded once, task titles never leave your machine). The lines themselves are scripted, not generated.
It cheers me up more than it should :D Would this motivate you, or would you mute it immediately?
Video: youtube.com
Code: super-productivity/ridonculous
2 points · 2 comments
I made my to-do list cheer like a football stadium
I made Stadium Mode for Super Productivity: stadium sounds, AI sports commentary, and a GOAL celebration for finishing your everyday tasks.
Another questionable idea in my Ridonculous plugin series. Well, it cheers me up more than it should :D
Would this motivate you, or would you mute it immediately?
Download it yourself:
super-productivity/ridonculous
7 points
Plan tasks alongside your calendar and track the time you spend on them, so you can compare your daily plan with the work you actually get done.
super-productivity/super-productivity t.co
1 view
2. 할 일을 적어두면 하루가 시간표처럼 펼쳐져요.
가입할 필요가 없고 윈도우, 맥, 휴대폰, 웹에서 써요.
super-productivity/super-productivity
12 views
@denizdoingstuff Linear is just HIM tbh, i love how optimized and efficient it is, it's clear that it was made for product planning and by people who are obsessed with quality.
try this: super-productivity/super-productivity
i've been using it alongside Linear past week. Linear is for bigger projects and the bigger picture, while super productivity is for daily and weekly atomic tasks.
and i use Obsidian, the goat, for everything else
1 like · 42 views
Super Productivity 19.3.0: restore deleted tasks, "won't do", p1/p2/p3 priorities, and a lot of polish
Hi everyone! Super Productivity 19.3.0 is out. Here's what changed:
Tasks and focus
- Restore deleted tasks from Recently deleted, or finish a task as "won't do"
- Set priorities while typing with p1/p2/p3. @ dates now work in your UI language and date order, and nth-weekday syntax is supported
- Collapsed subtasks show a done/total count, and archived projects are listed at the bottom of the sidebar
- Start focus mode with one click and adjust the focus sound volume
- The productivity and sustainability scores are gone, and Upcoming is now an overview in the Recurring panel
Scheduling and reminders
- Deadlines show up in Schedule, and the Planner shows each calendar's color
- Repeats can have an end date, with clearer options for completion-based repeats, falling behind and pausing
- Reminders can now be set 1 day, 3 days or 1 week ahead
- Fixed monthly repeats skipping short months and yearly repeats on leap days
Integrations
- Optional CalDAV task creation and deletion when you add or delete tasks
- Connect AI assistants through an opt-in local MCP endpoint, or use SuperSync's hosted task capture (including ChatGPT)
- Install and update community plugins from inside the app
- The local REST API now covers notes, counters and time logging
Mobile and desktop
- The Android widget shows the task you're tracking, and launcher shortcuts open New task, Today and Inbox
- Long-press for sidebar menus or to choose the second bottom-nav slot, plus better touch targets and haptics
- Opt-in due-task badge on desktop
Reliability
- Many sync conflict fixes, no more WebDAV retry loops, and a confirmation before overwriting remote data that can't be decrypted
- Faster task-list rendering and swiping, better keyboard focus visibility and text contrast
Thanks to the 31 people who contributed to this release, including 10 first-time contributors!
Full release notes and downloads: github.com/super-productivity/super-productivity/…
Feedback and bug reports are very welcome, here or on GitHub.
52 points · 14 comments
待办很多,真正做事的时间却不够?✅
Super Productivity 把任务、计时与时间分块放在一起。规划学习和开发工作更清楚。📅
super-productivity/super-productivity
#Productivity #Tasks #浇朋友 #蓝朋友 #互关 #fo
66 views
Super Productivity v19.2: self-hosted task management, live Markdown notes, and bulk actions
I maintain Super Productivity, an MIT-licensed task manager and time tracker. It works offline, and you can self-host the web app and an optional sync backend.
My last update here was v18.16 in July. v19.2 is out now, so here's a catch-up on the changes since then.
For people running their own server
v19.2 adds ARM64 SuperSync server images alongside AMD64, versioned release images, configurable trusted proxy ranges, and fixes for fresh deployments. SuperSync is the optional sync backend, separate from hosting the web app.
SuperSync is still beta, and self-hosting support is limited. The documented Compose stack includes PostgreSQL and Caddy and needs SMTP for account emails. You don't need a server or an account to use the app locally.
What changed in the app
- Notes without switching modes: live Markdown editing arrived in v19.0.1.
- Less task-by-task housekeeping: multi-select and bulk actions arrived with v19, followed by keyboard navigation in the planner and boards. In v19.2, you can drag selected tasks between sections and projects, and multi-select in the mobile planner.
- Integrations: v19.1 added two-way Trello card sync and support for multiple Google Calendar accounts.
- Priorities and search: v19.2 adds numeric task priorities with icon presets, plus project and tag search.
- Recovery and reliability: earlier releases added local recovery points and full worklog export. v19.2 fixes sync cases that could lose tracked time or overwrite concurrent task edits, plus incorrect success reporting for failed desktop backups.
Two upgrade changes to know about: v19 removed User Profiles; v19.2 moved Redmine and Nextcloud Deck integrations into plugins.
Project, web app and downloads
SuperSync setup and limitations | v19.2 release notes | Changes since v18.16
Disclosure: AI helped draft and fact-check this update against the release notes and deployment docs.
If you've tried self-hosting Super Productivity, what would make setup or day-to-day use easier?
106 points · 27 comments
Calendar Math vs. Duration Math: Lessons From an Open-Source Bug
“Repeat every year” sounds like a simple instruction—until the original date is February 29.
While contributing to Super Productivity, I worked on a recurrence bug involving a task that started on a leap day. In a non-leap year, the application could create an extra overdue task before the next occurrence was due.
The bug demonstrated an important distinction:
> Duration arithmetic measures elapsed time. Calendar arithmetic models human schedules.
Those concepts overlap on ordinary dates, but they can produce different answers around leap years, month boundaries, daylight-saving transitions, and multi-year recurrence rules.
The bug
The reported task repeated yearly from February 29.
Because February 29 does not exist every year, the application needed a policy for non-leap years. In this case, the intended behavior was:
February 29, 2024
February 28, 2025
February 28, 2026
February 28, 2027
February 29, 2028
In the failing path, setting the day to 29 on a February 2025 date overflowed to March 1. The calculation then stepped back one year while preserving March 1, making March 1, 2024 appear later than the already-created February 29, 2024 occurrence.
That disagreement caused the application to materialize another overdue 2024 task.
The visible problem was a duplicate task, but the underlying problem was more interesting: different parts of the scheduling logic disagreed about which calendar occurrence existed.
JavaScript normalizes out-of-range date components
JavaScript’s Date setters normalize out-of-range components instead of rejecting them.
For example:
const date = new Date(2025, 1, 1); // February 1, 2025
date.setDate(29);
console.log(date);
// March 1, 2025
There is no February 29 in 2025, so JavaScript carries the extra day into March.
This behavior is valid and sometimes useful. But it is not necessarily the recurrence policy your product intends.
For a yearly task, several behaviors could be reasonable:
1. Move the occurrence to February 28.
2. Move it to March 1.
3. Skip non-leap years.
4. Ask the user to select a policy.
The important part is not choosing one universally correct answer. The important part is making the rule explicit and applying it consistently.
Super Productivity’s expected rule was to clamp the date to the last valid day of the month: February 28.
Calendar math and duration math answer different questions
Consider the phrase “one year later.”
It could mean an elapsed duration:
const ONE_YEAR_IN_MS = 365 * 24 * 60 * 60 * 1000;
const later = new Date(original.getTime() + ONE_YEAR_IN_MS);
But that assumes every year represents the same duration. Leap years immediately break that assumption.
It could instead mean a calendar operation:
Keep the original month and day.
Move to the target calendar year.
If the day does not exist, apply the recurrence policy.
These are different models.
Duration math is appropriate for questions such as:
- Has a 30-minute timeout expired?
- How long did this request take?
- Has a 24-hour retention period passed?
Calendar math is more appropriate for:
- Repeat this task every year.
- Run payroll on the last day of each month.
- Renew this subscription every three months.
- Schedule an event every Monday.
- Trigger an anniversary reminder.
A recurring task expresses human calendar intent. It is not merely a number of milliseconds after another timestamp.
Separate the recurrence interval from the occurrence date
The fix became clearer when I separated the problem into two questions.
1. Is this an eligible recurrence year?
Suppose the task started in 2024 and repeats every two years.
The eligible years should remain anchored to the original year:
2024, 2026, 2028, 2030...
Conceptually:
const yearsSinceStart = candidateYear - startYear;
const isEligibleYear =
yearsSinceStart >= 0 &&
yearsSinceStart % repeatEvery === 0;
This uses calendar-year positions rather than asking whether a fixed duration has elapsed.
2. What is the actual occurrence in that year?
Once the year is eligible, the application needs to construct a valid date.
A simplified model looks like this:
function getOccurrence(startDate, targetYear) {
const month = startDate.getMonth();
const requestedDay = startDate.getDate();
const lastValidDay = getLastDayOfMonth(targetYear, month);
return new Date(
targetYear,
month,
Math.min(requestedDay, lastValidDay),
);
}
This is illustrative pseudocode rather than the project’s implementation.
For a February 29 start date:
Target year: 2025
Requested day: 29
Last valid day in February: 28
Actual occurrence: February 28, 2025
The application can then compare normalized calendar dates in the same timezone:
const isDue = occurrenceDay <= todayDay;
That is safer than comparing against an out-of-range component and relying on automatic normalization. In production code, occurrenceDay and todayDay should use the same calendar and timezone policy.
Why multi-year repeats matter
A fix that only handles yearly repetition can still introduce another bug.
Consider a task that starts on February 29, 2024 and repeats every two years.
The expected sequence is:
February 29, 2024
February 28, 2026
February 29, 2028
If the algorithm advances from each normalized result, it may accidentally treat February 28 as the new permanent anchor. It can also drift into the wrong recurrence year if eligibility is based on fully elapsed durations rather than calendar-year intervals.
The original rule therefore needs to remain the source of truth:
Original month: February
Original day: 29
Original year: 2024
Repeat interval: 2 calendar years
Each occurrence should be projected from that rule. It should not be derived solely from the previous adjusted occurrence.
This was one reason the change needed to cover both the forward and backward recurrence calculations. Fixing only the “next occurrence” path would still leave another part of the system interpreting the same rule differently.
Testing the boundaries
Date bugs often hide in the boundaries, so testing only an ordinary date such as June 15 would provide little confidence.
The regression coverage included cases around:
- February 28 in a non-leap year
- February 29 in a leap year
- March 1 after the adjusted occurrence
- An occurrence that had already been created
- Yearly repetition
- Two-year repetition
- Forward and backward recurrence calculations
- Different timezone configurations
One particularly important scenario was:
Start date: February 29
Non-leap-year occurrence: February 28
Current date: March 1
February 28 occurrence already created
Expected result: no additional occurrence
That test protects the user-visible behavior rather than only checking an internal date transformation.
It asks the question that matters:
> Given the task’s history and today’s date, should another task be created?
The answer must be no.
Timezones are a separate source of risk
Leap years were central to this bug, but timezone testing still mattered.
A calendar date is not always equivalent to a fixed period from another calendar date. Around daylight-saving transitions, a local day may contain 23 or 25 hours.
That means code like this can also be dangerous for calendar scheduling:
const nextDay = new Date(
current.getTime() + 24 * 60 * 60 * 1000,
);
It adds exactly 24 elapsed hours. It does not necessarily mean “the same local time tomorrow.”
Testing the recurrence logic under more than one timezone helped confirm that the result represented the intended calendar date rather than an accidental property of one development environment.
What I learned
1. Recurrence rules are domain logic
“Every year” is not a low-level timestamp operation. It is a product rule that needs defined behavior for invalid dates.
2. Invalid dates should be handled intentionally
JavaScript’s normalization rules are predictable, but predictable does not mean correct for every domain.
3. Preserve the original anchor
Adjusted occurrences should not silently replace the original recurrence rule.
4. Forward and backward calculations must agree
If one function searches for the next occurrence while another searches for the newest possible due occurrence, both must implement the same calendar policy.
5. Test the dates around the boundary
For a February 29 rule, the most valuable tests are usually February 28, February 29, and March 1—not an arbitrary date in the middle of the year.
6. Test outcomes, not only transformations
Checking that February 29 becomes February 28 is useful. Checking that no duplicate task is created after that occurrence already exists is better.
A practical rule
First decide what the value represents. Use duration arithmetic for elapsed time—timeouts, performance measurements, and expiry windows. Use calendar arithmetic for human schedules—billing dates, anniversaries, weekday meetings, and recurring reminders.
Then define what should happen when the requested calendar date does not exist.
Final thoughts
This was a small open-source contribution, but it reinforced a broader engineering lesson: date bugs are often specification bugs hiding inside arithmetic.
The difficult question was not how to manipulate a JavaScript Date. It was deciding what “repeat every year” meant and ensuring every code path implemented that meaning consistently.
The proposed fix is available in Super Productivity PR #10724, created for issue #10679.
At the time of writing, the pull request is still open.
If there is one rule worth remembering, it is this:
> Use duration arithmetic for elapsed time. Use calendar arithmetic for human schedules.
13 reactions · 8 comments
Mentions
Contributors of the month October 2026 46 community contributors had 143 PRs merged in October! From "won't do" tasks, repeat end dates and multi-task dragging to a much bigger Local REST API, faster long task lists, new community plugins and translation updates, this was our biggest month yet by number of contributors. A massive thank you to everyone who invested their time in making Super Productivity better. Outstanding contributions @tiliakoos had a remarkable month with 28 PRs. Highlights include an alarm-style looping bell for reminders on desktop (#11015), New task, Today and Inbox in the macOS dock menu and Windows jump list (#11017), configurable trusted proxy ranges and daily cleanup hour for the SuperSync server (#10297, #10301), and enforcing plugins' minimum app version (#11019). Recurrence got a lot of care too: monthly repeats no longer skip short months (#10919), deleted instances are skipped in the next-occurrence tooltip (#10603), tasks copied by Duplicate Project no longer link to the original's repeat config (#11004), and recurrence date logic is now shared (#11022). The rest spans bug fixes, performance, accessibility, translations, tests and docs. @steindvart contributed 14 PRs, many of them polishing plugins and the side nav. The sync state is now one clear glyph instead of a checkmark overlay (#10430); projects and tags are indented under their section headers, archived projects appear at the bottom of the projects list, and collapsing those lists is animated (#10712, #10713, #10518). On the plugin side: a confirmation before clearing uploaded plugins, clearer naming for that action, translated Community Plugins cards, and plugin language names shown in the UI language (#10558, #10962, #10557, #10559). Short syntax now only suggests @ options the parser actually understands (#10460). @davidvornholt delivered 13 PRs with a focus on the Local REST API and performance. The API can now manage task repeat configs (#10510), correct or remove a day's tracked time (#10890), and read and update simple counters (#10891). A series of performance PRs cut the per-row cost of long task lists (#11105), skip per-second work that changes nothing while tracking or in Focus Mode (#11104), and avoid needless recomputation for due-date colors, archive checks, counter charts and Flowtime animations (#11103, #11107, #11108, #10519). Focus Mode sessions also got more robust (#10995, #11040). @Zoriot contributed 9 PRs: multi-tag filtering in the task view customizer (#11095), making "move to top/bottom" work for tasks in a section (#10747), preserving subtask due dates and undated subtasks when duplicating a task (#10302, #10741), mapping plannedAt to dueWithTime in the Local REST API (#11093), closing note editors before the desktop add-task bar opens (#10300, #10632), and listing the standalone Markdown notes and monday.com plugins in the community catalog (#11096, #11133). @GabeSilvaDev contributed 9 PRs: new repeat instances now appear where the previous one was, including in sections (#11197, #11243); issue-provider plugins can declare their own done states (#10470); the Local REST API waits for archive removal before answering a task restore and keeps reminders in sync when dueWithTime changes (#10967, #11013); settings search reopens hand-collapsed sections (#10601); the Planner shows distinct weekday labels in the app locale (#10629); task lists reject a dragged section (#10900); and missing Brazilian Portuguese strings were translated (#10543). @siemieniuk delivered 6 PRs: an undo button for unscheduling a task (#10450), a localized heatmap with local date formatting (#10329), a thorough Polish translation overhaul (#10324), HTML formatting that showed as raw tags in several translations (#10320), darkening of background images under the Liquid theme (#10466), and reopening a project from its archived project details (#10946). @H1manshu01 contributed 6 PRs: projects and tags now show up in search results (#10606), yearly repeats handle leap days (#10724), checklist items insert reliably on repeated toolbar clicks and hover controls stay clear of note text (#10566, #10605), and several Vietnamese strings were fixed (#10565, #10723). New features and everyday workflows - @anandghegde added "Finish as won't do" for tasks you decide not to do (#10708), an optional end date for repeating tasks (#10276), and kept short-syntax tokens out of auto-created issue titles (#10273). - @ac9492 added dragging selected tasks together between sections and projects (#10505), relative-date colors for scheduled dates and Today icons (#10494), and an opt-in desktop app-icon badge for due tasks (#10921). - @MannXo made the repeat dialog show the next instance and the subtasks it will inherit (#10279) and deferred remote issue deletion until the undo window has passed (#10192). - @nilay1221 added nth-weekday short syntax such as @2monday (#10308). - @ParthibanRajasekaran brought deadlines into the Schedule view (#10310) and let task titles wrap in portrait mode on iOS (#10173). - @symonbaikov added a done/total badge on collapsed subtask toggles (#7115), precomputed ordered task groups in the work view (#8437), and routed plugin PATCH requests through native HTTP on Android (#8590). - @dschodits made deadlines discoverable in the Add Task bar with a hint and a button (#11146). - @artemc added a separate volume setting for Focus Mode sounds (#10568). - @MaiwulanjiangMaiming reworked the side-nav collapse/expand animation and repaired macOS window-drag dead zones (#10303, #10176). - @Zhong-fan kept priorities on recurring tasks and let configured keyboard navigation continue across task groups (#10821, #10822). - @akshit-codes made projects hidden from the side menu selectable in the add-task bar's project picker (#11092). Local REST API, integrations and calendars - @SaintChris added notes routes and POST /tasks/:id/time for logging time on a given day to the Local REST API (#10827, #10826). - @costajohnt let the local create_task assistant tool take a due date, time and repeat, and fixed moving existing tasks picked in the add-task bar in project contexts (#10899, #10898). - @sespiros included plugin calendar providers in the Schedule filter and event colors, and made paginated tab headers scroll with wheel and trackpad gestures (#7813, #11132). - @michaelkcarlson added per-calendar colors to Planner calendar events (#10965). - @SulimanAbdulrazzaq listed multi-day all-day events on every date they cover in the Planner (#10299). - @Zombiehamser let plugins list their synced data keys and exposed the existing sync request to typed iframe clients (#11044, #11053). Mobile, desktop and self-hosting - @BigWebstas added the currently tracked task to the Android home-screen widget, kept bottom-anchored overlays attached to their trigger on Android, and exposed getAllSimpleCounters to iframe plugins (#10327, #10205, #10321). - @d0g2342 fixed the iOS "Could not import shared content" error by carrying the App Group entitlement into the exported IPA (#10893). - @artemis-mike added arm64 images for the SuperSync server, so it can run on a Raspberry Pi (#10218). Reliability and correctness - @jashkarangiya fixed date-only keys being read as the previous day west of UTC in the habit and focus dialogs, and made plugin counter reads and writes use the logical day (#10419, #11037). - @BhavayGoyal keyed simple-counter streaks on the logical day and flagged empty translation values (#11195, #11196). - @Lay-quq stopped the Planner from double-counting subtasks planned on other days (#10923). - @FadhilR12 kept disabled features from being reachable via direct URL (#10585). - @Hrushikesh-ramilla made Schedule navigation start from the displayed logical month (#10536). Interface fixes and polish - @stepanstipl showed the project title in single-select triggers and stopped untouched checkboxes from rendering as indeterminate (#10647, #10763). - @mvanhorn gave see-through task hover controls an opaque underlay (#10564). - @leafybees made the shortcut open the task view customizer's header filter (#11205). - @edu-zamora gave the Zen Focus Mode notes panel an opaque background (#10761). - @akshar27 allowed a leading space before the URL in Markdown =WxH image sizing (#10154). - @Ibitier and @irontaek cleaned up code in the tag editor and removed write-only maps (#10133, #10607). - @zenoprax clarified the docs on editing date and time fields and on Docker (#10538). Community plugins and translations - @AshrafByte added Timesheet to the community catalog for weekly tracked-time overviews with targets and CSV export (#11224). - @SileboxUnderfined added SuperGile, a YouGile integration (#10996). - @owarimono added Auto Tag Manager, which tags new tasks based on title keywords (#10705). - @SilverGreen93 updated the Romanian translation (#9938). - @Cyber-Syntax updated the Turkish translation (#10769). - @Mingqi-111 localized the sound option labels in settings (#10809). Thank you to every contributor, and to everyone reporting bugs, testing fixes, and helping other users. All of that work matters, and I really appreciate it. See you next month! <3
Stadium Mode - a roaring crowd and a stadium announcer for finishing your everyday tasks I maintain Super Productivity, an open source task manager, and I've started a small series of slightly ridiculous plugins for it called Ridonculous. This is Stadium Mode. It turns your task list into a football match: - Start a task: whistle, and the announcer calls "Ladies and gentlemen... now taking the field... your task!" - Finish one: the crowd erupts, "GOAL!", confetti - Finish three within 90 seconds: "HAT TRICK!" - Reschedule something: the whole stadium goes "ooooh" - Delete a task: red card - Finish Day: final whistle and the day's score The crowd, whistle and organ are all synthesized with the Web Audio API, so the plugin ships no audio files. The announcer is your system voice, or, if you opt in, Kokoro, a small neural voice model that runs on your device (about 110 MB downloaded once, task titles never leave your machine). The lines themselves are scripted, not generated. It cheers me up more than it should :D Would this motivate you, or would you mute it immediately? Video: youtube.com Code: super-productivity/ridonculous
I made my to-do list cheer like a football stadium I made Stadium Mode for Super Productivity: stadium sounds, AI sports commentary, and a GOAL celebration for finishing your everyday tasks. Another questionable idea in my Ridonculous plugin series. Well, it cheers me up more than it should :D Would this motivate you, or would you mute it immediately? Download it yourself: super-productivity/ridonculous
Plan tasks alongside your calendar and track the time you spend on them, so you can compare your daily plan with the work you actually get done. super-productivity/super-productivity t.co
2. 할 일을 적어두면 하루가 시간표처럼 펼쳐져요. 가입할 필요가 없고 윈도우, 맥, 휴대폰, 웹에서 써요. super-productivity/super-productivity
@denizdoingstuff Linear is just HIM tbh, i love how optimized and efficient it is, it's clear that it was made for product planning and by people who are obsessed with quality. try this: super-productivity/super-productivity i've been using it alongside Linear past week. Linear is for bigger projects and the bigger picture, while super productivity is for daily and weekly atomic tasks. and i use Obsidian, the goat, for everything else
Super Productivity 19.3.0: restore deleted tasks, "won't do", p1/p2/p3 priorities, and a lot of polish Hi everyone! Super Productivity 19.3.0 is out. Here's what changed: Tasks and focus - Restore deleted tasks from Recently deleted, or finish a task as "won't do" - Set priorities while typing with p1/p2/p3. @ dates now work in your UI language and date order, and nth-weekday syntax is supported - Collapsed subtasks show a done/total count, and archived projects are listed at the bottom of the sidebar - Start focus mode with one click and adjust the focus sound volume - The productivity and sustainability scores are gone, and Upcoming is now an overview in the Recurring panel Scheduling and reminders - Deadlines show up in Schedule, and the Planner shows each calendar's color - Repeats can have an end date, with clearer options for completion-based repeats, falling behind and pausing - Reminders can now be set 1 day, 3 days or 1 week ahead - Fixed monthly repeats skipping short months and yearly repeats on leap days Integrations - Optional CalDAV task creation and deletion when you add or delete tasks - Connect AI assistants through an opt-in local MCP endpoint, or use SuperSync's hosted task capture (including ChatGPT) - Install and update community plugins from inside the app - The local REST API now covers notes, counters and time logging Mobile and desktop - The Android widget shows the task you're tracking, and launcher shortcuts open New task, Today and Inbox - Long-press for sidebar menus or to choose the second bottom-nav slot, plus better touch targets and haptics - Opt-in due-task badge on desktop Reliability - Many sync conflict fixes, no more WebDAV retry loops, and a confirmation before overwriting remote data that can't be decrypted - Faster task-list rendering and swiping, better keyboard focus visibility and text contrast Thanks to the 31 people who contributed to this release, including 10 first-time contributors! Full release notes and downloads: github.com/super-productivity/super-productivity/… Feedback and bug reports are very welcome, here or on GitHub.
待办很多,真正做事的时间却不够?✅ Super Productivity 把任务、计时与时间分块放在一起。规划学习和开发工作更清楚。📅 super-productivity/super-productivity #Productivity #Tasks #浇朋友 #蓝朋友 #互关 #fo
Super Productivity v19.2: self-hosted task management, live Markdown notes, and bulk actions I maintain Super Productivity, an MIT-licensed task manager and time tracker. It works offline, and you can self-host the web app and an optional sync backend. My last update here was v18.16 in July. v19.2 is out now, so here's a catch-up on the changes since then. For people running their own server v19.2 adds ARM64 SuperSync server images alongside AMD64, versioned release images, configurable trusted proxy ranges, and fixes for fresh deployments. SuperSync is the optional sync backend, separate from hosting the web app. SuperSync is still beta, and self-hosting support is limited. The documented Compose stack includes PostgreSQL and Caddy and needs SMTP for account emails. You don't need a server or an account to use the app locally. What changed in the app - Notes without switching modes: live Markdown editing arrived in v19.0.1. - Less task-by-task housekeeping: multi-select and bulk actions arrived with v19, followed by keyboard navigation in the planner and boards. In v19.2, you can drag selected tasks between sections and projects, and multi-select in the mobile planner. - Integrations: v19.1 added two-way Trello card sync and support for multiple Google Calendar accounts. - Priorities and search: v19.2 adds numeric task priorities with icon presets, plus project and tag search. - Recovery and reliability: earlier releases added local recovery points and full worklog export. v19.2 fixes sync cases that could lose tracked time or overwrite concurrent task edits, plus incorrect success reporting for failed desktop backups. Two upgrade changes to know about: v19 removed User Profiles; v19.2 moved Redmine and Nextcloud Deck integrations into plugins. Project, web app and downloads SuperSync setup and limitations | v19.2 release notes | Changes since v18.16 Disclosure: AI helped draft and fact-check this update against the release notes and deployment docs. If you've tried self-hosting Super Productivity, what would make setup or day-to-day use easier?
Calendar Math vs. Duration Math: Lessons From an Open-Source Bug “Repeat every year” sounds like a simple instruction—until the original date is February 29. While contributing to Super Productivity, I worked on a recurrence bug involving a task that started on a leap day. In a non-leap year, the application could create an extra overdue task before the next occurrence was due. The bug demonstrated an important distinction: > Duration arithmetic measures elapsed time. Calendar arithmetic models human schedules. Those concepts overlap on ordinary dates, but they can produce different answers around leap years, month boundaries, daylight-saving transitions, and multi-year recurrence rules. The bug The reported task repeated yearly from February 29. Because February 29 does not exist every year, the application needed a policy for non-leap years. In this case, the intended behavior was: February 29, 2024 February 28, 2025 February 28, 2026 February 28, 2027 February 29, 2028 In the failing path, setting the day to 29 on a February 2025 date overflowed to March 1. The calculation then stepped back one year while preserving March 1, making March 1, 2024 appear later than the already-created February 29, 2024 occurrence. That disagreement caused the application to materialize another overdue 2024 task. The visible problem was a duplicate task, but the underlying problem was more interesting: different parts of the scheduling logic disagreed about which calendar occurrence existed. JavaScript normalizes out-of-range date components JavaScript’s Date setters normalize out-of-range components instead of rejecting them. For example: const date = new Date(2025, 1, 1); // February 1, 2025 date.setDate(29); console.log(date); // March 1, 2025 There is no February 29 in 2025, so JavaScript carries the extra day into March. This behavior is valid and sometimes useful. But it is not necessarily the recurrence policy your product intends. For a yearly task, several behaviors could be reasonable: 1. Move the occurrence to February 28. 2. Move it to March 1. 3. Skip non-leap years. 4. Ask the user to select a policy. The important part is not choosing one universally correct answer. The important part is making the rule explicit and applying it consistently. Super Productivity’s expected rule was to clamp the date to the last valid day of the month: February 28. Calendar math and duration math answer different questions Consider the phrase “one year later.” It could mean an elapsed duration: const ONE_YEAR_IN_MS = 365 * 24 * 60 * 60 * 1000; const later = new Date(original.getTime() + ONE_YEAR_IN_MS); But that assumes every year represents the same duration. Leap years immediately break that assumption. It could instead mean a calendar operation: Keep the original month and day. Move to the target calendar year. If the day does not exist, apply the recurrence policy. These are different models. Duration math is appropriate for questions such as: - Has a 30-minute timeout expired? - How long did this request take? - Has a 24-hour retention period passed? Calendar math is more appropriate for: - Repeat this task every year. - Run payroll on the last day of each month. - Renew this subscription every three months. - Schedule an event every Monday. - Trigger an anniversary reminder. A recurring task expresses human calendar intent. It is not merely a number of milliseconds after another timestamp. Separate the recurrence interval from the occurrence date The fix became clearer when I separated the problem into two questions. 1. Is this an eligible recurrence year? Suppose the task started in 2024 and repeats every two years. The eligible years should remain anchored to the original year: 2024, 2026, 2028, 2030... Conceptually: const yearsSinceStart = candidateYear - startYear; const isEligibleYear = yearsSinceStart >= 0 && yearsSinceStart % repeatEvery === 0; This uses calendar-year positions rather than asking whether a fixed duration has elapsed. 2. What is the actual occurrence in that year? Once the year is eligible, the application needs to construct a valid date. A simplified model looks like this: function getOccurrence(startDate, targetYear) { const month = startDate.getMonth(); const requestedDay = startDate.getDate(); const lastValidDay = getLastDayOfMonth(targetYear, month); return new Date( targetYear, month, Math.min(requestedDay, lastValidDay), ); } This is illustrative pseudocode rather than the project’s implementation. For a February 29 start date: Target year: 2025 Requested day: 29 Last valid day in February: 28 Actual occurrence: February 28, 2025 The application can then compare normalized calendar dates in the same timezone: const isDue = occurrenceDay <= todayDay; That is safer than comparing against an out-of-range component and relying on automatic normalization. In production code, occurrenceDay and todayDay should use the same calendar and timezone policy. Why multi-year repeats matter A fix that only handles yearly repetition can still introduce another bug. Consider a task that starts on February 29, 2024 and repeats every two years. The expected sequence is: February 29, 2024 February 28, 2026 February 29, 2028 If the algorithm advances from each normalized result, it may accidentally treat February 28 as the new permanent anchor. It can also drift into the wrong recurrence year if eligibility is based on fully elapsed durations rather than calendar-year intervals. The original rule therefore needs to remain the source of truth: Original month: February Original day: 29 Original year: 2024 Repeat interval: 2 calendar years Each occurrence should be projected from that rule. It should not be derived solely from the previous adjusted occurrence. This was one reason the change needed to cover both the forward and backward recurrence calculations. Fixing only the “next occurrence” path would still leave another part of the system interpreting the same rule differently. Testing the boundaries Date bugs often hide in the boundaries, so testing only an ordinary date such as June 15 would provide little confidence. The regression coverage included cases around: - February 28 in a non-leap year - February 29 in a leap year - March 1 after the adjusted occurrence - An occurrence that had already been created - Yearly repetition - Two-year repetition - Forward and backward recurrence calculations - Different timezone configurations One particularly important scenario was: Start date: February 29 Non-leap-year occurrence: February 28 Current date: March 1 February 28 occurrence already created Expected result: no additional occurrence That test protects the user-visible behavior rather than only checking an internal date transformation. It asks the question that matters: > Given the task’s history and today’s date, should another task be created? The answer must be no. Timezones are a separate source of risk Leap years were central to this bug, but timezone testing still mattered. A calendar date is not always equivalent to a fixed period from another calendar date. Around daylight-saving transitions, a local day may contain 23 or 25 hours. That means code like this can also be dangerous for calendar scheduling: const nextDay = new Date( current.getTime() + 24 * 60 * 60 * 1000, ); It adds exactly 24 elapsed hours. It does not necessarily mean “the same local time tomorrow.” Testing the recurrence logic under more than one timezone helped confirm that the result represented the intended calendar date rather than an accidental property of one development environment. What I learned 1. Recurrence rules are domain logic “Every year” is not a low-level timestamp operation. It is a product rule that needs defined behavior for invalid dates. 2. Invalid dates should be handled intentionally JavaScript’s normalization rules are predictable, but predictable does not mean correct for every domain. 3. Preserve the original anchor Adjusted occurrences should not silently replace the original recurrence rule. 4. Forward and backward calculations must agree If one function searches for the next occurrence while another searches for the newest possible due occurrence, both must implement the same calendar policy. 5. Test the dates around the boundary For a February 29 rule, the most valuable tests are usually February 28, February 29, and March 1—not an arbitrary date in the middle of the year. 6. Test outcomes, not only transformations Checking that February 29 becomes February 28 is useful. Checking that no duplicate task is created after that occurrence already exists is better. A practical rule First decide what the value represents. Use duration arithmetic for elapsed time—timeouts, performance measurements, and expiry windows. Use calendar arithmetic for human schedules—billing dates, anniversaries, weekday meetings, and recurring reminders. Then define what should happen when the requested calendar date does not exist. Final thoughts This was a small open-source contribution, but it reinforced a broader engineering lesson: date bugs are often specification bugs hiding inside arithmetic. The difficult question was not how to manipulate a JavaScript Date. It was deciding what “repeat every year” meant and ensuring every code path implemented that meaning consistently. The proposed fix is available in Super Productivity PR #10724, created for issue #10679. At the time of writing, the pull request is still open. If there is one rule worth remembering, it is this: > Use duration arithmetic for elapsed time. Use calendar arithmetic for human schedules.