Skip to content

DirectorySkills

Tilted photo quotes: 1440, made in this run
Run 1Tilted photo quotes“Put a customer photos and quotes section on our dog grooming site. Details 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

Tilted Photo Quotes

Customer photos as tilted instant prints with handwritten names, each above its quote; prints straighten on hover.

$9.99once, yours to keep

Builds a testimonial section with customer photos as tilted instant prints into your own project: four instant-print photos pinned at small angles on a warm wall, handwritten names on the white border, the quote on a card under each, prints straighten and lift on hover. 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 a friendly brand, shop, school, club or holiday company wants testimonials with faces, or someone asks for polaroid-style or tilted photo testimonials.

By RecaplyUpdated 12 Nov

Install Tilted Photo Quotes

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

Read https://recaply.co/skills/tilted-photo-quotes/install.md and follow it to install the tilted-photo-quotes skill from tilted-photo-quotes.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 Tilted Photo Quotes is for

What you get

  • One HTML file with its CSS inside: no build step, no framework
  • A testimonial section with customer photos as tilted instant prints
  • Checked at phone and desktop widths

Good fit

  • When a friendly brand, shop, school, club or holiday company wants testimonials with faces

Not for

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

About this skill

You say

Put a customer photos and quotes section on our dog grooming site. Details in brief.md.

It said back

I've added the customer photos and quotes section, but the four photos are placeholders because no photo files came with the project. The automated check passes at 390, 768 and 1440px wide. It covers sideways overflow, text size, alt text, names, contrast, focus styles, reduced motion and script errors. I looked at the 390px and 1440px screenshots and they read well, but I didn't open the 768px one.

Each customer has a tilted print with their name and area handwritten on the bottom edge. Their quote sits on a card underneath. The prints straighten and lift on hover or keyboard focus, and fade in once as you scroll. The page is plain HTML since the project was empty, so I made it a one-section page you can drop into your site.

Show more

