light · structured · sans · warm · dense

DESIGN.md inspired by Bandcamp

Bandcamp Cyan + Helvetica — indie-music marketplace honesty, no streaming-platform polish, no algorithmic carousels.

By webdesignhot · bandcamp.com
$ npx @webdesignhot/design-md add bandcamp
Learn more about the CLI
Compare to…
try on →
theme
1440 × 900
mobile · 390 × 844
Tokens webdesignhot/0.1
  • bg #fafaf6
  • bg-soft #f5f5f0
  • bg-deeper #eeeee8
  • bg-warm #fdfdf6
  • surface #ffffff
  • surface-soft #fafafa
  • surface-strong #f0f0eb
  • brand AA·LG · 3.0 #629aa0
  • brand-hover #4a8087
  • brand-pressed #3a6770
  • brand-deep #2a4f56
  • brand-tint #dfeded
  • brand-soft #b8d5d8
  • on-brand #ffffff
  • text AAA · 16.6 #1a1a1a
  • text-strong #000000
  • text-muted #5a5a5a
  • text-soft #8a8a8a
  • text-faint — · 1.8 #bcbcbc
  • text-on-brand #ffffff
  • link #629aa0
  • link-hover #3a6770
  • selected-bg #dfeded
  • border — · 1.3 #dcdcd6
  • border-strong — · 1.8 #bcbcb6
  • border-soft #ebebe5
  • border-brand #629aa0
  • buy-now-orange #cc7a3a
  • vinyl-warm #c97558
  • cassette-warm #bf8a3c
  • success #3d8b62
  • warning #cc7a3a
  • danger #a83a3a
  • info #629aa0
Typography
Ship faster than ever.
display-hero "Helvetica Neue" 48px w700 -0.012em
Ship faster than ever.
display-xl "Helvetica Neue" 40px w700 -0.01em
Ship faster than ever.
display-lg "Helvetica Neue" 32px w700 -0.005em
Ship faster than ever.
h1 "Helvetica Neue" 24px w700 0
Built for teams that ship.
h2 "Helvetica Neue" 20px w700 0
A complete kit
h3 "Helvetica Neue" 17px w700 0
The quick brown fox jumps over the lazy dog.
h4 "Helvetica Neue" 15px w700 0
The quick brown fox jumps over the lazy dog.
body-lg "Helvetica Neue" 15px w400 0
The quick brown fox jumps over the lazy dog.
body "Helvetica Neue" 13px w400 0
The quick brown fox jumps over the lazy dog.
button "Helvetica Neue" 13px w700 0.02em
The quick brown fox jumps over the lazy dog.
track-row "Helvetica Neue" 13px w400 0
The quick brown fox jumps over the lazy dog.
body-sm "Helvetica Neue" 12px w400 0
The quick brown fox jumps over the lazy dog.
duration ui-monospace 12px w400 0
The quick brown fox jumps over the lazy dog.
eyebrow "Helvetica Neue" 11px w700 0.10em
OUR DESIGN SYSTEM
label "Helvetica Neue" 11px w700 0.04em
OUR DESIGN SYSTEM
caption "Helvetica Neue" 11px w400 0
Spacing
  • step-0 0px
  • step-1 4px
  • step-2 8px
  • step-3 12px
  • step-4 16px
  • step-5 20px
  • step-6 24px
  • step-7 32px
  • step-8 40px
  • step-9 56px
  • step-10 80px
Radius
  • none 0px
  • micro 1px
  • sm 2px
  • pill 9999px
Components
Text link →
Card preview A complete kit — everything your product needs. Hero, pricing, FAQ, dashboard, docs — every layout your product needs.
New Stable v1.0
Design roles 7/8 mapped · webdesignhot/0.1

Maps the 8 canonical role names to this entry's actual tokens. Use these to plug the design into role-aware tools — shadcn/ui themes, role-aware Tailwind plugins, atelier-lint — without hard-coding token names.

  • background bg
  • foreground text
  • primary brand
  • primary-foreground on-brand
  • accent
  • muted text-muted
  • border border
  • ring border-brand
Lineage & influences

Bandcamp's marketing system descends from Ethan Diamond's 2008 founding as a direct-to-fan music distribution platform — built explicitly to skip Spotify-style streaming-economics. Bandcamp Cyan `#629aa0` (originally a default CSS color tweaked over the years) has barely shifted since 2008. Helvetica handles every heading — chosen specifically for its system-default honesty rather than custom-typography polish. Cards have 0px radius, hairline borders, dense album-info layouts. Voice is direct-utility: "Buy now", "Stream", "Pay what you want". The whole brand reads as music-marketplace built by music people, not data scientists — Spotify's anti-pattern, intentionally.

