<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[toolsura]]></title><description><![CDATA[toolsura]]></description><link>https://toolsura.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>toolsura</title><link>https://toolsura.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 14:15:54 GMT</lastBuildDate><atom:link href="https://toolsura.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How SSL certificate chains link your site to a trusted root]]></title><description><![CDATA[TL;DR
An SSL certificate chain links your site to a trusted root via intermediates. Certs cap at 200 days and drop to 47 by 2029. Learn how to verify your chain.
Introduction
How SSL certificate chain]]></description><link>https://toolsura.hashnode.dev/how-ssl-certificate-chains-link-your-site-to-a-trusted-root</link><guid isPermaLink="true">https://toolsura.hashnode.dev/how-ssl-certificate-chains-link-your-site-to-a-trusted-root</guid><category><![CDATA[certificate]]></category><category><![CDATA[Root]]></category><category><![CDATA[chain]]></category><category><![CDATA[Certificates]]></category><dc:creator><![CDATA[dev_toolsura]]></dc:creator><pubDate>Sat, 12 Sep 2026 17:01:21 GMT</pubDate><content:encoded><![CDATA[<h2>TL;DR</h2>
<p>An SSL certificate chain links your site to a trusted root via intermediates. Certs cap at 200 days and drop to 47 by 2029. Learn how to verify your chain.</p>
<h2>Introduction</h2>
<p>How SSL certificate chains link your site to a trusted root shows up everywhere but is usually explained in half-truths. Here's what it actually is, what it isn't, and why the difference matters.</p>
<blockquote>
<p>From the original post:</p>
<p>An SSL certificate chain links your site to a trusted root via intermediates. Certs cap at 200 days and drop to 47 by 2029. Learn how to verify your chain.</p>
</blockquote>
<h2>Table of Contents</h2>
<ul>
<li><p><a href="#what-is-an-ssl-certificate-chain">What is an SSL certificate chain?</a></p>
</li>
<li><p><a href="#how-do-root-intermediate-and-leaf-certificates-differ">How do root, intermediate, and leaf certificates differ?</a></p>
</li>
<li><p><a href="#how-does-certificate-chain-verification-work">How does certificate chain verification work?</a></p>
</li>
<li><p><a href="#why-doesnt-the-ca-sign-your-certificate-with-the-root">Why doesn't the CA sign your certificate with the root?</a></p>
</li>
<li><p><a href="#cross-signed-certificates-two-valid-chains-for-one-site">Cross-signed certificates: two valid chains for one site</a></p>
</li>
<li><p><a href="#what-happens-when-a-certificate-chain-breaks">What happens when a certificate chain breaks?</a></p>
</li>
<li><p><a href="#certificate-lifespans-are-collapsing-200-days-to-47-by-2029">Certificate lifespans are collapsing: 200 days to 47 by 2029</a></p>
</li>
<li><p><a href="#how-do-you-view-and-verify-a-certificate-chain">How do you view and verify a certificate chain?</a></p>
</li>
<li><p><a href="#the-bottom-line-trust-is-a-chain-not-a-certificate">The bottom line: trust is a chain, not a certificate</a></p>
</li>
<li><p><a href="#related-reading">Related Reading</a></p>
</li>
</ul>
<h2>What is an SSL certificate chain?</h2>
<p>An SSL certificate chain, formally a certification path, is your certificate signed by an intermediate CA, which is itself signed by a root CA. RFC 5280, the X.509 standard that governs public key infrastructure, defines the path as "a certificate of the public key owner (the end entity) signed by one CA, and zero or more additional certificates of CAs signed by other CAs" (IETF, 2008).</p>
<h2>How do root, intermediate, and leaf certificates differ?</h2>
<p>The three tiers differ in where the private key lives, how long the certificate lasts, and who audits it. Mozilla's Root Store Policy v3.1, effective July 1, 2026, requires root inclusion to be backed by "an auditor-witnessed root key generation ceremony report," while intermediate CAs must be disclosed in the CCADB within 7 days of creation and before any issuance (Mozilla, 2026).</p>
<h2>How does certificate chain verification work?</h2>
<p>Verification is path building, and it runs on your visitor's machine. The client takes the leaf, looks up who signed it, checks that signature, then repeats the step for each issuer until it lands on a self-signed root from its local trust store. RFC 5280 Section 6.1 specifies this as the Basic Path Validation algorithm, and its Basic Constraints extension carries the pathLenConstraint field, which gives "the maximum number of non-self-issued intermediate certificates that may follow" a certific…</p>
<h2>Why doesn't the CA sign your certificate with the root?</h2>
<p>Because the root is the one key that must never touch the internet, and the intermediate is the one key designed to be thrown away. Mozilla's Root Store Policy forces roots through auditor-witnessed generation ceremonies precisely because there's no recovery if a root key leaks: no parent certificate exists to revoke it. A compromised root turns every certificate beneath it into suspect material until trust stores remove it, stranding millions of sites at once.</p>
<h2>Cross-signed certificates: two valid chains for one site</h2>
<p>A cross-signed certificate is one CA key holding certificates from two different parents, which creates two valid chains for the same site. Let's Encrypt puts the concept better than anyone: "a CA is most correctly thought of as a key and a name: any given CA may be represented by multiple certificates which all contain the same Subject and Public Key Information" ( Let's Encrypt, 2026).</p>
<h2>What happens when a certificate chain breaks?</h2>
<p>The classic broken chain is a missing intermediate, and the failure text is unmistakable. OpenSSL reports X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY, defined verbatim as "The issuer certificate could not be found: this occurs if the issuer certificate of an untrusted certificate cannot be found" ( OpenSSL's verification error reference ). In plain terms: your leaf says "signed by YE1," your server never sent YE1, and the client can't complete the path on its own.</p>
<h2>Certificate lifespans are collapsing: 200 days to 47 by 2029</h2>
<p>The shrinking validity schedule raises the stakes. At 200 days, then 100, then 47 by March 2029 ( CA/Browser Forum ), manual renewal stops being viable well before the 47-day mark. Every automated renewal is one more chance for a packaging slip, which is why a post-deploy chain check belongs in your pipeline.</p>
<h2>How do you view and verify a certificate chain?</h2>
<p>You can inspect any chain in under a minute using a browser, OpenSSL, or a zero-install checker. The openssl verify command accepts -untrusted for "certificates to use for chain building" and -show_chain to print the path it built, letting you replicate a browser's decision locally.</p>
<h2>The bottom line: trust is a chain, not a certificate</h2>
<p>An SSL certificate chain is the mechanism that turns a stranger's public key into a trusted identity. Leaf, intermediates, root: each signature vouches for the next, and the path ends in a root your visitor already carries. Roots stay offline for a decade or more, intermediates stay online and revocable, and leaves keep getting shorter, with 200 days now and 47 coming by 2029. When one link goes missing, the failure is loud and unambiguous, so verify after every renewal. Sixty seconds with ToolS…</p>
<h2>Related Reading</h2>
<ul>
<li>Need the ground floor first? Our guide to what an SSL certificate is covers issuance, certificate fields, and the basics this article builds on.</li>
</ul>
<h2>Code Examples</h2>
<pre><code class="language-plaintext">+---------------------+
|  Root CA            |  ISRG Root X1: lives in your OS or browser
|  (self-signed)      |  trust store; offline key; decades of life
+----------+----------+
           | signs
+----------v----------+
|  Intermediate CA    |  e.g. Let's Encrypt YE1: online key;
|                     |  revocable; disclosed in the CCADB
+----------+----------+
           | signs
+----------v----------+
|  Leaf certificate   |  www.example.com: scoped to your
|                     |  domain, short-lived
+---------------------+
</code></pre>
<pre><code class="language-plaintext">Default RSA chain:   your certificate &lt;- YR1 &lt;- Root YR &lt;- ISRG Root X1
Default ECDSA chain: your certificate &lt;- YE1 &lt;- Root YE &lt;- ISRG Root X2 &lt;- ISRG Root X1
</code></pre>
<h2>FAQ</h2>
<h3>What is an SSL certificate chain?</h3>
<p>An SSL certificate chain, formally a certification path, is your certificate signed by an intermediate CA, which is itself signed by a root CA. RFC 5280, the X.509 standard that governs public key infrastructure, defines the path as "a certificate of the public key owner (the end entity) signed by o…</p>
<h3>How do root, intermediate, and leaf certificates differ?</h3>
<p>The three tiers differ in where the private key lives, how long the certificate lasts, and who audits it. Mozilla's Root Store Policy v3.1, effective July 1, 2026, requires root inclusion to be backed by "an auditor-witnessed root key generation ceremony report," while intermediate CAs must be discl…</p>
<h3>How does certificate chain verification work?</h3>
<p>Verification is path building, and it runs on your visitor's machine. The client takes the leaf, looks up who signed it, checks that signature, then repeats the step for each issuer until it lands on a self-signed root from its local trust store. RFC 5280 Section 6.1 specifies this as the Basic Path…</p>
<h3>Why doesn't the CA sign your certificate with the root?</h3>
<p>Because the root is the one key that must never touch the internet, and the intermediate is the one key designed to be thrown away. Mozilla's Root Store Policy forces roots through auditor-witnessed generation ceremonies precisely because there's no recovery if a root key leaks: no parent certificat…</p>
<h3>What happens when a certificate chain breaks?</h3>
<p>The classic broken chain is a missing intermediate, and the failure text is unmistakable. OpenSSL reports X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY, defined verbatim as "The issuer certificate could not be found: this occurs if the issuer certificate of an untrusted certificate cannot be found" (…</p>
<h3>How do you view and verify a certificate chain?</h3>
<p>You can inspect any chain in under a minute using a browser, OpenSSL, or a zero-install checker. The openssl verify command accepts -untrusted for "certificates to use for chain building" and -show_chain to print the path it built, letting you replicate a browser's decision locally.</p>
<h2>Key Takeaways</h2>
<ul>
<li><p>A chain runs leaf, then intermediate, then root. Browsers trust your certificate only if the path ends at a root already in their trust store.</p>
</li>
<li><p>Servers send the leaf and intermediates, never the root. The client completes the path on its own.</p>
</li>
<li><p>The classic chain break is a missing intermediate, surfacing as "unable to get local issuer certificate."</p>
</li>
<li><p>Maximum validity drops to 200 days in March 2026 and 47 days by 2029 (CA/Browser Forum), so automated chain handling is becoming mandatory.</p>
</li>
</ul>
<hr />
<h2>Continue Learning</h2>
<p>Read the full guide: <a href="https://www.toolsura.com/blog/what-is-an-ssl-certificate-chain/">https://www.toolsura.com/blog/what-is-an-ssl-certificate-chain/</a></p>
]]></content:encoded></item><item><title><![CDATA[What CMS Does This Website Use? 8 Checks for Any Site]]></title><description><![CDATA[Find what CMS any website uses in under 2 minutes with 8 free view-source signatures covering WordPress, Shopify, Wix, Squarespace, Webflow, and Drupal.
Introduction
What CMS Does This Website Use sho]]></description><link>https://toolsura.hashnode.dev/what-cms-does-this-website-use-8-checks-for-any-site</link><guid isPermaLink="true">https://toolsura.hashnode.dev/what-cms-does-this-website-use-8-checks-for-any-site</guid><category><![CDATA[what-cms-does-this-website-use]]></category><category><![CDATA[WordPress]]></category><category><![CDATA[site]]></category><category><![CDATA[website]]></category><category><![CDATA[files]]></category><dc:creator><![CDATA[dev_toolsura]]></dc:creator><pubDate>Thu, 10 Sep 2026 18:16:22 GMT</pubDate><content:encoded><![CDATA[<p>Find what CMS any website uses in under 2 minutes with 8 free view-source signatures covering WordPress, Shopify, Wix, Squarespace, Webflow, and Drupal.</p>
<h2>Introduction</h2>
<p>What CMS Does This Website Use shows up everywhere but is usually explained in half-truths. Here's what it actually is, what it isn't, and why the difference matters.</p>
<blockquote>
<p>From the original post:</p>
<p>Find what CMS any website uses in under 2 minutes with 8 free view-source signatures covering WordPress, Shopify, Wix, Squarespace, Webflow, and Drupal.</p>
</blockquote>
<h2>The quick answer to "what cms does this website use"</h2>
<p>You can answer what cms does this website use for most sites in under two minutes without installing anything. Right-click, choose View Page Source, then search for the platform signatures below. Asset paths are the fastest tell because nearly every CMS organizes uploads and scripts into recognizable directories. WordPress alone accounts for 40.7% of all websites and a 58.9% share of the CMS market in the W3Techs survey updated August 30, 2026, which is why its signatures dominate this list. Thi…</p>
<h2>Which CMSs are you actually looking at?</h2>
<p>Knowing the odds sharpens every guess. WordPress powers 40.7% of all websites, which is a 58.9% share of the CMS market, per W3Techs as of August 2026. Those two percentages use different denominators, so keep them straight: one divides by every site on the relevant web, the other only by sites running a CMS that W3Techs can identify. Conflating them is the single most common error in CMS statistics.</p>
<h2>Per-platform signatures at a glance</h2>
<p><code>/wp-content/</code></p>
<h2>The 30-second checks, in order</h2>
<ol>
<li>Read response headers (Server, X-Powered-By)</li>
</ol>
<h2>A worked example with real output</h2>
<p>We ran the two strongest checks against techcrunch.com while writing this guide (verified August 2026), and both signals agreed. , no generator meta tag appeared in the source, which shows why relying on any single signal fails: the asset paths carried the identification alone.</p>
<h2>Builder platforms hide differently</h2>
<p>Wix, Squarespace, and Webflow sites rarely expose directory structures because everything loads from the vendor's own domains. That actually makes them easier to spot: check where the stylesheets and images come from. A stylesheet pulled from a squarespace or wixstatic domain answers the question instantly. These platforms also lock URL structures, which shows up in the address bar itself.</p>
<h2>The self-hosted long tail: Drupal, Joomla, Ghost</h2>
<p>Self-hosted CMSs beyond WordPress follow the same directory conventions, just with their own names. Drupal sites commonly expose /sites/default/files in their asset URLs, and current production releases sit at 11.4.5, which describes as ready for production use with security coverage until June 2027. Joomla deployments expose /media/ and /components/com_ paths, with older Joomla 3 sites still showing the legacy /media/jui/ layout; the Joomla project site offers 6.1.3 as the latest stable release…</p>
<h2>When a site hides its CMS</h2>
<p>Hardened sites rename asset directories, strip generator tags, and disable API routes specifically to defeat these checks; as MDN notes on server identification, minimizing exposed implementation details is a recognized hardening practice. When every direct signal comes up empty, indirect signals still help: the sitemap protocol files at robots.txt and sitemap.xml often retain platform-shaped paths even after cosmetic hardening, and hosting fingerprints from an IP lookup narrow the platform fami…</p>
<h2>Why people ask this question</h2>
<p>The motive shapes how deep to dig. Competitor research wants the platform to estimate costs and flexibility. Job applicants want to know which skills a role actually touches. Site owners migrating want to know what they are moving away from. Security researchers document exposed versions responsibly. In every case the manual checks above answer the question faster than signing up for a scanner, and the roundup of the best tools to detect website technologies covers when automated scanning earns …</p>
<h2>Common detection mistakes to avoid</h2>
<p>The migration trap catches the most people: sites move platforms and leave old asset URLs behind in cached pages, older posts, and third-party embeds. A wp-content URL on an otherwise un-WordPress-looking site deserves suspicion rather than instant verdicts.</p>
<h2>Checking any site's CMS from here on</h2>
<p>To find what cms does this website use: open the source, read the generator tag, search for signature asset paths, and confirm with a second signal such as the wp-json endpoint or an asset domain. Remember the odds: WordPress holds 58.9% of the CMS market per, so it is the rational first guess, yet 30.9% of sites run no monitored CMS at all. Builder platforms reveal themselves through their static-asset domains, hardened sites resist politely, and the whole check costs nothing but a minute of at…</p>
<h2>FAQ</h2>
<h3>Which CMSs are you actually looking at?</h3>
<p>Knowing the odds sharpens every guess. WordPress powers 40.7% of all websites, which is a 58.9% share of the CMS market, per W3Techs as of August 2026. Those two percentages use different denominators, so keep them straight: one divides by every site on the relevant web, the other only by sites runn…</p>
<hr />
<h2>Continue Learning</h2>
<p>Read the full guide: <a href="https://www.toolsura.com/blog/what-cms-does-this-website-use/">https://www.toolsura.com/blog/what-cms-does-this-website-use/</a></p>
]]></content:encoded></item><item><title><![CDATA[CSS Gradients: The Complete Technical Guide to linear-gradient, radial-gradient, and conic-gradient]]></title><description><![CDATA[A CSS gradient is a browser-generated <image> that interpolates between two or more colors across a spatial range. You declare it as a single property value, and the browser paints every pixel of the ]]></description><link>https://toolsura.hashnode.dev/css-gradients-the-complete-technical-guide-to-linear-gradient-radial-gradient-and-conic-gradient</link><guid isPermaLink="true">https://toolsura.hashnode.dev/css-gradients-the-complete-technical-guide-to-linear-gradient-radial-gradient-and-conic-gradient</guid><dc:creator><![CDATA[dev_toolsura]]></dc:creator><pubDate>Fri, 14 Aug 2026 15:41:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a5a4f9db05ca5c66f708bd7/8ae11e32-6e7b-49db-880c-2df677865a4d.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A CSS gradient is a browser-generated <code>&lt;image&gt;</code> that interpolates between two or more colors across a spatial range. You declare it as a single property value, and the browser paints every pixel of the fade at render time — no bitmap to download. The <a href="https://www.w3.org/TR/css-images-4/">CSS Images Module Level 4</a> spec standardizes the data type and its interpolation rules, and <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/gradient">MDN's gradient reference</a> documents the function set.</p>
<p>This guide covers the three gradient functions, the color-stop model that underpins all of them, and the techniques — stacking, repeating, masking, and <code>background-clip: text</code> — that go beyond the plain backdrop.</p>
<h2>The data type and where gradients are valid</h2>
<p>A gradient is a value of type <code>&lt;gradient&gt;</code>, which is a special kind of <code>&lt;image&gt;</code>. Because it's an image, it's valid anywhere an image is — the most common being <code>background-image</code> and the <code>background</code> shorthand, but also <code>border-image</code>, <code>mask-image</code>, and the <code>content</code> property. This is why gradients aren't limited to backgrounds: wherever an image works, a gradient works.</p>
<p>The underlying concept is a <em>color ramp</em> — a progression that interpolates between defined colors across a spatial range, a notion that predates CSS by decades (see <a href="https://en.wikipedia.org/wiki/Color_gradient">Wikipedia: color gradient</a>). CSS promotes it to a first-class value type.</p>
<p>The two practical payoffs: a gradient scales to any dimension without blurring (the browser redraws it at the element's resolution rather than sampling a fixed bitmap), and it ships zero image bytes — a few dozen characters in your stylesheet instead of a JPG/PNG and an HTTP request. Editing is a hex-value change, not a re-export.</p>
<h2>The three gradient functions</h2>
<p>CSS provides exactly three gradient-producing functions. Choosing between them is a question of <strong>shape</strong> — how the transition travels.</p>
<h3><code>linear-gradient()</code> — straight axis</h3>
<p>Blends colors along a straight line. Direction is set by an angle (<code>45deg</code>, <code>135deg</code>) or a keyword (<code>to right</code>, <code>to top right</code>), followed by the color stops.</p>
<pre><code class="language-css">background: linear-gradient(to right, #ff7e5f, #feb47b);
background: linear-gradient(135deg, #6366f1 0%, #ec4899 100%);
</code></pre>
<p>Linear is the default workhorse: hero backdrops, button fills, card overlays, section dividers. The default direction (no argument) is top to bottom.</p>
<blockquote>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/linear-gradient">MDN: <code>linear-gradient()</code></a> — direction keywords and angle units.</p>
</blockquote>
<h3><code>radial-gradient()</code> — outward from a center</h3>
<p>Spreads colors outward from a center point in a <code>circle</code> or <code>ellipse</code>. The fade tracks <strong>distance from a point</strong>, which is why radial gradients read as depth and light.</p>
<pre><code class="language-css">background: radial-gradient(circle, #fff, #000);
background: radial-gradient(circle at 30% 30%, #fff, #000);
</code></pre>
<p>Control surface:</p>
<ul>
<li><p><strong>Shape:</strong> <code>circle</code> or <code>ellipse</code>.</p>
</li>
<li><p><strong>Center position:</strong> e.g. <code>at 30% 30%</code>.</p>
</li>
<li><p><strong>Size keywords:</strong> <code>closest-side</code>, <code>closest-corner</code>, <code>farthest-side</code>, <code>farthest-corner</code>.</p>
</li>
</ul>
<p>Radial is the tool for spotlights, glows, and vignettes.</p>
<blockquote>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/radial-gradient">MDN: <code>radial-gradient()</code></a></p>
</blockquote>
<h3><code>conic-gradient()</code> — rotational sweep</h3>
<p>Rotates colors around a center point; the transition sweeps by <strong>angle</strong> instead of distance. This is the distinguishing feature — and the reason conic is the right tool for pie charts, color wheels, and loading spinners.</p>
<pre><code class="language-css">background: conic-gradient(#f00 0 25%, #0f0 25% 50%, #00f 50% 75%, #ff0 75%);
</code></pre>
<p>Conic is the newest of the three and the least used, which makes it the most likely to surprise. Note it arrived in browsers later than linear and radial — check the specific function if you support older targets.</p>
<blockquote>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/conic-gradient">MDN: <code>conic-gradient()</code></a></p>
</blockquote>
<p>Everything else you'll encounter — repeating variants, mesh backgrounds, striped patterns — is a variation on these three.</p>
<h2>Color stops and interpolation</h2>
<p>A color stop is a <code>&lt;color&gt;</code> plus an optional position (a percentage or length). The browser interpolates smoothly between adjacent stops. Omit positions and colors distribute evenly across the range; add them and each color sits exactly where you place it.</p>
<pre><code class="language-css">background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #ec4899 100%);
</code></pre>
<p>The part that catches people: <strong>two stops at the same position produce a hard edge, not a fade</strong>:</p>
<pre><code class="language-css">background: linear-gradient(to right, #000 50%, #fff 50%);
/* clean half-and-half split, no image file needed */
</code></pre>
<p>That single rule is the mechanism behind every striped and banded gradient in CSS. The <a href="https://www.w3.org/TR/css-images-4/">CSS Images Level 4 spec</a> defines this precisely, including how the browser handles stops declared out of order (they're adjusted so each stop's position is at least as large as the previous).</p>
<h2>Stacking: multiple gradients on one element</h2>
<p>The image properties accept a comma-separated list, and the browser stacks them <strong>front to back</strong> — the first listed sits on top. When upper layers use transparency, lower layers show through.</p>
<pre><code class="language-css">background:
  linear-gradient(rgba(0,0,0,0.4), transparent),   /* tint, drawn on top */
  linear-gradient(to right, #6366f1, #ec4899);        /* base gradient */
</code></pre>
<p>This is the canonical overlay pattern: a transparent dark layer fades over a colorful base so overlaid text stays readable. Each layer is an independent gradient with its own stops; reordering the list reorders the stack. Mesh backgrounds and subtle texture overlays are built this way from pure CSS.</p>
<h2>Repeating gradients</h2>
<p><code>repeating-linear-gradient()</code> and <code>repeating-radial-gradient()</code> take the same syntax as their base functions but <strong>tile</strong> the stop pattern across the box instead of stretching it once. The pattern repeats as soon as the last stop's position is reached — so the spacing between stops <em>is</em> the stripe width.</p>
<pre><code class="language-css">/* Diagonal stripes */
background: repeating-linear-gradient(45deg, #6366f1 0 20px, #ec4899 20px 40px);

/* Concentric rings */
background: repeating-radial-gradient(circle, #fff 0 10px, #000 10px 20px);
</code></pre>
<p>A two-stop gradient becomes stripes, checks, or concentric rings with no image file — the CSS way to draw patterns.</p>
<h2>Gradients beyond <code>background</code></h2>
<p>Because a <code>&lt;gradient&gt;</code> is an <code>&lt;image&gt;</code>, it's valid in any image-valued property. Three techniques follow from that:</p>
<h3>Gradient text — <code>background-clip: text</code></h3>
<p>Paint the gradient as a background, then clip it to the shape of the text glyphs:</p>
<pre><code class="language-css">background: linear-gradient(to right, #6366f1, #ec4899);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
</code></pre>
<p>Keep the underlying text readable if the gradient fails to paint — pairs with a sensible <code>color</code> fallback and, for accessibility, ensure the text's color meets contrast on the page's background if the clip doesn't apply.</p>
<h3>Fade to transparent — the overlay primitive</h3>
<p>Using <code>rgba()</code> (or any color with an alpha channel) you can fade an element to readable darkness or blend two sections cleanly. This is the simplest and most-used overlay pattern in CSS.</p>
<h3>Gradient borders</h3>
<p><code>border-color</code> only accepts solid colors, so gradient borders need <code>border-image</code>, a wrapper element, or a mask trick. There's no single clean property; each is a documented workaround.</p>
<h2>Browser support</h2>
<p>Modern gradient syntax is safe to ship unprefixed. <a href="https://caniuse.com/css-gradients">caniuse's <code>css-gradients</code> table</a> shows near-universal coverage for linear and radial — they've shipped unprefixed in every major browser for over a decade. Vendor prefixes are only needed for very old versions most sites no longer target. Conic gradients arrived later than linear and radial, so verify the specific function if you support older browsers, but in current browsers it's fully supported.</p>
<h2>Rendering performance</h2>
<p>The rule of thumb to hold onto: <strong>gradients beat background images on load time, and lose to solid colors on paint time.</strong></p>
<ul>
<li><p><strong>Static gradients</strong> on normal-sized elements paint once and cost nothing measurable.</p>
</li>
<li><p><strong>Gradients that animate, cover a huge surface, or stack many layers</strong> can tax the paint step — a common source of jank on large/animated hero sections, especially on lower-end devices.</p>
</li>
</ul>
<p>A specific gotcha: gradient values <strong>do not interpolate between keyframes by default</strong>. You can't <code>transition</code> or <code>@keyframes</code>-animate the gradient value itself. The standard workarounds are:</p>
<ol>
<li><p><strong>Animate</strong> <code>background-position</code> on an oversized gradient (set <code>background-size: 200% 200%</code>, then move the position).</p>
</li>
<li><p><strong>Register a</strong> <code>@property</code> <strong>custom property</strong> so the browser has an animatable value to interpolate against.</p>
</li>
</ol>
<p>Heavy gradient animation remains a paint-cost risk on large elements either way. For profiling and mitigations, see the <a href="https://www.toolsura.com/blog/css-gradient-performance/">gradient performance guide</a>.</p>
<h2>FAQ</h2>
<p><strong>Are CSS gradients supported in all browsers?</strong> For practical purposes, yes. Linear and radial have been unprefixed in every major browser for 10+ years; conic is fully supported in current browsers but arrived later (verify for old targets). Prefixes are only for legacy versions most sites no longer support.</p>
<p><strong>Are gradients faster than background images?</strong> Usually. A gradient adds zero image bytes, needs no extra HTTP request, and stays sharp at every size because the browser redraws it. The tradeoff is paint cost on very large or animated surfaces.</p>
<p><strong>How many color stops can a gradient have?</strong> No fixed limit; minimum two. Each stop is a color plus an optional position. Two stops at the same position create a hard edge — that's how striped and banded patterns are built.</p>
<p><strong>Can you animate a CSS gradient?</strong> Not directly — gradient values don't interpolate between keyframes by default. Animate <code>background-position</code> on an oversized gradient, or register a <code>@property</code> custom property. Heavy gradient animation strains paint, so track frame cost on large elements.</p>
<h2>Further reading and tools</h2>
<p>Dedicated guides (each gets into the full syntax with examples):</p>
<ul>
<li><p><a href="https://www.toolsura.com/blog/css-linear-gradient-guide/">CSS Linear Gradient: syntax, examples, and best practices</a></p>
</li>
<li><p><a href="https://www.toolsura.com/blog/css-radial-gradient-guide/">CSS Radial Gradient: complete guide with examples</a></p>
</li>
<li><p><a href="https://www.toolsura.com/blog/css-conic-gradient-guide/">CSS Conic Gradient: pie charts and color wheels</a></p>
</li>
<li><p><a href="https://www.toolsura.com/blog/css-gradient-transparency/">CSS Gradient Transparency: alpha channels and fade effects</a></p>
</li>
<li><p><a href="https://www.toolsura.com/blog/css-gradient-text/">CSS Gradient Text: colorful text effects</a></p>
</li>
<li><p><a href="https://www.toolsura.com/blog/css-gradient-border/">CSS Gradient Border: workarounds and modern solutions</a></p>
</li>
<li><p><a href="https://www.toolsura.com/blog/css-gradient-performance/">CSS Gradient Performance: rendering and optimization</a></p>
</li>
</ul>
<p>Tools:</p>
<ul>
<li><p><a href="https://www.toolsura.com/tools/css-gradient-generator/">CSS gradient generator</a> — visual editor that copies production-ready code.</p>
</li>
<li><p><a href="https://www.toolsura.com/tools/color-picker-palette-generator/">Color picker and palette generator</a> — pick stops that transition cleanly.</p>
</li>
<li><p><a href="https://www.toolsura.com/tools/css-box-shadow-generator/">CSS box-shadow generator</a> — pairs well when styling the same element.</p>
</li>
</ul>
<p>References:</p>
<ul>
<li><p><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/gradient">MDN — gradient reference</a></p>
</li>
<li><p><a href="https://caniuse.com/css-gradients">caniuse — <code>css-gradients</code></a></p>
</li>
<li><p><a href="https://www.w3.org/TR/css-images-4/">CSS Images Module Level 4 (W3C)</a></p>
</li>
</ul>
<hr />
<p><em>This is a cross-post of the pillar guide at</em> <a href="https://www.toolsura.com/blog/css-gradient-guide/"><em>ToolSura</em></a><em>. If you'd rather skip the syntax and pick colors visually, the</em> <a href="https://www.toolsura.com/tools/css-gradient-generator/"><em>CSS gradient generator</em></a> <em>writes copy-paste code in seconds.</em></p>
]]></content:encoded></item><item><title><![CDATA[CLI for SEO: Efficiently Resolving "Discovered: Currently Not Indexed" with gsc-indexer]]></title><description><![CDATA[Understanding "Discovered currently not indexed"
For many developers and SEOs, the "Discovered - currently not indexed" status in Google Search Console (GSC) is a familiar, frustrating sight. It means]]></description><link>https://toolsura.hashnode.dev/cli-for-seo-efficiently-resolving-discovered-currently-not-indexed-with-gsc-indexer</link><guid isPermaLink="true">https://toolsura.hashnode.dev/cli-for-seo-efficiently-resolving-discovered-currently-not-indexed-with-gsc-indexer</guid><dc:creator><![CDATA[dev_toolsura]]></dc:creator><pubDate>Sat, 01 Aug 2026 17:13:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a5a4f9db05ca5c66f708bd7/38c3c35d-ca2f-4990-976f-d46fc39a4e27.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Understanding "Discovered currently not indexed"</h2>
<p>For many developers and SEOs, the "Discovered - currently not indexed" status in Google Search Console (GSC) is a familiar, frustrating sight. It means Google knows about your page but has chosen not to crawl or index it yet. This can delay critical content from appearing in search results.</p>
<p>While this status can stem from various factors (crawl budget, content quality, site errors), a common strategy is to explicitly request indexing through the GSC URL Inspection API. Manually doing this for hundreds or thousands of URLs is impractical. This guide explores how <code>gsc-indexer</code>, a command-line utility, addresses this at scale.</p>
<h2>Bulk Indexing with <code>gsc-indexer</code></h2>
<p><code>gsc-indexer</code> is designed for developers who need to manage Google Search Console indexing requests programmatically. It integrates smoothly into existing CLI workflows, supporting various input methods for batch processing.</p>
<h3>1. Batch File Input</h3>
<p>The most straightforward way to submit multiple URLs is via a batch file. Create a simple text file (<code>urls.txt</code>) where each line contains a single URL you want to inspect or request indexing for. Lines starting with <code>#</code> are ignored.</p>
<pre><code class="language-bash"># urls.txt
https://www.your-domain.com/new-article-1/
https://www.your-domain.com/updated-product-page/
https://www.your-domain.com/blog/important-announcement/
</code></pre>
<p>Then, execute <code>gsc-indexer</code> with the <code>-batch</code> flag:</p>
<pre><code class="language-bash">gsc-indexer -batch urls.txt -sa service-account.json -p https://www.your-domain.com/
</code></pre>
<p>This command reads <code>urls.txt</code>, processes each URL, and sends requests via your authenticated service account for the specified GSC property.</p>
<h3>2. Piped Standard Input (stdin)</h3>
<p><code>gsc-indexer</code> excels in Unix-like environments by supporting piped standard input. This enables dynamic URL lists from other tools. For example, to index all blog posts from your sitemap:</p>
<pre><code class="language-bash">curl -s https://www.your-domain.com/sitemap.xml | \
grep -oE 'https://www.your-domain.com/blog/[^&lt;]+' | \
gsc-indexer -json -sa service-account.json -p https://www.your-domain.com/ -batch /dev/stdin &gt; indexing-results.json
</code></pre>
<p>Here, <code>curl</code> fetches the sitemap, <code>grep</code> extracts blog post URLs, and the pipe (<code>|</code>) feeds these directly into <code>gsc-indexer</code>. The <code>-batch /dev/stdin</code> flag explicitly tells the tool to read from standard input. The <code>-json</code> flag ensures machine-readable output.</p>
<h3>3. Sitemap URL Processing</h3>
<p>If your entire sitemap needs processing, <code>gsc-indexer</code> can handle it directly. Provide the sitemap URL with the <code>-sitemap</code> flag:</p>
<pre><code class="language-bash">gsc-indexer -sitemap https://www.your-domain.com/sitemap.xml -sa service-account.json -p https://www.your-domain.com/
</code></pre>
<p>This command fetches the sitemap, recursively resolves any sitemap indexes, extracts all <code>&lt;loc&gt;</code> entries, and processes them. Note that expansion is capped at 50,000 URLs to prevent excessive API usage.</p>
<h2>Combining Input Methods &amp; Deduplication</h2>
<p><code>gsc-indexer</code> can combine multiple input sources in a single run. For instance, you can provide a batch file, pipe URLs from stdin, and specify a sitemap URL. The tool automatically merges all inputs and removes duplicate URLs before processing.</p>
<pre><code class="language-bash">gsc-indexer -batch critical-urls.txt -sitemap https://www.your-domain.com/sitemap.xml -sa sa.json -p https://www.your-domain.com/
</code></pre>
<p>This ensures you only send unique requests, optimizing your daily GSC API quota.</p>
<h2>Conclusion</h2>
<p>Leveraging <code>gsc-indexer</code> for bulk URL inspection and indexing requests transforms a tedious manual task into an automated, scalable process. By integrating this CLI tool into your development or deployment workflows, you can proactively address indexing issues and ensure your content gets the visibility it deserves in Google Search.</p>
<hr />
<p><strong>CTA:</strong> Take control of your indexing strategy. <a href="https://www.toolsura.com/blog/gsc-indexer-start-here/">Explore the full <code>gsc-indexer</code> documentation and get started today</a>.</p>
]]></content:encoded></item></channel></rss>