Skip to main content

Command Palette

Search for a command to run...

Design for Developers: Stop Making Your Apps Look Like Potato (Part 1)

Published
11 min read
Design for Developers: Stop Making Your Apps Look Like Potato (Part 1)

You can write beautiful code. Your API is elegant. Your database queries are optimized. Your tests are green.

But your UI looks like it was designed in Microsoft Word 97.

I get it. You're a developer, not a designer. But here's the thing: your users don't care how clean your code is if your app is painful to look at.

The good news? You don't need to become a designer. You just need to understand a few fundamental principles. And unlike learning a new framework, these principles don't change every six months.

This is Part 1 of a practical design guide for developers. No theory. No "make it pop." Just concrete rules you can apply immediately.

The Core Problem: Developers Think Visually Different

When developers build UIs, we think in terms of:

  • Data structures

  • Component hierarchies

  • Input/output

  • Function signatures

When designers build UIs, they think in terms of:

  • Visual weight

  • Flow and rhythm

  • Emotional response

  • Spatial relationships

Neither is wrong. But if you only think like a developer, your UI will look like a JSON object rendered to HTML.

Rule 1: Whitespace Is Not Wasted Space

The biggest mistake developers make: cramming everything together to "maximize screen real estate."

Bad developer thinking: "The user paid for a 1920px screen, I should use all 1920 pixels."

Good design thinking: "Whitespace helps the user focus on what matters."

Look at any app you think is ugly. I guarantee it has almost no breathing room. Everything touches everything else.

The Spacing Scale You Actually Need

Forget random pixel values. Use a spacing scale:

4px  - Tiny gaps (icon to text)
8px  - Small gaps (within a component)
16px - Medium gaps (between related items)
24px - Large gaps (between sections)
32px - XL gaps (between major sections)
48px - XXL gaps (page margins)

That's it. Pick from these six values for 95% of your spacing decisions.

Bad spacing: 7px here, 11px there, 19px somewhere else. Everything feels random.

Good spacing: Consistent use of the scale. Your UI develops rhythm.

Practical Example

/* Bad - random spacing */
.card {
  padding: 13px;
  margin-bottom: 17px;
}

.card-header {
  margin-bottom: 9px;
}

/* Good - spacing scale */
.card {
  padding: 24px;        /* Large internal padding */
  margin-bottom: 16px;  /* Medium gap between cards */
}

.card-header {
  margin-bottom: 16px;  /* Medium gap to content */
}

Here's the visual difference between cramped and spacious layouts:

The left side shows everything crammed together with 4-8px gaps. The right side uses 16-24px consistently. Notice how the spacious version is easier to scan and naturally groups related content.

Rule 2: Typography Hierarchy Isn't Optional

Developers often do this:

* {
  font-size: 14px;
}

Everything is the same size. Headings look like paragraphs. Buttons look like labels. It's visual chaos.

You need hierarchy. Not because it looks nice – because it tells users what to read first.

The Type Scale

You need exactly 5-6 font sizes:

12px - Small text (captions, helper text, timestamps)
14px - Body text (paragraphs, form inputs, most UI)
16px - Emphasized body (slightly larger for readability)
20px - Subheadings (section titles)
24px - Headings (page titles, card headings)
32px - Large headings (main page titles, hero text)

And two font weights:

400 - Normal (body text)
600 - Semi-bold (headings, emphasis)

That's it. Not 300, 400, 500, 600, 700, 800, 900. Just two weights.

Why This Works

Your eye immediately knows:

  • 32px + bold = most important

  • 24px + bold = section heading

  • 14px + normal = body text

  • 12px + normal = metadata

No guessing. Clear visual hierarchy.

The Line Height Rule

Developers often forget line-height. Result: text that's either cramped or weirdly spaced.

Simple rule:

/* Headings - tighter line height */
h1, h2, h3 {
  line-height: 1.2;
}

/* Body text - relaxed line height */
p, li, label {
  line-height: 1.6;
}

Short text (headings) needs less space. Long text (paragraphs) needs more space for readability.

The diagram above shows two layouts side by side. On the left, everything is 14px with no hierarchy – you can't tell what's important. On the right, using 32px/20px/14px/12px creates instant visual structure. Your eye knows exactly where to start reading.

Rule 3: Color Is A System, Not A Palette