Export 4 formats · paste-ready
Tailwind

theme.extend block for tailwind.config.js

tailwind.config.js
CSS variables

:root { --bg, --text, --brand, … } you can paste anywhere

design.css
DTCG JSON

W3C Design Tokens Community Group format

design.tokens.json
Figma Variables

Importable into Figma → Variables → Import

figma-variables.json
The file
---
name: Bandcamp
tagline: Bandcamp Cyan + Helvetica — indie-music marketplace honesty, no streaming-platform polish, no algorithmic carousels.
updated_at: 2026-05-08T00:00:00.000Z
published_at: 2026-05-08T00:00:00.000Z
author: webdesignhot
source_url: https://bandcamp.com
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [media, marketplace]
tags: [light, structured, sans, warm, dense]
preview_swatch: ['#fafaf6', '#629aa0', '#1a1a1a']
related: [soundcloud, youtube, audiocom]
description: 'Bandcamp''s site is the rare music-marketplace that has not been redesigned by a Spotify alumnus. The canvas is warm off-white `#fafaf6`, headings sit in Helvetica (or Inter as fallback) at 28–48px, and the brand color is "Bandcamp Cyan" `#629aa0` — a muted teal that has barely shifted since the 2008 founding. Where Spotify chose dark + green and Apple Music chose dark + red, Bandcamp chose **light + cyan + Helvetica** — visually closer to a SoundCloud-of-2010 or an early-2000s indie label site than to modern streaming UI. Cards have 0px radius, hairline borders, and dense album-info layouts (artist name + track count + price + format). Voice is direct-utility: "Buy now", "Stream", "Pay what you want". The whole brand reads as "music marketplace built by music people, not data scientists".'


# Canonical 8-role aliases (per google-labs-code/design.md PR #76).
# Maps role names to this entry's actual token names so role-aware
# downstream tools resolve `theme.background` → entry's `bg`, etc.
# Auto-generated by scripts/add-aliases.mjs — do not edit manually;
# regenerate after changing color token names.
aliases:
  background: bg
  foreground: text
  primary: brand
  primary-foreground: on-brand
  muted: text-muted
  border: border
  ring: border-brand
colors:
  bg: '#fafaf6'
  bg-soft: '#f5f5f0'
  bg-deeper: '#eeeee8'
  bg-warm: '#fdfdf6'
  surface: '#ffffff'
  surface-soft: '#fafafa'
  surface-strong: '#f0f0eb'
  brand: '#629aa0'
  brand-hover: '#4a8087'
  brand-pressed: '#3a6770'
  brand-deep: '#2a4f56'
  brand-tint: '#dfeded'
  brand-soft: '#b8d5d8'
  on-brand: '#ffffff'
  text: '#1a1a1a'
  text-strong: '#000000'
  text-muted: '#5a5a5a'
  text-soft: '#8a8a8a'
  text-faint: '#bcbcbc'
  text-on-brand: '#ffffff'
  link: '#629aa0'
  link-hover: '#3a6770'
  selected-bg: '#dfeded'
  border: '#dcdcd6'
  border-strong: '#bcbcb6'
  border-soft: '#ebebe5'
  border-brand: '#629aa0'
  buy-now-orange: '#cc7a3a'
  vinyl-warm: '#c97558'
  cassette-warm: '#bf8a3c'
  success: '#3d8b62'
  warning: '#cc7a3a'
  danger: '#a83a3a'
  info: '#629aa0'

