Skip to content

DirectorySkills

Scrolling quote columns: 1440, made in this run
Run 1Scrolling quote columns“Add moving columns of testimonials to our CRM landing page. Quotes 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, 12 Nov
Needs
Node 20+Chrome
Licence
Recaply licence

Scrolling Quote Columns

Three columns of quote cards drifting up and down at different speeds inside a faded frame, with a pause button.

$9.99once, yours to keep

Builds testimonial columns that drift slowly up and down into your own project: three columns of quote cards inside a 640px frame that fades at the top and bottom; columns drift up, down and up at different speeds, pause on hover or focus and with a pause button, and sit still (showing all cards) with reduced motion. 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 landing page wants a lively, high-volume testimonial block, or someone asks for infinite scrolling or vertical marquee testimonial columns.

By RecaplyUpdated 12 Nov

Install Scrolling Quote Columns

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

Read https://recaply.co/skills/quote-columns/install.md and follow it to install the quote-columns skill from quote-columns.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 Scrolling Quote Columns is for

What you get

  • One HTML file with its CSS inside: no build step, no framework
  • Testimonial columns that drift slowly up and down
  • Checked at phone and desktop widths

Good fit

  • When a landing page wants a lively, high-volume testimonial block

Not for

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

About this skill

You say

Add moving columns of testimonials to our CRM landing page. Quotes in brief.md.

It said back

The test server I started on port 8765 has now stopped, so there's nothing left for you to shut down. Please ignore my earlier request to run pkill.

I didn't restart it. The section itself is finished. The files are in site/ (index.html, style.css, script.js), and the check screenshots are in check/.

Show more

