Built for agents

lift.md format is plain markdown, so any LLM can read and write workouts without special tooling. Bring your own model — there's nothing proprietary to learn, no SDK to install, and no lock-in. This page collects the resources that make LiftMark easy to drive from an agent, plus copy-paste setup for the common ones.

The format is just markdown

A header, exercises, and lists of sets:

# Bench Day
@units: lbs

## Bench Press
- 135 x 5
- 185 x 5
- 225 x 5

Full spec (or raw markdown to feed into a model's context).

llms.txt

getlift.md/llms.txt is a machine-readable index of the format, spec, validator API, and skill installer — point an agent at it as a single entry point to everything below.

Validate before you trust it

Have an agent check its own output against the live validator at POST https://getlift.md/validate. The simplest call is the raw markdown as the request body — no JSON escaping:

curl -s -X POST https://getlift.md/validate \
  -H 'Content-Type: text/markdown' \
  --data-binary @workout.md

Prefer JSON? Send Content-Type: application/json with a body of {"markdown": "..."}. Either way you get back {success, summary, errors, warnings} — feed the errors back to the model to iterate until success is true.

The skill

Most of the work is packaged as one Agent Skill, generate-workout: it teaches the model the format and validates every workout against the API. Install it with one line, or download the skill bundle and add it to any tool that loads skills. Pick your agent below.

Install the generate-workout skill with one line. It teaches Claude Code the format and validates every workout against the API automatically:

curl -fsSL https://getlift.md/install.sh | sh

Start a new session and ask for a workout — e.g. "write me a push day in lift.md format". The skill fetches the spec, drafts the plan, and loops on the validator until it passes. (You can also just tell Claude to run that installer for you.)

Cowork and claude.ai both run the same Agent Skills. Grab the bundle and add it:

Download the skill (.zip)

  • claude.ai: Customize → Skills → + → Create skill, and upload the zip.
  • Cowork: add it the same way under Customize, or just ask Claude to install it for you.

The skill validates automatically wherever the sandbox is allowed to reach getlift.md (Cowork running locally, or a claude.ai workspace with outbound access enabled). If network egress is locked down, the skill still writes correct lift.md — validate the result yourself by pasting it into the box on the format hub.

Codex CLI reads an AGENTS.md file from your repo root (or ~/.codex/AGENTS.md for all projects). Drop in this recipe and Codex will fetch the spec and validate its own output:

# lift.md workouts

When I ask you to write or edit a lift.md (LiftMark) workout:

1. Read the format spec first and follow it:
   curl -s https://getlift.md/spec.md
2. Write the plan in lift.md format — a `# Title`, `## Exercise`
   headings, and `- weight x reps` set lines.
3. Validate before showing it to me. Save the workout to a file and POST it:
   curl -s -X POST https://getlift.md/validate \
     -H 'Content-Type: text/markdown' \
     --data-binary @workout.md
4. The response is JSON: {success, summary, errors, warnings}. If success is
   false, fix everything listed in errors and re-validate. Only hand me a
   workout that validates.

Codex runs with network access off by default — approve the network prompt when it validates, or run with Full Access. No other setup needed.

No special tooling — this works with any model behind the OpenAI or Anthropic API, or any agent that can make an HTTP request:

  1. Fetch the spec once and put it in your system prompt: curl -s https://getlift.md/spec.md. It's static, so cache it (with Anthropic, mark the block for prompt caching).
  2. Have the model produce a workout in lift.md format.
  3. POST the output to the validator (raw markdown is simplest):
    curl -s -X POST https://getlift.md/validate \
      -H 'Content-Type: text/markdown' \
      --data-binary @workout.md
  4. If success is false, append the errors array to the conversation and ask for a fix. Repeat — bounded to a few retries — until it validates.

Links