Developers pick colors like this:

  1. Choose a blue

  2. Use it everywhere

  3. Need another color

  4. Pick a random red

  5. Repeat until you have 47 colors

This is wrong.

The Minimal Color System

You need exactly these colors:

Gray scale: 
  - 100 (lightest - backgrounds)
  - 300 (light - borders)
  - 500 (medium - disabled text)
  - 700 (dark - body text)
  - 900 (darkest - headings)

Primary color (your brand):
  - 100 (lightest - backgrounds)
  - 500 (medium - buttons, links)
  - 700 (dark - hover states)

Semantic colors:
  - Success green (confirmations, success states)
  - Warning yellow (warnings, pending states)
  - Danger red (errors, destructive actions)
  - Info blue (info messages, neutral highlights)

That's 5 grays + 3 primary shades + 4 semantic colors = 12 colors total.

Every color has a purpose. No random colors.

How to Use Them

/* Text */
.heading { color: gray-900; }
.body-text { color: gray-700; }
.caption { color: gray-500; }

/* Backgrounds */
.page-bg { background: gray-100; }
.card-bg { background: white; }

/* Borders */
.border { border: 1px solid gray-300; }

/* Interactive elements */
.button-primary { background: primary-500; }
.button-primary:hover { background: primary-700; }
.link { color: primary-500; }

/* States */
.success-message { background: success-100; color: success-700; }
.error-message { background: danger-100; color: danger-700; }

See the pattern? Each color has a job.

Contrast Matters

The most common accessibility mistake: poor contrast.

Rule: Text on background needs 4.5:1 contrast ratio minimum.

/* Bad - 2.1:1 contrast */
color: #999;
background: #fff;

/* Good - 7:1 contrast */
color: #333;
background: #fff;

Use a contrast checker. Don't guess. Light gray on white might look subtle to you, but it's unreadable for many users.

This diagram shows the complete 12-color system with actual color swatches. You'll see the 5-shade gray scale, the 3-shade primary system, and the 4 semantic colors. Each color includes its hex code, shade number, and specific use case. The bottom section shows contrast examples – good vs bad contrast ratios with actual text samples.

Rule 4: Visual Hierarchy Guides The Eye

When a user opens your app, their eye needs to know where to start.

Bad developer UIs: everything has equal weight. The logo is the same size as a button. The heading is the same weight as body text. Nothing stands out.

Good design: clear hierarchy. You know exactly where to look first.

The Hierarchy Stack

  1. Primary action - The one thing you want users to do

    • Largest, most colorful, high contrast

    • Example: "Sign Up" button on landing page

  2. Secondary actions - Alternative actions

    • Less prominent, outline style or gray

    • Example: "Learn More" next to "Sign Up"

  3. Tertiary actions - Minor actions

    • Text links, small buttons

    • Example: "Cancel" or "Skip"

Practical Example

<!-- Bad - all buttons look the same -->
<button>Delete Account</button>
<button>Cancel</button>
<button>Save Changes</button>

<!-- Good - visual hierarchy -->
<button class="primary">Save Changes</button>
<button class="secondary">Cancel</button>
<button class="danger-link">Delete Account</button>
.primary {
  background: blue-500;
  color: white;
  padding: 12px 24px;
  font-weight: 600;
}

.secondary {
  background: white;
  border: 1px solid gray-300;
  color: gray-700;
  padding: 12px 24px;
}

.danger-link {
  background: none;
  border: none;
  color: red-500;
  font-size: 14px;
  text-decoration: underline;
}

Your eye naturally goes: primary → secondary → tertiary.

The visual above compares two button layouts. The left side shows three buttons with identical styling – you have to read each one to know what to do. The right side uses visual weight: the primary "Save Changes" button is filled and bold (most important), "Cancel" is outlined (alternative), and "Delete Account" is just a text link (destructive, less prominent). Your eye immediately knows which action is primary.

Rule 5: Alignment Creates Order

Misalignment is the hallmark of developer-designed UIs.

Text that doesn't line up. Buttons at random positions. Form fields with inconsistent widths.

The Alignment Rules

  1. Left-align text (in left-to-right languages)

    • Easiest to read

    • Creates a clean edge

    • Never center long paragraphs

  2. Align related items

    • Form labels align with inputs

    • Icons align with text baselines

    • List items align vertically

  3. Use a grid

    • 12-column grid is standard

    • Or simple: left column + right column

    • Consistent margins on both sides