What it did in run 1

  1. quote-columns
  2. **/*
  3. ./brief.md
  4. ./.claude/skills/quote-columns/reference/index.html
  5. ./.claude/skills/quote-columns/reference/style.css
  6. ./.claude/skills/quote-columns/reference/script.js
  7. mkdir -p site /tmp/qcgen && cp .claude/skills/quote-columns/reference/style.css site/style.css && cat > /tmp/qcgen/gen.mjs <<'EOF' import fs from 'node:fs'; const root=process.argv[2]; const q=[ ["I stopped losing leads in my inbox the first week.","Maya Collins","Brand designer"], ["The follow-up reminders paid for the whole year in one client.","Jonah Reed","Copywriter"], ["Proposals, invoices and notes in one place at last.","Ana Ruiz","Photographer"], ["Setup took twenty minutes, including importing my spreadsheet.","Kofi Mensah","Web developer"], ["I can see which months will be quiet before they happen.","Leah Park","Illustrator"], ["My clients get a proper proposal link instead of a PDF.","Tom Becker","Video editor"], ["It's the first CRM that doesn't feel built for a sales team of fifty.","Priya Desai","UX consultant"], ["Every call note is on the client's card when I need it.","Sam O'Neill","Architect"], ["I booked three repeat clients from the 'gone quiet' list.","Ines Moreau","Translator"], ["Simple enough that I actually use it every day.","Ben Carter","Motion designer"], ["The pipeline view shows me exactly where each deal is stuck.","Hana Sato","Marketing consultant"], ["I closed 30% more proposals this year.","Lucas Silva","Developer"]]; const tints=["#D1FAE5","#E0F2FE","#FEF3C7","#EDE9FE","#FFE4E6","#CCFBF1"]; const esc=s=>s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/'/g,'&#39;'); const card=(i,dup)=>{const [t,n,r]=q[i];const ini=n.split(' ').map(w=>w[0]).join(''); return <li class="qc-c${dup?' dup':''}"${dup?' aria-hidden="true"':''}><figure><blockquote><p>${esc(t)}</p></blockquote><figcaption class="who"><span class="face" aria-hidden="true" style="background:${tints[i%6]}">${ini}</span><span><b>${esc(n)}</b><span class="role">${r}</span></span></figcaption></figure></li>}; // distribute round-robin so lengths balance const cols=[[0,3,6,9],[1,4,7,10],[2,5,8,11]]; const col=(ids,c)=><ul class="qc-col c${c}">${ids.map(i=>card(i,0)).join('')}${ids.map(i=>card(i,1)).join('')}</ul>; const html=<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Pipeline Pal: the CRM for freelancers</title> <meta name="description" content="Twelve freelancers explain how Pipeline Pal keeps their leads, proposals and follow-ups in one place."> <meta property="og:title" content="Pipeline Pal: the CRM for freelancers"> <meta property="og:description" content="Twelve freelancers explain how Pipeline Pal keeps their leads, proposals and follow-ups in one place."> <meta property="og:type" content="website"> <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=Onest:wght@400;500;700&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 qc-sec" id="love" aria-labelledby="love-h"><div class="sec-head"><h2 id="love-h">Freelancers who <em>switched</em></h2></div><div class="wrap qc-in"><div class="qc-words"><p class="sub">What twelve freelancers say about running their pipeline in Pipeline Pal.</p><button class="pause" type="button" aria-pressed="false" data-pause>Pause</button></div><div class="qc-frame">${cols.map(col).join('')}</div></div></section> </main> <script src="script.js" defer></script> </body> </html> ; fs.writeFileSync(root+'/site/index.html',html); EOF node /tmp/qcgen/gen.mjs . && rm -rf /tmp/qcgen cat > site/script.js <<'EOF' // Mark JS on; Pause button for the drifting columns (they also pause on hover and focus). document.documentElement.classList.add('js'); const qcp = document.querySelector('[data-pause]'); const qcf = document.querySelector('.qc-frame'); qcp.addEventListener('click', () => { const on = qcp.getAttribute('aria-pressed') !== 'true'; qcp.setAttribute('aria-pressed', String(on)); qcp.textContent = on ? 'Play' : 'Pause'; qcf.classList.toggle('paused', on); }); EOF sed -i '' 's/--accent:#2343C4/--accent:#059669/; s/--em:#2343C4/--em:#047857/; s/--bg:#EDF1F7/--bg:#F4F7F5/; s/--line:#D8DFEA/--line:#DCE5E0/' site/style.css sed -i '' 's/\.face svg{width:100%;height:100%}/.face{display:grid;place-items:center;font-weight:700;font-size:.9rem;color:#065F46;letter-spacing:.02em}/' site/style.css grep -c "qc-c" site/index.html; node .claude/skills/quote-columns/scripts/check.mjs site/index.html --out check 2>&1 | tail -40
  8. mkdir -p site && cp .claude/skills/quote-columns/reference/style.css site/style.css && ls site
  9. ./site/script.js
  10. ./gen/gen.mjs
  11. ./site/style.css
  12. node gen/gen.mjs . && rm -rf gen && node .claude/skills/quote-columns/scripts/check.mjs site/index.html --out check 2>&1 | tail -40
  13. grep -n "reduced\|reduce" .claude/skills/quote-columns/scripts/*.mjs | head
  14. (python3 -m http.server 8765 -d site >/dev/null 2>&1 & echo $! > /tmp/srv.pid) && sleep 1 && node .claude/skills/quote-columns/scripts/check.mjs http://localhost:8765/ --out check 2>&1 | tail -20; kill $(cat /tmp/srv.pid)
  15. python3 -m http.server 8765 -d site >/dev/null 2>&1 & sleep 1; cd . && node .claude/skills/quote-columns/scripts/check.mjs http://localhost:8765/ --out check 2>&1 | tail -20; pkill -f "http.server 8765"
  16. python3 -m http.server 8765 -d ./site
  17. node .claude/skills/quote-columns/scripts/check.mjs http://localhost:8765/ --out check 2>&1 | tail -20
  18. ./site/index.html
  19. node .claude/skills/quote-columns/scripts/check.mjs http://localhost:8765/ --out check 2>&1 | tail
  20. ./check/1440.png
  21. ./check/390.png
  22. pkill -f "http.server 8765"; echo done
  23. Done

12 Nov 2026 · Claude Code 2.1.322 with Claude Sonnet 5.5 · 11 min 14 s · $0.35 of API use

Questions

Is Scrolling Quote Columns free?

No. Scrolling Quote Columns 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 Scrolling Quote Columns?

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

What do I get when I buy Scrolling Quote Columns?

A ZIP of the whole skill folder (33 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 Scrolling Quote Columns?

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 ./quote-columns with your agent's flag.

What do I get from Scrolling Quote Columns?

One HTML file with its CSS inside: no build step, no framework. Testimonial columns that drift slowly up and down. Checked at phone and desktop widths.

What does Scrolling Quote Columns need?

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

How big is Scrolling Quote Columns?

7 files, about 26,810 tokens in all. The SKILL.md is about 2,111 tokens, and your agent reads it only when the job fits.

What does a run cost?

Our 1 runs took 11 min 14 s to 11 min 14 s and $0.35 to $0.35 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 Scrolling Quote Columns to use it?

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