Skip to content

DirectorySkills

Compact quote grid: 1440, made in this run
Run 1Compact quote grid“Put a compact block of short reviews under our pricing table. They 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, 12 Nov
Needs
Node 20+Chrome
Licence
Recaply licence

Compact Quote Grid

A dense 3 by 3 grid of short quotes with tiny avatars and stars, made to sit under a pricing table or sign-up form.

$9.99once, yours to keep

Builds a compact grid of short testimonials into your own project: nine small cards in a tight 3 by 3 grid on white, each with a 32px avatar, name, small stars and one or two lines of quote; a one-line summary above ("Loved by 12,000 teams"). 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 page needs a lot of social proof in little space, for example under pricing, a sign-up form or a checkout, or someone asks for a compact or small testimonial grid.

By RecaplyUpdated 12 Nov

Install Compact Quote Grid

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

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

What you get

  • One HTML file with its CSS inside: no build step, no framework
  • A compact grid of short testimonials
  • Checked at phone and desktop widths

Good fit

  • When a page needs a lot of social proof in little space, for example under pricing, a sign-up form or a checkout

Not for

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

About this skill

You say

Put a compact block of short reviews under our pricing table. They are in brief.md.

It said back

I made a new Formly page with the pricing table at the top and the nine-review grid directly under it. The check passes at 390, 768 and 1440 px. I looked at the 1440 and 390 screenshots and they read cleanly, with no overlap or cut-off text. I didn't open the 768 one.

You had no existing page, so I built a plain HTML, CSS and JavaScript page from scratch.

Show more

