Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Web and App implementation guide for Brutalist Typography. Trigger when user wants huge fonts, raw presentation, and aggressive layout decisions.
.claude/skills/lingxling-brutalist-typography/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | -18% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 81% | 0% |
| case-10 | ✓→✓ | = Same ✓ | 100% | 0% |
| case-09 | ✓→✓ | = Same ✓ | 51% | 0% |
> "Aggressive, unpolished, and unapologetic. Text that demands attention by breaking the rules."
Use this sub-style when the user's request matches the aesthetic described above. This is a child reference of the design-it skill and is not meant to be triggered directly.
Times New Roman, Arial, Courier New) blown up to 150px.cssbody { background-color: #fff; color: #000; font-family: 'Times New Roman', serif; } .brutalist-headline { font-size: 15vw; line-height: 0.7; letter-spacing: -5px; margin-left: -10px; /* Bleeds off screen intentionally */ word-wrap: break-word; /* Let words break awkwardly */ } .brutalist-highlight { background-color: #ff0000; color: #fff; padding: 0 10px; } .marquee-container { border-top: 5px solid #000; border-bottom: 5px solid #000; overflow: hidden; white-space: nowrap; font-family: 'Courier New', monospace; font-size: 2rem; font-weight: bold; padding: 10px 0; } /* A nod to early 90s web */ .brutalist-link { color: #0000ee; text-decoration: underline; text-transform: uppercase; } .brutalist-link:hover { background-color: #0000ee; color: #fff; }
swiftstruct BrutalistTypeView: View { var body: some View { ScrollView { VStack(alignment: .leading, spacing: -20) { // Bleeds off the edge intentionally Text("BREAK") .font(.custom("Times New Roman", size: 120)) .padding(.leading, -20) Text("THE") .font(.custom("Arial", size: 140)) .fontWeight(.black) .foregroundColor(.clear) .overlay( Text("THE").stroke(Color.red, lineWidth: 3) ) .offset(x: 40) Text("GRID.") .font(.custom("Courier New", size: 100)) .background(Color.blue) .foregroundColor(.white) .rotationEffect(.degrees(-5)) .offset(y: -40) } .frame(maxWidth: .infinity, alignment: .leading) .padding(.top, 50) } .ignoresSafeArea() // Critical for Brutalist type .background(Color.white) } }
.ignoresSafeArea() is mandatory. Text must be allowed to clip into the notch and status bar.spacing in VStack or explicit negative .offset() to force text elements to overlap each other aggressively..foregroundColor(.clear) and overlaying a .stroke().dartclass BrutalistTypeScreen extends StatelessWidget { @override Widget build(BuildContext context) { // Scaffold without SafeArea return Scaffold( backgroundColor: Colors.white, body: Stack( children: [ Positioned( top: -20, left: -20, child: const Text( 'BREAK', style: TextStyle( fontFamily: 'Times New Roman', fontSize: 150, height: 0.8, // Negative line-spacing color: Colors.black, ), ), ), Positioned( top: 100, left: 40, child: Text( 'THE', style: TextStyle( fontFamily: 'Arial', fontSize: 140, fontWeight: FontWeight.w900, foreground: Paint() ..style = PaintingStyle.stroke ..strokeWidth = 3 ..color = Colors.red, ), ), ), Positioned( top: 220, left: 10, child: Transform.rotate( angle: -0.1, child: Container( color: Colors.blue, child: const Text( 'GRID.', style: TextStyle( fontFamily: 'Courier', fontSize: 120, color: Colors.white, ), ), ), ), ), ], ), ); } }
SafeArea.Stack and Positioned is the easiest way to break the grid and force overlaps.height: 0.8 (or less than 1.0) in TextStyle to smash lines of text together.jsxconst BrutalistTypeScreen = () => { return ( <View style={{ flex: 1, backgroundColor: '#FFF' }}> {/* Note: React Native text clipping can be tricky on Android. Ensure parent views don't have overflow: 'hidden'. */} <Text style={{ fontFamily: 'Times New Roman', fontSize: 130, lineHeight: 110, color: '#000', marginLeft: -15, // Bleed off edge marginTop: 40 }}> BREAK </Text> <Text style={{ fontFamily: 'Arial', fontSize: 140, fontWeight: '900', color: 'transparent', textShadowColor: '#FF0000', textShadowRadius: 1, // Fake stroke effect marginLeft: 40, marginTop: -30 // Overlap previous text }}> THE </Text> <Text style={{ fontFamily: 'monospace', fontSize: 100, backgroundColor: '#0000FF', color: '#FFF', transform: [{ rotate: '-5deg' }], marginTop: -20, alignSelf: 'flex-start' }}> GRID. </Text> </View> ); };
@shopify/react-native-skia for true stroked text.marginTop and marginLeft to force the layout chaos.kotlin@Composable fun BrutalistTypeScreen() { // Use Box for absolute overlapping layouts Box( modifier = Modifier .fillMaxSize() .background(Color.White) ) { Text( text = "BREAK", fontFamily = FontFamily.Serif, // Times New Roman equivalent fontSize = 130.sp, color = Color.Black, lineHeight = 100.sp, modifier = Modifier.offset(x = (-15).dp, y = (-20).dp) ) Text( text = "THE", fontFamily = FontFamily.SansSerif, fontSize = 140.sp, fontWeight = FontWeight.Black, style = TextStyle( drawStyle = Stroke(width = 5f) ), color = Color.Red, modifier = Modifier.offset(x = 40.dp, y = 100.dp) ) Text( text = "GRID.", fontFamily = FontFamily.Monospace, fontSize = 100.sp, color = Color.White, modifier = Modifier .offset(x = 10.dp, y = 220.dp) .rotate(-5f) .background(Color.Blue) ) } }
Box with explicit Modifier.offset(x, y) allows freeform overlapping placement, breaking away from standard Column/Row grids.TextStyle supports drawStyle = Stroke(width = 5f), making outline typography incredibly simple.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-10 | pass→pass | 12,628 | 10,381 | -18% | 1 | 1 | 0% | 1,885 | 3,773 | +100% | 0 | 0 | — |
case-09 | pass→pass | 17,646 | 9,487 | -46% | 1 | 1 | 0% | 2,583 | 3,896 | +51% | 0 | 0 | — |
case-03 | fail→fail | 18,711 | 9,338 | -50% | 1 | 1 | 0% | 2,570 | 3,987 | +55% | 0 | 0 | — |
case-01 | fail→fail | 39,768 | 24,661 | -38% | 1 | 1 | 0% | 6,460 | 7,030 | +9% | 0 | 0 | — |
case-02 | pass→pass | 24,863 | 27,389 | +10% | 1 | 1 | 0% | 4,738 | 6,790 | +43% | 0 | 0 | — |
case-04 | pass→pass | 24,052 | 17,385 | -28% | 1 | 1 | 0% | 3,470 | 4,902 | +41% | 0 | 0 | — |
case-05 | pass→pass | 13,204 | 4,892 | -63% | 1 | 1 | 0% | 2,197 | 3,043 | +39% | 0 | 0 | — |
case-06 | fail→pass | 64,380 | 22,074 | -66% | 1 | 1 | 0% | 7,800 | 6,372 | -18% | 0 | 0 | — |
case-07 | fail→pass | 23,090 | 19,154 | -17% | 1 | 1 | 0% | 4,088 | 6,185 | +51% | 0 | 0 | — |
case-08 | pass→pass | 12,624 | 8,143 | -35% | 1 | 1 | 0% | 2,378 | 3,648 | +53% | 0 | 0 | — |
case-11 | fail→pass | 17,198 | 13,752 | -20% | 1 | 1 | 0% | 2,594 | 4,703 | +81% | 0 | 0 | — |
case-12 | fail→fail | 21,984 | 10,669 | -51% | 1 | 1 | 0% | 2,697 | 4,127 | +53% | 0 | 0 | — |
case-13 | pass→pass | 15,706 | 7,300 | -54% | 1 | 1 | 0% | 2,026 | 3,168 | +56% | 0 | 0 | — |
case-14 | pass→pass | 16,509 | 11,236 | -32% | 1 | 1 | 0% | 2,240 | 3,810 | +70% | 0 | 0 | — |
case-15 | pass→pass | 7,606 | 3,057 | -60% | 1 | 1 | 0% | 945 | 2,647 | +180% | 0 | 0 | — |
case-16 | pass→pass | 13,221 | 13,862 | +5% | 1 | 1 | 0% | 1,825 | 4,275 | +134% | 0 | 0 | — |
case-17 | pass→pass | 17,792 | 13,366 | -25% | 1 | 1 | 0% | 3,039 | 3,990 | +31% | 0 | 0 | — |
case-18 | pass→pass | 21,947 | 11,148 | -49% | 1 | 1 | 0% | 2,956 | 3,791 | +28% | 0 | 0 | — |
case-19 | fail→fail | 12,408 | 9,256 | -25% | 1 | 1 | 0% | 1,780 | 3,827 | +115% | 0 | 0 | — |
case-20 | fail→fail | 16,084 | 9,570 | -40% | 1 | 1 | 0% | 2,047 | 3,696 | +81% | 0 | 0 | — |
case-21 | pass→pass | 15,841 | 10,326 | -35% | 1 | 1 | 0% | 2,047 | 3,681 | +80% | 0 | 0 | — |
case-22 | fail→fail | 18,896 | 11,204 | -41% | 1 | 1 | 0% | 2,434 | 3,959 | +63% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +14 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.