<?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: Quesby</title>
    <description>The latest articles on DEV Community by Quesby (@quesby).</description>
    <link>https://dev.to/quesby</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3620275%2F46cae68b-376c-489e-9355-e95af6fa5ddd.jpg</url>
      <title>DEV Community: Quesby</title>
      <link>https://dev.to/quesby</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/quesby"/>
    <language>en</language>
    <item>
      <title>Static Sites Without the Bloat: Quesby’s Approach to Modern Web Dev</title>
      <dc:creator>Quesby</dc:creator>
      <pubDate>Fri, 12 Dec 2025 14:00:00 +0000</pubDate>
      <link>https://dev.to/quesby/static-sites-without-the-bloat-quesbys-approach-to-modern-web-dev-51mn</link>
      <guid>https://dev.to/quesby/static-sites-without-the-bloat-quesbys-approach-to-modern-web-dev-51mn</guid>
      <description>&lt;p&gt;Modern web tooling is powerful—sometimes &lt;em&gt;too&lt;/em&gt; powerful for what most projects actually need.&lt;/p&gt;

&lt;p&gt;Frameworks today are engineered to handle broad, complex use cases: dynamic apps, interactive dashboards, real-time data, entire design systems running in the browser.&lt;/p&gt;

&lt;p&gt;Static sites sit on the opposite end of the spectrum.&lt;/p&gt;

&lt;p&gt;They rarely need that level of machinery, yet developers still feel the weight of choices designed for far larger problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quesby takes a different angle:&lt;/strong&gt; use only what serves a static site well, keep the workflow predictable, and avoid carrying tools that won’t be used.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Why Quesby Exists
&lt;/h2&gt;

&lt;p&gt;Most developers have lived this scenario: you start a simple website, open your tooling of choice, and suddenly you’re dealing with bundlers, configs, dependencies, and features that aren’t relevant to your project.&lt;/p&gt;

&lt;p&gt;Nothing wrong with those tools—they're built for ambitious apps.&lt;/p&gt;

&lt;p&gt;But when you're generating HTML pages, that ecosystem can become unnecessary overhead.&lt;/p&gt;

&lt;p&gt;Quesby focuses on the common needs of static sites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;predictable structure&lt;/li&gt;
&lt;li&gt;clean templates&lt;/li&gt;
&lt;li&gt;good SEO&lt;/li&gt;
&lt;li&gt;image optimization&lt;/li&gt;
&lt;li&gt;no hidden integrations&lt;/li&gt;
&lt;li&gt;no configuration sprawl&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It doesn't try to be a universal solution.&lt;/p&gt;

&lt;p&gt;It tries to be a &lt;em&gt;good&lt;/em&gt; one for a specific class of projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Design Principles
&lt;/h2&gt;

&lt;p&gt;Three core ideas shape Quesby:&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Use the Right Tool for the Job
&lt;/h3&gt;

&lt;p&gt;Quesby builds on &lt;strong&gt;Eleventy&lt;/strong&gt; because its philosophy fits the nature of static sites: generate HTML from templates, nothing more unless asked.&lt;/p&gt;

&lt;p&gt;No runtime attached.&lt;/p&gt;

&lt;p&gt;No front-end framework assumptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Keep the Surface Area Small
&lt;/h3&gt;

&lt;p&gt;Tools that don’t add value aren’t included.&lt;/p&gt;

&lt;p&gt;No analytics by default.&lt;/p&gt;

&lt;p&gt;No external fonts.&lt;/p&gt;

&lt;p&gt;No client-side libraries unless you opt in.&lt;/p&gt;

&lt;p&gt;The goal isn’t “minimalism for aesthetic reasons”.&lt;/p&gt;

&lt;p&gt;It’s “don’t ship or maintain what you don’t use”.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Make Everything Observable and Replaceable
&lt;/h3&gt;

&lt;p&gt;Quesby avoids black boxes.&lt;/p&gt;

&lt;p&gt;Every layer—content, templates, SEO, assets—lives in a place you can inspect and customize.&lt;/p&gt;

&lt;p&gt;If you want to extend it, nothing fights you.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. What Quesby Adds on Top of Eleventy
&lt;/h2&gt;

&lt;p&gt;Quesby doesn’t reinvent the Eleventy workflow.&lt;/p&gt;

&lt;p&gt;It refines it for real-world use.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Centralized SEO
&lt;/h3&gt;

&lt;p&gt;Front matter becomes a single source for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;meta tags&lt;/li&gt;
&lt;li&gt;OpenGraph&lt;/li&gt;
&lt;li&gt;Twitter Cards&lt;/li&gt;
&lt;li&gt;JSON-LD&lt;/li&gt;
&lt;li&gt;canonical URLs&lt;/li&gt;
&lt;li&gt;language alternates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of juggling separate plugins, Quesby consolidates the logic into a predictable module.&lt;/p&gt;

&lt;p&gt;You define SEO once in front matter:&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Static&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Sites&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Without&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Bloat"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Quesby&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;trims&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;modern&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tooling&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;down&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;what&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;static&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sites&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;actually&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;need."&lt;/span&gt;
&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/assets/images/posts/static-sites-without-the-bloat/cover.jpg"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quesby turns that into consistent markup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Static Sites Without the Bloat | Example Site&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"How Quesby trims modern tooling down to what static sites actually need."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Static Sites Without the Bloat"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/assets/images/posts/static-sites-without-the-bloat/cover.jpg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- ...additional structured data... --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 Image Handling That Makes Sense
&lt;/h3&gt;

&lt;p&gt;Eleventy Image is powerful but noisy.&lt;/p&gt;

&lt;p&gt;Quesby wraps it with defaults that handle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebP/AVIF output&lt;/li&gt;
&lt;li&gt;fallbacks&lt;/li&gt;
&lt;li&gt;modern markup&lt;/li&gt;
&lt;li&gt;lazy-loading&lt;/li&gt;
&lt;li&gt;deterministic filenames&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get the good parts without the friction.&lt;/p&gt;

&lt;p&gt;A typical image in a template might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight twig"&gt;&lt;code&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="nv"&gt;image&lt;/span&gt; &lt;span class="s2"&gt;"src/assets/images/posts/static-sites/cover.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Cover image for the article"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"article-cover"&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quesby handles responsive sources, formats, and attributes like &lt;code&gt;loading="lazy"&lt;/code&gt; for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 A Clean Content Workflow
&lt;/h3&gt;

&lt;p&gt;Markdown should stay Markdown.&lt;/p&gt;

&lt;p&gt;Quesby provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structured content directories&lt;/li&gt;
&lt;li&gt;automatic slugs&lt;/li&gt;
&lt;li&gt;ULID-based IDs&lt;/li&gt;
&lt;li&gt;predefined collections&lt;/li&gt;
&lt;li&gt;simple front matter rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing exotic. A workflow that doesn't collapse the moment you add pages.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 Adding a new article made easy
&lt;/h3&gt;

&lt;p&gt;Creating a new article is as simple as adding a file like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;src/content/posts/01HXYZABCD1234567890--my-first-post/index.md&lt;/code&gt;&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;01HXYZABCD1234567890&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;First&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Post"&lt;/span&gt;
&lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-first-post"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Short&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;summary&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;used&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;meta&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tags&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;previews."&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025-12-09T10:00:00.000Z"&lt;/span&gt;
&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/assets/images/posts/my-first-post/cover.jpg"&lt;/span&gt;
&lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;guide"&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;static-site"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eleventy"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seo"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Your Markdown content starts here.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it can be even easier by launching the helper:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quesby new post &lt;span class="s2"&gt;"title-of-the-article"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.5 A Boilerplate That Doesn’t Dictate Design
&lt;/h3&gt;

