Split household chores schedule
Four chores shared by three roommates complete a full rotation in 12 weeks, and weekly loads are never more than one chore apart. List the chores and the people, pick how many weeks, and get a roster for the fridge with totals per person. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
Shared apartments run on a fragile agreement: everyone cleans, but nobody remembers whose turn it is. A rotating chore schedule replaces the argument with arithmetic. Give the tool your list of household chores and your list of roommates, and it assigns every chore to a person for each week using an offset round-robin: in week one the chores are dealt in order, and each following week every assignment shifts one roommate forward, so each task visits every person in turn. The result is a week-by-week grid plus per-person totals for chores and effort, so you can check fairness at a glance instead of negotiating it. Chores can carry an optional effort weight, so scrubbing the bathroom can count more than watering a plant.
How the rotating assignment works
The algorithm is an offset round-robin, chosen because it is transparent enough to verify by hand. Number the roommates from zero in the order you listed them, and number the chores from zero in their order. In week zero, chore c is assigned to roommate c mod n, where n is the number of roommates — the chores are simply dealt around the table.
In week one, every assignment moves one seat forward: chore c goes to roommate (c + 1) mod n. In general, week w assigns chore c to roommate (c + w) mod n. This single rule has three useful consequences.
First, within any week the per-person loads differ by at most one chore, because dealing cards around a table is as balanced as dealing can be. Third, the schedule is fully deterministic: there is no random seed, no current date, and no hidden state, so regenerating next month with the same lists continues the same pattern predictably. Chores optionally carry an effort value, a non-negative relative weight that defaults to one.
Effort never changes who gets which chore — the rotation stays pure — but the per-person totals report summed effort alongside chore counts so you can see whether one person's smaller pile is also the heavier one, and rebalance your chore list (or the efforts) before printing the roster for the fridge.
Where a chore rotation fits in real households
The classic use is the shared apartment that keeps a rotating roster on the refrigerator: list the weekly chores once, list the roommates once, regenerate the schedule whenever someone moves in or out, and let the arithmetic absorb the change instead of holding a house meeting. Student housing and co-living spaces use the same grid as a move-in document so expectations are set before the first sink full of dishes.
Couples use a two-person version to confirm that the split is genuinely even over time rather than relying on memory, which always favors the person who cooked last. Because effort weights are separate from the rotation, households can mark deep cleans, pet care, or trash day as heavier chores and check the effort totals before anyone complains — the fairness block shows the spread directly.
What you can do with it
Shared apartment weekly roster
List the chores and roommates once, then print or post the weekly grid so everyone sees their assignments rotate fairly over time.
Move-in agreement for co-living
Attach the generated schedule to a lease or house rules document so chore expectations are fixed before the first dispute.
FAQ
How are chores assigned each week?
Each week every assignment shifts one roommate forward, so chores rotate through everyone.
Is the split actually fair?
Within any week, per-person chore counts differ by at most one. Over a full cycle of lcm(chores, roommates) weeks, every chore visits every roommate equally. The totals and fairness blocks show counts and effort sums so you can verify.
What is the effort field for?
Effort is an optional non-negative weight per chore (default 1) marking heavier tasks like a deep clean. It never changes the rotation; it only feeds the per-person effort totals so you can compare loads.
What happens with no chores or no roommates?
An empty chore list has nothing to assign, and an empty roommate list has nobody to assign to. Duplicate roommate names are also rejected.
What does it cost?
The browser tool is free and runs locally.
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/chore-split-roommates \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"chores":["Dishes","Vacuum living room","Take out trash","Clean bathroom"],"roommates":["Alice","Bob","Carol"]}'const res = await fetch("https://api.kit.forhosting.com/life/chore-split-roommates", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"chores": [
"Dishes",
"Vacuum living room",
"Take out trash",
"Clean bathroom"
],
"roommates": [
"Alice",
"Bob",
"Carol"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/chore-split-roommates",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"chores": [
"Dishes",
"Vacuum living room",
"Take out trash",
"Clean bathroom"
],
"roommates": [
"Alice",
"Bob",
"Carol"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/chore-split-roommates", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"chores":["Dishes","Vacuum living room","Take out trash","Clean bathroom"],"roommates":["Alice","Bob","Carol"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"chores":["Dishes","Vacuum living room","Take out trash","Clean bathroom"],"roommates":["Alice","Bob","Carol"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/chore-split-roommates", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"chores": [
"Dishes",
"Vacuum living room",
"Take out trash",
"Clean bathroom"
],
"roommates": [
"Alice",
"Bob",
"Carol"
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.chore_split_roommates",
"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.
Limits
max_chores | 200 |
max_roommates | 50 |
max_weeks | 52 |
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
Everything is deterministic — no randomness, no dates, no accounts — so the same lists always produce the same schedule, in the free browser tool and in the paid API alike.
How the rotating assignment works
Second, over a full cycle every chore lands on every roommate exactly the same number of times, so nobody is stuck with the bathroom forever; the cycle length is the least common multiple of the chore count and the roommate count, which the response reports as cycle_weeks.
What you send and what you get back
Send two required fields and one optional field. The field roommates is a non-empty array of names, again as plain strings or objects with a name field; duplicate names are rejected because assignments would become ambiguous. The optional field weeks is an integer from 1 to 52, defaulting to 4 so a fresh request already shows the rotation in motion. The field chores is a non-empty array where each entry is either a plain string like "Dishes" or an object with a non-empty name and an optional non-negative finite effort; a JSON string of that array is also accepted. Missing fields, empty arrays, blank names, duplicate roommates, invalid efforts, and out-of-range week counts all fail with invalid_input and are not charged. On success the response returns chore_count, roommate_count, weeks, and cycle_weeks, the cleaned chores list with index, name, and effort, the cleaned roommates list, and the schedule itself: an array of weeks, each with an assignments array of chore, effort, and roommate triples. A totals array gives each roommate's chore_count and effort_total across the whole horizon, and a fairness block summarizes the minimum and maximum counts and effort so imbalances are visible without scanning the grid. The method string rotating_offset_round_robin and the formula string restate the assignment rule so the contract is self-documenting. Validation failures do not consume balance; successful API calls cost the published base of $0.002 per item.
Where a chore rotation fits in real households
Automation is the other half: a home bot can call the API on a schedule, post the current week's assignments into a group chat, and never drift from the browser tool because both run the identical pure function. This capability deliberately does not handle money — splitting rent, utilities, or a restaurant bill is the job of the weighted expense splitter — and it does not track completion; it answers only who does what this week. The SEO slug targets searches for splitting household chores into a schedule among roommates, an intent distinct from expense splitting, cleaning checklists, or calendar apps, and the pricing is the published base of $0.002 per successful item.
Integration use cases
Household chat bot
Call the API weekly from a script or bot and push the current week's assignments into a group chat, identical to the free browser tool.