website_designs

90s Grunge Design Reference

90s Grunge is the raw, anti-establishment visual aesthetic born from the Seattle alternative music scene of the early-to-mid 1990s. Rooted in the flannel-wearing, thrift-store culture of bands like Nirvana, Pearl Jam, Soundgarden, and Alice in Chains, it translates the movement’s rejection of mainstream polish into a design language defined by distressed textures, hand-scrawled typography, dark muted earth tones, photocopy artifacts, and deliberate imperfection. Influenced heavily by David Carson’s deconstructed layouts in Ray Gun magazine and the wider zine culture of the era, 90s Grunge treats design as emotional expression rather than clean communication. In web and UI design, this aesthetic manifests through noise/grain overlays, torn paper edges, collage-style layouts, irregular typography, and a pervasive sense that the interface was assembled by hand with scissors, glue, and a broken photocopier. Unlike its descendant Corporate Grunge – which adopted grunge textures within rigid corporate layouts – authentic 90s Grunge is genuinely chaotic, rejecting the grid entirely in favor of raw visual energy and analog authenticity.


Visual Characteristics

Core Design Traits

Design Principles


Color Palette

Swatch Name Hex Role / Usage
Soot Black #0D0D0D Deep backgrounds, maximum contrast elements
Charcoal #1E1E1E Primary background, section fills
Dark Olive #3B3F2B Accent background, nature-inspired depth
Flannel Green #556B2F Primary cool accent, earthy green tones
Faded Olive #6B7B4A Secondary cool accent, muted green highlights
Rust #A0522D Primary warm accent, links, emphasis
Burnt Mustard #B8860B Secondary warm accent, headings, callouts
Dried Blood #6B1010 Strong emphasis, danger states, intense accent
Concrete Gray #4A4846 Borders, dividers, muted UI structure
Smoke #7A7672 Body text on dark, captions, metadata
Worn Denim #4B5D6E Cool neutral accent, alternative interactive state
Aged Paper #D4C9A8 Primary text on dark, warm off-white
Dirty White #E5DFD3 High-emphasis text, hero titles on dark
Coffee Stain #8B6F4E Decorative accent, mid-tone warm neutral
Faded Purple #5C4A6B Rare accent, album-art inspired secondary

CSS Custom Properties

:root {
  /* Base tones */
  --grunge-soot: #0d0d0d;
  --grunge-charcoal: #1e1e1e;
  --grunge-concrete: #4a4846;
  --grunge-smoke: #7a7672;

  /* Earthy greens */
  --grunge-dark-olive: #3b3f2b;
  --grunge-flannel: #556b2f;
  --grunge-faded-olive: #6b7b4a;

  /* Warm accents */
  --grunge-rust: #a0522d;
  --grunge-mustard: #b8860b;
  --grunge-blood: #6b1010;
  --grunge-coffee: #8b6f4e;

  /* Cool accents */
  --grunge-denim: #4b5d6e;
  --grunge-faded-purple: #5c4a6b;

  /* Light tones */
  --grunge-paper: #d4c9a8;
  --grunge-white: #e5dfd3;

  /* Functional mappings */
  --grunge-bg-primary: var(--grunge-charcoal);
  --grunge-bg-secondary: var(--grunge-dark-olive);
  --grunge-bg-surface: var(--grunge-concrete);
  --grunge-text-primary: var(--grunge-white);
  --grunge-text-secondary: var(--grunge-paper);
  --grunge-text-muted: var(--grunge-smoke);
  --grunge-accent-warm: var(--grunge-rust);
  --grunge-accent-cool: var(--grunge-flannel);
  --grunge-accent-highlight: var(--grunge-mustard);
  --grunge-border: var(--grunge-concrete);
}

Typography

Font Style Usage
Permanent Marker Bold hand-drawn marker Hero headlines, section titles, scrawled emphasis
Rock Salt Rough handwritten scrawl Subheadings, annotations, handwritten asides
Special Elite Distressed typewriter Display text, analog-feeling body headings
Courier Prime Clean typewriter monospace Body text, long-form readable content
Cutive Mono Vintage typewriter monospace Secondary body text, metadata
Rubik Dirt Bold with ink-pressed texture Display headlines, poster-style titles
Londrina Solid Hand-drawn bold sans Friendly grunge headings, zine-style titles
VT323 Pixel / CRT screen Technical elements, counters, retro-digital accents
Share Tech Mono Technical monospace Labels, tags, timestamps, small metadata

Font Pairing Suggestions

Pairing Headings Body Mood
Zine Scrawl Permanent Marker Courier Prime Raw, aggressive, hand-lettered energy
Typewriter Grunge Special Elite Cutive Mono Analog, lo-fi, mechanical imperfection
Poster Wall Rubik Dirt Share Tech Mono Bold, inky, underground show flyer
Notebook Pages Rock Salt Courier Prime Intimate, personal, journal-like
Digital Decay Londrina Solid VT323 Hybrid analog-digital, alternative web

CSS Example

/* Import grunge-appropriate Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Permanent+Marker&family=Rock+Salt&family=Special+Elite&family=Courier+Prime:wght@400;700&family=Cutive+Mono&family=Rubik+Dirt&family=Londrina+Solid&family=VT323&family=Share+Tech+Mono&display=swap');

/* Hero / Display -- aggressive marker scrawl */
h1 {
  font-family: 'Permanent Marker', 'Rock Salt', cursive;
  font-size: clamp(2.5rem, 7vw, 5.5rem);
  letter-spacing: -0.02em;
  line-height: 0.95;
  color: var(--grunge-white);
  text-transform: uppercase;
  transform: rotate(-1.5deg);
  text-shadow:
    3px 3px 0 rgba(0, 0, 0, 0.6),
    -1px -1px 0 rgba(0, 0, 0, 0.3);
}

