<?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: Dimitry Toronto Moscow</title>
    <description>The latest articles on DEV Community by Dimitry Toronto Moscow (@dimitry_torontomoscow_20).</description>
    <link>https://dev.to/dimitry_torontomoscow_20</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%2F4156309%2Fce213887-ab9c-435e-90ea-753ed3130b9b.jpg</url>
      <title>DEV Community: Dimitry Toronto Moscow</title>
      <link>https://dev.to/dimitry_torontomoscow_20</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dimitry_torontomoscow_20"/>
    <language>en</language>
    <item>
      <title>og:image not showing on LinkedIn? The 6 causes I check, in order</title>
      <dc:creator>Dimitry Toronto Moscow</dc:creator>
      <pubDate>Fri, 16 Oct 2026 15:18:25 +0000</pubDate>
      <link>https://dev.to/dimitry_torontomoscow_20/ogimage-not-showing-on-linkedin-the-6-causes-i-check-in-order-3394</link>
      <guid>https://dev.to/dimitry_torontomoscow_20/ogimage-not-showing-on-linkedin-the-6-causes-i-check-in-order-3394</guid>
      <description>&lt;p&gt;A missing or wrong link preview on LinkedIn, Slack, X or Facebook almost always comes down to one of six things. In the order I check them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The image is SVG.&lt;/strong&gt; None of LinkedIn, X or Facebook render SVG &lt;code&gt;og:image&lt;/code&gt;. Use PNG or JPG.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The URL is relative.&lt;/strong&gt; &lt;code&gt;og:image="/card.png"&lt;/code&gt; fails; crawlers need an absolute &lt;code&gt;https://&lt;/code&gt; URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The bot is blocked.&lt;/strong&gt; Cloudflare Bot Fight Mode / WAF rules often return 403 to &lt;code&gt;facebookexternalhit&lt;/code&gt; or &lt;code&gt;LinkedInBot&lt;/code&gt;. Check with &lt;code&gt;curl -sI -A "LinkedInBot/1.0" https://your.site/page&lt;/code&gt; and look in your CDN's security events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The image redirects or 404s.&lt;/strong&gt; The page can be fine while the image host blocks bots or redirects to a login.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size and type.&lt;/strong&gt; LinkedIn's large card wants ≥1200×627; declare &lt;code&gt;og:image:width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; so the first share renders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache.&lt;/strong&gt; Platforms cache the first scrape. Re-scrape in LinkedIn Post Inspector / Facebook Sharing Debugger after fixing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also: tags added by client-side JavaScript are invisible to most social bots, and &lt;code&gt;og:&lt;/code&gt; tags should use &lt;code&gt;property=&lt;/code&gt;, not &lt;code&gt;name=&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free lint for 1, 2, 5 and the markup mistakes
&lt;/h2&gt;

&lt;p&gt;I put the markup checks into a single page that runs in your browser (nothing is uploaded): paste your &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, get PASS/WARN/FAIL lines.&lt;br&gt;
→ &lt;strong&gt;&lt;a href="https://dimonch-byte.github.io/og-lint/" rel="noopener noreferrer"&gt;https://dimonch-byte.github.io/og-lint/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It can't see 3, 4 or 6, because those depend on what the crawler actually got back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;I build &lt;strong&gt;SharePack&lt;/strong&gt;. Its free check requests your page the way social bots do and shows what came back. If something's broken, the optional $29 one-time pack has corrected tags and a correctly sized image set for your page. It's not a design tool: &lt;a href="https://sharepack.adjudi.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=sharepack-intent-w2&amp;amp;utm_content=og-6-causes" rel="noopener noreferrer"&gt;https://sharepack.adjudi.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=sharepack-intent-w2&amp;amp;utm_content=og-6-causes&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>seo</category>
      <category>opengraph</category>
    </item>
    <item>
      <title>I checked 835 top homepages: a third ship no og:image, half no apple-touch-icon</title>
      <dc:creator>Dimitry Toronto Moscow</dc:creator>
      <pubDate>Mon, 12 Oct 2026 15:37:31 +0000</pubDate>
      <link>https://dev.to/dimitry_torontomoscow_20/i-checked-835-top-homepages-a-third-ship-no-ogimage-half-no-apple-touch-icon-hb7</link>
      <guid>https://dev.to/dimitry_torontomoscow_20/i-checked-835-top-homepages-a-third-ship-no-ogimage-half-no-apple-touch-icon-hb7</guid>
      <description>&lt;p&gt;On 2026-10-10 I requested the homepage of the first 1,500 domains in the Tranco list (one GET each, nothing else probed) and parsed the 835 that returned HTML. No per-site results kept or named.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;36% had no og:image; only 20.5% declared og:image width/height&lt;/li&gt;
