
Harden
Stress-test and fix UI against long text, errors, i18n, RTL, empty data, and API failure modes before launch.
Overview
harden is an agent skill most often used in Ship launch (also Build frontend, Operate errors) that makes UIs production-ready via edge cases, errors, i18n, and empty-state handling.
Install
npx skills add https://github.com/pbakaus/impeccable --skill hardenWhat is this skill?
- Extreme input matrix: long and short text, emoji, RTL, large numbers, 1000+ list items, empty data
- Error scenario coverage: offline, timeout, HTTP 400–500, validation, permissions, rate limits, concurrency
- Internationalization checks: longer locales, RTL, CJK and emoji, date/time, number, and currency formats
- Explicit production bar: designs that only work with perfect data are flagged as not production-ready
- Overlaps onboarding and empty-state hardening when user asks for production-ready UI
- Tests list scenarios with 1000+ items and 50+ options
- Covers HTTP 400, 401, 403, 404, and 500 API error classes
Adoption & trust: 53.6k installs on skills.sh; 35.9k GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
Your UI looks fine in demos but breaks on long copy, failed requests, RTL locales, or empty datasets.
Who is it for?
Builders about to ship a customer-facing app who already have core UI and need a structured resilience pass.
Skip if: Greenfield visual design or brand exploration—use impeccable first; skip if you only need backend hardening without UI.
When should I use this skill?
User asks to harden, make production-ready, handle edge cases, add error states, design empty states, improve onboarding UI, or fix overflow and i18n issues.
What do I get? / Deliverables
The target interface is reviewed against stress inputs and failure modes with concrete fixes so it survives real-world usage at launch.
- Hardening assessment by dimension
- Implemented or specified error and empty states
- i18n and overflow fixes
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Production-ready interfaces are a Ship concern immediately before and during launch, when ideal mock data no longer holds. Launch prep includes error, empty, and overflow states that break real users if only happy paths were designed.
Where it fits
Run a pre-launch pass on checkout and settings screens for API 401/500 and validation messaging.
Fix tables and nav that collapse when descriptions exceed design-length assumptions.
Add missing offline and timeout UI after users report blank states in production.
How it compares
Frontend resilience workflow for agents, not a substitute for automated E2E test suites or security pentests.
Common Questions / FAQ
Who is harden for?
Solo developers and indie teams with Claude Code, Cursor, or similar agents who own frontend launch quality.
When should I use harden?
In Ship before launch on error and overflow issues; in Build when finishing components; in Operate when production incidents expose missing error UI.
Is harden safe to install?
It guides UI changes and may touch project files depending on your agent; review the Security Audits panel on this Prism page before installing.
Workflow Chain
Then invoke: onboard
SKILL.md
READMESKILL.md - Harden
Strengthen interfaces against edge cases, errors, internationalization issues, and real-world usage scenarios that break idealized designs. ## Assess Hardening Needs Identify weaknesses and edge cases: 1. **Test with extreme inputs**: - Very long text (names, descriptions, titles) - Very short text (empty, single character) - Special characters (emoji, RTL text, accents) - Large numbers (millions, billions) - Many items (1000+ list items, 50+ options) - No data (empty states) 2. **Test error scenarios**: - Network failures (offline, slow, timeout) - API errors (400, 401, 403, 404, 500) - Validation errors - Permission errors - Rate limiting - Concurrent operations 3. **Test internationalization**: - Long translations (German is often 30% longer than English) - RTL languages (Arabic, Hebrew) - Character sets (Chinese, Japanese, Korean, emoji) - Date/time formats - Number formats (1,000 vs 1.000) - Currency symbols **CRITICAL**: Designs that only work with perfect data aren't production-ready. Harden against reality. ## Hardening Dimensions Systematically improve resilience: ### Text Overflow & Wrapping **Long text handling**: ```css /* Single line with ellipsis */ .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* Multi-line with clamp */ .line-clamp { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; } /* Allow wrapping */ .wrap { word-wrap: break-word; overflow-wrap: break-word; hyphens: auto; } ``` **Flex/Grid overflow**: ```css /* Prevent flex items from overflowing */ .flex-item { min-width: 0; /* Allow shrinking below content size */ overflow: hidden; } /* Prevent grid items from overflowing */ .grid-item { min-width: 0; min-height: 0; } ``` **Responsive text sizing**: - Use `clamp()` for fluid typography - Set minimum readable sizes (14px on mobile) - Test text scaling (zoom to 200%) - Ensure containers expand with text ### Internationalization (i18n) **Text expansion**: - Add 30-40% space budget for translations - Use flexbox/grid that adapts to content - Test with longest language (usually German) - Avoid fixed widths on text containers ```jsx // ❌ Bad: Assumes short English text <button className="w-24">Submit</button> // ✅ Good: Adapts to content <button className="px-4 py-2">Submit</button> ``` **RTL (Right-to-Left) support**: ```css /* Use logical properties */ margin-inline-start: 1rem; /* Not margin-left */ padding-inline: 1rem; /* Not padding-left/right */ border-inline-end: 1px solid; /* Not border-right */ /* Or use dir attribute */ [dir="rtl"] .arrow { transform: scaleX(-1); } ``` **Character set support**: - Use UTF-8 encoding everywhere - Test with Chinese/Japanese/Korean (CJK) characters - Test with emoji (they can be 2-4 bytes) - Handle different scripts (Latin, Cyrillic, Arabic, etc.) **Date/Time formatting**: ```javascript // ✅ Use Intl API for proper formatting new Intl.DateTimeFormat('en-US').format(date); // 1/15/2024 new Intl.DateTimeFormat('de-DE').format(date); // 15.1.2024 new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(1234.56); // $1,234.56 ``` **Pluralization**: ```javascript // ❌ Bad: Assumes English pluralization `${count} item${count !== 1 ? 's' : ''}` // ✅ Good: Use proper i18n library t('items', { count }) // Handles complex plural rules ``` ### Error Handling **Network errors**: - Show clear error messages - Provide retry button - Explain what happened - Offer offline mode (if applicable) - Handle