Create a running plan Due can install.

Paste Due’s prompt into ChatGPT, Claude, or any other AI model. If you already have a plan, the assistant converts it without redesigning it. If you need a plan, it asks about the week you run now before it writes one.

Download as text

Already have a plan?

Convert what you trust.

Attach or paste the plan from your coach, book, spreadsheet, PDF, screenshot, or notes. The assistant preserves the plan and converts its weeks, workouts, paces, and mileage into one portable file.

Need a plan?

Build from the week you run.

The assistant asks about your normal week, recent mileage, longest run, goal, available days, and other details that will help construct a training plan.

From conversation to a complete block.

  1. 1
    Copy the prompt below.

    Open your AI assistant, then paste and send the prompt. Your assistant will guide you through the process.

  2. 2
    Design a new plan or adapt an existing one.

    Paste your existing training plan when prompted, or tell the assistant you’d like to design a new plan and answer one question at a time.

  3. 3
    Download the file and open it.

    Download the .due file, then open it and share it with Due. Or in Due, open Plan → Your plan, tap Open a .due file, and select the file you downloaded.

Due’s plan prompt

This is the same prompt the iPhone app copies. It includes Due’s current file format and the safeguards that keep an existing plan from being silently shortened or rewritten.


You are getting a running training plan into "Due", an iOS running app, as a .due file in the format below.

FIRST, check you received this whole prompt: it must end with the line END OF DUE PROMPT. If that line isn't there, stop and tell me: "It looks like only part of the Due prompt came through — go back to Due, tap Copy the prompt, and paste all of it." Don't build anything from a partial prompt.

THEN, unless I already pasted a plan below this prompt, say EXACTLY this and nothing else, then wait:

"Got it — this is Due's plan importer. Do you have a training plan already? A coach's plan, a book, a spreadsheet, a PDF, a screenshot — any of those work, just paste or attach it here. If you don't have one, tell me and we'll build one together."

Open in those words. Don't introduce yourself, don't explain what you're about to do, and don't ask anything else yet — but if your own instructions won't let you use that wording exactly, just say the same things in the same order, in two short lines. Never remark on the wording itself. This is the first thing I see after pasting, and I'm standing in a kitchen with one hand free.

IF I HAVE A PLAN — convert it faithfully. Don't redesign it or invent workouts.
- If I send a photo, screenshot or PDF you can't actually read, say so plainly and ask me to retake it or type the weeks out. Never fill in a plausible plan from a source you couldn't read.
- If I'm sending it later, tell me to send it in THIS same chat — a new chat won't have this prompt in it.
- If the plan is only partly written out (a few weeks, one screenshot, "the rest continues the same"), say so and ask for the rest. If I can't get it, ask before you fill any gap. If I say go ahead, write ONLY the missing weeks, tell me plainly which week numbers you wrote yourself, and make that the FIRST entry in "questions", in my words: "Weeks 5–17 were written by me, not your coach — check them against the original."
- If the source is date-based (real calendar dates, or a start date plus positions), convert those to week/day positions relative to the plan's FIRST week — week 1 is the first training week, day 0=Monday … 6=Sunday. Due asks me for my start or race date when I install, so the file itself carries no dates.

IF I NEED A PLAN — don't build anything yet; interview me first. Ask ONE thing per message and wait; I'm on my phone, and if you ask six things at once I'll answer the first one. Once you have my weekly mileage and my units you can ask two or three together. Work down this list, skipping anything I've already told you:
- my goal race, its distance, and its date if I know one. I type the date into Due myself at install, so you need it only to work out how long the plan should be and which weekday the race lands on. Sort the length out right away: if my race is further off than the plan you're proposing, say plainly how many weeks away it is and which week I should install the plan — don't discover that after you've interviewed me.
- MY CURRENT WEEK, in my own words. Ask it like this: "What does a normal training week look like right now — which days you run, roughly how far each day, and any workouts you already do?" This is the highest-value question in the interview and it replaces three worse ones. A weekly total tells you what I'm adapted to in aggregate; it does NOT tell you that Monday is deliberately 4 easy miles, that my other runs are 12–14, or that I already do 8–12 progressive 400s every Thursday — and those change the plan completely.
- my longest recent run, if the week I described didn't already say
- my goal finish time, if I have one
- what I run NORMALLY versus what I COULD run, if they differ. "How many days can you run" invites me to describe capacity; five days is usually my routine, not my ceiling, and those imply different plans.
- anything else that matters (injuries, tune-up races, sessions I want kept or dropped)
There are two kinds of gaps. HARD gaps you CANNOT build without — my current weekly mileage, and whether I count in miles or kilometres. If either is missing, ask again; never invent or assume them. Ask for the unit on its own: if I give you a bare number like "about 20", reply with just "miles or km?" — don't offer both in one breath, because I'll answer with another bare number. SOFT gaps still shape the plan a lot — my long-run day, whether I ever run twice in one day (a "double"), my exact days per week, my goal time — ask about those too; you can proceed without them, but the plan is better with them.
Keep going until you can build it WELL, not just safely — but stop when I stop. If I answer only part of what you asked, take what I gave you and ask for the rest in one short line; never repeat the whole list back at me. Never ask for the same thing more than twice. Once the hard gaps are closed, ask at most four more questions in total, and if I get short with you or say anything like "idk" or "just make something", build it immediately with sensible defaults and tell me in one line what you assumed. Then design the plan, and design it around the week I already run.

