Skip to content
Back to skills

Paper Grid

ASecurity

Style for edit-video: a white paper pane with a quiet grid above the speaker and one clean animated UI artifact per spoken line (cards that type, counters, lists that expand, approvals that click). Use for tool, repo, skill or feature explainers where each sentence names something that can be drawn as UI.

  • 6 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 7, 2026
ai-agentspythonrustgonode

Works with

  • cursor
  • terminal
  • cli

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 9 files and shows the line behind each finding

Scanned October 7, 2026

npx -y skills add alisadiq-ai/favstash-ai-video-editing-skills --skill paper-grid --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Paper Grid?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Paper Grid
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/alisadiq-ai-paper-grid/badge)](https://www.skillsdirectory.com/skills/alisadiq-ai-paper-grid)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: paper-grid
description: "Style for edit-video: a white paper pane with a quiet grid above the speaker and one clean animated UI artifact per spoken line (cards that type, counters, lists that expand, approvals that click). Use for tool, repo, skill or feature explainers where each sentence names something that can be drawn as UI."
---

# Paper grid

A style on top of `edit-video`, which owns the cut, captions, sound and review. The
top half is white paper with a quiet grid; the speaker stays in the bottom half.
Every spoken item gets its own small, living artifact: a card types, a counter
climbs, a row lights up, a cursor clicks.

## Fixed identity, open imagination

Keep the identity: white paper, the quiet grid, white cards with one rim, one navy
accent, Helvetica Neue, one clear idea per beat, real proof for facts. Everything
else is designed for the story in front of you.

- **The library is a vocabulary, not a template.** Use a component when it is the
  best picture of the line, and invent a new artifact when it isn't: a terminal that
  types, a diff that turns green, a flowchart that wires itself.
- **Each reel should feel designed for its topic.** Change which artifacts appear,
  how they connect, the rhythm and the one or two moments that surprise.
- **Aim for one screenshot-worthy idea per reel:** an object that transforms into
  the next beat, a satisfying click, a counter that lands on the spoken word.

Fits a talking head about a tool, repo, workflow or feature. Dark or saturated room
footage benefits most: the white pane gives contrast and a clean seam. Not for
personal reflections, jokes over footage or long screen demos that need the whole frame.

## The look (starting defaults)

| Element | Setting |
|---|---|
| Paper | `#fbfbfd` pane at y 0–960. Grid 45px minor / 180px major lines at 5.5% / 10% ink, radial fade at the edges, drifting one cell over the reel |
| Seam | Hard split at y=960 with a 1px light line and a soft shadow into the camera |
| Cards | White, 30px radius, one 1px rim, soft drop shadow, about 740–820 wide, centered on x=540 |
| Chips | 64px white capsules with a 42px icon tile, 28px bold |
| Ink | `#0f172a` text, `#64748b` muted, navy accent `#1e40af` / `#5b9eff`. Red, amber and green only where they mean something |
| Type | Helvetica Neue. Card text 30–36px, labels 21–28px, hero figures 200–270px |
| Skeletons | Grey bars and gradient avatars stand in for people and body text; only the words that carry the point are real |

Tokens live in `scripts/paper_grid.py` (`TOKENS`), component CSS in
`assets/paper-grid.css`. Override per reel with `Reel(tokens=...)`.

## Layout and motion

- **Split for almost everything.** Artifacts sit at y 270–940; captions go on the
  speaker's headroom (about y=.55). Set `split_video_top` from the actual take so the
  head starts below the caption band.
- **Full camera only for re-hooks** ("but the best part is…"): push in over the line,
  then return to the split on the reveal word.
- **Frame 1 shows the product moving:** open on the split with the first artifact
  already on screen and settling.
- **One artifact per spoken item, on its word.** It enters on the noun and acts on
  the verb. Entrances .35–.45s (cards rise 50px, chips pop), exits .2s, 6 frames
  before the next item. Carry one object through related beats.
- Keep it alive with typing, counters, a highlight sweep, a live dot; no perpetual
  shimmer, spin or bounce. Start from the [motion library](references/motion-library.md).

## Truth rules

- **Real proof for facts:** the actual repo page, list or product screen
  (`scripts/capture_page.py`), checked against the source that day. Crop to the
  content that reads at phone size and push into the words that carry the beat.
- **Mockups stay generic:** skeleton posts and counters carry no real names or
  results; unmeasured meters carry an `ILLUSTRATIVE` label and no numbers.
- Don't reuse a reference creator's graphics or identity. Borrow the mechanism only.

## Build

Needs Python 3.10+ and the workspace runtime from `edit-video`'s
`init-workspace.mjs --install` (HyperFrames and GSAP). Snapshots and page captures
also need `pip install playwright` and Google Chrome.

1. Cut the dialogue with `edit-video` and keep a word timeline; beat frames come from it.
2. Capture proof into the run's `assets/`, cropped to the fact that matters.
3. Write the run's build script: one `with reel.scene(...)` per beat
   ([example_build.py](scripts/example_build.py) shows the mechanics, not a storyboard):
   ```python
   sys.path.insert(0, '<this skill>/scripts')
   from paper_grid import Reel
   reel = Reel('<run>/work/grid-v01', camera='<run>/assets/camera.mp4', total=1314)
   ```
   `compile()` writes the HyperFrames folder and checks the timeline script.
4. Look before rendering: `python3 scripts/snap.py <comp> <out> 0,40,120` for stills.
5. Render with `.favstash-studio/runtime/node_modules/.bin/hyperframes render <comp> --fps 30 --quality high --output <raw>.mp4`,
   then `scripts/fix-frame0.sh <raw> <visual>.mp4` if frame 0 came out black.
6. Assemble dialogue, captions and sound in your editor or with FFmpeg, and review
   with `edit-video`.

## Sound map (`edit-video`'s SFX pack)

| Visible event | Cue |
|---|---|
| Frame 1 | `curated/hook-impact.wav` |
| Split ↔ full camera | `curated/camera-shutter.wav`; the light shutter for a smaller change |
| Re-hook build | `curated/metallic-riser.wav`, resolving on the reveal |
| Card, chip or pill arrival | `curated/ui-pop.wav` (merge arrivals under ~6 frames apart) |
| Toggle, highlight, button press | `curated/ui-click.wav` |
| Expand, shrink, fly-away | `curated/zoom-swish.wav` |
| Typed text | `typing-tick.wav`, one cue per ~0.9s of typing |
| Earned approval | `clean-ding.wav`, once |

## Pitfalls already paid for

- Anything that enters later must start hidden (`opacity:0`), or it shows before its cue.
- Put initial state in `gsap.set`; a `tl.set` at 0 alone can revert on seek.
- A `<video>` given only a width renders at the file's pixel height and letterboxes.
  Set an explicit height with `object-fit:cover`.
- Give every component a distinct id; the library's own layers use `root`, `top`,
  `grid`, `seam`, `camFull`, `camSplit` and their `V` videos.
- Snapshots can race on seek. Trust the encoded render when they disagree.

Files in this skill

  • SKILL.md6.2 KB
  • agents/openai.yaml324 B
  • assets/paper-grid.css10.9 KB
  • references/motion-library.md3.9 KB
  • scripts/capture_page.py1.1 KB
  • scripts/example_build.py3.3 KB
  • scripts/fix-frame0.sh567 B
  • scripts/paper_grid.py41.2 KB
  • scripts/snap.py1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…