&lt;p&gt;The starter includes a neutral, accessible layout system you can extend or scrap entirely.&lt;/p&gt;

&lt;p&gt;It works out of the box for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;blogs&lt;/li&gt;
&lt;li&gt;landing pages&lt;/li&gt;
&lt;li&gt;docs sections&lt;/li&gt;
&lt;li&gt;mixed content sites&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you’re never locked into its visual identity.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Architecture: Predictable by Design
&lt;/h2&gt;

&lt;p&gt;The directory structure is intentionally boring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;src/
├─ _data/
│  └─ site.json
├─ _includes/
│  ├─ layouts/
│  └─ partials/
├─ assets/
│  ├─ css/
│  ├─ js/
│  └─ images/
├─ config/
│  ├─ collections.js
│  └─ taxonomies.js
├─ content/
│  ├─ media/
│  ├─ posts/
└─ themes/
   └─ quesby-core-theme/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No hidden pipelines, no magic directories.&lt;/p&gt;

&lt;p&gt;If you open the repo six months later, it still makes sense.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Performance: Not a Contest, Just Good Defaults
&lt;/h2&gt;

&lt;p&gt;Static sites are fast by default.&lt;/p&gt;

&lt;p&gt;Quesby ensures you don’t accidentally sabotage that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no unwanted JS&lt;/li&gt;
&lt;li&gt;minimal CSS&lt;/li&gt;
&lt;li&gt;optimized images&lt;/li&gt;
&lt;li&gt;zero cookies&lt;/li&gt;
&lt;li&gt;no external requests unless you add them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance isn’t a selling point—it’s a consequence.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Privacy by Default
&lt;/h2&gt;

&lt;p&gt;Quesby ships with zero third-party integrations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fewer external calls&lt;/li&gt;
&lt;li&gt;fewer legal requirements&lt;/li&gt;
&lt;li&gt;fewer performance penalties&lt;/li&gt;
&lt;li&gt;fewer surprises during audits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add analytics or embeds only when needed, not because the template assumed them.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Developer Experience: Stability Over Flashiness
&lt;/h2&gt;

&lt;p&gt;Quesby’s DX avoids two extremes:&lt;/p&gt;

&lt;p&gt;no sprawling configs, no “one-command magic” that hides everything.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a stable, understandable codebase&lt;/li&gt;
&lt;li&gt;modular configs&lt;/li&gt;
&lt;li&gt;predictable build behavior&lt;/li&gt;
&lt;li&gt;freedom to extend without digging through abstractions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DX should support development, not add ceremony around it.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Who Quesby Is For
&lt;/h2&gt;

&lt;p&gt;Quesby fits developers who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;build static or content-driven sites&lt;/li&gt;
&lt;li&gt;prefer explicit structure over convention-heavy automation&lt;/li&gt;
&lt;li&gt;want SEO and images solved without plugins everywhere&lt;/li&gt;
&lt;li&gt;like Eleventy but want an ecosystem around it&lt;/li&gt;
&lt;li&gt;want a workflow they can audit and override&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re building a full web app, you’ll want something else.&lt;/p&gt;

&lt;p&gt;If you’re building a website, this will probably feel more natural.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Static sites don’t need complicated tooling, but they do benefit from structure and good defaults.&lt;/p&gt;

&lt;p&gt;Quesby sits in that middle ground:&lt;/p&gt;

&lt;p&gt;lightweight, stable, and focused on solving the recurring problems of static-site development without dragging in an entire ecosystem built for different use cases.&lt;/p&gt;

&lt;p&gt;If that sounds like the right balance for your next project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm create quesby@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quesby doesn’t try to redefine web development.&lt;/p&gt;

&lt;p&gt;It just tries to make building websites feel sane again.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>quesby</category>
    </item>
    <item>
      <title>Markdown Style Guide: Best Practices for Content Creation</title>
      <dc:creator>Quesby</dc:creator>
      <pubDate>Tue, 09 Dec 2025 13:00:00 +0000</pubDate>
      <link>https://dev.to/quesby/markdown-style-guide-best-practices-for-content-creation-15nm</link>
      <guid>https://dev.to/quesby/markdown-style-guide-best-practices-for-content-creation-15nm</guid>
      <description>&lt;p&gt;Markdown has become the de facto standard for content creation in modern web development. Whether you're writing documentation, blog posts, or technical articles, understanding Markdown best practices ensures your content is readable, accessible, and maintainable.&lt;/p&gt;

&lt;p&gt;This style guide covers everything from basic formatting to advanced techniques, helping you create content that works seamlessly across different platforms and devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Text Formatting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Headers and Structure
&lt;/h3&gt;

&lt;p&gt;Use header hierarchy to create clear content structure:&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="gh"&gt;# Main Title (H1)&lt;/span&gt;
&lt;span class="gu"&gt;## Section Title (H2)&lt;/span&gt;
&lt;span class="gu"&gt;### Subsection (H3)&lt;/span&gt;
&lt;span class="gu"&gt;#### Minor Heading (H4)&lt;/span&gt;
&lt;span class="gu"&gt;##### Small Heading (H5)&lt;/span&gt;
&lt;span class="gu"&gt;###### Tiny Heading (H6)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best Practice&lt;/strong&gt;: Use only one H1 per document and maintain logical hierarchy. Don't skip heading levels.&lt;/p&gt;

&lt;h3&gt;
  
  
  Emphasis and Strong Text
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="ge"&gt;*This text is italic*&lt;/span&gt;
&lt;span class="ge"&gt;_This text is also italic_&lt;/span&gt;

&lt;span class="gs"&gt;**This text is bold**&lt;/span&gt;
&lt;span class="gs"&gt;__This text is also bold__&lt;/span&gt;