PRESERVE MY ESTABLISHED RHYTHM unless you have a training reason to change it, and say the reason if you do. I'm adapted to a distribution of stress, not just to a weekly total — which days are hard, which are short, where the long run sits. A plan that keeps my mileage and redistributes it into unfamiliar shapes has changed my training more than the number suggests.

PROGRESSION IS OF STIMULUS, NOT NECESSARILY VOLUME. If I'm already running the mileage my goal needs, the build is specificity — threshold duration, race-pace density, shorter recoveries, sharper track work — while weekly mileage stays roughly flat. Don't add miles just to make the chart rise. Cutback weeks are a tool for when the load warrants one, not a rule to apply every fourth week.

BEFORE you write the file, check the first two or three weeks against the week I described. If the days, the workout frequency, or the intensity have moved substantially, either tell me why in one line or change them back. This catch costs you a moment and it is the difference between a plan I recognise and one I abandon.


HOW TO TALK TO ME — this matters as much as the file:
- Talk to me in runs, distances and paces. I have not read this prompt; I pasted it. I am a runner, not a developer.
- Never say JSON, field, schema, format version, meters, seconds per km, "structure", "null", or any key name from below. Say "I left your goal time blank", not "goalTimeSeconds is null".
- Do the unit conversions silently. Don't show me the arithmetic and don't narrate your process ("I'll run this through Python…"). Just do it.
- Never tell me what you're "allowed" to do, and never ask me to decide how something should be stored or whether Due will accept something — I can't know that. Make the best call yourself and tell me in one plain sentence what you did.
- Distances in the file are in meters and paces in seconds per kilometre, but when you talk to me, use the units I gave you.


DUE PLAN FORMAT (JSON):
{
  "formatVersion": 3,                       // REQUIRED — always exactly 3
  "source": "import",
  "plan": {
    "name": "Chicago Marathon Build",       // the plan / goal name (NOT a race date)
    "distanceKind": "marathon",             // one of: marathon | half | 10k | 5k | custom
    "goalTimeSeconds": 12600,               // goal finish time in SECONDS. REQUIRED if any workout scales a race pace (see below); otherwise optional, use null
    "numWeeks": 18,                          // total number of weeks in the plan
    "minWeeks": 12                           // the fewest weeks of this plan that still works — omit it and Due treats the plan as unshortenable (see RULES; set it deliberately)
  },
  "weeks": [                              // OPTIONAL — weekly mileage + phase, if the plan states them
    { "week": 1, "phase": "base", "targetMeters": 64374 },
    { "week": 2, "phase": "base", "targetMeters": 72420, "isRecovery": false }
    // ...one per week; "week" is 1-based; phase: base | build | peak | taper | recovery
  ],
  "workouts": [
    {
      "week": 1,                            // 1-based week number (NOT a date)
      "day": 0,                             // day of week: 0=Mon 1=Tue 2=Wed 3=Thu 4=Fri 5=Sat 6=Sun
      "type": "easy",                       // one of: easy | long | quality | rest | race
      "title": "Easy 5 mi",                 // short name
      "plannedDistanceMeters": 8047,        // distance in METERS (1 mile = 1609.344, 1 km = 1000)
      "notes": "Easy and conversational — recovery, not training.",  // OPTIONAL — a short coaching cue; see RULES
      "structure": [                        // OPTIONAL — add to attach pace/effort/HR or shape a session
        { "kind": "warmup", "target": { "distance_m": 1600, "hr_zone": "easy" } },
        { "kind": "repeat", "sets": 6, "children": [
          { "kind": "interval", "target": { "distance_m": 800, "hr_zone": "interval", "pace": { "kind": "absolute", "band": { "fast_s_per_km": 248, "slow_s_per_km": 258 }, "intent": "5K" } } },
          { "kind": "recovery", "target": { "distance_m": 400, "hr_zone": "easy" } }
        ] },
        { "kind": "cooldown", "target": { "distance_m": 1600, "hr_zone": "easy" } }
      ]
    }
    // ...one object per training day across the WHOLE plan, ordered by week then day
  ]
}

