Common Skill Setup
Mirrored from
iblai/vibeΒ·docs/skill-setup.md. This page is generated β edit it in the repository, not here.
Shared setup, conventions, and pre-flight checks referenced by ibl.ai skills. Each skill links here instead of repeating this boilerplate.
Pre-flight (every skill)
If iblai.env does not record ARCHITECTURE= (and PROJECT=, ACCESS=,
DOMAIN_FOCUS=), stop and run /iblai-vibe-start β four questions that
decide new/existing, single-org / multi-org / headless, who signs in, and
what the app is about. Then continue. This is the same in Claude Code,
OpenAI Codex, Cursor, and OpenCode: the answers live in the project, not in
the agent.
Conventions
- Do NOT add custom styles, colors, or CSS overrides to ibl.ai SDK components. They ship with their own styling. Keep components as-is.
- Do NOT implement dark mode unless the user explicitly asks for it.
- Use
pnpmas the default package manager. Fall back tonpmifpnpmis not installed. - The generated app should live in the current directory, not in a subdirectory.
- Project names MUST be all lowercase β npm rejects package names with
capital letters. Convert names like
MyApptomy-appbefore passing tocreate-next-appor--app-name. Allowed characters: lowercase letters, digits,-,_. - When building a navbar or header, do NOT display the platform/organization name. Use the ibl.ai logo instead.
Brand
When building custom UI around SDK components, use the ibl.ai brand:
- Primary:
#0058cc - Gradient:
linear-gradient(135deg, #00b0ef, #0058cc) - Button:
bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white - Font: Open Sans β
--font-open-sanson<html>, mapped to--font-sansin@theme inline, semibold rendered as 500; no!importantbody font - Style: shadcn/ui base-nova (Base UI:
renderprop, notasChild)
Follow the component hierarchy: use ibl.ai SDK components
(@iblai/iblai-js) first, then shadcn/ui for everything else
(npx shadcn@latest add <component>). Do NOT write custom components
when an ibl.ai or shadcn equivalent exists. Both share the same Tailwind
theme and render in ibl.ai brand colors automatically.
Before diverging from this language β another font or weight scale, a size
outside the scale, a new accent colour, restyling SDK internals, a hand-rolled
shell or spinner, a card around an SDK panel, dark mode β stop and ask the
user: what the language says, what would change, what it costs. The wiring,
the type scale and the canonical components (page header, empty state, loading
screen, badges, forms, dialogs, tables) are in /iblai-vibe-component
(House components) and BRAND.md.
Full brand guidelines: BRAND.md.
Environment files
iblai.envis NOT a.env.localreplacement β it holds the platform shorthand (DOMAIN,PLATFORM,TOKEN, optionalIBLAI_USERNAMEfor deploys β theIBLAI_USERNAMEenvironment variable wins when the host exports it) plus theAUTH_*branding values. Next.js still reads its runtime env vars from.env.local.DOMAINis the single host knob: every platform API base is composed from it ashttps://api.$DOMAIN/dm(defaultiblai.app). Inside the ibl.ai desktop app the session guidance states the base domain β write that value. The sign-in (auth SPA) host is the one exception: it is not derivable from the domain, so use it only when the guidance or the user supplies it.- The skills read
iblai.envand derive theNEXT_PUBLIC_*values into.env.local. vibe-starter apps need only the organization key andIBLAI_API_KEYβ URL defaults live inlib/iblai/config.ts.
Two skill families, one set of credentials
iblai-vibe-* skills (kind ui/ops) read iblai.env (DOMAIN,
PLATFORM, TOKEN, IBLAI_USERNAME) and, for Next.js, .env.local.
iblai-api-* skills (kind api, headless) read .env (IBLAI_ORG,
IBLAI_USERNAME, IBLAI_API_KEY). Same three values, family-specific names:
IBLAI_ORG = PLATFORM; IBLAI_API_KEY = TOKEN. /iblai-api-login writes
both files; the loader snippet in
docs/api-skills.md
reads either. Kinds are explained in
docs/skill-kinds.md.
Step 1: Check Environment
Check for an iblai.env in the project root. Look for PLATFORM,
DOMAIN, and TOKEN variables. If the file does not exist or is missing
these variables, tell the user:
"You need an
iblai.envwith your platform configuration. Download the template and fill in your values:curl -o iblai.env https://raw.githubusercontent.com/iblai/vibe/refs/heads/main/iblai.env"
Where the values come from: the org key (PLATFORM) is listed on
https://login.iblai.app/me (no account yet: https://ibl.ai/join); the
Platform API Token (TOKEN) is minted from that signed-in session by
/iblai-api-login (npx skills add iblai/vibe --all), or an org secret works
directly. Make sure iblai.env is gitignored before writing a token into it.
Do NOT ask the user for their platform key directly β guide them to
populate iblai.env instead.
Verification
You MUST run /iblai-vibe-ops-test before telling the user the work is ready:
pnpm buildβ must pass with zero errors.pnpm testβ vitest must pass.- Touch test the route in a real browser, as
/iblai-vibe-ops-testsays: with Claude in Chrome (claude --chrome) or thechrome-devtoolsMCP server in.mcp.json, openhttp://localhost:3000/<route>on the running dev server, use every control you added, read the console and the failed requests, check the phone width. The user signs in by hand in that window β never ask for a password. No browser tool: say so, and do not call the work done.
After all work is complete, start a dev server (pnpm dev) so the user
can see the result at http://localhost:3000.