&lt;li&gt;43% had no apple-touch-icon; 69% no web app manifest&lt;/li&gt;
&lt;li&gt;67% sent HSTS, 52% nosniff, 29% Referrer-Policy, 15% Permissions-Policy, 47% an enforced CSP (7% Report-Only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Big-site homepages are not typical small sites; read these as a floor.&lt;/p&gt;

&lt;p&gt;Fixes for each, with copy-paste config: &lt;a href="https://dimonch-byte.github.io/web-fix-notes/" rel="noopener noreferrer"&gt;https://dimonch-byte.github.io/web-fix-notes/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Free checkers (MIT, stdlib Python): og-lint-action, favicon-audit, headers-baseline on github.com/dimonch-byte.&lt;/p&gt;

&lt;p&gt;Disclosure: I build paid fix packs for some of these (SharePack for share cards). The data and checkers are free and work without them.&lt;/p&gt;

</description>
      <category>opengraph</category>
      <category>html</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
    <item>
      <title>CSP Report-Only is a safer first step than guessing an enforcement policy</title>
      <dc:creator>Dimitry Toronto Moscow</dc:creator>
      <pubDate>Fri, 02 Oct 2026 05:09:30 +0000</pubDate>
      <link>https://dev.to/dimitry_torontomoscow_20/csp-report-only-is-a-safer-first-step-than-guessing-an-enforcement-policy-22e4</link>
      <guid>https://dev.to/dimitry_torontomoscow_20/csp-report-only-is-a-safer-first-step-than-guessing-an-enforcement-policy-22e4</guid>
      <description>&lt;p&gt;I wanted a less dramatic way to start reviewing security headers on small sites.&lt;/p&gt;

&lt;p&gt;The usual advice jumps from “your headers need work” to a copied CSP that breaks analytics, fonts, embeds, or a login flow. That is not a great deployment plan. Content Security Policy is tied to the application’s real dependencies, so a policy that looks tidy in a snippet can still be wrong for the site running it.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;HeaderKit&lt;/strong&gt;: a $29 one-time pack oriented around &lt;strong&gt;CSP Report-Only&lt;/strong&gt; and common security headers. You review and apply the recommendations yourself. Nothing auto-enforces a CSP on your site.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Report-Only changes
&lt;/h2&gt;

&lt;p&gt;A Report-Only policy lets a browser report violations without using the policy to block the resource. That makes it useful for discovering what the application actually loads before deciding whether enforcement is appropriate.&lt;/p&gt;

&lt;p&gt;A small example is in this gist:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/dimonch-byte/d486c361974e0ff63d5f586f4894da79" rel="noopener noreferrer"&gt;View the HeaderKit example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It includes a &lt;code&gt;Content-Security-Policy-Report-Only&lt;/code&gt; example plus headers such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Referrer-Policy: strict-origin-when-cross-origin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Permissions-Policy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Frame-Options&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CSP example includes a placeholder report collector. That placeholder is intentional: reporting only helps if you choose a collector you control and understand what it receives. Do not paste a sample policy into production unchanged and assume it matches your framework or third-party services.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical review loop
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Inventory the scripts, styles, images, fonts, frames, and network calls your site really uses.&lt;/li&gt;
&lt;li&gt;Start with Report-Only and watch the violations during normal flows, including login and checkout if applicable.&lt;/li&gt;
&lt;li&gt;Remove dependencies you do not need, or decide explicitly which origins are trusted.&lt;/li&gt;
&lt;li&gt;Tighten the policy in stages, with a rollback path.&lt;/li&gt;
&lt;li&gt;Only consider enforcement after testing the application—not because a scanner produced a nice grade.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nonces, hashes, inline styles, third-party analytics, payment widgets, and embedded video all change the answer. There is no universal “copy these headers” block that can account for every stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What HeaderKit is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not a WAF.&lt;/strong&gt; It does not inspect or filter arbitrary traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not automatic CSP enforcement.&lt;/strong&gt; You choose what to deploy and when.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a compliance certification.&lt;/strong&gt; A header pack cannot certify an application or organization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a promise of an A or A+ scanner score.&lt;/strong&gt; Results depend on your stack and the configuration you actually ship.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is a reviewable starting point, not a lockdown claim. If you want to see the sample before deciding whether the workflow fits, the gist is public.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://headerkit.adjudi.com/?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=headerkit-2026-10-02" rel="noopener noreferrer"&gt;HeaderKit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/dimonch-byte/d486c361974e0ff63d5f586f4894da79" rel="noopener noreferrer"&gt;Example CSP Report-Only headers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>performance</category>
      <category>devops</category>
    </item>
    <item>
      <title>I wanted deny rules for common leak paths — not a zip of someone’s secrets</title>
      <dc:creator>Dimitry Toronto Moscow</dc:creator>
      <pubDate>Fri, 02 Oct 2026 05:09:17 +0000</pubDate>
      <link>https://dev.to/dimitry_torontomoscow_20/i-wanted-deny-rules-for-common-leak-paths-not-a-zip-of-someones-secrets-5hg6</link>
      <guid>https://dev.to/dimitry_torontomoscow_20/i-wanted-deny-rules-for-common-leak-paths-not-a-zip-of-someones-secrets-5hg6</guid>
      <description>&lt;p&gt;I kept seeing the same uncomfortable class of deployment mistake: a production host that still answers for &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;-shaped paths, source maps, or an old backup archive.&lt;/p&gt;

&lt;p&gt;The useful question is usually not “can I retrieve something interesting?” It is “are these paths reachable on a site I control, and what can I put in front of them before the next deploy?”&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;LeakDeny&lt;/strong&gt;: paste a URL you control → run a proof-style check → pay once → download a deny pack for common exposure paths. The pack is $29 one-time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the pack is for
&lt;/h2&gt;

&lt;p&gt;LeakDeny is deliberately narrow. It gives you host-level snippets and verification steps for patterns such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.git&lt;/code&gt; and similar repository paths&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt;-shaped paths&lt;/li&gt;
&lt;li&gt;JavaScript source maps (&lt;code&gt;.map&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;backup archives and database dumps&lt;/li&gt;
&lt;li&gt;a few common backup-file patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before any of that, check your own site for free. This status-only script requests ~18 well-known debris paths, peeks at the first 64 bytes in memory to separate real files from soft-404s, and &lt;strong&gt;never prints or saves response bodies&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;-fsSLO&lt;/span&gt; https://raw.githubusercontent.com/dimonch-byte/leakdeny-check/main/check-exposed-paths.sh
bash check-exposed-paths.sh https://your-site.example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo + free one-server nginx/.htaccess starter snippets: &lt;a href="https://github.com/dimonch-byte/leakdeny-check" rel="noopener noreferrer"&gt;https://github.com/dimonch-byte/leakdeny-check&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The intended workflow is boring, which is good: review the generated rules, apply them in the layer you actually operate, reload or redeploy, and verify that the paths return a denial response rather than &lt;code&gt;200 OK&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example, the check after deployment should be something like:&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;-sI&lt;/span&gt; https://your-domain.example/.git/HEAD
curl &lt;span class="nt"&gt;-sI&lt;/span&gt; https://your-domain.example/.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact status and routing depend on your host, proxy, CDN, and configuration. A &lt;code&gt;404&lt;/code&gt; or &lt;code&gt;403&lt;/code&gt; can be the desired result, but it is not proof that a file was never exposed in the past.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It is &lt;strong&gt;not&lt;/strong&gt; a WAF.&lt;/li&gt;
&lt;li&gt;It is &lt;strong&gt;not&lt;/strong&gt; a bug-bounty scanner for strangers’ domains.&lt;/li&gt;
&lt;li&gt;It does not remove a secret that was already committed or downloaded.&lt;/li&gt;
&lt;li&gt;It does not rotate credentials for you.&lt;/li&gt;
&lt;li&gt;It does not claim that a few deny rules equal a complete security review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a credential may have been exposed, rotate or revoke it separately. Blocking &lt;code&gt;/.env&lt;/code&gt; today does not make an old leaked token safe. Likewise, a deny rule is only useful if it is actually applied at the right layer and tested after a CDN or framework change.&lt;/p&gt;

&lt;p&gt;I also made a conscious decision about the proof asset: &lt;strong&gt;LeakDeny never packages secret contents&lt;/strong&gt;. The example gist contains path rules only. I would rather publish a small, reviewable configuration fragment than turn a security check into a mechanism for collecting or redistributing someone’s data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/dimonch-byte/leakdeny-check" rel="noopener noreferrer"&gt;Free check script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leakdeny.adjudi.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=leakdeny-first-sale-w2&amp;amp;utm_content=article-edit" rel="noopener noreferrer"&gt;LeakDeny — exact-path pack, $29 once&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use it on a URL you own or are authorized to test. The paid pack supports Apache/.htaccess and nginx directly, with manual snippets for Vercel and Netlify. On other hosts (Caddy, Cloudflare rules, managed platforms) the free starter snippets show the intent, but LeakDeny will tell you it's unsupported before you pay.&lt;/p&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>nginx</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Your site has no clean brief for AI agents — so I shipped a $19 four-file pack</title>
      <dc:creator>Dimitry Toronto Moscow</dc:creator>
      <pubDate>Fri, 02 Oct 2026 04:47:41 +0000</pubDate>
      <link>https://dev.to/dimitry_torontomoscow_20/your-site-has-no-clean-brief-for-ai-agents-so-i-shipped-a-19-four-file-pack-4e8h</link>
      <guid>https://dev.to/dimitry_torontomoscow_20/your-site-has-no-clean-brief-for-ai-agents-so-i-shipped-a-19-four-file-pack-4e8h</guid>
      <description>&lt;p&gt;I kept needing a &lt;strong&gt;short, honest brief&lt;/strong&gt; for AI tools crawling a small site — not another SEO dashboard, and not a promise that ChatGPT will cite me.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;CiteKit&lt;/strong&gt;: paste a public URL → free check → preview four files → $19 one-time zip via Paddle.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Spec-shaped &lt;code&gt;/llms.txt&lt;/code&gt; (editorial map, not a sitemap dump)&lt;/li&gt;
&lt;li&gt;Organization + FAQPage &lt;code&gt;schema.jsonld&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;FAQ drafts (&lt;code&gt;faq.md&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Stack README&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What it is &lt;strong&gt;not&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not rankings&lt;/li&gt;
&lt;li&gt;Not “get cited by ChatGPT/Perplexity”&lt;/li&gt;
&lt;li&gt;Not citation monitoring&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/llms.txt&lt;/code&gt; is a community convention, not a guarantee&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who it’s for
&lt;/h2&gt;

&lt;p&gt;Indie / small marketing sites (Next.js, Framer, Webflow, Carrd, Ghost, static hosts) that don’t already emit this via Yoast / Mintlify / GitBook.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://citekit.adjudi.com/?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=citekit-2026-10-02&amp;amp;utm_content=article" rel="noopener noreferrer"&gt;citekit.adjudi.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Example &lt;code&gt;/llms.txt&lt;/code&gt; shape: &lt;a href="https://gist.github.com/dimonch-byte/1c0e50c793c85239b3f03e7392bd5f7d" rel="noopener noreferrer"&gt;https://gist.github.com/dimonch-byte/1c0e50c793c85239b3f03e7392bd5f7d&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Operator: 9213651 Canada Inc. · Support: &lt;a href="mailto:idealstoronto@gmail.com"&gt;idealstoronto@gmail.com&lt;/a&gt; · MoR: Paddle&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>indiehackers</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
