Skip to main content
Glama

Riah To-Do

Today's list, by the Windows clock. Click the tray icon and it opens. Click the box to tick something off, click the words to fix them, click anywhere else and it's gone. Drag it where you want it. Nothing to leave open, no window to hunt for.

The list is one JSON file. The note reads and writes it directly, so nothing else has to be running — no server, no background service, no account.

Download and install

  1. Download it — either the latest ZIP from releases, or the green Code → Download ZIP button at the top of this page.

  2. Extract it somewhere you'll keep it — Documents\Riah To-Do is fine.

  3. Double-click Start Riah To-Do.bat.

That's it. An icon appears by the clock; click it.

Windows only. The note is a small Windows tray program written in PowerShell 5.1, which ships with Windows — there is nothing to install and it does not run on macOS or Linux.

Node.js 18+ is optional. The note itself never needs it. Node is only required for the board page and the AI tools; if it's missing, the board tells you so instead of failing quietly.

Nothing leaves your machine. No account, no sync, no telemetry. Your list is a JSON file in your own %APPDATA%.

Related MCP server: ticktick-cli

Start it

Double-click Start Riah To-Do.bat. That's the whole install.

  • Stop Riah To-Do.bat — closes the note and the board.

  • Restart Riah To-Do.bat — after changing the tray script.

  • Open The Board.bat — the full page, for when a note isn't enough.

To have it there every morning, put a shortcut to Start Riah To-Do.bat in shell:startup.

Needs Windows and PowerShell 5.1, which ships with Windows. Node 18+ is only for the board page and the AI tools — the note itself needs neither.

Using it

You do

It does

Click the tray icon

The note opens

Click the box

Ticks it off — or un-ticks it

Click the words

Edits them, right there. Enter saves, Esc cancels

Right-click a row

The same thing — straight into editing

Shift + right-click a task

Moves it to Tomorrow, then Later, then back to Today

Drag a row up or down

Reorders it among its own siblings — steps sort within their task

Scroll wheel

Scrolls the list when there is more of it than note

Drag the top or bottom edge

Sets the height. From then on it keeps it

Hover a row, click +

Starts a subtask under it — including under a subtask

Type at the bottom, Enter

Adds an item

Hover a row, click the x

Removes it

Drag the note

Moves it. Drag an edge or corner to resize

Click anywhere else

Closes it (Esc and the x too)

Right-click the tray icon

The list, the board, what you've finished, settings, file the finished ones, quit

Hovering the icon does nothing. It is click-to-open on purpose.

The note remembers where you put it and how big you made it. The first time, it opens in the top-right corner of whichever screen holds the tray icon.

The icon is the status: one bar per item, green once ticked, and a single green check when the list is clear.

Subtasks, and sub-subtasks

A task can hold steps, threaded under it like replies — and those steps can hold their own. Hover any row, click the +, type. Six levels deep, which is far past where most lists ever go; the note narrows each step in as it descends, and you can widen the window when a thread gets long.

Ticking anything ticks its whole thread beneath it. Ticking the last open item finishes the one above, all the way up. Reopening something deep reopens the whole line above it. A task is never filed while any work under it is still open, and deleting a task takes its entire thread with it.

A hundred tasks, a hundred children each, 120 characters a line. Those numbers are backstops against a runaway paste, not advice — put as much on today as you actually want to.

How big it gets

Left alone, the note grows as you add to it, so a short list is a short note.

Drag its top or bottom edge and that becomes the height: it stops growing and the list scrolls inside it instead, with a slim bar on the right. That way a hundred tasks can live in a note the size of a postcard. Drag an edge again any time to change your mind.

Today, Tomorrow, Later

Not everything worth remembering is worth doing now. A task belongs to one of three groups, and the note shows them in order with a heading each:

  • Today — the default. Nothing else appears until you use another group.

  • Tomorrow

  • Later — for the thing you must not forget but should not start.

The count at the top only ever counts today, so parking something for later makes the number go down, not up. That is the point of parking it.

On the note: Shift + right-click a task moves it to the next group. On the board: the small chip on each task (TODAY / TOMORROW / LATER) cycles it. A task takes its whole thread with it — a set of steps is never split across two days.

Filing, and the trail it leaves

Ticked items leave the list two hours later — by default. They aren't deleted: they go into today-filed.json beside the list. The note is for what's left, not a monument to what's done. Unfinished items carry over to tomorrow.

