ToHoot

A task list that tracks time against the day you actually had. One list on your Linux, Windows or macOS desktop and your Android phone, synced through a private repository you own.

Download for Android Download for Linux Download for Windows Download for macOS

The AppImage runs anywhere: chmod +x and go. A .deb and an .msi are on the releases page. The Linux builds are made on Ubuntu 22.04 so they run on older systems too; the Windows installer is not code-signed, so SmartScreen asks once. The macOS build runs on Apple Silicon and Intel; it is not notarized, so the first launch needs Open Anyway in System Settings, Privacy and Security.

The ToHoot desktop app: a sidebar of projects and tags on the left, today's task list in the middle with a timer running on one task, and a day timeline on the right showing tracked time beside planned calendar events. The ToHoot desktop app: a sidebar of projects and tags on the left, today's task list in the middle with a timer running on one task, and a day timeline on the right showing tracked time beside planned calendar events.
The same app on a phone: today's tasks each labelled with their project, a timer running on the first, a done section below, and the tracked total for the day with a fourteen-day strip. The same app on a phone: today's tasks each labelled with their project, a timer running on the first, a done section below, and the tracked total for the day with a fourteen-day strip.

What it is for

Four things it does, and nothing else

One list on every device.
The same tasks on the desktop and on the phone, without an account with anyone. Both devices append to one log and both replay it, so a change made offline on one lands on the other whenever it next reaches the network.
Time tracked against your real calendar.
The day view puts what you tracked next to what was already in your calendar, in the same column. Tracked time is written back to a separate calendar, so a week of work is visible where the rest of your commitments are and your real calendars are never touched.
Your data in your own private repository.
An append-only event log in a private GitHub repository you own, as plain JSON you can read with cat. There is no server in the middle and nothing to export from, because it was never anywhere else.
Ask any agent to add a task, from anywhere.
An MCP server offers fifteen tools over the same log: tasks, timers, projects and tags, by name. Claude, ChatGPT, Codex, Gemini CLI, Cursor and VS Code all speak MCP, and one press in the app adds it to each agent on your computer. A task an agent adds is one event appended to the log, indistinguishable from one you typed.

What it costs

Nothing, and there is nowhere to enter a card

Every service in the stack has a free tier that stops working when you exceed it rather than starting to bill you. There is no paid plan to be upgraded onto, because there is no hosted service: what runs is running in your accounts.

Every service ToHoot uses, its free tier, and what happens at the limit
Service What it does here Free tier At the limit
GitHub Free Holds your private data repository Unlimited private repositories 403 with Retry-After
GitHub Actions Builds the releases Unmetered on public repositories Not applicable
GitHub Releases Hosts the downloads above Unmetered bandwidth, 2 GiB a file Not applicable
Google Calendar API v3 Your calendar, read and written by the app Free, with no billing account Quota error
Cloudflare Workers Free Optional MCP endpoint for assistants on the web 100,000 requests a day on workers.dev HTTP error, never a bill
Sideloaded APK Installing it on your phone No Play Console account Not applicable

Set up

Four steps, and only the first one is required

The app walks through these as a first-run wizard you can resume or skip. Every connection does the real operation and shows it happening, line by line, and reports the actual error when one fails. This is the same sequence, so the page and the app cannot disagree.

  1. Local only

    Install it and use it. Tasks, projects, tags, timers and the day view all work with no accounts at all. If a local task tracker is what you wanted, you are done.

  2. Sync

    Press Sign in with GitHub and enter the code it shows on github.com. The app finds or creates the private data repository, names the device, and writes a commit and reads it back before saying it worked. A fine-grained token still works instead.

  3. Calendar

    Optional. Press Sign in with Google, approve the app in your browser, and your day appears beside your tasks with tracked time written to a calendar of its own. A secret calendar address in ICS format is the read-only shortcut, and the Apps Script bridge is still there for a deployment that already exists.

  4. Agents

    Optional. Press Add beside Claude Code, Codex, Gemini CLI, Cursor, VS Code, Windsurf or opencode, and the app writes itself into that agent's settings. For Claude or ChatGPT on the web and on your phone, press Sign in and deploy: the app signs in with your free Cloudflare account, uploads the endpoint, and hands you the URL to add as a connector. Skipping this changes nothing else.

The long version, with the exact clicks and what each error means.

Build from source

For anyone who will not run a binary someone else compiled

Node 22 and npm 10 or newer. The tests run on a fresh clone with no build step first.

git clone https://github.com/danieltyukov/to-hoot.git
cd to-hoot
npm ci
npm test
npm run build

That builds the web application, which is the whole app. The desktop and mobile targets are shells around it, each built separately because the Tauri and Capacitor CLIs both want a flat node_modules:

cd apps/desktop && npm install && npm run build
cd apps/mobile  && npm install && npm run apk:debug

No keystore is needed to build: debug builds sign themselves, and a release build with no signing material stays unsigned rather than failing. CONTRIBUTING has the toolchain package list and how to run each suite.