<?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: Prabhash</title>
    <description>The latest articles on DEV Community by Prabhash (@prabhash_me).</description>
    <link>https://dev.to/prabhash_me</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%2F4139255%2Fb60888a9-49b3-48d2-b954-cc63fa960405.png</url>
      <title>DEV Community: Prabhash</title>
      <link>https://dev.to/prabhash_me</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prabhash_me"/>
    <language>en</language>
    <item>
      <title>Sample files you can hotlink: 228 CC0 test fixtures with stable URLs</title>
      <dc:creator>Prabhash</dc:creator>
      <pubDate>Thu, 24 Sep 2026 10:11:29 +0000</pubDate>
      <link>https://dev.to/prabhash_me/sample-files-you-can-hotlink-228-cc0-test-fixtures-with-stable-urls-51gl</link>
      <guid>https://dev.to/prabhash_me/sample-files-you-can-hotlink-228-cc0-test-fixtures-with-stable-urls-51gl</guid>
      <description>&lt;p&gt;Every test suite that touches uploads eventually needs a real PDF, a video that seeks, a CSV with a broken row somewhere in it. Usually someone hotlinks a file from a random site, and a few months later it moves or changes and the test breaks for no reason.&lt;br&gt;
&lt;a href="https://loremfile.dev" rel="noopener noreferrer"&gt;loremfile.dev&lt;/a&gt; is 228 synthetic files across 78 formats, all CC0, served with CORS and byte ranges, with a SHA-256 for every file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it&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;-O&lt;/span&gt; https://loremfile.dev/pdf/a4-3pages.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verify it&lt;/strong&gt; (bytes at a published URL don't change):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;
&lt;span class="n"&gt;manifest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://loremfile.dev/manifest.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;manifest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fixtures&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pdf/a4-3pages.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://loremfile.dev/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sha256&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or all at once: &lt;em&gt;sha256sum -c sha256sums.txt --ignore-missing&lt;/em&gt; (macOS: &lt;em&gt;shasum -a 256 -c sha256sums.txt --ignore-missing&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edge cases, on purpose&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://loremfile.dev/edge/pdf-truncated-60pct.pdf" rel="noopener noreferrer"&gt;edge/pdf-truncated-60pct.pdf&lt;/a&gt;, &lt;a href="https://loremfile.dev/edge/jpg-truncated-50pct.jpg" rel="noopener noreferrer"&gt;edge/jpg-truncated-50pct.jpg&lt;/a&gt;, &lt;a href="https://loremfile.dev/edge/mp4-truncated-50pct.mp4" rel="noopener noreferrer"&gt;edge/mp4-truncated-50pct.mp4&lt;/a&gt;, &lt;a href="https://loremfile.dev/edge/zero-byte.csv" rel="noopener noreferrer"&gt;edge/zero-byte.csv&lt;/a&gt;, &lt;a href="https://loremfile.dev/edge/json-bom.json" rel="noopener noreferrer"&gt;edge/json-bom.json&lt;/a&gt;, &lt;a href="https://loremfile.dev/edge/json-trailing-comma.json" rel="noopener noreferrer"&gt;edge/json-trailing-comma.json&lt;/a&gt;, &lt;a href="https://loremfile.dev/edge/csv-ragged-rows.csv" rel="noopener noreferrer"&gt;edge/csv-ragged-rows.csv&lt;/a&gt;&lt;/em&gt; - 19 in total, for when you want to test that a parser fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One Limitation&lt;/strong&gt;:&lt;br&gt;
Around 30 requests/second per IP, 429 above that. A normal test suite should be fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it in GitHub Actions&lt;/strong&gt;&lt;br&gt;
Also supports direct integration with Github Actions. Every file gets checked against its hash, and the step fails if a byte's off:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kumarprabhashanand/loremfile/action@action-v1&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pdf/minimal.pdf mp4/720p-5s.mp4&lt;/span&gt;
    &lt;span class="na"&gt;formats&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;svg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How it's built&lt;/strong&gt;&lt;br&gt;
Everything's generated from synthetic data by open-source code (MIT) in a pinned container, pushed to Cloudflare R2, and archived as a GitHub release so anyone can mirror it. No accounts, cookies, or analytics. Claude agents did most of the design and implementation here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://loremfile.dev" rel="noopener noreferrer"&gt;https://loremfile.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>testing</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
