Skip to content

DirectorySkills

Ink illustrator portfolio: 1440, made in this run
Run 1Ink illustrator portfolio“Make a portfolio website for me. My notes are in brief.md.”
Runs in
  • Claude Code
  • Codex
  • Cursor
  • Gemini CLI
  • GitHub Copilot
  • OpenCode
Generates with
Your agent's model
Tested with
Claude Code 2.1.322Claude Sonnet 5.51 real run, 10 Nov
Needs
Node 20+Chrome
Licence
Recaply licence

Ink Illustrator Portfolio

A blue-ink-on-paper portfolio for an illustrator: an inked hero, a picture gallery, about, client notes and contact.

$9.99once, yours to keep

Builds an illustrator portfolio in a blue ink style into your own project: warm paper with blue-black ink, a classic serif, ink splatters and deckled picture edges, an inked hero, a gallery of work, about, client notes and a commission form. Plain HTML, CSS and JavaScript, or matched to React, Next.js, Vue, Svelte, Astro or Tailwind when the project uses them. Comes with a working reference and a check that screenshots it at phone, tablet and desktop widths and flags sideways overflow, text under 12px, missing alt text and names, low contrast, no focus styles, motion that ignores reduced motion, leftover sample words and emoji icons. Use when an illustrator, artist, printmaker or tattoo artist needs a portfolio, or someone asks for an ink-drawn, paper, hand-made portfolio look.

By RecaplyUpdated 12 Nov

Install Ink Illustrator Portfolio

After the download, ask your agent to add it, or run the line yourself.

Read https://recaply.co/skills/ink-illustrator-portfolio/install.md and follow it to install the ink-illustrator-portfolio skill from ink-illustrator-portfolio.zip.

Paste it into your agent. It reads our install steps, finds the ZIP you downloaded and adds the skill for you.

New to skills? How to install a skill

Similar skills

All 735 skills

Who Ink Illustrator Portfolio is for

What you get

  • One HTML file with its CSS inside: no build step, no framework
  • An illustrator portfolio in a blue ink style
  • Checked at phone and desktop widths

Good fit

  • When an illustrator, artist, printmaker or tattoo artist needs a portfolio

Not for

  • An app with a backend, sign-in or a database
  • Copying another company's site

About this skill

You say

Make a portfolio website for me. My notes are in brief.md.

It said back

Your portfolio site is built, and the automated check passes at phone, tablet and desktop widths. That covers sideways overflow, small text, alt text, contrast, focus styles, reduced motion and script errors. I looked at the 390px and 1440px screenshots myself but did not open the 768px one.

It's the blue-ink design from the skill: warm paper, serif type, deckled picture edges and two ink splatters. The pages are Work, About and Commissions. The commission form is the main button in the top bar and the hero.

Show more