What it did in run 1

  1. compact-quote-grid
  2. ls -la && cat brief.md
  3. cd ./.claude/skills/compact-quote-grid && ls -R . | head -30; cat reference/index.html reference/style.css reference/script.js; node scripts/check.mjs --ready
  4. cd . && cat > /tmp/gen.mjs <<'EOF' import fs from 'node:fs'; const out = process.argv[2]; const R = [ [5,"Built our booking form in ten minutes, no help needed.","Dana Whitfield","yoga studio owner"], [5,"Payments inside the form saved us a second tool.","Luis Ortega","photographer"], [5,"Our clients actually finish the intake form now.","Grace Kim","physiotherapist"], [5,"Conditional questions without writing any code.","Ahmed Saleh","IT consultant"], [5,"Replaced three spreadsheets and a lot of email.","Bea Lindqvist","event planner"], [5,"Support replied in under an hour on a Saturday.","Tom Fischer","bakery owner"], [5,"The templates are a real head start.","Nia Roberts","charity coordinator"], [5,"Signatures on forms closed our paperwork gap.","Marco Rossi","builder"], [4,"Great value; I would like more themes.","Priya Shah","maths tutor"]]; const stars=(n)=><span class="stars" role="img" aria-label="${n} out of 5 stars">${[1,2,3,4,5].map(i=><svg aria-hidden="true" focusable="false"><use href="#${i<=n?'star':'star-o'}"/></svg>).join('')}</span>; const ini=(n)=>n.split(' ').map(w=>w[0]).join(''); const cards=R.map(([s,q,n,r])=><li class="cg-c reveal"><figure><figcaption><span class="face" aria-hidden="true">${ini(n)}</span><span><b>${n}</b><span class="role">${r}</span>${stars(s)}</span></figcaption><blockquote><p>${q}</p></blockquote></figure></li>).join('\n'); const html=<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Formly pricing</title> <meta name="description" content="Formly pricing: Free, Starter and Business plans for online forms, with reviews from small businesses."> <meta property="og:title" content="Formly pricing"> <meta property="og:description" content="Free, Starter and Business plans for online forms."> <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=Inter:wght@400;500;600;700&display=swap"> <link rel="stylesheet" href="style.css"> </head> <body> <svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false"><defs> <symbol id="star" viewBox="0 0 20 20"><path d="M10 1.5l2.6 5.4 5.9.8-4.3 4.1 1 5.8L10 14.8l-5.2 2.8 1-5.8L1.5 7.7l5.9-.8z" fill="currentColor" stroke="currentColor" stroke-width="1.2"/></symbol> <symbol id="star-o" viewBox="0 0 20 20"><path d="M10 1.5l2.6 5.4 5.9.8-4.3 4.1 1 5.8L10 14.8l-5.2 2.8 1-5.8L1.5 7.7l5.9-.8z" fill="none" stroke="currentColor" stroke-width="1.2"/></symbol> </defs></svg> <a class="skip" href="#main">Skip to content</a> <main id="main"> <section class="pricing wrap" aria-labelledby="pricing-h"> <h1 id="pricing-h">Formly pricing</h1> <ul class="plans"> <li class="plan"><h2>Free</h2><p class="price">$0</p><ul><li>3 forms</li><li>100 responses a month</li></ul></li> <li class="plan"><h2>Starter</h2><p class="price">$12 <span>a month</span></p><ul><li>Unlimited forms</li><li>1,000 responses</li><li>Payments</li></ul></li> <li class="plan"><h2>Business</h2><p class="price">$29 <span>a month</span></p><ul><li>10,000 responses</li><li>Signatures</li><li>Your own domain</li></ul></li> </ul> </section> <section class="t-sec compact" id="proof" aria-labelledby="proof-h"><h2 id="proof-h" class="sr-only">What customers say</h2><div class="wrap"><p class="cg-sum reveal">${stars(5)} <span>Used by 8,000 small businesses, 4.8 average</span></p> <ul class="cg"> ${cards} </ul></div></section> </main> <script src="script.js" defer></script> </body> </html> ; fs.writeFileSync(out+'/index.html',html); EOF node /tmp/gen.mjs . cat > script.js <<'EOF' document.documentElement.classList.add('js'); (() => { const els = document.querySelectorAll('.reveal'); const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; if (reduce || !('IntersectionObserver' in window)) { els.forEach((e) => e.classList.add('in')); return; } const io = new IntersectionObserver((entries) => { for (const en of entries) if (en.isIntersecting) { en.target.classList.add('in'); io.unobserve(en.target); } }, { threshold: 0.12, rootMargin: '0px 0px -5% 0px' }); els.forEach((e) => io.observe(e)); })(); EOF cat > style.css <<'EOF' :root{--bg:#FFFFFF;--surface:#FAFAFB;--ink:#17181C;--muted:#5B5E68;--line:#E7E8EC;--accent:#7C3AED;--on-accent:#FFFFFF;--em:#7C3AED;--star:#C98A06;--font-body:'Inter',system-ui,sans-serif} *,*::before,*::after{box-sizing:border-box} html{-webkit-text-size-adjust:100%} body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--font-body);font-size:1.0625rem;line-height:1.6;-webkit-font-smoothing:antialiased} svg{max-width:100%} h1,h2,p{margin:0} ul{margin:0;padding:0;list-style:none} :focus-visible{outline:3px solid var(--accent);outline-offset:3px;border-radius:4px} .wrap{width:min(100% - 40px,1080px);margin-inline:auto} .skip{position:absolute;left:-9999px;top:12px;z-index:100;background:var(--ink);color:var(--bg);padding:.6rem 1rem;border-radius:8px;text-decoration:none} .skip:focus{left:12px} .sr-only{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0} .js .reveal{opacity:0;transform:translateY(18px);transition:opacity .7s ease,transform .7s ease} .js .reveal.in{opacity:1;transform:none} @media (prefers-reduced-motion:reduce){*,*::before,*::after{transition-duration:.01ms!important}.js .reveal{opacity:1;transform:none}} .pricing{padding-top:clamp(40px,6vw,72px)} .pricing h1{font-size:clamp(1.9rem,4.2vw,2.6rem);letter-spacing:-.02em;text-align:center;margin-bottom:1.5rem} .plans{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;max-width:1040px;margin-inline:auto} .plan{border:1px solid var(--line);border-radius:12px;padding:1.4rem} .plan h2{font-size:1.1rem;color:var(--accent)} .price{font-size:2rem;font-weight:700;margin:.3rem 0 .8rem} .price span{font-size:1rem;font-weight:500;color:var(--muted)} .plan li{padding-block:.2rem} .t-sec.compact{padding-block:clamp(32px,5vw,56px)} .stars{display:inline-flex;gap:2px;color:var(--star)} .stars svg{width:18px;height:18px} .cg-sum{display:flex;justify-content:center;align-items:center;gap:.6rem;font-size:1.1rem;font-weight:600;margin-bottom:1.4rem;flex-wrap:wrap;text-align:center} .cg{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;max-width:1040px;margin-inline:auto} .cg-c{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:1rem} .cg-c figure{margin:0} .cg-c figcaption{display:flex;align-items:center;gap:.6rem;margin-bottom:.5rem} .face{display:grid;place-items:center;width:32px;height:32px;border-radius:50%;flex:none;background:#EDE9FE;color:#5B21B6;font-size:.75rem;font-weight:700;letter-spacing:.02em} .cg-c b{display:block;font-size:.95rem;line-height:1.3} .role{display:block;font-size:.8125rem;line-height:1.3;color:var(--muted)} .cg-c .stars{margin-top:2px} .cg-c .stars svg{width:14px;height:14px} .cg-c blockquote{margin:0;font-size:.97rem;color:#30323A} @media (max-width:900px){.cg{grid-template-columns:1fr 1fr}.plans{grid-template-columns:1fr}} @media (max-width:600px){.cg{grid-template-columns:1fr;gap:16px}} EOF node .claude/skills/compact-quote-grid/scripts/check.mjs index.html --out check 2>&1 | tail -40
  5. /tmp/qgrid/gen.mjs
  6. /tmp/qgrid/template.html
  7. ./style.css
  8. ./script.js
  9. W=.; node /tmp/qgrid/gen.mjs $W && cd $W && node .claude/skills/compact-quote-grid/scripts/check.mjs index.html --out check 2>&1 | tail -40
  10. node /tmp/qgrid/gen.mjs . && node ./.claude/skills/compact-quote-grid/scripts/check.mjs ./index.html --out ./check 2>&1 | tail -40
  11. ./check/1440.png
  12. ./check/390.png
  13. Done

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

Questions

Is Compact Quote Grid free?

No. Compact Quote Grid 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 Compact Quote Grid?

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

What do I get when I buy Compact Quote Grid?

A ZIP of the whole skill folder (32 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 Compact Quote Grid?

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

What do I get from Compact Quote Grid?

One HTML file with its CSS inside: no build step, no framework. A compact grid of short testimonials. Checked at phone and desktop widths.

What does Compact Quote Grid need?

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

How big is Compact Quote Grid?

7 files, about 24,148 tokens in all. The SKILL.md is about 2,061 tokens, and your agent reads it only when the job fits.

What does a run cost?

Our 1 runs took 1 min 14 s to 1 min 14 s and $0.28 to $0.28 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 Compact Quote Grid to use it?

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