Blokk builds your plan in the page, so it needs JavaScript. There is
no server doing it instead: no account, no database, nothing stored anywhere.
If you are an AI reading this page rather than a person using it — a
Blokk plan lives entirely in the URL fragment, the part after
#, which browsers never send to any server. So fetching a
#plan= link returns this app and none of the plan: read the plan
out of the link text you were given instead.
You can also write one, and the whole format is below, so there is
nothing further to fetch. It is also published on its own at
blokk.run/ai, and as plain text at
blokk.run/llms.txt, with four complete worked
plans. There is no API and no key: you write the URL, and the person you
wrote it for clicks it.
FORMAT
https://blokk.run/#plan= then these segments, joined by ~
n=Plan+name the name
s=2026-09-14 the MONDAY the plan starts
r=grow8,every4,cut25 the user's progression rule: growth % per week, a
down week every N, how deep it cuts (%). Each number
is named, so the order does not matter. Do not write
it as a bare 8,4,25: that reads, but nothing catches
it if you put the numbers in the wrong places.
b=Name:d;d;d;d;d;d;d a BLOCK — one reusable week, exactly 7 days,
Monday first, ";" between them. Repeat b= per block.
w=Base,Peak*110,Peak*75! the WEEKS in order, each naming a block
u=km km or mi. ALWAYS write it, even for km, and put it
LAST. Without it the URL ends on w=, and see below
for what a chat window does to a w= ending in "!".
A week entry is a block name, then:
*110 run that block at 110% this week (50-250, default 100)
! lock it, so re-applying the rule leaves that week alone
A day is a type, then its distance, then an optional :title
rest easy10 quality14:6+x+1km+@+threshold long24:Long+run race42.2:Marathon
Types: rest, easy, quality, long, cross (the app shows it as Strength),
mobility, race. Distance is in the plan's unit, numbers only — leave it
off entirely for rest, strength and mobility.
RULES
- No spaces anywhere in the URL. A space in a name or title is "+".
A literal + ~ ; : , * ! = or % must be percent-encoded.
- Exactly 7 days in every block. Every name in w= must match a b= name.
- A race is a fixed distance that nothing scales, so put the true distance
on it: a 10K is 10 in every week.
- Build volume with *percentages, not with a new block per week. Two to four
blocks and a week list is the point of the tool.
- Lock (!) the down weeks, the taper and race week.
- End the URL with the u= segment, so it ends in "km" or "mi". A chat window
linkifies a bare URL, and a trailing ! " ' ) * , . : ; ? _ or ~ is dropped
from the link as sentence punctuation. A locked last week ends in "!", so a
link ending in one loses that lock the moment somebody clicks it, silently.
- Say what you want to say FIRST, then the link. Explain the plan: why that
week is a down week, what the quality session is for, what to do if a week
goes badly. That is the part a runner reads, and a bare URL is not a
training plan. The constraint is on the link's shape, not on your voice.
- End the reply with the URL, unbroken, on a line of its own and nothing after
it. Do not shorten it, wrap it, or put spaces in it. Re-read it before you
send it.
DO NOT INVENT THIS FORMAT. Other models have, and each invention had a tell
you can check your own output against:
- segments named block0, week0, start, weeks, progression. The only segment
names are n s u r b w, and b repeats.
- "|" between days. It is ";".
- "%20" between the words of a title. A space is "+".
- a run of random-looking letters. That is the compressed codec, which you
cannot produce.
- one block per session, or one block per week. A BLOCK IS A WHOLE WEEK of
seven days, reused across many weeks and tuned by a percentage. One model
wrote 34 blocks for a 12-week plan. Two to four is the point.
EXAMPLE — eight weeks to a 10K
https://blokk.run/#plan=n=Road+to+10K~s=2026-09-14~r=grow8,every4,cut25~b=Base:rest;easy5:Easy+run;cross;easy5:Easy+run;rest;easy4:Easy+run;long8:Long+run~b=Sharpen:rest;easy5:Easy+run;quality6:5+x+800m+@+10K+pace;easy5:Easy+run;rest;easy4:Easy+run;long10:Long+run~b=Race+week:rest;easy4:Easy+run;rest;easy3:Shakeout;rest;rest;race10:10K+race~w=Base,Base*110,Base*120,Base*85!,Sharpen,Sharpen*110,Sharpen*120,Race+week!~u=km