agentleFS
sitetillersitetiller/ai-visibility-skills/skills/schema/SKILL.md

schema

Skill0 starsChanged 2 days agoMITView on GitHub

Lint and plan structured data (JSON-LD) for a page: checks Google's required properties, flags Software application markup without aggregateRating or review, notes that FAQ rich results ended on 2026-05-07 and that HowTo is not in Google's gallery, picks types per page type, shows a valid @graph example, and ends with the Rich Results Test. Uses the schema and schema-gen commands. Use when the user says 'structured data', 'schema markup', 'JSON-LD', 'rich results', 'add schema', 'FAQ schema', 'SoftwareApplication schema', 'why no stars in Google'.

36 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use popups, paywalls and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • CesarjoquinSkill

    popups

    When the user wants to create or optimize popups, modals, overlays, slide-ins, or banners for conversion purposes. Also use when the user mentions "exit intent," "popup conversions," "modal optimization," "lead capture popup," "email popup," "announcement banner," "overlay," "collect emails with a popup," "exit popup," "scroll trigger," "sticky bar," or "notification bar." Use this for any overlay or interrupt-style conversion element. For forms outside of popups, see cro. For general page conversion optimization, see cro.

    Also in 8 projects that use this

  • CesarjoquinSkill

    paywalls

    When the user wants to create or optimize in-app paywalls, upgrade screens, upsell modals, or feature gates. Also use when the user mentions "paywall," "upgrade screen," "upgrade modal," "upsell," "feature gate," "convert free to paid," "freemium conversion," "trial expiration screen," "limit reached screen," "plan upgrade prompt," "in-app pricing," "free users won't upgrade," "trial to paid conversion," or "how do I get users to pay." Use this for any in-product moment where you're asking users to upgrade. Distinct from public pricing pages (see cro) — this focuses on in-product upgrade moments where the user has already experienced value. For pricing decisions, see pricing.

    Also in 8 projects that use this

  • tdiminoSkill

    sms

    Send, read, listen, respond, and manage SMS conversations via Telnyx and Twilio. Supports 8 phone numbers across both providers with auto-detection, conversation threading, MMS, real-time inbound listening, background watcher, batch reply processor, and soul-aware auto-reply. 10 Python scripts for SMS operations.

    Also in 8 projects that use this

  • timruebenachSkill

    directory-submissions

    When the user wants to submit their product to startup, SaaS, AI, agent, MCP, no-code, or review directories for backlinks, domain rating, and discovery. Also use when the user mentions "directory submissions," "submit to directories," "backlinks from directories," "list my product," "submit to Product Hunt," "BetaList," "TAAFT," "Futurepedia," "G2 listing," "Capterra listing," "AlternativeTo," "SaaSHub," "AI directories," "MCP registry," "agent directory," "dofollow backlinks," "launch directories," or "directory tracker." Use this whenever someone is planning the directory layer of a product launch or an ongoing backlink campaign. For the broader launch moment, see launch-strategy. For programmatic SEO pages that should live behind these backlinks, see programmatic-seo. For AI citation optimization, see ai-seo.

    Also in 8 projects that use this

  • roerohanSkill

    prospecting

    When the user wants to find, qualify, and build a list of prospects to reach out to — across B2B SaaS, general B2B, or local small businesses. Also use when the user mentions "prospecting," "build a prospect list," "find prospects," "find leads," "lead gen list," "find SaaS companies that," "find B2B companies," "find local businesses," "ICP-fit accounts," "who should we go after," "outbound list," "target account list," "find clients near me," "businesses without websites," "prospect research," "qualified leads," "find my first customers," "early adopters," "design partners," "beta users," or "who has this problem." Use this for the list-building and qualification phase. For writing the outbound copy after the list is built, see cold-email. For deep competitive research on specific accounts, see competitor-profiling.

    Also in 8 projects that use this

  • coreyhaines31Skill

    marketing-council

    When the user wants several expert takes on a marketing decision, or asks what a famous marketer would say about it: a simulated board (Seth Godin, David Ogilvy, April Dunford, Byron Sharp, and more), each grounded in their documented frameworks, where they disagree, and a recommendation. To execute, hand off to the relevant skill.

    Also in 5 projects that use this

  • +6 more from Cesarjoquin

