Theme TokenTheme Token
ThemesSpecStudioMarketPricing
Theme Token

The protocol for creating, publishing, and trading on-chain UI themes. Immutable design systems powered by Bitcoin SV.

Active Palette

Product

  • Explore Themes
  • Theme Studio
  • Market
  • Pricing
  • Token Spec
  • About

Resources

  • GitHub
  • Contact
  • Privacy
  • Developers
  • SDK
  • Yours Wallet

Infrastructure

1Sat Ordinals

Themes inscribed on-chain. Permanent ownership.

1Sat App

Decentralized file system for ordinals content.

© 2026 Theme Token Protocol

Mainnet Live

// ShadCN Registry Format

Install on-chain themes

Every published theme gets a ShadCN-compatible URL you can install with one command.

Install via CLI
bunx shadcn@latest add https://themetoken.dev/r/themes/[origin].json

Replace [origin] with the theme's origin ID.

// The Schema

Theme Token Format

A theme is a small JSON document with a name and matching light and dark styles. Theme Token validates it, publishes it on-chain, and gives it a ShadCN-compatible install URL.

Theme Properties

19 required color values *

background
foreground
card
card-foreground
popover
popover-foreground
primary
primary-foreground
secondary
secondary-foreground
muted
muted-foreground
accent
accent-foreground
destructive
destructive-foreground
border
input
ring

Charts (optional)

chart-1
chart-2
chart-3
chart-4
chart-5

Sidebar (optional)

sidebar
sidebar-foreground
sidebar-primary
sidebar-primary-foreground
sidebar-accent
sidebar-accent-foreground
sidebar-border
sidebar-ring

Typography & Layout

radius*
font-sans
font-heading
font-serif
font-mono
letter-spacing
spacing

Use a font-family value here. Link an on-chain font through the theme's assets list.

Shadows (optional)

shadow-color
shadow-opacity
shadow-blur
shadow-spread
shadow-offset-x
shadow-offset-y

The Studio writes oklch() color values.

Complete example

{
  "$schema": "https://themetoken.dev/v1/schema.json",
  "name": "My Theme",
  "author": "Name (https://github.com/username)",
  "styles": {
    "light": {
      "background": "oklch(0.98 0.005 240)",
      "foreground": "oklch(0.15 0.01 240)",
      "card": "oklch(1 0 0)",
      "card-foreground": "oklch(0.15 0.01 240)",
      "popover": "oklch(1 0 0)",
      "popover-foreground": "oklch(0.15 0.01 240)",
      "primary": "oklch(0.55 0.22 255)",
      "primary-foreground": "oklch(0.98 0 0)",
      "secondary": "oklch(0.95 0.005 240)",
      "secondary-foreground": "oklch(0.25 0.01 240)",
      "muted": "oklch(0.95 0.005 240)",
      "muted-foreground": "oklch(0.5 0.01 240)",
      "accent": "oklch(0.95 0.01 255)",
      "accent-foreground": "oklch(0.25 0.01 240)",
      "destructive": "oklch(0.55 0.22 25)",
      "destructive-foreground": "oklch(0.98 0 0)",
      "border": "oklch(0.9 0.005 240)",
      "input": "oklch(0.9 0.005 240)",
      "ring": "oklch(0.55 0.22 255)",
      "radius": "0.5rem",
      "font-sans": "Inter",
      "font-mono": "JetBrains Mono"
    },
    "dark": {
      "background": "oklch(0.12 0.015 240)",
      "foreground": "oklch(0.95 0.005 240)",
      "card": "oklch(0.16 0.015 240)",
      "card-foreground": "oklch(0.95 0.005 240)",
      "popover": "oklch(0.16 0.015 240)",
      "popover-foreground": "oklch(0.95 0.005 240)",
      "primary": "oklch(0.65 0.22 255)",
      "primary-foreground": "oklch(0.12 0.015 240)",
      "secondary": "oklch(0.2 0.015 240)",
      "secondary-foreground": "oklch(0.95 0.005 240)",
      "muted": "oklch(0.2 0.015 240)",
      "muted-foreground": "oklch(0.65 0.01 240)",
      "accent": "oklch(0.25 0.02 255)",
      "accent-foreground": "oklch(0.95 0.005 240)",
      "destructive": "oklch(0.6 0.22 25)",
      "destructive-foreground": "oklch(0.98 0 0)",
      "border": "oklch(0.25 0.015 240)",
      "input": "oklch(0.25 0.015 240)",
      "ring": "oklch(0.65 0.22 255)",
      "radius": "0.5rem",
      "font-sans": "Inter",
      "font-mono": "JetBrains Mono"
    }
  },
  "assets": [
    {
      "role": "font.mono",
      "kind": "font",
      "source": {
        "kind": "origin",
        "origin": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_0"
      },
      "mediaType": "font/woff2",
      "integrity": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    }
  ]
}

Install a published theme from /r/themes/[origin].json with the ShadCN CLI.

// On-Chain Metadata

On-chain metadata

MAP uses registry:theme for theme packages. The gateway returns a ShadCN registry:theme item. Raw assets use the 1Sat registry:asset extension, with kind and mediaType describing their contents.

Theme MAP metadata
{
  "app": "theme-token",
  "type": "registry:theme",
  "name": "Cyberpunk Neon",
  "version": "1.0.0",
  "description": "A bright cyberpunk theme"
}

// BSV Implementation

Built for 1Sat Ordinals

Theme Token uses BSV and 1Sat Ordinals for publishing, discovery, ownership, and registry delivery.

load-theme.ts1Sat Ordinals
import { fetchThemeByOrigin, applyTheme } from "@theme-token/sdk";

const published = await fetchThemeByOrigin("<txid>_1");
if (!published) throw new Error("Theme not found");

applyTheme(published.theme.styles.light);
Storage
ord-fs/json on BSV
Discovery
MAP registry:theme
Gateway
1sat.app content API

// TypeScript SDK

@theme-token/sdk

Validate, fetch, convert, and apply Theme Tokens from TypeScript.

Install
bun add @theme-token/sdk

validateThemeToken

Validate a Theme Token document

fetchThemeByOrigin

Fetch a published theme by origin

parseCss

Convert CSS to ThemeToken

applyTheme

Apply one light or dark style map

View on GitHubnpm

// For AI Assistants

AI Agent Resources

Copy a concise Theme Token reference into your coding assistant, or give it one of these URLs.

llms.txt

Quick reference

llms-full.txt

Complete reference

@theme-token/sdk

TypeScript SDK

AI tools can also fetch directly: themetoken.dev/llms.txt or themetoken.dev/llms-full.txt