Risemi
Filters1
API contract review — branch feat/orders-v2 vs main

| # | Change | Endpoint | Severity | Rule |
|---|---|---|---|---|
| 1 | `customer_id` removed from response | GET /api/v1/orders/{id} | BREAKING | removed response field (R2) |
| 2 | `status` enum gains `refunded` | GET /api/v1/orders | ADDITIVE, risky | new enum value; strict clients may throw (A4) |
| 3 | `limit` max lowered 100 → 50 | GET /api/v1/orders | BREAKING | tightened validation (R5) |
| 4 | `X-Request-Id` header documented | all | COSMETIC | docs only |

Verdict: 2 breaking changes. Mobile 2.3.x reads `customer_id` on the order screen and will render an empty name.

Recommendation: keep `customer_id` as a deprecated alias for two releases, raise `limit` back to 100 with a server-side cap, and ship `refunded` behind the existing `status` field with a changelog note. No new API version needed if both are done.

Migration note for client teams: handle unknown `status` values as `other` before 2026-12-01.
SkillCodeFree
  • Claude Code
  • Codex
  • Copilot
  • +1
Coding✦ Risemi pick

API Contract Reviewer

Catches breaking REST changes in a PR before merge: diff vs spec, severity table, migration notes.

0 installs
Free
Use case: Product teaser (template 1)

| Element | Value |
|---|---|
| Subject | A matte black ceramic pour-over coffee dripper with a thin polished copper rim, sitting on a clear glass carafe |
| Action | 1) A thin stream of dark coffee trickles from the dripper into the carafe while soft steam curls up from the rim; 2) the dripper and carafe turn a slow quarter turn; 3) the final second holds still on the dripper's front, copper rim catching the light |
| Scene | A walnut kitchen counter by a window, early morning just after sunrise, a faint haze of steam in the air, uncluttered background |
| Angle / Move | Vertical close-up at counter height, slightly above eye level / slow dolly in |
| Lens | 85mm-style telephoto feel, shallow depth of field, kitchen background in soft bokeh |
| Light / Palette / Mood | Soft low-angle morning sunlight from a window on the left with gentle fill and a warm rim on the copper / matte black, warm copper, honey-brown walnut, soft cream highlights / calm, quiet, unhurried |
| Style / Time | Premium commercial look, photorealistic / real-time pace, steady trickle throughout, still hold in the last second |
| Audio | Close, clear coffee trickling into glass, a faint soft drip, quiet low morning room tone, no music |
| Negative | text, logos, letters, labels, hands, people, clutter, reflections of people, plastic look |

Final prompt (paste into Veo / Gemini / Flow):

Premium commercial look, photorealistic, vertical close-up at counter height of a matte black ceramic pour-over coffee dripper with a thin polished copper rim, sitting on a clear glass carafe on a walnut kitchen counter by a window in the early morning just after sunrise. A thin stream of dark coffee trickles from the dripper into the carafe while soft steam curls up from the rim, and the dripper and carafe turn a slow quarter turn. Slow dolly in, 85mm-style telephoto feel, shallow depth of field with the kitchen background in soft bokeh. Soft low-angle morning sunlight from a window on the left with gentle fill and a warm rim light catching the copper, palette of matte black, warm copper, honey-brown walnut and soft cream highlights, calm and quiet mood. Real-time pace; the final second holds still on the dripper's front.
Audio: close, clear sound of coffee trickling into a glass carafe, a faint soft drip, quiet low morning room tone, no music.
Negative prompt: text, logos, letters, labels, hands, people, clutter, reflections of people, plastic look

Settings: 9:16, 8 seconds, audio on.
SkillTextPro
  • ChatGPT
  • Claude
  • Gemini
  • +1
Marketing

Prompt Anatomy for Veo

Use it to turn a rough video idea into a structured Veo prompt with a filled anatomy table, camera, lens, light, audio and a negative prompt.

0 installs
$7.99
Project: fresh `npm init -y` + `npm i -D vitest typescript` (Vitest 5.1.0, TypeScript strict). Every runner output below is pasted from the actual run.

Behaviour list (simplest first): 1. returns empty for blank input · 2. returns the address trimmed and lowercased when valid · 3. returns malformed when there is no @ · 4. returns malformed when there is more than one @ · 5. returns malformed when the domain has no dot · 6. returns too_long when the address is over 254 characters

Cycle 1: returns empty for blank input

```
[TDD] cycle 1/6  step RED  behaviour: returns empty for blank input
test:    src/validateEmail.test.ts > validateEmail > returns empty for blank input
ran:     npx vitest run src/validateEmail.test.ts -t "returns empty for blank input"
result:  FAIL  Error: Cannot find module './validateEmail' imported from <project>/src/validateEmail.test.ts
reason:  right (the unit under test does not exist yet: missing function, not a typo in the test)
changed: src/validateEmail.test.ts (+8, new file)
next:    minimum code in src/validateEmail.ts
```

```
[TDD] cycle 1/6  step GREEN  behaviour: returns empty for blank input
ran:     npx vitest run src/validateEmail.test.ts -t "returns empty for blank input" --reporter=verbose; npx vitest run src/validateEmail.test.ts
result:  PASS  Tests 1 passed (1)
changed: src/validateEmail.ts (+9, new file: result types + hard-coded `{ ok: false, error: 'empty' }`)
next:    refactor
```

Refactor: no refactor (hard-coded return is forced into the general version by cycle 2).

[Cycles 2–6 follow the same shape: each RED shows a real assertion mismatch such as `Tests 1 failed | 1 skipped (2)`, each GREEN the passing count, with refactors in cycles 5 and 6.]

Done

```
[TDD] DONE  cycles 6  tests added 6  suite PASS
ran:     npm test   (vitest run)   and   npx tsc -p .
result:  Test Files  1 passed (1) | Tests  6 passed (6); tsc exit 0
pre-existing failures: none (no tests existed)
found, not fixed: the 254 boundary itself (exactly 254 chars accepted) has no test; it passes today, so a test would be green on first run. 'a@.com' and 'a@b.' are accepted because the spec only asks for a dot in the domain.
```

No-fake-green check before every GREEN: no `.skip`/`.todo`, no assertion weakened, no test-only branch, nothing mocked.
SkillCodeFree
  • Antigravity
  • Claude Code
  • Codex
  • +3
Coding

Red-Green TDD Loop

Use it to make your coding agent build every change test-first: one failing test, the minimum code, a refactor, and a status block after each step.

0 installs
Free
> Assumption: signed-in users read their own orders and create their own orders as `pending`; every status change after that is made by your server with the `service_role` key, never by the browser.

Audit: `public.orders` (about 1.8M rows)

Rule files applied: `security-rls-basics`, `security-rls-performance`, `security-privileges`, `schema-foreign-key-indexes`, `query-missing-indexes`, `query-composite-indexes`, `schema-data-types`, `schema-constraints`, `lock-short-transactions`, `monitor-explain-analyze`.

Findings, by rule (first 6 of 12)

| # | Severity | Rule | Finding |
|---|---|---|---|
| 1 | CRITICAL | `security-rls-basics` | `orders_insert ... with check (true)` lets anyone who can insert write an order for any `user_id`. Combined with finding 2, an anonymous visitor holding only your public anon key can create orders on behalf of any user. |
| 2 | CRITICAL | `security-privileges` | `grant select, insert, update ... to anon`. Orders belong to signed-in users, so `anon` needs no privilege at all. None of the three policies has a `to` clause, so each applies to every role, including `anon`. |
| 3 | HIGH | `security-privileges` | `authenticated` can `update` every column of its own rows: the owner can still run `update orders set status = 'paid', total_cents = 1` from the browser. |
| 4 | HIGH | `security-rls-basics` | The insert path also trusts `status`: a client can insert a row that is already `status = 'paid'`. |
| 5 | HIGH | `security-rls-performance` | All policies call `auth.uid()` bare, so it is evaluated per row. Wrap it as `(select auth.uid())` so it is evaluated once per statement. |
| 6 | HIGH | `schema-foreign-key-indexes`, `query-missing-indexes` | No index on `user_id`. It is the foreign key, the RLS filter column and the column every "my orders" query filters on. Each RLS-filtered select over 1.8M rows is a sequential scan. |