/* Section headings -- handwritten with attitude */
h2 {
  font-family: 'Rock Salt', 'Permanent Marker', cursive;
  font-size: clamp(1.4rem, 3.5vw, 2.2rem);
  color: var(--grunge-mustard);
  text-transform: uppercase;
  letter-spacing: 0.02em;
  transform: rotate(-0.8deg);
  margin-bottom: 1rem;
}

/* Sub-headings -- distressed typewriter */
h3 {
  font-family: 'Special Elite', 'Courier New', monospace;
  font-size: 1.2rem;
  color: var(--grunge-paper);
  letter-spacing: 0.05em;
  text-transform: uppercase;
}

/* Body text -- readable typewriter */
body {
  font-family: 'Courier Prime', 'Cutive Mono', 'Courier New', monospace;
  font-weight: 400;
  font-size: 1rem;
  line-height: 1.75;
  color: var(--grunge-text-secondary);
}

/* Metadata, labels, tags */
.grunge-label {
  font-family: 'Share Tech Mono', 'VT323', monospace;
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  color: var(--grunge-smoke);
}

/* Oversized display -- inky poster text */
.grunge-display {
  font-family: 'Rubik Dirt', 'Permanent Marker', cursive;
  font-size: clamp(3rem, 9vw, 8rem);
  color: var(--grunge-rust);
  text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.5);
  line-height: 0.85;
}

Layout Principles


CSS / Design Techniques

Card Component

/* Grunge card -- looks like a torn piece of paper pinned to a dark surface */
.grunge-card {
  background:
    /* Subtle paper texture grain */
    radial-gradient(circle at 30% 20%, rgba(180, 160, 120, 0.06) 0%, transparent 50%),
    var(--grunge-dark-olive);
  border: 1px solid rgba(160, 82, 45, 0.25);
  padding: 2rem;
  position: relative;
  overflow: hidden;
  transform: rotate(calc(var(--tilt, -0.8) * 1deg));
  box-shadow:
    4px 4px 0 rgba(0, 0, 0, 0.5),
    0 0 30px rgba(0, 0, 0, 0.3);
}

/* Tape strip holding the card */
.grunge-card::before {
  content: '';
  position: absolute;
  top: -6px;
  left: calc(40% + var(--tape-offset, 0px));
  width: 75px;
  height: 22px;
  background: rgba(212, 201, 168, 0.2);
  border: 1px solid rgba(212, 201, 168, 0.1);
  transform: rotate(calc(var(--tape-tilt, 2) * 1deg));
  z-index: 2;
}

/* Torn bottom edge */
.grunge-card::after {
  content: '';
  position: absolute;
  bottom: -1px;
  left: 0;
  right: 0;
  height: 12px;
  background: var(--grunge-dark-olive);
  clip-path: polygon(
    0% 0%, 4% 65%, 8% 20%, 12% 70%, 17% 30%, 22% 80%,
    27% 15%, 32% 60%, 37% 25%, 42% 75%, 48% 10%, 53% 55%,
    58% 35%, 63% 85%, 68% 20%, 73% 65%, 78% 40%, 83% 75%,
    88% 15%, 93% 60%, 98% 30%, 100% 50%, 100% 100%, 0% 100%
  );
}

/* Card title */
.grunge-card h3 {
  font-family: 'Permanent Marker', cursive;
  color: var(--grunge-mustard);
  margin-bottom: 0.75rem;
  transform: rotate(-0.5deg);
}

/* Card body text */
.grunge-card p {
  font-family: 'Courier Prime', monospace;
  color: var(--grunge-paper);
  line-height: 1.7;
  font-size: 0.95rem;
}

Button Component

/* Primary grunge button -- handmade, rough, confrontational */
.grunge-btn {
  display: inline-block;
  padding: 0.75rem 2rem;
  font-family: 'Permanent Marker', 'Special Elite', cursive;
  font-size: 1rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--grunge-white);
  background: var(--grunge-charcoal);
  border: 2px solid var(--grunge-rust);
  cursor: pointer;
  position: relative;
  transform: rotate(-1deg);
  transition: all 0.15s ease;
  box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.5);
}

.grunge-btn:hover {
  background: var(--grunge-rust);
  color: var(--grunge-soot);
  transform: rotate(0.5deg) translate(-1px, -1px);
  box-shadow: 5px 5px 0 rgba(0, 0, 0, 0.6);
}

.grunge-btn:active {
  transform: rotate(0deg) translate(2px, 2px);
  box-shadow: 1px 1px 0 rgba(0, 0, 0, 0.4);
}

/* Ghost/outline variant */
.grunge-btn--ghost {
  background: transparent;
  border: 2px solid var(--grunge-smoke);
  color: var(--grunge-paper);
}

.grunge-btn--ghost:hover {
  border-color: var(--grunge-mustard);
  color: var(--grunge-mustard);
  background: rgba(184, 134, 11, 0.08);
}

/* Sticker variant -- looks like a peeling sticker on a guitar case */
.grunge-btn--sticker {
  background: var(--grunge-mustard);
  color: var(--grunge-soot);
  border: 2px solid var(--grunge-soot);
  transform: rotate(2deg);
}

