Troubleshooting
The errors Vellum raises, what each one means, and the failures that are silent.
Errors you will see
Invalid frontmatter in [file]: ...
The YAML between the opening and closing --- did not parse, or the closing --- is
missing. The message names the file and repeats the YAML parser's reason.
The usual causes are an unquoted value containing a colon (title: Vellum: docs needs
quotes) and inconsistent indentation.
Unknown docs directive [:::name] in [file]
A ::: block whose name is not one Vellum ships. Almost always a typo. The shipped set is
note, tip, info, warning, danger, success, idea, tabs, steps and
cards.
Unknown docs component [x-name]
A <x-…> tag with no matching Blade view. Check the view exists and the tag name matches
its path: <x-docs::figure> needs resources/views/…/docs/figure.blade.php under a
registered docs namespace.
Component [x-name] is not in vellum.components.namespaces
The view may well exist, but its prefix is not allowed in Markdown. Add the prefix to
components.namespaces. Use '' or 'app' for unprefixed host components. See
Extending.
Value tag [x-vellum::env] key [APP_KEY] is not in vellum.components.allowlist
Value tags refuse everything by default. Add the key you want to the matching list. This is deliberate: without it a docs page could print any config value or environment variable. See Value tags.
Unclosed docs component [x-name]
An opening <x-name> with no </x-name>. Self-closing tags need the slash:
<x-vellum::env key="APP_NAME" />.
Docs component [x-name] attributes must be quoted strings
Something like :type="$foo" in Markdown. Docs attributes are literal strings; there is
no expression syntax. Pass dynamic values through a value tag, or
compute them inside the component.
Two docs files resolve to [/slug]
billing.md and billing/index.md both claim /docs/billing, or two pages share a
frontmatter slug. The message names both files. Rename one.
vellum.search.driver is scout but laravel/scout is not installed
Either run composer require laravel/scout or set the driver back to minisearch. See
Search.
Where errors appear
In local, and in vellum:build, these throw with the message above.
In production a reader gets a Vellum error page that says the page could not be rendered
and nothing else; the reason and the file are in your log. vellum:build is the place to
catch them, which is why it belongs in your deploy before the app goes live. See
Commands.
Failures that are quiet
These do not raise. Check them by eye.
| Symptom | Cause |
|---|---|
| A page shows its frontmatter as body text | The file does not open with --- on line one. A block that opens and never closes raises instead. |
| An image 404s | The path is resolved from the docs root, not from the page. See Images. |
A <details> or <div> vanished |
Raw HTML is stripped. Use a component. See Markdown. |
:::note title="x" has no title |
Only the bracket form sets a title: :::note[x]. |
::card[Title] renders as literal text |
A card needs an href: ::card[Title](/path). |
| A page is missing from the sidebar but loads by URL | It is gated, or a parent folder is. See Gating. |
A page is in the sidebar that you left out of meta.json |
pages orders the sidebar, it does not filter it. See Navigation. |
| A table of contents entry scrolls nowhere | The heading is inside a :::tabs panel that is not showing. See Tabs. |
Editing changes nothing
In local, a page recompiles when its file changes. Everywhere else the compiled cache is
authoritative until you rebuild.
php artisan vellum:build
If a page is still stale after that, clear and rebuild:
php artisan vellum:clear
php artisan vellum:build
Deleting a Markdown file does not remove its compiled page on its own. vellum:clear
does.
The site has no styling
Vellum registers routes at /vendor/vellum/vellum.css and /vendor/vellum/vellum.js
that serve the compiled assets straight from the package, so styling works on a server
where vellum:install has never run. You do not need to publish or commit anything.
vellum:install also copies those files into public/vendor/vellum. When they are there
the web server answers for them as static files and the routes never run, which is one
less PHP process per asset. Both paths work; the copy is an optimisation.
If a page really is unstyled, the routes are not reachable. Check that the package is
discovered (php artisan route:list | grep vellum.assets), and that nothing in the app
is intercepting /vendor/*.
Search returns nothing
Check search.enabled is true, then rebuild the index with vellum:build or
vellum:index. Gated pages are absent for readers who cannot see them, which is working
as intended.
Still stuck
Open an issue with the page's Markdown, the relevant part of config/vellum.php, and
what php artisan vellum:build prints.