<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Michael Taus</title>
    <description>The latest articles on DEV Community by Michael Taus (@miketaus).</description>
    <link>https://dev.to/miketaus</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1507033%2Fc281a2b5-c7c8-4692-af9b-5f5220ecd71a.jpg</url>
      <title>DEV Community: Michael Taus</title>
      <link>https://dev.to/miketaus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/miketaus"/>
    <language>en</language>
    <item>
      <title>A Markdown Twin for Every College Page, and What I Can't Prove About It</title>
      <dc:creator>Michael Taus</dc:creator>
      <pubDate>Mon, 26 Oct 2026 18:45:24 +0000</pubDate>
      <link>https://dev.to/miketaus/a-markdown-twin-for-every-college-page-and-what-i-cant-prove-about-it-3l0g</link>
      <guid>https://dev.to/miketaus/a-markdown-twin-for-every-college-page-and-what-i-cant-prove-about-it-3l0g</guid>
      <description>&lt;p&gt;Every college page I checked on helloaiko.co exists twice: as HTML for people and search engines, and as a Markdown file for search and answer bots. This post shows what one such pair looks like today, gives you a few &lt;code&gt;curl&lt;/code&gt; commands to check that a page and its twin agree, and says plainly what I can't prove.&lt;/p&gt;

&lt;p&gt;I'm Michael Taus. I'm building &lt;a href="https://helloaiko.co/" rel="noopener noreferrer"&gt;Aiko&lt;/a&gt;, a free AI college advisor, and these are its public college profiles. Everything I measured below was read on 2026-10-25, Pacific time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What one college has
&lt;/h2&gt;

&lt;p&gt;Take the University of Michigan-Ann Arbor. Its &lt;a href="https://helloaiko.co/c/university-of-michigan-ann-arbor" rel="noopener noreferrer"&gt;profile page&lt;/a&gt; has three neighbors, and all four URLs returned HTTP 200.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Size on 2026-10-25&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTML page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/c/university-of-michigan-ann-arbor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;about 29,600 bytes (my reads ranged from 29,217 to 29,900)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown twin&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/c/university-of-michigan-ann-arbor.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7,060 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llms.txt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/llms.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2,561 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sitemap&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/sitemap.xml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;209,443 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The HTML page.&lt;/strong&gt; The facts are in the visible tables of the raw response, so a client that doesn't run JavaScript still reads them. There is one JSON-LD block (CollegeOrUniversity, PostalAddress, PropertyValue). It is an identity card, not a fact sheet: name, URL, IPEDS UnitID, state, the college's own site, a logo and a photo. It carries none of the cost, admissions or enrollment figures. The canonical URL points at the page itself. The &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; has one &lt;code&gt;&amp;lt;link rel="alternate" type="text/markdown"&amp;gt;&lt;/code&gt; that points at the twin, and the response carries a matching &lt;code&gt;Link&lt;/code&gt; header.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Markdown twin.&lt;/strong&gt; It is about 24% of the HTML's size and holds the same facts as plain text: a heading, a one-line description, the UnitID, a Key facts list, a sources list and a citation line. Here is its cost block, unchanged from the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Average net price:**&lt;/span&gt; $13,138
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Average net price by family income:**&lt;/span&gt; Family income under $30k $1,043 · $30k–$48k $1,878 · $48k–$75k $4,895 · $75k–$110k $10,869 · $110k and up $26,517
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Net price data:**&lt;/span&gt; College Scorecard, academic year 2023-24
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Total cost before aid:**&lt;/span&gt; $34,782 in-state · $75,626 out-of-state
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Tuition:**&lt;/span&gt; $16,896 in-state · $57,740 out-of-state
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Housing &amp;amp; food:**&lt;/span&gt; $13,856
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Books &amp;amp; supplies:**&lt;/span&gt; $1,126
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Students on Pell grants:**&lt;/span&gt; 16% — federal aid for lower-income families
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Estimate your own price:**&lt;/span&gt; https://npc.collegeboard.org/app/umich
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The five income-group figures sit on one line of text, not in a table or in structured data. They are College Scorecard average net prices for the 2023-24 award year. The &lt;a href="https://collegescorecard.ed.gov/data/glossary/" rel="noopener noreferrer"&gt;Scorecard glossary&lt;/a&gt; defines net price as an average for students who receive federal aid and, at a public school like this one, for in-state students only. The twin labels that line "Average net price by family income", which is what the figures are: group averages.&lt;/p&gt;

&lt;p&gt;A naive diff of every number in both copies is noisy: the HTML has "typical for public four-year colleges" comparison notes and a program count that the twin lacks, and the twin prints the UnitID that the HTML keeps in its markup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;llms.txt.&lt;/strong&gt; It lists the five hubs, the two URL patterns (&lt;code&gt;/c/{slug}&lt;/code&gt; for HTML, &lt;code&gt;/c/{slug}.md&lt;/code&gt; for Markdown), the sitemap and a few example colleges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The sitemap.&lt;/strong&gt; It has 2,789 URLs: 2,509 college pages, 228 &lt;code&gt;/explore&lt;/code&gt; pages and some other site pages. It lists no &lt;code&gt;.md&lt;/code&gt; URL, which is a deliberate choice by the site's SEO owner: the HTML pages are the ones that need to be indexed first. One of the &lt;code&gt;/explore&lt;/code&gt; pages is &lt;a href="https://helloaiko.co/explore/size" rel="noopener noreferrer"&gt;Big school or small school&lt;/a&gt;, which splits every four-year college by undergraduate enrollment. The HTML page links to it and the other four hubs; the twin links to none of them. The twin gives Michigan's 33,730 undergraduates as one fact, and the hub is where a crawler or a person goes to find colleges of a similar size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the twin exists
&lt;/h2&gt;

