← All runbooks
jettyio / pelican-persona

pelican-persona

Turn the Jetty "Pelly" logo into an on-brand persona mascot for an ICP — same flat bold-outline brand identity, a new wardrobe + accent color — then rebuild it as a clean, scalable SVG (plus a deck PNG and optional transparent variants). Repeatable for any…

agent claude-codemodel google/nano-bananasnapshot localeval visual6 stepsv1.2.0

Deploy pelican-persona to your jetty.io

One-click installs this runbook into a collection on your Jetty account. You can run it from the Spot dashboard, schedule it, or pipe inputs in via the API.

The shape of the run

6 steps · start to finish.

  1. 1
    Step 1

    Generate the persona (nano-banana as an EDITOR, not a generator)

    The single biggest lever: feed the real logo + bold-outline base as image_input and ask for the smallest change. Redrawing "from scratch" makes the model over-illustrate (3D, gradients, hallucinated text); editing a reference keeps it on-model.

    python3 gen.py nano scratch/{persona}-1.png "ref-pelly-up-bold.png,ref-pelly-logo.png" <<'EOF'
    Image 1 = the LOCKED Jetty "Pelly" style to match: a pelican in the BOLD navy-outline (#0A1230)
    flat sticker style on a cream (#FAF8F3) background, with the large iconic orange (#FFAA00)
    gular-pouch beak and simple minimal two-leg feet. Image 2 = the original logo (canonical beak + feet).
    Match image 1's exact drawing style, outline weight, beak and feet. Now render the {persona} persona:
    dress Pelly in {wardrobe}; use {accent_hex} as the ONLY accent color; {props}.
    NO hoodie-if-not-asked, NO code, NO terminal, NO scene clutter. Flat colors only, no shading,
    no gradients, no text. Full body centered on cream.
    EOF
    

    Generate 4–6 variations (re-run with small nudges: beak angle, head height, accessory size). nano-banana is stochastic — variety comes from re-running, not from one perfect prompt.

    Simpler single-ref route (proven 2026-06-27, Canada Day + Operator-formal + Champion-formal): you don't always need the two-reference gen.py setup. Render just pelly-up.svg → a 1024² white-bg PNG (rsvg-convert -w 1024 -h 1024 -b '#ffffff' pelly-up.svg -o in.png) and feed it as the lone image_input to google/nano-banana (POST /v1/models/google/nano-banana/predictions, header Prefer: wait, body {"input":{"prompt":...,"image_input":["data:image/png;base64,…"],"output_format":"png"}}). It keeps the bill/eye/feet on-model and edits in the wardrobe cleanly. Build the JSON in Python that reads+base64s the file — passing the base64 via argv blows ARG_MAX on ~1MB PNGs. The prompt MUST pin "flat-vector, thick dark navy outlines, solid flat colors, no gradients/shading" or it drifts painterly. Targeted pose tweaks work by feeding the prior output back ("straighten the neck / lift the head slightly, keep EVERYTHING else identical"). nano-banana occasionally returns a failed/empty generation — just re-run.

  2. 2
    Step 2

    Inspect every output (visual gate)

    Open each and check against the rubric below. Regenerate per-issue, feeding the previous best back in as image 1 so the next round keeps what worked. Beak + feet are the usual failures:

  3. 3
    Step 3

    Lock the winner

    cp scratch/{persona}-N.png scratch/{persona}-FINAL.png

  4. 4
    Step 4

    Rebuild as SVG (palette-snap → trace)

    Do not trace the raw raster — its anti-aliased, slightly-off colors trace into mud. First snap every pixel to the exact brand palette, then trace. vectorize.py does both, with a smooth pipeline ON by…

  5. 5
    Step 5

    Optimize + transparent variants

    The raw vtracer SVG is ~220–350KB of noisy paths. Optimize it — roughly halves the size, tidies the markup, no visible change:

  6. 6
    Step 6

    Place

    Design system: copy {persona}.svg (and -transparent.svg) → design-systems/assets/pelicans/ and add a card to design-systems/personas.html (match the existing card markup; accent tag class carries the…