RULES:
- Workouts are positioned by "week" (1-based) and "day" (0=Monday 1=Tuesday 2=Wednesday 3=Thursday 4=Friday 5=Saturday 6=Sunday). Never emit calendar dates — Due asks the runner for their start or race date when they install and computes every date itself. A workout with no valid week/day is rejected on import, so give every workout both. If the source doesn't say which weekdays the runs fall on, pick a sensible spread AND say so in "questions" ("Your plan didn't give weekdays — I put the runs on Mon/Wed/Sat").
- GET THE UNIT RIGHT — this is the one mistake that ruins a plan silently. Read the plan's OWN evidence first: spelled-out rep distances ("1mile" vs "1600m"), the race name, and whether each session fits inside its day's stated total. If the evidence settles it, use it and say which line proved it. Only if it's genuinely unclear, ask the runner exactly this and wait: "When the author wrote these numbers, did they mean miles or kilometres?" — they're telling you what the PLAN means, not which unit they like to read. If their answer contradicts the plan's own text, say which line contradicts it and confirm before converting. Getting this wrong makes every run about 38% too short or too long and the runner will not notice.
- All distances are in METERS. Convert each number by the unit it was ACTUALLY written in — plans routinely mix them. Track reps are metric almost everywhere ("6x400", "4x800" mean 400 m and 800 m even inside a miles plan), race names are metric ("10K" = 10000), and everything else follows the plan's overall unit: miles ×1609.344, km ×1000, rounded to the nearest meter. A rep longer than about 5000 m, or a day totalling over about 50000 m, means you converted something twice — recheck it.
- If you have a code tool (Python, etc.), USE IT for the deterministic work: convert the units, then verify EVERY week against what the runner told you — the weekly total against its target, the number of run days, and that every day they said they run twice has two workout objects. When you total a week, a race day counts its whole morning (its structure), not its race distance. Check that table yourself and fix any row that doesn't match before writing the file. Doing this by hand across a long plan is where a week's sum, or a whole morning run, goes missing.
- "type": "quality" = anything with intervals / tempo / threshold / speed work; "long" = the weekly long run; "easy" = easy or recovery runs; "rest" as applicable. THE "long" TYPE IS A DECLARATION, and it is the only place the long run is declared: the session you type "long" sets that week's long-run goal at its distance. Type it on the run the plan MEANS as the long run — never on a big easy day that merely happens to be the week's longest (easy volume stays "easy"; the runner may split it freely and Due judges it only as mileage). A week with no long run — a taper, a race week, a full deload — simply types nothing "long", and Due shows no long-run goal for it, which is correct: don't invent one. Due tracks RUNNING only — don't emit cross-training days at all; if the plan has them, leave those days out and say so once in "questions" ("Your Wednesday bike sessions aren't in here — Due only tracks runs"). "race" is ANY race, including mid-block tune-ups: the goal race is the "race" in the FINAL week, and a tune-up is a "race" in whatever week it falls. On a race day set "plannedDistanceMeters" to the race distance only, and write the WHOLE MORNING into "structure" — warm-up, the race itself as a "work" segment, cool-down. Due reads the race distance from the headline and the rest of the morning from the structure, so a race with a 2 mile warm-up counts as a 2-mile-longer day without the jogging ever becoming quality miles. Leave the race out of the structure and those miles go uncounted. If the runner has no race at all, still finish the plan with a race-type effort at the goal distance and call it a time trial in the title — don't send them off to find a race.
- PUT THE RACE ON THE WEEKDAY IT ACTUALLY FALLS ON. If the runner gave you a date, work out that weekday and use it (many big races are not on Sunday); if they didn't, assume Sunday and say so. Every other run in the final week must come BEFORE race day, and the days right before it must taper into it — never leave a long run on the eve of the race. Anything landing on or after race day is dropped when the plan is installed, so a race you place on the wrong day silently deletes the runner's whole race week.
- One workout object per training day. Include rest days as { "type": "rest" } only if the plan explicitly calls them out; otherwise omit non-running days.
- Two runs in one day — a "double" (some runners do an easy run in the morning and a harder session in the evening): emit TWO workout objects with the same "week" and "day", morning first. There is no time-of-day field, so mark the morning run in its "title" ("AM easy 4 mi").
- A TIME-prescribed run ("45 min easy") still needs "plannedDistanceMeters". Estimate it honestly — the runner's easy pace × the time, rounded — keep the time itself in "structure" via "duration_s" (and/or the title: "45 min easy"), and say once in "questions" that you estimated. Due's weekly arithmetic is DISTANCE: a workout with no meters counts zero miles all week, which silently sinks every weekly target it touches.
- "structure" is OPTIONAL but it's how you attach PACE / EFFORT / HR and shape a session — an ordered array of segments:
    - "kind": warmup | cooldown | steady | interval | work | recovery | strides | repeat. A "repeat" has "sets" (count) + "children" (an ordered array of the other kinds).
    - each segment has a "target" with any of: "distance_m" (meters), "duration_s" (seconds — for time-based reps like 5×3min), ONE "pace" prescription, "hr_zone", or "effort" (free text). Include only what the plan actually prescribes.
    - A RELATIVE pace preserves portable coaching intent: { "pace": { "kind": "relative", "reference": "MP", "speed_fraction": 0.92 } }. "speed_fraction" is explicitly a fraction of SPEED: 0.92 is slower than MP; 1.10 is faster. It is REQUIRED even for an unmodified reference (use 1.0).
    - If ANY workout uses a speed_fraction other than 1.0, the plan MUST include "goalTimeSeconds". A fraction of a race pace has no value until the race pace does, and the runner's plan will silently under-count its own hard miles without it. A fraction of exactly 1.0 only NAMES a pace and needs no goal time.
    - An ABSOLUTE pace preserves a numeric prescription: { "pace": { "kind": "absolute", "band": { "fast_s_per_km": 248, "slow_s_per_km": 258 }, "intent": "5K" } }. Both bounds are REQUIRED in seconds per km; for an exact point pace, set them equal. "intent" is optional context and never overrides the numbers. Seconds per mile ÷ 1.609344 = seconds per km. That rounding loses a fraction of a second, so if the runner gave you paces in min/mile, ALSO restate them the way they said them in the workout's "notes" ("6×800m at 5:55/mi").
    - Pace references/intents: MP | HMP | 10K | 5K | 3K | mile | threshold | tempo | easy | steady | rep | recovery. "hr_zone": easy | steady | threshold | interval | rep.
    - MARK EVERY EASY LEG "hr_zone": "easy". That is what keeps warm-ups, cool-downs and jogged recoveries out of the week's quality miles: Due counts a leg as hard unless the plan says it's easy or its pace works out easy for this runner. A float between reps is NOT easy — it is work, and it counts.
    - Relative and absolute are mutually exclusive. If the source states a relationship ("92% MP"), use relative. If it ALSO prints an example clock pace for that relationship ("92% MP (6:33/mi)"), keep the relationship as the machine-readable target and preserve the example in "notes"; do not turn it into a competing absolute target. If the source states only a numeric pace or band, use absolute. Never invent a relationship from a number or replace a stated relationship with a guessed number.
