Video
![]()
![]()
Editorial hero for a report




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
Payments are non-refundable. See our Terms of service.
Yours. Download it, then add it to your agent.
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
Video
![]()
![]()
Editorial hero for a report
Video1 view, 0 downloads
![]()
![]()
Lavender page for an AI app
Video
![]()
![]()
Product page for headphones
Video
![]()
![]()
Page with a node-flow hero
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/.
What it did in run 1
<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 -40No. 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.
Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode.
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.
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.
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.
Node 20+ and Chrome, and no API key. Each use costs nothing beyond your agent.
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.
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.
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.