Example: Form Alignment

<!-- Bad - misaligned -->
<div>
  <label>Email</label>
  <input type="email">
</div>
<div>
  <label>Password</label>
  <input type="password">
</div>

<!-- Good - aligned with grid -->
<div class="form-row">
  <label class="form-label">Email</label>
  <input class="form-input" type="email">
</div>
<div class="form-row">
  <label class="form-label">Password</label>
  <input class="form-input" type="password">
</div>
.form-row {
  display: grid;
  grid-template-columns: 120px 1fr;
  gap: 16px;
  align-items: center;
  margin-bottom: 16px;
}

.form-label {
  text-align: right; /* Labels align right to inputs */
}

Everything lines up. Creates visual order.

Common Mistakes Developers Make

1. Using Too Many Fonts

/* Bad */
h1 { font-family: 'Fancy Display Font'; }
h2 { font-family: 'Another Font'; }
body { font-family: 'Different Body Font'; }
code { font-family: 'Yet Another Monospace'; }

You need TWO fonts max:

  • Sans-serif for UI (Inter, SF Pro, Roboto)

  • Monospace for code (Fira Code, JetBrains Mono)

That's it.

2. Over-Using Bold

Developers discover font-weight: 700 and suddenly everything is bold.

Bold is for emphasis. If everything is bold, nothing is bold.

Use bold sparingly:

  • Headings

  • Active navigation items

  • Key metrics/numbers

  • Strong emphasis in body text (rarely)

3. Ignoring Mobile

You design for desktop. It looks great on your 27" monitor. Then someone opens it on their phone and it's a disaster.

Always design mobile-first:

/* Mobile first (default) */
.container {
  padding: 16px;
}

.grid {
  display: block; /* Stack on mobile */
}

/* Desktop (progressive enhancement) */
@media (min-width: 768px) {
  .container {
    padding: 32px;
    max-width: 1200px;
    margin: 0 auto;
  }
  
  .grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 24px;
  }
}

Start with mobile. Enhance for desktop. Not the other way around.

4. Inconsistent Spacing

5px here, 17px there, 23px somewhere else.

Use the spacing scale. Always. No exceptions.

5. Low Contrast

Gray text on light gray background might look "modern" to you. It's unreadable.

Use a contrast checker. Aim for 4.5:1 minimum for body text, 3:1 for large text.

The Quick Checklist

Before you ship your UI, ask:

  • [ ] Is there enough whitespace? (16-24px between sections)

  • [ ] Do I have clear typography hierarchy? (5-6 sizes max)

  • [ ] Am I using my color system consistently? (12 colors total)

  • [ ] Is there a clear visual hierarchy? (can you tell what's important?)

  • [ ] Is everything aligned properly? (using a grid)

  • [ ] Does it work on mobile? (test it!)

  • [ ] Is the contrast good enough? (use a checker)

  • [ ] Am I using 2 fonts max? (not 5 different fonts)

If you can check all these boxes, your UI is already better than 80% of developer-designed apps.

Tools That Help

Color contrast checkers:

  • WebAIM Contrast Checker

  • Colorable

  • Accessible Colors

Type scale generators:

  • Type Scale

  • Modular Scale

Spacing system:

  • Tailwind CSS (has great defaults)

  • Just use multiples of 4 or 8

Design inspiration:

  • Dribbble (but don't copy, learn)

  • Refactoring UI (book specifically for developers)

  • Land-book (real websites)

The Bottom Line

You don't need to become a designer. You just need to follow these rules:

  1. Whitespace - Use consistent spacing (16-24px between sections)

  2. Typography - 5-6 sizes, 2 weights, clear hierarchy

  3. Color - 12 colors total, each with a purpose

  4. Hierarchy - Make important things look important

  5. Alignment - Everything lines up, use a grid

These aren't subjective "make it pretty" suggestions. They're concrete rules that make interfaces usable.

Start with one rule. Apply it to your app. See the difference. Then add another.

Your code is beautiful. Your UI should be too.


Part 2 Coming Soon: Layout patterns, component design, dark mode, animations, and responsive design.


What design mistakes do you see developers make most often? Drop them in the comments.