The file

We split this skill into the rules it gives an agent

5 rules. 0 are common, 3 are distinctive, and 2 are very specific to this project.

  • 0

    Common

    Most of the 32 edited versions we read keep these.

  • 3

    Distinctive

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Write JSON-LD in one @graph per page, linked by @id.

    line 48
  2. Very specific:

    Put Organization and WebSite on the pages where they belong (homepage or all pages, one source), not as multiple copies.

    line 71
  3. Distinctive:

    Never invent ratings, review counts or prices.

    line 86
  4. Distinctive:

    Do not add FAQPage or HowTo markup expecting rich results.

    line 87
  5. Distinctive:

    Do not mark up content that is not visible on the page.

    line 88

“Common” is measured: kept by at least 6 in 10 of the 32 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Structured data: only what Google documents, only what is on the page

Google says structured data does not guarantee a rich result, and the markup must describe content visible on the page. The skill lints what is on a live page, recommends types per page type from Google's search gallery, and sends the final check to Google's Rich Results Test.

Inputs

  • The URL of a live page (or the user's draft JSON-LD to paste in a test page they own).
  • Page type: article, product or software page, comparison, homepage, tool.

Steps

  1. Lint:
    npx sitetiller schema https://example.com/guides/invoice-template --json
    Output: url, status, types (type to count) and findings (level error, warning or info; type; message; doc link). Errors are missing properties that Google documents as required for the rich result. Warnings are recommended properties or duplicated entities. Info lines mark features that no longer produce rich results.
  2. Interpret with the table.
FindingMeaningAction
Invalid JSON-LDThe block does not parse; Google cannot read itFix syntax (trailing commas, unescaped quotes)
SoftwareApplication missing offers.priceGoogle requires name and offers.price (use 0 for free; add priceCurrency for paid)Add the price shown on the page
SoftwareApplication missing aggregateRating or reviewGoogle says one of the two must be includedAdd genuine, visible user ratings, or do not use this type for rich results (see rules below)
Product missing review, aggregateRating or offersGoogle's product snippet needs one of them in addition to nameAdd from real data on the page
Article recommended propertiesGoogle lists no required properties for Article, only recommended onesAdd headline, image, datePublished, dateModified, author where true
FAQPage foundGoogle's FAQ rich results stopped appearing on 2026-05-07Keep the visible Q&A for readers; markup earns no Google rich result. Remove or leave, but do not add it for Google
HowTo foundNot in Google's structured data gallerySame as above; do not add for Google
More than one Organization, WebSite, Article, Product or SoftwareApplicationTheme and plugin both output itKeep one source, remove the duplicate
  1. Choose types by page type. Use a type only if the page really is that thing and the data is visible:
    Page typeUseNotes
    Blog post, guideArticle (or BlogPosting), BreadcrumbListArticle has no required properties; add author (name only in author.name, plus url or sameAs), datePublished, dateModified with timezone
    Homepage / aboutOrganization, WebSiteOrganization has no required properties; useful ones: name, url, logo, sameAs, contactPoint. WebSite can inform the site name
    SaaS product pageSoftwareApplication (or WebApplication)Requires name, offers.price, and aggregateRating or review. Only mark up ratings from real users that are visible on the page
    Physical or digital product with priceProductSee Google's product snippet doc
    Any page in a hierarchyBreadcrumbListAt least two ListItems, each with position, name, item (last item may omit item); trail should reflect a typical user path
    Video pageVideoObjectOnly for video actually on the page
    Comparison / alternatives pagesArticle + BreadcrumbList; do not use Review or AggregateRating for your own editorial scoring (see comparison-pages)
    FAQ, HowTonone for Google rich results
  2. Write JSON-LD in one @graph per page, linked by @id. Example for a guide page (replace every value with real, visible data):
    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@graph": [
        { "@type": "Organization", "@id": "https://example.com/#org", "name": "Example Inc.", "url": "https://example.com/", "logo": "https://example.com/logo.png", "sameAs": ["https://www.linkedin.com/company/example"] },
        { "@type": "WebSite", "@id": "https://example.com/#site", "url": "https://example.com/", "name": "Example", "publisher": { "@id": "https://example.com/#org" } },
        { "@type": "BreadcrumbList", "@id": "https://example.com/guides/invoice-template#crumbs", "itemListElement": [
          { "@type": "ListItem", "position": 1, "name": "Guides", "item": "https://example.com/guides" },
          { "@type": "ListItem", "position": 2, "name": "Invoice template" } ] },
        { "@type": "Article", "@id": "https://example.com/guides/invoice-template#article", "headline": "Invoice template with payment terms", "image": "https://example.com/img/invoice.png", "datePublished": "2026-10-01T09:00:00+00:00", "dateModified": "2026-11-05T09:00:00+00:00", "author": { "@type": "Person", "name": "Jane Doe", "url": "https://example.com/about/jane" }, "publisher": { "@id": "https://example.com/#org" }, "mainEntityOfPage": "https://example.com/guides/invoice-template" }
      ]
    }
    </script>
    To start from the user's facts instead of hand-writing, generate and lint in one step:
    npx sitetiller schema-gen article --headline "Invoice template with payment terms" --url https://example.com/guides/invoice-template --datePublished 2026-10-01T09:00:00+00:00 --author "Jane Doe" --publisher "Example Inc." --image https://example.com/img/invoice.png
    npx sitetiller schema-gen software --name "Example" --price 0 --currency USD --category BusinessApplication --os Web
    npx sitetiller schema-gen breadcrumb --items "Guides|https://example.com/guides,Invoice template|https://example.com/guides/invoice-template"
    Types: organization, website, article, product, software, localbusiness, breadcrumb, event, person. Empty inputs are left out, never filled with placeholders; the lint under the output lists what is still required or recommended. Ratings and reviews are never generated: --rating and similar inputs are ignored with a note, because they must come from real reviews visible on the page. Put Organization and WebSite on the pages where they belong (homepage or all pages, one source), not as multiple copies.
  3. Re-run the lint after editing. Then run Google's Rich Results Test on the URL (https://search.google.com/test/rich-results) and look at Search Console enhancement reports after Google recrawls. The lint is not a replacement for the test: it checks only the properties listed in this skill, not every Google rule.

Rules for eligibility

  • Markup must match visible content; reviews and ratings must be visible to users.
  • Ratings must come from users. Do not write reviews or ratings of your own product to mark up, and do not aggregate reviews from other sites.
  • Guideline violations can lead to a manual action, after which the structured data is ignored.

Output to the user

  1. Types found and findings by level, each quoting the message.
  2. Recommended types for this page type and why.
  3. The corrected JSON-LD, ready to paste, with the properties filled from visible page content only and TODO markers where data is missing.
  4. The Rich Results Test link and what to check afterwards.

Guardrails

  • Never invent ratings, review counts or prices. If a required value is not on the page, say the type cannot qualify.
  • Do not add FAQPage or HowTo markup expecting rich results.
  • Do not mark up content that is not visible on the page.
  • The lint covers a short list of types (Article, SoftwareApplication, Product, Event, LocalBusiness); for other types use Google's documentation and the Rich Results Test.
  • Edit only pages the user owns.

References

  • examples/schema.json, examples/schema-gen.json: real output of this skill's command on sitetiller.com (2026-11-13), see examples/README.md.
  • references/sources.md

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.