Skill

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.


76
Spark score
out of 100
Updated 27 days ago
Version 13.5.0

Add to Favorites

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

01

Generate CSS with monospace fonts, stark borders, and system-default colors

02

Build SwiftUI views using Courier New fonts and black borders without native styles

03

Create Flutter widgets with raw containers and underlined text instead of Material components

04

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

  1. Unstyled Components: Default browser styling for buttons, inputs, and links is celebrated.
  2. Exposed Structure: Grid lines, tables with visible borders, and stark boundaries are used instead of whitespace to separate content.
  3. 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 #0000FF blue for links, #FF0000 red for accents, on stark white or #C0C0C0 grey 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 ButtonStyle components. Use Text with .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, or AppBar.
  • Build UI out of raw Containers with Border.all(color: Colors.black) and Text widgets.
  • Use TextDecoration.underline to 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-elements or react-native-paper.
  • Set activeOpacity={1} on TouchableOpacity so 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 BasicText instead of Text to bypass Material theme defaults.
  • Build structural lines using Box with .background(Color.Black).
  • Do not use Button or Card or 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.