{
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "attributionRequired": true,
    "credit": "CC BY 4.0, credit Anchor Terminal and link the page or API address you took it from (https://www.anchorterminal.com/terms/#data)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-31",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.7",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run",
    "terms": "https://www.anchorterminal.com/terms/#data"
  },
  "tool": {
    "slug": "learnharness",
    "name": "LearnHarness",
    "vendor": "Amos Blomqvist",
    "vendorUrl": "https://learnharness.ai",
    "kind": "harness",
    "category": "personal-assistants",
    "summary": "LearnHarness is an open-source desktop app for macOS, Windows and Linux that tests what a learner already understands, plans a route to a goal, teaches step by step and keeps a local knowledge graph, using the learner's own model keys.",
    "url": "https://www.anchorterminal.com/tools/learnharness",
    "markdownUrl": "https://www.anchorterminal.com/tools/learnharness.md",
    "slimMarkdownUrl": "https://www.anchorterminal.com/tools/learnharness.min.md",
    "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/learnharness.json",
    "repo": "https://github.com/amosblomqvist/learnharness",
    "license": "AGPL-3.0-only",
    "transports": [],
    "packages": [],
    "auth": "none",
    "authNotes": "No LearnHarness account. The learner adds keys for model providers (OpenAI, Anthropic, Google, DeepSeek, OpenRouter and others), or one OpenAI-compatible endpoint, or signs in with ChatGPT, GitHub Copilot or Grok, or connects an installed Claude Code CLI. Deepgram (dictation) and Tavily or Brave (web search) take separate keys.",
    "pricing": "free",
    "pricingNotes": "Free under AGPL-3.0 with nothing to buy. Model usage is billed by the provider the learner configures, or counts against a ChatGPT, Copilot or Grok plan, and the app shows a live cost meter. The README says any future charge would be for convenience such as managed keys or hosting.",
    "priceSummary": "Free · OSS",
    "where": "local",
    "x402": {
      "level": "no",
      "evidence": "No x402, MPP or L402 in the README, the website, the skill or the source files read (checked 2026-10-30).",
      "endpoints": []
    },
    "toolCount": null,
    "popularity": {
      "githubStars": 4204,
      "npmWeekly": null,
      "pypiWeekly": null,
      "asOf": "2026-10-30"
    },
    "docsUrl": "https://github.com/amosblomqvist/learnharness/blob/main/docs/development.md",
    "capabilities": [
      "assistant.memory",
      "assistant.self-hosted",
      "memory.graph",
      "memory.read",
      "web.search"
    ],
    "tags": [
      "open-source",
      "local",
      "free",
      "no-card",
      "agpl",
      "desktop-app",
      "macos",
      "windows",
      "linux",
      "agent-skill",
      "typescript",
      "new"
    ],
    "lastRelease": "2026-10-29",
    "graded": true,
    "anchor": {
      "graded": true,
      "score": 59.3,
      "grade": "C",
      "agentReady": false,
      "rank": 648,
      "ranked": true,
      "rankOf": 1239,
      "categoryRank": 9,
      "methodology": "0.7",
      "run": "2026-10-01",
      "scores": {
        "ergonomics": 60,
        "maintenance": 71,
        "payments": 60,
        "reliability": 56,
        "schema": 63,
        "security": 52,
        "transparency": 60
      },
      "pending": [
        "performance",
        "tasks"
      ],
      "breakdown": [
        {
          "key": "reliability",
          "name": "Reliability",
          "weight": 16,
          "effectiveWeight": 20,
          "score": 56,
          "points": 11.2,
          "reason": "Read with the local-software lines, as software the owner runs. Installers for three operating systems on GitHub Releases with platforms stated, macOS Apple Silicon only, and the Windows installer is unsigned (16 of 20). CI runs typecheck, the test suite and lint on every push to main and on pull requests, plus build and smoke checks on macOS, Windows and Linux. The tests folder holds 249 files, fixtures included, and the last five push runs on main passed, with three failed push runs on 24 and 25 October each followed by a passing run within an hour (22 of 25). 265 open issues and pull requests on a 14-day-old repository. Of the 61 newest issues, opened 28 to 30 October, 56 are open, 41 have no comment and 13 of 14 labelled bug are open. Release notes cite many earlier reports as fixed (#23, #46, #87, #110, #112) (10 of 25). Each release has notes listing new behaviour and fixes, but there is no CHANGELOG file and no section for breaking changes (8 of 15). Version 0.4.0 with no stability statement (0 of 15).",
          "checked": "2026-10-30"
        },
        {
          "key": "performance",
          "name": "Performance",
          "weight": 10,
          "effectiveWeight": 0,
          "pending": true,
          "points": 0,
          "reason": "Pending. Latency is measured per call by our probes, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until the first probe window closes."
        },
        {
          "key": "schema",
          "name": "Schema \u0026 documentation",
          "weight": 13,
          "effectiveWeight": 16.25,
          "score": 63,
          "points": 10.24,
          "reason": "Graded on what an outside agent reads, the bundled skill, with the harness reading of the framework line. No OpenAPI or schema file. The data-format reference documents the file map, record fields, tool-call shapes and a format version stamp in prose, and the readers print JSON (8 of 25). SKILL.md and `references/data-format.md` are Markdown written for agents. learnharness.ai/llms.txt returns 404 (10 of 10). The skill says when to use it, what the data does and does not show (a graph proposition is not evidence of understanding, a missing confidence is not zero) and what not to do (no writes, no `auth.json`, no running stored HTML or code) (17 of 20). Readers take named subcommands and options (`list`, `read`, `propositions --session`, `find`, `chains --node`). Arguments are strings with no enumerated values beyond the subcommands. In-app tools carry typebox schemas (8 of 15). Command examples for every reader, and the skill states that newer formats are refused and invalid records produce explicit errors, without an error list (10 of 15). Per-release notes and a format version stamp, on 0.x (10 of 15).",
          "checked": "2026-10-30"
        },
        {
          "key": "ergonomics",
          "name": "Agent ergonomics",
          "weight": 13,
          "effectiveWeight": 16.25,
          "score": 60,
          "points": 9.75,
          "reason": "Harness reading, scored on what an agent using the skill or a person driving the app has to supply. SKILL.md is about 8.6 KB and the data-format reference about 12.5 KB, loaded on demand. `sessions.py read` returns the whole session with no size cap by design, and agent reasoning and operational records are left out unless asked for. In-app tools cap output at 50 KB (15 of 25). Graph readers filter by session, pattern and node, sessions can be listed first, and two switches opt into extra material. No pagination (12 of 20). Readers name the data folder they used and refuse rather than guess on newer formats. No outside agent can start or drive a lesson, and the local HTTP API needs a per-launch secret (10 of 20). The readers write nothing and can be rerun safely. In the app, failed turns can be retried with the input kept (15 of 20). Readers default to each OS's data folder and need only the Python 3.10 standard library. No SDK or headless command (8 of 15).",
          "checked": "2026-10-30"
        },
        {
          "key": "security",
          "name": "Security \u0026 auth",
          "weight": 14,
          "effectiveWeight": 17.5,
          "score": 52,
          "points": 9.1,
          "reason": "Harness reading of the framework checklist, as the Leon and Goose dossiers used. 30 for what leaves the machine by default, 20 for approvals and sandboxing, 15 for prompt-injection posture, 15 for audit and 20 for the security programme. No telemetry module was found in the files read. The server binds 127.0.0.1 and checks a per-launch 64-character secret with a timing-safe compare. Model requests carry lesson context and any file the agent reads to the configured provider, the fetch fallback sends URLs to Jina Reader, and updates download automatically from GitHub Releases. Provider keys and ChatGPT credentials are plaintext JSON at mode 0600 (20 of 30). In-app tools are read-only with no shell, write or send tool, and Claude Code runs with built-in tools off and hooks disabled. File reads reach any path the account can read, home directory first, with no allow list or prompt, and model-authored demos run in a bundled browser helper whose isolation we did not check (11 of 20). The skill tells agents to treat stored records as data. The research sub-agent's prompt has no guidance on untrusted web content, and its briefs return to the teacher, which holds the file-read tools (6 of 15). Every message, tool call and tool result is stored in plain JSON per session, with a cost meter and an activity dock for background jobs (11 of 15). No SECURITY.md, no security.txt (404), no bounty and no disclosure policy. A KaTeX advisory (GHSA-238p-pmpm-9mq7) was addressed in the public 0.3.4 notes, and macOS builds are signed and notarised (4 of 20).",
          "checked": "2026-10-30"
        },
        {
          "key": "payments",
          "name": "Payments \u0026 pricing",
          "weight": 10,
          "effectiveWeight": 12.5,
          "score": 60,
          "points": 7.5,
          "reason": "Read with the self-hosted rule. No payment protocol (0). Free under AGPL-3.0 with nothing to buy, so 20, 20 and 20 on the last three lines. Model, search and dictation usage are billed by those providers. No local-model setup is documented beyond a custom OpenAI-compatible endpoint, which can be keyless.",
          "checked": "2026-10-30"
        },
        {
          "key": "tasks",
          "name": "Task success",
          "weight": 10,
          "effectiveWeight": 0,
          "pending": true,
          "points": 0,
          "reason": "Pending. Task success needs the category task suites run through each tool, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until then. A data provider's data-quality score is published on its listing now and becomes half of this category when it's scored."
        },
        {
          "key": "maintenance",
          "name": "Maintenance \u0026 community",
          "weight": 7,
          "effectiveWeight": 8.75,
          "score": 71,
          "points": 6.21,
          "reason": "0.4.0 was released on 29 October 2026, one day before this check (30 of 30). Nine releases between 17 and 29 October (20 of 20). Of the 39 newest pull requests, opened 28 to 30 October, 37 are open and none was merged. Release notes say several changes were based on outside pull requests and issues (#61, #62, #114, #154, #184) and thank contributors, and 41 of the 61 newest issues have no comment yet. We counted comments and did not read who wrote them (10 of 25). Not an MCP server and no SDK. The skill ships in the repository, not in a registry (3 of 15). Dependencies are current (Next.js 16.4, Electron 44, pi libraries pinned at 1.4.0), CI passes on main and the KaTeX advisory was patched (8 of 10).",
          "checked": "2026-10-30"
        },
        {
          "key": "transparency",
          "name": "Transparency \u0026 trust",
          "weight": 7,
          "effectiveWeight": 8.75,
          "score": 60,
          "points": 5.25,
          "note": "editorial 64, provenance 56",
          "reason": "AGPL-3.0-only, an OSI licence, with the whole app, prompts and skill in the public repository (30). No privacy policy (404). The README and website say chats, graph, settings and keys stay on the machine, that model requests send context to providers, and that dictation and web research use outside services, and they say local storage does not mean offline processing. The Jina Reader fallback is not named there, and the 0.3.6 notes disclose plaintext ChatGPT credential storage (18 of 30). No deprecation policy. The project is 14 days old, and release notes describe changed behaviour without dates for removals (4 of 20). No telemetry was found in the files read, though neither the README nor the site says so. Automatic updates are on by default with a switch in Settings (12 of 20).",
          "checked": "2026-10-30"
        }
      ],
      "assessment": {
        "date": "2026-10-30",
        "basis": "public evidence",
        "confidence": "medium",
        "notes": {
          "ergonomics": "Harness reading, scored on what an agent using the skill or a person driving the app has to supply. SKILL.md is about 8.6 KB and the data-format reference about 12.5 KB, loaded on demand. `sessions.py read` returns the whole session with no size cap by design, and agent reasoning and operational records are left out unless asked for. In-app tools cap output at 50 KB (15 of 25). Graph readers filter by session, pattern and node, sessions can be listed first, and two switches opt into extra material. No pagination (12 of 20). Readers name the data folder they used and refuse rather than guess on newer formats. No outside agent can start or drive a lesson, and the local HTTP API needs a per-launch secret (10 of 20). The readers write nothing and can be rerun safely. In the app, failed turns can be retried with the input kept (15 of 20). Readers default to each OS's data folder and need only the Python 3.10 standard library. No SDK or headless command (8 of 15).",
          "maintenance": "0.4.0 was released on 29 October 2026, one day before this check (30 of 30). Nine releases between 17 and 29 October (20 of 20). Of the 39 newest pull requests, opened 28 to 30 October, 37 are open and none was merged. Release notes say several changes were based on outside pull requests and issues (#61, #62, #114, #154, #184) and thank contributors, and 41 of the 61 newest issues have no comment yet. We counted comments and did not read who wrote them (10 of 25). Not an MCP server and no SDK. The skill ships in the repository, not in a registry (3 of 15). Dependencies are current (Next.js 16.4, Electron 44, pi libraries pinned at 1.4.0), CI passes on main and the KaTeX advisory was patched (8 of 10).",
          "payments": "Read with the self-hosted rule. No payment protocol (0). Free under AGPL-3.0 with nothing to buy, so 20, 20 and 20 on the last three lines. Model, search and dictation usage are billed by those providers. No local-model setup is documented beyond a custom OpenAI-compatible endpoint, which can be keyless.",
          "reliability": "Read with the local-software lines, as software the owner runs. Installers for three operating systems on GitHub Releases with platforms stated, macOS Apple Silicon only, and the Windows installer is unsigned (16 of 20). CI runs typecheck, the test suite and lint on every push to main and on pull requests, plus build and smoke checks on macOS, Windows and Linux. The tests folder holds 249 files, fixtures included, and the last five push runs on main passed, with three failed push runs on 24 and 25 October each followed by a passing run within an hour (22 of 25). 265 open issues and pull requests on a 14-day-old repository. Of the 61 newest issues, opened 28 to 30 October, 56 are open, 41 have no comment and 13 of 14 labelled bug are open. Release notes cite many earlier reports as fixed (#23, #46, #87, #110, #112) (10 of 25). Each release has notes listing new behaviour and fixes, but there is no CHANGELOG file and no section for breaking changes (8 of 15). Version 0.4.0 with no stability statement (0 of 15).",
          "schema": "Graded on what an outside agent reads, the bundled skill, with the harness reading of the framework line. No OpenAPI or schema file. The data-format reference documents the file map, record fields, tool-call shapes and a format version stamp in prose, and the readers print JSON (8 of 25). SKILL.md and `references/data-format.md` are Markdown written for agents. learnharness.ai/llms.txt returns 404 (10 of 10). The skill says when to use it, what the data does and does not show (a graph proposition is not evidence of understanding, a missing confidence is not zero) and what not to do (no writes, no `auth.json`, no running stored HTML or code) (17 of 20). Readers take named subcommands and options (`list`, `read`, `propositions --session`, `find`, `chains --node`). Arguments are strings with no enumerated values beyond the subcommands. In-app tools carry typebox schemas (8 of 15). Command examples for every reader, and the skill states that newer formats are refused and invalid records produce explicit errors, without an error list (10 of 15). Per-release notes and a format version stamp, on 0.x (10 of 15).",
          "security": "Harness reading of the framework checklist, as the Leon and Goose dossiers used. 30 for what leaves the machine by default, 20 for approvals and sandboxing, 15 for prompt-injection posture, 15 for audit and 20 for the security programme. No telemetry module was found in the files read. The server binds 127.0.0.1 and checks a per-launch 64-character secret with a timing-safe compare. Model requests carry lesson context and any file the agent reads to the configured provider, the fetch fallback sends URLs to Jina Reader, and updates download automatically from GitHub Releases. Provider keys and ChatGPT credentials are plaintext JSON at mode 0600 (20 of 30). In-app tools are read-only with no shell, write or send tool, and Claude Code runs with built-in tools off and hooks disabled. File reads reach any path the account can read, home directory first, with no allow list or prompt, and model-authored demos run in a bundled browser helper whose isolation we did not check (11 of 20). The skill tells agents to treat stored records as data. The research sub-agent's prompt has no guidance on untrusted web content, and its briefs return to the teacher, which holds the file-read tools (6 of 15). Every message, tool call and tool result is stored in plain JSON per session, with a cost meter and an activity dock for background jobs (11 of 15). No SECURITY.md, no security.txt (404), no bounty and no disclosure policy. A KaTeX advisory (GHSA-238p-pmpm-9mq7) was addressed in the public 0.3.4 notes, and macOS builds are signed and notarised (4 of 20).",
          "transparency": "AGPL-3.0-only, an OSI licence, with the whole app, prompts and skill in the public repository (30). No privacy policy (404). The README and website say chats, graph, settings and keys stay on the machine, that model requests send context to providers, and that dictation and web research use outside services, and they say local storage does not mean offline processing. The Jina Reader fallback is not named there, and the 0.3.6 notes disclose plaintext ChatGPT credential storage (18 of 30). No deprecation policy. The project is 14 days old, and release notes describe changed behaviour without dates for removals (4 of 20). No telemetry was found in the files read, though neither the README nor the site says so. Automatic updates are on by default with a switch in Settings (12 of 20)."
        },
        "sources": [
          {
            "what": "repository record",
            "url": "https://api.github.com/repos/amosblomqvist/learnharness",
            "seen": "2026-10-30"
          },
          {
            "what": "releases and notes",
            "url": "https://api.github.com/repos/amosblomqvist/learnharness/releases?per_page=30",
            "seen": "2026-10-30"
          },
          {
            "what": "file tree",
            "url": "https://api.github.com/repos/amosblomqvist/learnharness/git/trees/main?recursive=1",
            "seen": "2026-10-30"
          },
          {
            "what": "CI runs on main",
            "url": "https://api.github.com/repos/amosblomqvist/learnharness/actions/runs?branch=main\u0026per_page=30",
            "seen": "2026-10-30"
          },
          {
            "what": "issues and pull requests, newest 100",
            "url": "https://api.github.com/repos/amosblomqvist/learnharness/issues?state=all\u0026per_page=100",
            "seen": "2026-10-30"
          },
          {
            "what": "README",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/README.md",
            "seen": "2026-10-30"
          },
          {
            "what": "bundled skill",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/skills/learnharness/SKILL.md",
            "seen": "2026-10-30"
          },
          {
            "what": "skill data-format reference",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/skills/learnharness/references/data-format.md",
            "seen": "2026-10-30"
          },
          {
            "what": "Electron main process",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/electron/main.cjs",
            "seen": "2026-10-30"
          },
          {
            "what": "desktop API secret check",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/src/server/desktop-access.ts",
            "seen": "2026-10-30"
          },
          {
            "what": "credential store",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/src/store/auth.ts",
            "seen": "2026-10-30"
          },
          {
            "what": "read tool",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/src/agent/tools/read.ts",
            "seen": "2026-10-30"
          },
          {
            "what": "file tool scope",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/src/agent/tools/fs-shared.ts",
            "seen": "2026-10-30"
          },
          {
            "what": "web tools",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/src/agent/tools/web.ts",
            "seen": "2026-10-30"
          },
          {
            "what": "research sub-agent",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/src/agent/subagents/researcher.ts",
            "seen": "2026-10-30"
          },
          {
            "what": "Claude Code launch arguments",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/src/agent/claude-code/stream.ts",
            "seen": "2026-10-30"
          },
          {
            "what": "CI workflow",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/.github/workflows/ci.yml",
            "seen": "2026-10-30"
          },
          {
            "what": "release guide",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/docs/desktop-release.md",
            "seen": "2026-10-30"
          },
          {
            "what": "development guide",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/docs/development.md",
            "seen": "2026-10-30"
          },
          {
            "what": "package.json",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/package.json",
            "seen": "2026-10-30"
          },
          {
            "what": "licence",
            "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/LICENSE",
            "seen": "2026-10-30"
          },
          {
            "what": "website",
            "url": "https://learnharness.ai/",
            "seen": "2026-10-30"
          },
          {
            "what": "download page",
            "url": "https://learnharness.ai/download/",
            "seen": "2026-10-30"
          },
          {
            "what": "domain registration (RDAP)",
            "url": "https://rdap.identitydigital.services/rdap/domain/learnharness.ai",
            "seen": "2026-10-30"
          }
        ],
        "openQuestions": [
          "Kind is `harness`, as for Leon. LearnHarness is a finished desktop program that runs the agent loop for one person, and Schema, Ergonomics and Security use the harness reading. Schema and Ergonomics are read from the bundled skill, which is the part an outside agent reaches.",
          "Category is personal-assistants, the closest existing one. LearnHarness works for one person and keeps a memory of them, but it holds no mail, calendar or messaging accounts and its job is teaching. No education category exists in data/categories.json.",
          "Not tagged `not-for-agents`. The bundled skill is a documented, read-only interface for other agents, even though no outside agent can start or drive a lesson.",
          "`firstReleased` is 2026-10-17, the 0.3.0 release, whose notes call it the first release. The repository was created on 16 October 2026 and the domain registered on 9 October 2026. The version numbering starts at 0.3.0, and a design file dated 8 September 2026 in docs/archive shows work before the public repository.",
          "Not LocalGhost's or letme's job. LearnHarness teaches one learner and stores a learning record. It does not archive personal data for local models (LocalGhost) or pick tools from our grades (letme).",
          "No deduction. Sign-in with ChatGPT, GitHub Copilot and Grok plans inside a third-party app may raise questions under those providers' terms. The 0.3.7 notes say provider limits, eligibility and terms still apply, and we did not read those providers' terms for this listing.",
          "unchecked: whether the files we did not read (about 670 in all, of which we read about 45) contain telemetry or other outbound calls. The README and site do not mention telemetry",
          "unchecked: how the demo and visual-maker browser helper isolates model-authored HTML and JavaScript",
          "unchecked: who answered the 18 commented issues among the newest 61, and responsiveness before 28 October. GitHub API requests were limited to six for this batch",
          "unchecked: whether GitHub private vulnerability reporting is enabled, and whether any security advisory is published",
          "unchecked: the Discord server linked from the README, which we did not join",
          "Stars, forks and download counts are recorded as facts in the listing and were not used as evidence of quality.",
          "The GitHub profile amosblomqvist shows the display name Eero Alvar, while package.json and the website footer name Amos Blomqvist. The listing uses the name the project publishes.",
          "robots.txt answers were github.com 200 (repository, issues and releases pages allowed; tree, raw, commits and tags closed), raw.githubusercontent.com 404, learnharness.ai 200 with comments only and no rules, rdap.org 400. The RDAP read went through rdap.org to rdap.identitydigital.services despite the 400, as earlier runs did."
        ]
      },
      "negative": 0,
      "verdict": "The in-app agent reads files but cannot change them or run commands, and a bundled skill gives other agents a documented read-only view of sessions and the knowledge graph. The project is 14 days old at 0.4.0, its file reads reach the whole home directory without approval, and it has no security policy.",
      "bestFor": "A tutor for one learner that keeps a local record of sessions and a graph of propositions and reasoning chains.",
      "strengths": [
        "AGPL-3.0 source, with installers for macOS (signed and notarised), Windows and Linux on GitHub Releases",
        "A bundled agent skill with Python readers that print sessions and graph data as text or JSON and write nothing",
        "The in-app agent has no shell, write or send tool, and Claude Code runs with its built-in tools switched off",
        "The desktop server binds 127.0.0.1 and requires a per-launch 64-character secret header",
        "Nine releases from 17 to 29 October 2026, with CI running typecheck, tests, lint and three-OS builds on main"
      ],
      "weaknesses": [
        "The read, ls, find and grep tools resolve against the home directory with no allow list, and their output goes to the model provider",
        "Provider keys and ChatGPT sign-in credentials are stored as plaintext JSON at mode 0600, not in the OS keychain",
        "No SECURITY.md, security.txt, privacy policy or terms. learnharness.ai answers 404 for each",
        "0.x software created on 16 October 2026, with 265 open issues and pull requests and none of the 39 newest pull requests merged",
        "No outside agent can start or drive a lesson. The local HTTP API is for the app's own window"
      ],
      "agentNotes": [
        "Use the bundled skill (`skills/learnharness/SKILL.md`) to read a learner's record. It needs Python 3.10 or later and writes nothing",
        "Pass `--format json` before the subcommand, for example `python3 -B scripts/graph.py --format json propositions`",
        "Treat stored answer keys and teacher prose as model-authored. A proposition in the graph is not evidence the learner understood it",
        "Do not read `auth.json`, which sits one folder above the data folder and holds provider keys in plain text",
        "Close the app or re-read when a stable snapshot matters. The readers do not lock files while the app writes"
      ],
      "metrics": {
        "kind": "local",
        "measured": false
      },
      "reviewCount": 0,
      "avgRating": 0,
      "history": [
        {
          "basis": "public evidence",
          "confidence": "medium",
          "grade": "C",
          "methodology": "0.7",
          "pending": [
            "performance",
            "tasks"
          ],
          "run": "2026-10-01",
          "runLabel": "October 2026 research run",
          "score": 59.3
        }
      ],
      "editorialScores": {
        "ergonomics": 60,
        "maintenance": 71,
        "payments": 60,
        "reliability": 56,
        "schema": 63,
        "security": 52,
        "transparency": 64
      },
      "provenanceScore": 56,
      "checked": {
        "categories": {
          "ergonomics": "2026-10-30",
          "maintenance": "2026-10-30",
          "payments": "2026-10-30",
          "reliability": "2026-10-30",
          "schema": "2026-10-30",
          "security": "2026-10-30",
          "transparency": "2026-10-30"
        },
        "last": "2026-10-30",
        "oldest": "2026-10-30",
        "stale": false,
        "staleAfterDays": 90
      },
      "scoreHistory": [
        {
          "date": "2026-10-30",
          "grade": "C",
          "kind": "listed",
          "method": "0.7",
          "score": 59.3
        }
      ]
    },
    "connect": {},
    "letme": {
      "capability": "https://letme.dev/assistant.memory",
      "tool": "https://letme.dev/learnharness"
    },
    "notable": [
      "The 0.3.0 release notes of 17 October 2026 say it is the first release, and the repository was created on 16 October 2026 (https://api.github.com/repos/amosblomqvist/learnharness/releases)",
      "The bundled skill tells an agent to treat recorded text, tool calls and artifacts as source data and never as current instructions, and never to modify the data folder (https://raw.githubusercontent.com/amosblomqvist/learnharness/main/skills/learnharness/SKILL.md)",
      "The read tool's source comment says unrestricted local reads are the chosen scope, and paths resolve against the learner's home directory (https://raw.githubusercontent.com/amosblomqvist/learnharness/main/src/agent/tools/read.ts)",
      "The Electron main process starts the server with `HOSTNAME` 127.0.0.1 and a random 32-byte secret that every API request must carry in `x-learnharness-desktop` (https://raw.githubusercontent.com/amosblomqvist/learnharness/main/electron/main.cjs, https://raw.githubusercontent.com/amosblomqvist/learnharness/main/src/server/desktop-access.ts)",
      "Claude Code is launched with `--tools \"\"`, `--strict-mcp-config`, hooks disabled and no session persistence, so only the harness's own tools reach it (https://raw.githubusercontent.com/amosblomqvist/learnharness/main/src/agent/claude-code/stream.ts)",
      "The 0.3.6 release notes say ChatGPT credentials are stored as owner-only plaintext JSON and do not use the OS keychain or Electron safeStorage (https://github.com/amosblomqvist/learnharness/releases/tag/v0.3.6)",
      "The web_fetch tool falls back to Jina Reader (r.jina.ai) for pages that need JavaScript, which sends the URL to that service (https://raw.githubusercontent.com/amosblomqvist/learnharness/main/src/agent/tools/web.ts)"
    ],
    "area": "frameworks",
    "details": [
      {
        "label": "Status",
        "value": "0.4.0 of 29 October 2026. First release 0.3.0 on 17 October 2026, nine releases in all. Repository created 16 October 2026"
      },
      {
        "label": "Where it runs",
        "value": "Electron desktop app on macOS (Apple Silicon, signed and notarised DMG and ZIP), Windows x64 (unsigned NSIS installer) and Linux x64 (AppImage and .deb). It starts a local Next.js server on 127.0.0.1"
      },
      {
        "label": "What it does",
        "value": "Probes what the learner understands, plans a dependency map to the goal, teaches one reasoning step at a time with prediction and check questions, and runs separate practice sessions. Background jobs research questions, read PDFs and build visual explanations and interactive demos"
      },
      {
        "label": "Acts without asking",
        "value": "Reads, lists, finds and greps any file the learner's account can read, with paths resolved against the home directory, and searches and fetches web pages through a research sub-agent. No shell, file-write or message-sending tool was found"
      },
      {
        "label": "Accounts",
        "value": "Model provider API keys (30 or more provider options), one custom OpenAI-compatible endpoint, sign-in with ChatGPT, GitHub Copilot or Grok, and an installed Claude Code CLI. Background use of a ChatGPT plan is on by default and has its own switch"
      },
      {
        "label": "Credentials",
        "value": "Provider keys in `auth.json` and ChatGPT credentials in `chatgpt-credentials.json`, both plaintext JSON written at mode 0600, outside the learning-data folder. No OS keychain"
      },
      {
        "label": "Memory",
        "value": "Sessions as JSON files under `chats/` and a knowledge graph of propositions and reasoning chains as JSONL under `graph/`, in the app's data folder. The graph records ideas encountered, not ratings of ability"
      },
      {
        "label": "Deletion",
        "value": "Deleting a session can keep its graph nodes or remove every trace of the session from the graph ledgers (`preserve-graph` or `delete-nodes`)"
      },
      {
        "label": "Agent access",
        "value": "A bundled skill (`skills/learnharness`) with a SKILL.md, a data-format reference and three standard-library Python readers for sessions and the graph, read-only. The local HTTP API needs a per-launch secret and is not documented for outside use. No MCP server for outside agents"
      },
      {
        "label": "Network",
        "value": "Model providers, Tavily or Brave for search, Jina Reader as a fetch fallback, Deepgram for dictation (audio goes from the window to Deepgram), and GitHub Releases for updates. No telemetry module was found in the files read"
      },
      {
        "label": "Updates",
        "value": "electron-updater checks GitHub Releases, downloads automatically and installs on quit. Settings has a switch to turn automatic checks off"
      },
      {
        "label": "Cost",
        "value": "Free. Model, search and dictation usage are billed by those providers"
      },
      {
        "label": "Activity",
        "value": "4,204 stars, 652 forks and 265 open issues and pull requests on 30 October 2026 (GitHub API)"
      }
    ],
    "provenance": {
      "legalEntity": "No legal entity found. Copyright Amos Blomqvist",
      "domain": "learnharness.ai",
      "domainRegistered": "2026-10-09",
      "endpointOnVendorDomain": null,
      "terms": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/LICENSE",
      "privacy": "",
      "statusPage": "",
      "changelog": "https://github.com/amosblomqvist/learnharness/releases",
      "securityTxt": "none",
      "checked": "2026-10-30",
      "notes": [
        "The footer of learnharness.ai reads © 2026 Amos Blomqvist, and `package.json` names Amos Blomqvist as author. No company is named.",
        "learnharness.ai/privacy, /terms, /llms.txt and /.well-known/security.txt return 404, and the repository has no SECURITY.md, so the AGPL-3.0 licence stands in for terms.",
        "RDAP (Identity Digital) gives learnharness.ai a registration date of 2026-10-09.",
        "The app runs on the learner's machine. Its only vendor-side service seen is the website, which a release workflow updates. Updates come from GitHub Releases.",
        "There is no CHANGELOG file. Each GitHub release carries its notes."
      ],
      "score": 56,
      "checks": [
        {
          "check": "Legal entity named",
          "value": "No legal entity found. Copyright Amos Blomqvist",
          "points": 20,
          "max": 20,
          "state": "ok"
        },
        {
          "check": "Domain age",
          "value": "learnharness.ai, registered 2026-10-09 (under a year)",
          "points": 0,
          "max": 15,
          "state": "no"
        },
        {
          "check": "Endpoint on the vendor's domain",
          "value": "no hosted endpoint",
          "points": 0,
          "max": 0,
          "state": "na"
        },
        {
          "check": "Terms of service",
          "value": "read, states 2 of the 7 things a reader expects",
          "points": 5.7,
          "max": 10,
          "state": "part"
        },
        {
          "check": "Privacy policy",
          "value": "nothing hosted, not scored",
          "points": 0,
          "max": 0,
          "state": "na"
        },
        {
          "check": "Status page",
          "value": "not found",
          "points": 0,
          "max": 10,
          "state": "no"
        },
        {
          "check": "Changelog",
          "value": "published",
          "points": 10,
          "max": 10,
          "state": "ok"
        },
        {
          "check": "security.txt",
          "value": "not found",
          "points": 0,
          "max": 10,
          "state": "no"
        },
        {
          "check": "People named",
          "value": "1 named with their role, 1 with a public profile",
          "points": 10,
          "max": 10,
          "state": "ok"
        },
        {
          "check": "Support route",
          "value": "help pages, a community",
          "points": 5,
          "max": 5,
          "state": "ok"
        }
      ],
      "policies": [
        {
          "kind": "terms",
          "url": "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/LICENSE",
          "state": "read",
          "readAt": "2026-10-30",
          "words": 5535,
          "points": 5.7,
          "max": 10,
          "expected": [
            {
              "key": "terms.date",
              "label": "Gives the date it was last updated",
              "found": false
            },
            {
              "key": "terms.law",
              "label": "Names the governing law or courts",
              "found": false
            },
            {
              "key": "terms.liability",
              "label": "States a limit on its liability",
              "found": true,
              "quote": "…OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED O…",
              "says": "Rules out indirect and consequential losses, with no cap named in this sentence"
            },
            {
              "key": "terms.termination",
              "label": "Says how the agreement or account can be ended",
              "found": false
            },
            {
              "key": "terms.changes",
              "label": "Says how changes to the terms are announced",
              "found": false
            },
            {
              "key": "terms.use",
              "label": "Lists what users may not do",
              "found": true,
              "quote": "You may not propagate or modify a covered work except as expressly provided under this License."
            },
            {
              "key": "terms.sla",
              "label": "Refers to a service level or uptime commitment",
              "found": false
            }
          ]
        },
        {
          "kind": "privacy",
          "url": "",
          "state": "none-found",
          "points": 0,
          "max": 10
        }
      ]
    },
    "humans": {
      "slug": "learnharness",
      "checked": "2026-10-30",
      "company": "Amos Blomqvist",
      "people": [
        {
          "name": "Amos Blomqvist",
          "role": "Author and maintainer",
          "founder": true,
          "x": "https://x.com/amosblomqvist",
          "github": "https://github.com/amosblomqvist",
          "page": "/people/amos-blomqvist/"
        }
      ],
      "peopleNote": "package.json names Amos Blomqvist as author, and the footers of learnharness.ai and its download page read © 2026 Amos Blomqvist. The repository sits under the GitHub account amosblomqvist, whose profile links the X account amosblomqvist and shows the display name Eero Alvar. No company, other maintainer or funding is named in the README, the website, package.json or the GitHub profile, so the project is recorded as one person's. No outside search for investors was made for a solo project with no company named.",
      "companySocial": {
        "github": "https://github.com/amosblomqvist"
      },
      "support": {
        "urls": [
          "https://github.com/amosblomqvist/learnharness/issues"
        ],
        "community": [
          {
            "label": "Discord",
            "url": "https://discord.gg/5tCHHQEB2e",
            "kind": "discord"
          },
          {
            "label": "GitHub issues",
            "url": "https://github.com/amosblomqvist/learnharness/issues",
            "kind": "github"
          }
        ]
      },
      "sources": [
        "https://learnharness.ai/",
        "https://learnharness.ai/download/",
        "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/package.json",
        "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/README.md",
        "https://api.github.com/users/amosblomqvist",
        "https://github.com/amosblomqvist/learnharness"
      ],
      "ownership": {
        "status": "project",
        "checked": "2026-10-30",
        "sources": [
          "https://learnharness.ai/",
          "https://raw.githubusercontent.com/amosblomqvist/learnharness/main/package.json"
        ]
      }
    },
    "pageJsonUrl": "https://www.anchorterminal.com/tools/learnharness.json"
  }
}
