This skill should be used when building blocks for the BigBlocks registry, adding Bitcoin UI components, or working with the bigblocks-registry repo. Triggers on 'add a block', 'create a BigBlocks component', 'new block', 'build a block', 'BigBlocks registry', 'bitcoin UI component', 'marketplace block', 'social block', 'wallet block', 'identity block', '@1sat/react', '@1sat/actions', 'BSocial', 'OrdLock', 'inscribe', 'ordinals UI', or 'on-chain social'. Provides the standard block structure, registry entry format, SDK integration patterns, and project context detection.
From bigblocksnpx claudepluginhub b-open-io/claude-plugins --plugin bigblocksThis skill uses the workspace's default tool permissions.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Builds 3-5 year financial models for startups with cohort revenue projections, cost structures, cash flow, headcount plans, burn rate, runway, and scenario analysis.
Build production-ready blocks for the BigBlocks registry — the shadcn-compatible component registry for Bitcoin applications.
Detect the project configuration before building:
cat apps/registry/registry.json | head -5
This returns the registry manifest with all existing blocks, their types, dependencies, and file paths. Use this to understand naming conventions, dependency patterns, and what already exists.
BigBlocks ships only registry:block items. Every block bundles UI presentation with business logic (wallet actions, on-chain transactions, API queries). This is what makes BigBlocks different from a pure UI library — each block is a complete feature, not just a styled element.
The name "BigBlocks" reflects this: big, self-contained building blocks for Bitcoin apps.
Every block lives in apps/registry/registry/new-york/blocks/[name]/ with exactly three concerns:
blocks/[name]/
index.tsx — Composed export: wires hook to UI, re-exports all types
[name]-ui.tsx — Pure presentation: shadcn components, theme tokens, no SDK imports
use-[name].ts — Pure logic: wallet actions, 1sat-stack queries, state management
Split the UI file further when it exceeds ~250 lines or contains logically separate surfaces (e.g., trigger button + dialog form = two UI files).
use-[name].ts)Owns all logic. Imports from @1sat/react and @1sat/actions. Never imports UI components.
import { useCallback, useState } from "react"
import { useWallet } from "@1sat/react"
export interface UseNameReturn {
isLoading: boolean
error: Error | null
execute: (params: NameParams) => Promise<NameResult>
reset: () => void
}
export function useName({ onSuccess, onError }: UseNameOptions = {}): UseNameReturn {
const { wallet } = useWallet()
const [isLoading, setIsLoading] = useState(false)
const [error, setError] = useState<Error | null>(null)
const execute = useCallback(async (params: NameParams) => {
setIsLoading(true)
setError(null)
try {
const result = await action.execute({ wallet }, params)
onSuccess?.(result)
return result
} catch (err) {
const e = err instanceof Error ? err : new Error(String(err))
setError(e)
onError?.(e)
return { error: e.message }
} finally {
setIsLoading(false)
}
}, [wallet, onSuccess, onError])
return { isLoading, error, execute, reset: useCallback(() => setError(null), []) }
}
[name]-ui.tsx)Pure presentation. Receives data and callbacks as props. Never imports from @1sat/* SDKs.
"use client"
import { Button } from "@/components/ui/button"
import { cn } from "@/lib/utils"
export function NameUi({ isLoading, error, onSubmit, className }: NameUiProps) {
return (
<div className={cn("...", className)}>
{/* shadcn components only, semantic color tokens only */}
</div>
)
}
index.tsx)Wires hook to UI. Re-exports everything consumers need from a single import.
"use client"
import { useName } from "./use-name"
import { NameUi } from "./name-ui"
export { useName } from "./use-name"
export { NameUi } from "./name-ui"
export type { UseNameOptions, NameParams, NameResult } from "./use-name"
export function Name({ onSuccess, onError, className }: NameProps) {
const { isLoading, error, execute } = useName({ onSuccess, onError })
return <NameUi isLoading={isLoading} error={error} onSubmit={execute} className={className} />
}
| Category | Blocks | Key SDK |
|---|---|---|
wallet | connect-wallet, send-bsv | @1sat/react useWallet, @1sat/actions payments |
social | post-button, like-button, follow-button, friend-button | @1sat/templates BSocial |
market | inscribe-file, deploy-token, create-listing, buy-listing | @1sat/actions ordinals, inscriptions |
identity | bitcoin-avatar, profile-card, identity-selector | @1sat/client BapClient, sigma-avatars |
Add to apps/registry/registry.json:
{
"name": "block-name",
"type": "registry:block",
"title": "Human Title",
"description": "What this block does in one sentence.",
"author": "Satchmo <https://bigblocks.dev>",
"categories": ["wallet"],
"dependencies": ["@1sat/react", "@1sat/actions", "lucide-react"],
"registryDependencies": ["button", "dialog", "input"],
"files": [
{ "path": "registry/new-york/blocks/block-name/index.tsx", "type": "registry:block", "target": "" },
{ "path": "registry/new-york/blocks/block-name/block-name-ui.tsx", "type": "registry:component", "target": "" },
{ "path": "registry/new-york/blocks/block-name/use-block-name.ts", "type": "registry:hook", "target": "" }
]
}
Follow with a demo entry:
{
"name": "block-name-demo",
"type": "registry:example",
"registryDependencies": ["https://registry.bigblocks.dev/r/block-name.json"],
"files": [{ "path": "registry/new-york/examples/block-name-demo.tsx", "type": "registry:example", "target": "" }]
}
import { useWallet } from "@1sat/react"
const { wallet, status, identityKey, connect, disconnect } = useWallet()
Actions follow action.execute(ctx, input) pattern. All return { txid?, rawtx?, error? }.
sendBsv — send satoshis to addressescreatePost, likePost, followUser — BSocial protocol transactionsinscribe, listOrdinal, purchaseOrdinal, cancelListing — 1Sat OrdinalsdeployBsv21Token, transferOrdTokens — BSV21 fungible tokenspublishIdentity, updateProfile — BAP identity managementimport { BSocial, MAP, Inscription, OrdLock } from "@1sat/templates"
Use templates directly only when @1sat/actions does not expose the operation needed.
Base URL: https://api.1sat.app/1sat
| Endpoint | Use |
|---|---|
GET /owner/{address}/balance | BSV balance |
GET /owner/{address}/txos | Unspent outputs (SSE) |
GET /bap/profile/{bapId} | BAP identity profile |
GET /bsocial/post/search?q=... | Social post search |
GET /bsv21/{tokenId} | Token details |
GET /content/{outpoint} | ORDFS inscription content |
These are non-negotiable because BigBlocks components must work with any shadcn theme and maintain type safety across the ecosystem:
"use client" on every .tsx filebg-primary, text-muted-foreground, border-border, etc. Never Tailwind palette colors (bg-blue-500)any, zero as casts, zero @ts-ignorecn() from @/lib/utils for class mergingcva from class-variance-authority for visual variants@/components/ui/*lucide-react for iconsonSuccess and onError callback propsRun after every block, before committing:
cd apps/registry && bunx tsc --noEmit
cd apps/registry && bun registry:build
grep -rn "\bany\b" apps/registry/registry/new-york/blocks/[name]/
grep -En "bg-(red|blue|green|yellow|purple|pink|gray|slate|zinc)-[0-9]+" apps/registry/registry/new-york/blocks/[name]/
Every block follows this workflow. Do not skip steps.
components.pen in Pencil@1sat/* SDK APIs the block will wrap (pull latest first)apps/showcase/content/docs/blocks/[name].mdxcd apps/registry && bunx tsc --noEmit
cd apps/registry && bun registry:build
# Test installation in fresh project
bunx shadcn@latest add https://registry.bigblocks.dev/r/[name].json
registry.bigblocks.dev/r/[name].jsonFollow these from the official shadcn skill — violations break theme compatibility:
gap-* not space-y-* or space-x-*size-N not w-N h-N when dimensions are equaldata-icon attribute, no sizing classesStudy these before building:
apps/registry/registry/new-york/blocks/send-bsv/apps/registry/registry/new-york/blocks/inscribe-file/apps/registry/registry/new-york/blocks/social-feed/apps/registry/registry.json