Frontmatter

Error codes

Every diagnostic Solo and solo-check can emit — with examples and fix suggestions.

Errors

Errors always block the build. Exit code 1.

AI tip in CLI output. When validation fails, both frontmatter solo:validate and solo-check also print a final tip pointing to --help-ai so you can use the packaged AI workflow to fix the project faster.

E201 — Non-literal props

Props passed to a component are not literal values.

// ✕ Triggers E201
<Hero headline={page.title} />
<CTA title={site.cta.title} />
<Hero headline={"Hello " + name} />
// ✓ Accepted
<Hero headline="Hello Solo" />
<CTA title="Contact" />

Fix: Use only string, number, boolean, or null props in Solo v1.

E203 — Runtime Astro feature

A client:* directive or island runtime feature is used.

// ✕ Triggers E203
<FancyWidget client:load />
<Counter client:visible />

Fix: Remove client:* directives. Keep rendering build-time only.

E210 — Nested layouts

A layout composes another layout.

Fix: Keep layout usage to a single root layout per page. Layouts must not import other layouts.

E230 — Scoped CSS not supported

A component uses a <style> block (Astro scoped CSS).

// ✕ Triggers E230
<style>
  .hero { background: red; }
</style>

Fix: Move CSS to a global stylesheet imported in the layout.

E240 — Markdown pages unsupported

A .md file exists in src/pages/.

Fix: Use .astro pages only in Solo v1.

E250 — import.meta.glob out of scope

import.meta.glob() is used in a page or layout.

// ✕ Triggers E250
const posts = import.meta.glob('./posts/*.md');

Fix: Replace with an explicit build-time dataset or simplify the pattern.

E251 — Astro.url.pathname out of scope

Runtime URL state is used via Astro.url.pathname.

// ✕ Triggers E251
const isHome = Astro.url.pathname === '/';

Fix: Pass route-derived values explicitly as props instead of using Astro runtime URL state.

E252 — Arbitrary frontmatter computation out of scope

Arbitrary JS computation in page or layout frontmatter — sorting, filtering, Object.values, new Date, helper functions, content assembly.

// ✕ Triggers E252
const sorted = items.sort((a, b) => a.date - b.date);
const now = new Date().toISOString();

Fix: Move computation into explicit source data or simplify the pattern.

E271 — Component not yet supported in Solo

A component is recognized but not yet in the Solo v1 support matrix.

Examples: Header with complex props, Gallery, FmImage.

Fix: Simplify the component to a supported pattern, or replace it with a plain Astro component that uses only literal props.

Warnings

Warnings do not block the build by default. They become errors in --strict mode.

W410 — React component skipped

A React component is present and will be replaced by a placeholder in the output.

W411 — Vue component skipped

A Vue component is present and will be replaced by a placeholder.

W412 — Svelte component skipped

A Svelte component is present and will be replaced by a placeholder.

Skipped component placeholders. Framework components generate a <div data-fm-skipped="react" ...> in the output and an entry in manifest.json. Your backend developer can handle these explicitly.

On this page