.grunge-btn--sticker:hover {
  transform: rotate(-1deg) scale(1.05);
  box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.5);
}
/* Grunge navigation -- scrawled, rough, anti-corporate */
.grunge-nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1rem 2rem;
  background: var(--grunge-soot);
  border-bottom: 3px solid var(--grunge-concrete);
  position: relative;
}

/* Noise texture on nav */
.grunge-nav::after {
  content: '';
  position: absolute;
  inset: 0;
  opacity: 0.05;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size: 256px 256px;
  pointer-events: none;
  mix-blend-mode: overlay;
}

.grunge-nav__brand {
  font-family: 'Permanent Marker', cursive;
  font-size: 1.4rem;
  color: var(--grunge-white);
  text-decoration: none;
  transform: rotate(-1deg);
  letter-spacing: 0.03em;
}

.grunge-nav__links {
  display: flex;
  gap: 1.5rem;
  list-style: none;
  margin: 0;
  padding: 0;
}

.grunge-nav__link {
  font-family: 'Special Elite', monospace;
  font-size: 0.9rem;
  color: var(--grunge-smoke);
  text-decoration: none;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  padding: 0.3rem 0;
  border-bottom: 2px solid transparent;
  transition: all 0.15s ease;
}

.grunge-nav__link:hover {
  color: var(--grunge-mustard);
  border-bottom-color: var(--grunge-mustard);
}

.grunge-nav__link--active {
  color: var(--grunge-rust);
  border-bottom-color: var(--grunge-rust);
}

Hero Section

/* Full-bleed grunge hero with layered textures */
.grunge-hero {
  position: relative;
  min-height: 80vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 4rem 2rem;
  background:
    /* Vignette */
    radial-gradient(ellipse at center, transparent 40%, rgba(13, 13, 13, 0.7) 100%),
    /* Warm light leak */
    radial-gradient(circle at 20% 80%, rgba(160, 82, 45, 0.08) 0%, transparent 50%),
    /* Cool shadow */
    radial-gradient(circle at 80% 20%, rgba(59, 63, 43, 0.1) 0%, transparent 40%),
    var(--grunge-soot);
  overflow: hidden;
}

/* Heavy noise grain overlay */
.grunge-hero::before {
  content: '';
  position: absolute;
  inset: 0;
  opacity: 0.1;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='grain'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23grain)'/%3E%3C/svg%3E");
  background-size: 512px 512px;
  pointer-events: none;
  mix-blend-mode: overlay;
  z-index: 1;
}

/* Diagonal scratch lines */
.grunge-hero::after {
  content: '';
  position: absolute;
  inset: 0;
  background:
    repeating-linear-gradient(
      -30deg,
      transparent,
      transparent 10px,
      rgba(255, 255, 255, 0.01) 10px,
      rgba(255, 255, 255, 0.01) 11px
    ),
    repeating-linear-gradient(
      40deg,
      transparent,
      transparent 14px,
      rgba(255, 255, 255, 0.008) 14px,
      rgba(255, 255, 255, 0.008) 15px
    );
  pointer-events: none;
  z-index: 1;
}

.grunge-hero__content {
  position: relative;
  z-index: 2;
  max-width: 800px;
}

.grunge-hero__title {
  font-family: 'Permanent Marker', cursive;
  font-size: clamp(3rem, 8vw, 6rem);
  line-height: 0.9;
  color: var(--grunge-white);
  text-transform: uppercase;
  transform: rotate(-2deg);
  margin-bottom: 1.5rem;
  text-shadow:
    4px 4px 0 rgba(0, 0, 0, 0.6),
    -2px -2px 0 rgba(0, 0, 0, 0.2);
}

.grunge-hero__subtitle {
  font-family: 'Special Elite', monospace;
  font-size: clamp(1rem, 2vw, 1.3rem);
  color: var(--grunge-smoke);
  letter-spacing: 0.15em;
  text-transform: uppercase;
  transform: rotate(0.5deg);
}

Torn Paper Edge Divider

/* Torn paper edge between sections */
.grunge-torn-edge {
  position: relative;
  padding-bottom: 2rem;
}

.grunge-torn-edge::after {
  content: '';
  position: absolute;
  bottom: -2px;
  left: 0;
  right: 0;
  height: 18px;
  background: var(--grunge-charcoal);
  clip-path: polygon(
    0% 0%, 2% 55%, 5% 15%, 8% 70%, 11% 25%, 14% 80%,
    18% 10%, 21% 60%, 24% 30%, 28% 85%, 31% 20%, 34% 65%,
    37% 5%, 40% 50%, 43% 75%, 46% 15%, 49% 60%, 52% 35%,
    55% 80%, 58% 10%, 61% 55%, 64% 25%, 67% 70%, 70% 40%,
    73% 90%, 76% 20%, 79% 60%, 82% 5%, 85% 45%, 88% 75%,
    91% 30%, 94% 65%, 97% 15%, 100% 50%,
    100% 100%, 0% 100%
  );
}

/* Inverse torn edge (dark to light) */
.grunge-torn-edge--inverse::after {
  background: var(--grunge-soot);
}

Xerox / Photocopy Texture Effect

/* Photocopy-degraded background treatment */
.grunge-xerox {
  position: relative;
  background: var(--grunge-charcoal);
}

