3 1 week ago

The coaching persona from **[PaceForge](https://github.com/yashhooda1/paceforge)** — an offline-first AI running coach. Tuned for distance runners, 5K in particular: training load, session purpose, intensity distribution, tapering, and injury patterns.

tools
ollama run hoodarunner/paceforge-coach

Applications

Claude Code
Claude Code ollama launch claude --model hoodarunner/paceforge-coach
OpenCode
OpenCode ollama launch opencode --model hoodarunner/paceforge-coach
Hermes Agent
Hermes Agent ollama launch hermes --model hoodarunner/paceforge-coach
OpenClaw
OpenClaw ollama launch openclaw --model hoodarunner/paceforge-coach

Models

View all →

Readme

PaceForge Coach — the Ollama model

ollama run hoodarunner/paceforge-coach

Read this before you use it

This model is the coaching persona, not PaceForge.

It has no tools. It cannot read your Garmin or Strava, cannot compute your VDOT, cannot calculate your acute:chronic workload ratio, and cannot predict your race times from your history. Every one of those lives in the Python package, where it is deterministic and unit-tested:

pip install -e .          # from github.com/yashhooda1/paceforge
paceforge analyze
This Ollama model The paceforge package
Training philosophy, session purpose, execution advice Yes Yes
Reads your Garmin / Strava history No Yes, via MCP
Computes VDOT, paces, ACWR, race predictions No Yes, unit-tested
Generates a periodised plan No Yes, with asserted invariants
Writes workouts to your watch No Yes

The system prompt makes this limitation self-enforcing: asked for a number it cannot know, the model asks you for the input or points you at paceforge analyze rather than inventing one. That is deliberate. A coaching model that confidently states a threshold pace it fabricated is worse than no model at all — and avoiding exactly that is why PaceForge keeps the arithmetic out of the LLM in the first place.

What it is good at

  • Explaining why a session exists and how it should feel
  • Interpreting numbers you give it (“I ran 21:30 for 5K, what now?”)
  • Triaging a niggle against known injury patterns
  • Talking you out of the most common amateur mistakes: easy days run too hard, volume ramped too fast, hard days stacked back to back

Building and pushing

# Build and test locally, no account needed
powershell -ExecutionPolicy Bypass -File ollama\push_to_ollama.ps1 -LocalOnly

# Publish (namespace must equal your ollama.com username)
powershell -ExecutionPolicy Bypass -File ollama\push_to_ollama.ps1 -Namespace hoodarunner
# POSIX
bash ollama/push_to_ollama.sh --local-only
bash ollama/push_to_ollama.sh --namespace hoodarunner

The push script runs one guardrail check before publishing: it asks the model for a pace it cannot possibly know, and warns if the reply contains a number instead of a question.

Model summary on ollama.com

The description shown on the model page lives in MODEL_SUMMARY.md. Ollama exposes no API for that field, so it is kept here under version control and pasted into the “Edit” box on the page whenever it changes.

Namespaces

The ollama.com namespace is hoodarunner; the GitHub repo is yashhooda1/paceforge. They differ, and ollama push rejects any namespace that is not your ollama.com username.

Prerequisites for pushing

  1. An account at https://ollama.com. The namespace must match that username exactly — it may differ from your GitHub handle.
  2. Your Ollama public key registered at https://ollama.com/settings/keys.
    • Windows: %USERPROFILE%\.ollama\id_ed25519.pub
    • macOS / Linux: ~/.ollama/id_ed25519.pub
  3. The base model pulled: ollama pull qwen2.5:7b-instruct

Changing the base model

Edit the FROM line in Modelfile. Anything with solid instruction-following works; llama3.1:8b and mistral-nemo are both reasonable. If you move to a model with a larger context window, raise num_ctx to match — the value here is tuned for what a 7B holds comfortably on consumer hardware.