
Color Palettes for Long-Form Reading Interfaces: Designing for 30-Minute Sessions Without Eye Fatigue
by Julio Song
Open your phone's screen-time report and count how many minutes you spent reading yesterday. Reading, that is, not scrolling or watching. For a growing number of people in 2026, that number is climbing past 45 minutes a day, driven by AI-generated longform articles, Substack newsletters, developer documentation, and e-reader apps. Yet most of those reading experiences were designed with color palettes borrowed from marketing landing pages or SaaS dashboards, interfaces built for 90-second visits, not 30-minute reads.
The result is eye strain that builds slowly. Readers can't name it, but they feel it. It shows up as shorter sessions, higher bounce rates and a vague sense that "something about this app is tiring."
This guide is for designers and developers building reading-first products. It goes past WCAG minimum contrast ratios, looks at what the evidence says about warm and cool background tints, and ends with four complete palettes built for something most palette guides ignore: comfort over time.
Why reading interfaces need their own colors
It helps to split interfaces into "glance" and "dwell" types. A marketing page, a SaaS dashboard or an e-commerce product grid is a glance interface: users scan, click and move on, and time on page is measured in seconds. A newsletter article, a documentation page or an e-reader chapter is a dwell interface, where users stay and read. That changes how color affects the eye.
After roughly three minutes of sustained reading, your eye adapts to the average luminance of the page. This process, called luminance adaptation, means the pupil settles into a relatively fixed aperture, and the retina adjusts its sensitivity accordingly. A contrast ratio that felt fine during a quick glance can start to feel harsh or washed-out once the eye has fully adapted. WCAG compliance makes text legible. It doesn't make it comfortable.
Reading-heavy products are also growing fast. Substack and Ghost newsletters now regularly surpass 10-minute average read times. Documentation platforms like Mintlify and GitBook have become daily-driver tools for developers who spend hours reading reference material. AI-generated longform content has expanded the volume of text people encounter by an order of magnitude.
So a reading palette has a specific job. Prettier colors are beside the point. The goal is a luminance environment where the eye can hold focus for 30 minutes or more without fatigue signals like squinting, re-reading lines or looking away for a break.

