DEV Community

OnePassApps
OnePassApps

Posted on Edited on

The App Layer of Our JSON-LD: 30 WebApplication Nodes, 8 Categories, and 115 Feature Strings in Two Grammars

I work on OnePassApps, so this is our own site's own structured data. Every number below was measured on app.onepassapps.com with plain HTTPS requests from one server - no browser session, no cookies, no JavaScript - on 9 November 2026, and every figure in it was re-measured the same way on 10 November 2026.

We have already written about the identifiers in our JSON-LD. This post is about the other half of those nodes: the fields that say what each app IS.

What I measured

  • The 56 URLs in our sitemap.xml
  • One plain GET each
  • The one application/ld+json block on each page, parsed as JSON, then every node in its graph

56 blocks, 0 parse errors, 255 nodes in total. Seven node types: Organization on 56 pages, WebSite on 56, WebPage on 54, BreadcrumbList on 55, WebApplication on 30, ItemList on 3 and CollectionPage on 1.

Thirty app nodes, on thirty pages

WebApplication is the type that describes a tool. It appears on 30 of the 56 pages - the home page, the 22 app pages and the 7 studio pages - exactly one node on each.

The other 26 pages carry none: the 23 guide pages, plus /voting, /plans and /terms.

Every one of the 30 nodes carries the same nine fields: type, id, name, url, description, applicationCategory, operatingSystem, browserRequirements and publisher.

Three fields that never vary

Three of those nine are a single value across all 30 nodes:

  • operatingSystem is "Web" on every one
  • browserRequirements is "Requires a modern web browser" on every one
  • publisher points at the same organization node on every one

The other three that carry text - name, url and description - are 30 distinct values each, across 30 nodes.

Eight categories, and four of them hold one app

applicationCategory takes 8 distinct values across the 30 nodes:

applicationCategory nodes
UtilitiesApplication 17
MultimediaApplication 4
BusinessApplication 3
DesignApplication 2
ReferenceApplication 1
EntertainmentApplication 1
EducationalApplication 1
SecurityApplication 1

Four of those eight are a category of one: NewsFlow is the only ReferenceApplication, MovieMatcherAI the only EntertainmentApplication, the Citation Formatter the only EducationalApplication and the Password Generator the only SecurityApplication.

Twenty-three subcategories, and seven that share one string

applicationSubCategory is on 29 of the 30 nodes and takes 23 distinct strings.

The seven studios all carry the same one, "Browser-local Studio". The 16 nodes that end in "Local utility" are the browser-local tools. The rest name their own trade: "Writing / Documents / Careers" for the CV Builder, "News / Briefs / Audio" for NewsFlow, "Personal / Media / Discovery" for MovieMatcherAI, "Writing / Research / Documents" for the Citation Formatter, "Writing / Work / Utility" for the Email Signature Builder and "Personal / Media / Planning" for the Screen & Cinema Planner.

The one node of the 30 with no applicationSubCategory at all is the home page's own node - the product as a whole rather than any single tool.

115 feature strings, in two grammars

featureList is on 29 nodes - every node except that home page one - and all 29 lists are different. They hold 115 strings in total.

They split cleanly into two grammars, and the split follows the studio/app line exactly:

  • The 7 studio lists are all short labels. Not one of their 49 strings is longer than 40 characters. The Image Studio's list is 7 words long: Convert, Compress, Resize, Crop, Remove background, Remove metadata, Images to PDF.
  • The 22 app lists are all sentences. Every one of their 66 strings is longer than 40 characters, and the shortest complete sentence runs to 49. NewsFlow's reads "Read concise briefs with source attribution and a route back to the original publication.", "Listen to the selected story, pause playback, and collect items in a listening queue." and "After signing in, manage the supported source catalogue; available brief and audio controls follow each source’s permissions."

Not a single list mixes the two. There is no node with one short label and one sentence.