&lt;p&gt;I built it so that the search and answer engines that fetch a page can read a college's facts without running JavaScript and without wading through navigation and layout. The site's robots.txt blocks AI training crawlers by name and allows the search and answer bots; the twin is for the second group. Each page now points at its twin twice, in a &lt;code&gt;&amp;lt;link rel="alternate"&amp;gt;&lt;/code&gt; tag in the head and in a &lt;code&gt;Link&lt;/code&gt; response header. That is a design intent, and it is all it is. I have no measurement that it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short test that a page and its twin agree
&lt;/h2&gt;

&lt;p&gt;Run these against any college slug. The results below are what I got against the live site on 2026-10-25 (Pacific time) for Michigan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://helloaiko.co/c/university-of-michigan-ann-arbor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;1. Both URLs answer.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;u &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;.md"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'%{http_code}\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$u&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both printed &lt;code&gt;200&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The key facts appear in both.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;u &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;.md"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"== &lt;/span&gt;&lt;span class="nv"&gt;$u&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$u&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oE&lt;/span&gt; &lt;span class="s1"&gt;'\$13,138|\$34,782|\$1,043|\$26,517|33,730'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each file contained all five strings: &lt;code&gt;$1,043&lt;/code&gt;, &lt;code&gt;$13,138&lt;/code&gt;, &lt;code&gt;$26,517&lt;/code&gt;, &lt;code&gt;$34,782&lt;/code&gt; and &lt;code&gt;33,730&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. One JSON-LD block, and a canonical that points at itself.&lt;/strong&gt; I use &lt;code&gt;grep -o | wc -l&lt;/code&gt; because &lt;code&gt;grep -c&lt;/code&gt; counts lines, not matches.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'application/ld+json'&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;link rel="canonical"[^&amp;gt;]*&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result was &lt;code&gt;1&lt;/code&gt;, and a canonical equal to the page's own URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The page is in the sitemap and the twin is not.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://helloaiko.co/sitemap.xml | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'university-of-michigan-ann-arbor'&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://helloaiko.co/sitemap.xml | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'\.md'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result was &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The page points at its twin.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; - &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'^link:'&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;link rel="alternate"[^&amp;gt;]*&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Michigan, the first printed a &lt;code&gt;link:&lt;/code&gt; header naming the &lt;code&gt;.md&lt;/code&gt; address with &lt;code&gt;rel="alternate"; type="text/markdown"&lt;/code&gt;, and the second printed a &lt;code&gt;&amp;lt;link rel="alternate" type="text/markdown" ...&amp;gt;&lt;/code&gt; tag with the same address. I also ran both on eight colleges picked at random from the sitemap. Each had the header and the tag, and each twin answered &lt;code&gt;200&lt;/code&gt; with &lt;code&gt;text/markdown&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Two lessons from running these. Test facts, not bytes: sizes move whenever the data does, so pin a short list of figures instead of a size or a full diff. And know what the test proves. Two surfaces that agree are consistent with each other. If both are wrong the same way, every check above still passes.&lt;/p&gt;

&lt;p&gt;I ran this on one college. To sample others, pick slugs from the sitemap and swap in figures from each school's own page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://helloaiko.co/sitemap.xml | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'https://helloaiko.co/c/[^&amp;lt;]*'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How much to trust this
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Measured on 2026-10-25 (Pacific time)&lt;/strong&gt;, by me from the live site and from copies saved that day: the HTTP statuses, the byte sizes, the sitemap counts, what the JSON-LD block contains, the response headers (the page answers &lt;code&gt;text/html; charset=utf-8&lt;/code&gt; and the twin &lt;code&gt;text/markdown; charset=utf-8&lt;/code&gt;, both with &lt;code&gt;cache-control: public, max-age=300, stale-while-revalidate=60&lt;/code&gt;, neither with an &lt;code&gt;X-Robots-Tag&lt;/code&gt; header, and Cloudflare does not cache them), the &lt;code&gt;Link&lt;/code&gt; header and the &lt;code&gt;&amp;lt;link rel="alternate"&amp;gt;&lt;/code&gt; tag on Michigan's page and on eight colleges picked at random, the twin's &lt;code&gt;200&lt;/code&gt; on those nine, the &lt;code&gt;.md&lt;/code&gt; references (two on the page, one in the head tag and one in the header; none in the sitemap), and the five matching figures on one college's page and twin. &lt;strong&gt;Measured by the site's SEO owner&lt;/strong&gt;, in their own live check: 80 of 80 colleges sampled at random from the sitemap returned 200 for both the page and the twin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A definition&lt;/strong&gt;, restated from the federal source: net price, in the Scorecard glossary linked above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design intent and opinion:&lt;/strong&gt; why the twin exists, and my advice to test facts rather than bytes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not measured:&lt;/strong&gt; whether any AI answer engine cites these pages; how many of them any search engine has indexed (I'm giving no count); whether anything fetches a twin or follows the alternate link; whether the page and twin AGREE on any page other than Michigan's, which leaves 2,508 other college pages untested for agreement (the 80-college sample checked only that both URLs answer); and whether the twin changes any outcome at all.&lt;/p&gt;

&lt;p&gt;If you run the commands against another slug and the two surfaces disagree, I'd like to know.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>webdev</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