&lt;span class="gs"&gt;***This text is both bold and italic**&lt;/span&gt;&lt;span class="err"&gt;*&lt;/span&gt;
&lt;span class="gs"&gt;___This text is also both__&lt;/span&gt;_
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Accessibility Tip&lt;/strong&gt;: Use emphasis sparingly. Screen readers announce emphasis, so overuse can be distracting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lists and Organization
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Unordered Lists
&lt;/h4&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; First item
&lt;span class="p"&gt;-&lt;/span&gt; Second item
&lt;span class="p"&gt;  -&lt;/span&gt; Nested item
&lt;span class="p"&gt;  -&lt;/span&gt; Another nested item
&lt;span class="p"&gt;-&lt;/span&gt; Third item
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Ordered Lists
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;1.&lt;/span&gt; First step
&lt;span class="p"&gt;2.&lt;/span&gt; Second step
&lt;span class="p"&gt;   1.&lt;/span&gt; Sub-step
&lt;span class="p"&gt;   2.&lt;/span&gt; Another sub-step
&lt;span class="p"&gt;3.&lt;/span&gt; Third step
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Task Lists
&lt;/h4&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; [x] Completed task
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Pending task
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Another pending task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links and References
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic Links
&lt;/h3&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="nv"&gt;Link text&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Link with title&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com&lt;/span&gt; &lt;span class="nn"&gt;"Optional title"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reference Links
&lt;/h3&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="nv"&gt;Link text&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;reference-id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;reference-id&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="sx"&gt;https://example.com&lt;/span&gt; &lt;span class="nn"&gt;"Optional title"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Email Links
&lt;/h3&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="nv"&gt;Contact us&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;mailto:hello@example.com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best Practice&lt;/strong&gt;: Use descriptive link text. Avoid "click here" or "read more" as they don't provide context when read out of context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Images and Media
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic Image Syntax
&lt;/h3&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="nv"&gt;Alt text&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;image.jpg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Alt text&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;image.jpg&lt;/span&gt; &lt;span class="nn"&gt;"Optional title"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Responsive Images
&lt;/h3&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="nv"&gt;Alt text&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;image.jpg&lt;/span&gt; &lt;span class="nn"&gt;"Title"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Alt text&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;image-320.jpg&lt;/span&gt; &lt;span class="nn"&gt;"Title"&lt;/span&gt; width="320")
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Alt text&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;image-640.jpg&lt;/span&gt; &lt;span class="nn"&gt;"Title"&lt;/span&gt; width="640")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;: Always provide meaningful alt text. If an image is decorative, use empty alt text: &lt;code&gt;![](image.jpg)&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code and Technical Content
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Inline Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Use &lt;span class="sb"&gt;`console.log()`&lt;/span&gt; to output data to the browser console.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Code Blocks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;greetUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Syntax Highlighting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Welcome&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1200px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;package-name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fenced Code Blocks with Language
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"react"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^18.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tables and Data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic Table
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Column 1 | Column 2 | Column 3 |
|----------|----------|----------|
| Row 1    | Data 1   | Data 2   |
| Row 2    | Data 3   | Data 4   |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Aligned Table
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Left Aligned | Center Aligned | Right Aligned |
|:-------------|:--------------:|--------------:|
| Left         | Center         | Right         |
| Data         | Data           | Data          |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Complex Table
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Feature | Status | Notes |
|:--------|:------:|:------|
| Basic Auth | ✅ Complete | Works with all providers |
| OAuth 2.0 | 🚧 In Progress | Expected Q2 2024 |
| SSO | ❌ Planned | Not yet started |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Blockquotes and Callouts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic Blockquotes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gt"&gt;&amp;gt; This is a blockquote.&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; It can span multiple lines.&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; &lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; And include multiple paragraphs.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nested Blockquotes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gt"&gt;&amp;gt; This is a blockquote.&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; &lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; &amp;gt; This is a nested blockquote.&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; &amp;gt; It can be useful for replies or comments.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Blockquotes with Attribution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gt"&gt;&amp;gt; The best way to predict the future is to create it.&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; &lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; — Peter Drucker&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Horizontal Rules and Separators
&lt;/h2&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="ge"&gt;__&lt;/span&gt;_
&lt;span class="p"&gt;
- - -

* * *
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best Practice&lt;/strong&gt;: Use horizontal rules sparingly to avoid visual clutter. They work best for major section breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced Markdown Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strikethrough
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;~~This text is crossed out~~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Superscript and Subscript
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;H~2~O (subscript)
2^10^ = 1024 (superscript)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Highlighting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;==This text is highlighted==
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Footnotes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;This is a sentence with a footnote[^1].

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;^1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="sx"&gt;This&lt;/span&gt; is the footnote content.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Content Structure Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Use Descriptive Headers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;❌ Bad
&lt;span class="gu"&gt;## Stuff&lt;/span&gt;

✅ Good
&lt;span class="gu"&gt;## User Authentication Methods&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Keep Paragraphs Short
&lt;/h3&gt;

&lt;p&gt;Break up long paragraphs into digestible chunks. Aim for 2-3 sentences per paragraph on mobile devices.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Use Lists for Scannable Content
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;❌ Bad
The application supports multiple features including user authentication, data validation, error handling, and logging.

✅ Good
The application supports multiple features:
&lt;span class="p"&gt;-&lt;/span&gt; User authentication
&lt;span class="p"&gt;-&lt;/span&gt; Data validation  
&lt;span class="p"&gt;-&lt;/span&gt; Error handling
&lt;span class="p"&gt;-&lt;/span&gt; Logging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Include Table of Contents
&lt;/h3&gt;

&lt;p&gt;For longer documents, consider adding a table of contents:&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="gu"&gt;## Table of Contents&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Introduction&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;#introduction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Getting Started&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;#getting-started&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;#configuration&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Advanced Usage&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;#advanced-usage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Troubleshooting&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;#troubleshooting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Accessibility Guidelines
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Meaningful Alt Text
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;❌ Bad
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;photo.jpg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

✅ Good
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Screenshot of the login form showing username and password fields&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;login-form.jpg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Descriptive Link Text
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;❌ Bad
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Click here&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; for more information.

✅ Good
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Read our complete installation guide&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; for detailed setup instructions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Proper Heading Hierarchy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Main Title&lt;/span&gt;
&lt;span class="gu"&gt;## Section 1&lt;/span&gt;
&lt;span class="gu"&gt;### Subsection 1.1&lt;/span&gt;
&lt;span class="gu"&gt;### Subsection 1.2&lt;/span&gt;
&lt;span class="gu"&gt;## Section 2&lt;/span&gt;
&lt;span class="gu"&gt;### Subsection 2.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Platform-Specific Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub Flavored Markdown
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Supports task lists: &lt;code&gt;- [x] Completed task&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Supports tables with alignment&lt;/li&gt;
&lt;li&gt;Supports strikethrough: &lt;code&gt;~~text~~&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Supports syntax highlighting in code blocks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CommonMark
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;More standardized than GitHub Flavored Markdown&lt;/li&gt;
&lt;li&gt;Better cross-platform compatibility&lt;/li&gt;
&lt;li&gt;Supports most basic Markdown features&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Static Site Generators
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Many support front matter (YAML, TOML, JSON)&lt;/li&gt;
&lt;li&gt;Some support custom shortcodes or components&lt;/li&gt;
&lt;li&gt;Consider your target platform's specific features&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tools and Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Markdown Editors
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VS Code&lt;/strong&gt;: Built-in preview and extensions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typora&lt;/strong&gt;: WYSIWYG Markdown editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mark Text&lt;/strong&gt;: Real-time preview editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obsidian&lt;/strong&gt;: Note-taking with Markdown support&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Validation Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;markdownlint&lt;/strong&gt;: Lint Markdown files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;markdown-link-check&lt;/strong&gt;: Check for broken links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;textlint&lt;/strong&gt;: Advanced text linting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Online Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dillinger&lt;/strong&gt;: Online Markdown editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;StackEdit&lt;/strong&gt;: Advanced online editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown Live Preview&lt;/strong&gt;: Real-time preview&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Mistakes to Avoid
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Inconsistent Formatting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;❌ Bad
&lt;span class="p"&gt;-&lt;/span&gt; Item 1
&lt;span class="p"&gt;*&lt;/span&gt; Item 2
&lt;span class="p"&gt;-&lt;/span&gt; Item 3

✅ Good
&lt;span class="p"&gt;-&lt;/span&gt; Item 1
&lt;span class="p"&gt;-&lt;/span&gt; Item 2
&lt;span class="p"&gt;-&lt;/span&gt; Item 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Missing Alt Text
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;❌ Bad
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Screenshot&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;image.jpg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

✅ Good
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Screenshot of the dashboard showing user statistics&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;dashboard.jpg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Poor Link Text
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;❌ Bad
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Here&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; is the documentation.

✅ Good
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Complete API documentation&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; is available online.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Inconsistent Header Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;❌ Bad
&lt;span class="gh"&gt;# Title&lt;/span&gt;
&lt;span class="gu"&gt;### Subtitle&lt;/span&gt;
&lt;span class="gu"&gt;## Another Section&lt;/span&gt;

