Your AI agent keeps making the same design mistakes. ECHO captures what you hate as structured rules, builds a taste profile, and exports it as a system prompt block. Persistent visual memory for AI style preferences.
Right now the loop is broken. You reject a change, explain why in chat, the agent forgets next session, makes the same mistake again. ECHO turns that explanation into a permanent rule.
Click elements in the simulated app on the left. Add complaints in the panel on the right. Watch the taste profile and system prompt build in real-time.
The all-in-one platform for modern teams to ship faster and break less.
Real-time insights into your deployment pipeline.
Alerts and dashboards for every service.
Drop it next to your app. Press Alt+E to toggle. Click elements. Describe what's wrong. Your rules persist in localStorage across sessions. Export whenever you're ready.
<Echo /> // Add it alongside your app. function App() { return ( <> <YourApp /> <Echo /> </> ) }
Every rule gets tagged with a category. The export groups them so your agent can scan by domain. Spacing, color, typography, layout, components, interaction, content, and general preferences.
Padding, margin, gap. "Too much whitespace." "Cards need more breathing room."
Palette, contrast, backgrounds. "Wrong shade of blue." "Never use pure black."
Font, size, weight. "Headings too heavy." "Prefer 14px body text."
Flex, grid, positioning. "Always center hero content." "Sidebar should be fixed."
Patterns, structure. "Never use modals for settings." "Prefer inline editing."
Hover, focus, motion. "Prefer subtle transitions." "Avoid bouncy animations."
Copy, tone, labels. "Keep button text to 2 words." "Never say 'Click here'."
Big picture preferences. "Minimal over decorative." "Function over form."
One click copies a structured block you paste into your Cursor rules, CLAUDE.md, Copilot instructions, or any system prompt. Rules are grouped by category, weighted by how often you've reinforced them, and typed (never, always, prefer, avoid).
<design_preferences> ## Spacing - **AVOID:** too much padding on cards (not `12px`) - **PREFER:** tight spacing, 8px gaps between elements ## Color - **NEVER:** use pure black for text (use `#1a1a1a`) [x3] - **PREFER:** muted borders, not high-contrast ## Typography - **ALWAYS:** use 14px for body text, not 16px - **AVOID:** bold weight on paragraph text ## Components - **NEVER:** use modals for settings pages - **PREFER:** inline editing over modal forms </design_preferences>
The useEcho hook gives you full control. Add rules from code, export profiles, import shared team preferences.
import { useEcho } from 'echoui' const { rules, addRule, exportSystemPrompt, importJSON, } = useEcho() // Add a rule programmatically addRule('spacing', 'avoid', 'Too much padding on cards', { badValue: '24px', goodValue: '12px', }) // Get system prompt block const prompt = exportSystemPrompt() // Share team preferences importJSON(teamProfileJSON)
Type naturally. ECHO figures out the rule type from how you phrase it. "Never use modals" becomes a NEVER rule. "Too much padding" becomes AVOID. "Prefer 14px body text" becomes PREFER. Start with "always", "never", "prefer", "avoid", or "use" for explicit typing. Everything else gets classified automatically.
Duplicate detection is built in. Say "too much padding" three times and ECHO reinforces the existing rule (weight goes to x3) instead of creating duplicates. Heavily weighted rules appear first in the export.
| Prop | Default | Description |
|---|---|---|
| project | document.title | Project name for the profile |
| shortcut | 'Alt+E' | Keyboard toggle |
| position | 'right' | Panel: right or left |
| panelWidth | 340 | Panel width in px |
| storageKey | 'echo-profile' | localStorage key |
| onRule | — | Callback when rule is added |
| onExport | — | Callback when profile exported |
Experimental, open-source software. Provided as-is with no warranties. DYOR. Use at your own risk. The author assumes zero liability.