DietMenus, Programmatic Directory
Programmatic SEO directory to find restaurant meals that fit your dietary needs.
A free tool that reads any page the way AI crawlers do, then builds the connected schema the page should have and explains every change.
A lot of the schema I come across is valid and still pretty bad. It passes Google’s Rich Results Test, and then you look at the graph and the Organization isn’t connected to the WebPage, the brand has two different names, and half the values describe things the page never actually shows.
The existing tools don’t help much with that. Validators tell you whether your markup is valid and visualizers draw you a picture of it, but nothing tells you what good looks like for your page. So I built one that does.
You give it a URL, or paste the HTML if the site blocks tools, and it fetches the page the way GPTBot, ClaudeBot and PerplexityBot mostly do, as raw HTML with no JavaScript. It maps the schema you have now as a graph, then reads the page’s own content and builds the connected graph the page should have, with a list of what changed and why. Click any node or connection in either graph and you get an explanation of what it is and why it’s there.
The suggestion is the part I care about most. I started out wanting an ideal graph for each page type, but there are too many page types and two sites of the same type almost never share one ideal. So the suggestion is built from what’s on the page itself, which is how I’d do it by hand anyway.
The suggestion comes from Claude Sonnet, and the risk there is obvious: a model asked to write schema will happily invent a 4.8 star rating. So the model only proposes, and code checks everything before you see it. Every type and property has to exist in schema.org, the graph has to pass the same checks the tool runs on your current markup, and every value has to appear somewhere in the page text. If a check fails the model gets one retry with the errors, and anything that still fails gets dropped.
Before launch I ran the parser over 928 pages from 26 sites to make sure it matched the Python version from my schema teardowns, then worked through every “not on the page” flag in a 50-page sample until the checker had 0 false flags.
The first page I tested was my own. On one of my old blog posts it found 10 values in my schema that the page doesn’t show, things like an MIT alumniOf, a job title, a skills list and an address. All true about me, but none of it is on that page, so a machine has no way to check it there. It also caught a YouTube sameAs pointing at a channel the page doesn’t link to, and a breadcrumb called “Writing” when my nav says “Blog”. That’s the screenshot up top.
The first versions were too cautious. On a live workshop page the model left out the date because the page listed it in three time zones, and it squeezed everything else into an Event that had nowhere to put the syllabus. When I asked why it hadn’t just made it a Course, the answer was that nothing in the prompt told it to rethink the type. Now leftover facts count as a sign the type is wrong, and on that same page it came back with a Course plus a CourseInstance holding the date, the 90 minute duration and the syllabus.
It doesn’t promise you’ll get cited by ChatGPT or show up in AI Overviews. In my real estate teardown, schema quality didn’t predict which sites got cited, and I’d rather say that up front. What it does give you is schema that’s complete and true to the page, which is the part you control.
The parser is TypeScript, ported from my Python teardown code and tested against it on every page in the corpus. The page runs on GitHub Pages and a Cloudflare Worker handles fetching, rate limits and the model calls through OpenRouter, with results cached in Workers KV. Explanations are cached per connection, so the second person who clicks the same link between two types gets it instantly.
It’s free. You get a couple of suggestions a day, and more if you sign up for my newsletter.