--- 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
New

{price}

``` Scanner output: ``` Card.tsx 1:31 tailwind space-x-4 → gap-* on the flex/grid parent, or add rtl:space-x-reverse (Tailwind v3) 1:41 tailwind rounded-l-lg → rounded-s-lg 1:54 tailwind border-l-4 → border-s-4 1:65 tailwind pl-6 → ps-6 1:70 tailwind text-left → text-start 2:29 tailwind right-3 → end-3 3:15 css marginLeft → marginInlineStart rtl-audit: 7 findings in 1 file. ``` After: ```tsx
New

{price}

``` The same code now works in both directions. The badge stays at the end of the line, the accent border stays at the start, and the price keeps its order inside Arabic text. ## What's inside | File | What it's for | |---|---| | `SKILL.md` | The workflow and rules: direction, CSS, flex and grid, icons, bidi, numerals, Arabic typography, interaction, and a checklist for both directions | | `references/logical-properties.md` | Every physical → logical CSS property, and what to do where no logical version exists | | `references/tailwind.md` | Tailwind's logical utilities, `rtl:` and `ltr:` variants, `space-x` and plugin migration | | `references/mirroring.md` | Which icons and images to mirror, which never to mirror, and how | | `references/bidi.md` | Why mixed Arabic and English text breaks, and how to fix it with markup, CSS or Unicode isolates | | `scripts/rtl-audit.mjs` | The scanner: CSS, SCSS, Less, HTML, JSX, TSX, Vue, Svelte, Astro | | `examples/` | A component before and after, with the reason for each change | ## FAQ **Do I need a Tailwind plugin for RTL?** No. Tailwind 3.3 and later include logical utilities (`ms-`, `pe-`, `start-`, `rounded-s-`) and the `rtl:` / `ltr:` variants. If you still use `tailwindcss-rtl`, the skill explains how to move off it. **Can't I just add `direction: rtl` to the body?** Set `dir="rtl"` on `` instead. The attribute sets the document's base direction for form controls, scrollbars and screen readers. CSS `direction` does not do all of that. **Will the fixes break my English layout?** They shouldn't. Logical properties behave exactly like the old ones in left-to-right pages. The skill's checklist has the agent check both directions before it reports done. **Does the scanner change my files?** No. It only reports. Your agent makes the edits, so you can review the diff. **Does it handle React Native or Flutter?** Only briefly: it covers the start/end style keys and directional widgets. The scanner is for web code. --- --- title: "UI inventory of local HTML and CSS" description: "A free agent skill that reads local HTML and CSS and lists headings, font sizes, colors, and corner radii with counts. It does not edit the files." url: https://tools.grwlab.net/skills/ui-inventory/ updated: 2026-10-13T08:08:55+00:00 --- # UI inventory > 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 # UI inventory ## What it does Reads local HTML and CSS and lists headings, buttons, font sizes, colors, and corner radii, with how many times each value appears. ## When to use it A folder of interface files, before anyone names tokens or merges one-off styles. ## Install This installs **ui-inventory** only. The first line is once per machine. ``` /plugin marketplace add grw-lab/skills /plugin install ui-inventory@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. Needs Python 3.9 or newer. No extra packages. ## Usage ```bash python scripts/ui_inventory.py ./src --out report.md ``` It reads `.html`, `.css`, and `.scss`. It skips `node_modules`, `vendor`, `dist`, `build`, and hidden folders. It does not open the network. ## Example Two files, one button at `16px` and one paragraph at `14px`, plus a stylesheet with `16px`, `13px`, `#111`, `#333`, `8px`, and `4px`, produce three font sizes and two radii. `16px` and `#111` and `8px` are the values that repeat. ## What's inside `scripts/ui_inventory.py` writes `report.md`. Token export is a later step, in design-tokens-extractor. ## FAQ **Can it scan a live URL?** No. Save the HTML and CSS first, then point the script at the folder. **Does it change my CSS?** No. It only writes the report. --- --- title: "Arabic Localization skill for AI coding agents" description: "Free agent skill that localizes apps to Arabic: six plural forms, Arabic-Indic digits, SAR currency, Hijri dates, and a plural checker for CI." url: https://tools.grwlab.net/skills/arabic-localization/ updated: 2026-10-13T08:08:55+00:00 --- # Arabic Localization > 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 ## What it does Arabic localization takes an app from English-only to correct Arabic. It finds hard-coded strings, turns them into keys, and writes Arabic messages with all six plural forms Arabic needs. It also sets up digits, currency and dates the way Arabic readers expect, then runs a QA pass. Most localization setups assume English plurals: one and many. Arabic has six: zero, one, two, few, many and other. The `few` and `many` forms repeat every hundred, so 103 uses the same form as 3, and 111 the same as 11. Code that gets this wrong reads like a machine wrote it. This skill gets it right and checks it with a script. ## When to use it - You are adding Arabic, or a regional variant like `ar-SA` or `ar-EG`, to a web or mobile app. - Arabic counts read wrong ("1 رسالة", "3 رسالة", "103 رسالة"). - Prices show mixed digits, or dates show the Hijri calendar on some machines and Gregorian on others. - You use i18next, react-intl (FormatJS), next-intl, vue-i18n, Laravel, Flutter, iOS or Android. For layout direction (RTL), pair it with the **rtl-ui** skill. For writing Arabic copy from scratch, use **arabic-copy**. ## Install This installs **arabic-localization** 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 arabic-localization@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 `arabic-localization` folder and upload it in Settings → Capabilities → Skills. In Cursor or another agent, point it at `arabic-localization/SKILL.md`. ## Usage Ask in plain words: - "Add Arabic (Saudi) to this Next.js app. Latin digits, Gregorian dates with Hijri on invoices." - "Translate `locales/en/common.json` to Arabic with correct plurals." - "Our Arabic cart says ٣ منتج. Fix the plurals across the app." - "Check every Arabic locale file for missing plural forms." - "Set up vue-i18n so Arabic plurals work." The skill asks for the region, digit style, calendar and tone if your request doesn't say. It writes those choices into the locale config so they don't depend on the user's machine. ## Example Before, an English-only plural and string-built prices: ```js `${count} ${count === 1 ? "item" : "items"}` price.toFixed(2) + " SAR" date.toLocaleDateString() ``` After, one key with six Arabic forms and formatting through `Intl`: ```json { "items_zero": "السلة فارغة", "items_one": "منتج واحد", "items_two": "منتجان", "items_few": "{{count}} منتجات", "items_many": "{{count}} منتجًا", "items_other": "{{count}} منتج" } ``` ```js t("cart.items", { count }) new Intl.NumberFormat("ar-SA-u-nu-latn", { style: "currency", currency: "SAR" }).format(99.5) // "99.50 ر.س." new Intl.DateTimeFormat("ar-SA-u-ca-islamic-umalqura", { dateStyle: "long" }).format(date) // "٢٧ ربيع الآخر ١٤٤٨ هـ" ``` The plural checker catches what was missed: ``` $ node scripts/check-plurals.mjs --source en.json ar.json ✗ ar.json cart.items: missing _zero, _two, _few, _many daysLeft: ICU {count, plural} missing zero, two, few, many inbox.unread: plural in source, but a single string here ("inbox.unread") ``` ## What's inside | File | What it's for | |---|---| | `SKILL.md` | The workflow the agent follows, rules, and a done checklist. | | `references/plurals.md` | The six categories, how the counted noun changes in each, i18next and ICU examples, gender with plurals. | | `references/formatting.md` | Latin vs Arabic-Indic digits by locale, parsing Arabic digits in input, currency output, the new Saudi riyal sign, Gregorian and Umm al-Qura dates, regional month names. | | `references/frameworks.md` | Setup recipes for i18next, FormatJS, next-intl, vue-i18n, Laravel, Flutter, iOS and Android. | | `references/qa.md` | Arabic fonts, line height, text length, pseudo-localization, and a checklist for a native reviewer. | | `scripts/plural-table.mjs` | Prints which plural form every number gets in your runtime. | | `scripts/check-plurals.mjs` | Finds Arabic messages missing plural forms in i18next JSON and ICU strings. Exits 1 for CI. | | `examples/` | Good and bad Arabic locale files to try the checker on. | Both scripts run on Node 18 or later with no installs. ## FAQ **Does Arabic really need six plural forms?** Yes. CLDR, the data every major i18n library uses, defines zero, one, two, few, many and other for Arabic. If a form is missing, libraries fall back to `other`, so "3 days" shows the form meant for 100. **Should I use Arabic-Indic digits (١٢٣) or Latin digits (123)?** It depends on the market and the product. Gulf apps mostly use Latin digits; Egypt and the Levant read Arabic-Indic naturally. The skill makes it one explicit setting so it stays consistent. **Why do my dates show the Hijri calendar on some machines?** Older ICU versions and some browsers default `ar-SA` to the Islamic calendar; newer ones default to Gregorian. The skill always sets the calendar explicitly with `-u-ca-gregory` or `-u-ca-islamic-umalqura`. **Can it translate everything with machine translation?** It can draft, and it marks the result as a draft. Plurals and gender are where machine output usually fails, so the skill lists what a fluent reviewer should check. **Does it change my layout to right-to-left?** It sets `lang` and `dir` on the root and loads an Arabic font. The full layout fix (logical CSS, mirrored icons, mixed text) is the job of the **rtl-ui** skill. --- --- title: "Arabic SEO skill: hreflang, keywords, Saudi local" description: "A free agent skill for Arabic and bilingual SEO: hreflang checks, dialect keywords, Arabic slugs and titles, Saudi and Gulf local signals, font speed." url: https://tools.grwlab.net/skills/arabic-seo/ updated: 2026-10-13T08:08:55+00:00 --- # Arabic SEO > 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 ## What it does Arabic SEO gets Arabic and bilingual pages indexed in the right language, shown in the right country, and found for the words people actually type. It covers: - hreflang for `ar`, `ar-SA`, `ar-EG` and friends, with x-default and reciprocity. An included script checks a whole language cluster from one URL. - Bilingual site structure: subfolders, country versions, and why you should never auto-redirect by IP. - Keyword research across dialects and spelling variants (`أسعار` / `اسعار`, `بكم` / `بكام`), Arabizi, and mixed Arabic and English queries. - Arabic titles, descriptions and slugs, and the tradeoff between Arabic and English URLs. - Local signals for Saudi Arabia, the Gulf and Egypt: currency, phone formats, Google Business Profile, ccTLDs, and schema with `inLanguage`. - Arabic font performance and the RTL bugs that make visitors leave. ## When to use it - You are launching an Arabic version of a site, or a Saudi, Gulf or Egyptian version. - Search Console reports hreflang errors, or Arabic users land on the English page. - Your Arabic pages are indexed but don't rank for the phrasing your market uses. - You need titles, meta descriptions and slugs for Arabic pages. ## Install This installs **arabic-seo** 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 arabic-seo@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 `arabic-seo` folder and upload it in Settings → Capabilities → Skills. In Cursor or another agent, point it at `arabic-seo/SKILL.md`. ## Usage - "We're adding an Arabic version for Saudi Arabia. Plan the URL structure and hreflang." - "Check hreflang on https://example.com/ar/ and fix what's wrong." - "Write Arabic titles and meta descriptions for these 10 product pages, for Saudi searchers." - "Our Arabic pages aren't ranking. Audit them." Run the checker on its own: ```bash node ~/.claude/skills/arabic-seo/scripts/hreflang-check.mjs https://example.com/ar/ node ~/.claude/skills/arabic-seo/scripts/hreflang-check.mjs --sitemap https://example.com/sitemap.xml --limit 100 ``` ## Example A three-page cluster with typical mistakes: ``` hreflang check · 3 page(s) 200 ar-SA lang=ar dir=rtl https://example.com/ar/ 200 en lang=en dir=- https://example.com/en/ 200 ar-AR lang=ar dir=- https://example.com/eg/ ERROR https://example.com/ar/ "ar_EG" uses an underscore. Use a hyphen: ar-EG. ERROR https://example.com/ar/ not reciprocal: https://example.com/eg/ (ar_EG) does not link back. ERROR https://example.com/eg/ canonical points elsewhere (https://example.com/ar/). A page in a hreflang set must be self-canonical, or Google drops it. ERROR https://example.com/eg/ "ar-AR": AR is Argentina. For Arabic with no region use plain "ar". WARN https://example.com/eg/ no x-default. Add one for users whose language or region you don't target. WARN https://example.com/eg/ Arabic page without . 4 error(s), 2 warning(s) ``` The fix the skill applies on every page in the set: ```html ``` A title before and after, for a Riyadh clinic: ``` Before: Al Noor Clinic - Home After: احجز موعد أسنان في الرياض | عيادة النور ``` ## What's inside | File | What it's for | |---|---| | `SKILL.md` | The workflow: map versions, fix hreflang, heads, keywords, titles and slugs, schema, performance, local signals, verify. | | `references/hreflang.md` | Valid and invalid codes, reciprocity, x-default, HTML, header and sitemap methods. | | `references/keywords.md` | Dialect and spelling variants, Arabizi, digits, and research steps per country. | | `references/local.md` | Saudi, Gulf and Egypt formats, the ccTLD decision, Google Business Profile, schema examples. | | `references/performance.md` | Subsetting Arabic fonts, avoiding layout shift, RTL bugs that hurt engagement. | | `scripts/hreflang-check.mjs` | Node 18+, no dependencies. Follows alternates from any URL or sitemap and reports errors. Exits non-zero on errors. | ## FAQ **Arabic slugs or English slugs?** Both work for Google. Arabic slugs match the query but turn into long `%D8%…` strings when shared. English slugs are clean and stable. The skill defaults to English for product and SaaS sites and Arabic for article sites, and says to pick one rule and keep it. **Should I make separate pages for Saudi and Egyptian Arabic?** Only when the content really differs: prices, currency, delivery, legal terms or dialect. Otherwise one `/ar/` page targeting `ar` is stronger than two thin copies. **Does Google treat أ and ا as the same letter?** Often, but not always, and not equally for every query. The skill tells you to compare live results for each variant in the target country instead of assuming. **Can I redirect Arabic-speaking visitors automatically?** Don't. Googlebot mostly crawls without a language preference from the US, so it would never see your Arabic pages. Show a suggestion banner and let people choose. **Does this fix my RTL layout?** It flags the RTL problems that hurt engagement. For a full layout fix, use the `rtl-ui` skill. --- --- title: "ZATCA e-invoice QR and VAT skill for AI agents" description: "Free agent skill for Saudi e-invoicing: ZATCA QR TLV encoder and decoder, invoice fields, 15% VAT rounding, and a Phase 2 integration map." url: https://tools.grwlab.net/skills/zatca-invoice/ updated: 2026-10-13T08:08:55+00:00 --- # ZATCA E-Invoice > 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 ## What it does ZATCA e-invoice helps developers build invoices that follow Saudi Arabia's e-invoicing rules (FATOORA). It does four jobs: - Generates and decodes the invoice QR code. - Checks invoice content for tax invoices, simplified tax invoices, and credit and debit notes. - Computes VAT with ZATCA's rounding rules (half-up, VAT per category at document level), with the rule IDs cited. - Maps the Phase 2 integration work: XML, hashing, device certificates, clearance and reporting. The QR code is where most homemade implementations break. It is not a link or JSON. It is TLV bytes encoded in Base64, and each length must be counted in UTF-8 bytes. An Arabic seller name of 21 characters is 40 bytes. Count characters instead and every scanner rejects the code. The skill ships an encoder and decoder in Node and Python, tested against the widely published Phase 1 sample and the Phase 2 QR from ZATCA's own SDK. > Engineering guidance, not tax or legal advice. Whether an invoice is compliant is decided by ZATCA's own validation tools. ## When to use it - You are building invoices, receipts or POS output for a business in Saudi Arabia. - A Saudi customer says your QR code is invalid. - You need the required fields and Arabic titles for each invoice type. - You are planning Phase 2 integration and want a map of the work before reading the full specification. ## Install This installs **zatca-invoice** 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 zatca-invoice@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 `zatca-invoice` folder and upload it in Settings → Capabilities → Skills. In Cursor or another agent, point it at `zatca-invoice/SKILL.md`. ## Usage - "Add a ZATCA QR code to our receipt PDF." - "This QR fails in the ZATCA scanner app. Decode it and tell me why: AQxC…" - "Review our invoice model for a B2B tax invoice in Saudi Arabia." - "Our VAT totals are off by a halala on some invoices. Fix the rounding." - "We were notified for Phase 2. What do we need to build?" ## Example A typical bug: the length byte counts characters. ```js // Before: breaks as soon as the seller name is Arabic const tlv = (tag, v) => String.fromCharCode(tag, v.length) + v; ``` ```js // After: the length is the UTF-8 byte length function tlv(tag, value) { const bytes = Buffer.from(String(value), "utf8"); return Buffer.concat([Buffer.from([tag, bytes.length]), bytes]); } ``` Decoding a payload to check it: ``` $ node scripts/qr-tlv.mjs decode "ASjYtNix2YPYqSDY…" 1 Seller name 40 B شركة السجلات المحدودة 2 VAT registration number 15 B 300000000000003 3 Timestamp 20 B 2026-10-08T09:30:00Z 4 Invoice total (incl. VAT) 7 B 1150.00 5 VAT total 6 B 150.00 ``` ## What's inside | File | What it's for | |---|---| | `SKILL.md` | The workflow, rules, and a checklist the agent runs before calling the work done. | | `references/phase1-qr.md` | TLV structure, Phase 1 and Phase 2 tags, a byte-by-byte example, why QR codes fail. | | `references/invoice-content.md` | Tax vs simplified invoices, fields, Arabic labels, credit and debit notes, VAT number format, 15% VAT and rounding. | | `references/phase2-overview.md` | UBL 2.1 XML, UUID, ICV, PIH, the exact hash steps, the secp256k1 ECDSA stamp, device onboarding (CSID), clearance vs reporting. | | `references/sources.md` | The ZATCA documents and versions every rule was checked against, and where they disagree with each other. | | `scripts/qr-tlv.mjs` | Encode, decode and self-test in Node 18+. | | `scripts/qr_tlv.py` | The same in Python 3.9+, standard library only. | | `examples/sample-payloads.md` | Sample payloads with their decoded output. | ## FAQ **Does this make my invoices ZATCA compliant?** No tool can promise that except ZATCA's own validation. The skill gets the QR, content and math right, and tells you to validate XML with ZATCA's SDK and test in the sandbox before going live. **Does it generate the Phase 2 QR tags 6 to 9?** It decodes and checks them. Tags 6–9 come from your signing step: the XML hash and your device's signature (as Base64 text), your public key and, for simplified invoices, the CA's signature on your certificate (as raw DER bytes). They can't be typed in, so the scripts don't fake them. **Which invoices need a QR code?** Simplified tax invoices (B2C) need one from Phase 1. In Phase 2, ZATCA adds the QR to standard tax invoices when it clears them, and simplified invoices carry the full 9-tag QR built by your device. **Why is my VAT total a halala off?** ZATCA's standard computes VAT per VAT category on the category total (rule BR-CO-17), not by summing rounded line VAT. Summing line VAT is the usual cause of a one-halala gap. The skill gives the exact rules with their IDs and a halala-safe calculation. **Should we build Phase 2 ourselves?** Sometimes. It covers XML canonicalization, ECDSA signing, certificate renewal, retries and audit storage. For many businesses an already-compliant provider costs less. The skill raises that question before you start. --- --- title: "VAT worksheet from a spreadsheet" description: "A free agent skill that sums sales and purchase VAT from a CSV at 15% or the rate on each row. It is a worksheet, not a filed return." url: https://tools.grwlab.net/skills/vat-worksheet/ updated: 2026-10-13T08:08:55+00:00 --- # VAT worksheet > 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 # VAT worksheet ## What it does Adds up sales VAT and purchase VAT from a CSV. VAT due is sales VAT minus purchase VAT. If a row already has a VAT figure, that figure is kept. 15% is used only when VAT is missing. ## When to use it A spreadsheet of invoices that needs one set of VAT totals before an accountant reviews it. ## Install This installs **vat-worksheet** only. The first line is once per machine. ``` /plugin marketplace add grw-lab/skills /plugin install vat-worksheet@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. Needs Python 3.9 or newer. No extra packages. ## Usage ```bash python scripts/vat_worksheet.py lines.csv --out summary.csv ``` `kind` is `sale` or `purchase`. Each row needs `net` or `gross`. Optional: `vat`, `vat_rate` (default `0.15`), `note`. ## Example A sale of net `1000` with VAT `150`, a purchase of net `200` with VAT left empty, and a sale whose gross is `115` become sales VAT `165.00`, purchase VAT `30.00`, and VAT due `135.00`. ## What's inside `scripts/vat_worksheet.py` writes `summary.csv` with sales, purchases, VAT due, and the line count. ## FAQ **Does this file the return?** No. It is a worksheet. It is not a ZATCA submission and it is not tax advice. **Why not use the e-invoice skill?** zatca-invoice builds one invoice and rounds by VAT category. This skill sums lines you already have. --- --- title: "Product sheet with slug and VAT" description: "A free agent skill that turns a product CSV into slugs and VAT-split prices, then writes Arabic titles from the facts already in the sheet." url: https://tools.grwlab.net/skills/product-sheet/ updated: 2026-10-13T08:08:55+00:00 --- # Product sheet > 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 # Product sheet ## What it does Turns a product CSV into a sheet with a slug, price excluding VAT, VAT, and price including VAT. You write the Arabic title and the short description. The script does the numbers. ## When to use it A shop spreadsheet of names and prices that needs a clean sheet before anyone uploads it. ## Install This installs **product-sheet** only. The first line is once per machine. ``` /plugin marketplace add grw-lab/skills /plugin install product-sheet@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. Needs Python 3.9 or newer. No extra packages. ## Usage ```bash python scripts/product_sheet.py products.csv --out sheet.csv ``` Required columns: `name`, `price`. Optional: `sku`, `vat_rate` (default `0.15`), `price_includes_vat` (`yes` or `no`), `description`. ## Example A row `قهوة مختصة` at `115` with `price_includes_vat` set to `yes` becomes slug `قهوة-مختصة`, net `100.00`, VAT `15.00`, gross `115.00`. A row `Desk lamp` at `100` excluding VAT becomes net `100.00`, VAT `15.00`, gross `115.00`. ## What's inside `scripts/product_sheet.py` writes the sheet. The agent adds `title_ar` and `summary_ar` without inventing facts. ## FAQ **Is this a ZATCA invoice?** No. It is a price sheet. E-invoices are the zatca-invoice skill. **Can it upload to the store?** No. You review the CSV and upload it yourself.