Troubleshooting
Common issues and how to fix them.
Build Issues
"Unknown component" error
error: unknown component <columns> at line 5 hint: did you mean <column>? (singular in v2) hint: run `inky migrate` to convert v1 syntax automatically
Cause: You're using v1 syntax (e.g., <columns>, <h-line>, class="expand").
Fix: Run the migrator:
inky migrate src/ --in-place
See the Migration Guide for the full list of v1 to v2 changes.
CSS inlining makes the file too large
Cause: The full SCSS framework is compiled and injected into each email, then inlined onto every element.
Fix: Options to reduce size:
# Skip the framework CSS if you provide your own
inky build --no-framework-css # Skip inlining if your ESP handles it
inky build --no-inline-css # Both
inky build --no-framework-css --no-inline-css
You can also override SCSS variables to disable components you don't use, reducing the generated CSS.
SCSS compilation fails
Cause: The sass CLI (Dart Sass) is required to compile the SCSS framework.
Fix: Install Dart Sass:
# npm
npm install -g sass # Homebrew
brew install sass/sass/sass
Then verify: sass --version should show 1.x or later.
Note: sassc (LibSass) is deprecated and does not support Inky's SCSS, which uses the @use module system.
Rendering Issues
Columns not stacking on mobile
Possible causes:
1. Gmail app on Android — does not support media queries. Columns will always render at the large breakpoint. This is a Gmail limitation, not an Inky bug.
2. Missing responsive attributes — if you set lg but not sm, columns default to sm="12" (full width), which is usually correct. Check your column attributes.
3. CSS inlining disabled — if you pass --no-inline-css and your ESP doesn't inline styles, the responsive styles may not apply.
Buttons look wrong in Outlook
Possible causes:
1.
Missing href
— Outlook.com requires href on buttons. Always include it.
2. Custom CSS overriding VML — Inky generates VML <v:roundrect> fallbacks for Outlook. If you add custom button CSS, test in Outlook to make sure it doesn't conflict.
3. Very long button text — Outlook VML buttons have a fixed width. Very long text may overflow. Keep button text concise.
Background images not showing in Outlook
Expected behavior. Outlook desktop (Word engine) ignores CSS background-image.
Fix: Use Inky's <hero> component, which generates VML background fallbacks for Outlook:
<hero background="https://example.com/bg.jpg"> <row> <column>Content over the image</column> </row>
</hero>
Email looks different in dark mode
Dark mode behavior varies by client:
- Apple Mail / iOS — applies
prefers-color-scheme: darkand inverts colors - Gmail — auto-darkens colors (no media query control)
- Outlook app — supports
prefers-color-scheme - Outlook desktop — no dark mode in the Word engine
Tips:
- Use transparent PNGs for logos
- Customize dark mode colors via the SCSS variables in _settings.scss
- Test in Apple Mail dark mode — it's the most aggressive at color inversion
- Add light borders or outlines to images that might disappear on dark backgrounds
Spacing is inconsistent in Outlook
Cause: Outlook ignores margin on many elements and renders padding inconsistently on some.
Fix: Use the <spacer> component for reliable vertical spacing:
<spacer height="20"></spacer>
For responsive spacing:
<spacer sm="10" lg="20"></spacer>
Spacer generates a table row with a fixed height, which works in every client.
Images are scaled/blurry in Outlook
Cause: Outlook on high-DPI displays scales images based on Windows display scaling.
Fix: Always set explicit width and height attributes:
<image src="photo.jpg" alt="Description" width="300" height="200" />
For retina images, use a 2x source image with the display dimensions in the attributes.
Validation Issues
"Gmail clipping risk"
Cause: Your HTML output exceeds or approaches 102KB. Gmail will clip the email and show a "View entire message" link.
Fix:
- Remove unnecessary content or hidden elements
- Use --no-framework-css if you don't need the full SCSS framework
- Simplify complex layouts
- Check if large data merges are bloating the HTML
"Missing alt text"
Cause: An <img> or <image> tag is missing the alt attribute.
Fix: Add descriptive alt text to every image:
<image src="product.jpg" alt="Blue running shoes, side view" width="300" />
For decorative images that convey no information, use an empty alt: alt="".
"Spam trigger detected"
Cause: inky spam-check found words or patterns commonly flagged by spam filters.
Common triggers:
- ALL CAPS text ("FREE", "BUY NOW", "ACT NOW")
- Excessive exclamation marks ("Amazing deal!!!")
- Spammy phrases ("click here", "limited time", "no obligation")
- Large image-to-text ratio
- Missing unsubscribe link
Fix: Reword flagged content. The spam checker output shows the specific triggers and their locations.
Data Merging Issues
Merge tags not replaced
Cause: Variables in the template don't match keys in the JSON data file.
Fix: Check that:
1. Template uses {{ variable_name }} (Jinja2 syntax)
2. JSON data file has matching keys: {"variable_name": "value"}
3. You're passing --data data.json to the build command
4. The data file is valid JSON
Inky uses lenient mode by default — missing keys render as empty strings rather than causing errors.
Merge tags rendered literally in output
Cause: If you see {{ name }} in the output HTML, data merging may not be enabled.
Fix: Make sure you're passing the data flag:
inky build --data data.json
Or set it in inky.config.json:
{ "data": "data.json"
}
Note: If you're using an ESP that handles its own merge tags (Mailchimp, SendGrid, etc.), do not use --data. Inky auto-preserves ESP merge tag syntax in the output.
CLI Issues
inky command not found
Fix by install method:
# Homebrew
brew tap foundation/inky && brew install inky # Cargo
cargo install inky-cli # npm
npm install -g inky-wasm # Direct download — make sure the binary is on your PATH
export PATH="$PATH:/path/to/inky"
Verify: inky --version
inky watch not detecting changes
Possible causes:
1. Wrong directory — make sure your source files are in the src/ directory (or wherever your config points)
2. File extension — the watcher looks for .inky and .html files by default
3. OS file watch limits — on Linux, you may need to increase inotify limits:
bash echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf sudo sysctl -p
Still Stuck?
- Run
inky validatefor automated diagnostics - Check the Component Reference for correct syntax
- Open an issue: https://github.com/foundation/inky/issues