/* Heavy photocopy grain */
.grunge-xerox::before {
  content: '';
  position: absolute;
  inset: 0;
  opacity: 0.07;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='xerox'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='6' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23xerox)'/%3E%3C/svg%3E");
  background-size: 512px 512px;
  pointer-events: none;
  mix-blend-mode: overlay;
}

/* Halftone dot overlay */
.grunge-xerox::after {
  content: '';
  position: absolute;
  inset: 0;
  background-image: radial-gradient(circle, rgba(0, 0, 0, 0.8) 0.8px, transparent 0.8px);
  background-size: 4px 4px;
  opacity: 0.04;
  mix-blend-mode: multiply;
  pointer-events: none;
}

/* Apply to images for photocopy look */
.grunge-xerox-img {
  filter: contrast(1.8) grayscale(1) brightness(1.15);
  mix-blend-mode: luminosity;
}

/* Extreme photocopy -- run through the copier 10 times */
.grunge-xerox-img--heavy {
  filter: contrast(2.8) grayscale(1) brightness(1.3);
  image-rendering: auto;
  opacity: 0.9;
}

Flannel / Plaid Pattern

/* CSS-only flannel plaid pattern for backgrounds and accents */
.grunge-flannel {
  background-color: #3b3f2b;
  background-image:
    /* Horizontal bands */
    repeating-linear-gradient(
      0deg,
      transparent,
      transparent 18px,
      rgba(160, 82, 45, 0.15) 18px,
      rgba(160, 82, 45, 0.15) 20px,
      transparent 20px,
      transparent 38px,
      rgba(160, 82, 45, 0.25) 38px,
      rgba(160, 82, 45, 0.25) 42px,
      transparent 42px,
      transparent 56px
    ),
    /* Vertical bands */
    repeating-linear-gradient(
      90deg,
      transparent,
      transparent 18px,
      rgba(85, 107, 47, 0.2) 18px,
      rgba(85, 107, 47, 0.2) 20px,
      transparent 20px,
      transparent 38px,
      rgba(85, 107, 47, 0.3) 38px,
      rgba(85, 107, 47, 0.3) 42px,
      transparent 42px,
      transparent 56px
    ),
    /* Thin accent lines */
    repeating-linear-gradient(
      0deg,
      transparent,
      transparent 27px,
      rgba(184, 134, 11, 0.1) 27px,
      rgba(184, 134, 11, 0.1) 29px,
      transparent 29px,
      transparent 56px
    ),
    repeating-linear-gradient(
      90deg,
      transparent,
      transparent 27px,
      rgba(184, 134, 11, 0.1) 27px,
      rgba(184, 134, 11, 0.1) 29px,
      transparent 29px,
      transparent 56px
    );
}

/* Flannel accent strip -- for borders, dividers, or decorative bands */
.grunge-flannel-strip {
  height: 8px;
  background: repeating-linear-gradient(
    90deg,
    var(--grunge-dark-olive) 0px,
    var(--grunge-dark-olive) 6px,
    var(--grunge-rust) 6px,
    var(--grunge-rust) 8px,
    var(--grunge-dark-olive) 8px,
    var(--grunge-dark-olive) 12px,
    var(--grunge-flannel) 12px,
    var(--grunge-flannel) 14px
  );
  opacity: 0.7;
}

Zine-Style Collage Layout

/* Zine-style collage container with scattered, overlapping elements */
.grunge-zine {
  position: relative;
  min-height: 500px;
  padding: 3rem 2rem;
  overflow: hidden;
}

/* Individual collage pieces */
.grunge-zine__piece {
  position: absolute;
  background: var(--grunge-paper);
  color: var(--grunge-soot);
  padding: 1.2rem;
  border: 1px solid rgba(0, 0, 0, 0.15);
  transform: rotate(calc(var(--r, 0) * 1deg));
  z-index: var(--z, 1);
  max-width: 280px;
  box-shadow:
    2px 2px 0 rgba(0, 0, 0, 0.2),
    0 0 15px rgba(0, 0, 0, 0.15);
  font-family: 'Courier Prime', monospace;
  font-size: 0.85rem;
  line-height: 1.6;
}

.grunge-zine__piece:nth-child(even) {
  background: var(--grunge-white);
}

/* Tape on collage pieces */
.grunge-zine__piece::before {
  content: '';
  position: absolute;
  top: -7px;
  right: 15%;
  width: 55px;
  height: 18px;
  background: rgba(212, 201, 168, 0.35);
  border: 1px solid rgba(212, 201, 168, 0.15);
  transform: rotate(calc(var(--tape-r, 4) * 1deg));
}

/* Headline piece -- bold, scrawled, attention-grabbing */
.grunge-zine__piece--headline {
  font-family: 'Permanent Marker', cursive;
  font-size: 1.5rem;
  text-transform: uppercase;
  background: var(--grunge-soot);
  color: var(--grunge-white);
  border: none;
  z-index: 10;
}

/* Photo piece -- xeroxed image placeholder */
.grunge-zine__piece--photo {
  padding: 0;
  filter: contrast(1.6) grayscale(1) brightness(1.1);
  border: 3px solid var(--grunge-soot);
}

Ink Splatter Divider

/* Ink splatter horizontal divider */
.grunge-splatter {
  border: none;
  height: 1px;
  background: var(--grunge-concrete);
  position: relative;
  margin: 3rem 0;
  opacity: 0.4;
}

