Pomodoro study session planner
In 120 minutes, 25-minute focus blocks with 5-minute rests fit exactly 4 pomodoro cycles: 100 minutes of work and 20 of breaks, with nothing left over. See every block's start and end minute before you begin. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Total minutes
- 120
- Cycles
- 4
- Work minutes
- 25
- Break minutes
- 5
- Work minutes total
- 100
The pomodoro study session planner turns three numbers — how long you have, how long you want to focus, and how long you want to rest — into a complete, minute-by-minute schedule of work and break blocks. Instead of counting intervals in your head or losing track mid-session, you get the exact number of full pomodoro cycles that fit, the start and end minute of every block, and how much time is left over.
From a free afternoon to a concrete plan
The hardest part of a study session is often not the studying but the structure. You sit down with two hours and a vague intention to take breaks, and forty minutes later you are either burned out from never stopping or distracted because the breaks ate the session. A pomodoro study session planner removes that negotiation entirely.
You declare the total time you actually have — not the time you wish you had — along with a work interval and a break interval, and the planner lays out the session as an ordered list of blocks with exact start and end minutes. Four cycles of twenty-five minutes with five-minute rests fit into one hundred and twenty minutes with nothing wasted; you can see that before you begin, not discover it halfway through.
Because the plan is computed rather than improvised, it is the same every time you ask, which makes it safe to use inside scripts, study apps, and classroom tooling. The output also tells you the totals honestly: how many minutes go to work, how many go to rest, and how much of your budget cannot hold another full work block, so you can adjust the intervals instead of pretending the leftover does not exist.
How the schedule is computed
The algorithm is deliberately simple and fully deterministic. Starting at minute zero, it checks whether one more complete work interval fits inside the remaining time. If it does, that work block is appended to the schedule and the clock advances; if it does not, planning stops.
After each work block, a break is scheduled only when the full break interval also fits inside the remaining budget — a partial break that would overrun your total time is never added, because a plan that ends late is not a plan. When the break does not fit, the session ends with the last work block and the remainder is reported as unused minutes. There is one strict rule worth knowing: the work interval must be positive.
Breaks may be zero, which yields back-to-back work blocks for people who schedule rest separately.
Using it well, and where it fits
The classic pomodoro is twenty-five minutes of work and five of rest, and those are the defaults, but the planner does not enforce the doctrine. Students preparing for exams often prefer fifty minutes of focus with ten-minute breaks; younger learners do better with fifteen and three. Treat the unused minutes figure as feedback: if a one-hundred-minute session with thirty-minute intervals leaves ten minutes unused, either accept it as cooldown time or shift to twenty-five-minute intervals that tile the budget exactly.
Teams use it to generate consistent study plans across a cohort, tutors embed it in lesson notes, and productivity apps call it server-side so their schedule logic never drifts from what users saw on the free page.
What you can do with it
Plan an exam revision block
Enter the evening's available minutes and get the exact cycle count and block times, so revision ends when you planned instead of when you ran out of energy.
Tune interval lengths before committing
Try different work and break combinations in the free browser version and watch how cycles, break totals, and unused minutes change before adopting a rhythm.
FAQ
What happens if my work interval is zero or negative?
A work interval must be a positive number of minutes; without one, no schedule can exist.
Why is there time left over at the end?
Only complete work blocks are scheduled, and a break is only added when it fits entirely.
Are the classic 25/5 intervals required?
No. They are only the defaults. Any positive work length and any non-negative break length are accepted, so you can plan 50/10, 15/3, or any rhythm that suits you.
Is the result the same every time?
Yes. The computation is pure arithmetic with fixed rounding — no clocks, no randomness — so identical input always produces identical output.
Can I plan a study session with no breaks?
Yes. Set the break length to zero and the planner lines up work blocks back to back, which suits people who schedule rest separately. Only the work interval has to be longer than zero.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/life/study-break-pomodoro \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"total_minutes":120}'const res = await fetch("https://api.kit.forhosting.com/life/study-break-pomodoro", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"total_minutes": 120
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/study-break-pomodoro",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"total_minutes": 120
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/study-break-pomodoro", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"total_minutes":120}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"total_minutes":120}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/study-break-pomodoro", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"total_minutes": 120
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.study_break_pomodoro",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
It runs the same deterministic arithmetic in your browser for free and through the API for automation.
How the schedule is computed
A zero or negative work length would make the loop meaningless — infinite focus or negative focus are not study techniques — so the planner rejects it with a typed invalid_input error rather than guessing.
Using it well, and where it fits
Through the API, each request costs $0.002 and returns the same JSON structure every time: cycle count, minute totals, and the block array with start and end minutes, ready to render as a timeline or feed into a calendar.
Integration use cases
Generate schedules inside a study app
Call the API from your backend and render the returned blocks as a timeline; the deterministic arithmetic means server and client always agree.
Technical questions
What does it cost?
$0.002 per request via the API. It is also free to run in your browser on this page, with the same code and the same output.
Can I schedule work with no breaks at all?
Yes. Set break_minutes to zero and the plan becomes consecutive work blocks until the total time is filled.