Suggest edits and Content to revisit
On this page
Suggest edits reads an existing record against your voice guide and suggests small changes: a past year written as current, a sentence that says one thing in forty words, a count that may have changed, an image without alt text, an SEO description over its limit. You step through them in the Finish this page guide and accept, edit, dismiss or undo each one. Accepted changes go into the form. Nothing is saved until you save.
Content to revisit lists the published records that may need a look, ranked by checks that cost nothing, with a Review button on each.

What it costs
| Action | Model calls |
|---|---|
| Suggest edits (or Review on Content to revisit) | Two: one reviews the page, a second double-checks every suggestion it kept (none when it kept nothing). A long page (over 6,000 words) is read in parts, two calls each, and the confirm says how many before anything runs. Both run on your writing model at high effort, so a review costs roughly twice the tokens of one call |
| Accept, Edit, Another version (the stored ones), Dismiss, Undo, It's still right, Use it | None |
| Write another (after the stored versions) | One small call |
| The free checks, Content to revisit, saving, the scheduled commands | None |
There is no overnight review: a review runs only when someone clicks.
Suggest edits
On a record's Edit page, open the menu beside Edit with Ghostwriter and choose Suggest edits ("Reads the page against your voice guide, then double-checks each suggestion. Uses Ghostwriter twice."). The confirm says how many calls it will take, and how many things the free checks found for the review to look at. The review reads the form as it is now, unsaved typing included, and runs as a queued job.
Nothing reaches you that the model hasn't judged in context. Checks that cost nothing find candidates:
- past years written as current ("New for 2023");
- "this year" or "coming soon" on a page a year old or more;
- closing dates that have passed;
- counts and prices that may have changed ("our team of 6", "from £60"), on pages a year old or more;
- links whose words say nothing ("click here");
- paragraphs much like one on another record of the same resource;
- images without alt text;
- SEO titles and descriptions over their limit.
The review reads each one in its paragraph and keeps it, with a fix that fits its sentence, or drops it ("New for 2023" in a 2023 news post is history, not a mistake). It adds its own: wording that's off-voice or unclear. Then a second call double-checks every suggestion it kept: that it's a real problem here, that the new words read naturally in the sentence, add no fact and sound like you. Only what passes both is shown. While it runs the guide says "Reviewing… then double-checking"; when it's done, it says how many things it found were fine in context and so aren't shown, and those stay quiet for 12 months or until their sentence changes.
If the review call fails, nothing is shown and Try again runs it again. If only the double-check fails, the review's own checked suggestions are shown.
The guide
It is the Finish this page guide: the same pill, dock, flying mark and field highlights, in indigo. When a page has both, the guide's header has two tabs, Suggested edits and Finish this page.
- Filters by kind ("All 6", "Out of date 1", "Clarity 1"…), and a progress bar.
- Each suggestion has its kind, the reason, where the reason comes from ("Voice guide: “What this voice never does”", "Found without AI"), and the before and after: the whole sentence as it reads now and as it would read, the change marked in it.
- Out of date rewrites the whole sentence ("New for 2023: winter care visits" becomes "Winter care visits"), with the dated words marked in the old one, and alternatives that are meaningfully different. It's still right keeps a dated claim that is still true, quiet for 12 months or until the sentence changes.
- Accept puts the change into the form. Edit opens it in a box: Enter puts it in, Esc puts it back. Another version shows the next stored version, free; after those, Write another (uses Ghostwriter). Dismiss says it won't be suggested again. Undo takes back any of them.
- Accept all wording fixes accepts every open Voice, Clarity and SEO suggestion in the current filter, never facts, alt text, dates or duplicates. Undo all takes them back.
- Fact to check never guesses. It asks for the answer ("I won't guess. What is it now?") and Use it puts it in ("from £75 a visit"). A number must be a number. It's still right keeps the page as it is, and the check stays quiet for 12 months or until that sentence changes. Remove the number appears where the sentence works without it.
- Alt text goes into the field
->ghostwriterAlt()names, beside the image, or into an inline image's own alt text in a RichEditor. A confirm first says which file it is for and how many pages use that image. Filament keeps alt text in each record, so each page keeps its own. - Links: Filament has no entries to link to, so a link to another site found broken points at its field. In a RichEditor, paste the new address.
Moving between steps, filters and versions happens in the browser. Each decision is recorded for everyone who can edit the record (as shared conversations say), with who and when. On save, accepted changes are marked done. Suggestions nobody acted on expire after 14 days; decisions are kept as the page's history.
Content to revisit
Ghostwriter → Content to revisit ranks the published records of every resource Ghostwriter writes for (those its published rule allows, or every record without one) by:
- age;
- past years and "this year" written as current;
- closing dates that have passed;
- counts to check;
- missing alt text and SEO values over their limit;
- empty fields and unfinished markers;
- links to other sites, when that check is on.
Each row shows its reasons as chips, a priority bar with its word (High, Medium, Low) and Review, which opens the record with Suggest edits: the stored review if it still fits the page, otherwise the confirm for a new one. The row's menu has Snooze for 90 days and Open without reviewing. The tiles at the top filter the list: pages worth a look, past years written as current, broken links, images without alt text.

