Keysmith
Version 1.0.0 · Published via Claudesign.
Keysmith Design System
Keysmith offers non-custodial wallets to AI agents. Users sign in with Face ID / Touch ID, create any number of wallets, set spending policies, and drop the generated agent key into an agent harness (OpenClaw, Hermes, Claude Code, or any x402-capable client) so the agent can pay for APIs, compute, data, and services autonomously — within the rules the user sets.
The product is a dense, dark, data-rich dashboard. The mood is command-center meets fintech: serious about money, clear about state, zero decorative noise. Every pixel earns its place by communicating state or enabling action.
Products represented
| Product | What it is |
|---|---|
Keysmith App (app.keysmith.ai) |
The wallet management dashboard. Create MPC-secured wallets on Base, fund with USDC, issue agent keys, set policies, view transactions. |
| Skills Marketplace | Public catalog of agent skills (pre-built x402-compatible tools). Browsable without auth. |
| Why / Security / FAQ | Marketing surfaces within the same app — explain the product to new visitors. |
Source materials
| Source | Location | Notes |
|---|---|---|
| Production codebase | oviato-ai-app/ (mounted, read-only) |
Astro 5 + React 19 + Tailwind 4. Currently branded "Oviato"; this design system renames the brand to Keysmith per the uploaded logo. See §Rebrand below. |
| Design spec | oviato-ai-app/.design/design.md |
598-line spec documenting colors, type, components, animations. Used as the source of truth for token values. |
| Logo mark | uploads/ks-logo.png → assets/keysmith-logo.png |
Coral wordmark, transparent background |
| Logo symbol | uploads/ks-icon.png → assets/keysmith-icon.png |
The stylized "K" monogram |
| Brand palette | uploads/colors.png → assets/palette-reference.png |
4-swatch reference: coral, blue-grey, pale cyan, deep navy |
| Display font | uploads/Unbounded-VariableFont_wght.ttf → fonts/ |
Used for display/hero type |
Rebrand note — Oviato → Keysmith
The attached codebase (oviato-ai-app) ships under the "Oviato" brand with a blue #1899E7 accent. The user has provided a new wordmark and icon under the name Keysmith, plus a new palette centered on coral #ee6055. This design system uses Keysmith as the canonical brand:
- Primary accent: coral
#ee6055(was Oviato blue) - Display font: Unbounded (new — for hero/display type)
- Body font: Outfit (retained from codebase)
- All product structure, component inventory, and copy tone are lifted from the Oviato codebase — only the name, logomark, and primary accent change.
Where the original codebase says "Oviato" in product copy (e.g. "Oviato Agent Wallet"), treat that as "Keysmith Agent Wallet" in new output.
Index — what's in this folder
Keysmith Design System/
├── README.md ← you are here
├── SKILL.md ← Agent Skill manifest (cross-compat with Claude Code)
├── colors_and_type.css ← all tokens as CSS vars (import once at root)
│
├── fonts/
│ └── Unbounded-VariableFont_wght.ttf
│
├── assets/
│ ├── keysmith-logo.png ← coral wordmark
│ ├── keysmith-icon.png ← K monogram
│ ├── palette-reference.png ← 4-swatch palette
│ ├── agent-dollar.png ← hero illustration (marketing)
│ ├── empty-state-no-wallet.png
│ ├── base-symbol.svg ← Base chain logo (for "on Base" chips)
│ └── icons/
│ ├── anthropic.svg / openai.svg / google.svg / meta.svg /
│ ├── xai.svg / mistral.svg / perplexity.svg / deepseek.svg /
│ ├── cohere.svg / qwen.svg
│ └── — LLM provider logos used in marketing & Skills
│
├── preview/ ← cards that populate the Design System tab
│ ├── colors-brand.html
│ ├── colors-neutral.html
│ ├── colors-status.html
│ ├── type-display.html
│ ├── type-body.html
│ ├── type-mono.html
│ ├── spacing.html
│ ├── radii.html
│ ├── shadows.html
│ ├── buttons.html
│ ├── inputs.html
│ ├── cards.html
│ ├── badges.html
│ ├── status-dot.html
│ ├── logo.html
│ └── iconography.html
│
└── ui_kits/
└── keysmith-app/
├── README.md
├── index.html ← live prototype of dashboard
├── TopBar.jsx
├── Sidebar.jsx
├── WalletCard.jsx
├── StatCard.jsx
├── Button.jsx
└── — other JSX modules
Content Fundamentals
Voice. Direct, technical, confident. Reads like good developer tooling: explain what's happening, then show the action. No marketing fluff, no emoji in copy (though emoji are used as wallet avatars — see below). The product takes money seriously.
Person. Mostly second-person for instructions ("Create your first wallet", "Fund your wallet to get started"). Third-person for the agent ("Your agent gets its own wallet", "Your agent checks the price every hour"). Never first-person plural ("we") in UI — only in long-form security explanations where trust needs a human voice.
Casing. Sentence case everywhere — buttons, headings, menu items, modal titles. Uppercase + letter-spacing 0.5px for micro-labels only (section headers inside cards, field labels, status pills). Example: DEPOSITED, ACTIVE, YOUR WALLETS.
Tone examples (verbatim from the codebase):
- Hero: "Your agent is smart. Give it spending power."
- Problem framing: "Agents wait on you. Every API call, every purchase, every deployment — your agent stops and asks for permission. You become the bottleneck."
- Empty state: "Create your first Agent Wallet to get started and give your agent the power to pay for goods and services and receive payments non-custodially."
- Destructive action: "Kill it anytime with one click."
- FAQ answer: "No. Keysmith uses 2-of-3 Shamir Secret Sharing… we physically cannot move your funds without your participation."
Numbers. Always monospace. Always with locale formatting ($2,450.00, not $2450). Currency suffix (USDC) is a separate, smaller span in muted text.
Addresses & keys. Always truncated inline: 0x742d...bD08. Full value only in modals with an explicit copy button. Keys are masked with ● until an explicit passkey-gated reveal.
Emoji. Yes, but only as wallet avatars (🦅 Swift Falcon, 🧭 Bright Compass, 🔥 Silent Ember). Rendered in the Noto Emoji family for cross-platform consistency. Never decorative, never in headings or body copy.
Punctuation. Em-dashes (—) to break thoughts. Bullet points via · in inline status lines (Active · 28d left · wallet-a7x3). No exclamation marks except for successful completion states ("Created!").
Visual Foundations
Color philosophy
Coral is the hero. The #ee6055 coral is Keysmith's signature — it's the logo color, the primary CTA color, and the focus ring. Use it for one prominent action per view (the "Create Wallet" button on the dashboard, the "Sign" button in modals, the active nav tab). Do not use it for decorative backgrounds, gradients behind text, or anywhere the user is not meant to tap.
Status colors are semantic, not moods.
- Green
#4ade80→ money (balance, deposits), active state, success. - Red
#f87171→ withdrawals, rejections, limits exceeded, destructive actions on hover. - Yellow
#facc15→ limits, max-per-tx, paused state. - Purple
#a78bfa→ skills, agent identity (the "A" in the MPC ceremony), special/external. - Mist
#98c1d9→ informational chips, the "U" (user) share in MPC ceremony.
Neutrals are the canvas. 95% of the UI is built from --ks-ink (page), --ks-surface (card), --ks-border. Color should feel rationed, not sprinkled.
Typography
Three families. Each has a job and never swaps:
- Unbounded (display) — hero text, marketing headlines. Geometric, character-forward. 700/800 weight.
- Outfit (body) — everything else in UI. Clean geometric sans. 400–700.
- JetBrains Mono (data) — all addresses, keys, hashes, amounts, code. No exceptions. 400–700.
Uppercase micro-labels (DEPOSITED, ACTIVE) use Outfit 9–10px / 600 / letter-spacing: 0.5px.
Spacing
4px base grid. Common increments: 4, 8, 12, 16, 20, 24, 32, 40, 56. Page padding is 24px 28px. Card padding is 16px. Compact rows (sidebar items, transaction rows) use 10px 12px.
Backgrounds
- No gradients behind text. The main page is flat
--ks-ink. - No repeating patterns or textures.
- No hand-drawn illustrations (the one illustration is
agent-dollar.pngon the marketing page — treat as the exception). - Marketing pages may use a subtle grid-line background (
GridBackground.tsxin the codebase) at low opacity. - Cards use subtle diagonal gradients between two very close neutral shades (
#151a24 → #121620) for faint depth. See.ovi-card/.ks-card. - The "accent card" (
.ks-card-accent) has a faint coral radial bloom bottom-right — only used once per view, on the primary balance card.
Corner radii
- Pills (
9999px) for all interactive pill elements: buttons, inputs, chips, badges, status dots. - 12px for cards and panels.
- 16px for modals and marketing hero cards.
- 8px for sidebar items, icon tiles, avatar squares.
- 4px for tiny inline status pills (
ACTIVE).
Never mix radii within the same component class.
Borders
- Default:
1px solid var(--ks-border)(#1e2438). - Hover on interactive surfaces: border brightens to
--ks-border-strong(#283048). - Focus rings use coral:
0 0 0 2px var(--ks-coral-glow)+ coral border. - Input fields inherit
--ks-borderwith a coral focus ring.
Shadows
Shadows are earned, not default. Static elements have none.
- Cards at rest: no shadow. Elevation comes from background contrast + border.
- Cards on hover:
0 8px 24px rgba(0,0,0,0.30)+-1pxtranslate-Y. - Primary CTA on hover:
0 3px 14px rgba(238,96,85,0.22)(coral-tinted glow). - Modals:
0 16px 48px rgba(0,0,0,0.55). - Focus ring on inputs:
0 0 0 2px rgba(238,96,85,0.15). - Status dot (green, active):
0 0 8px rgba(74,222,128,0.3)+ 2s pulse. - Sign modal shield: animated glow between
0 0 12pxand0 0 28pxin coral.
Cards
Three card variants:
.ks-card— default. Subtle gradient background, 1px neutral border, 16px radius. Hover brightens border and lifts by 1px..ks-card-glow— stat cards on the dashboard. Slightly stronger border, subtle coral glow shadow..ks-card-accent— the balance card. Coral-tinted border, radial coral bloom in bottom-right corner. Use once per view on the primary object.
Animation
Fast and purposeful. Nothing longer than 500ms except ambient effects (pulse, orbit, glow).
- Fade-in + 8px slide for entering content (lists, cards). Staggered 40ms per item.
- Scale-in from
0.94 → 1.0for modals and success states. - Pulse (1 → 0.5 → 1 opacity, 2s) for "active" status dots.
- Animated counter — balances and stat values tween from old → new value over 800–1200ms with ease-out-cubic.
- Typing effect during wallet creation — 35–40ms per character, blinking coral cursor at end.
- MPC ceremony — 3 orbiting share tokens (U/S/A) around a central shield, 3s linear loop, collapsing to center on completion.
- Hex scramble — 28 random hex chars updating every 60ms at 50% opacity during key generation.
- Confetti burst on wallet created.
- All animations respect
prefers-reduced-motion: reduceand shrink to0.01ms.
Hover & press states
- Hover on links → brightens from
--ks-fg-2to--ks-fg-1. - Hover on nav tab → inactive tabs brighten; active tab keeps its glow.
- Hover on cards →
-1pxtranslate-Y + border brightens + shadow appears. - Hover on icon buttons → border brightens to
--ks-fg-3. - Press →
transform: scale(0.97)for ~80ms. Not a color shift — a size shift. Applies to buttons, pills, and tap targets. - Disabled → 50% opacity +
cursor: not-allowed.
Transparency & blur
- Modal overlay:
rgba(0,0,0,0.55)+backdrop-filter: blur(4px). - Nothing else uses blur. No glassmorphism, no frosted panels.
- "Glow" backgrounds (e.g.
--ks-coral-glow: rgba(238,96,85,0.12)) are solid colors at low alpha, applied as a flatbackground, never as a blurred overlay.
Layout rules
- Top bar: 64px,
--ks-inkbackground, bottom border. Logo left, nav middle, balance chip + user menu right. - Sidebar: 240px fixed,
--ks-surfacebackground, right border (gradient: neutral top → faint coral bottom). Scrollable if the wallet list is long. - Main content: flex-1, scrollable, padded
24px 28px, max content width800pxon wide screens. - Mobile (<768px): sidebar collapses, stat grids go 1-column, padding shrinks to
16px 14px. Balance chip moves into the mobile menu dropdown.
Iconography
Primary icon set: Lucide — stroke-based, 1.5–2px stroke weight, consistent metaphors. Used throughout the React app via lucide-react (v0.475+). Default size 14×14 in the UI, 16–20px for featured/hero icons, 12×12 for tiny inline icons. Color inherits from the parent text color.
Common Lucide icons in use:
Vault, Plus, Copy, Check, ArrowUpRight, ArrowDownLeft, Key, Shield, Eye, EyeOff, LogOut, Clock, Settings, Wallet, Menu, X, ChevronDown, Pause, Play, Zap, AlertCircle, ExternalLink, RefreshCw, ArrowRight, Terminal, Globe, CreditCard, Server, TrendingUp, Bot, Lock.
Load Lucide from CDN in HTML artifacts:
<script type="module">
import { createIcons, Vault, Plus, Copy /* ... */ } from "https://esm.sh/[email protected]";
createIcons({ icons: { Vault, Plus, Copy } });
</script>
Or use the sprite approach from https://unpkg.com/[email protected]/icons/<name>.svg for plain HTML.
Brand & partner logos (SVG): Stored in assets/icons/ — anthropic, openai, google, meta, xai, mistral, perplexity, deepseek, cohere, qwen. Used on marketing pages ("supported agents") and in the Skills marketplace. Always render at their native color.
Base chain logo: assets/base-symbol.svg — used as a tiny 12×12 link icon next to tx_hash values that link out to BaseScan.
Wallet avatars are emoji. Rendered in the Noto Emoji font for platform consistency. Each wallet picks one emoji at creation time (🦅 🧭 🔥 etc.).
Unicode chars as icons — used sparingly for inline dividers only: · between status fragments, → in copy. Not used as icons.
No hand-drawn SVG icons. If a needed icon isn't in Lucide, pick the nearest Lucide match rather than drawing a new one.
Tokens quick reference
Import colors_and_type.css once at the root; then use:
| Need | Token |
|---|---|
| Page background | var(--ks-ink) |
| Card background | var(--ks-surface) |
| Body text | var(--ks-fg-1) |
| Muted text | var(--ks-fg-2) / var(--ks-fg-3) |
| Primary CTA | background: var(--ks-coral-gradient); color: var(--ks-on-coral); |
| Coral focus ring | box-shadow: var(--sh-focus-ring); |
| Balance / money | color: var(--ks-success); font-family: var(--font-mono); |
| Display heading | font-family: var(--font-display); font-weight: 800; |
| Section label | class="ks-label" |
| Pill radius | border-radius: var(--r-pill) |
| Card radius | border-radius: var(--r-card) |
Font substitution flag
The uploaded Unbounded variable font is bundled in fonts/ and used for display type. If rendering in an environment without access to local font files (e.g. a sandboxed preview), we fall back to Outfit 700 for display. Outfit and JetBrains Mono are loaded from Google Fonts. If the user wants a different display font, swap the @font-face src and the --font-display value — no other token changes required.
See also
SKILL.md— manifest for using this as a Claude Code / Agent Skillui_kits/keysmith-app/— live prototype recreating the dashboardpreview/— individual design-system preview cards