Eleven skills for conference speakers covering rhetoric analysis, talk authoring, deck building and export, CFP submissions, publishing, illustrations, shownotes, and screencast production, informed by a 113-entry Presentation Patterns taxonomy (83 observable: 64 patterns + 19 antipatterns; 30 unobservable: 21 patterns + 9 antipatterns).
90%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Read publishing_process.qr_code. Before provider or deck effects, resolve the
shared runtime without --read-only and require the owner-current database.
Read the confirmed slug and URL from the non-owner outline JSON. Verify the
configured target is live before encoding it. Require only the selected direct
API provider token, not Gemini/image-provider keys. MCP-preresolved and explicit
shortener: none do not require direct API credentials.
For the configured workflow, skip when disabled; a direct QR request selects this action explicitly. Follow the provider/domain choices below:
Determine the URL to encode:
target is shownotes_url, use the shownotes URL from the verified shownotes resulttarget is custom_url, use the custom_url fieldResolve URL shortening using one of these paths:
| Path | Short URL resolution | QR image |
|---|---|---|
| MCP (preferred when configured) | Agent calls Bitly/Rebrandly MCP tool, passes --short-url and --shownotes-url to script | Script generates locally from the resolved URL |
| Direct API | Script calls bit.ly/rebrand.ly REST API via secrets.json | Script generates locally |
None (explicit "shortener": "none" only) | Script uses the raw shownotes URL | Script generates locally |
MCP path (preferred when Bitly or Rebrandly MCP server is installed):
npx @bitly/mcp — covers link creation, update, QR, and analyticsgenerate-qr.py via --short-url--shownotes-url is ALWAYS required — it is the canonical redirect target the
catalog records. Passing only the short URL would make the record claim the
short link redirects to itself--short-provider and --short-link-id so the catalog keeps the real
provider identity instead of the generic mcp_preresolved markerDirect API path (when MCP is not available):
{vault_root}/secrets.json with chmod 600:
{
"bitly": {"api_token": "..."}
}rebrandly.api_key instead.secrets.json and calls the chosen shortener's REST API directlyshortener field in the profile controls which service to useNone path (no shortening):
"shortener": "none" in the profilerules/qr-generation-rules.md §2, §6, §7)First short link — confirm the custom domain: before a short link is created
for the first time, ensure publishing_process.qr_code.{shortener}_domain is
recorded in the profile. If the key is absent, ASK the user whether they have a
custom domain (e.g. jbaru.ch) and SAVE the answer — the domain, or null for
"no custom domain" — then proceed. See rules/qr-generation-rules.md §8. The
Direct API path enforces this (the script STOPS if the key is absent); on the MCP
path make the check before resolving the link.
Run the QR generation script:
# MCP-preresolved mode (--shownotes-url is the canonical redirect target):
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/generate-qr.py" deck.pptx \
--talk-slug SLUG --shownotes-url SHOWNOTES_URL --short-url SHORT_URL \
--short-provider bitly --short-link-id LINK_ID
# Direct API mode:
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/generate-qr.py" deck.pptx \
--talk-slug SLUG --shownotes-url SHOWNOTES_URL \
--vault /path/to/vault
# No shortening:
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/generate-qr.py" deck.pptx \
--talk-slug SLUG --shownotes-url SHOWNOTES_URL
# PNG-only (no deck — for presenterm, PDF, or standalone use):
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/generate-qr.py" --png-only \
--talk-slug SLUG --shownotes-url SHOWNOTES_URL \
--output /path/to/qr.png --bg-color 128,0,128The script is a non-owner dual reader and a current-schema writer. Dry-run accepts every readable database generation without changing it; the generations are defined by the owner schema. A real run requires the current database schema before URL-shortener calls, deck edits, or tracking persistence. Route a legacy database through vault-ingress Step 1. An unsupported future database or record version is no usable prior state.
The script will:
skills/presentation-creator/scripts/generate-qr.py (qr_publication_lock
docstring) for the lock's scope and placementcommit_qr_record docstring in the same script for what it rebases and
what it refuses{"error": "qr_publication_unfinalized", ...} with retry,
atomic_rollback, and an effects[] entry per landed effect, each
carrying its own rollback action. Render it for the operator; do not
restate its fields here. See unfinalized_effects_payload in
skills/presentation-creator/scripts/generate-qr.py. The run makes no
tracking-database change in that caseqr_codes[] — including one
artifacts[] receipt per generated PNG — through the shared
tracking-database transaction used by generate-qr.pycommit_qr_recordRe-running for the same talk_slug with a different target URL is safe:
printed QR codes stay valid. Which link a run reuses, retargets, or creates is
decided by resolve_short_url in
skills/presentation-creator/scripts/generate-qr.py — see its docstring.
No raw-dogging: NEVER bypass generate-qr.py with hand-rolled python-pptx or
direct qrcode library calls. If the script targets the wrong slides, uses the wrong
shortener, or produces the wrong colors — fix the inputs (profile config, secrets,
arguments), don't patch the outputs with ad-hoc code. The script is the single source
of truth for QR generation; working around it silently drops shortening, tracking,
and color matching.
Dependencies and failure behavior belong to generate-qr.py; use the configured interpreter and runtime repair flow when a dependency is unavailable.
.tessl-plugin
rules
skills
cfp-writer
references
illustrations
presentation-builder
presentation-creator
references
patterns
build
deliver
prepare
scripts
presentation-publisher
screencast-editor
screencast-recorder
shownotes-publisher
vault-clarification
vault-ingress
references
scripts
vault-profile