Use the assistant you already pay for

Ask ChatGPT or Claude to change your training, and OffWall shows you every change it suggests before anything moves. You read them one at a time and keep the ones you want.

Connect it directly

Your assistant has a place to put this address, and it isn't the browser bar. Copy it, then find yours below.

https://api.offwall.app/mcp

Where it goes

Claude, on the web or in the desktop app
Customize, then Connectors, then the plus, then Add custom connector. Paste the address and press Add.
On a work account under a Team or Enterprise plan that option is missing: only an owner can add a connector there. Use a personal account, or the prompt below.
ChatGPT
Settings, then Security and login, and turn on Developer mode. Then open Plugins, press the plus, and paste the address.
Claude Code, in a terminal
claude mcp add --transport http offwall https://api.offwall.app/mcp, then claude mcp login offwall.

Whichever one you use, OffWall then asks for the email on your account and sends you a link. Press the button in that mail and your assistant can read. Nothing happens until you press it.

Opening the address in a browser shows one sentence and nothing else. That is what it should do: a connector answers an assistant, not a browser tab.

It reads what your phone last backed up: this week, your goals, your tracks and your recent sessions. It can't change any of it. A change it writes waits in the app until you open it. Press Back up now in OffWall first, or there is nothing there for it to read.

Or copy a prompt instead

This works with any assistant and there's nothing to set up. In OffWall, open Apply a helper's changes and press Copy the prompt. That builds the text below with your own plan, goals and block ids already filled in. Paste the answer back under Paste what it wrote.

The ids are why the phone composes it and this page doesn't: a change naming a block you don't have is refused, and you'd see the error rather than the plan.

What it has to answer with

Both routes ask for the same thing. It's here so you can read what your assistant is being told to do, or hand it over yourself.

Answer a request to change training with this JSON and nothing else:

{"offwall_patch":1,"note":"one or two sentences they will read","changes":[ ... ]}

Each entry of "changes" is one of:
  {"verb":"day.add_block","date":"YYYY-MM-DD","block":"<id>","why":"<one sentence>"}
  {"verb":"day.remove_block","date":"YYYY-MM-DD","block":"<id>","why":"<one sentence>"}
  {"verb":"plan.week.add","week":"<a Monday>","block":"<id>","target":<sessions>,"why":"<one sentence>"}
  {"verb":"plan.week.remove","week":"<a Monday>","block":"<id>","why":"<one sentence>"}
  {"verb":"plan.week.set_target","week":"<a Monday>","block":"<id>","target":<sessions>,"why":"<one sentence>"}
  {"verb":"block.set_dose","block":"<id they built>","exercise":"<id>","sets":N,"reps":N,"load_kg":N,"why":"<one sentence>"}
  {"verb":"climb.log","date":"YYYY-MM-DD","grade":"<as they say it>","discipline":"boulder|lead|toprope|other","style":"onsight|flash|redpoint|repeat|project|attempt","location":"<crag or gym>","indoor":true,"why":"<one sentence>"}
  {"verb":"project.add","name":"<route or problem>","grade":"<as they say it>","discipline":"boulder|lead|toprope|other","location":"<crag or gym>","why":"<one sentence>"}
  {"verb":"session.log","date":"YYYY-MM-DD","block":"<id>","minutes":N,"why":"<one sentence>"}
  {"verb":"plan.create","name":"<plan name>","week":"<first Monday>","weeks":N,"phases":{"6":"deload"},"week_names":{"6":"Deload and tests"},"blocks":[{"ref":"a","name":"<session name>","exercises":[{"exercise":"<ex: id>","sets":N,"reps":N,"duration_sec":N,"load_kg":N,"rest_sec":N,"note":"<cue>"},{"name":"<their own exercise>","metric":"REPS|REPS_LOAD|REPS_TIME|TIME|TIME_LOAD","sets":N}]}],"days":[{"date":"YYYY-MM-DD","blocks":["a"]}],"why":"<one sentence>"}
  {"verb":"plan.week.name","week":"<a Monday>","weeks":N,"name":"<what these weeks are for>","why":"<one sentence>"}
  {"verb":"block.set_exercises","block":"<id they built>","name":"<optional new name>","exercises":[{"exercise":"<ex: id>","sets":N,"reps":N,"duration_sec":N,"load_kg":N,"rest_sec":N,"note":"<cue>"},{"name":"<their own exercise>","metric":"REPS|REPS_LOAD|REPS_TIME|TIME|TIME_LOAD","sets":N}],"why":"<one sentence>"}

RULES, and a change breaking one is refused with the reason shown to the athlete:
  * Every change carries a "why" of one sentence, written to the athlete. It is the
    line they read under the change while deciding, so a change without one reads as
    an instruction from nowhere.
  * There is no verb for anything else. Ask them to do it in the app, and say WHERE: read the
    section of how_offwall_works that names the tabs, and name the one they need.
  * plan.week.add PUTS a block in a week. plan.week.set_target says how often, whether it is
    already there or not, so "twice a week down to once" is set_target and never add.
  * A day is named by its date. "days" in the situation lists every date that holds something and
    the ids on it; a date not listed holds nothing. Never remove a block from a day it is not on.
  * A climb is logged only when they told you about it. Grade is free text, in their own
    vocabulary. Discipline and style are the closed lists above, and "why" is what goes in
    the note on the tick, so write it as the note rather than as an argument.
  * "block" is an id the app already holds. Never invent an id or a name.
  * Only a block THEY built can have its dose changed. The authored track rows carry
    citations and are not editable, by anyone, including them.
  * Rehab and injury tracks are refused outright, whichever way they are named.
  * plan.create is a WHOLE multi-week plan the athlete has already agreed with you, sent as ONE
    change they read and tick once. It builds every session in "blocks" (each a "ref" the days
    use), puts them on the dates in "days", tags weeks in "phases" (base, deload or peak, keyed
    by week number), and sets each week's targets to what it placed. A plan already covering
    those weeks ends the week before; days they planned themselves stay. An exercise is "ex:"
    plus a library id, or a "name" with a "metric" for one of their own. Never use it for a
    small change: that is what the other verbs are for. "week_names" says what each week is for,
    keyed by week number, in a few plain words.
  * plan.week.name names "weeks" weeks (1 to 52, default 1) from the Monday in "week": what those
    weeks are for, shown as a heading on their Month. An empty name is refused; it never changes
    a session.
  * Nothing is written until they read every line and accept it.

Your assistant reads the backup you already made, and the privacy notice says how long a copy is kept.