Interactive questionnaire
Skill Chevis-Zhou/agent-skills/skills/interactive-questionnaire
Claude Code skills I wrote and use daily — plus notes on how the skill system is designed. Copy anything.
npx -y skills add Chevis-Zhou/agent-skills --skill interactive-questionnaireAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 21 days oldThe repository was created 21 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Generate a polished, self-contained HTML questionnaire file that the client fills out in-browser and submits via email or clipboard. Use this skill whenever the user says "make a client form", "build an intake form", "turn these questions into a form", "design approval form", "I need more buy-in from [client]", "something more polished than an email", "interactive questionnaire", or whenever they want an elevated, visual, interactive alternative to a plain-text email questionnaire. Works at any project stage — kickoff, design direction approval, scope clarification, revision rounds, content gathering. Always trigger this skill (instead of drafting a plain markdown or email questionnaire) when the user signals they want visual polish, tappable binary choices, embedded reference previews, or a stronger nudge for the client to actually respond — even if they don't use those exact phrases.
SKILL.md
9.6 KB, ~2.1k tokens by cl100k_base, as published. Nobody here has run it
Interactive Questionnaire Skill
Generates one self-contained .html file the client opens in any browser. No backend, no install, no login required. Submissions are sent via mailto link (opens the client's email app pre-filled) or copied to clipboard. Both paths land in your inbox — set your address in references/config.md.
Use this skill when a plain email questionnaire won't cut it — when you want visual polish, a project push, or stronger buy-in. Use a plain email intake when that's enough.
Visual direction: when styling goes beyond the default template (brand override set, or a novel layout is needed), run your design-direction skill before building so this skill inherits its upgrades automatically.
When to use
- Any stage of a project: kickoff, mid-project design approval, scope clarification, revision confirmation, content gathering
- When the client needs to make binary choices (A vs B, light vs dark, serif vs sans) that are clearer as tappable options than prose descriptions
- When reference URLs need to be shown visually (screenshot previews) rather than listed as bare links
- When the project needs a push, the client is slow to respond, or a plain email won't convey professionalism
Don't use this skill for: quick one-question checks (reply inline), pure message communication, or a default post-deposit email intake where comprehensive prose is fine.
Step 1 — Gather context
Before drafting, confirm or collect:
| Field | Required | Source |
|---|---|---|
| Client name(s) + email(s) | Yes | User or project SSOT |
| Project name | Yes | User or project SSOT |
| Form purpose (1 sentence) | Yes | e.g. "Design direction approval" |
| Questions (the actual list) | Yes | User |
| Reference URLs | Optional | Per question, if applicable |
| "Why we're asking" context | Optional | Meeting notes, KB doc |
| Brand override | Optional | Default is the neutral blue template |
| Mobile-first flag | Optional | Only if the user explicitly says the client will use mobile |
If a required field is missing, ask once — briefly. If only optional fields are missing, proceed and flag what's missing at the end.
Step 2 — Classify each question
For each question, pick the right input pattern. See references/question-patterns.md for details.
Short version:
- A vs B → 2 radio cards, side-by-side (
q-options--binary) - A / B / C / D → stacked radio cards (
q-options--stacked) - Pick any that apply → checkboxes
- Open-ended → textarea with placeholder guidance
- Reference-linked choice → radio cards + reference card grid grouped with the question
Each question card has three parts: the question itself, an optional "why we're asking" blurb, and the input controls (plus optional reference cards and optional per-question note box).
Step 3 — Generate the HTML
Start from references/html-template.html. Fill in ALL placeholders:
| Placeholder | Fill with |
|---|---|
{{PROJECT_NAME}} | Project title shown in header eyebrow |
{{CLIENT_FIRST_NAME}} | Used in greeting and success state |
{{FORM_PURPOSE}} | 1-sentence header title (e.g. "Design direction — 5 decisions") |
{{INTRO_CONTEXT}} | 2–3 sentence "why this form exists" blurb |
{{ESTIMATED_MINUTES}} | Honest time estimate (e.g. "5 minutes") |
{{QUESTION_BLOCKS}} | All rendered question cards, in order |
{{FORM_ID}} | Kebab-case slug: {client}-{purpose}-{YYYYMMDD} — used for localStorage namespace |
{{PAYLOAD_LABELS}} | A JSON object { "field_name": "Q1 — Label", ... } for every form field; drives the email/clipboard text payload |
Note on {{PAYLOAD_LABELS}}: This must be valid JS object literal syntax (not a JSON string — it's injected directly into script). Example:
{ "q_color": "Q1 — Color scheme", "q_color_note": "Q1 — Color note", "email": "Client email" }
Reference card rendering (inside .q-references block)
Screenshot service: thum.io (free, no API key, works without credentials).
<section class="q-references" style="margin-bottom:40px;">
<p class="q-references-label">Reference sites</p>
<div class="q-references-grid">
<a class="ref-card" href="{{URL}}" target="_blank" rel="noopener noreferrer">
<img
src="https://image.thum.io/get/width/1280/crop/800/noanimate/{{URL}}"
alt="Preview of {{DOMAIN}}"
loading="lazy"
/>
<span class="ref-card-caption">① {{CAPTION}}</span>
</a>
</div>
</section>
The caption is the user's one-liner describing what the reference shows (e.g. "Bold layout, abstract + image mixed, sans serif"). Use ①②③④ circle numbers to cross-reference from question option sublabels.
Placeholder image on load failure: The template's JS automatically intercepts error events on .ref-card img and swaps in a browser-chrome mockup SVG. No changes needed to the HTML markup — it's handled automatically.
Mobile banner behavior
The template always includes the mobile banner markup. It's shown/hidden entirely via JS at runtime:
- Default (MOBILE_FIRST = false): banner appears on viewports < 768px, unless the user has previously dismissed it (localStorage key
intq-banner-dismissed-{{FORM_ID}}). - Mobile-first mode: if the user explicitly says the client will likely fill the form on mobile (e.g. restaurant owner, retail, consumer), set
var MOBILE_FIRST = true;in the script block. Banner is then permanently suppressed.
The user sets the flag via the prompt. Do NOT default to mobile-first. Desktop is always the default.
Studio logo in footer
The template footer includes a brand mark + studio-name link by default (set yours in references/config.md).
Remove the logo only when the user explicitly says this is not an agency project or is a white-label form for a client brand — remove the .footer-brand element entirely.
Submit mechanism
The template uses mailto + clipboard (no form backend required):
- "Send via Email" — builds a pre-filled
mailto:link to your configured inbox and triggers it. The client's own email app opens with answers in the body. - "Copy to Clipboard" — copies the formatted answer string. Client pastes into chat/email manually.
Both paths use the same getPayloadString() function that reads the {{PAYLOAD_LABELS}} object. Make sure every name attribute on form inputs has a matching entry in {{PAYLOAD_LABELS}}.
Save the completed file as {client-slug}-{purpose-slug}.html and present it.
Step 4 — Draft the client email
If an email MCP is available, create a draft:
- To: client email(s) from Step 1
- Subject: short, no colon-loaded consultant tone. Example:
[Project] — quick design direction - Body: follow your ghostwriting voice rules (contractions, short sentences). Include
{{HOSTED_URL}}as a placeholder.
Body template:
Hey [Client First Name],
Put together a quick form for you — easier than another wall of email text. Should take about [5] minutes.
{{HOSTED_URL}}
Once you hit submit it comes straight to my inbox. Ping me if anything's unclear.
[Your name]
If no email MCP is available, output the email body as a code block for the user to paste into a new draft.
Step 5 — Deployment reminder
After the HTML file is saved and the draft is created, always output this exact line at the end of the response:
Terminal: Run
vercel --prodin the file directory to get your live URL, then paste it into the{{HOSTED_URL}}placeholder.
Do not paraphrase.
Output summary
Every successful run ends with these elements in this order:
- A one-sentence summary of what the form covers
- The HTML file
- The email draft link (or fallback email body)
- The deployment reminder (verbatim from Step 5)
- (If any) a short "Missing optional fields" note
Notes and edge cases
- Accent color: Default
--accentis#2563eb(blue). For client-branded forms, ask once: "house blue, or [client] brand?" and swap the:rootCSS variables (--accent+--accent-soft). - localStorage namespace: Must be unique per form — use
{{FORM_ID}}slug. Prevents one client's answers from bleeding into another's. - thum.io screenshots: Free, no API key. If a site blocks bots or the service times out, the JS placeholder handler fires automatically — no broken image icon.
- Self-contained constraint: No external CSS files, no build step. Fonts pull from Google Fonts CDN. All CSS and JS are inline in the
.htmlfile. - Accessibility: radio/checkbox labels wrap the inputs so they're tappable targets. Minimum 44×44px hit areas on mobile.
- Video link: Template includes a commented-out video link block. Uncomment and fill
{{VIDEO_URL}}if there's a walkthrough recording for the client.