Generate brutalist UI code with raw, unstyled components
Design-style skill for Brutalism: raw, unstyled browser defaults, exposed structural borders, and an intentional anti-aesthetic.
Why it matters
Apply brutalist design principles to UI implementations across web and mobile platforms, creating intentionally raw, high-contrast interfaces that reject polish and embrace exposed structure with default browser styling and harsh borders.
Outcomes
What it gets done
Generate CSS with monospace fonts, stark borders, and system-default colors
Build SwiftUI views using Courier New fonts and black borders without native styles
Create Flutter widgets with raw containers and underlined text instead of Material components
Output React Native and Jetpack Compose code with pure hex colors and instant-click interactions
Install
Add it to your toolbox
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/ag-brutalism | bash Overview
Brutalism
A design-style skill for Brutalism - raw, unstyled browser defaults, exposed structural borders, and an intentional anti-aesthetic - with matching Web CSS and SwiftUI implementations. Use it for portfolio sites, art projects, or anti-corporate branding that deliberately wants to reject smooth, polished default aesthetics.
What it does
Brutalism is a design-style child skill ('raw materials exposed - an intentional rejection of polish, gradients, and soft shadows'), part of the design-it family and not meant to be triggered directly. Three core principles: Unstyled Components (default browser styling for buttons, inputs, and links is celebrated, not overridden), Exposed Structure (grid lines, tables with visible borders, and stark boundaries separate content instead of whitespace), and Anti-Aesthetic (intentional awkwardness - elements might slightly overlap in a way that feels broken, or use system default fonts on purpose).
When to use - and when NOT to
Use it when the user's request matches this raw, deliberately unpolished aesthetic - portfolio sites, art projects, or anti-corporate branding that wants to reject the smooth, gradient-heavy "AI slop" default. As a design sub-style, it's selected by the parent design-it skill's routing rather than invoked on its own.
Inputs and outputs
Visual DNA is high-contrast and often clashing: pure #0000FF blue for links, #FF0000 red accents, on stark white or #C0C0C0 grey backgrounds - the Industrial Chic palette fits best. Typography is Courier New, Times New Roman, Comic Sans, or default sans-serifs, deliberately avoiding web fonts. Visuals lean into dithered images, pixelated graphics, or heavily compressed JPEGs. The web implementation uses standard HTML tags without overriding their default appearance wherever possible - a monospace body font, border: 1px solid #000 containers, border-bottom: 2px dashed #000 section dividers instead of margin/whitespace, and buttons deliberately styled to look like old Windows 95-era controls (border: 2px outset #ffffff with darker right/bottom borders, switching to inset on :active), plus plain system-blue underlined links (a { color: #0000FF; text-decoration: underline; }).
.brutalist-btn {
background-color: #c0c0c0;
border: 2px outset #ffffff;
border-right-color: #000000;
border-bottom-color: #000000;
font-size: 24px;
}
.brutalist-btn:active { border-style: inset; }
Integrations
SwiftUI reproduces the raw structural look with a monospace Courier New custom font throughout, plain black borders on containers (.border(Color.black, width: 2)), a simple Divider() instead of whitespace-based section separation, and an underlined blue "CLICK_HERE" text button styled like an unstyled web link rather than a native rounded button.
Who it's for
Designers and developers building a portfolio, art project, or anti-corporate brand statement that deliberately rejects smooth, polished defaults in favor of raw, exposed, intentionally awkward structure - the opposite instinct of most modern UI design work, used precisely because it stands out from it - the discipline is knowing which defaults to leave alone rather than which ones to override.
Source README
Brutalism
"Raw materials exposed. An intentional rejection of polish, gradients, and soft shadows."
When to Use
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.
Core Principles
- Unstyled Components: Default browser styling for buttons, inputs, and links is celebrated.
- Exposed Structure: Grid lines, tables with visible borders, and stark boundaries are used instead of whitespace to separate content.
- Anti-Aesthetic: Intentional awkwardness. Elements might slightly overlap in a way that feels broken, or use system default fonts.
Visual DNA
- Colors: High contrast, often clashing. Pure
#0000FFblue for links,#FF0000red for accents, on stark white or#C0C0C0grey backgrounds. Industrial Chic palette fits best. - Typography: Courier New, Times New Roman, Comic Sans, or default sans-serifs. No web fonts.
- Visuals: Dithered images, pixelated graphics, or heavily compressed jpegs.
Web Implementation
- Use standard HTML tags without overriding their default appearance whenever possible.
- CSS Example:
body {
background-color: #ffffff;
color: #000000;
font-family: monospace;
}
/* Expose the structure */
.brutalist-container {
border: 1px solid #000;
padding: 10px;
}
.brutalist-section {
border-bottom: 2px dashed #000;
margin-bottom: 20px;
padding-bottom: 20px;
}
/* Default-looking button but massive */
.brutalist-btn {
background-color: #c0c0c0;
border: 2px outset #ffffff;
border-right-color: #000000;
border-bottom-color: #000000;
color: #000000;
font-family: sans-serif;
font-size: 24px;
padding: 10px 20px;
cursor: pointer;
}
.brutalist-btn:active {
border-style: inset;
}
/* System link blue */
a {
color: #0000FF;
text-decoration: underline;
}
App Implementation
SwiftUI
struct BrutalistView: View {
var body: some View {
VStack(alignment: .leading, spacing: 0) {
Text("BRUTALISM")
.font(.custom("Courier New", size: 32))
.foregroundColor(.black)
.padding(10)
.border(Color.black, width: 2)
Divider().background(Color.black).padding(.vertical, 20)
Button(action: {}) {
Text("CLICK_HERE")
.font(.custom("Courier New", size: 24))
.foregroundColor(.blue)
.underline()
}
.padding(10)
// Raw structural container
VStack(alignment: .leading) {
Text("System Status: RAW").font(.custom("Courier New", size: 14))
}
.padding()
.border(Color.black, width: 1)
}
.padding()
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
.background(Color.white)
}
}
- Avoid all native
ButtonStylecomponents. UseTextwith.underline()mapped to system blue. - Use
.border(Color.black, width: 1)instead of backgrounds or shadows. - Force monospace fonts like Courier New or Menlo.
Flutter
class BrutalistScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
// DO NOT use MaterialApp theme or Scaffold if possible,
// or strip them down completely.
return Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
border: Border.all(color: Colors.black, width: 2),
),
child: const Text(
'BRUTALISM',
style: TextStyle(
fontFamily: 'Courier',
fontSize: 32,
color: Colors.black,
),
),
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 20),
child: Divider(color: Colors.black, thickness: 2),
),
GestureDetector(
onTap: () {},
child: const Text(
'CLICK_HERE',
style: TextStyle(
fontFamily: 'Courier',
fontSize: 24,
color: Colors.blue,
decoration: TextDecoration.underline,
),
),
),
],
),
),
),
);
}
}
- Avoid
ElevatedButton,Card, orAppBar. - Build UI out of raw
Containers withBorder.all(color: Colors.black)andTextwidgets. - Use
TextDecoration.underlineto indicate interactivity.
React Native
const BrutalistScreen = () => {
return (
<View style={{ flex: 1, backgroundColor: '#FFFFFF', padding: 16 }}>
<View style={{
borderWidth: 2,
borderColor: '#000000',
padding: 10,
alignSelf: 'flex-start'
}}>
<Text style={{ fontFamily: 'monospace', fontSize: 32, color: '#000' }}>
BRUTALISM
</Text>
</View>
<View style={{ height: 2, backgroundColor: '#000', marginVertical: 20 }} />
<TouchableOpacity activeOpacity={1}>
<Text style={{
fontFamily: 'monospace',
fontSize: 24,
color: '#0000FF',
textDecorationLine: 'underline'
}}>
CLICK_HERE
</Text>
</TouchableOpacity>
<View style={{
borderWidth: 1,
borderColor: '#000',
padding: 16,
marginTop: 40
}}>
<Text style={{ fontFamily: 'monospace', color: '#000' }}>
System Status: RAW
</Text>
</View>
</View>
);
};
- Strip away all native feel. Do not use
react-native-elementsorreact-native-paper. - Set
activeOpacity={1}onTouchableOpacityso there is no smooth fade - it should just click instantly. - Use pure hex colors:
#FFFFFF,#000000,#0000FF.
Jetpack Compose
@Composable
fun BrutalistScreen() {
Column(
modifier = Modifier
.fillMaxSize()
.background(Color.White)
.padding(16.dp)
) {
Box(
modifier = Modifier
.border(2.dp, Color.Black)
.padding(10.dp)
) {
BasicText(
text = "BRUTALISM",
style = TextStyle(
fontFamily = FontFamily.Monospace,
fontSize = 32.sp,
color = Color.Black
)
)
}
Spacer(Modifier.height(20.dp))
Box(modifier = Modifier.fillMaxWidth().height(2.dp).background(Color.Black))
Spacer(Modifier.height(20.dp))
BasicText(
text = "CLICK_HERE",
modifier = Modifier.clickable { },
style = TextStyle(
fontFamily = FontFamily.Monospace,
fontSize = 24.sp,
color = Color.Blue,
textDecoration = TextDecoration.Underline
)
)
}
}
- Use
BasicTextinstead ofTextto bypass Material theme defaults. - Build structural lines using
Boxwith.background(Color.Black). - Do not use
ButtonorCardor any Material composables. Raw layouts only.
Do's and Don'ts
- DO: Use harsh, high-contrast borders (1px solid black) around everything.
- DON'T: Use border-radius, drop shadows, or smooth transitions. If it animates, it should pop instantly (0s transition).
Limitations
- This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review.
- Ensure appropriate contrast ratios and responsive behaviors are verified separately.
FAQ
Common questions
Discussion
Questions & comments · 0
Sign In Sign in to leave a comment.