v0.8 · open source · MIT

Components with taste, that you own.

178 React and Tailwind components you copy into your repo and keep. One token file, real dark mode, motion that earns its place.

178 components · 4 peer dependencies · 0 kb of runtime

Shipping 0.2

On track

178 components · 15 docs pages

+1
Docs coverage92%

Navigate

Components

Draft published

Your changelog is live on the preview URL.

New comment

Maya left a note on the pricing section.

Theme synced

Dark tokens were updated.

A quiet interface built from the same tokens as every other shelf.

Components

178

12 new

Runtime

0 kb

Copy-owned

Weekly digest

Live

Sent every Monday at 9:00.

Notify me

Hero

Components with taste

One line, one CTA, live pieces underneath — the same pattern this page uses.

02Your files

No black box. Just the file.

Every component is one self-contained file. This is the actual source on the right, not a screenshot of it.

src/components/ui/dock.tsx
"use client";

import * as React from "react";
import { cn } from "@/lib/utils";

/** macOS-style dock: icons magnify smoothly with distance from the cursor. */
export function Dock({
  items,
  className,
}: {
  items: { id: string; label: string; icon: React.ReactNode; onSelect?: () => void }[];
  className?: string;
}) {
  const refs = React.useRef<(HTMLButtonElement | null)[]>([]);

  const magnify = (clientX: number) => {
    refs.current.forEach((el) => {
      if (!el) return;
      const r = el.getBoundingClientRect();
      const d = Math.abs(clientX - (r.left + r.width / 2));
      const scale = 1 + 0.7 * Math.exp(-((d / 70) ** 2));
      el.style.transform = `scale(${scale}) translateY(${(scale - 1) * -14}px)`;
    });
  };

  const reset = () =>
    refs.current.forEach((el) => {
      if (el) el.style.transform = "";
    });

  return (
    <div
      role="toolbar"
      className={cn(
        "inline-flex items-end gap-2 rounded-xl border border-line bg-surface/80 px-3 py-2.5 shadow-lift backdrop-blur-md",
        className,
      )}
      onMouseMove={(e) => magnify(e.clientX)}
      onMouseLeave={reset}
    >
      {items.map((item, i) => (
        <button
          key={item.id}
          ref={(el) => {
            refs.current[i] = el;
          }}
// …
Showing 46 of 64 linesFull file

03Agent-ready

Your coding agent can use it too.

An MCP server, a CLI with JSON output, an llms.txt brief and a registry with generated API tables. Agents search, read and add components without scraping a page.

  • search_components
  • get_component
  • add_component
  • get_tokens
Agents and MCP
terminal
# give your agent the library
claude mcp add vibeui -- node ./vibeui/mcp/server.mjs

# or drive the CLI yourself
npx @agents-npm-packages/vibeui search "date picker" --json
npx @agents-npm-packages/vibeui add calendar --dir ./src/components/ui

04 — start

Take it. It's yours.

or follow the two-minute guide