bama
BAMA: Build Any Mac App. Agent skills to research, clone, design, build, optimize, and test native macOS apps with Swift and SwiftUI.
Build for the Gulf. In both directions.
SkillsHTML · TypeScriptGitHub @dualkitOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Build for the Gulf. In both directions. Skills, formats and a starter for products that ship in Arabic and English.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Build for the Gulf. In both directions.
Dualkit is a free, open-source toolkit for products that ship in Arabic and English. v0.1 is in beta.
Docs and live demos are at dualkit.dev.
In Cursor, copy cursor/rules into your project's .cursor/rules. The rules are generated from the same source as the skills, and CI fails if they drift.
The skills were measured against a baseline before release. Fresh agents built the same bilingual checkout screen three times without them and three times with them. The task, the scorer and every run are in evals/payment-summary.Read the full README ↗Ask Claude Code or Cursor for a bilingual screen and you get the same three bugs:
Dualkit fixes them at the source, in the agent and in the code, and checks any page for the ones that got through.
| What it is | Install | |
|---|---|---|
| Skills | Five agent skills for Claude Code and Cursor, listed in the Claude plugin directory: RTL layout, Arabic and Latin type pairing, Gulf formats, bilingual copy, converting an app | /plugin marketplace add dualkit/dualkit |
| Format | Six Gulf currencies, Umm al-Qura dates, Arabic numerals, GCC phones and IBANs for all six countries, Emirates ID, Saudi VAT number, Gulf weekends. No dependencies | npm i @dualkit/format |
| Starter | A bilingual design system to fork: one token file feeds CSS, Tailwind and Figma, plus eight React components | From the release |
| Check | Audit any page for Arabic and RTL bugs, with a shareable Gulf-ready report | npx dualkit check <url> |
| Lint | 8 source rules on by default that catch Arabic and RTL bugs in your CSS, HTML, JavaScript and TypeScript, with no browser | npx dualkit@beta lint . |
| Convert | Turns an English Next.js or Vite React app into an Arabic one on a new git branch, and proves English did not change | npx dualkit@beta convert |
Fresh agents built the same bilingual checkout three times without the skills and three times with them.
| Check | Without | With |
|---|---|---|
| Phone and IBAN isolated inside Arabic text | 0/3 | 3/3 |
| Arabic type overrides (line height, size, tracking) | 0/3 | 3/3 |
| Digit system pinned, not left to defaults | 1/3 | 3/3 |
Three runs is a smoke test, not a benchmark. The task, the scorer and every run are in evals/payment-summary.
The skills are listed in the Claude plugin directory, so you can install them from there in Claude Code, Cowork and the Claude apps. Or, in Claude Code:
/plugin marketplace add dualkit/dualkit
/plugin install dualkit@dualkit
In any agent that reads skills (Claude Code, Cursor, Codex and others):
npx skills add dualkit/dualkit
In Cursor, copy cursor/rules into your project's .cursor/rules. The rules are generated from the same source as the skills, and CI fails if they drift.
npm i @dualkit/format
import { formatMoney, formatHijri, parseUaePhone } from '@dualkit/format'
formatMoney(1234.5, { currency: 'AED', locale: 'ar', numerals: 'arab' }) // ١٬٢٣٤٫٥٠ د.إ
formatHijri(new Date('2026-02-18'), { timeZone: 'Asia/Riyadh' }) // 1 Ramadan 1447 AH
parseUaePhone('٠٥٠ ١٢٣ ٤٥٦٧') // { ok: true, value: { e164: '+971501234567', type: 'mobile' } }
Full API in the package README.
npm i @dualkit/starter
Then in your CSS:
@import '@dualkit/starter/tokens.css';
@import 'tailwindcss';
@import '@dualkit/starter/theme.css';
<html lang="ar" dir="rtl"> switches to Arabic type, and data-theme="dark" to dark mode. More in the starter README.
The eight components install with the shadcn CLI, as source you own:
npx shadcn@latest add https://dualkit.dev/r/amount.json
Swap amount for button, date-display, digit-input, field, sheet, tabs or toast.
Point one command at any page, local or live. It opens it in Chromium, runs 34 Arabic and right-to-left rules, and writes a report with a score out of 100 and every bug marked on a screenshot.
npx [email protected] install chromium # once
npx dualkit check https://your-site.com/ar
In CI, uses: dualkit/dualkit/action@main scores every pull request and uploads the report (action/README.md). Every rule, why it matters and how to fix it is in RULES.md.
Add --review to also have a vision model read a screenshot (needs GEMINI_API_KEY or OPENROUTER_API_KEY). It is experimental and not yet measured against hand labels, so treat its findings as suggestions. See the CLI README.
Lint reads your source instead of a rendered page, so it needs no browser and runs in seconds. It checks CSS, SCSS, HTML, JavaScript and TypeScript, including JSX, plus Vue and Svelte files and CSS in styled and css templates, against 8 source rules: left and right in CSS and Tailwind classes, letter-spacing on Arabic, Arabic formats that leave the digits to the runtime, the bare islamic calendar instead of islamic-umalqura (the Hijri calendar CLDR ranks first for Saudi Arabia, the UAE, Bahrain, Kuwait and Qatar), Hijri dates with no time zone, and the old rial sign. Left and right in CSS and Tailwind classes, and digits left to the runtime, are notes, so they are listed but do not fail the run unless you set --fail-on note. A ninth rule, which prefers :dir() to a [dir] selector, is off by default and can be turned back on through the API: pass RULES from @dualkit/lint to lint().
npx dualkit@beta lint .
physical.css:2:3 · source/physical-css `margin-left: 8px` is tied to one side. Use `margin-inline-start`.
0 errors, 0 warnings, 1 note in 2 files
It exits 1 when a finding reaches --fail-on (default error). Turn a rule off for one line with a dualkit-disable-next-line <rule-id> -- reason comment. In CI, set mode: lint on the same Action. Every rule and its known limits are in LINT.md.
Convert takes an existing English app and makes it Arabic on a new git branch. It works on Next.js App Router and Vite React apps styled with Tailwind v3, Tailwind v4, plain CSS or CSS modules.
npx dualkit@beta convert --mode bilingual --start "npm run dev" --port 3000
bilingual adds Arabic with a language switch and leaves English exactly as it is. arabic makes the whole app Arabic and right to left, with no switch. Phase 1 rewrites the code and writes dualkit-strings.json, every English string with its Arabic left empty. Your agent fills the Arabic with the dualkit-convert skill. Phase 2, dualkit convert --finish, compares each English page with a screenshot from before, runs the check rules on each Arabic page and writes a report.
Dualkit makes no model calls in convert, and every drafted Arabic string is marked for a native speaker to check. What it converts and what it leaves to you: the convert README.
The most useful help right now:
plugin/skills/ and comment wherever something reads wrong.| Path | Contents |
|---|---|
packages/format | The format library, with its tests |
packages/rules | The 34 check rules and the page reader, with their tests |
packages/lint | The source rules behind dualkit lint, with their tests |
packages/convert | The engine behind dualkit convert, with its tests |
packages/cli | The dualkit CLI and its report |
action | The GitHub Action that runs check or lint on pull requests |
plugin/skills | The five skills (SKILL.md each) |
cursor/rules | Cursor rules generated from plugin/skills |
packages/skills | The generator and the tests that keep skills, rules and the plugin manifest in step |
apps/site | dualkit.dev (Next.js) |
design | Figma specs, tokens and the motion prototype the site was built from |
evals | Baseline evaluations for the skills |
npm install
npm test
npm run dev
This is a beta. No native Arabic reviewer has checked the Arabic rules yet; that happens before 1.0. If any Arabic reads wrong, please open an issue.
Made by Sam Santos. MIT licensed.