SYSTEM.md

Personal defaults for working with agents.

Design

  • Follow the existing design system. Without one, start with monochrome, clear contrast, and a subtle accent
  • Keep names, appearance, and behavior consistent across screens and platforms; respect native conventions. Let each page's purpose shape its layout
  • Use shared tokens for color, type, spacing, size, corners, and motion. Prefer built-in scales over arbitrary values
  • Keep UI minimal: clear hierarchy, essential actions, no decorative panels or unnecessary controls
  • Define shared text styles by role. No local size, weight, tracking, or line-height overrides
  • For a new design system, use few sizes and weights, clear size jumps, strong headings, and quiet body text
  • Use VS™ Modules when existing project or native components don't cover the need. Add reusable components and improvements back to the library
  • Keep existing or native icon sets. Otherwise use VS™ Icons through a shared component. Match stroke, corners, optical size, and text color; don't mix sets or draw replacements
  • Matching surfaces share one treatment, including glass. No double borders. Inner corners use smaller radii so the gap stays even
  • Apply themes to sheets, menus, native controls, and browser UI. No initial flash or transitions when switching
  • Prefer interactive product demos. Demos, previews, and shared images reuse real product components and framing
  • Compress media and serve appropriate sizes without noticeable quality loss. Archive originals outside the repo; keep only assets the project uses
  • Load visible media first; defer the rest. Prefer video to GIFs, with pause controls and a still image for reduced motion

Layout

  • Shared layouts own gutters, headers, scrolling, and footers. Leave room for fixed controls and safe areas
  • Keep text columns readable; give tables, charts, and demos the width they need
  • No layout shifts. Reserve media and loading space; preserve size, position, spacing, and type across states
  • Favor generous section spacing; keep related elements close. Remove leftover spacing when content is removed
  • Match control heights and baselines. Tabs and paired action buttons share equal widths; standalone controls fit content, sidebar controls fill their column
  • Align corresponding headings, text, and actions across columns, even when copy wraps differently
  • Keep layouts aligned with empty screens, long text, and lots of content
  • Keep button labels on one line with room around text and icons. Correct alignment by eye
  • Dialogs fit their content, with a viewport limit and scrolling for overflow
  • Reflow on small screens; don't shrink type or clip controls. Wrap choices or use dropdowns; sideways scrolling is for media
  • Make interactive rows clickable through their padding. Small icons still need comfortable hit areas

Controls

  • Prefer native controls. Preserve editing, selection, gestures, and keyboard shortcuts when customizing them
  • Drag and swipe actions also work with buttons and the keyboard
  • Reuse shared components for appearance and behavior: loading, clearing, copying, disabled states
  • Use tabs for a few choices, dropdowns for longer lists. Skip single-option selectors and unnecessary steps
  • Keep menus on-screen and above surrounding content. Scroll long lists within a maximum height
  • Menu triggers toggle and stay active while open. Support keyboard navigation, Escape, and outside dismissal
  • Replace default browser focus rings with subtle styles that match the UI. Keep input and keyboard focus clear
  • Don't hide focused controls behind overlays. Return focus to the opening control when dialogs close
  • Inputs use consistent labels and spacing, useful placeholders, appropriate keyboards, and built-in clear, paste, or copy actions
  • Show errors beside fields; focus the first invalid field on submit. Validate without blocking typing
  • Place decorative input icons, prefixes, and suffixes inside the field with matching padding; clicking them focuses the input
  • Autofocus clear input flows, not mobile browsing. Keep paste, autofill, OTP suggestions, and zoom working
  • Make hover and press visible but subtle. Label icon controls; don't rely on color alone or make noninteractive elements look clickable
  • Style text selection, carets, and placeholders to match the UI. Use pointer cursors only for clickable elements
  • Keep control labels unselectable; content and inputs stay selectable

States

  • Load inside the existing surface. Skeletons replace missing content inside its real frame; don't stack loaders or temporary layouts
  • Skip loaders for quick responses; don't delay results just to show a loader
  • Keep content during refresh and drafts after errors; clear account data when switching accounts. Preserve focus, selection, and scroll unless the action changes them
  • Center screen-level empty states in the available space
  • Disable pending actions, not unrelated controls. Prevent duplicate submissions
  • Copy shows a check or “Copied” for one second. Keep feedback on its control; use toasts for results needing a separate message
  • Update affected views without a refresh. Optional data must not block the page; discard stale requests
  • Label estimates and unknown values; don't substitute zero
  • Check whether a write succeeded before retrying

Motion & navigation

  • Use shared motion and native transitions. Keep animations quick and interruptible; they must not delay input
  • Keyboard, sheet, and attached actions move together, including during a drag. Nested scrolling, paging, and dismissal must not fight each other
  • Prefer native scroll-edge effects. Fade content, not fixed controls or borders; avoid hard cutoffs and painted bands
  • Animate changing labels and values through shared text transitions, including button text. Use tabular numbers; don't replay unchanged content; respect reduced motion
  • Use real links so opening in another tab works. Keep URLs short; include shareable filters, tabs, and page numbers
  • Preserve Back and Forward, saved preferences, and destinations through sign-in

Copy

  • Plain English, ultra-concise. No slogans, jargon, filler, invented feature names, or em dashes
  • Lead with what people gain. Back claims with real numbers, examples, or customers
  • Remove repeated labels, values, obvious instructions, and technical details users don't need
  • Balance headings and short descriptions to avoid awkward breaks and lone words on the last line. Don't add filler to make lines match
  • Summaries and PRs: short bullets, no trailing periods

Code & docs

  • Keep feature files together. Share common logic and assets across apps; keep platform code local
  • Keep shared values and rules in one place. Format numbers, dates, units, and addresses through shared helpers
  • Renames automatically update related labels, identifiers, routes, files, config, and docs; preserve unrelated and third-party names
  • Use existing framework, SDK, and library features before adding dependencies or custom code
  • Keep project commands short and consistent across repos; list them in the README
  • Generate titles, descriptions, and OG text and images from each page's content. Keep canonical URLs and sitemaps in sync with public, indexable routes
  • Remove replaced code, unused assets and wrappers, and stale docs in the same change
  • READMEs: purpose, stack, structure, setup, usage. Plain English, clear headings, short sections; link to details
  • Design docs link to real components and finished screens
  • AGENTS files hold lasting rules and context, not work logs. Update the owning doc when behavior changes; don't repeat facts across files

Workflow

  • Turn repeated corrections into shared fixes: behavior in components, design decisions in rules. Keep one-off fixes local
  • Compare regressions with the last working version before adding workarounds
  • Don't build, test, launch, benchmark, automate browsers or simulators, or start servers unless I ask
  • Commit, push, merge, deploy, or release only when asked. “Commit and push” means all changes unless I say otherwise