✅ Good
&lt;span class="gh"&gt;# Title&lt;/span&gt;
&lt;span class="gu"&gt;## Subtitle&lt;/span&gt;
&lt;span class="gu"&gt;## Another Section&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Mastering Markdown is about more than just syntax—it's about creating content that is accessible, maintainable, and user-friendly. By following these best practices, you'll create documentation and content that serves your users well across all platforms and devices.&lt;/p&gt;

&lt;p&gt;Remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt; is key to maintainable content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility&lt;/strong&gt; should be considered from the start&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structure&lt;/strong&gt; helps both humans and machines understand your content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt; your Markdown across different platforms ensures compatibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start implementing these practices in your next piece of content, and you'll see immediate improvements in readability and maintainability.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>markdown</category>
    </item>
    <item>
      <title>Why Eleventy Still Matters in 2026 (and Why Quesby Builds on It)</title>
      <dc:creator>Quesby</dc:creator>
      <pubDate>Fri, 05 Dec 2025 20:16:14 +0000</pubDate>
      <link>https://dev.to/quesby/why-eleventy-still-matters-in-2026-and-why-quesby-builds-on-it-38cf</link>
      <guid>https://dev.to/quesby/why-eleventy-still-matters-in-2026-and-why-quesby-builds-on-it-38cf</guid>
      <description>&lt;p&gt;Over the last few years, the web development ecosystem has gone through a predictable cycle: &lt;br&gt;
a shiny new JavaScript meta-framework appears, becomes the “new standard,” grows in complexity, and often ends up forcing developers into migrations they didn’t ask for.&lt;/p&gt;

&lt;p&gt;Yet one tool has remained consistently fast, stable, and free from bloat: &lt;strong&gt;Eleventy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In 2026, with more developers reconsidering their stacks, Eleventy isn’t just relevant — it’s strategically important. And it’s the foundation of &lt;strong&gt;Quesby&lt;/strong&gt; for a reason.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. For Many Sites, the Web Didn’t Need More JavaScript — It Possibly Needed Less&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Many modern frameworks promise DX, then — especially for content-driven sites — bury you under:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;massive dependency trees&lt;/li&gt;
&lt;li&gt;bundlers, dev servers, compilers&lt;/li&gt;
&lt;li&gt;countless edge runtimes&lt;/li&gt;
&lt;li&gt;plugin ecosystems that break with every release&lt;/li&gt;
&lt;li&gt;lock-in designed to keep you on their platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eleventy takes a different path for these cases: no client-side framework, no hydration ceremony, no runtime tax.&lt;/p&gt;

&lt;p&gt;Just HTML, templates, Markdown, and a build pipeline that stays out of your way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Less to debug. Less to update. Less to break — particularly when your site is mostly content.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This feels closer to Web Development 101 than to yet another reinvention.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. Static Sites Are Not “Old School” — They’re the Performance Baseline&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Static sites age well.&lt;/p&gt;

&lt;p&gt;They’re cache-friendly, CDN-first, stable, and require almost no infrastructure.&lt;/p&gt;

&lt;p&gt;In a world where Core Web Vitals dictate traffic, static HTML isn’t nostalgia — it’s often a competitive advantage for a large class of sites.&lt;/p&gt;

&lt;p&gt;Eleventy excels because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it outputs plain HTML&lt;/li&gt;
&lt;li&gt;it avoids unnecessary client-side JS&lt;/li&gt;
&lt;li&gt;it gives you full control over markup&lt;/li&gt;
&lt;li&gt;it integrates perfectly with modern CDNs and edge deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If performance matters and your site is mostly content, static is often one of the simplest ways to win.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. Eleventy’s Flexibility Makes It a Strong Foundation Compared to Many Meta-Frameworks&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Most frameworks force you into one paradigm.&lt;/p&gt;

&lt;p&gt;Eleventy doesn’t care how you work.&lt;/p&gt;

&lt;p&gt;You can structure your site with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nunjucks&lt;/li&gt;
&lt;li&gt;Markdown&lt;/li&gt;
&lt;li&gt;Liquid&lt;/li&gt;
&lt;li&gt;JavaScript templates&lt;/li&gt;
&lt;li&gt;11ty Data Cascade&lt;/li&gt;
&lt;li&gt;custom content generators&lt;/li&gt;
&lt;li&gt;arbitrary folder structures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This flexibility is why Quesby builds on Eleventy instead of reinventing the wheel.&lt;/p&gt;

&lt;p&gt;Quesby simply adds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;opinionated conventions&lt;/li&gt;
&lt;li&gt;predictable content structures&lt;/li&gt;
&lt;li&gt;a fully wired documentation system&lt;/li&gt;
&lt;li&gt;soft-defaults for SEO, images, metadata, and accessibility&lt;/li&gt;
&lt;li&gt;a zero-noise build pipeline&lt;/li&gt;
&lt;li&gt;clear extension points&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eleventy is the engine.&lt;/p&gt;

&lt;p&gt;Quesby is the chassis that makes it production-ready from day one.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Stability Beats Churn (Especially in 2026)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Framework churn is a tax:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;new major versions every year&lt;/li&gt;
&lt;li&gt;breaking changes&lt;/li&gt;
&lt;li&gt;migration guides&lt;/li&gt;
&lt;li&gt;refactoring half your codebase just to stay compatible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eleventy largely sidesteps this problem in day-to-day work.&lt;/p&gt;

&lt;p&gt;Its release cycle is slow, conservative, and stable.&lt;/p&gt;

&lt;p&gt;Quesby builds on that foundation to give you something you can rely on long-term — without spending your life migrating configs.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. Eleventy Is a Great Fit for Content-Centric Sites&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Not every site needs React.&lt;/p&gt;

&lt;p&gt;Not every site needs hydration.&lt;/p&gt;

&lt;p&gt;Not every site needs a client-side application.&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;every site needs content&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Eleventy shines for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;blogs&lt;/li&gt;
&lt;li&gt;documentation portals&lt;/li&gt;
&lt;li&gt;landing pages&lt;/li&gt;
&lt;li&gt;marketing sites&lt;/li&gt;
&lt;li&gt;knowledge bases&lt;/li&gt;
&lt;li&gt;simple product sites&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quesby builds on this strength by providing a ready-made environment for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Markdown-based content&lt;/li&gt;
&lt;li&gt;auto-generated sitemaps and feeds&lt;/li&gt;
&lt;li&gt;automatic metadata + JSON-LD&lt;/li&gt;
&lt;li&gt;documentation layouts and navigation&lt;/li&gt;
&lt;li&gt;responsive images and inline SVG helpers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It removes the overhead so the developer can focus on building — not configuring.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;6. A Framework Should Be Invisible, Not the Star of the Show&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The best tool is the one that gets out of your way.&lt;/p&gt;

&lt;p&gt;Eleventy’s simplicity makes it one of the few modern SSGs that doesn’t try to own your workflow.&lt;/p&gt;

&lt;p&gt;Quesby’s philosophy is identical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no proprietary ecosystem&lt;/li&gt;
&lt;li&gt;no vendor lock-in&lt;/li&gt;
&lt;li&gt;no magic that hides what’s really happening&lt;/li&gt;
&lt;li&gt;no external dependencies&lt;/li&gt;
&lt;li&gt;no bundle&lt;/li&gt;
&lt;li&gt;no JS-heavy boilerplate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just clean, predictable output.&lt;/p&gt;