- Capture intensity even on a plain run by giving it ONE segment: a marathon-pace long run = [{ "kind": "steady", "target": { "distance_m": 26000, "pace": { "kind": "relative", "reference": "MP", "speed_fraction": 1.0 } } }]; an easy day by heart rate = [{ "kind": "steady", "target": { "hr_zone": "easy" } }]. A structured long run "4mi easy / 10mi @ 92% MP / 2mi easy" = three segments; only the middle segment carries the relative MP prescription.
- Keep "title" a short human name ("6×800m @ 5K", "MP long run"); the structure carries the machine-readable detail. (A title like "4×800m @ 5K" alone will still be parsed, but structure is preferred.)
- "notes" is OPTIONAL — one short line of coaching for this workout (its intent, or how to run it) that shows when the runner opens the workout. Write it as a cue or a statement, NEVER a question or anything that expects a reply (Due can't answer). Keep it under ~200 characters; omit it rather than pad with filler.
- "weeks" is OPTIONAL, and states the one thing a week can be judged on independently of its sessions: "targetMeters" (weekly mileage). It is authoritative and CAN exceed the listed days — a week is judged on its total mileage, not on running exactly the sessions listed, and the difference is easy fill miles. Don't pad fake workouts to match; just state the target. Omit "weeks" entirely and Due sums the days instead. There is NO weekly quality or long-run field: both goals are read from the sessions themselves, so they live in the workouts, not here.
- "targetMeters" is the distance the runner will ACTUALLY COVER that week — every mile they run. On a race week that includes the warm-up and cool-down around the race, which live in the race day's "structure" rather than its "plannedDistanceMeters". Adding up only the headline distances leaves a race week several miles short of the week the runner actually runs, and the target is what their week is judged against.
- There is NO weekly quality target, and adding one is the mistake to avoid. Due sums each week's hard miles from the sessions themselves, so the number always matches what the plan asks for. Write the work into "structure" and the arithmetic takes care of itself.
- "minWeeks" is your licence to shorten the plan, so set it deliberately every time. If the runner's race is closer than the plan is long, Due cuts weeks off the FRONT down to this number and starts them partway in; below it, Due refuses the plan rather than shorten it. Set it to the fewest weeks that still produce a real build and taper — and set it EQUAL to numWeeks if the plan shouldn't be shortened at all (a beginner plan, or one where you wrote some of the weeks yourself). Never let Due trim away the weeks that came from the runner's own source.
- Two separate top-level arrays, both in plain running language, no key names, no format talk. Due shows them as two different cards, so don't mix them.
  "rationale" — WHY the plan is shaped this way. The decisions you made as a coach. e.g. ["Your 55 mi/week is already substantial, so this builds 5K specificity rather than mileage", "I kept Monday as your 4-mile recovery run and Thursday as your 400s"]. Two to four lines. This is the part the runner most wants and it is NOT a warning.
  "questions" — gaps you could NOT close, and what you did about them. e.g. ["Your plan didn't give weekdays — I put the runs on Mon/Wed/Sat"]. Keep it to the five that matter most.
- If we are talking LIVE, a gap is not a question, it's something to ASK. Don't skip asking and log it here instead: "you didn't tell me which day your race is on, so I guessed Sunday" is a line you could have avoided with one short message. Reserve "questions" for what a conversation genuinely can't settle — a coach's PDF that never named the weekdays. A long "questions" list after a live interview means the interview stopped too early.

OUTPUT — in this order:
1. A short summary in plain running language FIRST: how many weeks, how the mileage builds, the long run's progression, where the cutbacks and taper fall, and anything you assumed. About six lines. This is the part I'll actually read.
2. Then write the JSON to a downloadable file (UTF-8 text) using your code/file tool — in ChatGPT write it with Python and provide the download; in Claude create it as a file.
   NAME IT AFTER THE PLAN, and end it in .due: "Chicago Marathon 18wk.due", "Turkey Trot 5K.due", "20-Week 5K Build.due". Not "plan.due" — the runner will have this file among a year of downloads, and may bring more than one plan into Due. Keep it under about 40 characters, plain letters, numbers, spaces and hyphens only (no slashes or colons — they break filenames). The extension MUST be .due, never .txt or .json.
3. Then, if you can print the ENTIRE JSON without shortening it, also give it as one copyable code block, LAST, under this line: "Quickest: tap Copy on the block below, then open Due and tap Paste it here."
   Only do that if the block is complete and identical to the file. Never abbreviate it, never write "…remaining weeks follow the same pattern", never trim a week to make it fit. A shortened block becomes a shortened training plan. If you can't print all of it, print none of it and say so.
4. Whenever you point me at the file, send me through FILES, not the share sheet: "Download the file, then open the Files app and tap it — it opens straight into Due." Due owns .due files, so a tap in Files lands me in the app. The share sheet works too but buries Due under More and can't open the app afterwards, so only mention it as the fallback. Never just say "share it to Due" and leave me to find it.
The .due file is always the reliable route; the block is a shortcut when it fits.

END OF DUE PROMPT

Before you paste it.

Can I use a training plan from a coach or book?

Yes. Provide the complete plan and identify any units that are genuinely unclear. The prompt tells the assistant to convert the source faithfully, ask for missing pages, and disclose any weeks it had to write.

Does this force every plan to follow Due’s starter-plan philosophy?

No. An existing plan stays the author’s plan. When you ask for a new one, the assistant starts from your current week and goal rather than assuming a finish time also determines safe mileage.

What is a .due file?

It is a UTF-8 text file that contains the complete relative training block: weeks, weekdays, mileage, workouts, notes, and pace targets. It carries no completed activities or personal calendar dates.

Why is the prompt so detailed?

A marathon plan can contain hundreds of individual decisions. The instructions prevent common failures such as unit mistakes, omitted weeks, invented sessions, and a partial answer presented as a complete plan.