# P5c implementation plan: PDFs already on a host > **For the implementing model:** do not work from this file. The owner gives you one task file > at a time. This file is the index for the owner and the reviewer. **Goal:** an agent with a PDF on disk (a Mattermost attachment, a download) gets the same answer as for a PDF URL — text with page markers, the map, pages, grep, cited digests — by uploading the bytes: `POST /v1/extract`, CLI `sift extract `. No poppler on the host, no shell `pdftotext`. The cache key is the content hash, so the same file is extracted once. | Task | Package | Given | |---|---|---| | 01-extract-api | `internal/api` | `api/extract_test.go` | | 02-extract-cli | `cmd/sift`, `README.md`, `skill/SKILL.md` | `cmd/sift/extract_test.go` | Runs after P5b (task 01 uses the P5b digest fields). Given tests compiled against a panic-only skeleton on master `1311cf3` and failed for the intended reasons. ## Changes during the run (none yet)