While the list is empty, completion is not calculated: there is nothing to divide by zero, so the row shows a dash. Filters, search, and order do not affect the counts—they always cover the entire open list.
/en/tool/todo/ works stored by the browser
Multiple lists, due dates and priorities, subtasks and recurring tasks, drag and drop with a mouse or finger, browser reminders, and undo delete. Everything is stored on your device: no task is sent to a server. Back up your data as a file, or move it to your phone using a link you create yourself.
At the top are the list tabs and the new-task field. The full-width list is below: the checkbox on the left marks a task as done, and clicking its text lets you edit it; the “⋯” button opens the due date, priority, repeat, subtask, and move-to-another-list options. Below the list are counters, file export, and link sharing.
Type a task in the field and press Enter. If you selected a due date, time, priority, or repeat beforehand, it will be added to the task along with the text, so you do not need to open the row a second time.
Clicking the task text (or pressing Enter when it has focus) turns the row into a field. Enter saves, Esc cancels, and clicking outside also saves.
The "⋯" button in a row reveals the due date, time, priority, repeat, subtask field, and the option to move the task to another list. Subtasks have one level only: a subtask cannot have its own subtasks.
Change the order by dragging the grip on the left—using a mouse or a finger works the same way. With a keyboard or screen reader, use the "up" and "down" buttons for the same rearrangements. The order is stored in the task itself, so it survives filters and reloads.
You can have up to twelve lists. The tabs above the input field switch between them; the adjacent buttons create, rename, and delete lists. Each list is counted separately.
After you delete something, a "Restore" bar appears below the list for ten seconds. It also works after "remove completed," "clear list tasks," and deleting the entire list.
"Download all lists (JSON)" creates a backup: the same file can be loaded using the upload control next to it. Save it before clearing browser data, or the lists will disappear without a trace.
"Share link" packs the open list into the address itself. Send the link to your phone, and it will offer to copy the list there. The server is not involved and cannot see the link's contents.
Completion = Completed ÷ Total × 100%
While the list is empty, completion is not calculated: there is nothing to divide by zero, so the row shows a dash. Filters, search, and order do not affect the counts—they always cover the entire open list.
The input data is the same as the default field values: you can calculate it mentally and confirm that the tool is telling the truth.
Total: 5.
Completed: 2.
Remaining: 5 − 2 = 3.
Overdue: 1—yesterday's due date and no completion mark.
Completion: 2 ÷ 5 = 0.4, or 40%.
The large display shows "3 tasks," 40% completion, and 1 overdue. The overdue row has a red due-date label. Switch the order to "by due date"—it will move to the "Overdue" group first, while completed tasks gather at the bottom under the "Done" heading. The counts do not change.
In your browser's localStorage, under the vi-todo-v2 key. This storage is on your device and tied to one browser and one domain. Lists are never sent to the server: the tool itself does not access the network. When you open the page, it loads its own markup, styles, scripts, and fonts once, all from this same domain. After that, there are no more requests: open the "Network" tab in developer tools and add a task—no new entry will appear. File exports, links, and printing also happen in the browser and are not sent anywhere.
No. The old entry was stored under the vi-todo-v1 key as one flat list. The first time you open the new version, it moves in full to the "My tasks" list, including completion marks, and removes the old key only after the write succeeds. The row order stays the same.
Yes. Click the text to turn the row into a field. Enter saves, Esc cancels the edit and restores the previous text, and clicking outside the field saves. You can also reach it with the keyboard using Tab: the task text is a button, and pressing Enter on it opens the same field.
Yes, but you have to transfer it manually, and it takes one click. The "Share link" button packs the open list directly into the address: the text is compressed and encoded, and everything goes after the hash. Such a link is not sent anywhere—the browser does not transmit anything after the hash to the server. Open it on your phone, confirm, and the list will be copied there. The two lists then live separately: this is a transfer, not synchronization. For very long lists, the link becomes unwieldy, and messaging apps sometimes truncate it—in that case, a JSON file is more reliable.
Through browser notifications. Click "Enable reminders," grant permission, and a task with a due date will remind you when the date arrives. A task without a specified time sends its reminder at 9:00 AM. Important: the notification arrives only while this tab is open. There is no background service here, so a closed browser will show nothing. If a reminder must work reliably, set it where your alarm lives—in your phone.
A "Restore" bar appears below the list and stays for ten seconds. It restores the entire state, so it can undo deleting one task, "remove completed," "clear list tasks," or deleting a list with all its contents. After ten seconds, the bar disappears and there is nothing left to restore—for this case, use a JSON file.
Clearing site data in the browser settings, enabling "delete cookies and data on exit," or using incognito mode, where lists disappear with the window. Clicking "Download all lists (JSON)" once a week is cheaper than trying to remember what was there later.
Set a repeat in the row through "⋯"; it works only with a due date. When you mark such a task complete, it stays in the list as completed, and a copy with the next due date appears beside it—one day, week, or month later. Months are calculated by calendar date: January 31 plus one month is February 28, not March 3.
Up to twelve lists, with up to 500 rows of 200 characters each; subtasks count the same as tasks. The limit includes a margin: localStorage has a capacity limit that varies by browser, and a task list should not be pushed up against it. If you try to add the 501st row, the tool will tell you and add nothing.