&lt;p&gt;Here I'll include an example of a live website made exclusively in Quesby.&lt;br&gt;
Real-world performance: quesby.dev achieves Lighthouse 94 with minimal JavaScript (12.2 KB) and near-zero external dependencies (3.14 KB third-party). This is what 'no bundle' and 'no external dependencies' look like in practice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F755l6rvz2lnmg7lqst2i.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F755l6rvz2lnmg7lqst2i.webp" alt=" " width="800" height="1606"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion: Eleventy Hasn’t Just Survived — It’s Become a Benchmark&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The web doesn’t need more heavy frameworks.&lt;/p&gt;

&lt;p&gt;It needs tools that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;respect the platform&lt;/li&gt;
&lt;li&gt;build fast&lt;/li&gt;
&lt;li&gt;ship fast&lt;/li&gt;
&lt;li&gt;age well&lt;/li&gt;
&lt;li&gt;don’t hijack your architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eleventy fits that role better in 2026 than ever before.&lt;/p&gt;

&lt;p&gt;And Quesby builds on it because the goal isn’t to reinvent the stack — it’s to deliver a clean, efficient, production-ready way to use the best parts of the web as they already are.&lt;/p&gt;

&lt;p&gt;If you’re tired of the noise, the churn, and the complexity, Eleventy remains the most sensible foundation.&lt;/p&gt;

&lt;p&gt;Quesby just makes it easier to use.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>discuss</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Quick Start: Eleventy Shortcodes for Responsive Images &amp; Inline SVG</title>
      <dc:creator>Quesby</dc:creator>
      <pubDate>Wed, 03 Dec 2025 19:00:00 +0000</pubDate>
      <link>https://dev.to/quesby/quick-start-eleventy-shortcodes-for-responsive-images-inline-svg-2pad</link>
      <guid>https://dev.to/quesby/quick-start-eleventy-shortcodes-for-responsive-images-inline-svg-2pad</guid>
      <description>&lt;p&gt;This guide shows how to add two production-ready shortcodes to Eleventy (ESM): a responsive image helper using &lt;code&gt;@11ty/eleventy-img&lt;/code&gt; and an inline SVG helper that lets you inject CSS classes.&lt;/p&gt;

&lt;p&gt;Here’s the final output generated in the DOM (fully handled by the shortcode):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/avif"&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"/img/hero_320.avif 320w, ..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/webp"&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"/img/hero_320.webp 320w, ..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/img/hero_original.webp"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Site cover image"&lt;/span&gt; &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"lazy"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;Follow these steps to get ready-to-use shortcodes in minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install dependency
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm i @11ty/eleventy-img
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create the shortcodes module at &lt;code&gt;eleventy/shortcodes/media.js&lt;/code&gt; (see below)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Register it in &lt;code&gt;eleventy.config.js&lt;/code&gt; and rebuild&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use &lt;code&gt;{% image %}&lt;/code&gt; for responsive images and &lt;code&gt;{% svg %}&lt;/code&gt; for inline SVG in your Nunjucks templates&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;The &lt;code&gt;{% image %}&lt;/code&gt; shortcode outputs a &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element with AVIF/WebP sources, responsive widths, lazy loading, and decoding hints—all preconfigured for production use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Eleventy v2+ or v3 with ESM config.&lt;/li&gt;
&lt;li&gt;Nunjucks templates (examples use &lt;code&gt;{% %}&lt;/code&gt; tags).&lt;/li&gt;
&lt;li&gt;Project layout with assets under &lt;code&gt;src/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example folders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
  assets/
    images/
    icons/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @11ty/eleventy-img
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Shortcodes module
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;eleventy/shortcodes/media.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:fs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@11ty/eleventy-img&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/** Responsive image (async) */&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;imageShortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sizes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100vw&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Missing alt for &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Normalize to src/assets/images/&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;normalized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\/?&lt;/span&gt;&lt;span class="sr"&gt;src&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;assets&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;images&lt;/span&gt;&lt;span class="se"&gt;\/?&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resolved&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;src/assets/images&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;normalized&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nc"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolved&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;widths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;960&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="c1"&gt;// null =&amp;gt; original width&lt;/span&gt;
    &lt;span class="na"&gt;formats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;avif&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;            &lt;span class="c1"&gt;// add "jpeg" if you want a fallback&lt;/span&gt;
    &lt;span class="na"&gt;outputDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./_site/img/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;urlPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/img/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;figure&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generateHTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;sizes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lazy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;decoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;async&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/figure&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/** Inline SVG with optional class */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;svgShortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;svgPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;svgPath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\/?&lt;/span&gt;&lt;span class="sr"&gt;src&lt;/span&gt;&lt;span class="se"&gt;\/?&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// keep paths under src/&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;svg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;svg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Append or set class on the opening &amp;lt;svg ...&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hasClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/&amp;lt;svg&lt;/span&gt;&lt;span class="se"&gt;([^&lt;/span&gt;&lt;span class="sr"&gt;&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;?)\s&lt;/span&gt;&lt;span class="sr"&gt;class="&lt;/span&gt;&lt;span class="se"&gt;([^&lt;/span&gt;&lt;span class="sr"&gt;"&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;"/i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;svg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hasClass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;svg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="sr"&gt;/&amp;lt;svg&lt;/span&gt;&lt;span class="se"&gt;([^&lt;/span&gt;&lt;span class="sr"&gt;&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;?)\s&lt;/span&gt;&lt;span class="sr"&gt;class="&lt;/span&gt;&lt;span class="se"&gt;([^&lt;/span&gt;&lt;span class="sr"&gt;"&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;"&lt;/span&gt;&lt;span class="se"&gt;([^&lt;/span&gt;&lt;span class="sr"&gt;&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;&amp;gt;/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;svg&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; class="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;`&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;svg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&amp;lt;svg&lt;/span&gt;&lt;span class="se"&gt;([^&lt;/span&gt;&lt;span class="sr"&gt;&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;&amp;gt;/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;svg$1 class="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addNunjucksAsyncShortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;imageShortcode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addNunjucksShortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;svgShortcode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Register in Eleventy config
&lt;/h2&gt;

&lt;p&gt;In &lt;code&gt;eleventy.config.js&lt;/code&gt; (ESM):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mediaShortcodes&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./eleventy/shortcodes/media.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eleventyConfig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;eleventyConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addPlugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mediaShortcodes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage in Nunjucks
&lt;/h2&gt;

&lt;p&gt;Responsive image (async shortcode):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight twig"&gt;&lt;code&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="nv"&gt;image&lt;/span&gt; &lt;span class="s2"&gt;"hero/cover.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Site cover image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"(min-width: 768px) 75vw, 100vw"&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inline SVG with a custom class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight twig"&gt;&lt;code&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="nv"&gt;svg&lt;/span&gt; &lt;span class="s2"&gt;"assets/icons/github.svg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"icon-lg text-neutral-700"&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Alternative: expression style
&lt;/h3&gt;