typography:
  display:
    family: '"Helvetica Neue", "Helvetica", "Arial", "Inter", -apple-system, BlinkMacSystemFont, sans-serif'
    weights: [400, 500, 700]
  body:
    family: '"Helvetica Neue", "Helvetica", "Arial", "Inter", -apple-system, sans-serif'
    weights: [400, 500, 700]
  mono:
    family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace'
    weights: [400, 500]
  scale:
    display-hero:    { size: 48, weight: 700, lineHeight: 1.1,  tracking: '-0.012em', family: display }
    display-xl:      { size: 40, weight: 700, lineHeight: 1.15, tracking: '-0.01em',  family: display }
    display-lg:      { size: 32, weight: 700, lineHeight: 1.2,  tracking: '-0.005em', family: display }
    h1:              { size: 24, weight: 700, lineHeight: 1.25, tracking: '0',        family: display }
    h2:              { size: 20, weight: 700, lineHeight: 1.3,  tracking: '0',        family: display }
    h3:              { size: 17, weight: 700, lineHeight: 1.35, tracking: '0',        family: display }
    h4:              { size: 15, weight: 700, lineHeight: 1.4,  tracking: '0',        family: display }
    eyebrow:         { size: 11, weight: 700, lineHeight: 1.2,  tracking: '0.10em',   family: body }
    body-lg:         { size: 15, weight: 400, lineHeight: 1.5,  tracking: '0',        family: body }
    body:            { size: 13, weight: 400, lineHeight: 1.5,  tracking: '0',        family: body }
    body-sm:         { size: 12, weight: 400, lineHeight: 1.45, tracking: '0',        family: body }
    label:           { size: 11, weight: 700, lineHeight: 1.3,  tracking: '0.04em',   family: body }
    button:          { size: 13, weight: 700, lineHeight: 1.0,  tracking: '0.02em',   family: body }
    caption:         { size: 11, weight: 400, lineHeight: 1.4,  tracking: '0',        family: body }
    track-row:       { size: 13, weight: 400, lineHeight: 1.4,  tracking: '0',        family: body }
    duration:        { size: 12, weight: 400, lineHeight: 1.3,  tracking: '0',        family: mono }

radius:
  none: 0
  micro: 1
  sm: 2
  pill: 9999

spacing:
  base: 4
  scale: [0, 4, 8, 12, 16, 20, 24, 32, 40, 56, 80]

layout:
  page-width: 1180
  prose-width: 720
  header-height: 56

motion:
  ease-standard: 'cubic-bezier(0.25, 0.1, 0.25, 1)'
  duration-fast: 100
  duration-standard: 180
  duration-slow: 280
  reduced-motion: 'respects prefers-reduced-motion: reduce'

breakpoints:
  mobile: 480
  tablet: 768
  desktop: 1180
  wide: 1280

shadows:
  card: '0 1px 0 0 rgba(0, 0, 0, 0.04)'
  card-hover: 'none'
  modal: '0 16px 40px rgba(0, 0, 0, 0.16)'

accessibility:
  contrast-text-on-bg: 16.0
  contrast-text-on-brand: 5.6
  focus-ring: '2px solid #629aa0 + 1px outset gap'
  reduced-motion-honored: true

components:
  button-primary: { bg: brand, text: on-brand, padding: '8px 16px', radius: 0, font: button }
  button-buy-now: { bg: buy-now-orange, text: on-brand, padding: '8px 16px', radius: 0, font: button }
  button-secondary: { bg: bg, text: brand, padding: '8px 16px', radius: 0, border: '1px solid border-brand' }
  button-ghost: { bg: transparent, text: brand, padding: '4px 8px' }
  card: { bg: surface, radius: 0, padding: 12, border: '1px solid border' }
  pill: { bg: surface-strong, text: text, radius: pill, padding: '2px 8px', font: 'caption' }
  input: { bg: bg, border: '1px solid border-strong', text: text, radius: 0, padding: '8px 10px', focus-border: brand }
  track-row: { bg: 'transparent', text: text, padding: '6px 0', border-bottom: '1px solid border-soft' }

lineage:
  summary: 'Bandcamp''s marketing system descends from Ethan Diamond''s 2008 founding as a direct-to-fan music distribution platform — built explicitly to skip Spotify-style streaming-economics. Bandcamp Cyan `#629aa0` (originally a default CSS color tweaked over the years) has barely shifted since 2008. Helvetica handles every heading — chosen specifically for its system-default honesty rather than custom-typography polish. Cards have 0px radius, hairline borders, dense album-info layouts. Voice is direct-utility: "Buy now", "Stream", "Pay what you want". The whole brand reads as music-marketplace built by music people, not data scientists — Spotify''s anti-pattern, intentionally.'
  influences:
    - { name: 'Ethan Diamond (founder, 2008)', role: 'direct-to-fan distribution origin shaping anti-streaming brand instinct', url: 'https://en.wikipedia.org/wiki/Bandcamp' }
    - { name: 'Helvetica Neue / Linotype 1957', role: 'system-default honesty in typography', url: 'https://www.linotype.com/523/helvetica-neue.html' }
    - { name: 'SoundCloud (early-2010s)', role: 'indie-music UI peer differentiated against', url: 'https://soundcloud.com' }
    - { name: 'Early-2000s indie label sites (Sub Pop, Matador)', role: 'utilitarian indie aesthetic lineage', url: 'https://www.subpop.com' }
    - { name: 'Bandcamp Friday', role: '0% platform fee community marketing initiative since 2020', url: 'https://bandcamp.com/bandcamp-fridays' }
---

## 1. Visual Theme & Atmosphere

