This project (credentialsAI) is built on the ibl.ai platform using the
@iblai/iblai-js SDK.
/account and /developers render the SDK <Account> component scoped
to a single tab (management and integrations respectively) by hiding
the SDK's left rail, per-tab title bar, and outer card chrome via the
.account-management-only wrapper class. The selectors live in
app/iblai-styles.css and rely on the SDK's internal DOM:
- the left rail's inline
style="width: 320px" nav[aria-label="Profile tabs"]/nav[aria-label="Profile tabs mobile"]- the per-tab title block
.hidden.lg\:block.flex-shrink-0.border-b - the mobile title block
[role="tabpanel"] > .lg\:hidden.mb-6 - the inner content's
border + rounded-lg/border-gray-200card wrappers
Whenever the SDK is upgraded (@iblai/iblai-js bumped), re-check the
Account/Developers pages. If the SDK's classes, inline styles, or DOM
structure changed, the overrides in app/iblai-styles.css may stop
matching and the rail / title / card chrome will reappear. Compare:
lib/iblai/sdk/web-containers/source/next/index.esm.js— search for the rail wrapper (width: '320px'), the per-tab title (hidden lg:blockmb-2 capitalize), and the management content wrapper (border border-gray-200 rounded-lg).
- Update the selectors in
app/iblai-styles.cssto match the new class names / structure if they shifted.
The sidebar logo (components/layout/sidebar.tsx) similarly depends on
the DM logo endpoint shape — ${dmUrl}/api/core/orgs/{platformKey}/logo.
If the SDK changes the endpoint path or auth requirements, the logo
fetch (and its onError → ibl.ai-logo fallback) needs to be re-wired.
When adding UI features, follow this priority order:
- ibl.ai components (
@iblai/iblai-js) — always use these first - shadcn/ui (
npx shadcn@latest add) — for everything else - Custom/third-party — only when no ibl.ai or shadcn component exists
| Feature | Use this | NOT this |
|---|---|---|
| Profile page / dropdown | /iblai-profile skill + Profile, UserProfileDropdown from SDK |
Custom profile form |
| Account / org settings | /iblai-account skill + Account from SDK |
Custom settings page |
| Analytics dashboard | /iblai-analytics skill + AnalyticsOverview, AnalyticsLayout from SDK |
Chart library from scratch |
| Notifications | /iblai-notification skill + NotificationDropdown from SDK |
Custom notification system |
| Auth / login | /iblai-auth skill + AuthProvider, SsoLogin from SDK |
Custom auth flow |
| Course catalog / academy | useDiscover + FacetFilterContext + DiscoverFilterDrawer from SDK |
Custom catalog grid |
| API / agent settings | AgentApiTab + AgentSettingsProvider (next bundle), OR <Account targetTab="integrations"> |
Custom API key UI |
| Credit balance | <CreditBalance> from @iblai/iblai-js/web-containers |
Custom credit widget |
| Buttons, forms, modals, tables | shadcn/ui (npx shadcn@latest add button dialog table) |
Raw HTML or other UI libraries |
Do NOT build custom components when an ibl.ai SDK component exists. Do NOT use raw HTML or third-party UI libraries when shadcn/ui has an equivalent. ibl.ai and shadcn share the same Tailwind theme — they render in brand colors automatically.
// Data layer
import { initializeDataLayer, mentorReducer } from "@iblai/iblai-js/data-layer";
import { useGetTenantMetadataQuery } from "@iblai/iblai-js/data-layer";
// Auth & utilities
import { AuthProvider, TenantProvider } from "@iblai/iblai-js/web-utils";
// Framework-agnostic components
import {
Profile, Account, AnalyticsLayout, AnalyticsOverview,
NotificationDropdown, NotificationDisplay,
CreditBalance,
useDiscover, FacetFilterContext, DiscoverFilterDrawer,
} from "@iblai/iblai-js/web-containers";
// Next.js-specific components (uses next/image, next/link)
import {
SsoLogin, UserProfileDropdown, Account, AgentApiTab,
AgentSettingsProvider,
} from "@iblai/iblai-js/web-containers/next";| Route | What it renders |
|---|---|
/ |
Credentials home (templates, earners, pathways, collections, recommendations, issue) |
/credentials/[id] |
Credential detail |
/credentials/[id]/issue |
Issue a credential |
/academy |
Course catalog (SDK useDiscover, cross-tenant main scope) |
/analytics |
SDK AnalyticsOverview |
/analytics/{users,courses,programs,topics,transcripts,financial,audit,reports} |
Per-tab SDK analytics components |
/account |
SDK <Account targetTab="management"> — left rail + title hidden via .account-management-only |
/developers |
SDK <Account targetTab="integrations"> — same .account-management-only overrides |
/profile |
SDK <Profile> |
/notifications |
SDK <NotificationDisplay> |
Platform configuration lives in iblai.env (DOMAIN, PLATFORM, TOKEN).
Next.js reads NEXT_PUBLIC_* env vars from .env.local. The two are
linked but distinct — update iblai.env and re-run iblai add auth only
if the platform key changes.
- Primary:
#0058cc, Gradient:linear-gradient(135deg, #00b0ef, #0058cc) - Style: shadcn/ui new-york variant, system sans-serif, Lucide icons
- SDK components ship with their own styles — do NOT override them, except for the scoped overrides documented in "Locally Styled SDK Components" above
pnpm dev # Dev server (uses Turbopack via next 16)
pnpm build # Production build
iblai config show # View configuration
iblai add <feature> # Add a feature- Next.js 16 (Turbopack default, with
--webpackfallback configured for the@reduxjs/toolkitdedup aliases innext.config.mjs) - React 19
- TypeScript 6
- Tailwind v4 (
@tailwindcss/postcss) - shadcn/ui (new-york variant)
- pnpm 11