System Bridge Go Backend
timmo001/system-bridge
System Bridge Go backend conventions - error wrapping, graceful degradation for data modules, nil-pointer safety, context-aware Module.Update, structured slog logging, and errcheck-clean deferred…
Design production-ready SDKs with retry logic, error handling, pagination, and multi-language support.
$ npx skills add ancoleman/ai-design-components --skill designing-sdks -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ancoleman/ai-design-components designing-sdks --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ancoleman/ai-design-components.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/designing-sdks .claude/skills/designing-sdks && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "designing-sdks" agent skill from https://github.com/ancoleman/ai-design-components/tree/main/skills/designing-sdks into .claude/skills/designing-sdks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "designing-sdks", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ancoleman/ai-design-components/tree/main/skills/designing-sdksType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ancoleman/ai-design-components --skill designing-sdks -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ancoleman/ai-design-components designing-sdks --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ancoleman/ai-design-components.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/designing-sdks .agents/skills/designing-sdks && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "designing-sdks" agent skill from https://github.com/ancoleman/ai-design-components/tree/main/skills/designing-sdks into .agents/skills/designing-sdks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "designing-sdks", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ancoleman/ai-design-components --skill designing-sdks -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ancoleman/ai-design-components designing-sdks --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ancoleman/ai-design-components.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/designing-sdks .cursor/skills/designing-sdks && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "designing-sdks" agent skill from https://github.com/ancoleman/ai-design-components/tree/main/skills/designing-sdks into .cursor/skills/designing-sdks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "designing-sdks", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ancoleman/ai-design-components.git --path skills/designing-sdks--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ancoleman/ai-design-components --skill designing-sdks -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ancoleman/ai-design-components designing-sdks --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ancoleman/ai-design-components.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/designing-sdks .gemini/skills/designing-sdks && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "designing-sdks" agent skill from https://github.com/ancoleman/ai-design-components/tree/main/skills/designing-sdks into .gemini/skills/designing-sdks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "designing-sdks", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ancoleman/ai-design-components designing-sdksInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ancoleman/ai-design-components --skill designing-sdks -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ancoleman/ai-design-components.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/designing-sdks .github/skills/designing-sdks && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "designing-sdks" agent skill from https://github.com/ancoleman/ai-design-components/tree/main/skills/designing-sdks into .github/skills/designing-sdks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "designing-sdks", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ancoleman/ai-design-components --skill designing-sdks -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ancoleman/ai-design-components designing-sdks --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ancoleman/ai-design-components.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/designing-sdks .opencode/skills/designing-sdks && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "designing-sdks" agent skill from https://github.com/ancoleman/ai-design-components/tree/main/skills/designing-sdks into .opencode/skills/designing-sdks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "designing-sdks", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
designing-sdksDesign production-ready SDKs with retry logic, error handling, pagination, and multi-language support.
Designing Sdks is an agent skill from ancoleman/ai-design-components. Design production-ready SDKs with retry logic, error handling, pagination, and multi-language support. Use when building client libraries for APIs or creating developer-facing SDK interfaces.
Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 22 other files, including reference files (for example `examples/python/async-client.py`, `examples/python/dual-client.py` and `examples/python/sync-client.py`).
It sits in Backend & APIs, covering Error handling. The repository describes itself as: Comprehensive UI/UX and Backend component design skills for AI-assisted development with Claude. The licence is MIT.
7 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 76551b7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (Go, Python and TypeScript, from the files we listed), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Designing Sdks loads about 3.2k tokens when it runs, and up to ~18k if it reads all its reference files. Until then it costs about 52 tokens; SKILL.md has 662 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from ancoleman/ai-design-components at commit 76551b7, republished under its MIT licence (© ancoleman). 662 words, ~3,179 tokens.
.claude/skills/designing-sdks/SKILL.md (or your agent's skills folder). This skill also uses 17 other files; get the full folder from GitHub.Design client libraries (SDKs) with excellent developer experience through intuitive APIs, robust error handling, automatic retries, and consistent patterns across programming languages.
Use when building a client library for a REST API, creating internal service SDKs, implementing retry logic with exponential backoff, handling authentication patterns, creating typed error hierarchies, implementing pagination with async iterators, or designing streaming APIs for real-time data.
Organize SDK code hierarchically:
Client (config: API key, base URL, retries, timeout)
├─ Resources (users, payments, posts)
│ ├─ create(), retrieve(), update(), delete()
│ └─ list() (with pagination)
└─ Top-Level Methods (convenience)Resource-Based (Stripe style):
const client = new APIClient({ apiKey: 'sk_test_...' })
const user = await client.users.create({ email: 'user@example.com' })Use for APIs <100 methods. Prioritizes developer experience.
Command-Based (AWS SDK v3):
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
await client.send(new PutObjectCommand({ Bucket: '...' }))Use for APIs >100 methods. Prioritizes bundle size and tree-shaking.
For detailed architectural guidance, see references/architecture-patterns.md.
const user = await client.users.create({ email: 'user@example.com' })All methods return Promises. Avoid callbacks.
# Sync
client = APIClient(api_key='sk_test_...')
user = client.users.create(email='user@example.com')
# Async
async_client = AsyncAPIClient(api_key='sk_test_...')
user = await async_client.users.create(email='user@example.com')Provide both clients. Users choose based on architecture.
client := apiclient.New("api_key")
user, err := client.Users().Create(ctx, req)Use context.Context for timeout and cancellation.
const client = new APIClient({ apiKey: process.env.API_KEY })Store keys in environment variables, never hardcode.
const client = new APIClient({
clientId: 'id',
clientSecret: 'secret',
refreshToken: 'token',
onTokenRefresh: (newToken) => saveToken(newToken)
})SDK automatically refreshes tokens before expiry.
await client.users.list({
headers: { Authorization: `Bearer ${userToken}` }
})Use for multi-tenant applications.
See references/authentication.md for OAuth flows, JWT handling, and credential providers.
async function retryWithBackoff<T>(fn: () => Promise<T>, maxRetries: number): Promise<T> {
let attempt = 0
while (attempt <= maxRetries) {
try {
return await fn()
} catch (error) {
attempt++
if (attempt > maxRetries || !isRetryable(error)) throw error
const exponential = Math.min(1000 * Math.pow(2, attempt - 1), 10000)
const jitter = Math.random() * 500
await sleep(exponential + jitter)
}
}
}
function isRetryable(error: any): boolean {
return (
error.code === 'ECONNRESET' ||
error.code === 'ETIMEDOUT' ||
(error.status >= 500 && error.status < 600) ||
error.status === 429
)
}Retry Decision Matrix:
| Error Type | Retry? | Rationale |
|---|---|---|
| 5xx, 429, Network Timeout | ✅ Yes | Transient errors |
| 4xx, 401, 403, 404 | ❌ No | Client errors won't fix themselves |
if (error.status === 429) {
const retryAfter = parseInt(error.headers['retry-after'] || '60')
await sleep(retryAfter * 1000)
}Respect Retry-After header on 429 responses.
See references/retry-backoff.md for jitter strategies, circuit breakers, and idempotency keys.
class APIError extends Error {
constructor(
message: string,
public status: number,
public code: string,
public requestId: string
) {
super(message)
this.name = 'APIError'
}
}
class RateLimitError extends APIError {
constructor(message: string, requestId: string, public retryAfter: number) {
super(message, 429, 'rate_limit_error', requestId)
}
}
class AuthenticationError extends APIError {
constructor(message: string, requestId: string) {
super(message, 401, 'authentication_error', requestId)
}
}try {
const user = await client.users.create({ email: 'invalid' })
} catch (error) {
if (error instanceof RateLimitError) {
await sleep(error.retryAfter * 1000)
} else if (error instanceof AuthenticationError) {
console.error('Invalid API key')
} else if (error instanceof APIError) {
console.error(`${error.message} (Request ID: ${error.requestId})`)
}
}Include request ID in all errors for debugging.
See references/error-handling.md for user-friendly messages, validation errors, and debugging support.
TypeScript:
for await (const user of client.users.list({ limit: 100 })) {
console.log(user.id, user.email)
}Python:
async for user in client.users.list(limit=100):
print(user.id, user.email)SDK automatically fetches next page.
class UsersResource {
async *list(options?: { limit?: number }): AsyncGenerator<User> {
let cursor: string | undefined = undefined
while (true) {
const response = await this.client.request('GET', '/users', {
query: { limit: String(options?.limit || 100), ...(cursor ? { cursor } : {}) }
})
for (const user of response.data) yield user
if (!response.has_more) break
cursor = response.next_cursor
}
}
}let cursor: string | undefined = undefined
while (true) {
const response = await client.users.list({ limit: 100, cursor })
for (const user of response.data) console.log(user.id)
if (!response.has_more) break
cursor = response.next_cursor
}Provide both automatic and manual options.
See references/pagination.md for cursor vs. offset pagination and Go channel patterns.
async *stream(path: string, body?: any): AsyncGenerator<any> {
const response = await fetch(url, {
headers: { 'Accept': 'text/event-stream' },
body: JSON.stringify(body)
})
const reader = response.body!.getReader()
const decoder = new TextDecoder()
while (true) {
const { done, value } = await reader.read()
if (done) break
const chunk = decoder.decode(value)
for (const line of chunk.split('\n')) {
if (line.startsWith('data: ')) {
const data = line.slice(6)
if (data === '[DONE]') return
yield JSON.parse(data)
}
}
}
}
// Usage
for await (const chunk of client.posts.stream({ prompt: 'Write a story' })) {
process.stdout.write(chunk.content)
}Prevent duplicate operations during retries:
import { randomUUID } from 'crypto'
if (['POST', 'PATCH', 'PUT'].includes(method)) {
headers['Idempotency-Key'] = options?.idempotencyKey || randomUUID()
}
// Usage
await client.charges.create(
{ amount: 1000 },
{ idempotencyKey: 'charge_unique_123' }
)Server deduplicates requests by key.
1.0.0 → 1.1.0: New features (safe)1.1.0 → 2.0.0: Breaking changes (review)1.0.0 → 1.0.1: Bug fixes (safe)function deprecated(message: string, since: string) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value
descriptor.value = function (...args: any[]) {
console.warn(`[DEPRECATED] ${propertyKey} since ${since}. ${message}`)
return originalMethod.apply(this, args)
}
return descriptor
}
}
@deprecated('Use users.list() instead', 'v2.0.0')
async getAll() { return this.list() }const client = new APIClient({
apiKey: 'sk_test_...',
apiVersion: '2025-01-01'
})See references/versioning.md for migration strategies.
interface ClientConfig {
apiKey: string
baseURL?: string
maxRetries?: number
timeout?: number
apiVersion?: string
onTokenRefresh?: (token: string) => void
}
class APIClient {
constructor(config: ClientConfig) {
this.apiKey = config.apiKey
this.baseURL = config.baseURL || 'https://api.example.com'
this.maxRetries = config.maxRetries ?? 3
this.timeout = config.timeout ?? 30000
}
}Provide sensible defaults, require only apiKey.
| Pattern | Use Case |
|---|---|
| API Key | Service-to-service |
| OAuth Refresh | User-based auth |
| Bearer Per-Request | Multi-tenant |
| Strategy | Use Case |
|---|---|
| Exponential Backoff | Default retry |
| Rate Limit | 429 responses |
| Max Retries | Avoid infinite loops (3-5) |
| Pattern | Language | Use Case |
|---|---|---|
| Async Iterator | TypeScript, Python | Automatic pagination |
| Generator | Python | Sync pagination |
| Channels | Go | Concurrent iteration |
| Manual | All | Explicit control |
Architecture:
references/architecture-patterns.md - Resource vs. command organizationCore Patterns:
references/authentication.md - OAuth, token refresh, credential providersreferences/retry-backoff.md - Exponential backoff, jitter, circuit breakersreferences/error-handling.md - Error hierarchies, debugging supportreferences/pagination.md - Cursor vs. offset, async iteratorsreferences/versioning.md - SemVer, deprecation strategiesreferences/testing-sdks.md - Unit testing, mocking, integration testsTypeScript:
examples/typescript/basic-client.ts - Simple async SDKexamples/typescript/advanced-client.ts - Retry, errors, streamingexamples/typescript/resource-based.ts - Stripe-style organizationPython:
examples/python/sync-client.py - Synchronous clientexamples/python/async-client.py - Async client with asyncioexamples/python/dual-client.py - Both sync and asyncGo:
examples/go/basic-client.go - Simple Go clientexamples/go/context-client.go - Context patternsexamples/go/channel-pagination.go - Channel-based paginationStudy these production SDKs:
TypeScript/JavaScript:
@aws-sdk/client-*): Modular, tree-shakeable, middlewarestripe): Resource-based, typed errors, excellent DXopenai): Streaming, async iterators, modern TypeScriptPython:
boto3): Resource vs. client patterns, paginatorsstripe): Dual sync/async, context managersGo:
github.com/aws/aws-sdk-go-v2): Context, middlewareAvoid these mistakes:
Retry-After header on 429 responsesReview language-specific examples for implementation details. Study references for deep dives on specific patterns. Examine best-in-class SDKs (Stripe, AWS, OpenAI) for inspiration.
© ancoleman, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 17 other files (references) in skills/designing-sdks of ancoleman/ai-design-components.
Open the folder on GitHubat commit 76551b7
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in ancoleman/ai-design-components, which our catalogue first saw on October 7, 2026.
Designing Sdks next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Designing Sdks this skillancoleman/ai-design-components | 526 | 1 repos | ~3.2k | Automated safety check: Pass | MIT | |
| System Bridge Go Backendtimmo001/system-bridge | 356 | — | ~841 | Automated safety check: Pass | Apache-2.0 | |
| API Error Design Patternsrevfactory/harness-100 | 1.3k | — | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| Nodejsblencorp/claude-code-kit | 106 | — | ~2.6k | Automated safety check: Pass | MIT | |
| Resiliencecodewithmukesh/dotnet-claude-kit | 751 | 1 repos | ~3.2k | Automated safety check: Pass | MIT | |
| Python Resiliencewshobson/agents | 40k | — | ~1.5k | Automated safety check: Pass | MIT |
timmo001/system-bridge
System Bridge Go backend conventions - error wrapping, graceful degradation for data modules, nil-pointer safety, context-aware Module.Update, structured slog logging, and errcheck-clean deferred…
revfactory/harness-100
Reference for designing how an API reports failures: structured error codes, response shapes, client-friendly messages, an error catalog and retry or fallback advice.
blencorp/claude-code-kit
Core Node.js backend patterns for TypeScript applications including async/await error handling, middleware concepts, configuration management, testing strategies, and layered architecture principles.
codewithmukesh/dotnet-claude-kit
Resilience patterns for .NET 10 applications using Polly v8.
wshobson/agents
Python resilience patterns including automatic retries, exponential backoff, timeouts, and fault-tolerant decorators.
dpearson2699/swift-ios-skills
Build, review, or improve networking code in iOS/macOS apps using URLSession with async/await, structured concurrency, and modern Swift patterns.
ancoleman/ai-design-components
Builds AI chat interfaces and conversational UI with streaming responses, context management, and multi-modal support.
ancoleman/ai-design-components
Builds form components and data collection interfaces including contact forms, registration flows, checkout processes, surveys, and settings pages.
ancoleman/ai-design-components
Builds tables and data grids for displaying tabular information, from simple HTML tables to complex enterprise data grids.
ancoleman/ai-design-components
Creates comprehensive dashboard and analytics interfaces that combine data visualization, KPI cards, real-time updates, and interactive layouts.
ancoleman/ai-design-components
Designs layout systems and responsive interfaces including grid systems, flexbox patterns, sidebar layouts, and responsive breakpoints.
ancoleman/ai-design-components
Displays chronological events and activity through timelines, activity feeds, Gantt charts, and calendar interfaces.
Categories
Design production-ready SDKs with retry logic, error handling, pagination, and multi-language support. Designing Sdks is an agent skill from ancoleman/ai-design-components. Design production-ready SDKs with retry logic, error handling, pagination, and multi-language support.
Designing Sdks fits situations like: building client libraries for APIs; creating developer-facing SDK interfaces.
Run `npx skills add ancoleman/ai-design-components --skill designing-sdks -a claude-code`. Or copy the skill folder (skills/designing-sdks in ancoleman/ai-design-components) into .claude/skills/designing-sdks in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ancoleman/ai-design-components --skill designing-sdks -a codex`. Or copy the skill folder (skills/designing-sdks in ancoleman/ai-design-components) into .agents/skills/designing-sdks in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ancoleman/ai-design-components --skill designing-sdks -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/designing-sdks, .gemini/skills/designing-sdks, .github/skills/designing-sdks and .opencode/skills/designing-sdks in your project.
Going by SKILL.md and its folder, Designing Sdks needs Go, Python and TypeScript for the scripts in its folder and credentials named API_KEY. Our summary lists: Python 3; Node.js; A credential in API_KEY.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Designing Sdks is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 15k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Designing Sdks: System Bridge Go Backend (timmo001/system-bridge, 356 stars), API Error Design Patterns (revfactory/harness-100, 1.3k stars), Nodejs (blencorp/claude-code-kit, 106 stars) and Resilience (codewithmukesh/dotnet-claude-kit, 751 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ancoleman (a GitHub user) maintains it in ancoleman/ai-design-components, which has 526 GitHub stars. The repository holds 75 skills in this directory. The repository was last updated on December 11, 2025.
Source: ancoleman/ai-design-components on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.