--- title: "Tools | grw—lab" description: "The grw—lab tools bench: Stylr, Qufy, and Claude RTL. Products, free utilities, and a shelf for skills." url: https://tools.grwlab.net/ updated: 2026-10-13T08:08:55+00:00 --- # Tools from the lab, and skills for the agent. Two things live here. Products open on their own sites. Skills install inside Claude. ## On the bench - [Stylr](https://stylr.dev/): Prompt recipes - [Qufy](https://qufy.app/): Freelance office - [Claude RTL](https://claude-rtl.grwlab.net/): Arabic on copy ## Stylr Live. Prompt recipes for UI builders. The public library is free to browse and copy, written for Cursor, Claude, v0, and Lovable. [Open stylr.dev](https://stylr.dev/) ## Qufy Private beta. A freelance office for rates, quotes, contracts, and hours. Price it, send it, get it signed. Invites are rolling out. [Open qufy.app](https://qufy.app/) ## Claude RTL Free · macOS. Fixes Arabic text direction when you copy, in the browser, Claude, and editors. Markdown and speech stay on the machine. [Open claude-rtl.grwlab.net](https://claude-rtl.grwlab.net/) ## Install a skill Open Claude Code. Paste line 1 once, then paste line 2 for the skill you want. Line 2 installs that skill alone. 1. `/plugin marketplace add grw-lab/skills` 2. `/plugin install video-reader@grw-lab` Line 2 above is Video Reader. Each skill page has its own line 2. Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` ## Skills Free agent skills, open source on GitHub, documented in full here. ### General - [Video Reader](https://tools.grwlab.net/skills/video-reader/index.md): Turns a video into a contact sheet, key frames, cut times and audio numbers so an agent can break it down without watching it. - [Agent-ready site](https://tools.grwlab.net/skills/agent-ready-site/index.md): Makes any website readable by AI agents: llms.txt, Markdown twins, AI crawler rules, JSON-LD, and an audit that scores it. - [Shared Server Deploy](https://tools.grwlab.net/skills/shared-server-deploy/index.md): Change one site on a shared cPanel, CWP, Plesk or Apache server without breaking its neighbours: discover, back up, test, reload, verify. - [Freelance Quote](https://tools.grwlab.net/skills/freelance-quote/index.md): Turns a client brief into a priced quote with ranged estimates, a visible buffer, and the terms that protect a freelancer. English and Arabic. - [Client brief](https://tools.grwlab.net/skills/client-brief/index.md): Turns a messy client message into a one-page brief with scope and open questions. It does not price the work. ### Design - [Design Tokens Extractor](https://tools.grwlab.net/skills/design-tokens-extractor/index.md): Pulls a design system out of a live site, CSS, or screenshots into named tokens, then writes CSS variables, Tailwind v4/v3, and DTCG JSON. - [RTL UI](https://tools.grwlab.net/skills/rtl-ui/index.md): Audits and fixes web interfaces for Arabic, Hebrew, Persian and Urdu: logical CSS, Tailwind, icon mirroring, bidi text and forms. - [UI inventory](https://tools.grwlab.net/skills/ui-inventory/index.md): Reads local HTML and CSS and lists the font sizes, colors, and corner radii in use, with counts. ### Arabic - [Arabic Localization](https://tools.grwlab.net/skills/arabic-localization/index.md): Take an app to Arabic end to end: all six plural forms, digits, currency, Gregorian and Hijri dates, fonts, and a QA pass. - [Arabic SEO](https://tools.grwlab.net/skills/arabic-seo/index.md): SEO for Arabic and bilingual sites: hreflang, dialect keywords, Arabic slugs and titles, Saudi and Gulf local signals, and Arabic font speed. ### Accounting - [ZATCA E-Invoice](https://tools.grwlab.net/skills/zatca-invoice/index.md): Build Saudi e-invoices: the ZATCA QR code (TLV + Base64), required fields, 15% VAT rounding, and a map of Phase 2 integration. - [VAT worksheet](https://tools.grwlab.net/skills/vat-worksheet/index.md): Sums sales and purchase VAT from a CSV. VAT due is sales VAT minus purchase VAT. A worksheet, not a filed return. ### Commerce - [Product sheet](https://tools.grwlab.net/skills/product-sheet/index.md): Turns a product CSV into a sheet with a slug and a VAT split. You write the Arabic title. It does not upload to a store. ## Studio [grw—lab](https://grwlab.net/) --- --- title: "Skills | grw—lab tools" description: "Free, open-source agent skills from grw—lab, documented in full: what each one does, how to install it, and where the source lives." url: https://tools.grwlab.net/skills/ updated: 2026-10-13T08:08:55+00:00 --- # Skills for the agents we build with Each skill is a folder of instructions an agent loads when the task fits. They are free, published on GitHub, and documented here in full. ## General ### [Video Reader](https://tools.grwlab.net/skills/video-reader/index.md) Turns a video into a contact sheet, key frames, cut times and audio numbers so an agent can break it down without watching it. - Category: General - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/video-reader - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install video-reader@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ### [Agent-ready site](https://tools.grwlab.net/skills/agent-ready-site/index.md) Makes any website readable by AI agents: llms.txt, Markdown twins, AI crawler rules, JSON-LD, and an audit that scores it. - Category: General - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/agent-ready-site - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install agent-ready-site@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ### [Shared Server Deploy](https://tools.grwlab.net/skills/shared-server-deploy/index.md) Change one site on a shared cPanel, CWP, Plesk or Apache server without breaking its neighbours: discover, back up, test, reload, verify. - Category: General - Works with: Claude Code, Cursor, Codex - Source: https://github.com/grw-lab/skills/tree/main/shared-server-deploy - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install shared-server-deploy@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ### [Freelance Quote](https://tools.grwlab.net/skills/freelance-quote/index.md) Turns a client brief into a priced quote with ranged estimates, a visible buffer, and the terms that protect a freelancer. English and Arabic. - Category: General - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/freelance-quote - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install freelance-quote@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ### [Client brief](https://tools.grwlab.net/skills/client-brief/index.md) Turns a messy client message into a one-page brief with scope and open questions. It does not price the work. - Category: General - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/client-brief - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install client-brief@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ## Design ### [Design Tokens Extractor](https://tools.grwlab.net/skills/design-tokens-extractor/index.md) Pulls a design system out of a live site, CSS, or screenshots into named tokens, then writes CSS variables, Tailwind v4/v3, and DTCG JSON. - Category: Design - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/design-tokens-extractor - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install design-tokens-extractor@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ### [RTL UI](https://tools.grwlab.net/skills/rtl-ui/index.md) Audits and fixes web interfaces for Arabic, Hebrew, Persian and Urdu: logical CSS, Tailwind, icon mirroring, bidi text and forms. - Category: Design - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/rtl-ui - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install rtl-ui@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ### [UI inventory](https://tools.grwlab.net/skills/ui-inventory/index.md) Reads local HTML and CSS and lists the font sizes, colors, and corner radii in use, with counts. - Category: Design - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/ui-inventory - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install ui-inventory@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ## Arabic ### [Arabic Localization](https://tools.grwlab.net/skills/arabic-localization/index.md) Take an app to Arabic end to end: all six plural forms, digits, currency, Gregorian and Hijri dates, fonts, and a QA pass. - Category: Arabic - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/arabic-localization - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install arabic-localization@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ### [Arabic SEO](https://tools.grwlab.net/skills/arabic-seo/index.md) SEO for Arabic and bilingual sites: hreflang, dialect keywords, Arabic slugs and titles, Saudi and Gulf local signals, and Arabic font speed. - Category: Arabic - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/arabic-seo - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install arabic-seo@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ## Accounting ### [ZATCA E-Invoice](https://tools.grwlab.net/skills/zatca-invoice/index.md) Build Saudi e-invoices: the ZATCA QR code (TLV + Base64), required fields, 15% VAT rounding, and a map of Phase 2 integration. - Category: Accounting - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/zatca-invoice - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install zatca-invoice@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ### [VAT worksheet](https://tools.grwlab.net/skills/vat-worksheet/index.md) Sums sales and purchase VAT from a CSV. VAT due is sales VAT minus purchase VAT. A worksheet, not a filed return. - Category: Accounting - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/vat-worksheet - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install vat-worksheet@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ## Commerce ### [Product sheet](https://tools.grwlab.net/skills/product-sheet/index.md) Turns a product CSV into a sheet with a slug and a VAT split. You write the Arabic title. It does not upload to a store. - Category: Commerce - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/product-sheet - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install product-sheet@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 --- --- title: "Video Reader: break a video into frames and cuts" description: "A free agent skill that turns an mp4 into a contact sheet, key frames, cut times and audio numbers, then writes a structured breakdown." url: https://tools.grwlab.net/skills/video-reader/ updated: 2026-10-13T08:08:55+00:00 --- # Video Reader > Turns a video into a contact sheet, key frames, cut times and audio numbers so an agent can break it down without watching it. - Category: General - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/video-reader - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install video-reader@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ## What it does Video Reader lets an agent study a video file. The agent cannot watch pictures move or hear the soundtrack, so the skill runs one script that makes things it can read: - A contact sheet of the whole video, with a timestamp under every frame. - Three large key frames, taken from the longest shots. - Cut times, and audio numbers: loudness per second, onset times, and a BPM only when those onsets are evenly spaced. It then writes a structured breakdown: what happens, how it moves, the rhythm, the visual style, and what to take if you want to make something in the same spirit. ## When to use it - You have an mp4, mov, webm or m4v and you want it broken down. - You want the cuts, the pacing, and the moves, with times attached. - You want to recreate the feel of a reference without copying its assets, logos or music. - You are cutting a film for Stylr, Qufy, Claude RTL, or the next tool, and you want the reference read the same way every time. ## Install This installs **video-reader** only. The other skills stay out. 1. Open Claude Code. 2. Paste line 1 and press Enter. This adds the catalog. Do it once, then skip it next time. 3. Paste line 2 and press Enter. This installs this skill. ```text /plugin marketplace add grw-lab/skills /plugin install video-reader@grw-lab ``` Claude confirms the install in the chat. The next message can use the skill. Every skill instead: keep line 1, and use this as line 2: ```text /plugin install grw-skills@grw-lab ``` On claude.ai, zip the `video-reader` folder and upload it in Settings → Capabilities → Skills. In Cursor or another agent, point it at `video-reader/SKILL.md`. The script also needs `ffmpeg` on your machine, plus Python packages `numpy` and `Pillow`. ## Usage - "Look at this video and tell me how it is cut." - "Break down the pacing. Where are the cuts, and do they land on the sound?" - "Make a film in this spirit for our tool. Take the timing, not their logo or their music." - "This is one continuous shot. Describe the move." You can also run the script on its own: ```bash python ~/.claude/skills/video-reader/scripts/analyze_video.py video.mp4 --out ./out ``` To pull one more frame: ```bash python ~/.claude/skills/video-reader/scripts/analyze_video.py video.mp4 --out ./out --frame 2.5 ``` ## Example A generated 6 second vertical reel, three flat colors, with a click every half second. The script printed: ```text reel.mp4 · 6.0s · 720x1280 · vertical · 30.0fps · audio yes cuts: 2.0, 4.0 contact sheet: 24 tiles at 4 fps keyframes: 1.00s, 3.00s, 5.00s tempo: about 120 BPM from regular onsets ``` The same file with the audio removed comes back `audio no` and no BPM. A landscape clip with no color change comes back `cuts: none`. ## What's inside | File | What it's for | |---|---| | `SKILL.md` | The steps the agent follows, and the rules against inventing cuts, tempo or typography. | | `references/report-template.md` | The breakdown the agent fills in after reading the images and `summary.json`. | | `scripts/analyze_video.py` | The pipeline. Needs ffmpeg, numpy and Pillow. Writes only inside `--out`. | | `README.md` | Install and command line usage for a person running the script directly. | ## FAQ **Can it hear the voiceover?** No. Loudness, onset times and a BPM (only when the onsets are regular) are the whole audio report. Speech, lyrics, instruments and genre have to come from you. **Why does a quiet talking video have no BPM?** The tempo is the gap between sudden volume jumps. Speech is uneven, so the script refuses the BPM instead of printing a wrong one. The median gap is still in `summary.json`. **What if the video is one take?** `cuts` is empty. The report should say it is one continuous shot, or that the transitions are too soft to count as cuts. **Will it copy the reference?** The report has a "Don't copy" list: assets, logos, another product's interface, and the music. The skill is for reading the timing and the moves. **What do I need installed?** ffmpeg (which includes ffprobe), Python 3.9 or newer, numpy and Pillow. No account and no network. --- --- title: "Agent-ready site: llms.txt and AI crawler skill" description: "A free agent skill that audits a website for AI agents and adds llms.txt, Markdown twins, AI crawler rules, JSON-LD and a catalog. Apache, Nginx, Next.js." url: https://tools.grwlab.net/skills/agent-ready-site/ updated: 2026-10-13T08:08:55+00:00 --- # Agent-ready site > Makes any website readable by AI agents: llms.txt, Markdown twins, AI crawler rules, JSON-LD, and an audit that scores it. - Category: General - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/agent-ready-site - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install agent-ready-site@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ## What it does Agent-ready site makes a website easy for AI agents to find, read and cite. It audits the site, then adds the layer agents look for: - `llms.txt`, a Markdown map of the site, and `llms-full.txt`, the whole site in one file. - A Markdown twin of every page, served when an agent sends `Accept: text/markdown`, and at `/page/index.md` and `/page.md`. - `robots.txt` rules for each named AI crawler (training, search, and user-triggered), with a `Content-Signal` line that says how your content may be used. - JSON-LD on every page, a `catalog.json` of what the site offers, and a sitemap with real `lastmod` dates. - HTML fixes so the content is in the page without running JavaScript. It ships with an audit script that scores any URL out of 100, and recipes for Apache, Nginx, Next.js, Vercel, Netlify and Cloudflare. ## When to use it - You want your site to show up, and be quoted correctly, in ChatGPT, Claude, Perplexity or Gemini answers. - You want to decide which AI companies may train on your content, and which may only search or read it for a user. - You maintain docs, a product site or a catalog that agents should be able to read as clean text. - You want a quick report on how agents see your site today. ## Install This installs **agent-ready-site** only. The other skills stay out. 1. Open Claude Code. 2. Paste line 1 and press Enter. This adds the catalog. Do it once, then skip it next time. 3. Paste line 2 and press Enter. This installs this skill. ```text /plugin marketplace add grw-lab/skills /plugin install agent-ready-site@grw-lab ``` Claude confirms the install in the chat. The next message can use the skill. Every skill instead: keep line 1, and use this as line 2: ```text /plugin install grw-skills@grw-lab ``` On claude.ai, zip the `agent-ready-site` folder and upload it in Settings → Capabilities → Skills. In Cursor or another agent, point it at `agent-ready-site/SKILL.md`. ## Usage - "Audit https://acme.com for AI agents and tell me what to fix first." - "Make this Next.js site agent-ready. Add llms.txt and Markdown versions of every page." - "Let AI search cite us, but don't let anyone train on our content. Update robots.txt." - "Our docs are a React SPA. Make sure agents can read them without JavaScript." You can also run the audit on its own: ```bash node ~/.claude/skills/agent-ready-site/scripts/audit.mjs https://acme.com/ ``` ## Example Before, a typical site: ``` Markdown FAIL Accept: text/markdown returns Markdown HTTP 200 · text/html llms.txt FAIL /llms.txt exists HTTP 404 robots.txt WARN Names AI crawlers explicitly 0/13 named Score: 29/100 · 8 required check(s) failing ``` After, the same checks on tools.grwlab.net, which uses this setup: ``` Markdown PASS Accept: text/markdown returns Markdown HTTP 200 · text/markdown; charset=utf-8 PASS Vary: Accept on negotiated responses accept,accept-encoding llms.txt PASS Starts with a single # H1 # grw—lab tools PASS Sections list Markdown links (- [name](url)) 7 links robots.txt PASS Names AI crawlers explicitly 13/13 named PASS Content-Signal declared ai-train=yes, search=yes, ai-input=yes Score: 100/100 · 0 required check(s) failing ``` An agent asking for the home page as Markdown: ```bash curl -H "Accept: text/markdown" https://tools.grwlab.net/ ``` ```markdown --- title: "Tools | grw—lab" url: https://tools.grwlab.net/ --- # The bench, rebuilt for the tools we ship ... ``` ## What's inside | File | What it's for | |---|---| | `SKILL.md` | The workflow the agent follows: audit, fix HTML, add the Markdown layer, robots, headers, structured data, verify. | | `references/llms-txt.md` | The llms.txt and llms-full.txt format, with a full example. | | `references/crawlers.md` | AI crawler names by type, Content-Signal, and three ready-made policies. | | `references/servers.md` | Recipes for Apache, Nginx, Next.js 16 and Cloudflare Workers (all tested), plus Vercel and Netlify (checked against their docs). | | `references/structured-data.md` | JSON-LD patterns, the catalog.json shape, and sitemap rules. | | `scripts/audit.mjs` | The audit. Node 18+, no dependencies. Exits non-zero when a required check fails, so it works in CI. | ## FAQ **Does llms.txt improve my Google ranking?** No search engine has said it uses llms.txt for ranking. It helps agents and tools that read it find your clean content quickly. The bigger wins for search are server-rendered HTML, structured data and an accurate sitemap. **If I block GPTBot, will I disappear from ChatGPT?** Not by itself. GPTBot is OpenAI's training crawler. ChatGPT search uses OAI-SearchBot, and ChatGPT-User fetches pages a person asks about. The skill explains each one, so you block only what you mean to. **Is robots.txt enough to stop AI training?** robots.txt and Content-Signal state your preference. Well-behaved crawlers follow them. To enforce a block, add a WAF or bot-management rule at your host or CDN. **Will Markdown twins create duplicate content?** The HTML page stays canonical. Twins are served on request or at `.md` URLs, are left out of the sitemap, and are linked as `rel="alternate"`. **My host isn't listed.** The behavior is the same everywhere: negotiate on Accept, send Vary: Accept, serve `.md` as text/markdown. Pick the closest recipe, adapt it, then confirm with the audit script. --- --- title: "Shared Server Deploy: safe agent deploys" description: "A free agent skill for deploying to shared servers safely: read-only discovery, backups, config tests, graceful reloads, and neighbour checks." url: https://tools.grwlab.net/skills/shared-server-deploy/ updated: 2026-10-13T08:08:55+00:00 --- # Shared Server Deploy > Change one site on a shared cPanel, CWP, Plesk or Apache server without breaking its neighbours: discover, back up, test, reload, verify. - Category: General - Works with: Claude Code, Cursor, Codex - Source: https://github.com/grw-lab/skills/tree/main/shared-server-deploy - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install shared-server-deploy@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ## What it does Shared Server Deploy teaches your agent to change one site on a server that hosts many, without breaking the others. It discovers the setup read-only, backs up what it will touch, keeps every edit inside the site you named, tests the config before a graceful reload, and then checks that every neighbouring site still answers the way it did before. It comes from a real deploy on a CWP server running a dozen client sites, Node apps, mail, and a control panel. Every trap in it is one we hit or nearly hit. ## When to use it - You ask an agent to deploy, add PHP, edit a vhost or `.htaccess`, or fix permissions on a server that also runs other sites. - The server uses cPanel, CWP, Plesk, DirectAdmin, or plain Apache or Nginx. - You want a record of what changed and a one-line rollback. It is not for containers or platforms like Vercel, where each app is already isolated. ## Install This installs **shared-server-deploy** only. The other skills stay out. 1. Open Claude Code. 2. Paste line 1 and press Enter. This adds the catalog. Do it once, then skip it next time. 3. Paste line 2 and press Enter. This installs this skill. ```text /plugin marketplace add grw-lab/skills /plugin install shared-server-deploy@grw-lab ``` Claude confirms the install in the chat. The next message can use the skill. Every skill instead: keep line 1, and use this as line 2: ```text /plugin install grw-skills@grw-lab ``` On claude.ai, zip the `shared-server-deploy` folder and upload it in Settings → Capabilities → Skills. In Cursor or another agent, point it at `shared-server-deploy/SKILL.md`. ## Usage - "Deploy this folder to tools.example.com. The server has other sites, only touch that one." - "PHP returns 500 on my subdomain. Find out why without changing anything yet." - "Add a security header to example.com's vhost and make sure nothing else breaks." - "Before you reload Apache, show me which sites live on this box." ## Example You ask: *"Enable PHP for tools.example.com. Be careful, this server has other client sites."* The agent runs discovery and finds the docroot is nested inside the main site's WordPress folder, PHP runs through suPHP, and the subdomain's vhost has no user mapping. It then: 1. Records the status of all sites on the box (all 200). 2. Backs up the two vhost files to `/root/deploy-backups/tools.example.com/20261008T101320Z/`. 3. Adds only the user mapping block, copied from the main site's vhost. 4. Runs `apachectl -t` (Syntax OK) and a graceful reload. 5. Re-checks every site: all still 200. PHP on the subdomain now runs as the site user. 6. Reports the change, the backup path, and the rollback command. ## What's inside | File | Purpose | |---|---| | `SKILL.md` | The five rules, the step-by-step workflow, rollback, and a table of traps that cause outages. | | `scripts/discover.sh` | Read-only report: OS, panel, web server, ports, PHP handler, vhost files, docroot owner, `.htaccess` chain, other domains. | | `scripts/neighbours.sh` | Saves every site's HTTP status before a change and compares after. Exits 1 if anything changed. | | `references/panels.md` | Where CWP, cPanel, Plesk, DirectAdmin, and plain Apache or Nginx keep vhosts, logs, and safe custom config. | | `references/htaccess-inheritance.md` | How a parent `.htaccess` leaks into a nested docroot, and how to stop it. | ## FAQ **Does it need root?** Discovery mostly works without root. Editing vhosts and reloading Apache needs root or sudo. The skill runs site builds as the site user, not root. **Will the control panel overwrite the change?** Sometimes. The skill checks which panel you run and prefers its include folder or custom-config hook. `references/panels.md` lists them. **Does it restart the web server?** No. It only uses a graceful reload, after the config test passes. A restart drops live connections on every site. **What if a neighbour breaks anyway?** `neighbours.sh after` exits with an error and the agent stops, shows the table, and offers the rollback command from the backup it made first. --- --- title: "Freelance Quote: agent skill for pricing projects" description: "A free agent skill that turns a client brief into a priced quote: PERT estimates, buffer, pricing model, scope, payment terms. English and Arabic templates." url: https://tools.grwlab.net/skills/freelance-quote/ updated: 2026-10-13T08:08:55+00:00 --- # Freelance Quote > Turns a client brief into a priced quote with ranged estimates, a visible buffer, and the terms that protect a freelancer. English and Arabic. - Category: General - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/freelance-quote - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install freelance-quote@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ## What it does Freelance Quote turns a client brief into a quote you can send. It reads the email, call notes, or RFP, asks only the questions that change the price, breaks the work into tasks, and estimates each one as a range. It then adds a visible buffer, picks a pricing model, and writes the terms that protect you: assumptions, exclusions, revision rounds, a change-request process, payment schedule, and a validity date. It works in English and Arabic. The Arabic templates are written in natural Arabic, not translated line by line. It never invents your rate, currency, or tax rate. If it doesn't know them, it asks. ## When to use it - A new brief arrives and you need a price today. - You keep underquoting because hidden tasks (calls, QA, revisions, deployment) never make it into the estimate. - A client asks for "one small thing" mid-project and you need a polite, priced change request. - You need a proposal for a competitive bid, with two or three options. - The client writes in Arabic and expects the quote in Arabic. ## Install This installs **freelance-quote** only. The other skills stay out. 1. Open Claude Code. 2. Paste line 1 and press Enter. This adds the catalog. Do it once, then skip it next time. 3. Paste line 2 and press Enter. This installs this skill. ```text /plugin marketplace add grw-lab/skills /plugin install freelance-quote@grw-lab ``` Claude confirms the install in the chat. The next message can use the skill. Every skill instead: keep line 1, and use this as line 2: ```text /plugin install grw-skills@grw-lab ``` On claude.ai, zip the `freelance-quote` folder and upload it in Settings → Capabilities → Skills. In Cursor or another agent, point it at `freelance-quote/SKILL.md`. ## Usage - "Here's the brief from a new client. Quote it at 75 USD an hour, 15% VAT." - "Turn these call notes into a quote and a short proposal with three options." - "The client wants a booking calendar added. Write a change request." - "اكتب عرض سعر بالعربية لهذا المشروع، بالريال السعودي، وسعري ٣٥٠ ريال للساعة." - "Is fixed price or a day rate better for this project?" ## Example **Brief (excerpt):** "We need a bilingual company site, about 6 pages, Arabic and English, contact form, we have a logo. Launch in two months." The skill asks four questions (who writes the copy, how many revision rounds, hosting, hard launch date), then estimates the work. Its estimate script prints: ```text | Deliverable | Task | Low h | Likely h | High h | Expected h | Amount | |---|---|--:|--:|--:|--:|--:| | Build | Arabic RTL version | 8 | 12 | 20 | 12.7 | 950.00 USD | | ... | | Subtotal (expected, 101.3 h) | 7,600.00 USD | | Buffer (15%) | 1,140.00 USD | | Rounding (up to the nearest 50) | 10.00 USD | | VAT (15%) | 1,312.50 USD | | Total | 10,062.50 USD | Range: 68 to 152 h. Expected 101.3 h. 95% confidence: 108.6 h. ``` The quote it writes groups that into four deliverables, with a 40/30/30 payment schedule, two revision rounds, a 30-day validity date, and an exclusions list (copywriting, photography, hosting fees, maintenance after launch). ## What's inside | File | What it's for | |---|---| | `SKILL.md` | The workflow: extract, ask, break down, estimate, buffer, price, terms, output. | | `scripts/estimate.py` | Three-point (PERT) estimates from a CSV or JSON task list. Prints totals with buffer, rounding, and VAT. No installs needed. | | `references/pricing-models.md` | Fixed, milestones, day rate, retainer, value-based. Formulas and when to use each. | | `references/quote-template.md` / `.ar.md` | Quote templates in English and Arabic. | | `references/proposal-template.md` | A short proposal with options. | | `references/scope-of-work-template.md` | A scope of work to lock down deliverables after acceptance. | | `references/change-request-template.md` / `.ar.md` | Change requests in English and Arabic. | | `references/questions.md` | Discovery questions by project type. | | `examples/` | Sample task lists and the script's output. | Once the quote is ready, you can send it, get it signed, and track it in [Qufy](https://qufy.app/). ## FAQ **Will it decide my rate for me?** No. It asks for your rate and currency and leaves placeholders until you answer. It can explain pricing models, but the number is yours. **Why ranges instead of one number?** A single number hides risk. Ranges show the client, and you, where the uncertainty is. The script turns ranges into an expected total and a 95% confidence figure so you can see whether your buffer is big enough. **Can it write my contract?** It drafts terms and a scope of work, but it is not legal advice. For large or high-risk projects, have a lawyer review the agreement. **Does it handle VAT?** It adds a separate tax line at the rate you give it, and rounds before tax so the VAT line stays exact. It does not assume whether you are VAT registered. **Does it work for retainers and hourly work?** Yes. Ask for a retainer or a day-rate quote and it adds a cap, included hours, rollover rules, and a reporting rhythm. --- --- title: "Client brief from a messy message" description: "A free agent skill that turns a WhatsApp thread, email, or transcript into a one-page brief with scope and open questions. It does not invent a price." url: https://tools.grwlab.net/skills/client-brief/ updated: 2026-10-13T08:08:55+00:00 --- # Client brief > Turns a messy client message into a one-page brief with scope and open questions. It does not price the work. - Category: General - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/client-brief - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install client-brief@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 # Client brief ## What it does Reads a messy client message and writes a one-page brief: what they asked, what is in scope, what is out, and the questions still open. It does not price the work. ## When to use it A WhatsApp thread, an email, or a transcript that needs to become a job description before anyone quotes. ## Install This installs **client-brief** only. The first line is once per machine. ``` /plugin marketplace add grw-lab/skills /plugin install client-brief@grw-lab ``` To install every grw—lab skill instead, use this as line 2: ``` /plugin install grw-skills@grw-lab ``` On claude.ai, zip this folder and add it under Settings, Capabilities, Skills. In Cursor, copy `SKILL.md` into the project skills folder. ## Usage Paste the client message and ask for the brief. The reply follows `references/brief-template.md`. Missing budget, deadline, or audience stays under Open questions. ## Example Source: "نحتاج لاندينج بسيطة للحملة، ثلاث سكاشن، والأسبوع الجاي لو أمكن. الميزانية نتكلم فيها بعدين." The brief says the landing page and three sections are in scope. Budget and the exact deadline are open questions. The next step is one question: which week, and is a date fixed. No price is written. ## What's inside `SKILL.md` and `references/brief-template.md`. No script. Pricing stays in the freelance-quote skill. ## FAQ **Can it send the brief to the client?** Only if you ask it to. The default is to show you the brief first. **Why is there no price?** A brief and a quote are different jobs. Use freelance-quote once the scope is agreed. --- --- title: "Design Tokens Extractor: agent skill for CSS and Tailwind" description: "A free agent skill that extracts colors, type, spacing and more from any site into named tokens, checks contrast, and emits CSS, Tailwind, and DTCG JSON." url: https://tools.grwlab.net/skills/design-tokens-extractor/ updated: 2026-10-13T08:08:55+00:00 --- # Design Tokens Extractor > Pulls a design system out of a live site, CSS, or screenshots into named tokens, then writes CSS variables, Tailwind v4/v3, and DTCG JSON. - Category: Design - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/design-tokens-extractor - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install design-tokens-extractor@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ## What it does Design Tokens Extractor reads what a design already uses and turns it into a small, named token set. It measures colors, type, spacing, radii, shadows, breakpoints, motion, and z-index from a live page, CSS files, a Tailwind config, a Figma export, or screenshots. Then it merges near-duplicates, checks contrast, and writes the result as CSS variables, a Tailwind v4 theme, a Tailwind v3 config, and a Design Tokens (DTCG) JSON file. The scripts measure; the agent names. You get primitives (`gray-200`, `indigo-600`) and semantic roles (`text`, `muted`, `border`, `accent`) that point at them. ## When to use it - An older site has grown 30 shades of gray and nobody knows which is right. - You are moving a project to Tailwind and want a theme that matches what is already live. - You need a style guide for a site that never had one. - You are rebuilding a design from screenshots and want a starting palette and type scale. - You want a contrast report for every text and background pair in use. ## Install This installs **design-tokens-extractor** only. The other skills stay out. 1. Open Claude Code. 2. Paste line 1 and press Enter. This adds the catalog. Do it once, then skip it next time. 3. Paste line 2 and press Enter. This installs this skill. ```text /plugin marketplace add grw-lab/skills /plugin install design-tokens-extractor@grw-lab ``` Claude confirms the install in the chat. The next message can use the skill. Every skill instead: keep line 1, and use this as line 2: ```text /plugin install grw-skills@grw-lab ``` On claude.ai, zip the `design-tokens-extractor` folder and upload it in Settings → Capabilities → Skills. In Cursor or another agent, point it at `design-tokens-extractor/SKILL.md`. The scripts need Node 18 or newer and nothing else. ## Usage - "Extract design tokens from `src/styles/*.css` and give me a Tailwind v4 theme." - "Open our homepage, pricing, and blog post pages and pull the real colors and type scale." - "Our CSS has too many grays. Consolidate them and tell me which ones fail contrast." - "Here are three screenshots of the app. Draft a palette and type scale, and mark what's estimated." - "Convert our tokens.json to DTCG format." ## Example A hand-written marketing stylesheet with near-duplicate colors goes in: ```css .card { background: #fff; border: 1px solid #e5e7eb; } .card--muted { background: #f9fafb; border-color: #e6e8eb; } .btn--ghost { color: #4f46e5; border: 1px solid #4F46E5; } ``` The color script merges `#e6e8eb` into `#e5e7eb` and `#f9fafb` into `#ffffff`, and grades contrast: ```text 17 colors → 15 clusters (threshold ΔEok ≤ 2.5). | Hex | OKLCH | Draft name | vs #ffffff | | #4f46e5 | oklch(51.1% 0.230 277.0) | indigo-500 | 6.29:1 AA | | #6b7280 | oklch(55.1% 0.023 264.4) | neutral-500 | 4.83:1 AA | | #e5e7eb | oklch(92.8% 0.006 264.5) | neutral-200 | 1.24:1 fail | ``` After review, the semantic layer reads like this: ```json "semantic": { "text": "{color.gray-900}", "muted": "{color.gray-500}", "border": "{color.gray-200}", "accent": "{color.indigo-600}" } ``` And the Tailwind v4 output starts: ```css @theme { --color-gray-900: #111827; --color-text: #111827; --text-base: 1rem; --text-base--line-height: 1.5; --spacing-4: 1rem; --radius-md: 0.75rem; } ``` ## What's inside | File | What it's for | |---|---| | `SKILL.md` | The workflow: pick a source, extract, cluster, draft, name, emit, report. | | `scripts/extract.mjs` | Collects every design value from CSS files, with usage counts. | | `scripts/computed-styles.js` | Browser snippet that captures what the page actually renders. | | `scripts/colors.mjs` | Merges near-duplicate colors in OKLCH and checks WCAG contrast. | | `scripts/draft.mjs` | Builds a starter token file with draft names and a 4px spacing grid. | | `scripts/emit.mjs` | Writes CSS variables, Tailwind v4, Tailwind v3, and DTCG JSON. | | `references/sources.md` | How to read each kind of source, and their limits. | | `references/naming.md` | Primitive and semantic naming, scales, dark mode. | | `references/formats.md` | Every output format and its caveats. | | `examples/` | A fixture stylesheet run through every step, with all outputs. | Want ready-made prompt recipes to build UI on top of your new tokens? Browse [Stylr](https://stylr.dev/). ## FAQ **Does it need any packages?** No. The scripts use only Node's standard library. Node 18 or newer is enough. **Will it change my brand colors to pass contrast?** No. It reports failures and suggests the nearest passing shade. Changing a brand color is your decision. **Why OKLCH for merging colors?** Distances in OKLab match how different two colors look far better than hex or RGB distances. Two grays that look identical get merged; a gray and a faint blue tint stay apart. **Which DTCG version does it write?** The 2025.10 stable spec by default, with object values for colors and dimensions. Pass `--dtcg legacy` for the older string format if your tool expects it. **Can it read Sass or Less variables?** Compile to CSS first and run the extractor on the output. Variables in source files are not parsed. --- --- title: "RTL UI: free agent skill for right-to-left web interfaces" description: "An open-source agent skill that audits and fixes web UIs for Arabic and Hebrew: logical CSS, Tailwind classes, icon mirroring, bidi text and RTL forms." url: https://tools.grwlab.net/skills/rtl-ui/ updated: 2026-10-13T08:08:55+00:00 --- # RTL UI > Audits and fixes web interfaces for Arabic, Hebrew, Persian and Urdu: logical CSS, Tailwind, icon mirroring, bidi text and forms. - Category: Design - Works with: Claude Code, Claude.ai, Cursor - Source: https://github.com/grw-lab/skills/tree/main/rtl-ui - Add the catalog once: `/plugin marketplace add grw-lab/skills` - Install this skill: `/plugin install rtl-ui@grw-lab` - Every skill instead, as line 2: `/plugin install grw-skills@grw-lab` - License: MIT - Version: 0.1.0 - Updated: 2026-10-10 ## What it does RTL UI teaches your agent to make a web interface work in right-to-left languages: Arabic, Hebrew, Persian and Urdu. It finds the CSS and Tailwind classes that only work left to right, replaces them with logical ones, sets `dir` and `lang` correctly, and decides which icons should flip and which must not. It also covers the problems that show up after the layout is fixed. Phone numbers and emails come out scrambled inside Arabic sentences. Inputs that should stay left to right get flipped. Arabic fonts render with broken letter spacing. Carousels and keyboard arrows move the wrong way. The skill ships with a small scanner (`rtl-audit.mjs`) that lists every physical property and class in your code, with the logical replacement next to each one. It needs Node 18 or later and nothing else. ## When to use it - You are adding Arabic, Hebrew, Persian or Urdu to an existing site or app. - A page looks broken or half-reversed in RTL. - You want a component library or Tailwind setup reviewed before you add a second language. - Mixed Arabic and English text shows up in the wrong order. It does not translate or write Arabic copy. For that, use [Arabic Copy](/skills/arabic-copy/). ## Install This installs **rtl-ui** only. The other skills stay out. 1. Open Claude Code. 2. Paste line 1 and press Enter. This adds the catalog. Do it once, then skip it next time. 3. Paste line 2 and press Enter. This installs this skill. ```text /plugin marketplace add grw-lab/skills /plugin install rtl-ui@grw-lab ``` Claude confirms the install in the chat. The next message can use the skill. Every skill instead: keep line 1, and use this as line 2: ```text /plugin install grw-skills@grw-lab ``` On claude.ai, zip the `rtl-ui` folder and upload it in Settings → Capabilities → Skills. In Cursor or another agent, point it at `rtl-ui/SKILL.md`. ## Usage Ask in plain words. For example: - "Add RTL support to this Next.js app. We're launching in Arabic." - "Audit `src/components` for RTL problems and fix them." - "The phone number shows up backwards in the Arabic checkout. Fix it." - "Convert this Tailwind component to logical classes." - "Which icons in our icon set should flip in Arabic?" To run only the scanner: ```bash node ~/.claude/skills/rtl-ui/scripts/rtl-audit.mjs src node ~/.claude/skills/rtl-ui/scripts/rtl-audit.mjs src --only tailwind --json ``` It exits with code 1 when it finds something, so you can use it in CI. ## Example Before: ```tsx
{price}
{price}