Bandcamp's site is the rare music-marketplace that has not been redesigned by a Spotify alumnus. The canvas is warm off-white `#fafaf6`, display headings sit in **Helvetica** (or Helvetica Neue, falling back to Arial / Inter) at 24–48px, body in 13px Helvetica line-height 1.5. The brand color is **Bandcamp Cyan** `#629aa0` — a muted teal that has barely shifted since the 2008 founding.

Where Spotify chose dark + green and Apple Music chose dark + red, Bandcamp chose **light + cyan + Helvetica** — visually closer to a SoundCloud-of-2010 or an early-2000s indie label site than to modern streaming UI. Cards have **0px radius**, hairline borders, and dense album-info layouts (artist name + track count + price + format options + duration in mono).

Voice is direct-utility: "Buy now", "Stream", "Pay what you want". A "Buy Now" orange `#cc7a3a` is a secondary CTA color reserved for purchase flows. Vinyl + cassette tags get warm-amber accents. The whole brand reads as **music marketplace built by music people, not data scientists** — Spotify's anti-pattern, intentionally.

**Key Characteristics:**
- Warm off-white canvas `#fafaf6`
- Bandcamp Cyan `#629aa0` (muted teal)
- Helvetica Neue for everything (no custom typography)
- 0px radius on UI (utilitarian-rectangular)
- Body 13px (denser than typical SaaS — album-list optimized)
- Hairline borders, minimal shadows
- "Buy Now" orange `#cc7a3a` for purchase CTAs
- Vinyl/cassette warm accents on physical-format tags
- Mono font for track durations
- Light-only canvas
- Direct-utility voice (anti-Spotify)

## 2. Color Palette & Roles

### Primary
- **Background** (`#fafaf6`): warm off-white, slight cream tilt.
- **Bg Soft** (`#f5f5f0`): deeper alternate band.
- **Surface** (`#ffffff`): cards lift very subtly from cream.
- **Text** (`#1a1a1a`): body.

### Brand — Bandcamp Cyan
- **Brand** (`#629aa0`): primary CTA + brand mark + links.
- **Brand Hover** (`#4a8087`), **Pressed** (`#3a6770`), **Deep** (`#2a4f56`).
- **Brand Tint** (`#dfeded`): selection wash.

### Buy-Now Orange (purchase CTA)
- **Buy Now Orange** (`#cc7a3a`): "Buy now" buttons specifically — distinguishes purchase from streaming.

### Format Accents (physical tags)
- **Vinyl Warm** (`#c97558`): vinyl-format tag accent.
- **Cassette Warm** (`#bf8a3c`): cassette-format tag accent.

### Borders
- **Border** (`#dcdcd6`), **Border Strong** (`#bcbcb6`), **Border Soft** (`#ebebe5`).

### Semantic
- success `#3d8b62`, warning orange, danger `#a83a3a`, info brand.

## 3. Typography Rules

### Font Family
- **Display + Body**: Helvetica Neue. Falls back to Helvetica → Arial → Inter → system-ui.
- **Mono**: system mono only (used for track durations).

### Hierarchy

| Role | Font | Size | Weight | LH | Tracking |
|------|------|------|--------|-----|----------|
| display-hero | Helvetica | 48 | 700 | 1.1 | -0.012em |
| display-lg | Helvetica | 32 | 700 | 1.2 | -0.005em |
| h1 | Helvetica | 24 | 700 | 1.25 | 0 |
| h2 | Helvetica | 20 | 700 | 1.3 | 0 |
| h3 | Helvetica | 17 | 700 | 1.35 | 0 |
| eyebrow | Helvetica | 11 | 700 | 1.2 | 0.10em UPPER |
| body | Helvetica | 13 | 400 | 1.5 | 0 |
| label | Helvetica | 11 | 700 | 1.3 | 0.04em |
| button | Helvetica | 13 | 700 | 1.0 | 0.02em |
| duration | system mono | 12 | 400 | 1.3 | 0 |

### Principles
- **Helvetica everywhere** — no custom webfont.
- **Smaller body 13px** — album-listing density.
- **Tight smaller-than-typical heading scale** — H1 24px not 32px+.
- **Mixed case display, UPPER eyebrows + buttons.**
- **Mono for track durations only.**

## 4. Component Stylings

### Buttons (4 variants — 0px radius, smaller padding)

**Primary** — Cyan:
- bg `#629aa0`, text white, 13px Helvetica 700 0.02em
- Padding 8×16, **radius 0** (rectangular)
- Hover: bg `#4a8087`