Fixing migration (file 1 of 2, excerpt)

```sql
set local lock_timeout = '5s';

revoke all on public.orders from anon;
revoke update, delete, truncate, references, trigger on public.orders from authenticated;
grant select, insert on public.orders to authenticated;

drop policy if exists orders_select on public.orders;
drop policy if exists orders_insert on public.orders;
drop policy if exists orders_update on public.orders;

create policy orders_select on public.orders
  for select to authenticated
  using ((select auth.uid()) = user_id);

create policy orders_insert on public.orders
  for insert to authenticated
  with check ((select auth.uid()) = user_id and status = 'pending');
-- No update or delete policy: denied for every role except service_role.
```

File 2 holds only `create index concurrently if not exists orders_user_id_created_at_idx on public.orders (user_id, created_at desc);` because `concurrently` cannot run inside the transaction the Supabase CLI wraps around each migration.

[The full answer continues with findings 7–12, the lock plan for 1.8M rows, the status and total_cents check constraints added `not valid` then validated, an `explain analyze` to run before and after, and one RLS test per role.]
SkillCodePro
  • Antigravity
  • Claude Code
  • Codex
  • +3
Coding

Postgres Rules for Supabase Projects

Use it to make your coding agent follow Supabase's 31 Postgres rules for RLS, indexes, schema and migrations before it touches your database.

0 installs
$9.99
Beat sheet

| Beat | Purpose | What the viewer must get | Seconds |
|---|---|---|---|
| 1 | Hook | A reporter in the rain, recording a source who is trusting him with something | 4 |
| 2 | Problem / stakes | The recording is precious and private; the small device in his wet hand is what holds it | 4 |
| 3 | Reveal | Later that night, at home, he sets Fieldnote down and starts it working | 4 |
| 4 | Proof | The words appear on its own e-ink screen: transcribed on the device, no laptop, no cloud | 8 |
| 5 | Payoff + CTA | He has every word, privately; music enters; end line | 4 |

Storyboard table (shots 1–3 of 6)

| # | Sec (gen → use) | Framing | Camera move | Subject action | Dialogue / on-screen text | Audio / ambience | Continuity notes |
|---|---|---|---|---|---|---|---|
| 1 | 4 → 4 | Medium shot, eye level, over the source's shoulder (her back soft in frame-left foreground); he stands under the awning facing screen left | Slow handheld push-in | Holds Fieldnote out toward her at chest height; listens; gives one small nod | Source (on camera, from behind): "They said it would stay between us." | Location A bed; her voice close; rain on the awning | Location A. Faces screen left. Recorder in his right hand, red light on. Jacket zipped halfway, wet shoulders. |
| 2 | 4 → 4 | Extreme close-up on his right hand holding Fieldnote, the source's coat a soft blur beyond | Static | Rain beads on the graphite body; the red light glows steadily; his thumb shifts once on the edge | VO: "What they tell me stays with me." | Location A bed, close rain ticks on the device | Location A. Recorder points screen left. Screen pale grey and blank. Ends with recorder centred, for a match cut. |
| 3 | 4 → 4 | Medium close-up on the kitchen table under the pendant lamp | Static | His right hand enters from frame right and sets Fieldnote down, centred; his thumb presses the round button; hand withdraws | none | Location B bed; soft tap of the recorder on wood; one button click | Location and lighting change (B). Match cut from shot 2 on recorder position. Device dry now, red light off. |