Background-to-text contrast beyond WCAG minimums
WCAG AA requires a 4.5:1 contrast ratio for body text, and AAA raises that to 7:1. Treat these as floors. They ensure legibility, but they say nothing about comfort.
For sustained reading, body text works best in what I call the "comfort corridor": between 10:1 and 15:1 on light backgrounds. That is high enough for easy parsing and low enough to avoid the halation glare you get from pure black on pure white.
Pure #000000 on #FFFFFF is hard going for long reads. The extreme luminance difference causes an irradiation illusion, where text appears to vibrate or shimmer at the edges. It also forces the pupil into constant micro-adjustments as it tracks across lines. Soften both ends instead. #1A1A2E on #FAFAF7 gives a contrast ratio of roughly 15.5:1, plenty for readability, without the vibration.
For a more precise check, use the APCA (Accessible Perceptual Contrast Algorithm) readability contrast metric. Unlike traditional WCAG ratios, APCA weights font size and polarity (light-on-dark vs. dark-on-light), which gives a much better picture of real reading comfort.
A quick reference for reading interfaces:
| Element | Light Mode Contrast | Dark Mode Contrast | |---|---|---| | Body text | 10:1 to 15:1 | 10:1 to 14:1 | | Subheadings | 8:1 to 12:1 | 8:1 to 12:1 | | Captions / metadata | 5:1 to 7:1 | 5:1 to 7:1 | | UI chrome (icons, dividers) | 3:1 to 5:1 | 3:1 to 5:1 |
Warm vs. cool background tints
You've probably heard that "warm backgrounds reduce eye strain." That is only partly true. Warm-tinted backgrounds (a slight yellow or peach shift) reduce perceived fatigue in self-reported surveys, but measurable differences in visual acuity are minimal. The benefit is psychological, which still counts, because perceived comfort affects how long someone keeps reading.
A slight warm shift, moving your background hue toward 40-55° on the color wheel, can reduce the overall blue-light emission of a page by 8-12% without any visible "yellowed" look. Your users won't see sepia. They'll just feel a little more relaxed.
Cool-tinted backgrounds have their own place. A slight blue-gray signals "technical" or "focused" reading and can feel more appropriate for documentation and code-heavy content. Keep the tint subtle, with background saturation below 3-5%. Once you exceed that, the background stops feeling neutral and starts feeling tinted, which becomes distracting over time.
As a rule of thumb, use a warm tint (hue 40-55°) for editorial content, narrative essays and newsletters. Use a cool-neutral tint (hue 220-240°) for technical documentation, reference material and code-heavy content. Mixed-use platforms that offer theme switching can stay truly neutral and let the user decide.
Four reading mode palettes
Each of these palettes is complete and built for a specific reading context.
Light mode
Background #FAFAF5 is a warm white with about 2% saturation and 98% lightness. It avoids the clinical feel of pure white while remaining imperceptible as "tinted" to most users. Body text #2C2C34 is a cool dark gray, softer than black, yielding a contrast ratio of roughly 14.4:1. Secondary text #6B6B78 handles captions and metadata. The accent #3B6ACA is a muted blue that marks interactive elements without shouting. Links at #2E5BA8 are distinguishable but gentle inside body copy.
Sepia mode
Sepia mode needs more than a yellow overlay on light mode. Every color has to be rebalanced. Background #F5EDDF sits at hue 38°, 12% saturation, and 94% lightness. Body text shifts to #3B3228, a warm dark brown that matches the background. Secondary text #7A6E5D follows the same warm family. Accent #8B6834 is a warm gold, and links at #6B4F2A stay visible without clashing against the amber-toned background. If you just drop a yellow filter on your light mode, your blues will turn muddy and your contrast ratios will collapse. Build sepia from scratch.
Dark mode
Dark mode has its own problem: readers' pupils dilate, so any bright element stands out much more. Background #1C1C22 is a cool-neutral very dark gray. Body text #D4D4DC avoids pure white to prevent halation. Secondary text #8A8A96 stays legible without creating glare. Accent #6BA3E8 is brighter than its light-mode counterpart, compensating for the dark surround. Links at #7DB4F0 follow the same principle. Mute every light-colored element, because dilated pupils amplify perceived brightness.
High-contrast mode
This mode is for users with visual impairments. Background #FFFFFF and body text #000000 deliver maximum contrast at 21:1. Secondary text #333333, accent #0044CC, and links #0033AA maintain clear differentiation. The problems here usually aren't color. Tight line spacing and thin fonts are what make high-contrast mode uncomfortable. Pair this palette with a minimum 1.6 line-height and a medium font weight.
Implementation with CSS custom properties
One way to structure these as a theme system:
:root, [data-theme="light"] { --bg-primary: #FAFAF5; --text-primary: #2C2C34; --text-secondary: #6B6B78; --accent: #3B6ACA; --link: #2E5BA8;
} [data-theme="sepia"] { --bg-primary: #F5EDDF; --text-primary: #3B3228; --text-secondary: #7A6E5D; --accent: #8B6834; --link: #6B4F2A;
} [data-theme="dark"] { --bg-primary: #1C1C22; --text-primary: #D4D4DC; --text-secondary: #8A8A96; --accent: #6BA3E8; --link: #7DB4F0;
} [data-theme="high-contrast"] { --bg-primary: #FFFFFF; --text-primary: #000000; --text-secondary: #333333; --accent: #0044CC; --link: #0033AA;
}
Toggle themes by setting the data-theme attribute on your <html> element. Persist the user's choice in localStorage.
Accent colors in reading contexts
In dashboard and marketing design, accent colors are there to grab attention, so they get high saturation and high contrast against the background. In a reading interface, the same accent pulls the eye out of the text every time a link, highlight or callout appears.
Accent colors inside body text, such as links and inline highlights, should be distinguishable without interrupting the reading flow. Reduce accent saturation by 20-30% compared to what you'd use in a UI-heavy interface. Keep accent lightness within 20% of your body text lightness.