On a panel with tenancy, each tenant has its own list.
Keeping it current
- On save: a model observer on each resource's model queues
RefreshRevisitEntryfor the record. This updates its row, its place in the index that duplicates and the review's site digest are found in, and its latest review's done and stale suggestions. Deleting a record takes it off the list. - Daily:
ghostwriter:revisitruns on the scheduler at 03:00. Records saved since the last run are scanned again, and so are rows whose date has come (a closing date passing, a new year); every other row is re-scored for its age. Once a week, and the first time, every record is scanned and the index rebuilt. It also expires suggestions nobody acted on. Opening the list before it has ever run queues a first scan. - Weekly, only when switched on:
ghostwriter:check-linksasks each site your records link to whether the page is still there. It sends a HEAD request (a one-byte GET where HEAD is refused), checks each address at most once a week and at most one a second per site, and checks no more than 500 addresses a run. A link counts as broken only after two failed checks in a row.
Both commands need Laravel's scheduler running (php artisan schedule:work, or schedule:run from cron), and a queue worker for the save hook.
Settings
Three, under Settings → Suggest edits and Content to revisit:
| Setting | Default |
|---|---|
| Flag counts and claims to check: counts and prices about you, and claims the review flags. Closing dates are always checked | On |
| Check links to other sites once a week | Off: no request is made |
| Weigh age in full for: resources with a date field weigh age and past years at a quarter, as older news is expected; tick one to weigh it like any other | None ticked |
Languages
The free checks read dates and phrases in English, German, French, Dutch and Spanish, in the app's locale, or set ghostwriter.suggest.language (GHOSTWRITER_CONTENT_LANGUAGE). Other languages get the checks that need no words: alt text, SEO length, empty fields, links and age. The review itself works in any language: its reasons are written in the language of the person who asked, and its changes follow the page.
SEO fields
Fields called seo_title, meta_title, seo_description or meta_description are found by their name; their limit is their maxLength, or 60 and 160. Name any other text field with a macro, optionally with the field shown when it's empty:
Textarea::make('meta')->ghostwriterSeo('description', fallback: 'excerpt'),
TextInput::make('share_title')->ghostwriterSeo('title'),
TextInput::make('meta_title')->ghostwriterSeo(false), // not an SEO title after all
Run php artisan ghostwriter:scan after changing a form.
Upgrading from 1.1
Run php artisan migrate. The new tables can also be published on their own with php artisan vendor:publish --tag=ghostwriter-suggest-migrations. Then run php artisan ghostwriter:revisit --full once, or open Content to revisit, to fill the list.
What Filament can't do
- No links to other records. Filament has no entries for core to check links against, so broken internal links aren't found and links can't be pointed at another record. A link to another site found broken (with the weekly check on) points at its field.
- No asset library. Alt text is a form value, in
->ghostwriterAlt()fields and inline images; plain uploads without one have nowhere to keep it. - Duplicates are found across all the resources Ghostwriter writes for, in the same tenant.