**Buy Now** — Orange purchase CTA:
- bg `#cc7a3a`, text white, otherwise primary
- Used exclusively on "Buy now" buttons in purchase flow

**Secondary** — bordered:
- bg cream, text cyan, 1px cyan border, radius 0

**Ghost**: bg transparent, text cyan, padding 4×8.

### Cards
- bg white, **0px radius**, padding 12
- 1px gray border + minimal shadow `0 1px 0 0 rgba(0,0,0,0.04)`
- No hover transform — utility-first

### Track Row (album-page signature)
- Transparent bg, 6px vertical padding
- 1px bottom border for separation
- Track number left in mono, title middle in 13px Helvetica, duration right in mono 12px

### Pills (genre tags, format tags)
- Default: `surface-strong` bg, dark text, pill radius
- Vinyl: vinyl-warm bg
- Cassette: cassette-warm bg

### Inputs
- bg cream, 1px gray border, radius 0
- Focus: border cyan

### Navigation
- 56px sticky header (denser than typical), cream bg with hairline
- Bandcamp wordmark left (cyan), top-level nav center, "Sign in" right

## 5. Layout Principles

- Base 4px, 32-56px between sections (denser than editorial)
- Page max width 1180px (denser than 1280px standard)
- Hero often album cover + tracklist combo
- Album grid: 4-up at desktop, 2-up at tablet, 1-up at mobile
- Track listings dense, 6px vertical padding per row

## 6. Shapes & Radius Scale

| Tier | Value | Use |
|------|-------|-----|
| None | 0 | **default for buttons, cards, inputs** |
| Micro | 1 | indicators |
| Standard | 2 | rare; tooltip only |
| Pill | 9999 | format/genre tags |

## 7. Depth & Elevation

| Level | Treatment |
|-------|-----------|
| 0 | none | inline |
| 1 | `0 1px 0 0 rgba(0,0,0,0.04)` resting | barely-perceptible |
| 2 | hairline highlight on hover |
| 3 | none | featured cards just use border |
| 4 | `0 16px 40px rgba(0,0,0,0.16)` modal |

### Shadow Philosophy
The brand commits to **near-zero shadows** — 1px cards, no soft blurs. Density is the priority.

## 8. Interaction & Motion

- Standard ease, fast durations (100-280ms)
- No hover transforms — clicks fire instantly
- Audio play/pause: 100ms feedback
- Cart updates: instant

## 9. Accessibility & A11y

- text on bg = **16.0:1** AAA
- on-brand on brand: white on cyan = **5.6:1** AA
- 2px cyan focus ring + 1px outset

Track rows use semantic `<table>` with `<th scope="col">` for headers. Audio players have visible play/pause/scrub controls + keyboard support. Album covers have `aria-label` with full title + artist.

## 10. Responsive Behavior

mobile <479: hero 48→24; nav hamburger; 1-up album grid; track rows stack with smaller font. tablet 480-767: 2-up. desktop+: 4-up.

## 11. Content & Voice

### Tone
**Direct-utility, anti-Spotify.** Honest, slightly indie-snarky. Voice is the record-store clerk who knows what you want.

### Microcopy patterns
- Primary CTA: **"Buy now"** / **"Stream"** / **"Pay what you want"**
- Sign-up: **"Sign up"** (no proper-noun branding)
- Errors: **"Something didn't work — try again."**
- Empty: **"Your collection is empty — discover artists below."**
- Bandcamp Friday: **"Today's $0 platform fee"** (community-positive)

### CTA verb conventions
- **Buy / Stream / Download / Add to cart / Follow**
- Avoid: streaming-platform language ("Discover Weekly"), aspirational ("Curate your sound")

## 12. Dark Mode & Theming

**Light-only on web.** Cream canvas IS the brand — anti-dark-streaming-platform identity. Bandcamp users have requested dark mode; the brand has stayed light.

## 13. Lineage & Influences

Bandcamp descends from Ethan Diamond's 2008 founding as direct-to-fan music distribution — built to skip Spotify-style streaming-economics. Bandcamp Cyan has barely shifted since 2008. Helvetica chosen for system-default honesty rather than custom-typography polish.

**Named influences:**
- **Ethan Diamond (2008)** — direct-to-fan distribution origin
- **Helvetica Neue (1957)** — system-default honesty
- **SoundCloud (early-2010s)** — indie peer
- **Early-2000s indie labels (Sub Pop, Matador)** — utilitarian indie aesthetic
- **Bandcamp Friday** — community-marketing initiative

## 14. Do's and Don'ts