The longest string in the whole set is 136 characters: "Make passwords of 8 to 128 characters with lower-case, upper-case, digit and symbol options, and optionally avoid look-alike characters.". The shortest is 4 characters: "Crop". The largest list is the Data Studio's, 11 items - CSV viewer, Sort / filter, Columns, Remove duplicates, Merge CSV, Split CSV, CSV to JSON, JSON formatter, JSON validator, JSON to CSV, JSON and YAML. The smallest lists have three items each, and there are 22 of them: every one of the 22 app pages carries exactly three. The seven studio lists run 4, 4, 7, 7, 8, 8 and 11 items.

Sixteen properties we do not publish

There are properties a WebApplication node can carry that ours never do. Across all 255 nodes, 16 of them never appear:

offers, screenshot, aggregateRating, softwareVersion, author, isAccessibleForFree, downloadUrl, installUrl, mainEntityOfPage, datePublished, review, softwareRequirements, permissions, potentialAction, applicationSize, memoryRequirements.

So there is no price in our structured data, no screenshot, no rating, no version number and no author, even for the hosted apps that have all of those things in the product.

What I did not measure

This is one server in one region, so it describes one vantage point on one day. I did not run a schema validator, I did not see how any search engine renders these graphs, and I did not check whether the fields we publish help or hurt. I did not compare the JSON-LD with the visible page. I changed nothing on the site.

If you want to look for yourself, start with the home page and read the application/ld+json block in the page source, then read the same block on one app page and one guide page and compare the three.

Our home page: https://app.onepassapps.com/?utm_source=devto&utm_medium=community&utm_campaign=jsonld-webapp-layer&utm_content=home-link

Our app guides: https://app.onepassapps.com/guides?utm_source=devto&utm_medium=community&utm_campaign=jsonld-webapp-layer&utm_content=guides-link

The identity half of these same graphs - which nodes carry an identifier, which ones carry none - is in our earlier post: https://dev.to/onepassapps/the-identity-layer-of-our-json-ld-54-distinct-ids-91-nodes-without-one-and-22-guide-pages-that-149m

Top comments (2)

Collapse
 
hanin_mp profile image
Hanin Mp •

Useful breakdown. On the 16 unpublished properties: as I read Google's software app documentation, the rich result needs offers plus either aggregateRating or review, so leaving them out means these pages are not eligible for it, whatever else is in the graph. That is a fine trade if you have no genuine rating data, since invented ratings are a policy risk. If any of the hosted apps do have real reviews, offers with a price of 0 and the real aggregateRating is the smallest change that would make one of them testable. Have you compared how the two feature grammars (labels vs sentences) get quoted in AI answers?

Collapse
 
onepassapps profile image
OnePassApps •

I work on OnePassApps, so this is our own site's structured data and our own call.

Your reading matches Google's Software App documentation as it stands today: the required properties are name, offers.price and one of aggregateRating or review, and Google does support WebApplication for web apps. What our pages carry is the name - the other two are among the 16 properties the post lists as ones we do not publish. That is the honest state of the graph.

On the rating half, your policy point is the one we applied. The only rating data we hold is inside MovieMatcherAI, where a signed-in person records private ratings, reviews and reactions on individual films. Those are ratings of films, not ratings of our apps, and they stay private to the person who wrote them - they cannot become an aggregateRating for an app node, and we do not publish a number we have not measured. An invented rating is exactly the policy risk you named.

On the offer, a price in the markup is a claim about what someone will pay, so it has to match what our plans page actually says, and adding one is a change to the markup that is not mine to make from a comment thread.

What I have not done is run the Rich Results Test against our pages or check how Google treats them, so I am not going to tell you our pages are or are not eligible for that result. I only measured what the graph contains.

On your second question - no, I have not compared how the two feature grammars get quoted in AI answers. The post measured the markup only: the seven studio lists are short labels, the 22 app lists are sentences, and no list mixes the two. How either shape reads back in a generated answer is a separate experiment, and I would rather run it properly than guess at it in a reply.

If you want to look yourself, the JSON-LD is in the page source of the home page, any app page and any guide page - compare those three.

Our home page: https://app.onepassapps.com/?utm_source=devto&utm_medium=community&utm_campaign=jsonld-webapp-layer&utm_content=reply-home-link

Our app guides: https://app.onepassapps.com/guides?utm_source=devto&utm_medium=community&utm_campaign=jsonld-webapp-layer&utm_content=reply-guides-link

⌂ 换网址