&lt;p&gt;If you prefer &lt;code&gt;{{ ... }}&lt;/code&gt; output for SVG, also register:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// in the plugin function&lt;/span&gt;
&lt;span class="nx"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addShortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;svgShortcode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight twig"&gt;&lt;code&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;svg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"assets/icons/github.svg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"icon-lg"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;| &lt;/span&gt;&lt;span class="nf"&gt;safe&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting and notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;“Unable to call ‘svg’…”&lt;/strong&gt; means you registered with &lt;code&gt;addShortcode&lt;/code&gt; but used &lt;code&gt;{% svg %}&lt;/code&gt;. Use &lt;code&gt;addNunjucksShortcode&lt;/code&gt; for tag syntax.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paths&lt;/strong&gt;: keep inputs relative to &lt;code&gt;src/…&lt;/code&gt;. The module normalizes &lt;code&gt;src/assets/images/...&lt;/code&gt; automatically for images and &lt;code&gt;src/...&lt;/code&gt; for SVGs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility&lt;/strong&gt;: &lt;code&gt;alt&lt;/code&gt; is required. Use empty &lt;code&gt;alt&lt;/code&gt; only for decorative images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallbacks&lt;/strong&gt;: if you need a bitmap fallback, add &lt;code&gt;"jpeg"&lt;/code&gt; to &lt;code&gt;formats&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching&lt;/strong&gt;: &lt;code&gt;@11ty/eleventy-img&lt;/code&gt; caches processed assets. Commit the cache if you want stable builds in CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additional tips:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ESM vs CJS configs&lt;/strong&gt;: This example assumes ESM. If you are on CommonJS, adapt imports/exports accordingly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows paths&lt;/strong&gt;: Prefer &lt;code&gt;path.resolve&lt;/code&gt; and avoid hardcoded backslashes. The provided code handles normalization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External URLs&lt;/strong&gt;: The shortcode expects local files. For remote images, download them during build or provide a local copy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Minimal CSS example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.icon-lg&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Commit message template
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;feat&lt;span class="o"&gt;(&lt;/span&gt;shortcodes&lt;span class="o"&gt;)&lt;/span&gt;: add responsive image and inline SVG helpers &lt;span class="o"&gt;(&lt;/span&gt;Nunjucks, ESM&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>tutorial</category>
      <category>webdev</category>
      <category>performance</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How Quesby Handles SEO (Without Plugins, Frameworks, or Runtime Code)</title>
      <dc:creator>Quesby</dc:creator>
      <pubDate>Tue, 02 Dec 2025 13:00:00 +0000</pubDate>
      <link>https://dev.to/quesby/how-quesby-handles-seo-without-plugins-frameworks-or-runtime-code-251</link>
      <guid>https://dev.to/quesby/how-quesby-handles-seo-without-plugins-frameworks-or-runtime-code-251</guid>
      <description>&lt;h2&gt;
  
  
  Automatic Metadata, Open Graph, and JSON-LD — Eleventy Style
&lt;/h2&gt;

&lt;p&gt;Most Eleventy setups start the same way: every project re-implements SEO from scratch.&lt;br&gt;&lt;br&gt;
Another &lt;code&gt;base.njk&lt;/code&gt;, another batch of &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags, another copy-pasted JSON-LD snippet from schema.org.&lt;/p&gt;

&lt;p&gt;It’s boring, error-prone, and inconsistent across projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quesby solves this the only sane way: one SEO model, one source of truth, generated at build time.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No plugins.&lt;br&gt;&lt;br&gt;
No runtime.&lt;br&gt;&lt;br&gt;
No React components disguised as SEO helpers.&lt;/p&gt;

&lt;p&gt;This is how it works.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Idea in 10 Seconds
&lt;/h2&gt;

&lt;p&gt;Quesby takes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;site.json + frontmatter → SEO model → complete &amp;lt;head&amp;gt; + JSON-LD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything happens during the Eleventy build.&lt;br&gt;&lt;br&gt;
Templates stay clean.&lt;br&gt;&lt;br&gt;
SEO stays consistent.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;base.njk&lt;/code&gt;, it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight twig"&gt;&lt;code&gt;&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;seoModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;page&lt;/span&gt; &lt;span class="o"&gt;| &lt;/span&gt;&lt;span class="nf"&gt;seoModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pageData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;seoModel&lt;/span&gt; &lt;span class="o"&gt;| &lt;/span&gt;&lt;span class="nf"&gt;seoHeadHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;site&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;| &lt;/span&gt;&lt;span class="nf"&gt;safe&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;seoModel&lt;/span&gt; &lt;span class="o"&gt;| &lt;/span&gt;&lt;span class="nf"&gt;seoJsonLd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;site&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;| &lt;/span&gt;&lt;span class="nf"&gt;safe&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s the entire integration surface.&lt;/p&gt;




&lt;h2&gt;
  
  
  Site-Level Defaults (One File)
&lt;/h2&gt;

&lt;p&gt;Global SEO config lives in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/_data/site.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Quesby"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://quesby.dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A modern Eleventy boilerplate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"socialImage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/assets/images/og-default.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"twitter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@quesby"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en-US"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quesby uses this for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;default description&lt;/li&gt;
&lt;li&gt;default Open Graph image&lt;/li&gt;
&lt;li&gt;canonical URL generation&lt;/li&gt;
&lt;li&gt;Twitter Card data&lt;/li&gt;
&lt;li&gt;JSON-LD publisher info&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You define it once.&lt;br&gt;&lt;br&gt;
Every page inherits it automatically.&lt;/p&gt;


&lt;h2&gt;
  
  
  Frontmatter: Minimal When You Want, Detailed When You Need
&lt;/h2&gt;

&lt;p&gt;Simple page:&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Page"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Short&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;summary."&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full blog post:&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Build&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Better&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Websites"&lt;/span&gt;
&lt;span class="na"&gt;seoTitle&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Complete&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Guide&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Modern&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Web&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Development"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Learn&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;principles&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;behind&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fast,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;accessible&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;websites."&lt;/span&gt;
&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/assets/images/cover.jpg"&lt;/span&gt;
&lt;span class="na"&gt;postType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;article"&lt;/span&gt;
&lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;John&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Doe"&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-01-15"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quesby applies fallback rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Title: &lt;code&gt;`seoTitle` → `title` → `site.name`&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Description: &lt;code&gt;`description` → `site.description`&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Image: &lt;code&gt;`image` → `site.socialImage`&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t repeat yourself.&lt;br&gt;&lt;br&gt;
Pages don’t need boilerplate.&lt;/p&gt;


&lt;h2&gt;
  
  
  Automatic Head Metadata
&lt;/h2&gt;

&lt;p&gt;From the SEO model, Quesby generates:&lt;/p&gt;
&lt;h3&gt;
  
  
  Basic SEO
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;meta name="description"&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;link rel="canonical"&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;meta name="robots"&amp;gt;&lt;/code&gt; (with &lt;code&gt;noindex&lt;/code&gt; support)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Open Graph
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;og:type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;og:title&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;og:description&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;og:url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;og:image&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Twitter Cards
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;`twitter:card`&lt;/code&gt; (&lt;code&gt;`summary_large_image`&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;`twitter:site`&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;`twitter:title`&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;`twitter:description`&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;`twitter:image`&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No manual tags.&lt;br&gt;&lt;br&gt;
No plugin configuration.&lt;br&gt;&lt;br&gt;
No React component SEO helper nonsense.&lt;/p&gt;


&lt;h2&gt;
  
  
  JSON-LD Structured Data
&lt;/h2&gt;

&lt;p&gt;Quesby also outputs JSON-LD for:&lt;/p&gt;
&lt;h3&gt;
  
  
  Blog posts (&lt;code&gt;BlogPosting&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;headline
&lt;/li&gt;
&lt;li&gt;description
&lt;/li&gt;
&lt;li&gt;image
&lt;/li&gt;
&lt;li&gt;author
&lt;/li&gt;
&lt;li&gt;publisher
&lt;/li&gt;
&lt;li&gt;datePublished
&lt;/li&gt;
&lt;li&gt;dateModified
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Site (&lt;code&gt;WebSite&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;name
&lt;/li&gt;
&lt;li&gt;url
&lt;/li&gt;
&lt;li&gt;description
&lt;/li&gt;
&lt;li&gt;publisher
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rendered via:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight twig"&gt;&lt;code&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;seoModel&lt;/span&gt; &lt;span class="o"&gt;| &lt;/span&gt;&lt;span class="nf"&gt;seoJsonLd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;site&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;| &lt;/span&gt;&lt;span class="nf"&gt;safe&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again: static, not runtime.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sitemap, Robots, and Noindex Integration
&lt;/h2&gt;

&lt;p&gt;Quesby integrates SEO beyond the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sitemap generated from the &lt;code&gt;`sitemap`&lt;/code&gt; collection
&lt;/li&gt;
&lt;li&gt;Pages with &lt;code&gt;`noindex`&lt;/code&gt; or &lt;code&gt;`eleventyExcludeFromCollections`&lt;/code&gt; are auto-excluded
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;`robots.txt`&lt;/code&gt; generated automatically and linked to the sitemap
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything stays consistent with the same SEO model.&lt;/p&gt;




&lt;h2&gt;
  
  
  Opt-Out When Needed
&lt;/h2&gt;

&lt;p&gt;For special pages:&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;seoDisableCoreHead&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;seoDisableCoreJsonLd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can disable core SEO on a per-page basis and write your own tags.&lt;br&gt;&lt;br&gt;
No lock-in.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters for Eleventy Developers
&lt;/h2&gt;

&lt;p&gt;If you build Eleventy sites regularly, you already know the pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;copy-pasting head tags
&lt;/li&gt;
&lt;li&gt;rewriting JSON-LD
&lt;/li&gt;
&lt;li&gt;fixing Open Graph mismatches
&lt;/li&gt;
&lt;li&gt;forgetting canonical URLs
&lt;/li&gt;
&lt;li&gt;duplicating logic across pages
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quesby removes all of that.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One config file
&lt;/li&gt;
&lt;li&gt;One model
&lt;/li&gt;
&lt;li&gt;One consistent output
&lt;/li&gt;
&lt;li&gt;Zero runtime JavaScript
&lt;/li&gt;
&lt;li&gt;Zero framework dependencies
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML-first, static-first, and boring in all the right ways.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If you like Eleventy but don’t want to rebuild SEO infrastructure for every project, Quesby gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strong defaults
&lt;/li&gt;
&lt;li&gt;static, predictable output
&lt;/li&gt;
&lt;li&gt;extensibility when needed
&lt;/li&gt;
&lt;li&gt;zero client-side bloat
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a lightweight alternative to plugin-heavy or framework-heavy approaches, built specifically for people who prefer clean HTML and simple pipelines.&lt;/p&gt;

&lt;p&gt;More info:&lt;br&gt;&lt;br&gt;
&lt;a href="https://quesby.dev" rel="noopener noreferrer"&gt;https://quesby.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Stop Using @import: How to Prepare for Dart Sass 3.0 (Full Migration Guide)</title>
      <dc:creator>Quesby</dc:creator>
      <pubDate>Thu, 27 Nov 2025 05:00:04 +0000</pubDate>
      <link>https://dev.to/quesby/stop-using-import-how-to-prepare-for-dart-sass-30-full-migration-guide-1agh</link>
      <guid>https://dev.to/quesby/stop-using-import-how-to-prepare-for-dart-sass-30-full-migration-guide-1agh</guid>
      <description>&lt;h2&gt;
  
  
  What’s Changing in Dart Sass 3.0
&lt;/h2&gt;

&lt;p&gt;The Sass team announced that &lt;strong&gt;Dart Sass 3.0 will arrive no earlier than two years after version 1.80.0&lt;/strong&gt;. When it ships, several features will be removed completely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@import&lt;/code&gt;&lt;/strong&gt; → Removed. Replaced by &lt;code&gt;@use&lt;/code&gt; and &lt;code&gt;@forward&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global built-in functions&lt;/strong&gt; (e.g. &lt;code&gt;map-get&lt;/code&gt;, &lt;code&gt;nth&lt;/code&gt;, &lt;code&gt;call&lt;/code&gt;) → Removed. You must import functions from the relevant module (&lt;code&gt;sass:map&lt;/code&gt;, &lt;code&gt;sass:list&lt;/code&gt;, etc.).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legacy global color functions&lt;/strong&gt; → Replaced by namespaced versions from &lt;code&gt;sass:color&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Right now these features still work, but trigger deprecation warnings. With 3.0 they will fail with errors.&lt;/p&gt;




&lt;h2&gt;
  
  
  Preparing for Dart Sass 3.0: Goodbye &lt;code&gt;@import&lt;/code&gt;, Hello &lt;code&gt;@use&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Dart Sass is moving forward. The next major release, &lt;strong&gt;Dart Sass 3.0&lt;/strong&gt;, will remove long-deprecated features such as the &lt;code&gt;@import&lt;/code&gt; rule and global functions like &lt;code&gt;map-get&lt;/code&gt;. If your stylesheets still depend on them, it’s time to update.&lt;/p&gt;

&lt;p&gt;In this post we’ll cover what’s changing, why it matters, and how you can migrate smoothly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why &lt;code&gt;@import&lt;/code&gt; Had to Go
&lt;/h2&gt;

&lt;p&gt;The old &lt;code&gt;@import&lt;/code&gt; rule had serious issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It pollutes the global scope with variables and mixins.
&lt;/li&gt;
&lt;li&gt;Order of imports changes the outcome, often leading to brittle code.
&lt;/li&gt;
&lt;li&gt;Performance suffers because the same file can be compiled multiple times.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;@use&lt;/code&gt; and &lt;code&gt;@forward&lt;/code&gt; fix these problems by introducing &lt;strong&gt;explicit scoping&lt;/strong&gt;. Code is loaded once, names are controlled, and dependencies are easier to reason about.&lt;/p&gt;




&lt;h2&gt;
  
  
  Migrating from &lt;code&gt;@import&lt;/code&gt; to &lt;code&gt;@use&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;// skin.scss&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"@quesby/core/sass/_reset"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"_theme-variables"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"@quesby/core/sass/_mixins"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"_base"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;// skin.scss&lt;/span&gt;
&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s2"&gt;"@quesby/core/sass/reset"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s2"&gt;"theme-variables"&lt;/span&gt; &lt;span class="nt"&gt;as&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// optional: expose variables without prefix&lt;/span&gt;
&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s2"&gt;"@quesby/core/sass/mixins"&lt;/span&gt; &lt;span class="nt"&gt;as&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s2"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how each dependency is namespaced. If you omit &lt;code&gt;as *&lt;/code&gt;, you’ll need to prefix variables or mixins with the module name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mixins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;container-width&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;laptop&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This explicitness avoids collisions and makes code more predictable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Migrating Global Functions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;map-get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$container-max-widths&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tablet&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s2"&gt;"sass:map"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$container-max-widths&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tablet&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pattern is always the same: import the right built-in module and call the function with dot notation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Old Syntax (Deprecated)&lt;/th&gt;
&lt;th&gt;New Syntax (Supported)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@import "file";&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@use "file";&lt;/code&gt; or &lt;code&gt;@forward "file";&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;map-get($map, $key)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;map.get($map, $key)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nth($list, $n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;list.nth($list, $n)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;adjust-color($c, $args...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;color.adjust($c, $args...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lighten($c, $amount)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;color.scale($c, $lightness: $amount)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep this table handy when refactoring your codebase.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step-by-Step Migration Strategy
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inventory your imports.&lt;/strong&gt; Find all &lt;code&gt;@import&lt;/code&gt; rules in your codebase.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Convert shared variable/mixin files.&lt;/strong&gt; Use &lt;code&gt;@forward&lt;/code&gt; in an index file to re-export what other files need.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update your main entry files&lt;/strong&gt; (&lt;code&gt;skin.scss&lt;/code&gt;, etc.) to use &lt;code&gt;@use&lt;/code&gt; instead of &lt;code&gt;@import&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replace global functions&lt;/strong&gt; with their module equivalents (&lt;code&gt;map.get&lt;/code&gt;, &lt;code&gt;list.nth&lt;/code&gt;, &lt;code&gt;color.adjust&lt;/code&gt;, etc.).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run your build in verbose mode&lt;/strong&gt; to catch any leftover deprecations.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  When Should You Migrate?
&lt;/h2&gt;

&lt;p&gt;You still have time: Dart Sass 3.0 is at least two years away. But the safest approach is to migrate now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No more noisy warnings during builds.
&lt;/li&gt;
&lt;li&gt;Cleaner, more modular Sass code.
&lt;/li&gt;
&lt;li&gt;Zero risk of breakage when 3.0 drops.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re starting a new project today, don’t use &lt;code&gt;@import&lt;/code&gt; at all—begin with &lt;code&gt;@use&lt;/code&gt; and &lt;code&gt;@forward&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Sass 3.0 will be the cleanest, most predictable version of Sass yet. By dropping legacy features, the team is ensuring a simpler, more robust future for stylesheet authoring.&lt;/p&gt;

&lt;p&gt;Don’t wait until the last minute. Begin the migration today and your projects will be future-proof by the time Dart Sass 3.0 arrives.&lt;/p&gt;

</description>
      <category>sass</category>
      <category>webdev</category>
      <category>css</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Meet Quesby: A Privacy-First Eleventy Starter That Stays Out of Your Way</title>
      <dc:creator>Quesby</dc:creator>
      <pubDate>Fri, 21 Nov 2025 05:44:02 +0000</pubDate>
      <link>https://dev.to/quesby/meet-quesby-a-privacy-first-eleventy-starter-that-stays-out-of-your-way-4e6</link>
      <guid>https://dev.to/quesby/meet-quesby-a-privacy-first-eleventy-starter-that-stays-out-of-your-way-4e6</guid>
      <description>&lt;p&gt;I've always loved static site generators.&lt;br&gt;&lt;br&gt;
But every time I wanted to spin up a small, focused site, I kept hitting the same problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Boilerplates full of stuff I didn't ask for
&lt;/li&gt;
&lt;li&gt;Too many external dependencies
&lt;/li&gt;
&lt;li&gt;Complex setups just to publish a few pages or blog posts
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I ended up building my own starter – and that's how &lt;strong&gt;Quesby&lt;/strong&gt; was born.&lt;/p&gt;

&lt;p&gt;Quesby is the boilerplate that powers my own site at &lt;a href="https://quesby.dev" rel="noopener noreferrer"&gt;quesby.dev&lt;/a&gt;, and now it's open for you to use too.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Quesby Is
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Quesby is a modern Eleventy boilerplate with a privacy-first mindset, Decap CMS integration, and a tiny core you can actually understand.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's a &lt;strong&gt;clean starting point&lt;/strong&gt; for content-driven sites where you still stay in control.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Quesby Is For
&lt;/h2&gt;

&lt;p&gt;You might like Quesby if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enjoy &lt;strong&gt;Eleventy&lt;/strong&gt; but don't want to wire everything from scratch every time
&lt;/li&gt;
&lt;li&gt;Care about &lt;strong&gt;performance and privacy by default&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Prefer &lt;strong&gt;small, composable building blocks&lt;/strong&gt; over big frameworks
&lt;/li&gt;
&lt;li&gt;Want a starter that's &lt;strong&gt;production-ready&lt;/strong&gt;, not just a demo repo
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're happy with a giant meta-framework that does everything for you, Quesby isn't trying to compete with that.&lt;br&gt;&lt;br&gt;
It's for people who like to keep things close to the metal, with a little help.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;I wanted a starter that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Respects visitors&lt;/strong&gt; – no tracking pixels, no analytics you didn't explicitly add
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respects developers&lt;/strong&gt; – no 20 layers of abstraction just to render a page
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respects content creators&lt;/strong&gt; – a simple CMS flow instead of “open a Markdown file and hope you don’t break the front matter”
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Under the hood, Quesby uses a reusable core (&lt;code&gt;@quesby/core&lt;/code&gt;) so the project logic isn't scattered everywhere.&lt;br&gt;&lt;br&gt;
That means you can reuse the same core across multiple sites and keep things consistent.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Actually Get
&lt;/h2&gt;

&lt;p&gt;Out of the box, Quesby ships with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eleventy 3.0&lt;/strong&gt; for static site generation
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A small CLI&lt;/strong&gt;, for example:&lt;br&gt;&lt;br&gt;
&lt;code&gt;npx quesby new post "My First Quesby Post"&lt;/code&gt;&lt;br&gt;&lt;br&gt;
Generates a properly structured post with front matter, date, and a sane folder name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A modular theme system&lt;/strong&gt; (comes with a couple of themes you can swap or customize)  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SEO basics&lt;/strong&gt; (sitemap, meta tags, etc.)  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Privacy-first defaults&lt;/strong&gt; – nothing gets injected behind your back&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optional CMS integration (Decap)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the most important part: the codebase is meant to be &lt;strong&gt;readable&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
If you like to open files, understand what's going on, and tweak things, Quesby is on your side.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Try It
&lt;/h2&gt;

&lt;p&gt;The fastest way to play with it:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx create-quesby my-site&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;cd my-site&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;Install dependencies (uses pnpm under the hood):&lt;br&gt;&lt;br&gt;
&lt;code&gt;npm install -g pnpm@9&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;pnpm install&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;Launch the server with auto-reload:&lt;br&gt;&lt;br&gt;
&lt;code&gt;pnpm serve&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;Then open &lt;code&gt;http://localhost:8080&lt;/code&gt; and start tweaking.&lt;/p&gt;

&lt;p&gt;If you prefer details and alternative setups (Corepack, etc.), they're all in the repository README.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quesby Boilerplate&lt;/strong&gt;: npm &lt;code&gt;@quesby/boilerplate&lt;/code&gt; · GitHub &lt;code&gt;quesby/quesby-boilerplate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quesby Core&lt;/strong&gt;: npm &lt;code&gt;@quesby/core&lt;/code&gt; · GitHub &lt;code&gt;quesby/quesby-core&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Site built with Quesby&lt;/strong&gt;: &lt;a href="https://quesby.dev" rel="noopener noreferrer"&gt;quesby.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://quesby.dev/documentation/README" rel="noopener noreferrer"&gt;quesby.dev/docs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I built Quesby because I needed a starter that stayed out of the way, respected users' privacy, and still felt nice to work in.  &lt;/p&gt;

&lt;p&gt;If that sounds like something you'd enjoy, feedback, issues, or PRs are welcome — or just a comment telling me what you'd build with it.&lt;/p&gt;

</description>
      <category>11ty</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