/* Splatter dots along the divider */
.grunge-splatter::before {
  content: '';
  position: absolute;
  top: -5px;
  left: 15%;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--grunge-rust);
  box-shadow:
    25px 3px 0 3px var(--grunge-rust),
    55px -2px 0 1px var(--grunge-rust),
    90px 4px 0 2px var(--grunge-rust),
    140px -1px 0 4px var(--grunge-rust),
    200px 3px 0 1px var(--grunge-rust),
    260px -3px 0 2px var(--grunge-rust);
  opacity: 0.35;
}

/* Additional splatter layer */
.grunge-splatter::after {
  content: '';
  position: absolute;
  top: -3px;
  right: 20%;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--grunge-mustard);
  box-shadow:
    -30px 2px 0 1px var(--grunge-mustard),
    -70px -1px 0 2px var(--grunge-mustard),
    -120px 3px 0 1px var(--grunge-mustard);
  opacity: 0.25;
}

Design Do’s and Don’ts

Do’s

Don’ts


Aesthetic Relationship to 90s Grunge
Corporate Grunge Direct descendant; commercializes grunge textures within rigid corporate layouts, trading chaos for controlled edginess
DIY Punk Ideological parent; shares the anti-establishment DIY ethos, cut-and-paste collage, and Xerox culture, but punk is more aggressive and explicitly political
Industrial Gothic Shares dark palettes and gritty textures; Industrial adds heavier metallic and mechanical elements with a colder, more oppressive tone
Brutalist Web Design Modern spiritual successor; both reject polish in favor of rawness, though Brutalism is more minimal while Grunge is more textured
Dark Academia Overlaps in muted earth tones and moody atmosphere, but Dark Academia is scholarly and refined where Grunge is chaotic and anti-intellectual
Early Cyber Contemporaneous aesthetic from the same 1990s era; Early Cyber embraces emerging digital technology while Grunge rejects it in favor of analog
Cyberpunk Shares dark, dystopian undertones and anti-corporate sentiment, but Cyberpunk adds neon accents and sci-fi futurism
Weirdcore Shares the distorted, lo-fi visual quality and embrace of imperfection, but Weirdcore leans surreal and dreamlike rather than moody and raw
Liminal Space Both evoke feelings of unease and atmospheric tension through muted tones and emptiness, but through different visual strategies
Terminal CLI Aesthetic Shares the monospace typography preference and anti-polish stance, but Terminal is clean and precise where Grunge is messy and organic