### Do
- **Cream canvas + Bandcamp Cyan + Helvetica.**
- **0px radius on UI** — utilitarian-rectangular.
- **Body 13px** — album-listing density.
- **Buy Now orange `#cc7a3a` for purchase CTAs only.**
- **Mono for track durations.**
- **Hairline borders, minimal shadows.**
- **Mixed case display, UPPER eyebrows + buttons.**

### Don't
- **Don't use custom webfonts.** Helvetica is the brand.
- **Don't round corners.** Indie utilitarian is rectangular.
- **Don't add streaming-platform polish** (algorithm carousels, "Discover" sections).
- **Don't use streaming-platform microcopy** ("Curate your sound").
- **Don't add dark mode** — the brand is anti-dark by design.
- **Don't add gradients.**
- **Don't substitute Bandcamp Cyan.**

## 15. Agent Prompt Guide

### Quick Color Reference
- bg (warm off-white): `#fafaf6`
- text: `#1a1a1a`
- brand (Bandcamp Cyan): `#629aa0` / hover `#4a8087`
- buy-now-orange: `#cc7a3a`
- vinyl-warm `#c97558`, cassette-warm `#bf8a3c`
- border: `#dcdcd6`

### Example Component Prompts

> Build a Bandcamp-style album page: cream canvas `#fafaf6`, album cover left 320×320, tracklist right with track-rows (number / title / duration in mono). 32px Helvetica album title, 17px artist link in cyan. Primary CTA "Buy Digital Album" 0px-radius cyan `#629aa0`, secondary "Stream" link.

> Design a release card: white surface (lifts barely from cream), 0px radius, 12px pad, 1px gray border. Album cover top, 17px Helvetica 700 album title, 13px artist + label below in dark gray. Genre pill in 11px UPPER 0.10em.

> Render a track row: transparent bg, 6px vertical pad, 1px bottom border. Track number left in mono 12px, title 13px Helvetica middle, duration right in mono 12px gray.

> Build a "Buy Now" CTA: 0px radius, orange `#cc7a3a` bg, white 13px Helvetica 700 0.02em "Buy Now", padding 8×16.

> Design a format tag pill: pill radius, vinyl-warm `#c97558` bg for vinyl / cassette-warm `#bf8a3c` for cassette / surface-strong for digital. White text 11px Helvetica 700 0.04em UPPER.

### Iteration Guide

1. **Cream canvas + Cyan + Helvetica.** No custom fonts.
2. **0px radius — utilitarian-rectangular.**
3. **Body 13px** — denser than SaaS.
4. **Buy-Now orange for purchase CTAs only.**
5. **Mono for track durations.**
6. **Hairline borders, minimal shadows.**
7. **Indie-direct voice — anti-Spotify-platform.**
8. **Reject custom webfonts, dark mode, streaming-platform language, rounded corners.**
Prose

1. Visual Theme & Atmosphere

Bandcamp’s site is the rare music-marketplace that has not been redesigned by a Spotify alumnus. The canvas is warm off-white #fafaf6, display headings sit in Helvetica (or Helvetica Neue, falling back to Arial / Inter) at 24–48px, body in 13px Helvetica line-height 1.5. The brand color is Bandcamp Cyan #629aa0 — a muted teal that has barely shifted since the 2008 founding.

Where Spotify chose dark + green and Apple Music chose dark + red, Bandcamp chose light + cyan + Helvetica — visually closer to a SoundCloud-of-2010 or an early-2000s indie label site than to modern streaming UI. Cards have 0px radius, hairline borders, and dense album-info layouts (artist name + track count + price + format options + duration in mono).

Voice is direct-utility: “Buy now”, “Stream”, “Pay what you want”. A “Buy Now” orange #cc7a3a is a secondary CTA color reserved for purchase flows. Vinyl + cassette tags get warm-amber accents. The whole brand reads as music marketplace built by music people, not data scientists — Spotify’s anti-pattern, intentionally.

Key Characteristics:

  • Warm off-white canvas #fafaf6
  • Bandcamp Cyan #629aa0 (muted teal)
  • Helvetica Neue for everything (no custom typography)
  • 0px radius on UI (utilitarian-rectangular)
  • Body 13px (denser than typical SaaS — album-list optimized)
  • Hairline borders, minimal shadows
  • “Buy Now” orange #cc7a3a for purchase CTAs
  • Vinyl/cassette warm accents on physical-format tags
  • Mono font for track durations
  • Light-only canvas
  • Direct-utility voice (anti-Spotify)

2. Color Palette & Roles

