con un clic
iblai-vibe-credit
Add the ibl.ai credit balance widget.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
Add the ibl.ai credit balance widget.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
| name | iblai-vibe-credit |
| description | Add the ibl.ai credit balance widget. |
| globs | null |
| alwaysApply | false |
Add the ibl.ai credit balance widget to your app's top navigation. The widget shows the user's remaining credits, current plan, and exposes the upgrade / add-credits / manage-billing flows. It uses Stripe under the hood and is rendered by the SDK — do not build a custom version.

Do NOT add custom styles, colors, or CSS overrides to the
<CreditBalance> component. It ships with its own styling, including
the trigger icon, the dropdown panel, and the upgrade/add-credits
buttons. Wrapping it, restyling it, or swapping the icon will break the
upgrade flow and visual consistency across ibl.ai apps.
The widget MUST follow the canonical integration:
@iblai/iblai-js/web-containers (the
framework-agnostic bundle — NOT /next, NOT /sso)redirectUrl: window.location.origin (the Stripe checkout return
URL — origin only, never .href or a path)enabled: explicit trueclassName: do not pass a className prop unless you have a
layout reason. Never use it to swap the icon, change colors, or
override the size| Property | Value |
|---|---|
| Trigger | Icon-only button (Lucide CreditCard) provided by the SDK |
| Trigger size | h-5 w-5 icon inside a ghost icon button |
| Status dot | Small colored dot in the top-right of the trigger when balance is low |
| Panel width | w-[320px] dropdown |
| Position in navbar | Right side, between the page links and the notification bell |
/iblai-vibe-auth)/iblai-vibe-navbar)@iblai/iblai-js SDK installed@source directives configured (see
Step 1 below)currentTenant.show_paywall === true).
The widget is a no-op for tenants that don't sell credits.This skill does not generate any new files — it wires
<CreditBalance> from the SDK into the existing navbar. It adds:
<CreditBalance> element inside the navbar's right-side cluster@source directives in iblai-styles.css so Tailwind
generates the SDK's internal classes (the trigger icon depends on
this — without it, the icon may render at the wrong size)The <CreditBalance> icon and panel use Tailwind utility classes
authored inside the SDK's compiled JS. Tailwind v4 will not generate
those classes unless the SDK's source/ directories are listed as
@source.
Open app/iblai-styles.css (or app/globals.css if styles live there)
and ensure BOTH directives are present:
@source "../lib/iblai/sdk/web-containers/source";
@source "../lib/iblai/sdk/web-containers/source/next";
If you are scanning node_modules directly instead of the lib/iblai/sdk
symlink, the equivalent is:
@source "../node_modules/@iblai/iblai-js/dist/web-containers/source";
@source "../node_modules/@iblai/iblai-js/dist/web-containers/source/next";
Both lines are required. The source/next path covers the next-bundle
classes; the SDK's icon and dropdown rely on classes from across the
whole bundle. If only one is scanned, the credit icon may render at an
unexpected size or without its layout utilities.
After editing, restart the dev server. Verify the build picks up the classes:
rm -rf .next && pnpm build
grep -oE 'h-5\\!|w-5\\!' .next/static/chunks/*.css | head
You should see h-5\! and w-5\! in the generated CSS.
Inside your navbar component (components/navbar/nav-bar.tsx or
equivalent), import CreditBalance from the framework-agnostic bundle:
import {
CreditBalance,
NotificationDropdown,
} from '@iblai/iblai-js/web-containers';
Do NOT import from @iblai/iblai-js/web-containers/next. The credit
component does not require Next.js primitives, and the /next bundle
re-exports a smaller surface — keeping all SDK widgets on the same
import path simplifies the component graph.
Place <CreditBalance> inside the navbar's right-side cluster, before
the notification bell:
<div className="flex items-center space-x-4">
{showCreditBalance &&
currentTenant?.show_paywall &&
canViewCredits &&
isLoggedIn && (
<CreditBalance
tenant={tenantKey}
enabled={true}
redirectUrl={window.location.origin}
mainPlatformKey={config.mainTenantKey()}
currentUserEmail={email}
username={username}
/>
)}
<NotificationDropdown
org={tenantKey}
userId={username ?? ''}
isAdmin={isAdmin}
onViewNotifications={handleViewNotifications}
/>
{/* Profile dropdown last */}
</div>
| Prop | Source | Notes |
|---|---|---|
tenant | Resolved tenant key (e.g. from resolveAppTenant()) | The tenant the user is acting under — billing is per-tenant |
enabled | Always true | The component itself returns null if enabled is false; pass true so it renders when the gating below passes |
redirectUrl | window.location.origin | Stripe checkout returns to this URL after success/cancel. Always use origin (not href or a path) so refreshes from Stripe land on a stable route |
mainPlatformKey | config.mainTenantKey() | The platform key from NEXT_PUBLIC_MAIN_TENANT_KEY — used by the upgrade flow to attribute revenue to the correct platform |
currentUserEmail | From userData in localStorage (user_email / email) | Stripe Checkout pre-fills with this |
username | From userData (user_nicename / username) | Used for the Stripe customer portal userId |
| Prop | Default | Notes |
|---|---|---|
className | (none) | Reserved for layout adjustments only. Do NOT use it to override the icon, colors, or sizing |
enabled | true | Pass false to programmatically hide the widget without unmounting it (rarely useful — prefer the gating below) |
The widget MUST only render when ALL of the following are true:
currentTenant?.show_paywall === true.
Tenants without paywall enabled return no billing info; rendering the
widget there shows a permanent error state.isAdmin || userOnFreeTrial.
Regular users on a paid plan generally cannot top up the
organization's balance, so showing them the widget is misleading.
Substitute the equivalent check for your app's role model.tenantKey, username, and email are all populated from
localStorage).Pull these flags into the navbar component (or its parent layout) and
combine them in the JSX guard shown in Step 3. Do not gate solely on
enabled — the SDK's enabled prop hides the rendered output but does
not skip the billing query, so a real visibility gate at the JSX level
is required.
Start the dev server, log in, and confirm:
If the icon renders larger than h-5 w-5 or without its border-radius,
the SDK source folders are not being scanned — go back to Step 1.
@iblai/iblai-js/web-containers/next
works for some bundles but ties the credit widget to Next-specific
primitives unnecessarily. Use the plain web-containers path.redirectUrl={window.location.href}: when Stripe Checkout
succeeds, it redirects back to this URL. Using .href re-opens
whatever modal or query state was active when the upgrade started,
which can re-trigger the upgrade flow. Always use .origin.@source "../.../source/next": the most common cause of
"the icon looks wrong" — Tailwind isn't generating the SDK's classes
because only one of the two source paths is scanned.className to swap icons or colors: don't. The component
is a contract; downstream apps depend on it being visually consistent.currentTenant?.show_paywall.For the full prop surface and the underlying billing data shape, see:
CreditBalance — @iblai/iblai-js/web-containers
tenant, username, mainPlatformKey, currentUserEmail,
redirectUrl, className?, enabled?useGetAccountBillingInfoQuery from the
data layer — no manual data fetching is requireduseCreateStripeCustomerPortalMutationBuild and run your ibl.ai app on desktop and mobile (iOS, Android, macOS, Surface)
Add the agent Sandbox tab (OpenClaw instance management, agent prompt configuration, and agent skills) to your Next.js app
Add the agent Access tab (role-based access control for editor and chat roles) to your Next.js app
Add the agent Audit tab (audit log of who changed what and when, with user/date/action filters) to your Next.js app
Wrap the Chat surface with the SDK's AppSidebar — projects dropdown, pinned/recent messages, and host-supplied content/footer menu items
Add the in-process Chat SDK component (full agent surface — message stream, canvas, file attach, voice, prompts) to a Next.js app