Quick-Start HTML Template

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>90s Grunge</title>
  <link href="https://fonts.googleapis.com/css2?family=Permanent+Marker&family=Rock+Salt&family=Special+Elite&family=Courier+Prime:wght@400;700&family=VT323&family=Share+Tech+Mono&display=swap" rel="stylesheet">
  <style>
    :root {
      --grunge-soot: #0d0d0d;
      --grunge-charcoal: #1e1e1e;
      --grunge-dark-olive: #3b3f2b;
      --grunge-flannel: #556b2f;
      --grunge-faded-olive: #6b7b4a;
      --grunge-rust: #a0522d;
      --grunge-mustard: #b8860b;
      --grunge-blood: #6b1010;
      --grunge-concrete: #4a4846;
      --grunge-smoke: #7a7672;
      --grunge-denim: #4b5d6e;
      --grunge-paper: #d4c9a8;
      --grunge-white: #e5dfd3;
      --grunge-coffee: #8b6f4e;
      --grunge-faded-purple: #5c4a6b;
    }

    * { margin: 0; padding: 0; box-sizing: border-box; }

    body {
      background: var(--grunge-charcoal);
      color: var(--grunge-paper);
      font-family: 'Courier Prime', 'Courier New', monospace;
      font-size: 1rem;
      line-height: 1.75;
      position: relative;
      overflow-x: hidden;
    }

    /* ---- Global noise grain overlay ---- */
    body::before {
      content: '';
      position: fixed;
      inset: 0;
      opacity: 0.07;
      background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)'/%3E%3C/svg%3E");
      background-size: 512px 512px;
      pointer-events: none;
      mix-blend-mode: overlay;
      z-index: 9999;
    }

    /* ---- Navigation ---- */
    nav {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 1rem 2rem;
      background: var(--grunge-soot);
      border-bottom: 3px solid var(--grunge-concrete);
      position: relative;
      z-index: 100;
    }

    nav .brand {
      font-family: 'Permanent Marker', cursive;
      font-size: 1.3rem;
      color: var(--grunge-white);
      text-decoration: none;
      transform: rotate(-1deg);
      display: inline-block;
    }

    nav ul {
      display: flex;
      gap: 1.5rem;
      list-style: none;
    }

    nav a {
      font-family: 'Special Elite', monospace;
      font-size: 0.85rem;
      color: var(--grunge-smoke);
      text-decoration: none;
      text-transform: uppercase;
      letter-spacing: 0.1em;
      border-bottom: 2px solid transparent;
      padding-bottom: 0.2rem;
      transition: all 0.15s ease;
    }

    nav a:hover, nav a.active {
      color: var(--grunge-mustard);
      border-bottom-color: var(--grunge-mustard);
    }

    /* ---- Hero Section ---- */
    .hero {
      position: relative;
      min-height: 75vh;
      display: flex;
      flex-direction: column;
      justify-content: center;
      padding: 5rem 2rem;
      background:
        radial-gradient(ellipse at center, transparent 40%, rgba(13, 13, 13, 0.7) 100%),
        radial-gradient(circle at 15% 75%, rgba(160, 82, 45, 0.07) 0%, transparent 50%),
        radial-gradient(circle at 85% 25%, rgba(59, 63, 43, 0.09) 0%, transparent 40%),
        var(--grunge-soot);
      overflow: hidden;
    }

    /* Scratch overlay */
    .hero::after {
      content: '';
      position: absolute;
      inset: 0;
      background:
        repeating-linear-gradient(-30deg, transparent, transparent 11px, rgba(255,255,255,0.01) 11px, rgba(255,255,255,0.01) 12px),
        repeating-linear-gradient(35deg, transparent, transparent 15px, rgba(255,255,255,0.008) 15px, rgba(255,255,255,0.008) 16px);
      pointer-events: none;
    }

    .hero-content {
      max-width: 800px;
      position: relative;
      z-index: 2;
    }

    .hero h1 {
      font-family: 'Permanent Marker', cursive;
      font-size: clamp(3rem, 8vw, 6rem);
      line-height: 0.9;
      color: var(--grunge-white);
      text-transform: uppercase;
      transform: rotate(-2deg);
      margin-bottom: 1.5rem;
      text-shadow:
        4px 4px 0 rgba(0, 0, 0, 0.6),
        -2px -2px 0 rgba(0, 0, 0, 0.2);
    }

    .hero h1 em {
      color: var(--grunge-rust);
      font-style: normal;
    }

    .hero .tagline {
      font-family: 'Special Elite', monospace;
      font-size: clamp(0.9rem, 1.8vw, 1.2rem);
      color: var(--grunge-smoke);
      letter-spacing: 0.15em;
      text-transform: uppercase;
      transform: rotate(0.5deg);
      display: inline-block;
      margin-bottom: 2rem;
    }

    /* ---- Torn Edge Divider ---- */
    .torn-edge {
      height: 18px;
      background: var(--grunge-charcoal);
      clip-path: polygon(
        0% 0%, 2% 55%, 5% 15%, 8% 70%, 11% 25%, 14% 80%,
        18% 10%, 21% 60%, 24% 30%, 28% 85%, 31% 20%, 34% 65%,
        37% 5%, 40% 50%, 43% 75%, 46% 15%, 49% 60%, 52% 35%,
        55% 80%, 58% 10%, 61% 55%, 64% 25%, 67% 70%, 70% 40%,
        73% 90%, 76% 20%, 79% 60%, 82% 5%, 85% 45%, 88% 75%,
        91% 30%, 94% 65%, 97% 15%, 100% 50%,
        100% 100%, 0% 100%
      );
    }

    /* ---- Section Styles ---- */
    section {
      max-width: 800px;
      margin: 0 auto;
      padding: 4rem 2rem;
    }

    section h2 {
      font-family: 'Rock Salt', 'Permanent Marker', cursive;
      font-size: clamp(1.3rem, 3vw, 2rem);
      color: var(--grunge-mustard);
      text-transform: uppercase;
      transform: rotate(-0.8deg);
      margin-bottom: 1.5rem;
      letter-spacing: 0.02em;
    }

    section h3 {
      font-family: 'Special Elite', monospace;
      font-size: 1.1rem;
      color: var(--grunge-paper);
      text-transform: uppercase;
      letter-spacing: 0.08em;
      margin: 2rem 0 0.75rem;
    }

    /* ---- Grunge Cards ---- */
    .card-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
      gap: 2rem;
      margin: 2rem 0;
    }

    .card {
      background:
        radial-gradient(circle at 25% 25%, rgba(160, 82, 45, 0.04) 0%, transparent 50%),
        var(--grunge-dark-olive);
      border: 1px solid rgba(160, 82, 45, 0.2);
      padding: 1.8rem;
      position: relative;
      transform: rotate(calc(var(--tilt, -0.5) * 1deg));
      box-shadow:
        4px 4px 0 rgba(0, 0, 0, 0.5),
        0 0 25px rgba(0, 0, 0, 0.25);
      overflow: hidden;
    }

    /* Tape strip */
    .card::before {
      content: '';
      position: absolute;
      top: -6px;
      left: calc(35% + var(--tape-x, 0px));
      width: 70px;
      height: 20px;
      background: rgba(212, 201, 168, 0.18);
      border: 1px solid rgba(212, 201, 168, 0.08);
      transform: rotate(calc(var(--tape-tilt, 2) * 1deg));
      z-index: 2;
    }

    .card h4 {
      font-family: 'Permanent Marker', cursive;
      color: var(--grunge-mustard);
      font-size: 1.15rem;
      margin-bottom: 0.6rem;
      transform: rotate(-0.5deg);
    }

    .card p {
      font-size: 0.9rem;
      line-height: 1.7;
      color: var(--grunge-paper);
    }

    .card .label {
      font-family: 'Share Tech Mono', monospace;
      font-size: 0.7rem;
      text-transform: uppercase;
      letter-spacing: 0.2em;
      color: var(--grunge-smoke);
      margin-bottom: 0.5rem;
      display: block;
    }

    /* ---- Flannel Accent Band ---- */
    .flannel-band {
      height: 8px;
      background: repeating-linear-gradient(
        90deg,
        var(--grunge-dark-olive) 0px,
        var(--grunge-dark-olive) 6px,
        var(--grunge-rust) 6px,
        var(--grunge-rust) 8px,
        var(--grunge-dark-olive) 8px,
        var(--grunge-dark-olive) 12px,
        var(--grunge-flannel) 12px,
        var(--grunge-flannel) 14px
      );
      opacity: 0.6;
    }

    /* ---- Buttons ---- */
    .btn {
      display: inline-block;
      padding: 0.75rem 2rem;
      font-family: 'Permanent Marker', cursive;
      font-size: 1rem;
      letter-spacing: 0.05em;
      text-transform: uppercase;
      text-decoration: none;
      color: var(--grunge-white);
      background: var(--grunge-charcoal);
      border: 2px solid var(--grunge-rust);
      cursor: pointer;
      transform: rotate(-1deg);
      transition: all 0.15s ease;
      box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.5);
    }

    .btn:hover {
      background: var(--grunge-rust);
      color: var(--grunge-soot);
      transform: rotate(0.5deg) translate(-1px, -1px);
      box-shadow: 5px 5px 0 rgba(0, 0, 0, 0.6);
    }

    .btn:active {
      transform: translate(2px, 2px);
      box-shadow: 1px 1px 0 rgba(0, 0, 0, 0.4);
    }

    .btn--ghost {
      background: transparent;
      border-color: var(--grunge-smoke);
      color: var(--grunge-paper);
    }

    .btn--ghost:hover {
      border-color: var(--grunge-mustard);
      color: var(--grunge-mustard);
      background: rgba(184, 134, 11, 0.08);
    }

    .btn--sticker {
      background: var(--grunge-mustard);
      color: var(--grunge-soot);
      border-color: var(--grunge-soot);
      transform: rotate(2deg);
    }

    .btn--sticker:hover {
      transform: rotate(-1deg) scale(1.05);
    }

    .btn-group {
      display: flex;
      gap: 1rem;
      flex-wrap: wrap;
      margin: 2rem 0;
    }

    /* ---- Splatter Divider ---- */
    .splatter-divider {
      border: none;
      height: 1px;
      background: var(--grunge-concrete);
      position: relative;
      margin: 3rem 0;
      opacity: 0.35;
    }

    .splatter-divider::before {
      content: '';
      position: absolute;
      top: -5px;
      left: 18%;
      width: 8px;
      height: 8px;
      border-radius: 50%;
      background: var(--grunge-rust);
      box-shadow:
        30px 3px 0 2px var(--grunge-rust),
        65px -2px 0 1px var(--grunge-rust),
        110px 4px 0 3px var(--grunge-rust),
        170px -1px 0 1px var(--grunge-rust),
        240px 2px 0 2px var(--grunge-rust);
      opacity: 0.3;
    }

    /* ---- Xerox Image Treatment ---- */
    .xerox-img {
      filter: contrast(1.8) grayscale(1) brightness(1.15);
      mix-blend-mode: luminosity;
      border: 3px solid var(--grunge-soot);
      display: block;
      width: 100%;
    }

    /* ---- Zine Collage Section ---- */
    .zine-collage {
      position: relative;
      min-height: 350px;
      margin: 2rem 0;
    }

    .zine-piece {
      position: absolute;
      background: var(--grunge-paper);
      color: var(--grunge-soot);
      padding: 1rem;
      border: 1px solid rgba(0, 0, 0, 0.12);
      transform: rotate(calc(var(--r, 0) * 1deg));
      z-index: var(--z, 1);
      max-width: 250px;
      box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.2);
      font-family: 'Courier Prime', monospace;
      font-size: 0.8rem;
      line-height: 1.6;
    }

    .zine-piece::before {
      content: '';
      position: absolute;
      top: -6px;
      right: 20%;
      width: 50px;
      height: 16px;
      background: rgba(212, 201, 168, 0.3);
      transform: rotate(calc(var(--tape-r, 3) * 1deg));
    }

    .zine-piece--dark {
      background: var(--grunge-soot);
      color: var(--grunge-white);
      font-family: 'Permanent Marker', cursive;
      font-size: 1.2rem;
      text-transform: uppercase;
    }

    /* ---- Scrawled Annotation ---- */
    .scrawl {
      font-family: 'Rock Salt', cursive;
      font-size: 0.75rem;
      color: var(--grunge-rust);
      transform: rotate(-3deg);
      display: inline-block;
    }

    /* ---- Quote / Callout ---- */
    blockquote {
      border-left: 4px solid var(--grunge-rust);
      padding: 1.5rem 1.5rem 1.5rem 2rem;
      margin: 2rem 0;
      background: rgba(59, 63, 43, 0.2);
      transform: rotate(-0.3deg);
      position: relative;
      font-style: italic;
      color: var(--grunge-white);
    }

    blockquote::before {
      content: '\201C';
      position: absolute;
      top: -0.3rem;
      left: 0.5rem;
      font-family: 'Permanent Marker', cursive;
      font-size: 3rem;
      color: var(--grunge-rust);
      opacity: 0.3;
      line-height: 1;
    }

    /* ---- Footer ---- */
    footer {
      text-align: center;
      padding: 3rem 2rem;
      background: var(--grunge-soot);
      border-top: 3px solid var(--grunge-concrete);
      font-family: 'Share Tech Mono', monospace;
      font-size: 0.75rem;
      letter-spacing: 0.15em;
      text-transform: uppercase;
      color: var(--grunge-smoke);
    }

    footer a {
      color: var(--grunge-rust);
      text-decoration: none;
      border-bottom: 1px solid rgba(160, 82, 45, 0.3);
    }

    footer a:hover {
      color: var(--grunge-mustard);
    }

    /* ---- Links ---- */
    a.text-link {
      color: var(--grunge-rust);
      text-decoration: none;
      border-bottom: 1px solid rgba(160, 82, 45, 0.4);
      transition: color 0.15s;
    }

    a.text-link:hover {
      color: var(--grunge-mustard);
      border-bottom-color: var(--grunge-mustard);
    }

    /* ---- Responsive ---- */
    @media (max-width: 640px) {
      nav {
        flex-direction: column;
        gap: 1rem;
        text-align: center;
      }

      nav ul { gap: 1rem; flex-wrap: wrap; justify-content: center; }

      .hero { min-height: 60vh; padding: 3rem 1.5rem; }

      .card-grid { grid-template-columns: 1fr; }

      .zine-collage { min-height: auto; position: static; }

      .zine-piece {
        position: static;
        transform: rotate(calc(var(--r, 0) * 0.5deg));
        max-width: 100%;
        margin-bottom: 1rem;
      }
    }
  </style>