Primary

  • Background (#fafaf6): warm off-white, slight cream tilt.
  • Bg Soft (#f5f5f0): deeper alternate band.
  • Surface (#ffffff): cards lift very subtly from cream.
  • Text (#1a1a1a): body.

Brand — Bandcamp Cyan

  • Brand (#629aa0): primary CTA + brand mark + links.
  • Brand Hover (#4a8087), Pressed (#3a6770), Deep (#2a4f56).
  • Brand Tint (#dfeded): selection wash.

Buy-Now Orange (purchase CTA)

  • Buy Now Orange (#cc7a3a): “Buy now” buttons specifically — distinguishes purchase from streaming.

Format Accents (physical tags)

  • Vinyl Warm (#c97558): vinyl-format tag accent.
  • Cassette Warm (#bf8a3c): cassette-format tag accent.

Borders

  • Border (#dcdcd6), Border Strong (#bcbcb6), Border Soft (#ebebe5).

Semantic

  • success #3d8b62, warning orange, danger #a83a3a, info brand.

3. Typography Rules

Font Family

  • Display + Body: Helvetica Neue. Falls back to Helvetica → Arial → Inter → system-ui.
  • Mono: system mono only (used for track durations).

Hierarchy

RoleFontSizeWeightLHTracking
display-heroHelvetica487001.1-0.012em
display-lgHelvetica327001.2-0.005em
h1Helvetica247001.250
h2Helvetica207001.30
h3Helvetica177001.350
eyebrowHelvetica117001.20.10em UPPER
bodyHelvetica134001.50
labelHelvetica117001.30.04em
buttonHelvetica137001.00.02em
durationsystem mono124001.30

Principles

  • Helvetica everywhere — no custom webfont.
  • Smaller body 13px — album-listing density.
  • Tight smaller-than-typical heading scale — H1 24px not 32px+.
  • Mixed case display, UPPER eyebrows + buttons.
  • Mono for track durations only.

4. Component Stylings

Buttons (4 variants — 0px radius, smaller padding)

Primary — Cyan:

  • bg #629aa0, text white, 13px Helvetica 700 0.02em
  • Padding 8×16, radius 0 (rectangular)
  • Hover: bg #4a8087

Buy Now — Orange purchase CTA:

  • bg #cc7a3a, text white, otherwise primary
  • Used exclusively on “Buy now” buttons in purchase flow

Secondary — bordered:

  • bg cream, text cyan, 1px cyan border, radius 0

Ghost: bg transparent, text cyan, padding 4×8.

Cards

  • bg white, 0px radius, padding 12
  • 1px gray border + minimal shadow 0 1px 0 0 rgba(0,0,0,0.04)
  • No hover transform — utility-first

Track Row (album-page signature)

  • Transparent bg, 6px vertical padding
  • 1px bottom border for separation
  • Track number left in mono, title middle in 13px Helvetica, duration right in mono 12px

Pills (genre tags, format tags)

  • Default: surface-strong bg, dark text, pill radius
  • Vinyl: vinyl-warm bg
  • Cassette: cassette-warm bg

Inputs

  • bg cream, 1px gray border, radius 0
  • Focus: border cyan
  • 56px sticky header (denser than typical), cream bg with hairline
  • Bandcamp wordmark left (cyan), top-level nav center, “Sign in” right

5. Layout Principles

  • Base 4px, 32-56px between sections (denser than editorial)
  • Page max width 1180px (denser than 1280px standard)
  • Hero often album cover + tracklist combo
  • Album grid: 4-up at desktop, 2-up at tablet, 1-up at mobile
  • Track listings dense, 6px vertical padding per row

6. Shapes & Radius Scale

TierValueUse
None0default for buttons, cards, inputs
Micro1indicators
Standard2rare; tooltip only
Pill9999format/genre tags

7. Depth & Elevation

LevelTreatment
0none
10 1px 0 0 rgba(0,0,0,0.04) resting
2hairline highlight on hover
3none
40 16px 40px rgba(0,0,0,0.16) modal

Shadow Philosophy

The brand commits to near-zero shadows — 1px cards, no soft blurs. Density is the priority.

8. Interaction & Motion

  • Standard ease, fast durations (100-280ms)
  • No hover transforms — clicks fire instantly
  • Audio play/pause: 100ms feedback
  • Cart updates: instant

9. Accessibility & A11y

  • text on bg = 16.0:1 AAA
  • on-brand on brand: white on cyan = 5.6:1 AA
  • 2px cyan focus ring + 1px outset

Track rows use semantic <table> with <th scope="col"> for headers. Audio players have visible play/pause/scrub controls + keyboard support. Album covers have aria-label with full title + artist.

10. Responsive Behavior

mobile <479: hero 48→24; nav hamburger; 1-up album grid; track rows stack with smaller font. tablet 480-767: 2-up. desktop+: 4-up.

11. Content & Voice

Tone

Direct-utility, anti-Spotify. Honest, slightly indie-snarky. Voice is the record-store clerk who knows what you want.

Microcopy patterns

  • Primary CTA: “Buy now” / “Stream” / “Pay what you want”
  • Sign-up: “Sign up” (no proper-noun branding)
  • Errors: “Something didn’t work — try again.”
  • Empty: “Your collection is empty — discover artists below.”
  • Bandcamp Friday: “Today’s $0 platform fee” (community-positive)

CTA verb conventions

  • Buy / Stream / Download / Add to cart / Follow
  • Avoid: streaming-platform language (“Discover Weekly”), aspirational (“Curate your sound”)

12. Dark Mode & Theming

Light-only on web. Cream canvas IS the brand — anti-dark-streaming-platform identity. Bandcamp users have requested dark mode; the brand has stayed light.

13. Lineage & Influences

Bandcamp descends from Ethan Diamond’s 2008 founding as direct-to-fan music distribution — built to skip Spotify-style streaming-economics. Bandcamp Cyan has barely shifted since 2008. Helvetica chosen for system-default honesty rather than custom-typography polish.

Named influences:

  • Ethan Diamond (2008) — direct-to-fan distribution origin
  • Helvetica Neue (1957) — system-default honesty
  • SoundCloud (early-2010s) — indie peer
  • Early-2000s indie labels (Sub Pop, Matador) — utilitarian indie aesthetic
  • Bandcamp Friday — community-marketing initiative

14. Do’s and Don’ts

Do

  • Cream canvas + Bandcamp Cyan + Helvetica.
  • 0px radius on UI — utilitarian-rectangular.
  • Body 13px — album-listing density.
  • Buy Now orange #cc7a3a for purchase CTAs only.
  • Mono for track durations.
  • Hairline borders, minimal shadows.
  • Mixed case display, UPPER eyebrows + buttons.

Don’t

  • Don’t use custom webfonts. Helvetica is the brand.
  • Don’t round corners. Indie utilitarian is rectangular.
  • Don’t add streaming-platform polish (algorithm carousels, “Discover” sections).
  • Don’t use streaming-platform microcopy (“Curate your sound”).
  • Don’t add dark mode — the brand is anti-dark by design.
  • Don’t add gradients.
  • Don’t substitute Bandcamp Cyan.

15. Agent Prompt Guide

Quick Color Reference

  • bg (warm off-white): #fafaf6
  • text: #1a1a1a
  • brand (Bandcamp Cyan): #629aa0 / hover #4a8087
  • buy-now-orange: #cc7a3a
  • vinyl-warm #c97558, cassette-warm #bf8a3c
  • border: #dcdcd6

Example Component Prompts

Build a Bandcamp-style album page: cream canvas #fafaf6, album cover left 320×320, tracklist right with track-rows (number / title / duration in mono). 32px Helvetica album title, 17px artist link in cyan. Primary CTA “Buy Digital Album” 0px-radius cyan #629aa0, secondary “Stream” link.

Design a release card: white surface (lifts barely from cream), 0px radius, 12px pad, 1px gray border. Album cover top, 17px Helvetica 700 album title, 13px artist + label below in dark gray. Genre pill in 11px UPPER 0.10em.

Render a track row: transparent bg, 6px vertical pad, 1px bottom border. Track number left in mono 12px, title 13px Helvetica middle, duration right in mono 12px gray.

Build a “Buy Now” CTA: 0px radius, orange #cc7a3a bg, white 13px Helvetica 700 0.02em “Buy Now”, padding 8×16.

Design a format tag pill: pill radius, vinyl-warm #c97558 bg for vinyl / cassette-warm #bf8a3c for cassette / surface-strong for digital. White text 11px Helvetica 700 0.04em UPPER.

Iteration Guide

  1. Cream canvas + Cyan + Helvetica. No custom fonts.
  2. 0px radius — utilitarian-rectangular.
  3. Body 13px — denser than SaaS.
  4. Buy-Now orange for purchase CTAs only.
  5. Mono for track durations.
  6. Hairline borders, minimal shadows.
  7. Indie-direct voice — anti-Spotify-platform.
  8. Reject custom webfonts, dark mode, streaming-platform language, rounded corners.
Ship with this

Drop bandcamp into your project, then ship the actual sections in an afternoon.

1 · install design
npx @webdesignhot/design-md add bandcamp
2 · ship landing page
npx agentkit init --design bandcamp
How AgentKit reads DESIGN.md