{
 "kind": "app",
 "id": "app:marker",
 "url": "https://headlesson.com/apps/marker",
 "name": "Marker",
 "one_liner": "Local document converter with Markdown, JSON and optional hybrid LLM processing.",
 "description": "Marker converts documents through a local model pipeline. It can emit Markdown, JSON or HTML and optionally use selected external LLM providers. A Streamlit interface and a FastAPI server are separate usage surfaces.",
 "made_by_headlesson_operator": false,
 "interfaces": [
  {
   "kind": "cli",
   "name": "Marker CLI",
   "install": "pip install marker-pdf",
   "verify": "marker_single --help",
   "auth": "unknown",
   "docs": "https://github.com/datalab-to/marker/blob/master/README.md"
  },
  {
   "kind": "rest",
   "name": "Marker local HTTP API server (small-scale)",
   "install": "pip install marker-pdf\npip install -U uvicorn fastapi python-multipart",
   "verify": "unknown",
   "auth": "unknown",
   "docs": "https://github.com/datalab-to/marker/blob/master/README.md"
  }
 ],
 "tests": [
  {
   "record_id": "test:lq2atao",
   "url": "https://headlesson.com/tests/lq2atao",
   "date": "2026-10-11",
   "version": "2.0.0",
   "status": "partial"
  }
 ],
 "latest_test_conclusion": "On 2026-10-11, the headlesson operator ran this lesson with Marker 2.0.0 (macOS26.5.2 arm64; Python3.11.13 disposable venv; wheel-only PyPI installation; no LLM use); the first 2 of 4 steps passed, then it stopped: Step3 conversion needs additional artifacts/models; exact marker_single ./sample.pdf first requests missing official font. Safety guard blocked this HTTP request before sending; no output created. Model download not performed. The final Next step is advice and was not run. An independent check (revision 3fadc9d) covered: Independent trial and audit up to install and help; the conversion step's font download was stopped by a guard and produced no output. Its limits: Bounded to the stopping point. Conversion after font and model preparation is unverified. This is the operator's own run, not a vendor claim.",
 "independent_check": {
  "state": "recorded",
  "revision": "3fadc9d6215b5a823c490dfc86f16d93dac683b2",
  "scope": "Independent trial and audit up to install and help; the conversion step's font download was stopped by a guard and produced no output.",
  "limits": "Bounded to the stopping point. Conversion after font and model preparation is unverified."
 },
 "lesson": {
  "goal": "Convert an owner-chosen local PDF without enabling optional remote LLM processing.",
  "steps": [
   "pip install marker-pdf",
   "marker_single --help",
   "marker_single ./sample.pdf",
   "Inspect the generated output against the source PDF."
  ],
  "next_advice": "Next: Select the real PDF and destination, run marker_single <confirmed-PDF-path>, and compare text, tables and equations with the original. Choose --output_format json for structured output; only enable --use_llm after agreeing on provider, data transfer, cost and model-weight terms.",
  "cautions": {
   "note": "These notes come from the lesson. Some describe failures seen in tests; others are general cautions. Each one is not a separately tested result.",
   "items": [
    "Python 3.10 or newer, PyTorch and an owner-provided local sample are prerequisites.",
    "Apache-2.0 and free code use do not establish unconditional rights to model weights. Modified model-weight terms and paid commercial licensing may apply.",
    "The optional --use_llm path can incur provider costs; the initial conversion steps do not enable it. Next treats LLM use as optional and requires the user's data-transfer, cost and model-term decision.",
    "The bundled REST server supports fewer flags than CLI/SDK and omits --use_llm and --disable_ocr.",
    "Conversion output is not independent evidence of transcription accuracy.",
    "Confirm: Check output location, recognition quality on this document, provider credentials/costs and applicable model-weight terms; optional LLM use is not an accuracy guarantee."
   ]
  },
  "note": "This is the current lesson. The test record above was run on the lesson as it was at its own revision; they can differ."
 },
 "mcp_get": "headlesson_get id=\"app:marker\" sections [\"lesson\",\"gotchas\"]",
 "axes": {
  "license": {
   "value": "Apache-2.0",
   "checked": "2026-10-09",
   "certainty": "primary",
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "by": "official"
  },
  "open_source": {
   "value": true,
   "checked": "2026-10-09",
   "certainty": "primary",
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "by": "official"
  },
  "pricing": {
   "value": "free",
   "checked": "2026-10-09",
   "certainty": "primary",
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "by": "official"
  },
  "has_human_gui": {
   "value": "optional",
   "checked": "2026-10-09",
   "certainty": "inferred",
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "by": "editorial"
  },
  "non_interactive": {
   "value": "unknown",
   "checked": null,
   "certainty": null,
   "source": null,
   "by": null
  },
  "machine_output": {
   "value": true,
   "checked": "2026-10-09",
   "certainty": "primary",
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "by": "official"
  },
  "local_mcp": {
   "value": "unknown",
   "checked": null,
   "certainty": null,
   "source": null,
   "by": null
  },
  "remote_mcp": {
   "value": "unknown",
   "checked": null,
   "certainty": null,
   "source": null,
   "by": null
  },
  "cli": {
   "value": true,
   "checked": "2026-10-09",
   "certainty": "primary",
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "by": "official"
  },
  "rest_api": {
   "value": true,
   "checked": "2026-10-09",
   "certainty": "primary",
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "by": "official"
  },
  "auth": {
   "value": "unknown",
   "checked": null,
   "certainty": null,
   "source": null,
   "by": null
  },
  "self_hostable": {
   "value": true,
   "checked": "2026-10-09",
   "certainty": "primary",
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "by": "official"
  },
  "embeds_llm": {
   "value": "yes",
   "checked": "2026-10-09",
   "certainty": "primary",
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "by": "official"
  },
  "refusal_contract": {
   "value": "unknown",
   "checked": null,
   "certainty": null,
   "source": null,
   "by": null
  },
  "audit_log": {
   "value": "unknown",
   "checked": null,
   "certainty": null,
   "source": null,
   "by": null
  },
  "last_release": {
   "value": "2026-07-20",
   "checked": "2026-10-09",
   "certainty": "primary",
   "source": "https://pypi.org/pypi/marker-pdf/json",
   "by": "official"
  },
  "ja_support": {
   "value": "unknown",
   "checked": null,
   "certainty": null,
   "source": null,
   "by": null
  }
 },
 "sources": [
  {
   "fields": [
    "/name",
    "/one_liner",
    "/lesson/cautions/items/1",
    "/lesson/cautions/items/3",
    "/interfaces/0/kind",
    "/interfaces/0/name",
    "/interfaces/0/install",
    "/interfaces/0/verify",
    "/interfaces/0/docs",
    "/axes/license",
    "/axes/open_source",
    "/axes/pricing",
    "/axes/machine_output",
    "/axes/cli",
    "/axes/rest_api",
    "/axes/self_hostable",
    "/axes/embeds_llm",
    "/relations/0"
   ],
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "checked": "2026-10-09",
   "certainty": "primary",
   "by": "official"
  },
  {
   "fields": [
    "/description",
    "/lesson/steps/0",
    "/lesson/steps/1",
    "/lesson/steps/2",
    "/interfaces/1/name",
    "/interfaces/1/install",
    "/interfaces/1/docs"
   ],
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "checked": "2026-10-09",
   "certainty": "primary",
   "by": "editorial"
  },
  {
   "fields": [
    "/lesson/goal",
    "/lesson/steps/3",
    "/lesson/cautions/items/0",
    "/lesson/cautions/items/4"
   ],
   "source": "headlesson editorial judgement",
   "checked": "2026-10-09",
   "certainty": "inferred",
   "by": "editorial"
  },
  {
   "fields": [
    "/lesson/next_advice",
    "/lesson/cautions/items/5"
   ],
   "source": "https://raw.githubusercontent.com/datalab-to/marker/master/README.md",
   "checked": "2026-10-10",
   "certainty": "inferred",
   "by": "editorial"
  },
  {
   "fields": [
    "/lesson/cautions/items/2"
   ],
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "checked": "2026-10-10",
   "certainty": "inferred",
   "by": "editorial"
  },
  {
   "fields": [
    "/interfaces/1/kind",
    "/axes/has_human_gui"
   ],
   "source": "https://github.com/datalab-to/marker/blob/master/README.md",
   "checked": "2026-10-09",
   "certainty": "inferred",
   "by": "editorial"
  },
  {
   "fields": [
    "/axes/last_release"
   ],
   "source": "https://pypi.org/pypi/marker-pdf/json",
   "checked": "2026-10-09",
   "certainty": "primary",
   "by": "official"
  }
 ],
 "primary_record": "Test results here are the operator's own past lesson trials (legacy). They are not claimed to meet level L1 of run-task-contract/0.1.0.",
 "relations": [
  {
   "type": "used-for",
   "to": "usecase:parse-documents-for-llm",
   "url": "https://headlesson.com/usecases/parse-documents-for-llm"
  }
 ],
 "relations_not_published": 1,
 "cite": "headlesson app:marker: see test record test:lq2atao (https://headlesson.com/tests/lq2atao).",
 "page_updated": "2026-10-13"
}