What it did in run 1

  1. tilted-photo-quotes
  2. ./brief.md
  3. cd .; ls -la; ls .claude/skills/tilted-photo-quotes/reference; cat .claude/skills/tilted-photo-quotes/reference/index.html .claude/skills/tilted-photo-quotes/reference/style.css .claude/skills/tilted-photo-quotes/reference/script.js
  4. cd . S=.claude/skills/tilted-photo-quotes cp $S/reference/script.js script.js python3 - <<'E' import re s=open('.claude/skills/tilted-photo-quotes/reference/style.css').read() s=s.replace("--font-display:'Nunito Sans', system-ui, sans-serif","--font-display:'Caveat', cursive") s=s.replace("font-weight:var(--display-weight,700)","font-weight:var(--display-weight,800)") s=s.replace("padding:10px 10px 0;","padding:10px 10px 0;padding-bottom:0;") s=s.replace(".tp-name{font-family:'Caveat',cursive;font-size:1.5rem;font-weight:700;text-align:center;padding:.3rem 0 .5rem;",".tp-name{font-family:'Caveat',cursive;font-size:1.5rem;font-weight:700;text-align:center;min-height:46px;display:flex;align-items:center;justify-content:center;line-height:1.1;") s=s.replace(".sec-head h2{font-size:clamp(1.9rem,4.2vw,3.1rem)",".sec-head h2{font-size:clamp(1.9rem,4.2vw,3.1rem)") s+="\n.sec-head h2 em{font-style:normal}\n.tp-print svg{background:#E9DCC6}\n" open('style.css','w').write(s) people=[("Laura","Leeds","Biscuit came back fluffy and calm","#DDEFD8"),("Ahmed","Headingley","They are so patient with nervous dogs","#EADCF7"),("Tess","Roundhay","Best groomer in town, booked monthly","#FBE7B5"),("Joe","Chapel Allerton","My poodle has never looked better","#F5D0DA")] items="" for n,p,q,c in people: items+=f'''<li class="tp reveal"><figure><div class="tp-print"><svg viewBox="0 0 100 100" role="img" aria-label="Placeholder: photo of {n} with their dog to be added" preserveAspectRatio="xMidYMid slice"><rect width="100" height="100" fill="{c}"/><g fill="#8a7c68"><ellipse cx="50" cy="62" rx="15" ry="12"/><ellipse cx="32" cy="42" rx="6" ry="8"/><ellipse cx="45" cy="32" rx="6" ry="8"/><ellipse cx="58" cy="32" rx="6" ry="8"/><ellipse cx="70" cy="42" rx="6" ry="8"/></g><text x="50" y="92" text-anchor="middle" font-size="7" fill="#5C5145" font-family="sans-serif">Photo to come</text></svg><p class="tp-name">{n} · {p}</p></div><blockquote><p>“{q}.”</p></blockquote><figcaption><b>{n}</b> <span>{p}</span></figcaption></figure></li> ''' h=f'''<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Suds &amp; Paws dog grooming</title> <meta name="description" content="Happy customers and their freshly groomed dogs, in their own words."> <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=Caveat:wght@600;700&family=Nunito+Sans:wght@400;600;700;800&display=swap"> <link rel="stylesheet" href="style.css"> </head> <body> <a class="skip" href="#main">Skip to content</a> <main id="main"> <section class="t-sec center" id="customers" aria-labelledby="customers-h"><div class="sec-head center"><h2 id="customers-h">Happy dogs, happy <em>humans</em></h2><p class="sub">What our customers say about their visits to Suds &amp; Paws.</p></div><ul class="wrap tp-list"> {items}</ul></section> </main> <script src="script.js" defer></script> </body> </html> ''' open('index.html','w').write(h) E node $S/scripts/check.mjs index.html --out check 2>&1 | tail -30
  5. ls && node .claude/skills/tilted-photo-quotes/scripts/check.mjs index.html --out check 2>&1 | tail -30
  6. cd . cp .claude/skills/tilted-photo-quotes/reference/script.js script.js cat > /tmp/build.py <<'E' s=open('.claude/skills/tilted-photo-quotes/reference/style.css').read() s=s.replace("--font-display:'Nunito Sans', system-ui, sans-serif","--font-display:'Caveat', cursive") s=s.replace("font-weight:var(--display-weight,700)","font-weight:var(--display-weight,800)") s=s.replace(".tp-name{font-family:'Caveat',cursive;font-size:1.5rem;font-weight:700;text-align:center;padding:.3rem 0 .5rem;",".tp-name{font-family:'Caveat',cursive;font-size:1.5rem;font-weight:700;text-align:center;min-height:46px;display:flex;align-items:center;justify-content:center;line-height:1.1;") s+="\n.sec-head h2 em{font-style:normal}\n.tp-print svg{background:#E9DCC6}\n" open('style.css','w').write(s) people=[("Laura","Leeds","Biscuit came back fluffy and calm","#DDEFD8"),("Ahmed","Headingley","They are so patient with nervous dogs","#EADCF7"),("Tess","Roundhay","Best groomer in town, booked monthly","#FBE7B5"),("Joe","Chapel Allerton","My poodle has never looked better","#F5D0DA")] items="" for n,p,q,c in people: items+=f'''<li class="tp reveal"><figure><div class="tp-print"><svg viewBox="0 0 100 100" role="img" aria-label="Placeholder: photo of {n} with their dog to be added" preserveAspectRatio="xMidYMid slice"><rect width="100" height="100" fill="{c}"/><g fill="#8a7c68"><ellipse cx="50" cy="62" rx="15" ry="12"/><ellipse cx="32" cy="42" rx="6" ry="8"/><ellipse cx="45" cy="32" rx="6" ry="8"/><ellipse cx="58" cy="32" rx="6" ry="8"/><ellipse cx="70" cy="42" rx="6" ry="8"/></g><text x="50" y="92" text-anchor="middle" font-size="7" fill="#5C5145" font-family="sans-serif">Photo to come</text></svg><p class="tp-name">{n} · {p}</p></div><blockquote><p>“{q}.”</p></blockquote><figcaption><b>{n}</b> <span>{p}</span></figcaption></figure></li> ''' h=f'''<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Suds &amp; Paws dog grooming</title> <meta name="description" content="Happy customers and their freshly groomed dogs, in their own words."> <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=Caveat:wght@600;700&family=Nunito+Sans:wght@400;600;700;800&display=swap"> <link rel="stylesheet" href="style.css"> </head> <body> <a class="skip" href="#main">Skip to content</a> <main id="main"> <section class="t-sec center" id="customers" aria-labelledby="customers-h"><div class="sec-head center"><h2 id="customers-h">Happy dogs, happy <em>humans</em></h2><p class="sub">What our customers say about their visits to Suds &amp; Paws.</p></div><ul class="wrap tp-list"> {items}</ul></section> </main> <script src="script.js" defer></script> </body> </html> ''' open('index.html','w').write(h) E python3 /tmp/build.py && node .claude/skills/tilted-photo-quotes/scripts/check.mjs index.html --out check 2>&1 | tail -30
  7. /tmp/build.py
  8. python3 /tmp/build.py
  9. python3 -I /tmp/build.py
  10. cp .claude/skills/tilted-photo-quotes/reference/script.js script.js && cp .claude/skills/tilted-photo-quotes/reference/style.css style.css && ls
  11. ./style.css
  12. ./script.js
  13. ./index.html
  14. node .claude/skills/tilted-photo-quotes/scripts/check.mjs index.html --out check
  15. sed -i '' 's|<text[^>]*>Photo to come</text>||g' index.html && node .claude/skills/tilted-photo-quotes/scripts/check.mjs index.html --out check
  16. node -e "const f='index.html',fs=require('fs');fs.writeFileSync(f,fs.readFileSync(f,'utf8').replace(/<text[^>]*>Photo to come<\/text>/g,''))" && node .claude/skills/tilted-photo-quotes/scripts/check.mjs index.html --out check
  17. ./check/1440.png
  18. ./check/390.png
  19. Done

10 Nov 2026 · Claude Code 2.1.322 with Claude Sonnet 5.5 · 1 min 36 s · $0.29 of API use

Questions

Is Tilted Photo Quotes free?

No. Tilted Photo Quotes 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 Tilted Photo Quotes?

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

What do I get when I buy Tilted Photo Quotes?

A ZIP of the whole skill folder (31 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 Tilted Photo Quotes?

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 ./tilted-photo-quotes with your agent's flag.

What do I get from Tilted Photo Quotes?

One HTML file with its CSS inside: no build step, no framework. A testimonial section with customer photos as tilted instant prints. Checked at phone and desktop widths.

What does Tilted Photo Quotes need?

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

How big is Tilted Photo Quotes?

7 files, about 20,418 tokens in all. The SKILL.md is about 2,190 tokens, and your agent reads it only when the job fits.

What does a run cost?

Our 1 runs took 1 min 36 s to 1 min 36 s and $0.29 to $0.29 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 Tilted Photo Quotes to use it?

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