Blog

What fits in 30 minutes? Estimating tasks honestly

Published · Patrick Lehmann

The train is delayed and the platform display says 30 minutes. You have your phone and a list of 40 open tasks: renew the parking permit, reply to the landlord, book the bike service, read the contract draft. Which one can you actually finish before the train comes? Usually you guess, start the wrong one and leave it half done. Or you scroll through email, because that always fits.

“What fits in 30 minutes?” is a simple question, yet a normal to-do list cannot answer it. It is missing one piece of information: roughly how long each task takes.

Why an estimate beats a due time

Most lists know a date and maybe a time. That helps with appointments, but hardly with short gaps. If you give every task a fixed slot in the calendar, you plan the day full and then move everything again at the first phone call.

An estimate is lighter. It does not say when you will do something, only how much time it needs. “Reply to the landlord, about 15 minutes” fits any gap of that size, whether it opens at 10 in the morning or at 4 in the afternoon. That turns a long list into a short choice: everything that fits the time you have right now.

Estimating honestly, without the overhead

An estimate does not have to be precise. It only has to get the order of magnitude right. Three rules are enough:

  • Round up. Small tasks almost always take longer than you think: finding the document, the login, the follow-up question. “Five minutes” is better written as 15.
  • Think in steps. 15 minutes, 30 minutes, an hour, more. Finer values cost time and add little.
  • Split what is bigger. Nobody starts “Tax return, 4 hours” in a short gap. “Collect the health insurance receipts, 30 minutes” gets done.

After a week or two you notice where you are regularly off, and your estimates improve on their own.

Batch the small ones

Most lists hold plenty of 10 to 15 minute tasks: confirm an appointment, pay a bill, send a short answer. On their own they get lost; together they fill a gap nicely. With estimates you can pull them out on purpose and tick them off one after the other, instead of jumping between big and small work.

The total shows what your day needs

The second question is the reverse: does what you planned for today fit into the day at all? If every task has an estimate, the total answers it at a glance. Seven hours on today’s list and three hours without meetings means you know in the morning what has to wait, not in the evening.

The same goes for the week or a filter: how much is still open in this project, how much in everything due this week? Completed tasks must not count, or the total gets wrong with every tick.

How it works in tasks

In tasks every task has an optional estimate, from one minute to 24 hours.

  • When you capture: add ~30m, ~1h or ~1h30 to the line, for example Reply to the landlord $home tomorrow ~15m. Quick add recognises the estimate just like the date and the workspace.
  • In the task: pick a preset from 15 minutes to 4 hours or type any other duration. The row then shows the estimate in short, such as ~45m.
  • Totals: Today and Upcoming add up the estimates of the open tasks you are looking at. The List shows the open total of everything your filter matches. Completed and cancelled tasks never count.
  • Filter and sort: under Estimate, the List filters by ranges such as “Up to 15m”, “Up to 30m” or “Over 1h”, or by tasks with no estimate. Under Order you find “Shortest first” and “Longest first”.

In the terminal it works with tsk: tsk ls --estimate-max 30m lists everything up to 30 minutes, --sort estimate-asc puts the shortest first, and tsk edit 1234 --estimate 1h30 sets an estimate later.

With an AI assistant connected over MCP you can simply ask: “I have 45 minutes before the call, pick what fits.” The assistant reads today’s tasks with their estimates, filters to 45 minutes or less and suggests an order. Where an estimate is missing, it can set one when you ask it to.

What it is not

The estimate is a number of minutes, nothing more. There are no story points, no sprints and no capacity per person or team, and subtasks are not rolled up into their parent. That is on purpose: if all you want to know is what fits into half an hour, you do not need a planning process.

Conclusion

A due time says when. An estimate says how long, and that is exactly what is missing when 30 minutes suddenly open up. Estimate roughly, round up, split the big things, and let the list add it up for you. The details of how it works in tasks are in the FAQ.

Frequently asked questions

Can I add time estimates to tasks?

Yes. Give a task an estimate and tasks does the adding up. In quick add, put ~30m, ~1h or ~1h30 on the line, for example Pay the invoice $family ~15m. In the task itself, pick a preset from 15 minutes to 4 hours or any other duration from one minute to 24 hours. The row then shows the estimate in short, such as ~15m.

Today and Upcoming show the total of the open tasks on screen. The List filters by estimate (up to 15 minutes, up to 30 minutes, up to 1 hour, over 1 hour, or no estimate), sorts shortest or longest first, and shows the open total of everything the filter matches, not just the current page. Completed and cancelled tasks never count.

The same works in the terminal (tsk edit 1234 --estimate 1h30, tsk ls --estimate-max 30m) and over MCP. There are no story points, sprints or capacity per person or team, on purpose: an estimate only says roughly how long a task takes. To fill a free half hour with it, read What fits in 30 minutes?.

How does `tsk` work in the terminal?

tsk is a single program for Linux, macOS and Windows, with no dependencies. Download it, check the checksum and sign in with tsk login and an access token. After that, tsk add 'Send quote $client-a tomorrow !p1' adds a task in one line.

ls, show, edit, mv, done, reopen, rm and restore list, edit, move and complete tasks. tsk add -p '#34' --item 'A' --item 'B' adds several subtasks under #34, tsk mv re-parents them. Every command gives machine-readable output with --json for scripts.

Try it now