[The full answer continues with shots 4–6 and a coverage alternate, the ten-line continuity block pasted word for word into all seven shot prompts, each prompt's first and last frame, and the stitch plan with voice-over script, caption placement and export settings.]
SkillTextPro
  • ChatGPT
  • Claude
  • Kling
  • +2
Video

Storyboard to Shot Prompts for Sora

Use it to turn a script or one-paragraph brief into a beat sheet, storyboard table, matching per-shot Sora 2 prompts and a stitch plan.

0 installs
$7.99
Settings: model `sora-2` · size `1280x720` · seconds `8` · characters: none

Before

A cool cinematic shot of a woman drinking coffee in a nice cafe, make it 10 seconds.

After

Style: Contemporary 35 mm film look, natural and understated, soft contrast, fine grain, warm-neutral grade.

A small neighbourhood cafe on a quiet weekday morning. A woman in her early 30s with shoulder-length dark hair tied loosely back, wearing an oatmeal knit sweater, sits alone at a round marble table by a large street-facing window. In front of her: a white ceramic cup of black coffee on a matching saucer and a folded paper napkin. Behind her, out of focus, a wooden counter with an espresso machine and a barista moving between shelves of cups. Thin steam rises from the cup and catches the window light.

Cinematography:
Camera: medium close-up, eye level, from across the table at a slight angle; slow dolly-in
Lens: 50 mm feel; shallow depth of field, sharp on her face and the cup, background soft
Lighting: soft morning daylight through the window from camera left as key; warm tungsten pendant glow from the counter as background fill
Palette anchors: cream, warm walnut brown, soft white, muted sage, coffee black
Mood: calm, quiet, unhurried

Actions:
- She wraps both hands around the cup and lifts it slowly (first two seconds).
- She blows lightly across the surface, then takes one small sip.
- She lowers the cup to the saucer and looks out the window with a faint, relaxed smile (final two seconds).

Background Sound:
Low hiss of the espresso machine, soft clink of cups at the counter, muffled murmur of a few voices; no score.

What changed and why

- Removed "make it 10 seconds". Duration is an API parameter, not prose, and 10 is not a supported value (4, 8, 12, 16, 20). Set `seconds: 8` in the call; the prompt now fits 8 seconds of action.
- "Cool cinematic shot" became a named style. A specific aesthetic instead of a vague adjective, set first so it frames everything else.
- "Drinking coffee" became three timed beats. Lift, blow and sip, lower and look out. Beats with timing cues are far more reliable than a single vague verb.

[five more changes in the full answer: subject anchors, concrete nouns, one camera move, named light sources, background sound]
SkillVideoPro
  • ChatGPT
  • Sora
Marketing

Prompting Playbook for Sora 2

Use it to write or rewrite Sora 2 prompts with the right settings, camera, timed action beats, light, dialogue and sound.

0 installs
$7.99
Pricing audit: Draftwell pricing page

Input: pasted copy (no screenshot) · Product type: B2B SaaS · Value metric: seats plus AI credits (5 credits per draft) · Goal: more paid upgrades to Team from the 14-day no-card trial

Score: 8 / 27

| # | Criterion | Score | Evidence (quote or point at the page) |
|---|---|---|---|
| 1 | Plan architecture and count | 1 | Four plans, two of them for one person: Starter "1 seat, 2 projects, 300 AI credits" and Basic "1 seat, 3 projects, 800 AI credits" overlap. No plan says who it is for. |
| 2 | Anchor and decoy | 1 | Team carries "Popular", but its button is the same "Get started" as every other card. |
| 3 | Value metric clarity | 1 | Cards say "300 AI credits"; what a credit buys is only in the FAQ ("a draft uses 5 credits"). Nothing says what happens when credits run out. |
| 4 | Feature-table weight | 0 | "Compare plans (38 rows)" opens with "Post scheduler ✓✓✓✓, Content calendar ✓✓✓✓", features every plan has. |
| 5 | Free tier / trial logic and upgrade trigger | 1 | "All plans include a 14-day free trial." No card terms, no day-15 behaviour, no named trigger for moving to Team. |
| 6 | CTA hierarchy | 1 | "[Get started]" on all four cards, same weight. |
| 7 | Price presentation | 1 | "Annual: save 20%" states the saving, but prices appear only as "/mo" and no billed-annually total is shown. |
| 8 | Trust and risk reversal | 1 | Refund terms exist only as "Footer: Terms · Refunds · Privacy". |
| 9 | Entry points | n/a | Pasted copy only. |
| 10 | Copy and "why now" | 1 | "Plans that grow with you" is generic; benefits are feature names. |
| 11 | Mobile layout | n/a | Pasted copy only; need a phone screenshot. |

Read: an agency trialist sees two cheap one-seat plans, four identical buttons and credits they cannot translate into posts, so nothing pulls them up to Team.

Fixes

P0: Make Team the agency plan (criteria 1, 2, 6)
Problem: four "Get started" buttons and no "for" line give agencies no reason to pick Team over Basic.
Before:
> Team $39/mo (badge: Popular): 5 seats, 10 projects, 2,000 AI credits, approvals [Get started]
After:
> Team: for agencies with clients to approve
> $39/mo · 5 seats · 10 projects · about 400 drafts a month · approvals
> [Start 14-day Team trial]
> No card required

and on Basic: "Basic: for one freelancer · [Try Basic]".

[The full answer continues with P1 (price credits in drafts: 300 credits is about 60 drafts), P2 (spell out the trial and the switch to Team), one experiment with hypothesis, metric and guardrail, and the benchmarks used with their source labels.]
SkillTextPro
  • ChatGPT
  • Claude
  • Claude Code
  • +2
Marketing

Pricing Page and Paywall Audit

Use it to score a pricing page or in-app paywall on eleven criteria and get three ranked fixes with rewritten copy and one experiment to run.

0 installs
$9.99
Pack: `references/pack-product-shots.md`.

Three options

1. PS-09 Strawberry Milkshake Product and Infographic. A ready-made premium cold-drink hero shot: seamless pastel backdrop, realistic condensation droplets and "premium café advertisement" styling, which is exactly the look a chilled cold-brew can needs.
Prompt by @Strength04_X (𝐌), source: https://x.com/Strength04_X/status/2090665058980462697, via awesome-nano-banana-pro-prompts, CC-BY-4.0.

2. PS-02 Luxury Chocolate Ad Still Life. The only prompt in the pack that is a full ad layout with on-image copy, but you would have to delete its placeholder copy and invented logos and rebuild most of the props.
Prompt by @AiwithLucas_ (Lucas AI), source: https://x.com/AiwithLucas_/status/2089231817916420518, via awesome-nano-banana-pro-prompts, CC-BY-4.0.

3. PS-01 Premium Beverage Advertising Photography. Written for a beverage-brand hero ad and works from your attached references, but the prompt is only one line long, so lighting and composition would come from what you attach.
Prompt by @exywuu (Exywuu), source: https://x.com/exywuu/status/2092222318084788564, via awesome-nano-banana-pro-prompts, CC-BY-4.0.

Pick: PS-09

What to attach. Image 1: a clear, front-on photo of your real Northbound can, logo facing the camera.

Adapted prompt (4:5 Instagram ad)

Image 1: product photo of the Northbound cold-brew coffee can. Use this exact can.

A vertical 4:5 Instagram feed ad. A high-quality professional product photograph of a premium cold-brew coffee can, the 330 ml matte navy aluminium can from Image 1 with its white logo, standing upright and centered against a soft pastel pink seamless studio background. Preserve the can's exact shape, proportions, matte navy finish, white logo and label from Image 1; do not redesign it, recolour it or add any new graphics to it. The can sits on the same seamless surface with a few clear ice cubes and a small scatter of dark roasted coffee beans at its base. Realistic condensation droplets cover the can with soft reflections from the studio lights. Elegant soft lighting creates subtle natural shadows beneath the can. The can fills about 55% of the frame height in the lower two thirds of the image, logo facing the camera.

Text: the headline "Cold. Bold. Northbound." across the top third of the image, centered, in a bold clean white sans-serif with generous letter spacing, large enough to read on a phone. Render this headline exactly once, spelled exactly as written. Apart from the can's own logo from Image 1, no other text, no prices, no taglines, no extra logos, no watermark.

Ultra-sharp focus, DSLR macro beverage photography, premium café advertisement style, hyper realistic, clean commercial composition, 8K.

Tool settings: aspect ratio 4:5; in AI Studio or the API also set the output resolution to 2K so the headline stays sharp.

Prompt by @Strength04_X (𝐌), source: https://x.com/Strength04_X/status/2090665058980462697, via awesome-nano-banana-pro-prompts, CC-BY-4.0. Adapted: subject swapped from a strawberry milkshake in a glass to the Northbound can, Image 1 reference and preserve-the-product line added, 4:5 aspect ratio and headline added, the original's second (infographic) paragraph removed.

[The full answer ends with a one-fix-per-turn table for headline contrast, product drift, garbled text and framing.]
SkillImagesPro
  • Gemini
  • Nano Banana
Design

Curated Prompt Library for Nano Banana Pro

Use it to pick a provenance-checked Nano Banana Pro prompt and adapt it to your product, portrait or poster in one pass.

0 installs
$9.99
Assumption: no n8n-MCP server is connected in this session, so I took the skill's fallback path: I wrote the workflow JSON directly from the bundled rules and checked it by review (a rule-check script plus a dry run of every expression). The real validator (`validate_workflow`) was not run, and nothing was deployed.

How the skill routed this

| Step | Sub-skill used | What it decided |
|---|---|---|
| Shape | `n8n-workflow-patterns` | Webhook processing pattern: Webhook, then Validate, then Action, then Respond |
| Node parameters | `n8n-node-configuration` | Slack post needs a channel and text. `responseMode: "responseNode"`. `options.responseCode` set on every Respond node. UUID node ids, no placeholder credentials |
| Expressions | `n8n-expression-syntax` | Webhook data lives under `.body`. Use `$('Webhook').item.json.body.*` once past the IF node. `=` prefix on every expression field |
| Error paths | `n8n-error-handling` | Slack gets `onError: "continueErrorOutput"` and its `main[1]` is wired to the 500 responder. `retryOnFail` is on. Bad input is caught upstream and gets a 400 |
| Validation | `n8n-validation-expert` | Runtime-profile checks done by review. Security warnings get fixed (header auth on the webhook) |

```
Webhook ──> Validate Input ──true──> Post to #signups ──success (main[0])──> Respond 200 OK
                        └──false──> Respond 400 Invalid Input
                                     Post to #signups ──error (main[1])────> Respond 500 Slack Failed
```

Validation result (excerpt)

```
PASS  Webhook responseMode is responseNode (Respond nodes control the reply)
PASS  Every branch (success and each error) ends at a Respond to Webhook node: no hanging branch
PASS  'Post to #signups': onError=continueErrorOutput AND main[1] wired
PASS  'Post to #signups': retryOnFail with maxTries <= 5 and waitBetweenTries <= 5000
PASS  Every {{ }} field starts with = (no 'Expression requires = prefix' error)
PASS  Webhook fields read from .body, never $json.name / $json.email / $json.plan
…
43 passed, 0 failed
```

Expression dry run against sample webhook items:

```
valid           IF -> true  (Slack)  Slack text: New signup: Ana Lima (ana@example.com) on pro
missing_plan    IF -> false (400)
bad_email       IF -> false (400)
no_body         IF -> false (400)
500 body:   {"error":"upstream_error","message":"The signup was received but could not be posted to Slack. Please retry later."}
```

Not verified without the server: the node typeVersions (Webhook 2.2, IF 2.3, Slack 2.3, Respond 1.5) and the Slack v2 parameter names; confirm by opening the nodes after import.

[The full answer also holds the six-node list, the importable workflow JSON and the expressions table with the reason behind each one.]
SkillCodePro
  • Antigravity
  • Claude Code
  • Codex
  • +4
Coding

n8n Builder Skills for Coding Agents

Use it to have your coding agent build, configure and validate n8n workflows without the usual expression and node-config mistakes.

0 installs
$12.99
Template used: #2 YouTube thumbnail from `templates/use-cases.md`, with one extra line for the chart.

Defaults I chose, and why
- No numbers on the chart. The only figure in your request is 60%. If I asked for axis labels or dollar amounts, the model would make them up. The headline carries the number; the bars just show the drop.
- The "-60%" is spelled out. A minus sign next to a number is a common place for text errors, so the prompt names each character.
- `quality="high"`. The template defaults to `medium`; close-up faces and exact text both call for high.

Final prompt

A 16:9 YouTube thumbnail for a video titled "How I cut our AWS bill by 60%".

Scene: a dark, near-black navy studio backdrop, softly blurred, with a faint vignette and a subtle cool rim light. Simple and uncluttered, high contrast against the subject.

Subject: a photorealistic man in his early-to-mid 30s, fictional (not a real person), short dark hair, light stubble, plain charcoal crew-neck t-shirt. He fills the LEFT half of the frame, framed from mid-chest up and large in frame, head and shoulders slightly turned toward the right side. His expression is genuine surprise: eyebrows raised high, eyes wide, mouth open in an "O". One hand is raised near his cheek, palm open, fingers natural. He is looking toward the chart on the right, not at the camera. Sharp focus, bright key light on his face, real skin texture.

Chart: on the RIGHT half, a bold, simple bar chart of 5 glossy red (#E53935) bars that step down sharply from left to right, the tallest bar on the left and the shortest on the right. A thick red arrow runs diagonally downward along the tops of the bars, ending in an arrowhead at the bottom right. Flat, clean graphic style with a soft glow. No axis labels, no numbers, no gridlines and no legend on the chart.

Text (render exactly once, verbatim, no extra characters): "AWS BILL -60%". Spelled A-W-S, space, B-I-L-L, space, minus sign, 6, 0, percent sign. Heavy, condensed, all-caps sans-serif in bright yellow (#FFD400) with a thick black outline and a slight drop shadow. Placed on the RIGHT half, above the bar chart, the text block filling about one third of the frame height, left-aligned, never overlapping the man's face.

Style: bold, saturated, high-contrast YouTube thumbnail, readable at phone size. Yellow and red pop against the dark background.

Constraints: no other text anywhere, no AWS or Amazon logo, no other logos, no borders, no watermark, no emoji. Keep the bottom-right corner free of key detail (YouTube's timestamp sits there).

Settings: `model="gpt-image-2"`, `size="1536x864"`, `quality="high"`, `n=2`.

[The full answer also shows the filled template table, the Python call, and a one-change-per-turn fix table with a preserve list.]
SkillImagesPro
  • ChatGPT
  • GPT Image
Design

Prompt Kit for GPT Image

Use it to turn an image brief into a GPT Image prompt, with exact on-image text and the right size and quality settings.

0 installs
$7.99
2. Tool design

| Tool | Does | Inputs (constraints) | Returns | Read-only / destructive | Errors the model can fix |
|---|---|---|---|---|---|
| `find_customers` | Customers whose name or email contains the text, case-insensitive | `query` string 1–100 (trimmed), `limit` int 1–50 = 20, `cursor` optional | id, name, email; `next_cursor` | read-only, idempotent | no match: try a shorter part of the name or the email domain |
| `list_customer_orders` | One customer's orders, newest first | `customer_id` int ≥ 1, `status` enum optional, `limit`, `cursor` | customer + orders; `next_cursor` | read-only, idempotent | unknown customer: call `find_customers` |
| `get_order` | One order with the customer's name and email | `order_id` int ≥ 1 | order + customer (structured) | read-only, idempotent | not found: check the number or list the customer's orders |
| `refund_order` | Sets a paid order to refunded | `order_id` int ≥ 1, `confirm` int optional, must equal `order_id` | updated order, `previous_status: "paid"` | destructive, idempotent | no `confirm`: preview, ask the user; order pending or already refunded; not found |

Checklist notes: one rule for empty results (an `isError` result with a next step), applied to every tool. All SQL is parameterized. Read tools use a read-only SQLite handle; only `refund_order` opens a writable one, and its `UPDATE ... WHERE id = ? AND status = 'paid'` is a single statement. The guard on the destructive tool is server-side (the preview/confirm step), not just the `destructiveHint` annotation.

3. Scaffold

From `templates/typescript-server.md`. Installed: `@modelcontextprotocol/server` 2.4.0, `@modelcontextprotocol/client` 2.4.0, `zod` 4.6.7; Node 24.6.0.

```
build-an-mcp-server/
  data/seed.sql, data/shop.db     3 customers, 5 orders
  src/index.ts                    stdio entry point
  src/server.ts                   createServer(): the four tools
  src/shop.ts                     SQLite client module (the system being wrapped)
  test/smoke.ts                   spawns the server over stdio, calls every tool
```

5. Test (Inspector CLI, eval loop layer 2)

```
$ npx @modelcontextprotocol/inspector --cli npx tsx src/index.ts --method tools/call --tool-name get_order --tool-arg order_id=1001
{
  "content": [{ "type": "text", "text": "Order #1001 for Ada Lovelace <ada@example.com>: $49.99, paid, created 2026-10-02T09:15:00Z" }],
  "structuredContent": { "order": { "id": 1001, "customer_id": 1, "total_cents": 4999, "status": "paid", "created_at": "2026-10-02T09:15:00Z", "customer_name": "Ada Lovelace", "customer_email": "ada@example.com" } }
}
```

Built, tested, not tested

- Built: four tools over `data/shop.db`, server-side preview/confirm guard on `refund_order`, smoke test, configs for Claude Code, Codex and Cursor, README.
- Tested: starter smoke (pass), full smoke test 14 checks (pass), strict typecheck (pass), Inspector CLI call (pass), seed database unchanged after tests.
- Not tested: the Inspector web UI by hand and the model check (running the five real requests through a live Claude Code session and recording which tool it picks).

[The full answer also holds `src/shop.ts`, `src/server.ts`, `test/smoke.ts` and the three client config snippets.]
SkillCodePro
  • Antigravity
  • Claude Code
  • Codex
  • +3
Coding

Build an MCP Server

Use it to design, build, test and ship an MCP server your agents use well: 3 to 7 well-designed tools, a tested starter and ready client configs.

0 installs
$12.99
Phase 1: Root cause investigation
Full suite: FAIL test_expired_coupon_rejected_twice (tests/test_checkout.py:16) AssertionError: Coupon(code='OLD50', …expires_at=2020-01-01…) is not None.
In isolation the same test fails at a different line (17): AssertionError: 50.0 != 100.0. So the first lookup in a process is rejected and every later lookup is accepted; in the full suite the first lookup was done by test_expired_coupon_rejected. Cross-test pollution through module-level state.
Cache probe at the boundary: cache before [] → 1st None → cache after ['OLD50'] → 2nd Coupon(OLD50). Docstring says the cache was added in 3f2a1c9 "to cut DB reads": that is the regression point.
Trace (root-cause-tracing.md): apply_coupon → get_coupon → `if code in _CACHE: return _CACHE[code]`. get_coupon writes the coupon to _CACHE before the expiry check, and the cache-hit branch has no expiry check at all.

Phase 2: Pattern analysis
Working path: cache miss → _load → expiry check. Broken path: cache hit. Expiry depends on `now`, passed per call, so it cannot be a cached property; "don't cache expired coupons" alone would still serve a coupon cached while valid after it expires.

Phase 3: Hypothesis
"get_coupon returns cached coupons without re-checking expires_at against the caller's now; the cache was added around the lookup but the validity check stayed only on the miss path." Confirmed by the probe above.

Phase 4: Implementation
Failing test first: test_cached_coupon_rechecked_for_expiry (look up while valid, then after expiry) plus a setUp that clears the module cache. Before the fix: 5 tests, 2 failures, both for the expected reason.
Fix at the source: the cache stores the raw record; the expiry check runs on every lookup, cached or not.

    c = _CACHE.get(code)
    if c is None:
        c = _load(code)
        if c is None:
            return None
        _CACHE[code] = c
    if c.expires_at < now:
        return None
    return c

Verification: python3 -m unittest -v → Ran 5 tests … OK. The originally failing test in isolation, 3 runs: OK, OK, OK. Fix attempts: 1.
SkillCodePro
  • Claude Code
  • Codex
  • Copilot
  • +2
Coding

Systematic Debugging Loop

Stops your coding agent from guessing: root cause first, one hypothesis at a time, failing test before the fix.

0 installs
$9.99
Stage 1, brainstorm. Echo: accountants want one month of invoices as CSV. listInvoices({month}) already filters by YYYY-MM; the seed data has "Acme, Inc." (comma) and Bo "Bob" Ltd (quotes), so RFC 4180 quoting is required. One question: should drafts be included? Accountants usually book only issued invoices; I'd exclude them. (User: exclude.)

Approaches
A. A hand-written toCsv plus exportMonthCsv in a new src/invoices/csv.js: zero dependencies, testable. Recommended.
B. A CSV library: needs npm install, overkill for 8 columns.
C. Put the logic in store.js: mixes formatting with storage.
Small change, so a short design doc and no builder check. Written and approved: docs/specs/2026-11-07-invoice-csv-export-design.md (goals, non-goals, decisions, my calls: CRLF line endings, invalid month throws RangeError).

Stage 2, plan: docs/plans/2026-11-07-invoice-csv-export.md
Global Constraints: no dependencies; columns number, issued_at, client, net, tax, total, currency, status; CRLF and RFC 4180 quoting; drafts excluded.
Review Focus: a comma in the client name; quotes in the client name; an empty month returns the header only; a malformed month throws RangeError; a field containing a newline.
Task 1: CSV serializer. Create src/invoices/csv.js, tests/csv.test.js. Produces toCsv(rows, columns) and INVOICE_COLUMNS. Red, green, commit.
Task 2: Month export. Produces exportMonthCsv(month). Tests: October gives 3 lines and contains "Acme, Inc."; November gives the header only (INV-003 is a draft); '2026-1' and undefined throw RangeError.
User approved and chose inline execution.

Stage 3, ledger (.spec-first/sdd/…/progress.md)
Pre-flight: Ruling: plan Task 1 Step 2 expects FAIL "module not found"; accepted as the expected red for a brand-new module.
Task 1: complete (commits 2b2d09a..bb43c6c, tests: node --test → 2 of 2 passed after red ERR_MODULE_NOT_FOUND)
Task 2: complete (commits bb43c6c..6e3c9a7, tests: node --test → 3 of 3 passed)
Final review: fresh reviewer on the most capable model: "With fixes": 0 Critical, 2 Important, 3 Minor.
Final: fixed CSV formula injection (string fields starting = + - @ TAB CR get a leading '), test red → green, suite 5/5
Final: fixed impossible months 2026-13 / 2026-00 accepted, test red → green, suite 5/5
Final: Ruling: formula guard applies to string values only; negative numeric amounts (credit notes) stay numbers.
Final: minor (deferred): no UTF-8 BOM; Excel on Windows may garble non-ASCII client names.

git log, branch feat/invoice-csv-export
77d1a3b fix: neutralize spreadsheet formulas and reject impossible months in CSV export
6e3c9a7 feat: export a month of invoices as CSV
bb43c6c feat: add RFC 4180 CSV serializer for invoices
2b2d09a docs: invoice CSV export plan
7e753cd docs: invoice CSV export design
Finish options offered: merge, PR, keep, discard. […]
SkillCodePro
  • Claude Code
  • Codex
  • Copilot
  • +2
Coding

Spec-First Build

Idea to approved design to test-first plan to working code, with an approval gate between each stage.

0 installs
$9.99
Scope: app/dashboard/page.tsx and the modules it imports (components/charts, UsageCard, ProjectList, RichTextEditor, lib/api.ts).

| # | Rule | File:line | Impact | Finding |
|---|---|---|---|---|
| 1 | async-dependencies | app/dashboard/page.tsx:8-10 | CRITICAL | getProjects(user.id) and getUsage(user.id) depend only on `user` but are awaited one after the other: 3 sequential round trips before any HTML is sent, where 2 would do. Promise.all them. |
| 2 | bundle-barrel-imports | components/ProjectList.tsx:3 | CRITICAL | `import _ from 'lodash'` in a 'use client' file ships all of lodash for one sortBy. Use lodash/sortBy, or toSorted / localeCompare. |
| 3 | async-suspense-boundaries | app/dashboard/page.tsx:7-19 | HIGH | The whole page, including the static shell and RichTextEditor, waits for all three fetches. Move usage and projects into async children in <Suspense> so the shell streams first. |
| 4 | server-serialization | app/dashboard/page.tsx:16 | HIGH | The raw projects array goes to client ProjectList, which reads only id, name and status. Map to {id, name, status} on the server. |
| 5 | rerender-no-inline-components | components/ProjectList.tsx:7 | HIGH | `Row` is defined inside ProjectList, so every keystroke in the filter remounts every <li>. Interaction cost, not first load. Hoist Row. |
| 6 | rerender-derived-state-no-effect | components/UsageCard.tsx:4-5 | MEDIUM | percent is kept in state and set in useEffect: server HTML renders "0% of plan used" and the real value appears only after hydration. Compute it during render. |

Score: 62 / 100 (100 − 2×10 CRITICAL − 3×5 HIGH − 1×3 MEDIUM). This counts rule findings; it is not a measured load time.

Checked and not scored: the local charts barrel (five tiny stubs, tree-shakeable); RichTextEditor is a <textarea> today, so no dynamic import yet. Not a performance rule but it blocks the build: components/charts/index.ts re-exports names the chart files do not export, and page.tsx reads `params.id` synchronously though params is a Promise in Next 15.

What makes the first load slow, in order:
1. The server waterfall (rows 1 and 3). Parallelizing projects and usage removes one full round trip; Suspense lets the header paint after only getUser.
2. Client JS weight (row 2). A one-line import change.
3. Payload and first-paint correctness (rows 4 and 6).
Row 5 is an interaction cost; fix it after the others. Fixes were not requested, so no files were changed.
SkillCodePro
  • Claude Code
  • Codex
  • Copilot
  • +2
Coding

React Performance Rules

70 prioritized performance rules for React and Next.js that your agent applies while coding and scores in review.

0 installs
$9.99
Page type: paid-traffic landing page. Goal: trial starts. Traffic: Meta ads promising "bookkeeping that files itself". Method: HTML source read locally; load time and the rendered mobile layout were not checked.

| # | Dimension | Score | Evidence |
|---|---|---|---|
| 1 | Value proposition clarity | 4/5 | Subhead is concrete: "Connect your bank, review once a week, export tax-ready reports in one click." Audience named. |
| 2 | Headline effectiveness | 3/5 | "Bookkeeping that files itself." matches the ad, but step 3 says "Export the report when tax season arrives" and the FAQ says it doesn't replace your accountant. Nothing is filed. |
| 3 | CTA placement, copy, hierarchy | 2/5 | "Start free" is above the fold but links to #pricing; every plan button also points to #pricing, so the trial path loops back to itself. The word "trial" appears nowhere. |
| 4 | Visual hierarchy | 3/5 | Clean sections, good contrast on the mint CTA; the hero visual is a placeholder div. |
| 5 | Trust signals | 2/5 | "Trusted by" strip is five plain-text names. No testimonials, user count or reviews. |
| 6 | Objection handling | 4/5 | FAQ covers accountant, data on cancel, bank coverage, 14-day refund. Missing: bank-access security, setup time, what happens when the trial ends. |
| 7 | Friction | 2/5 | CTAs never leave the page; full nav with 4 links on a paid page. |
| | Overall | 20/35 | |

Quick wins
1. Point every trial CTA at the signup flow, not #pricing. A Meta click that hits "Start free" currently just scrolls.
2. Say "trial" on the button: "Start 14-day free trial", with "No card needed · cancel anytime" under it (only if true).
3. Replace the placeholder hero frame with a real screenshot of the weekly review screen.
4. Remove the nav links on the ad variant. Keep the logo and one CTA.
5. Pull the refund line and "read-only bank access via Plaid/TrueLayer" out of the FAQ and put them under the hero CTA.

Test ideas (from references/experiments.md)
- Headline: ad-exact vs ad-exact + definition. Defining "files itself" raises qualified trial starts and cuts early trial churn.
- CTA text: "Start free" vs "Start 14-day free trial". Naming the trial raises trial-start rate; "Start free" may be pulling people into the Free plan.

Copy alternatives, headline A: "Bookkeeping that files itself. You just check 10 minutes a week." […]
SkillTextPro
  • ChatGPT
  • Claude
  • Claude Code
  • +4
Marketing

Landing Page CRO Audit

Audit a live page that isn't converting: a 7-point scorecard, quick wins, test ideas and before/after copy.

0 installs
$9.99
Method: dual-agent (A: design review · B: detector + browser overlay)

Design Health Score, site/index.html (Persuade surface)
| # | Heuristic | Score | Key issue |
|---|---|---|---|
| 1 | Visibility of system status | 3 | FAQ shows +/–; nav has no current-section state |
| 2 | Match system / real world | 3 | "$" pricing next to VAT and "categorise" blurs the market |
| 3 | User control and freedom | 3 | Nav links vanish under 760px with no menu |
| 4 | Consistency and standards | 2 | Primary CTA purple in nav, mint in hero; 01–03 means both "feature" and "step" |
| 5 | Error prevention | 3 | "Start free" never says whether a card is required |
| 6 | Recognition rather than recall | 3 | Labelled nav, scannable sections |
| 7 | Flexibility and efficiency | n/a | Single-pass marketing page |
| 8 | Aesthetic and minimalist design | 2 | Largest object is an empty placeholder frame; glow is decoration |
| 9 | Error recovery | 2 | Pricing CTAs link to #pricing, the section they sit in |
| 10 | Help and documentation | 3 | FAQ answers switching objections; nothing on security |
| Total | | 24/36 | Acceptable (67%) |

Design specificity verdict. Copy is authored for Ledgerly ("the 3% you need to confirm queued for Friday", reminders on day 3/7/14); the visuals are category-interchangeable dark SaaS: indigo radial glow behind a centred hero, mint pill CTA, three identical 01/02/03 cards, a "Most popular" chip, and a placeholder frame where the product should be.
Deterministic scan: `impeccable detect --json site/index.html`, 13 findings: dark-glow ×6, numbered-section-labels ×3, hero-eyebrow-chip ×1, kicker-above-heading ×1, cramped-padding ×1, overused-font ×1.

Priority issues
- [P0] Hero visual is an empty placeholder. Fix: render a mocked weekly-review screen (unmatched-transaction queue, client match, export). Command: bolder, or new-work for the hero shot.
- [P1] Dead pricing CTAs: "Start free / Start Pro / Talk to us" link to #pricing, so the conversion click silently fails. Command: harden.
- [P1] No trust line at the bank-connection ask: read-only / encryption / provider line under the hero CTAs and step 01. Command: clarify.
- [P2] Inconsistent CTA colour hierarchy plus dark-glow shadows. Command: polish.
- [P2] Generic composition (eyebrow on every section, numbered feature cards, centred glow). Command: bolder.

Persona red flags. Jordan (first-timer): "P&L", "VAT", "quarterly estimates" unexplained; "Start Pro" does nothing. Riley (stress tester): footer Privacy/Terms are "#"; "Talk to us" on a self-serve $29 plan. Casey (mobile): nav links disappear with no menu; long scroll to dead pricing buttons.

Then, "make the hero call-to-action bolder without touching the rest": per bolder.md, amplified what the system already owns (Bricolage Grotesque 800, the mint accent, the pill radius) on a new `.btn-hero` class scoped to the hero: 60px tall, display face at 19px/800, a neutral offset elevation shadow instead of the coloured glow, hover/active/focus-visible states. Nav, pricing and the secondary button untouched; no copy added. Detector after the edit: 12 findings (was 13), all outside the edit's scope. […]
SkillCodePro
  • Claude Code
  • Codex
  • Copilot
  • +2
Coding

Impeccable Design Vocabulary

24 named design moves for your coding agent: bolder, quieter, typeset, distill, polish, plus a heuristic critique and a technical audit.

0 installs
$12.99
Ledgerly launch film: storylines (source: README.md and public/landing.html; every claim quoted from them)

The one thing: "Bookkeeping that files itself." In the viewer's words: "I only spend ten minutes on Friday confirming a few transactions." Spine: one freelancer, one Friday review, one real transaction travelling from the bank feed to the tax-ready report.

A. "Friday, 4:50 pm" (recommended). Device: a moment in someone's day. Form: object-to-object chain. A freelancer's week ends with a notification, "12 transactions to confirm", and the viewer expects an evening of spreadsheet work. Instead each thing they touch opens the next: the notification becomes the review queue, a confirmed row becomes a paid invoice whose reminders stop, the invoice becomes the line in a tax-ready report, and the export button becomes the Ledgerly mark. First two seconds: a laptop desktop at 16:50 on a Friday, a notification slides in, the cursor is already moving toward it. Look: the brand's ink-dark ground #01010d, one violet glow behind the product only, Bricolage Grotesque 800 titles, mint #88f9c0 rationed to the confirm tick, the paid stamp and "Start free". Sound: warm minimal pulse ~110 bpm, soft ticks on each confirm, a "paid" chime when the reminders stop.

B. "The 3%". Device: a number lands. Form: an endless zoom. A bank feed scrolls past too fast to read, everything sliding into place on its own; the camera dives into the few rows that did not, the "3% you need to confirm", and each confirm zooms into the next world.

C. "Files itself" (the bold one). Device: type carries the argument. Form: one frame that rebuilds. "Bookkeeping" breaks into transaction rows, "files" becomes folders the rows drop into, "itself" folds into the export button, the full stop becomes the mint dot of the logo.

Assumptions: 18–22 s, 16:9 1920×1080 at 30 fps, music and effects, no voice. Only you can answer: the landing page has no product screenshot; can you send the Friday review queue, an invoice with its reminder schedule, and the report export? Without them those beats use labelled placeholders.

SPEC.md (storyline A, excerpt)
GOAL: a freelancer feels "my Friday admin is ten minutes now" and clicks Start free.
TIME: 20 s × 30 fps = 600 frames. Music 110 BPM = 16.4 frames per beat.
MOTION: enter power3.out 18 f; move power2.inOut 14 f; exit power2.in 10 f; one spring (damping 0.55) on the paid stamp only; row stagger 3 f.
S1 0–48 Hook: desktop, clock "Fri 16:50", notification in by f6, click at f40.
S3 120–168 Reveal: "Bookkeeping that files itself." 104 px, "files itself." in mint, rows file themselves behind it.
S4b 244–320 Proof, chase: reminder chips Day 3 / 7 / 14 light in turn; money lands, chips stop, paid stamp springs.
S7 528–600 End card: Export button collapses into the mark f528–546, "Start free" lands f564 and holds.
BANNED: the purple glow anywhere but behind the product window; a title over a dimmed screenshot; the logo strip (no source says they are customers); any claim beyond the source; "Introducing" as the first line.
Next, with the CLI: npx hyperframes init ledgerly-launch --skip-skills → scenes → npx hyperframes check --json → snapshot --review → preview. […]
SkillCodePro
  • Claude Code
  • Codex
  • Copilot
  • +3
Design

HTML-to-Video Motion Graphics

Your agent writes launch films, explainers and social clips as HTML, CSS and GSAP scenes, checks them, and renders identical MP4s.

0 installs
$12.99
Round 1 (after reading the code: no users or auth anywhere, one global `invoices` array, invoice numbers are global INV-NNN strings)

❓ Q1 - Workspace as the tenant boundary: The store is one global invoices array with no owner field. Should a workspace own invoices, with every read/write scoped to one workspace?
➡️ Yes: workspace id on every invoice; all store calls take a workspace.

❓ Q2 - Identity without auth: There are no users or login in the codebase. Should this stay auth-free, with callers passing an `actor` user id the store checks against membership (real login later)?
➡️ Yes: pass actor in; authentication out of scope.

Round 2

❓ Q3 - Roles: Should members have roles, an owner who manages membership and members who only work on invoices?
➡️ Yes: owner + member.
❓ Q4 - Invoice numbering: Numbers are global INV-NNN today. Should each workspace have its own sequence starting at INV-001?
➡️ Yes.
❓ Q5 - Existing data: Should the three existing invoices move into a seeded default workspace, with its counter continuing from INV-003?
➡️ Yes.

User answered Q3 "no, keep it flat". Round 3 reshaped around flat membership: Q6 refuse removing the last member, Q7 duplicate add is a no-op, Q8 "not a member" distinct from "not found", Q9 email invites out of scope. Frontier empty; offered the spec.

Spec (.scratch/team-workspaces/spec.md, Status: ready-for-agent): Problem Statement, Solution, 15 user stories, Implementation Decisions (workspace is the tenant boundary; identity passed in, not authenticated; no roles; last-member guard; per-workspace numbering; store interface; error shapes; default-workspace migration; storage stays in-memory), Testing Decisions (one seam: the store module's public functions, existing node:test style), Out of Scope (auth, invites, roles, billing, database, moving invoices, audit log).

Tickets (.scratch/team-workspaces/issues/, one file each, dependency order):
01 Workspace-scoped invoice list with default workspace. Blocked by: none
02 Add and remove workspace members. Blocked by: 01
03 Create invoices with per-workspace numbering. Blocked by: 01
04 Update invoice status within a workspace. Blocked by: 01

Ticket 03, acceptance criteria: first invoice in a new workspace is INV-001, second INV-002; next in the default workspace is INV-004; two workspaces each get INV-001 independently; created invoice is visible to every member and to no non-member; non-member create fails with "not a member"; `npm test` passes.
SkillTextFree
  • Claude Code
  • Codex
  • Copilot
  • +2
Coding

Grill Me, Then Write the Spec

Your agent interviews you about a plan until nothing is assumed, then writes the spec and tracer-bullet tickets.

0 installs
Free
Design plan: Spoke & Stand landing page

Subject: a volunteer-run bike repair co-op in Leeds. Audience: people with a bike that needs fixing (students, commuters, tight budgets), would-be volunteers, bike donors. Primary job: get someone to turn up to a drop-in session with their bike, knowing when, where and what it costs.

Colour
- Galvanised steel #DCE3E6: page background, the colour of a workshop wall
- Overalls navy #1C2B44: all text and rules
- Stand blue #2F62B3: links, buttons, the repair-stand clamp in the hero
- Patch red #D23B2E: used once, the punch-hole ring on the repair ticket
- Manila tag #EAD9AE: only the repair ticket itself, never a background

Type. One family, Archivo variable (width 62 to 125). Display at width 112, weight 800, tight tracking, set big and flush-left like stencilled workshop signage; ticket and small print at width 75 like a printed job tag; body at 18px/1.55, measure 62ch. Scale 14 / 18 / 24 / 32 / 43 / 76.

Layout (left-aligned throughout; the ticket breaks into the right gutter)
  Fix your own bike.                 +-----o----------+
  We'll lend the tools               | REPAIR TICKET  |
  and a pair of hands.               | Tue 6-8.30pm  *|
  [Come to a drop-in]                | Thu 6-8.30pm   |
   Pay what you can, from £0         | Sat 10-1       |
  HOW A SESSION WORKS  1 Bring the bike  2 Get a stand  3 Fix it with a volunteer  4 Pay what you can
  WHAT WE CAN HELP WITH | WHAT WE CAN'T (yet)
  GIVE A HAND · FIND US (address, directions, accessibility note)
Alternative considered: a pegboard of tool outlines as the hero. Rejected: prettier, but hides the one thing visitors need (when to come).

Principles: the repair ticket is the one bold element, everything else quiet navy on steel; say the practical thing first (when, where, cost), no mission statement, no stats strip; structure only where the content has it (numbered steps because a session is a sequence; no cards, no shadows); one motion, the ticket swings once into rest on load, off with prefers-reduced-motion.

Review against the brief
- First instinct was warm cream, a serif display and a terracotta accent ("friendly community workshop"). That fits any cafe or charity. Changed to steel, navy and stand blue, taken from the actual workshop.
- First draft had a stats band ("2,400 bikes fixed, 60 volunteers"): generic big numbers, invented. Cut; the ticket with real session times replaces it.
- Small-caps eyebrows removed; headings in plain sentence case. A monospace face for the ticket is template chrome; Archivo's condensed width instead.

Built on approval as a single index.html (inline CSS, Archivo via Google Fonts, no JS): breakpoints at 860 and 560px, :focus-visible ring, ticket swing disabled under prefers-reduced-motion. […]
SkillCodePro
  • Claude Code
  • Codex
  • Copilot
  • +2
Coding

Frontend Design Without AI Slop

Makes your agent plan a design for your subject, check it against the generic AI look, then build. No cream-and-terracotta defaults.

0 installs
$9.99
$ python3 .claude/skills/design-system-generator/scripts/search.py "bakery food online ordering warm artisan" --design-system --persist -p "Crumb & Co" --output-dir "$PWD" -f markdown

Design System: Crumb & Co

Pattern
- Name: Funnel (3-Step Conversion)
- CTA Placement: Each step: mini-CTA. Final: main CTA
- Sections: Hero > Step 1 (problem) > Step 2 (solution) > Step 3 (action) > CTA progression

Style
- Name: Vibrant & Block-based
- Keywords: Bold, energetic, playful, block layout, geometric shapes, high color contrast, duotone
- Performance: cost:low | Accessibility: risk:conditional | requires: contrast-text-4.5, keyboard, visible-focus, reduced-motion

Colors
| Role | Hex | CSS Variable |
|---|---|---|
| Primary | #92400E | --color-primary |
| Secondary | #B45309 | --color-secondary |
| Accent/CTA | #92400E | --color-accent |
| Background | #FEF3C7 | --color-background |
| Foreground | #78350F | --color-foreground |
| Card | #FFFFFF | --color-card |
| Border | #FDE68A | --color-border |
| Destructive | #DC2626 | --color-destructive |
(16 roles in the full table)
Notes: Warm brown + cream white

Typography
- Heading: Playfair Display SC
- Body: Karla
- Mood: restaurant, menu, culinary, elegant, foodie, hospitality
- Google Fonts: https://fonts.googleapis.com/css2?family=Karla:wght@300;400;500;600;700&family=Playfair+Display+SC:wght@400;700&display=swap

Key Effects
Large sections (48px+ gaps), bold hover (color shift), large type (32px+), 200-300ms

Avoid (Anti-patterns)
- Poor food photos
- Hidden hours

Pre-Delivery Checklist
- [ ] No emojis as icons (use SVG: Heroicons/Lucide)
- [ ] cursor-pointer on all clickable elements
- [ ] Hover states with smooth transitions (150-300ms)
- [ ] Light mode: text contrast 4.5:1 minimum

✅ Design system persisted to design-system/crumb-co/MASTER.md

Agent, after reading MASTER.md back: colours, fonts and anti-patterns fit a bakery; the "Vibrant & Block-based" style and the funnel pattern are a weak match for this brief, so I kept the tokens and fonts and used your section list (hero, three menu items, order CTA, hours) for bakery/index.html, with the Tailwind config generated from the colour table. […]
SkillCodePro
  • Claude Code
  • Codex
  • Copilot
  • +2
Coding

Design System Generator

One-line brief in, full design system out: page pattern, style, colour tokens, font pairing and anti-patterns from a local database.

0 installs
$12.99
Mode: rewrite. Context: linkedin. Voice: inferred from the source (upbeat founder launch, first-person plural), kept.

Source (54 words):
> In today's fast-paced world, remote teams face a myriad of challenges. That's why we're thrilled to unveil Standup Bot — a game-changing tool that seamlessly streamlines your daily check-ins. It's not just a bot; it's a catalyst for collaboration. Whether you're a startup or an enterprise, Standup Bot has you covered. Let's dive in!

Issues found
- P1, formulaic opening: "In today's fast-paced world". Broad context before the point.
- P1, Tier 1A vocabulary: "game-changing", "seamlessly"; "Let's dive in!" is a "Let's" opener plus a Tier 1A hit, and nothing follows it.
- P1, template phrase (false breadth): "Whether you're a startup or an enterprise, Standup Bot has you covered".
- P1, "It's not X, it's Y": "It's not just a bot; it's a catalyst for collaboration."
- Tier 2 cluster (three in one paragraph): "myriad", "streamlines", "catalyst".
- Significance inflation: "a catalyst for collaboration" with nothing about what changes.
- Not flagged: one em dash (the linkedin profile allows two); "we're thrilled" is the writer's own launch voice and stays.

Rewrite
> Remote teams have a lot on their plate. That's why we're thrilled to launch Standup Bot, a tool that makes your daily check-ins simpler.

What changed: replaced the opener with a plain statement of the same idea; kept "That's why we're thrilled" and the second-person "your"; "unveil" became "launch"; "game-changing tool that seamlessly streamlines" became "a tool that makes … simpler", the only factual claim the source made; cut the "not just X" line, the false-breadth line and "Let's dive in!". No new dashes, fragments, stakes or claims added.

Gap left for the writer: the post never says what Standup Bot does, who it is for, or what "catalyst for collaboration" means. One concrete sentence from you would do more than anything an editor can add.

Second pass on the rewrite: Tier 1–3 vocabulary none; em dashes 0; templates none; rhythm 8 then 17 words. Remaining risk: brevity.
SkillTextFree
  • ChatGPT
  • Claude
  • Claude Code
  • +4
Writing

De-AI Your Writing

Strips AI tells from a draft without inventing a new voice: quoted flags, a clean rewrite, a second-pass check.

0 installs
Free
Short answer: ChatGPT can't recommend Ledgerly, because nothing it can retrieve says Ledgerly exists. Even after launch, a single landing page is not enough. A "best X for Y" shortlist comes from web-wide consensus (reviews, roundups, forums, press), not from your own site.

Visibility ladder (retrieved → cited → mentioned → recommended)
| Rung | Ledgerly today | What governs it |
|---|---|---|
| 1. Retrieved | No: not live, not in Bing's index (ChatGPT search draws from a Bing-based index) | Being indexed and crawlable |
| 2. Cited | No | Extractable, factual, fresh pages |
| 3. Mentioned | No | Entity recognition; the web talking about you |
| 4. Recommended | No | Aggregate third-party consensus, largely independent of your own content |

Source pool (one web search for the exact query, 2026-11-07; not a ChatGPT answer): only third-party roundups and affiliate lists (NerdWallet, business.org, Zapier, Fueler, Techjockey, Aspire). The same five apps recur: Wave, Zoho Books, FreshBooks, QuickBooks, Xero. I did not run ChatGPT, so I'm not reporting what ChatGPT says; run the query list yourself.

Extractability check on site/index.html: clear definition in the first paragraph, partial (the H1 is a slogan); self-contained answer blocks, fail; statistics with sources, fail; comparison table for "vs" queries, fail; FAQ, partial (good answers hidden in collapsed <details>, none answers "Is Ledgerly good for freelancers?"); schema markup, fail; author or founder, fail; freshness date, fail; query-shaped headings, fail.

Top fixes, by impact against effort
1. Launch, then get indexed in Bing and Google. robots.txt with a wildcard allow plus explicit allows for OAI-SearchBot, PerplexityBot, Claude-SearchBot and Bingbot; decide training crawlers (GPTBot, ClaudeBot) separately.
2. Seed third-party consensus: G2 and Capterra listings with the first 20–30 real reviews; pitch the roundups that already rank for the query with a specific angle ("$12/month, no per-transaction fees, automatic invoice chasing"). Test: if a model ignored your own domain, would the web still put you on the list? Today, no.
3. Rewrite the hero into an extractable definition (below).
4. Add /vs/freshbooks, then QuickBooks and Wave, in the "fair source" pattern. Do not publish a self-ranked "best bookkeeping apps" listicle: in the skill's data 69% of such citations recommended competitors.
5. Publish /pricing.md and /llms.txt; fix the Studio button ("Talk to us" on a plan with a public price reads as a sales wall to an agent).
6. JSON-LD: Organization, SoftwareApplication with Offer per plan, FAQPage.
7. Buyer-intent FAQs rendered open in the HTML. 8. Named founder, "Last updated", one dated sourced number. 9. Measure monthly: 8 queries, 3–5 runs per engine, log rung and framing.

Hero answer block (57 words, every fact from the existing page):
> Ledgerly is a bookkeeping app for freelancers and two-person studios. It connects to your bank through Plaid or TrueLayer (US, UK, EU), auto-categorises each transaction by category and client, chases unpaid invoices on day 3, 7 and 14, and exports tax-ready P&L, VAT and quarterly estimates. Free plan available; Pro is $12/month with no per-transaction fees. […]
SkillTextPro
  • ChatGPT
  • Claude
  • Claude Code
  • +4
Marketing

AI Search (GEO) Playbook

Get cited in AI Overviews, ChatGPT and Perplexity: visibility audit, crawler check, ranked fixes, answer-block rewrites.

0 installs
$9.99
v1.8.0 — 2026-11-06

New
- Library shows what you own. Prompts and skills you bought or claimed now live under *Library*, with copy and download on each card.
- Trending sort. The catalog can rank by installs in the last 14 days.

Improved
- Product pages load the preview gallery before the long description, so the first frame is the result, not the pitch.
- Search matches taglines as well as titles.

Fixed
- Copying a prompt no longer counts twice toward the daily Pro quota.
- Downloads from Safari keep the `.zip` extension.

Upgrade notes
- Run migrations `0028`–`0029` before deploying the API (new tables, no data changes).
- `LEGACY_WORKERS` defaults to off; set it to `true` only if you still send the recovery drip.
SkillTextPro
  • Claude Code
  • Codex
  • Cursor
  • +1
Coding

Release Notes From Git

Turns the commits since your last tag into user-facing release notes, grouped and in your voice.

0 installs
$7.99