Right-click the tray icon → Settings to change that:

  • File ticked items after — straight away, 15 or 30 minutes, 1 / 2 / 4 / 8 / 12 hours, a day, 3 days, a week, or never (clear them yourself from the tray menu).

  • Also write them into a vault — point it at an Obsidian vault, or any folder. Each filing appends to one dated markdown file, with steps indented under their task:

    # Done - 2026-07-28
    
    - [x] 09:05 Ship the launch
      - [x] 09:06 Write the email

    Leave it blank and no trail is written. The JSON archive happens either way.

Seeing what you finished

Right-click the tray icon → What I've finished, or scroll to Finished on the board. It shows the last two weeks of ticked-off work, newest day first, with the time each thing was done and subtasks under their task. Nothing is deleted — this is the same today-filed.json the filing writes to.

Accessibility

The board is the accessible surface. Use it if the note doesn't work for you. Everything the note does, the board does: Open The Board.bat, or http://127.0.0.1:8779.

On the board: every control is reachable by keyboard and visible on focus, not just on hover. Alt+Up / Alt+Down reorders a task without dragging. Errors and saves are announced. Targets are at least 26px and text meets WCAG AA contrast in both themes.

The tray note is a deliberately small, hand-drawn window — the rows are painted, not real controls, so a screen reader cannot see them and Tab does not move between them. That is a real limit, not an oversight: it buys the note its size and speed. Keyboard inside the note covers adding (type, Enter) and closing (Esc). Anything more, use the board.

Where the list lives

%APPDATA%\Riah To-Do\today.json          the list
%APPDATA%\Riah To-Do\today-filed.json    what has been ticked off
%APPDATA%\Riah To-Do\settings.json       filing window and vault path

Point somewhere else with RIAH_TODO_FILE or RIAH_TODO_DIR — a synced folder works fine.

Backing up, and getting your list back

The list is one small JSON file. Copy it anywhere; that's a complete backup.

If the file ever gets damaged — a machine dies mid-write, a sync tool mangles it — Riah To-Do refuses to touch it. The note shows "list file unreadable", the board shows the same with the path, and every change is rejected until it's sorted. It will not show you a convincing empty list and let you type over the day you lost.

To recover: open %APPDATA%\Riah To-Do, fix or rename today.json, and click the icon again. Anything already filed is still in today-filed.json.

Removed something by mistake? The board offers Undo right after a removal, and it restores the task, its subtasks and their order.

Every write is temp-file-then-rename, so a reader always gets a whole list, never half of one. Anything else watching the file picks up changes within a couple of seconds.

The board

Open The Board.bat, or npm start then http://127.0.0.1:8779. The same list with more room: drag to reorder, click a label to rename, + for a subtask, light/dark toggle, and the settings above. Optional — the note never needs it.

Letting an AI set your list

bin/todo-mcp-server.mjs is an MCP server with five tools: get_priorities, replace_priorities, add_priority, set_priority_completed, remove_priority. Point any MCP client at it:

node bin/todo-mcp-server.mjs

It writes the same file, so "make today about the launch" lands on the note a second later. Run npm install first — the tools are the only part with dependencies.

Checking it still works

npm test
npm run smoke:note

npm test covers the list rules: carry-over, the filing window, threading, cascading ticks, duplicate wording, the caps, torn files, the vault trail.

smoke:note starts the real tray twice. The first pass drives an add, a tick, two subtasks and a drag through the same code a click calls, then reads the file back to prove the PowerShell and Node halves agree on the format. The second pass turns the filing window down to nothing and checks the vault trail actually appears. It also saves a picture of the note, so the look can be checked without anyone driving the mouse.

Files

lib/store.mjs        the list: rules, atomic writes, the sweep. Owner of the format.
tray/…tray.ps1       the note by the clock (PowerShell 5.1, ASCII-only)
server.mjs           the board's local server
index.html           the board
bin/…mcp-server.mjs  the tools an AI uses
test/                the rules suite, and the real-tray smoke
scratch/tray.log     what the note did, and when. Read this first if it misbehaves.

Fitting it into something else

Anything that can read and write JSON can join in — the file is the API. Riah Code, the desktop app this was carved out of, keeps its own priorities panel and simply reads and writes the same file, which is why the two never disagree.

Something wrong?

Open an issue: https://github.com/RiahStudio/riah-todo/issues. The most useful thing you can attach is scratch/tray.log from the app folder — it records what the note did and when, including anything it refused to do and why.

MIT licensed. The fonts in assets/fonts/ are SIL OFL; their licences ship beside them.

A
license - permissive license
-
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • MCP server exposing the Backtest360 engine API as tools for AI agents.

  • MCP server for generating rough-draft project plans from natural-language prompts.

  • MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/RiahStudio/riah-todo'

If you have feedback or need assistance with the MCP directory API, please join our Discord server