</head>
<body>

  <!-- Navigation -->
  <nav>
    <a href="#" class="brand">grunge.zine</a>
    <ul>
      <li><a href="#" class="active">Home</a></li>
      <li><a href="#">About</a></li>
      <li><a href="#">Music</a></li>
      <li><a href="#">Zines</a></li>
      <li><a href="#">Contact</a></li>
    </ul>
  </nav>

  <!-- Hero -->
  <section class="hero">
    <div class="hero-content">
      <h1>Smells Like<br><em>Raw Design</em></h1>
      <p class="tagline">Seattle // 1991 // Anti-establishment aesthetics</p>
      <div class="btn-group">
        <a href="#" class="btn">Explore</a>
        <a href="#" class="btn btn--ghost">Read Zine</a>
      </div>
    </div>
  </section>

  <div class="torn-edge"></div>

  <!-- About Section -->
  <section>
    <h2>the aesthetic</h2>
    <p>Born from the rain-soaked basements and thrift stores of the Pacific Northwest, 90s Grunge rejected the polished excess of the 1980s in favor of raw, unfiltered expression. It was never about looking good. It was about looking <em>real</em>.</p>

    <hr class="splatter-divider">

    <blockquote>
      Here we are now, in a world of distressed textures, torn edges, and the beautiful imperfection of things made by hand. The grunge aesthetic endures because authenticity never goes out of style.
    </blockquote>
  </section>

  <div class="flannel-band"></div>

  <!-- Cards Section -->
  <section>
    <h2>core elements</h2>
    <div class="card-grid">
      <div class="card" style="--tilt: -1; --tape-tilt: 3; --tape-x: -10px">
        <span class="label">01 // textures</span>
        <h4>Distressed Surfaces</h4>
        <p>Every surface tells a story of wear -- torn paper, crumpled fabric, scratched film. Nothing is pristine. Everything has been touched, used, and lived in.</p>
      </div>
      <div class="card" style="--tilt: 0.8; --tape-tilt: -2; --tape-x: 20px">
        <span class="label">02 // typography</span>
        <h4>Scrawled & Typed</h4>
        <p>Handwritten marker text collides with typewriter output. Letters bounce on uneven baselines. Legibility is secondary to raw emotional expression.</p>
      </div>
      <div class="card" style="--tilt: -0.5; --tape-tilt: 1; --tape-x: 5px">
        <span class="label">03 // palette</span>
        <h4>Dark Earth Tones</h4>
        <p>Olive, rust, charcoal, mustard, and faded denim. The colors of flannel shirts, coffee-stained notebooks, and Pacific Northwest forests in November.</p>
      </div>
    </div>
  </section>

  <div class="torn-edge"></div>

  <!-- Zine Collage Section -->
  <section>
    <h2>zine culture</h2>
    <p>Cut, paste, photocopy, distribute. The zine was the original social media -- self-published, unfiltered, and distributed hand-to-hand outside shows and in record stores.</p>

    <div class="zine-collage">
      <div class="zine-piece" style="--r: -3; --z: 2; --tape-r: 5; top: 10px; left: 5%;">
        Photocopied at 3am on a stolen Kinko's card. Stapled with whatever was in the junk drawer. Distributed for free or traded for other zines.
      </div>
      <div class="zine-piece zine-piece--dark" style="--r: 2; --z: 3; top: 30px; right: 5%;">
        DIY or die
      </div>
      <div class="zine-piece" style="--r: -1.5; --z: 1; --tape-r: -3; top: 180px; left: 15%;">
        The imperfections ARE the design. Every smudge, every misaligned letter, every toner streak is a mark of authenticity.
      </div>
    </div>
  </section>

  <div class="flannel-band"></div>

  <!-- Buttons Section -->
  <section>
    <h2>interactions</h2>
    <h3>Button Variants</h3>
    <div class="btn-group">
      <a href="#" class="btn">Primary</a>
      <a href="#" class="btn btn--ghost">Ghost</a>
      <a href="#" class="btn btn--sticker">Sticker</a>
    </div>
    <br>
    <p>Even interactive elements carry the weight of analog imperfection. Buttons tilt, hover states shift like papers sliding on a table, and nothing snaps to a perfect grid. <span class="scrawl">^ these actually work!</span></p>
  </section>

  <div class="torn-edge"></div>

  <!-- Footer -->
  <footer>
    <p>assembled by hand &mdash; photocopied at midnight &mdash; <a href="#">grunge.zine</a> &mdash; circa 1994</p>
  </footer>

</body>
</html>