Skip to content

DirectorySkills

Tossed-card magazine: 1440, made in this run
Run 1Tossed-card magazine“Build the home page for our online zine. Brief 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

Tossed-Card Magazine

A culture magazine home page where articles sit as tilted cards scattered across a warm table, plus newsletter.

$9.99once, yours to keep

Builds a magazine home page with articles as scattered cards into your own project: a warm putty table with article cards tilted at small angles and overlapping slightly, a big serif masthead, a lead story, a grid of scattered cards that straighten on hover, and a newsletter sign-up. Plain HTML, CSS and JavaScript by default, 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 the result at phone, tablet and desktop widths and flags sideways overflow, text under 12px, missing alt text and names, low contrast, missing focus styles and motion that ignores reduced-motion settings. Use when an online magazine, culture site, zine or collection of essays needs a home page with personality, or someone asks for articles laid out like cards scattered on a table.

By RecaplyUpdated 11 Nov

Install Tossed-Card Magazine

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

Read https://recaply.co/skills/tossed-card-magazine/install.md and follow it to install the tossed-card-magazine skill from tossed-card-magazine.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 Tossed-Card Magazine is for

What you get

  • One HTML file with its CSS inside: no build step, no framework
  • A magazine home page with articles as scattered cards
  • Checked at phone and desktop widths

Good fit

  • When an online magazine, culture site, zine or collection of essays needs a home page with personality

Not for

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

About this skill

You say

Build the home page for our online zine. Brief in brief.md.

It said back

The Night Shift Zine home page is built, and the automated check passes at 390, 768 and 1440 px. The check covers sideways overflow, small text, alt text, names, contrast, focus styles, reduced motion and script errors. I viewed the 1440 and 390 screenshots before my last layout fixes and did not re-view them afterwards. I haven't looked at the 768 one.

Files (all in the project folder):

  • index.html
  • style.css
  • script.js
Show more

