Deliverables and PDFs¶
When to read this. Your item produces a tangible output — a report, a design doc, an incident post-mortem — and you want it to show up on the card with a download link and an embedded viewer.
Deliverables are a first-class concept: a ## Deliverables section in a README lists one or more PDF files, and condash renders a download badge on the card plus a viewer in the expanded card.
The ## Deliverables section¶
Add to your README:
## Deliverables
- [Plugin API proposal — current draft](deliverables/plugin-api-proposal.pdf) — Distributed to the team for review, 2026-04-15.
- [Appendix A: risks](deliverables/plugin-api-proposal-appendix-a.pdf)
Per line:
- Label — text shown on the card and in the viewer header.
- Path — relative to the item's directory. Must end in
.pdf. - Description (optional, after
—) — a one-line note shown under the label.
Multiple deliverables per item are fine; each gets its own card row.
Filename convention¶
Place PDFs under <item>/deliverables/. The directory exists for exactly this: to separate generated outputs from editable notes. condash scans the filesystem lazily, so the directory only needs to exist when at least one deliverable is linked.
Slug the filename to match the item: <item-slug>.pdf for the primary deliverable, <item-slug>-<suffix>.pdf for secondary ones. This keeps them discoverable in bare ls listings without peeking inside each item.
What the card looks like¶

- A PDF badge on the collapsed card tells you "this item has a deliverable".
- Expanded, the Deliverables section lists every entry with its label and description.
- Clicking a label opens the file in an embedded PDF viewer modal.
- A Download icon next to the label saves the PDF to your OS.
The embedded viewer uses pdf.js, vendored under frontend/vendor/pdfjs/. No external dependency; the viewer works offline.
Generating the PDF¶
condash doesn't generate PDFs — you do, from whatever source lives alongside the item. The common shape:
- Write the body as Markdown under
<item>/notes/<name>.md. - Convert with
~/.claude/scripts/md_to_pdf.sh(pandoc + xelatex + mermaid-filter):
cd <conception_path>/projects/2026-04/2026-04-08-plugin-api-proposal
bash ~/.claude/scripts/md_to_pdf.sh notes/draft.md deliverables/plugin-api-proposal.pdf
The script handles heading-level shifts, section numbering, Mermaid diagrams, and French accents. See the global CLAUDE.md in your home directory for the full recipe.
Refresh the dashboard; the PDF badge lights up and the viewer picks up the file. No extra registration step.
Overriding the viewer¶
If you'd rather open PDFs in your OS-native viewer (Evince, Okular, Preview, Sumatra, …), configure the pdf_viewer fallback chain in preferences.yml:
Rules:
- The value is a bare list of
"<command> {path}"strings. Notpdf_viewer.commands = [...]— that shape was considered and rejected; condash errors on startup if it sees a nested object. - Commands are tried in order; the first one whose binary resolves on
$PATHwins. {path}is the absolute path of the PDF.- With
pdf_viewerset, clicking the label still opens the embedded viewer, but the viewer's Open externally button uses your chain. If you setpdf_viewerto an empty list (or omit it), the button falls back toxdg-open/ OS default.
To remove the embedded viewer entirely and go straight to the external chain: not currently supported — the embedded viewer is the default and you go external on a per-click basis.
Deliverable lifecycle¶
Items that ship a deliverable go through a pattern:
- Early —
## Deliverablessection exists but is empty or links to a stub PDF that says "draft pending". - Review — regenerate the PDF from the latest Markdown; status moves to
review; share the PDF with reviewers. - Final — one last regeneration after review comments land; status moves to
done.
If the deliverable is a living document (a standards doc, a runbook), skip the done status — leave the item in review and keep regenerating when needed. The status model is yours to interpret.
Do not check multiple versioned PDFs into the deliverables directory (…-v1.pdf, …-v2.pdf). Keep one canonical filename and rely on git for history. The card renders every .pdf file listed in the section, not every file on disk.
Next¶
- Search your history — note that PDF content is not indexed, only the filename. Keep the source Markdown in
notes/if you want the text searchable.