Optimize Sign Up
Optimize a sign-up screen with evidence-backed completion hypotheses, not generic form advice.
CRITICAL: Output Behavior
This skill produces a hosted HTML report via the signup_design_run
background worker — NOT a local file. The worker handles rendering and
mockup generation on the server side; this skill is the agent-side glue
that kicks the run off, polls, and surfaces the result.
All current sign-up workflow runs are free. The report has 3-4 hypothesis cards with AI-generated mockups of the user's sign-up screen modified per the hypothesis, plus real A/B experiment evidence and Lazyweb references when matching evidence is available.
When to Use This
- User wants to improve, redesign, optimize, critique, or evaluate a sign-up / registration / account-creation screen
- User has a sign-up screenshot, URL, product brief, or current copy
- User asks how to increase signup completion rate, email capture, or onboarding entry
- User asks for concrete signup-screen redesign hypotheses
When NOT to Use This
- User is asking about a paywall (post-signup, paid conversion) →
lazyweb-optimize-paywall - User wants just CTA button copy on a sign-up screen → still use this
skill if the question is whole-screen optimization; route to
lazyweb-paywall-ctais wrong (CTA skill is paywall-specific) - User wants only A/B test examples on signup →
lazyweb-ab-test-research - User wants generic form best practices outside an app sign-up screen
→
lazyweb-deep-design-research
Lazyweb MCP Setup
Use hosted Lazyweb MCP tools at https://www.lazyweb.com/mcp for
database-backed evidence + the run pipeline. First list available tools
and run lazyweb_health.
Required public tools:
lazyweb_health— verify Lazyweb MCP connectivitysignup_design_run— kick off the full pipeline; returnsrun_id+ initialstatus='queued'. Takesimage_b64+context(product, plan, conversion_goal, etc.). For iteration, also takesparent_run_id+ sparsefeedbacksignup_design_check_status— poll withrun_id; returnsstatus,tier, and (when complete)report_url+recommendationslazyweb_search— find sign-up references and convention exampleslazyweb_compare_image— find visually similar sign-up screens when the target image is availablelazyweb_search_ab_tests— mobile-only broader A/B evidence (signup experiments, lifecycle, activation)
Search discipline: never repeat an identical lazyweb_search query — results are deterministic; page deeper with offset and follow pagination.next_offset. On no_matches/low_coverage warnings, use the closest result or note the coverage gap — don't rephrase the same concept in a loop. On company_not_in_library, use a suggested company or drop the filter.
Pass skill: "optimize-sign-up" on every call. Include "skill": "optimize-sign-up" in the arguments of each lazyweb_* tool call — for example {"query": "pricing page", "limit": 30, "skill": "optimize-sign-up"}. This is optional analytics metadata Lazyweb uses to understand which skills are used; never drop or change a real argument for it.
Also pass version: "<x.y.z>" on every call. Read ~/.lazyweb/VERSION once per session at skill start (e.g. cat "$HOME/.lazyweb/VERSION" 2>/dev/null || echo 0.0.0); fall back to "0.0.0" if the file is missing or unreadable — never block on this. Include "version": "<that-value>" in the arguments of every lazyweb_* tool call alongside the existing skill arg — for example {"query": "pricing page", "limit": 30, "skill": "optimize-sign-up", "version": "0.4.5"}. Optional analytics metadata Lazyweb uses to track which skill-pack versions are running; never drop or change a real argument for it.
If Lazyweb MCP is not installed or auth fails, tell the user: "Lazyweb MCP
is not installed. Run curl -fsSL https://www.lazyweb.com/install.sh | bash,
reload this client, then rerun this skill."
Free behavior on the run tool
signup_design_run queues fresh runs and iterations without a paid tier
check. Some backend responses may still include a legacy tier field for
worker compatibility; do not treat that field as an access or billing gate.
Use signup_design_check_status to poll until the hosted report_url is
ready, then surface the report to the user.
Ground the Sign-up Screen
Before kicking off the run, establish the target:
- Run
lazyweb-context-detectwhen available to infer project, platform, stack. - Capture or read the target sign-up screen. Prefer an actual screenshot or URL over prose. If the target is a local app, capture the current screen. If remote, use the provided image or URL.
- Ask one concise question only when the product, platform, signup goal, or target screen is missing and cannot be inferred.
Read the sign-up screen first. Identify:
- Components present: logo / hero / value props / form fields / social auth / primary CTA / secondary action / legal / login link / trust signals
- Form mechanics: email-only vs email+password vs social-first vs passwordless / magic link / phone / SSO; required field count; single-step vs multi-step
- Strategic moves: value-prop framing, trust signals, social proof, reduce-friction patterns (Google one-tap, Apple sign-in), progressive profiling
- User state: cold (landing page → signup) vs warm (in-app gate) vs returning (re-entry) vs invited (referral, magic link)
Run the Pipeline
signup_design_run({
image_b64: <user's sign-up screenshot, base64>,
context: {
product: "...",
product_canonical_name: "...",
category: "...",
conversion_goal: "signup completion rate" | "email capture rate" | ...,
constraints: "...", // brand colors must stay, no phone field, etc.
design_problem: "..." // optional — what you think the friction is
}
})
→ { run_id, status: 'queued', tier: 'pro' | 'free' }
Tell the user one short line ("Working on it — takes about a minute") and
call signup_design_check_status with the run_id on your next turn.
signup_design_check_status({ run_id })
→ { status: 'queued' | 'running' | 'complete' | 'failed',
tier: 'pro' | 'free',
report_url: <signed URL when complete>,
recommendations: [...] // each: hypothesis_title, hypothesis,
// mockup_file (storage key)
}
Loop until status === 'complete'. Surface the report_url as a clickable
link, speak the top picks (hypothesis_title + one-line why), and tell the
user where to find the full report.
Iteration
When the user reacts to a report you have shared (e.g., "kill #2", "make
them bolder", "the first one is great but the rest feel safe"), call
signup_design_run AGAIN with parent_run_id = the prior run_id from
your tool history + a sparse feedback object:
signup_design_run({
parent_run_id: <prior run_id>,
feedback: {
global_direction_notes: "make them bolder", // optional cross-cutting
hypothesis_feedback: [
{ prior_hypothesis_title: "Social auth above the fold",
verdict: "kill",
notes: "their brand doesn't ship social auth — design constraint" }
]
}
})
Feedback is SPARSE. Only include hypothesis_feedback entries for
hypotheses the user explicitly commented on. Verdicts: keep | kill | push_further | pivot_adjacent | modify. Cross-cutting reactions go in
global_direction_notes. Do NOT fabricate feedback for hypotheses the
user didn't mention.
If iteration fails, report the returned backend error as an operational
failure or invalid parent_run_id; do not describe it as a paywall or Pro
upgrade requirement.
Hypothesis grounding (required)
Every hypothesis the run produces is anchored to the TARGET sign-up screen's own read — the specific friction the user is hitting on THIS screen, not generic best practices. Read what the worker returned BEFORE summarizing inline; do not invent hypotheses ahead of the report.
A good signup hypothesis takes this form:
Making [specific change] should [specific signup outcome] because [specific mechanism].
Good: "Moving social auth above the email field should lift signup completion because Google one-tap finishes the auth in zero typed characters when the user is already signed into Chrome."
Bad: "Improve the form UX." "Reduce friction."
Surface the report
When the run is complete, give the user:
- The
report_urlas a clickable link - The top 1-2 hypotheses by name + one-line why (from
recommendations[].hypothesis_title+recommendations[].hypothesis) - Offer iteration — "Want me to push #1 further, or kill any of these?"
What NOT to do
- Do NOT render your own HTML report for signup. The worker handles it.
The
report_urlIS the deliverable. - Do NOT call
signup_design_runwithout first reading the user's screen context — thecontextpayload drives retrieval quality. - Do NOT render alternate local mockups to replace the hosted report. The
worker-generated
report_urlis the source of truth for this skill. - Do NOT call both
signup_design_runandx_paywall_design_researchfor the same intent. Sign-up is sign-up; paywall is paywall. Wrong skill for the wrong screen returns wrong evidence.
Tool budget guidance
A typical fresh signup run uses one signup_design_run call + 1-3
signup_design_check_status polls. Don't poll more frequently than ~15s.
If the run hasn't completed after ~3 minutes, surface the status to the
user ("still running, this is unusual — usually 60-120s") and continue
polling; don't assume failure.