What it did in run 1

  1. ./brief.md
  2. tossed-card-magazine
  3. cd .; ls -la; ls .claude/skills/tossed-card-magazine/reference; wc -c .claude/skills/tossed-card-magazine/reference/*
  4. ./.claude/skills/tossed-card-magazine/reference/index.html
  5. ./.claude/skills/tossed-card-magazine/reference/style.css
  6. ./.claude/skills/tossed-card-magazine/reference/script.js
  7. cd . cat > script.js <<'EOF' // Night Shift Zine: menu toggle, reveal on scroll, newsletter confirmation. document.documentElement.classList.add('js'); const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)'); const toggle = document.querySelector('[data-nav-toggle]'); const menu = document.getElementById('menu'); if (toggle && menu) { const setOpen = (open) => { toggle.setAttribute('aria-expanded', String(open)); menu.classList.toggle('open', open); }; toggle.addEventListener('click', () => setOpen(toggle.getAttribute('aria-expanded') !== 'true')); document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && toggle.getAttribute('aria-expanded') === 'true') { setOpen(false); toggle.focus(); } }); menu.addEventListener('click', (e) => { if (e.target.closest('a')) setOpen(false); }); } (() => { const els = document.querySelectorAll('.reveal'); if (reduceMotion.matches || !('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)); })(); for (const y of document.querySelectorAll('[data-year]')) y.textContent = new Date().getFullYear(); // TODO: connect to your email service. For now the form only confirms in place. for (const f of document.querySelectorAll('[data-form]')) f.addEventListener('submit', (e) => { e.preventDefault(); const s = f.querySelector('.form-status'); if (s) s.textContent = 'You are on the list. The next issue will find you.'; f.reset(); }); EOF # CSS: reuse the reference's shared parts that are needed, then own touches python3 - <<'EOF' import re src=open('.claude/skills/tossed-card-magazine/reference/style.css').read() head=src.split('/* ---- this design ---- */')[0] # keep only needed rules: drop selectors of unused components keep_prefixes=('/*',':root','*','html','body','img','h1','p{','ul','a{','button','[hidden]','.sr-only','.btn','.ic','.js','@media (prefers','.nav','.brand','.menu','.kicker','.hero','.sec','.form-status','.inline-form','.cta','.field','.post','.foot','.skip','.wrap',':focus') out=[] lines=head.split('\n') i=0 while i<len(lines): l=lines[i] if l.startswith('@media (max-width:880px)'): blk=[l];i+=1 while not lines[i].startswith('}'):blk.append(lines[i]);i+=1 blk.append('}');out+=blk elif l.startswith('@media (max-width:900px)') or l.startswith('@media (max-width:520px)'): pass_=1 if l.startswith('@media (max-width:900px)'): while not lines[i].startswith('}'):i+=1 i+=0 elif l.startswith(keep_prefixes) and not l.startswith(('.hero-split','.hero-center','.hero-type','.hero-cover','.hero-booking','.hero-product','.hero-art','.hero-editorial .hero-art','.nav-pill','.cart','.sec-sub','.posts-list','.post-art svg')): out.append(l) i+=1 open('style.css','w').write('\n'.join(out)+'\n') EOF cat >> style.css <<'EOF' @media (max-width:900px){ .hero-editorial .hero-cols{grid-template-columns:1fr} .foot-in{grid-template-columns:1fr 1fr} .foot-brand{grid-column:1 / -1} } @media (max-width:520px){.foot-in{grid-template-columns:1fr}} /* ---- this design ---- */ :root{--night:#1B2340} .nav-center .brand{font-family:var(--font-display);font-size:1.8rem;font-weight:400;white-space:nowrap} .nav-toggle{gap:.4rem;padding:0 .9rem;font-weight:600} .nav-toggle span{font-size:1rem} .hero-editorial h1{font-weight:400;max-width:14ch} .hero-editorial .hero-cols{border-top:1px solid var(--ink)} .sec-head{max-width:none} .post-list{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(28px,3.5vw,48px);padding-bottom:20px} .post:nth-child(1){grid-column:span 2} .post-link{display:block;height:100%;background:var(--surface);padding:12px 12px 1.4rem;border-radius:6px;box-shadow:0 14px 28px -18px rgba(34,30,25,.55);border-top:8px solid var(--band);transition:transform .3s ease,box-shadow .3s ease;position:relative} .post:nth-child(1) .post-link{transform:rotate(-1.6deg);--band:#963421} .post:nth-child(2) .post-link{transform:rotate(1.8deg) translateY(14px);--band:#2F6F7E} .post:nth-child(3) .post-link{transform:rotate(-1.2deg);--band:#7A4A85} .post:nth-child(4) .post-link{transform:rotate(2.2deg) translateY(8px);--band:#8A6217} .post:nth-child(5) .post-link{transform:rotate(-1.8deg);--band:#3F6B7A} .post .post-link:hover,.post .post-link:focus-visible{transform:rotate(0) translateY(-6px);box-shadow:0 24px 40px -20px rgba(34,30,25,.7);z-index:2} .post:hover,.post:focus-within{position:relative;z-index:2} .post-art{border-radius:3px;aspect-ratio:16/10;overflow:hidden;margin-bottom:1rem} .post:nth-child(1) .post-art{aspect-ratio:2/1} .post-art svg{width:100%;height:100%} .post h3{font-family:var(--font-display);font-weight:400;font-size:1.6rem;padding-inline:.4rem;margin-top:.4rem} .post:nth-child(1) h3{font-size:clamp(1.8rem,3vw,2.4rem)} .post-meta{padding-inline:.4rem} .post-meta span{color:var(--em)} .cta-box h2 em{font-style:italic;color:#F0B49F} .cta-box .form-status{color:var(--cta-ink)} .inline-form .btn-primary{background:var(--cta-ink);color:var(--cta-bg)} .inline-form input:focus-visible,.cta-box .btn:focus-visible{outline-color:var(--cta-ink)} .foot-small{margin-top:2.5rem} @media (max-width:900px){ .post-list{grid-template-columns:repeat(2,minmax(0,1fr))} .post:nth-child(1){grid-column:1 / -1} } @media (max-width:600px){ .post-list{grid-template-columns:1fr} .post:nth-child(2) .post-link,.post:nth-child(4) .post-link{transform:rotate(1.8deg)} } @media (prefers-reduced-motion:reduce){.post .post-link{transition:none}} EOF wc -l style.css; grep -c "foot-col" style.css
  8. ./style.css
  9. ./index.html
  10. node .claude/skills/tossed-card-magazine/scripts/check.mjs index.html --out check 2>&1 | tail -40
  11. ./script.js
  12. node .claude/skills/tossed-card-magazine/scripts/check.mjs index.html --out check 2>&1 | tail -40
  13. ./check/1440.png
  14. ./check/390.png
  15. sed -i '' 's/^\.post-list{display:grid;/.post-list{align-items:start;display:grid;/; s/^\.post-link{display:block;height:100%;/.post-link{display:block;/; s/^\.hero-cols{display:grid;grid-template-columns:repeat(3,minmax(0,1fr))/.hero-cols{display:grid;grid-template-columns:1fr 1.3fr .7fr/' style.css && node .claude/skills/tossed-card-magazine/scripts/check.mjs index.html --out check | tail -3
  16. ./style.css
  17. ./style.css
  18. ./style.css
  19. node .claude/skills/tossed-card-magazine/scripts/check.mjs index.html --out check | tail -3
  20. Done

10 Nov 2026 · Claude Code 2.1.322 with Claude Sonnet 5.5 · 2 min 29 s · $0.45 of API use

Questions

Is Tossed-Card Magazine free?

No. Tossed-Card Magazine 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 Tossed-Card Magazine?

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

What do I get when I buy Tossed-Card Magazine?

A ZIP of the whole skill folder (39 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 Tossed-Card Magazine?

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 ./tossed-card-magazine with your agent's flag.

What do I get from Tossed-Card Magazine?

One HTML file with its CSS inside: no build step, no framework. A magazine home page with articles as scattered cards. Checked at phone and desktop widths.

What does Tossed-Card Magazine need?

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

How big is Tossed-Card Magazine?

7 files, about 29,843 tokens in all. The SKILL.md is about 2,372 tokens, and your agent reads it only when the job fits.

What does a run cost?

Our 1 runs took 2 min 29 s to 2 min 29 s and $0.45 to $0.45 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 Tossed-Card Magazine to use it?

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