What it did in run 1

  1. ink-illustrator-portfolio
  2. ./brief.md
  3. cd .; ls -la . .claude/skills/ink-illustrator-portfolio/reference; wc -c .claude/skills/ink-illustrator-portfolio/reference/*; node .claude/skills/ink-illustrator-portfolio/scripts/check.mjs --ready
  4. ./.claude/skills/ink-illustrator-portfolio/reference/index.html
  5. ./.claude/skills/ink-illustrator-portfolio/reference/script.js
  6. cd .; R=.claude/skills/ink-illustrator-portfolio/reference; grep -n -i "splat\|gal-list\|--span\|\.gal\b\|\.inked\|nth-child" $R/style.css | head -50
  7. splat|gal-list|--span|\.gal\b|\.inked|nth-child|mask
  8. ./.claude/skills/ink-illustrator-portfolio/reference/style.css
  9. cd .; R=.claude/skills/ink-illustrator-portfolio/reference cp $R/style.css style.css; cp $R/script.js script.js cat >> style.css <<'EOF' .contact{position:relative;isolation:isolate} .contact::after{content:"";position:absolute;right:max(-30px,calc(50% - 680px));top:10%;width:150px;aspect-ratio:1;z-index:-1;background:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2216%22%20fill%3D%22%231B2A4A%22%20opacity%3D%22.1%22%2F%3E%3Ccircle%20cx%3D%2224%22%20cy%3D%2230%22%20r%3D%226%22%20fill%3D%22%231B2A4A%22%20opacity%3D%22.1%22%2F%3E%3Ccircle%20cx%3D%2280%22%20cy%3D%2276%22%20r%3D%224%22%20fill%3D%22%231B2A4A%22%20opacity%3D%22.1%22%2F%3E%3C%2Fsvg%3E") no-repeat center/contain} .gal svg{display:block} .gal-list{margin:0;padding:0;list-style:none} EOF python3 - <<'EOF' def svg(label, body, defs=""): return f'<svg viewBox="0 0 400 300" role="img" aria-label="{label}" preserveAspectRatio="xMidYMid slice">{body}</svg>' pieces = [ ("Kingfisher at dusk","Watercolour-style sketch of a small bird on a branch against a dusk sky",4, '<defs><linearGradient id="k" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#3A4D7A"/><stop offset=".6" stop-color="#C98F7A"/><stop offset="1" stop-color="#F0D9B8"/></linearGradient></defs><rect width="400" height="300" fill="url(#k)"/><circle cx="310" cy="190" r="34" fill="#F4F1EA" opacity=".8"/><path d="M0 250C100 235 260 262 400 244V300H0Z" fill="#1B2A4A" opacity=".8"/><path d="M40 160C140 150 230 170 380 140" stroke="#1B2A4A" stroke-width="6" fill="none" stroke-linecap="round"/><ellipse cx="205" cy="138" rx="30" ry="22" fill="#2F7C8A"/><ellipse cx="205" cy="148" rx="20" ry="14" fill="#D9824B"/><circle cx="232" cy="120" r="14" fill="#2F7C8A"/><path d="M243 120l34 4-34 6z" fill="#1B2A4A"/><circle cx="236" cy="117" r="2" fill="#F4F1EA"/><path d="M178 146l-34 14 36-4z" fill="#1B2A4A"/>'), ("Low tide at Aberdaron","Sketch of a wide beach at low tide with pale wet sand and a distant headland",2, '<rect width="400" height="300" fill="#E6E0D2"/><rect width="400" height="110" fill="#DCE3F0"/><path d="M0 110L90 80 170 100 260 70 400 110Z" fill="#5A6B90" opacity=".7"/><path d="M0 120C100 108 260 132 400 116V170H0Z" fill="#7083A8"/><path d="M0 170C120 160 250 185 400 168V300H0Z" fill="#EAE4D6"/><path d="M0 215C120 205 250 230 400 212" stroke="#7083A8" stroke-width="3" fill="none" opacity=".6"/><path d="M0 255C120 245 250 270 400 252" stroke="#7083A8" stroke-width="3" fill="none" opacity=".5"/>'), ("Two herons","Sketch of two tall grey herons standing in shallow water",2, '<rect width="400" height="300" fill="#E8EDF2"/><path d="M0 230C100 220 260 245 400 228V300H0Z" fill="#7083A8" opacity=".7"/><g fill="#1B2A4A"><path d="M120 235V150" stroke="#1B2A4A" stroke-width="4"/><ellipse cx="125" cy="140" rx="26" ry="14" transform="rotate(-20 125 140)" fill="#5A6B90"/><path d="M140 125c10-30 6-50 20-62" stroke="#1B2A4A" stroke-width="5" fill="none" stroke-linecap="round"/><path d="M160 63l30 6-30 3z"/><path d="M270 240V165" stroke="#1B2A4A" stroke-width="4"/><ellipse cx="268" cy="155" rx="24" ry="13" transform="rotate(15 268 155)" fill="#5A6B90"/><path d="M250 148c-12-24-6-46-22-56" stroke="#1B2A4A" stroke-width="5" fill="none" stroke-linecap="round"/><path d="M228 92l-30 8 30 1z"/></g>'), ("The pier in fog","Sketch of a pier with posts fading into thick fog",2, '<defs><linearGradient id="f" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#E6EAF0"/><stop offset="1" stop-color="#C5CEDD"/></linearGradient></defs><rect width="400" height="300" fill="url(#f)"/><rect x="0" y="170" width="400" height="130" fill="#9AA8C2" opacity=".6"/><g fill="#1B2A4A"><rect x="20" y="150" width="400" height="8"/><rect x="40" y="150" width="8" height="110"/><rect x="110" y="152" width="7" height="90" opacity=".8"/><rect x="170" y="153" width="6" height="72" opacity=".6"/><rect x="220" y="154" width="5" height="58" opacity=".4"/><rect x="260" y="154" width="4" height="46" opacity=".25"/></g><rect y="120" width="400" height="60" fill="#F4F1EA" opacity=".45"/>'), ("Puffins","Sketch of two puffins on a grassy clifftop above the sea",2, '<rect width="400" height="300" fill="#DCE3F0"/><rect y="150" width="400" height="150" fill="#5A6B90" opacity=".6"/><path d="M0 300V215C80 195 160 210 240 200 320 190 370 205 400 200V300Z" fill="#6E8A62"/><g><ellipse cx="140" cy="195" rx="26" ry="38" fill="#1B2A4A"/><ellipse cx="144" cy="205" rx="16" ry="26" fill="#F4F1EA"/><circle cx="140" cy="150" r="17" fill="#1B2A4A"/><path d="M148 150l26 4-26 10z" fill="#D9824B"/><ellipse cx="260" cy="205" rx="22" ry="32" fill="#1B2A4A"/><ellipse cx="256" cy="213" rx="13" ry="22" fill="#F4F1EA"/><circle cx="260" cy="170" r="15" fill="#1B2A4A"/><path d="M252 170l-24 4 24 9z" fill="#D9824B"/></g>'), ] lis=[] for t,a,span,b in pieces: lis.append(f'<li class="gal reveal" style="--span:{span}">{svg(t+": "+a,b)}<p class="gal-cap">{t}</p></li>') gal="".join(lis) about_svg='<svg viewBox="0 0 100 100" role="img" aria-label="Placeholder watercolour wash of sea and sky" preserveAspectRatio="xMidYMid slice"><rect width="100" height="100" fill="#DCE3F0"/><path d="M0 60C25 52 55 66 100 56V100H0Z" fill="#7083A8"/><path d="M0 78C30 70 60 84 100 74V100H0Z" fill="#1B2A4A"/><circle cx="68" cy="30" r="12" fill="#F4F1EA"/></svg>' ic='<svg class="ic" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">' drop='<svg viewBox="0 0 32 32" aria-hidden="true" focusable="false"><path d="M16 3c6 8 10 13 10 18a10 10 0 0 1-20 0c0-5 4-10 10-18z" fill="#1B2A4A"/></svg>' html=f'''<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Amara Okeke: Watercolours of birds and the Welsh coast</title> <meta name="description" content="Amara Okeke paints birds and coastal landscapes in watercolour from North Wales. Originals for sale and commissions taken."> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,600;0,700;1,600&family=Lora:wght@400;500&display=swap"> <link rel="stylesheet" href="style.css"> </head> <body> <a class="skip" href="#main">Skip to content</a> <header class="nav nav-bar"><div class="wrap nav-in"> <a class="brand" href="index.html" aria-label="Amara Okeke home">{drop}<span>Amara Okeke</span></a> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="menu">{ic}<path d="M4 7h16M4 12h16M4 17h16"/></svg><span class="sr-only">Menu</span></button> <nav id="menu" class="menu" aria-label="Main"><ul><li><a href="#gallery">Work</a></li><li><a href="#about">About</a></li><li><a href="#contact">Commissions</a></li></ul><a class="btn btn-primary btn-sm" href="#contact">Commission a piece</a></nav> </div></header> <main id="main"> <section class="hero hero-portfolio"><div class="wrap hero-in"><div class="hero-words reveal"><p class="kicker">Watercolour painter · North Wales</p><h1>Birds and coast, <em>painted in watercolour</em></h1><p class="hero-sub">I paint birds and coastal landscapes. Originals are for sale, and I take commissions.</p><div class="hero-ctas"><a class="btn btn-primary" href="#gallery">See the work{ic}<path d="M5 12h14M13 6l6 6-6 6"/></svg></a><a class="btn btn-ghost" href="#contact">Commission a piece</a></div></div><div class="hero-art reveal"><div class="inked"><svg viewBox="0 0 400 500" role="img" aria-label="Placeholder watercolour of a bird on a branch at dusk" preserveAspectRatio="xMidYMid slice"><defs><linearGradient id="hg" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#DCE3F0"/><stop offset=".7" stop-color="#E9C9B0"/><stop offset="1" stop-color="#F4F1EA"/></linearGradient></defs><rect width="400" height="500" fill="url(#hg)"/><circle cx="290" cy="150" r="50" fill="#F4F1EA" opacity=".85"/><path d="M0 400C100 380 260 420 400 392V500H0Z" fill="#5A6B90" opacity=".75"/><path d="M0 440C120 425 260 460 400 435V500H0Z" fill="#1B2A4A"/><path d="M30 300C140 290 250 310 380 270" stroke="#1B2A4A" stroke-width="8" fill="none" stroke-linecap="round"/><ellipse cx="200" cy="262" rx="42" ry="30" fill="#2F7C8A"/><ellipse cx="200" cy="276" rx="28" ry="18" fill="#D9824B"/><circle cx="238" cy="236" r="20" fill="#2F7C8A"/><path d="M254 236l48 6-48 8z" fill="#1B2A4A"/><circle cx="244" cy="232" r="3" fill="#F4F1EA"/><path d="M162 272l-50 20 52-6z" fill="#1B2A4A"/></svg></div></div></div></section> <section class="sec gallery gallery-grid" id="gallery" aria-labelledby="gallery-h"><div class="wrap"><div class="sec-head "><h2 id="gallery-h">Favourite <em>pieces</em></h2></div><ul class="gal-list">{gal}</ul></div></section> <section class="sec about" id="about" aria-labelledby="about-h"><div class="wrap about-in"><div class="about-words reveal"><div class="sec-head "><h2 id="about-h">About <em>Amara</em></h2></div><p>I'm a watercolour painter based in North Wales. I paint birds and coastal landscapes, sell the originals and take commissions.</p><p>If you have a bird, a beach or a view in mind, send an enquiry and tell me about it.</p></div><div class="about-art reveal">{about_svg}</div></div></section> <section class="sec contact" id="contact" aria-labelledby="contact-h"><div class="wrap contact-in"><div class="reveal"><div class="sec-head "><h2 id="contact-h">Commission a <em>piece</em></h2></div><p class="contact-line">{ic}<path d="M3 6h18v12H3zM3 7l9 6 9-6"/></svg><span><a href="mailto:amara@okekepaints.com">amara@okekepaints.com</a></span></p><p class="contact-line">{ic}<path d="M12 21s7-6.5 7-12a7 7 0 0 0-14 0c0 5.5 7 12 7 12z"/><circle cx="12" cy="9" r="2.5"/></svg><span>North Wales</span></p></div><form class="contact-form reveal" data-form aria-label="Commission enquiry form"><label class="field"><span>Your name</span><input name="name" type="text" required autocomplete="name"></label><label class="field"><span>Email</span><input name="email" type="email" required autocomplete="email"></label><label class="field"><span>What would you like painted?</span><textarea name="message" rows="5" required></textarea></label><button class="btn btn-primary" type="submit">Send enquiry</button><p class="form-status" role="status" aria-live="polite"></p></form></div></section> </main> <footer class="foot"><div class="wrap foot-in"><div class="foot-brand"><a class="brand" href="index.html">{drop}<span>Amara Okeke</span></a><p>Watercolours of birds and the Welsh coast.</p></div><nav class="foot-col" aria-label="Pages"><h2>Pages</h2><ul><li><a href="#gallery">Work</a></li><li><a href="#about">About</a></li><li><a href="#contact">Commissions</a></li></ul></nav><nav class="foot-col" aria-label="Contact"><h2>Contact</h2><ul><li><a href="mailto:amara@okekepaints.com">Email</a></li></ul></nav></div><div class="wrap foot-small"><p>© <span data-year>2026</span> Amara Okeke.</p></div></footer> <script src="script.js" defer></script> </body> </html> ''' open('index.html','w').write(html) EOF # form message and strip unused script features python3 - <<'EOF' s=open('script.js').read() i=s.index('// Billing switch'); j=s.index('// Forms:') k=s.index('// Copy buttons.') s=s[:i]+s[j:k] s=s.replace("Thanks. This reference has no server, so nothing was sent; connect the form to yours.","Thanks. Your enquiry is noted. (Demo: the form isn't connected yet, so please also email amara@okekepaints.com.)") open('script.js','w').write(s) EOF node .claude/skills/ink-illustrator-portfolio/scripts/check.mjs index.html --out check 2>&1 | tail -30
  10. cp .claude/skills/ink-illustrator-portfolio/reference/style.css style.css && cp .claude/skills/ink-illustrator-portfolio/reference/script.js script.js && ls
  11. ./.claude/skills/ink-illustrator-portfolio/reference/style.css
  12. cp .claude/skills/ink-illustrator-portfolio/reference/style.css style.css
  13. ./.claude/skills/ink-illustrator-portfolio/reference/style.css
  14. ^\.(about|contact|foot)[^{]*\{
  15. ./style.css
  16. ./script.js
  17. ./index.html
  18. node .claude/skills/ink-illustrator-portfolio/scripts/check.mjs index.html --out check
  19. ./style.css
  20. node .claude/skills/ink-illustrator-portfolio/scripts/check.mjs index.html --out check
  21. ./check/1440.png
  22. ./check/390.png
  23. ./style.css
  24. node .claude/skills/ink-illustrator-portfolio/scripts/check.mjs index.html --out check
  25. ./check/1440.png
  26. Done

10 Nov 2026 · Claude Code 2.1.322 with Claude Sonnet 5.5 · 3 min 12 s · $0.58 of API use

Questions

Is Ink Illustrator Portfolio free?

No. Ink Illustrator Portfolio costs $9.99 once and stays in your Recaply account, or it comes with the Recaply plan ($19.99 a month), which opens every premium skill and prompt.

Which agents can use Ink Illustrator Portfolio?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode.

What do I get when I buy Ink Illustrator Portfolio?

A ZIP of the whole skill folder (41 KB): the SKILL.md your agent follows and its 6 other files, the references, templates and scripts it uses. You download it from this page whenever you need it, and install it in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode. The Recaply plan opens it too, with every other premium skill and prompt.

How do I install Ink Illustrator Portfolio?

Buy it, then download the ZIP from this page. For Claude Code, unzip it into .claude/skills/ in your project. For Codex, Cursor and Gemini CLI, unzip it and run npx skills add ./ink-illustrator-portfolio with your agent's flag.

What do I get from Ink Illustrator Portfolio?

One HTML file with its CSS inside: no build step, no framework. An illustrator portfolio in a blue ink style. Checked at phone and desktop widths.

What does Ink Illustrator Portfolio need?

Node 20+ and Chrome, and no API key. Each use costs nothing beyond your agent.

How big is Ink Illustrator Portfolio?

7 files, about 31,845 tokens in all. The SKILL.md is about 2,413 tokens, and your agent reads it only when the job fits.

What does a run cost?

Our 1 runs took 3 min 12 s to 3 min 12 s and $0.58 to $0.58 of API use each, in Claude Code with claude-sonnet-5-5. On a Claude plan, a run counts toward your usage instead.

Do I have to name Ink Illustrator Portfolio to use it?

Type /ink-illustrator-portfolio first to make sure it loads. Without it, Claude Code may judge a small job simple enough to do without the skill.