A concrete example: compare a standard hyperlink blue (#0066FF) inside a paragraph versus a reading-optimized link blue (#3B6ACA). The second is clearly a link, but it doesn't act as a speed bump. You register it out of the corner of your eye and keep reading.
For callout boxes, pull quotes, and highlighted passages, use background tints of your accent color at 5-10% opacity rather than borders or bold accent-colored backgrounds. Heavy callout styling fragments the reading surface into visual blocks, forcing the eye to "re-enter" the text after each interruption.
A quick audit checklist for accent colors in reading interfaces:
- Does this color break reading flow when it appears inline?
- Is it distinguishable in all four modes?
- Does it maintain sufficient contrast against the mode's background?
- Can a user scan past it without involuntarily pausing?
Case study: redesigning a newsletter platform's reading experience
Take a hypothetical but realistic scenario. A Substack-style newsletter platform records an 8-minute average read time on articles that should take 12 minutes. Analytics show a sharp drop-off around the 5-minute mark. Exit surveys mention "reader fatigue," but nobody specifically complains about colors.
Before the redesign, the platform uses a pure white background (#FFFFFF), pure black text (#000000) and saturated blue links (#0055FF), with no dark mode or sepia option. The contrast ratio is 21:1, which passes every check and is still harsh to read for long.
The redesign, step by step:
- Soften the background to
#FAFAF5and text to#2C2C34, dropping contrast to roughly 14:1. - Add a subtle warm tint to the background (hue 50°, saturation 2%).
- Desaturate the link color from
#0055FFto#2E5BA8. - Build dark and sepia modes using the palette system above.
- Add a persistent theme toggle in the reading chrome, placed near the article header.

The results, framed as realistic projections: a 15% increase in average scroll depth, a 22% reduction in "back" navigation within the first 5 minutes, and positive qualitative feedback mentioning "easier on the eyes" without users being able to pinpoint exactly what changed.
Readers rarely name color as the problem. They'll say the "app feels tiring" or "I prefer reading on Kindle." So the improvement shows up in behavior, and you'll find it in scroll depth and session duration rather than satisfaction surveys.
Implementation checklist
- Choose your background tint direction based on content type (warm for editorial, cool for technical, neutral for mixed-use).
- Set body text to a softened near-black or near-white. Never use
#000000on light backgrounds or#FFFFFFon dark ones. - Aim for the 10:1 to 15:1 comfort corridor for body text in light mode.
- Build all four modes (Light, Sepia, Dark, High-Contrast) as CSS custom property sets.
- Check accent colors for reading-flow disruption, and desaturate them by 20-30% relative to your UI palette.
- Test with real content at real reading durations: a 2,000-word article, not five seconds of lorem ipsum.
For testing, recruit 5 users. Give them a full-length article. Measure time-to-completion and self-reported comfort on a 1-5 scale across all four modes. You'll see clear preferences and, more usefully, clear differences in behavior.
Tools worth using:
- APCA Contrast Calculator for perceptual contrast evaluation
- Polypane for multi-theme browser preview
- Stark (Figma plugin) for accessibility and reading-mode audits
With AI-generated content on every platform in 2026, plenty of products have content. Fewer have a reading environment people want to stay in, and that is where the palette matters.
The palette your users never notice
The next time you open a reading-heavy product and want to close the tab after ten minutes for no clear reason, look at the colors. There's a good chance the palette was designed for a billboard, not a book.
Reading sessions keep getting longer, with AI-generated articles, long newsletters and sprawling documentation. The color systems behind them need to move from "technically accessible" to comfortable. Treat the four palettes here as a starting point. Test them with your content, your audience and your reading durations, and measure scroll depth as well as contrast ratios.
The best reading palette is one your users never notice, because they're busy reading.
Written by
Designer and developer
Julio Song is a professional web designer and developer who builds and maintains ColorSift, and writes most of what is published here.
Related articles
Designing for the Silver Economy: How to Build Color Systems That Actually Work for Aging Eyes
Why luminance contrast matters more than hue for older users, with five palettes built for aging eyes in health-tech and beyond.
Designing Color for Outdoor Interfaces: How to Build Palettes That Survive Direct Sunlight
Why indoor contrast ratios collapse in direct sunlight, and how to build UI color systems that stay readable outdoors.
Painting With Mud: A Practical Guide to Using Earthy, Desaturated Browns in Modern UI Design
How to use desaturated brown earth tones in UI design, with contrast fixes, dark mode advice, and three ready-to-use palettes.