<?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: keyboardTester.Click</title>
    <description>The latest articles on DEV Community by keyboardTester.Click (@keyboard-testerclick).</description>
    <link>https://dev.to/keyboard-testerclick</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3900833%2F44a760e2-ccf3-437b-8a6c-992cc014d5ba.jpg</url>
      <title>DEV Community: keyboardTester.Click</title>
      <link>https://dev.to/keyboard-testerclick</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/keyboard-testerclick"/>
    <language>en</language>
    <item>
      <title>GA4 Bot Traffic Spike: Stop Bots Without Hurting SEO</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Sat, 01 Aug 2026 08:32:26 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/ga4-bot-traffic-spike-stop-bots-without-hurting-seo-25n4</link>
      <guid>https://dev.to/keyboard-testerclick/ga4-bot-traffic-spike-stop-bots-without-hurting-seo-25n4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Condensed cross-post of the original KeyboardTester.click case study: &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/ga4-bot-traffic-spike-cloudflare-fix.php" rel="noopener noreferrer"&gt;GA4 Bot Traffic Spike: Stop Bots Without Hurting SEO&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;GA4 suddenly showed &lt;strong&gt;319 active users in the last 30 minutes&lt;/strong&gt;, while the country table separately displayed &lt;strong&gt;Singapore: 301&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That did not mean 319 people were simultaneously connected, and the separately refreshed country row could not be combined with that total. GA4 Realtime is a rolling 30-minute view, and its tiles can refresh on different schedules. The screenshot was an alert—not a firewall verdict.&lt;/p&gt;

&lt;p&gt;We investigated the incident across three layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;behavior inside GA4;&lt;/li&gt;
&lt;li&gt;request patterns at Cloudflare’s edge;&lt;/li&gt;
&lt;li&gt;traffic that actually reached the hosting origin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Together, the evidence supported &lt;strong&gt;distributed abusive browser automation or scraping-like traffic using rotating IPs&lt;/strong&gt;. It did not identify an operator or motive, and it did not prove a DDoS campaign, hacking, data theft, or an AI-crawler operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What made the traffic suspicious
&lt;/h2&gt;

&lt;p&gt;The analyzed Singapore aggregate in GA4 had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;zero engaged sessions;&lt;/li&gt;
&lt;li&gt;close to one page per session;&lt;/li&gt;
&lt;li&gt;mostly direct or blank attribution;&lt;/li&gt;
&lt;li&gt;a concentrated desktop-browser profile;&lt;/li&gt;
&lt;li&gt;a broad sweep across unrelated landing pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those signals were suspicious, but GA4 alone was not enough. A legitimate burst, a tagging error, Measurement Protocol spam, a VPN exit, and automated browsers can all create confusing analytics.&lt;/p&gt;

&lt;p&gt;Cloudflare supplied the next layer. One hour contained a sharp three-minute cluster totaling &lt;strong&gt;5,675 requests&lt;/strong&gt;. The wider sample included explicit headless-browser traffic and repeated stock-browser signatures requesting public pages, CSS, JavaScript, PWA files, and broad image inventories.&lt;/p&gt;

&lt;p&gt;The origin log then confirmed that some of this activity was consuming hosting resources. In one nine-minute window, it recorded &lt;strong&gt;3,869 requests from 1,101 IP addresses&lt;/strong&gt;. Rotating addresses made IP-by-IP blocking a poor long-term control.&lt;/p&gt;

&lt;p&gt;An impact sample at the edge recorded &lt;strong&gt;10,038 requests and 166,891,967 response bytes in 35 minutes&lt;/strong&gt;. A separate origin window recorded &lt;strong&gt;2,126 requests and 63,296,919 response-body bytes in roughly 32 minutes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The windows and units matter. These numbers should not be combined into one invented total, but they do establish that the incident involved real requests and transfer—not merely an odd chart inside GA4.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was it Googlebot, an AI crawler, or an attack?
&lt;/h2&gt;

&lt;p&gt;Recognized Google, Bing, OpenAI, Meta, and advertising-verification crawlers appeared separately in small volumes. They were not the population driving the visible burst.&lt;/p&gt;

&lt;p&gt;A browser-looking user agent is not proof of a person. Likewise, a crawler name in a user agent is not proof that the request really came from that crawler. Known-good crawlers should be verified and explicitly protected.&lt;/p&gt;

&lt;p&gt;We also inspected the requested paths. The sample did not show a burst of login attempts, admin probing, exposed-file requests, brute force, or exploit paths. The suspicious origin requests we inspected used &lt;code&gt;GET&lt;/code&gt; or &lt;code&gt;HEAD&lt;/code&gt; against public content, with no &lt;code&gt;POST&lt;/code&gt; burst.&lt;/p&gt;

&lt;p&gt;The accurate conclusion was therefore:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Distributed browser automation or scraping-like traffic was reaching public pages through rotating IPs. No evidence of compromise was found, but the operator and motive remained unknown.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That wording matters. “No evidence found” is not the same as proving that no hostile activity existed anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does this traffic hurt bandwidth, SEO, or ads?
&lt;/h2&gt;

&lt;p&gt;It can consume bandwidth. Cached responses may stay at the edge, but cache misses, dynamic pages, and some assets still reach the host. Our origin logs confirmed both requests and response bytes during the incident.&lt;/p&gt;

&lt;p&gt;The analytics spike itself does &lt;strong&gt;not&lt;/strong&gt; create an automatic Google ranking penalty. The indirect SEO risk grows if automation causes real latency, resource throttling, or &lt;code&gt;5xx&lt;/code&gt; responses that affect visitors and search crawling. An over-broad firewall rule can create the opposite problem by blocking verified crawlers.&lt;/p&gt;

&lt;p&gt;Automated page loads also distort acquisition and content reports. For an ad-supported site, bot activity can contribute to invalid-traffic risk. That is a reason to monitor unusual ad metrics and policy notices—not a reason to assume every automated page view produced an invalid click.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we did not block Singapore
&lt;/h2&gt;

&lt;p&gt;Country attribution is not identity. Legitimate visitors, VPN users, proxy networks, cloud infrastructure, and automated clients can all appear under the same country.&lt;/p&gt;

&lt;p&gt;A country-wide block would have rejected real users and still allowed determined automation to move to another exit region. We therefore classified behavior rather than nationality.&lt;/p&gt;

&lt;p&gt;We also avoided an immediate hard block. The evidence was strong, but the lowest-impact reversible response was a &lt;strong&gt;Cloudflare Managed Challenge&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we scoped the Managed Challenge
&lt;/h2&gt;

&lt;p&gt;The production rule was limited to the suspicious public-page navigation behavior observed during the incident. It excluded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloudflare-verified bots;&lt;/li&gt;
&lt;li&gt;non-&lt;code&gt;GET&lt;/code&gt; traffic;&lt;/li&gt;
&lt;li&gt;APIs and required application endpoints;&lt;/li&gt;
&lt;li&gt;static assets;&lt;/li&gt;
&lt;li&gt;PWA and service-worker paths;&lt;/li&gt;
&lt;li&gt;Cloudflare internal paths.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are intentionally not publishing the exact expression, browser fingerprints, rule IDs, account details, or origin information. Those details would become an evasion guide and would age faster than the response method.&lt;/p&gt;

&lt;p&gt;Managed Challenge can still have negative effects. A legitimate visitor may see a short verification step. Privacy tools or blocked scripts can make verification harder. Poor scoping can break AJAX, APIs, webhooks, service workers, embeds, forms, or crawling.&lt;/p&gt;

&lt;p&gt;The safeguards are straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;start with the smallest observed pattern;&lt;/li&gt;
&lt;li&gt;choose a reversible action;&lt;/li&gt;
&lt;li&gt;exclude verified crawlers and required application paths;&lt;/li&gt;
&lt;li&gt;test normal users and known-good bots;&lt;/li&gt;
&lt;li&gt;keep a rollback;&lt;/li&gt;
&lt;li&gt;monitor false positives before tightening.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What changed after activation
&lt;/h2&gt;

&lt;p&gt;Cloudflare recorded &lt;strong&gt;128 challenged requests&lt;/strong&gt;. That does not mean 128 unique bots, people, or attackers; one client can generate multiple challenge responses.&lt;/p&gt;

&lt;p&gt;Post-rule origin snapshots fell to &lt;strong&gt;8 requests in one minute&lt;/strong&gt; and &lt;strong&gt;17 in the next&lt;/strong&gt;. A matching suspicious HTML probe received HTTP &lt;code&gt;403&lt;/code&gt; with Cloudflare’s challenge marker, while normal probes continued to return HTTP &lt;code&gt;200&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Regression checks covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;normal desktop and mobile navigation;&lt;/li&gt;
&lt;li&gt;a localized Japanese tool;&lt;/li&gt;
&lt;li&gt;the manifest and service worker;&lt;/li&gt;
&lt;li&gt;a public embed with an external referrer;&lt;/li&gt;
&lt;li&gt;Googlebot;&lt;/li&gt;
&lt;li&gt;OAI-SearchBot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those controls remained available. That result mattered more than watching one GA4 number fall.&lt;/p&gt;

&lt;p&gt;During immediate verification, GA4’s rolling card moved from the original 319 total / Singapore row 301 to a later 241 total / Singapore row 224. A later July 31 context check showed 23 active users. The decline was consistent with mitigation and old activity aging out of the 30-minute window, but it was not proof that one rule caused every change.&lt;/p&gt;

&lt;h2&gt;
  
  
  A safe playbook for your own GA4 spike
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Preserve the measurement window
&lt;/h3&gt;

&lt;p&gt;Save a screenshot and record the timezone, minute pattern, countries, source/medium, landing pages, engagement, device, and browser breakdown. Do not call a rolling Realtime count simultaneous connections.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Corroborate outside GA4
&lt;/h3&gt;

&lt;p&gt;Compare CDN requests, security events, cache status, response bytes, status codes, and a timestamped origin-log sample. If GA4 spikes but the edge and server see nothing, investigate analytics spam or tagging problems before changing the WAF.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Classify behavior, not geography
&lt;/h3&gt;

&lt;p&gt;Separate verified search or AI crawlers, monitoring, ad-verification agents, ordinary browsers, scraping-like navigation, endpoint abuse, and exploit attempts. Each class needs a different response.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Start with the smallest reversible control
&lt;/h3&gt;

&lt;p&gt;For suspicious public-page navigation, a narrow Managed Challenge is usually safer than a sitewide hard block. For one hammered endpoint, use an endpoint-specific rate limit or challenge. Exploit, login, or form abuse needs managed WAF rules and application-specific controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Test both success and failure paths
&lt;/h3&gt;

&lt;p&gt;Check desktop, mobile, important locales, forms, APIs, static files, service workers, embeds, verified crawlers, and a matching suspicious request. Confirm both the edge action and the origin reduction.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Monitor and adjust
&lt;/h3&gt;

&lt;p&gt;Watch challenge outcomes, false positives, origin load, &lt;code&gt;5xx&lt;/code&gt; responses, GSC crawl health, GA4 quality, and ad-platform notices. Tighten only when new evidence supports it.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Keep analytics cleanup separate
&lt;/h3&gt;

&lt;p&gt;Filtering a report can make charts cleaner, but it does not stop requests or bandwidth consumption. Reporting hygiene and edge mitigation solve different problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The main lesson
&lt;/h2&gt;

&lt;p&gt;A sudden GA4 country tile is a signal, not a verdict. Preserve the window, verify what reached the edge and origin, protect known-good traffic, and use the smallest reversible control that addresses the observed behavior.&lt;/p&gt;

&lt;p&gt;The complete case study includes the incident screenshots, evidence tables, response matrix, bandwidth discussion, official sources, FAQs, and a Cloudflare WAF walkthrough: &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/ga4-bot-traffic-spike-cloudflare-fix.php" rel="noopener noreferrer"&gt;read GA4 Bot Traffic Spike: Stop Bots Without Hurting SEO&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>cloudflare</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>Why Is My Typing Speed So Inconsistent? 7 Fixes</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Tue, 28 Jul 2026 15:34:35 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/why-is-my-typing-speed-so-inconsistent-7-fixes-3kc4</link>
      <guid>https://dev.to/keyboard-testerclick/why-is-my-typing-speed-so-inconsistent-7-fixes-3kc4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Condensed cross-post of the original KeyboardTester.click guide: &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/why-is-my-typing-speed-so-inconsistent.php" rel="noopener noreferrer"&gt;Why Is My Typing Speed So Inconsistent? 7 Fixes&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One test says 82 WPM. The next says 69. A day later you reach 88. Your skill did not disappear and return. A WPM score is one sample produced by a particular passage, duration, correction rule, setup, and moment.&lt;/p&gt;

&lt;p&gt;The useful question is not "Which score is the real me?" It is "Which part of the test changed?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a controlled three-run benchmark
&lt;/h2&gt;

&lt;p&gt;Do not compare a 15-second burst on familiar words with a two-minute technical passage. Use the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;computer, keyboard, layout, and browser&lt;/li&gt;
&lt;li&gt;desk position and test duration&lt;/li&gt;
&lt;li&gt;correction setting&lt;/li&gt;
&lt;li&gt;passage type, as closely as the test permits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Warm up without chasing a score, then complete three attempts in the same &lt;a href="https://keyboardtester.click/keyboard_typing_test.php" rel="noopener noreferrer"&gt;typing speed benchmark&lt;/a&gt;. Record WPM and accuracy for every run.&lt;/p&gt;

&lt;p&gt;Sort the three WPM values and use the middle result as the &lt;strong&gt;median&lt;/strong&gt;. Then calculate the &lt;strong&gt;range&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;highest WPM - lowest WPM&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The median reduces the effect of one unusually good or bad run. The range shows how spread out the session was. Neither number diagnoses a problem, but together they are more honest than a personal-best screenshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why comparable-looking tests still disagree
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The passage is harder
&lt;/h3&gt;

&lt;p&gt;Two passages of the same length can demand different movements and reading effort. A 2026 &lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12901113/" rel="noopener noreferrer"&gt;Typability Index study&lt;/a&gt; found that features such as word familiarity, syllables, symbols, bigram frequency, nonwords, and keyboard-side patterns help predict how easy English sentences are to type.&lt;/p&gt;

&lt;p&gt;That does &lt;strong&gt;not&lt;/strong&gt; mean its model explains your day-to-day WPM. The practical lesson is narrower: a punctuation-heavy technical paragraph is not directly comparable with a familiar word list.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The test is too short
&lt;/h3&gt;

&lt;p&gt;One hesitation, typo, or correction consumes a larger share of a 15-second result than a longer sample. Different sites also score errors differently, so gross WPM from one tool may not match net WPM from another.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Mistakes and corrections change the result
&lt;/h3&gt;

&lt;p&gt;Forcing speed can raise a raw number while backspaces lower the final score. Track accuracy from the same tool and under the same correction rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Your condition changed
&lt;/h3&gt;

&lt;p&gt;Warm-up, tiredness, tension, distractions, posture, and task switching can all disturb an otherwise familiar movement. Add a short context note to each session rather than guessing from one number.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Your fingering changes
&lt;/h3&gt;

&lt;p&gt;Changing which finger reaches a key changes the movement path. Consistency matters more than copying one rigid style.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Some letter pairs interrupt your rhythm
&lt;/h3&gt;

&lt;p&gt;WPM tells you how much text came out. Timing data can show where the flow changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dwell time&lt;/strong&gt; is the interval from pressing a key to releasing it.&lt;/li&gt;
&lt;li&gt;In the KBT tool, &lt;strong&gt;flight time&lt;/strong&gt; is the non-overlapping gap from releasing one key to pressing the next.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;bigram&lt;/strong&gt; is a pair of consecutive characters, such as &lt;code&gt;th&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A study of &lt;a href="https://userinterfaces.aalto.fi/136Mkeystrokes/resources/chi-18-analysis.pdf" rel="noopener noreferrer"&gt;roughly 136 million keystrokes from 168,960 volunteers&lt;/a&gt; found that letter-pair timing patterns were informative about typing performance. The sample was self-selected and English-heavy, so it is evidence that timing patterns matter, not a universal benchmark.&lt;/p&gt;

&lt;p&gt;Complete the fixed passage in the &lt;a href="https://keyboardtester.click/typing-rhythm-test.php" rel="noopener noreferrer"&gt;typing-rhythm analyzer&lt;/a&gt; three times. Compare dwell and flight timing, then note which bigrams repeatedly appear slow. One warm-colored result is not a verdict; a pair that stays slow across comparable runs is a better practice target.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. A key has a repeatable input fault
&lt;/h3&gt;

&lt;p&gt;Variable WPM alone does not prove hardware failure. A keyboard fault becomes more plausible when the same physical key repeatedly misses, doubles, sticks, or registers late outside the typing test.&lt;/p&gt;

&lt;p&gt;Check the suspected key deliberately in the &lt;a href="https://keyboardtester.click/" rel="noopener noreferrer"&gt;keyboard input tester&lt;/a&gt;. If a held key repeats too early or waits too long, compare it with the &lt;a href="https://keyboardtester.click/key-repeat-rate-test.php" rel="noopener noreferrer"&gt;key repeat-rate test&lt;/a&gt;. Replace hardware only after the fault is reproducible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven fixes, in order
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Standardize the benchmark.&lt;/strong&gt; Keep the duration, device, layout, correction rule, and passage type comparable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track the median and range.&lt;/strong&gt; Keep all three runs instead of reporting only the fastest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protect accuracy before forcing speed.&lt;/strong&gt; Use accuracy from the same test as part of the result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practice repeatably slow bigrams.&lt;/strong&gt; Work on pairs that stay slow across comparable rhythm runs, preferably inside real words.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep fingering and layout consistent.&lt;/strong&gt; Reduce unnecessary changes to the movement path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use short, rested sessions.&lt;/strong&gt; Stop when technique begins to degrade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test hardware only when errors repeat.&lt;/strong&gt; Repair or replace only after reproducing an input fault.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Retest for a week
&lt;/h2&gt;

&lt;p&gt;Repeat the same three-attempt benchmark on days when you can reproduce the setup. Track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;median WPM&lt;/li&gt;
&lt;li&gt;range&lt;/li&gt;
&lt;li&gt;accuracy&lt;/li&gt;
&lt;li&gt;repeated slow bigrams&lt;/li&gt;
&lt;li&gt;context, such as a different keyboard, poor sleep, unfamiliar punctuation, or a noisy room&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not a perfect score every day. Look for a more stable median, a narrower range, steady accuracy, and improvement in the same slow transitions.&lt;/p&gt;

&lt;p&gt;If typing causes persistent pain, numbness, weakness, or other concerning symptoms, stop and seek appropriate professional advice. A browser typing test cannot diagnose a medical cause.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try the workflow:&lt;/strong&gt; run the &lt;a href="https://keyboardtester.click/typing-rhythm-test.php" rel="noopener noreferrer"&gt;typing-rhythm consistency check&lt;/a&gt;, then use the worksheet and full troubleshooting branches in the original guide: &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/why-is-my-typing-speed-so-inconsistent.php" rel="noopener noreferrer"&gt;Why Is My Typing Speed So Inconsistent? 7 Fixes&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>typing</category>
    </item>
    <item>
      <title>What Note Am I Singing? Find It by Humming (No App)</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Fri, 24 Jul 2026 19:00:08 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/what-note-am-i-singing-find-it-by-humming-no-app-aei</link>
      <guid>https://dev.to/keyboard-testerclick/what-note-am-i-singing-find-it-by-humming-no-app-aei</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Condensed cross-post of the original KeyboardTester.click guide: &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/what-note-am-i-singing-find-it-by-humming.php" rel="noopener noreferrer"&gt;What Note Am I Singing? Find It by Humming (No App)&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A melody is stuck in your head, or a choir director just asked for your range, and you want to know whether the note you are matching is really a G. You do not need an app, and you do not need someone with perfect pitch next to you. Any laptop or phone browser with a working microphone can name the note you are humming in seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fast answer:&lt;/strong&gt; open the &lt;a href="https://keyboardtester.click/pitch-detector.php" rel="noopener noreferrer"&gt;free live note check&lt;/a&gt;, allow the microphone, and hum a steady note on "ah" or a closed-mouth "mmm" for two to three seconds. The screen shows the note name, the octave, the frequency in Hz, and how many cents sharp or flat you are.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works (and why humming beats singing)
&lt;/h2&gt;

&lt;p&gt;The detection method is autocorrelation, the same family of algorithms most tuner apps use: the browser compares your waveform against delayed copies of itself and finds the period at which it best matches. It runs entirely on your device through the Web Audio API - nothing is uploaded.&lt;/p&gt;

&lt;p&gt;That approach is also why &lt;strong&gt;humming gives a steadier reading than singing lyrics&lt;/strong&gt;: every consonant and vowel change disturbs the waveform the detector is tracking. A sustained "ah" or a gentle closed-mouth "mmm" produces a clean, periodic signal that locks in almost immediately.&lt;/p&gt;

&lt;p&gt;Technique checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start from your speaking voice: say "ah", then let it settle into a hum at the same comfortable height.&lt;/li&gt;
&lt;li&gt;Stay roughly 15-30 cm from the microphone.&lt;/li&gt;
&lt;li&gt;Keep airflow slow and even - think of a long, lazy sigh on one note.&lt;/li&gt;
&lt;li&gt;Avoid slides, scoops, and vocal fry; land on the note directly.&lt;/li&gt;
&lt;li&gt;Pick the quietest room available. If you are unsure how noisy it is, measure it with a &lt;a href="https://keyboardtester.click/decibel-meter.php" rel="noopener noreferrer"&gt;browser decibel meter&lt;/a&gt; first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reading the result: notes, octaves, Hz, and cents
&lt;/h2&gt;

&lt;p&gt;Middle C is C4, and the A above it, A4, is the international tuning reference: ISO 16 fixes A4 at exactly 440 Hz. A full 88-key piano spans A0 at 27.5 Hz up to C8 at 4186 Hz; most voices live in a narrow band inside that.&lt;/p&gt;

&lt;p&gt;Cents describe how far you are from the nearest note. One semitone is divided into 100 cents (an octave is 1200), so a reading of +20 means you are 20% of the way up toward the next note - sharp. Practical guidance for held notes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cents from the note&lt;/th&gt;
&lt;th&gt;How it reads&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Within ±5&lt;/td&gt;
&lt;td&gt;On the note (professional-level target)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;±5 to ±15&lt;/td&gt;
&lt;td&gt;Usually heard as in tune&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;±15 to ±30&lt;/td&gt;
&lt;td&gt;Audibly sharp or flat on sustained notes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beyond ±30&lt;/td&gt;
&lt;td&gt;Closer to the neighboring semitone - re-anchor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why the reading jumps (and the octave-error fix)
&lt;/h2&gt;

&lt;p&gt;A jumping reading almost always has a physical explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vibrato&lt;/strong&gt; - if your voice naturally oscillates, the detector faithfully reports a pitch swinging a few dozen cents several times per second. That is your voice, not a bug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser voice-call processing&lt;/strong&gt; - automatic gain control, noise suppression, and echo cancellation are standard, documented microphone constraints. They are designed for speech calls and can pump levels or briefly suppress parts of a sustained tone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Octave errors&lt;/strong&gt; - you hum a low note and the display shows the right letter one octave up. Low voices often produce a second harmonic stronger than the fundamental, and an autocorrelation detector can briefly latch onto it. Two cures: hum louder so the fundamental dominates, and bring the mic closer for more low-end energy. The Hz value confirms which octave you actually produced.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the reader shows nothing at all, verify the input first with a &lt;a href="https://keyboardtester.click/mic-tester.php" rel="noopener noreferrer"&gt;quick microphone test&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things you can do with a steady reading
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Practice singing in tune.&lt;/strong&gt; Play a reference note, hum it back, read the cents value, correct once, hold, and compare. If your average error shrinks week over week, you are objectively singing more in tune. (Honest scope: cents measure pitch on one held note - not tone, rhythm, or diction.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Map your rough vocal range.&lt;/strong&gt; Slide down to the lowest note you can hold cleanly for two seconds, then up to the highest without straining, and note both (for example, G2 to E4). Anchor point: conversational speech averages around 120 Hz for men (near B2) and 210 Hz for women (near G#3).&lt;/p&gt;

&lt;p&gt;One honest limitation: a browser reading through a consumer mic is excellent for naming notes and practicing, but it is monophonic (one voice at a time) and not a calibrated instrument-grade tuner.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it yourself:&lt;/strong&gt; &lt;a href="https://keyboardtester.click/pitch-detector.php" rel="noopener noreferrer"&gt;live note and pitch check&lt;/a&gt; - and the full guide with the what-you-see table, the practice loop, and the vocal-range walkthrough lives here: &lt;a href="https://keyboardtester.click/blog/what-note-am-i-singing-find-it-by-humming.php" rel="noopener noreferrer"&gt;What Note Am I Singing? Find It by Humming (No App)&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>music</category>
      <category>webdev</category>
      <category>audio</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Best Laptop GPU in 2026? Compare Power Limits and Cooling First</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Thu, 23 Jul 2026 15:16:46 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/best-laptop-gpu-in-2026-compare-power-limits-and-cooling-first-41ig</link>
      <guid>https://dev.to/keyboard-testerclick/best-laptop-gpu-in-2026-compare-power-limits-and-cooling-first-41ig</guid>
      <description>&lt;h2&gt;
  
  
  The GPU name is only the first line of the specification
&lt;/h2&gt;

&lt;p&gt;Two laptops carrying the same RTX 5080 or RTX 5090 badge can deliver meaningfully different sustained performance. Power limits, cooling capacity, memory configuration, display resolution, firmware, and fan tuning determine how much performance is available after the chassis has been under load.&lt;/p&gt;

&lt;p&gt;A short benchmark can hide the difference. Watch sustained clocks, package power, hotspot temperature, fan behavior, and whether frame rate falls after fifteen or twenty minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  A better laptop-GPU shortlist
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Define the games, creator apps, or local AI workloads you actually run.&lt;/li&gt;
&lt;li&gt;Compare the GPU power target, not only the model name.&lt;/li&gt;
&lt;li&gt;Check RAM and VRAM capacity for the workload and display resolution.&lt;/li&gt;
&lt;li&gt;Look for sustained thermal results, not only a one-minute benchmark.&lt;/li&gt;
&lt;li&gt;Decide whether portability or maximum desk-based performance matters more.&lt;/li&gt;
&lt;li&gt;Check charger size, display outputs, USB-C limits, and upgrade access.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a machine that mostly stays on a desk, a heavier chassis with stronger cooling may be the better value. For frequent travel, lower sustained power can be a rational trade for battery life and weight.&lt;/p&gt;

&lt;p&gt;After purchase, test browser WebGPU/AI readiness, monitor hotspot temperature during a repeatable workload, and check peripheral latency after changing power modes, docks, or wireless devices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://keyboardtester.click/blog/best-laptops-with-good-gpu-2026.php" rel="noopener noreferrer"&gt;Read the complete Best Laptops With Good GPU 2026 guide&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published and maintained at &lt;a href="https://keyboardtester.click/blog/best-laptops-with-good-gpu-2026.php" rel="noopener noreferrer"&gt;KeyboardTester.Click&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gaming</category>
      <category>laptops</category>
      <category>gpu</category>
      <category>hardware</category>
    </item>
    <item>
      <title>Why Luxury Keyboards Cost Thousands (and What the Price Actually Buys)</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Thu, 23 Jul 2026 15:09:32 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/why-luxury-keyboards-cost-thousands-and-what-the-price-actually-buys-1c6m</link>
      <guid>https://dev.to/keyboard-testerclick/why-luxury-keyboards-cost-thousands-and-what-the-price-actually-buys-1c6m</guid>
      <description>&lt;h2&gt;
  
  
  What makes a keyboard cost thousands?
&lt;/h2&gt;

&lt;p&gt;Luxury keyboard prices are not a straight performance scale. Much of the premium comes from small production runs, complex machining, hand finishing, unusual materials, custom layouts, and collector demand. Those details can make a board genuinely special, but a four-figure resale price does not make it four times faster for gaming or work.&lt;/p&gt;

&lt;p&gt;That distinction matters because asking prices are easy to publish and hard to verify. A credible comparison should separate products with an official buying path from auction-only antiques, discontinued collector pieces, and speculative marketplace listings. Availability, shipping, tax, customs, and optional accessories can also change the real checkout price.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you plan to use the keyboard
&lt;/h3&gt;

&lt;p&gt;Check the layout, switch support, firmware, replacement parts, warranty, and repair path before the finish or badge. A beautiful case is not useful if the configuration software disappears or a proprietary part cannot be replaced.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you plan to collect it
&lt;/h3&gt;

&lt;p&gt;Verify provenance and recent completed sales. Limited production can support value, but the listed price is not proof that buyers are paying it. Condition, original packaging, documentation, and included accessories matter.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you mainly want a premium typing experience
&lt;/h3&gt;

&lt;p&gt;You may get most of the practical benefit from a well-built hot-swap board, carefully selected switches, tuned stabilizers, and keycaps that suit your hands. Test sound and chatter rather than judging only from a polished product video.&lt;/p&gt;

&lt;p&gt;The full guide lists seven luxury keyboards with current official product or buying evidence, explains the price caveats, and compares them with practical mechanical and one-handed alternatives.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://keyboardtester.click/blog/most-expensive-luxury-keyboards-top-7.php" rel="noopener noreferrer"&gt;Read the complete luxury-keyboard comparison&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published and maintained at &lt;a href="https://keyboardtester.click/blog/most-expensive-luxury-keyboards-top-7.php" rel="noopener noreferrer"&gt;KeyboardTester.Click&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>keyboards</category>
      <category>hardware</category>
      <category>design</category>
      <category>gaming</category>
    </item>
    <item>
      <title>Best Gaming Keyboard 2026: Choose Layout and Switches Before Features</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Thu, 23 Jul 2026 15:09:27 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/best-gaming-keyboard-2026-choose-layout-and-switches-before-features-4ea2</link>
      <guid>https://dev.to/keyboard-testerclick/best-gaming-keyboard-2026-choose-layout-and-switches-before-features-4ea2</guid>
      <description>&lt;h2&gt;
  
  
  A faster way to choose a gaming keyboard in 2026
&lt;/h2&gt;

&lt;p&gt;Start with the physical decisions that affect every session: layout, switch feel, and desk space. A full-size board is useful when the numpad is part of your daily work. A TKL or 75% layout gives a low-sensitivity mouse more room while keeping the function row. A 60% board is compact, but its shortcut layers are a real tradeoff rather than a free upgrade.&lt;/p&gt;

&lt;p&gt;Switch choice comes next. Linear switches are usually the easiest starting point for fast repeated movement, tactile switches give a clearer actuation cue, and clicky switches add sound that can become tiring in a shared room or on voice chat. The label matters less than whether the force and travel remain comfortable after an hour.&lt;/p&gt;

&lt;p&gt;Rapid trigger and adjustable actuation can help in movement-heavy competitive games, especially when you want a key to reset as soon as it starts moving upward. They are not automatically better for typing, strategy games, or casual play. Pay for them only when you can explain the problem they solve in your setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  A practical shortlist
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Decide whether you genuinely need a numpad.&lt;/li&gt;
&lt;li&gt;Choose a layout that leaves enough mouse space.&lt;/li&gt;
&lt;li&gt;Pick a switch family, then test the actual board if possible.&lt;/li&gt;
&lt;li&gt;Check hot-swap support, firmware, warranty, and replacement keycaps.&lt;/li&gt;
&lt;li&gt;Treat wireless latency, RGB, and a display as secondary features.&lt;/li&gt;
&lt;li&gt;After buying, run a full key, rollover, and chatter check before the return window closes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The full KBT guide compares seven current picks and explains who each one is for. It also links to the keyboard tester, switch guide, rapid-trigger settings, sound test, NKRO test, and practical alternatives.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://keyboardtester.click/blog/best-mechanical-keyboards-for-gaming-2026.php" rel="noopener noreferrer"&gt;Read the full Best Mechanical Keyboards for Gaming 2026 guide&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published and maintained at &lt;a href="https://keyboardtester.click/blog/best-mechanical-keyboards-for-gaming-2026.php" rel="noopener noreferrer"&gt;KeyboardTester.Click&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gaming</category>
      <category>keyboards</category>
      <category>hardware</category>
      <category>productivity</category>
    </item>
    <item>
      <title>RTX 50 Hotspot Temperature Is Back: How to Check for GPU Throttling</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Tue, 21 Jul 2026 14:19:07 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/rtx-50-hotspot-temperature-is-back-how-to-check-for-gpu-throttling-57a7</link>
      <guid>https://dev.to/keyboard-testerclick/rtx-50-hotspot-temperature-is-back-how-to-check-for-gpu-throttling-57a7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Condensed cross-post of the original KeyboardTester.click guide: &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/rtx-50-hotspot-temperature-gpu-throttling.php" rel="noopener noreferrer"&gt;RTX 50 Hotspot Temperature Is Back: How to Check for GPU Throttling&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;RTX 50 hotspot readings are visible in current monitoring builds, but one alarming maximum does &lt;strong&gt;not&lt;/strong&gt; prove thermal throttling.&lt;/p&gt;

&lt;p&gt;CPUID lists &lt;strong&gt;HWMonitor 1.65.1&lt;/strong&gt;, dated July 16, 2026, and says RTX 50 hotspot support was fixed in that release. HWiNFO separately lists &lt;strong&gt;GPU Hot Spot Temperature for NVIDIA Blackwell&lt;/strong&gt; in &lt;strong&gt;pre-release v8.51 Build 6030&lt;/strong&gt;. Its stable 8.50 release should not be described as containing that addition.&lt;/p&gt;

&lt;p&gt;Those are third-party monitoring-tool changes. They do not show that NVIDIA officially restored or certified a public hotspot interface, and they do not mean every RTX 50 board has a cooling defect.&lt;/p&gt;

&lt;h2&gt;
  
  
  The signal that actually matters
&lt;/h2&gt;

&lt;p&gt;Thermal throttling is a pattern, not a single temperature:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The workload is repeated under the same conditions.&lt;/li&gt;
&lt;li&gt;Hotspot temperature rises in a similar way each time.&lt;/li&gt;
&lt;li&gt;GPU clocks or an available thermal/performance-limit indicator fall.&lt;/li&gt;
&lt;li&gt;Sustained performance falls with them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the hotspot rises while clocks and sustained FPS stay stable, heat alone is not proof of throttling. Likewise, one FPS dip can come from the browser compositor, another tab, power mode, driver scheduling, an extension, or a display cap.&lt;/p&gt;

&lt;p&gt;There is no universal RTX 50 hotspot limit or universal core-to-hotspot delta in this workflow. Board design, firmware, workload, sensor implementation, and vendor limits vary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prepare a repeatable comparison
&lt;/h2&gt;

&lt;p&gt;Download HWMonitor or HWiNFO only from its official site. Do not seek leaked NVIDIA MODS builds; they are unnecessary for this check and unofficial downloads add risk.&lt;/p&gt;

&lt;p&gt;Before the first run:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Record the GPU model, driver, browser, desktop/laptop type, power mode, and approximate room conditions.&lt;/li&gt;
&lt;li&gt;On a laptop, connect AC power and keep the same vendor performance profile.&lt;/li&gt;
&lt;li&gt;Close games, recorders, downloads, heavy tabs, and overlays.&lt;/li&gt;
&lt;li&gt;Keep the browser, window size, test settings, and foreground tab identical.&lt;/li&gt;
&lt;li&gt;Let the system cool, then reset the monitor's minimum and maximum values.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Run a fixed browser workload beside telemetry
&lt;/h2&gt;

&lt;p&gt;Open the free &lt;a href="https://keyboardtester.click/gpu-stress-test.php" rel="noopener noreferrer"&gt;GPU Stress Test&lt;/a&gt; beside HWMonitor or HWiNFO. Start with &lt;strong&gt;1,500 iterations and 1.0x resolution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Check the renderer before trusting the run. If it says SwiftShader, llvmpipe, software rendering, or the integrated GPU, the result is not an RTX 50 thermal test. Re-enable browser hardware acceleration, restart the browser, update the supported driver, or set the browser to the high-performance GPU in Windows Graphics settings.&lt;/p&gt;

&lt;p&gt;During a 60–120 second first pass, note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;instant FPS;&lt;/li&gt;
&lt;li&gt;the one-second average;&lt;/li&gt;
&lt;li&gt;minimum FPS;&lt;/li&gt;
&lt;li&gt;elapsed time;&lt;/li&gt;
&lt;li&gt;hotspot and general GPU temperature in the desktop monitor;&lt;/li&gt;
&lt;li&gt;clock speed, fan behavior, and any available limiter indicator.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The browser tool provides a fixed WebGL2 workload, renderer information, and FPS signals. It cannot read temperature, clocks, fans, voltage, power, or a performance-limit reason, and it does not calculate an automatic thermal verdict.&lt;/p&gt;

&lt;p&gt;If the RTX 50 is barely loaded, raise iterations gradually. Do not jump every system straight to 5,000 iterations and 2.0x resolution.&lt;/p&gt;

&lt;p&gt;Cool the system, then repeat the same run once. Comparing a cool start with warmed behavior is more useful than comparing unrelated maximum values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interpret the result conservatively
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Observed pattern&lt;/th&gt;
&lt;th&gt;Most defensible interpretation&lt;/th&gt;
&lt;th&gt;Next check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hotspot rises, clocks and sustained FPS remain stable&lt;/td&gt;
&lt;td&gt;Heat alone is not proof of throttling&lt;/td&gt;
&lt;td&gt;Repeat once and compare with model/vendor guidance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hotspot repeatedly rises while clocks and sustained FPS fall&lt;/td&gt;
&lt;td&gt;Supports thermal or power limiting, but still needs limiter telemetry&lt;/td&gt;
&lt;td&gt;Cool down, repeat, then check airflow, fans and power mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FPS is immediately low and renderer says SwiftShader/software&lt;/td&gt;
&lt;td&gt;Browser software rendering&lt;/td&gt;
&lt;td&gt;Fix hardware acceleration and restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Renderer shows integrated graphics&lt;/td&gt;
&lt;td&gt;Browser may be using the wrong GPU&lt;/td&gt;
&lt;td&gt;Select High performance in Windows Graphics settings and retest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One isolated spike with no clock/FPS change&lt;/td&gt;
&lt;td&gt;Insufficient evidence&lt;/td&gt;
&lt;td&gt;Repeat under identical conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artifacts, driver reset, black screen or crash&lt;/td&gt;
&lt;td&gt;Instability; cause is not proven by the browser&lt;/td&gt;
&lt;td&gt;Stop and use vendor diagnostics/support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Use the safe fix ladder
&lt;/h2&gt;

&lt;p&gt;Start with reversible changes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm HWMonitor 1.65.1 or a clearly labelled HWiNFO 8.51 pre-release.&lt;/li&gt;
&lt;li&gt;Reboot and repeat once with the same settings.&lt;/li&gt;
&lt;li&gt;Verify browser hardware acceleration and the real NVIDIA renderer.&lt;/li&gt;
&lt;li&gt;If Windows chose the integrated GPU, set the browser to &lt;strong&gt;High performance&lt;/strong&gt; under Graphics preferences and restart it.&lt;/li&gt;
&lt;li&gt;Use the current stable GPU driver or the laptop/board vendor's supported driver path.&lt;/li&gt;
&lt;li&gt;Return a deliberate overclock or undervolt to stock before collecting support evidence.&lt;/li&gt;
&lt;li&gt;Check vents, filters, fan response, case clearance, laptop surface, and ambient heat without opening the card.&lt;/li&gt;
&lt;li&gt;If extreme readings repeatedly align with clock/FPS loss or instability, save screenshots/logs and contact the system or board partner.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not use this article as a reason to open, repaste, shim, or replace thermal pads on a card under warranty. Cooler construction and warranty terms vary.&lt;/p&gt;

&lt;p&gt;Stop immediately for artifacts, repeated driver resets, a black screen, a crash, a burning smell, or abnormal fan behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related checks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;a href="https://keyboardtester.click/blog/ai-gpu-test-webgpu-browser-ai-readiness.php" rel="noopener noreferrer"&gt;AI GPU and WebGPU readiness guide&lt;/a&gt; when the question is capability or browser fallback, not sustained thermal behavior.&lt;/li&gt;
&lt;li&gt;Read the &lt;a href="https://keyboardtester.click/blog/best-laptops-with-good-gpu-2026.php" rel="noopener noreferrer"&gt;RTX 50 laptop guide&lt;/a&gt; for chassis, power-limit, and cooling context.&lt;/li&gt;
&lt;li&gt;Use the &lt;a href="https://keyboardtester.click/blog/frame-skipping-test-check-dropped-frames.php" rel="noopener noreferrer"&gt;frame-skipping guide&lt;/a&gt; when FPS appears stable but the monitor seems to miss refreshes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read the complete guide, sources, seven FAQs, and same-workload decision tree on &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/rtx-50-hotspot-temperature-gpu-throttling.php" rel="noopener noreferrer"&gt;KeyboardTester.click&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>hardware</category>
      <category>tutorial</category>
      <category>nvidia</category>
      <category>webgl</category>
    </item>
    <item>
      <title>Pen Pressure Not Working? Test the Stylus First, Then Fix the Driver or App</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Sun, 19 Jul 2026 21:12:16 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/pen-pressure-not-working-test-the-stylus-first-then-fix-the-driver-or-app-cgd</link>
      <guid>https://dev.to/keyboard-testerclick/pen-pressure-not-working-test-the-stylus-first-then-fix-the-driver-or-app-cgd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Condensed cross-post of the original guide on KeyboardTester.click: &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/pen-pressure-not-working-test-fix.php" rel="noopener noreferrer"&gt;Pen Pressure Not Working? Test the Stylus, Then Fix the Driver or App&lt;/a&gt;&lt;/strong&gt;. The full version has per-brand and per-app tables plus a video walkthrough.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A brush that ignores light and firm strokes can fail at several different layers: the pen may be incompatible, the tablet driver may expose the wrong interface, Windows Ink and WinTab may not match the app, or the selected brush may simply not use pressure. Buying hardware before you separate those layers wastes time and money.&lt;/p&gt;

&lt;p&gt;This is a reproducible fault-isolation workflow for Windows 10/11 with Wacom, Huion and XP-Pen devices in Photoshop, Krita and Clip Studio Paint. It is based on browser-visible Pointer Events plus current vendor documentation — a fault splitter, not a pass/fail certificate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the browser result before you change anything
&lt;/h2&gt;

&lt;p&gt;Open the free &lt;a href="https://keyboardtester.click/pen-pressure-test.php" rel="noopener noreferrer"&gt;Pen Pressure &amp;amp; Tilt Test&lt;/a&gt; and draw three slow diagonals from a light touch to a comfortably firm touch. It shows the Pointer Events data delivered to the browser: pointer type, normalized pressure from 0 to 1, min/max/average, tilt when exposed, and CSV/JSON export. Everything stays on your device.&lt;/p&gt;

&lt;p&gt;Interpret it like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pointer type is &lt;code&gt;pen&lt;/code&gt; and pressure varies&lt;/strong&gt; — the browser/OS path is receiving analog pressure. The fault is downstream in the app's brush or input API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pointer type is &lt;code&gt;pen&lt;/code&gt; but pressure is fixed at 0 or 0.5&lt;/strong&gt; — the browser is not receiving variable pressure. Check driver exposure, the input API, and the vendor tester.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pointer type is &lt;code&gt;mouse&lt;/code&gt; or &lt;code&gt;touch&lt;/code&gt;&lt;/strong&gt; — the browser does not see a pressure-capable pen. Confirm an active, compatible stylus and the correct driver.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MDN defines pressure as a normalized 0-to-1 value and notes that hardware without a pressure sensor can report &lt;code&gt;0.5&lt;/code&gt; while a button is active and &lt;code&gt;0&lt;/code&gt; otherwise. A changing value shows the browser receives analog pressure; a flat value only shows that this one path does not. It does not certify the hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Windows Ink vs WinTab: make the driver and app agree
&lt;/h2&gt;

&lt;p&gt;WinTab and Windows Ink are two different Windows input paths. Adobe documents Windows Ink as Photoshop's default route on current Windows; Krita exposes an input-API selector; Clip Studio distinguishes WinTab pen tablets from TabletPC devices. The useful rule is agreement, not ideology — the driver and the target app must use a compatible path. If one app fails while the browser and another app work, change only the failing app's profile, restart it, and re-test. Do not disable or enable Windows Ink everywhere as a blanket fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Per-app fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Photoshop&lt;/strong&gt; — In &lt;strong&gt;Brush Settings &amp;gt; Shape Dynamics&lt;/strong&gt;, set the control to &lt;strong&gt;Pen Pressure&lt;/strong&gt; and test with a pressure-enabled brush. Windows Ink is Adobe's default API; use a documented WinTab alternative only when you intentionally match that path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Krita&lt;/strong&gt; — Open &lt;strong&gt;Settings &amp;gt; Configure Krita &amp;gt; Tablet Settings&lt;/strong&gt;, choose WinTab or &lt;strong&gt;Windows 8+ Pointer Input&lt;/strong&gt;, restart Krita, and use its tablet tester. Krita recommends switching the API only for troubleshooting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clip Studio Paint&lt;/strong&gt; — For a screen/pen tablet use &lt;strong&gt;Preferences &amp;gt; Tablet &amp;gt; WinTab&lt;/strong&gt;; for a tablet PC use &lt;strong&gt;TabletPC&lt;/strong&gt;. Restart and compare another app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Per-brand drivers
&lt;/h2&gt;

&lt;p&gt;If both the browser and the target app stay flat, open the manufacturer's own pressure tester — that separates what the driver receives from what it exposes downstream.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wacom&lt;/strong&gt; — Confirm the driver is running, use its diagnostics to test the pen, and verify the app's Windows Ink setting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Huion&lt;/strong&gt; — Match driver and application protocols, test pressure in the driver, restart it, and reinstall the current official driver if needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XP-Pen&lt;/strong&gt; — Use the pressure test in the current PenTablet panel, remove other tablet drivers, and reinstall the current model-specific driver.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Broke right after a Windows update?
&lt;/h2&gt;

&lt;p&gt;Treat the timing as a clue, not proof. Reboot cleanly and confirm the device is detected, restore the matching Windows Ink/WinTab choice you recorded, then clean-install the correct vendor driver (removing conflicting tablet drivers first). Only compare driver versions with evidence — do not install random packages.&lt;/p&gt;

&lt;h2&gt;
  
  
  When it really is hardware
&lt;/h2&gt;

&lt;p&gt;Escalate only after the browser, the vendor tester, and more than one pressure-enabled app have been compared. Inspect the nib per the manual, reseat the cable, avoid an unpowered hub, try another supported port, and test a known-good pen or a second computer. Replace the tablet only after the cheaper compatibility, settings, driver, nib, cable, and pen checks fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related browser tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://keyboardtester.click/pen-pressure-test.php" rel="noopener noreferrer"&gt;Pen Pressure &amp;amp; Tilt Test&lt;/a&gt; — read pressure, tilt, twist, buttons, and sample rate live.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://keyboardtester.click/touch-screen-test.php" rel="noopener noreferrer"&gt;Touch Screen Test&lt;/a&gt; — map dead zones and phantom taps on a pen display or 2-in-1.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://keyboardtester.click/dead-pixel-test.php" rel="noopener noreferrer"&gt;Dead Pixel Test&lt;/a&gt; — scan a Cintiq or Kamvas display before you blame the pen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full guide with tables and video: &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/pen-pressure-not-working-test-fix.php" rel="noopener noreferrer"&gt;keyboardtester.click/blog/pen-pressure-not-working-test-fix.php&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>windows</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>art</category>
    </item>
    <item>
      <title>Cloudflare Workers Failover for Shared Hosting: A Practical Continuity Pattern</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Sat, 18 Jul 2026 09:56:18 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/cloudflare-workers-failover-for-shared-hosting-a-practical-continuity-pattern-1md6</link>
      <guid>https://dev.to/keyboard-testerclick/cloudflare-workers-failover-for-shared-hosting-a-practical-continuity-pattern-1md6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This is a condensed cross-post of the original KeyboardTester.click case study: &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/cloudflare-workers-shared-hosting-failover.php" rel="noopener noreferrer"&gt;Cloudflare Workers Failover for Shared Hosting: Our Live Setup&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A shared-hosting provider gave us a six-hour maintenance window but could not predict the actual interruption. A timed DNS switch to one maintenance page would have been simple, yet it would also have replaced more than 1,500 useful pages and browser tools with the same message.&lt;/p&gt;

&lt;p&gt;We chose a narrower continuity layer: an always-on Cloudflare Worker that tries the real origin first and uses a prebuilt static snapshot only when the origin is unavailable.&lt;/p&gt;

&lt;p&gt;This is not a second writable application stack, and it is not universal zero downtime. Forms, email, server-side AI, database writes, sessions, and saved actions still need the hosting server. The goal is to keep safe read-only journeys useful and make recovery automatic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The request flow
&lt;/h2&gt;

&lt;p&gt;For each request, the Worker follows this contract:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Request the shared-hosting origin with a bounded timeout.&lt;/li&gt;
&lt;li&gt;Pass healthy responses, redirects, and legitimate 4xx responses through unchanged.&lt;/li&gt;
&lt;li&gt;On a network error, timeout, selected 5xx response, or Cloudflare 520–527 status, look for the same path in the static snapshot.&lt;/li&gt;
&lt;li&gt;Serve the matching snapshot only for safe &lt;code&gt;GET&lt;/code&gt; or &lt;code&gt;HEAD&lt;/code&gt; requests.&lt;/li&gt;
&lt;li&gt;Return an honest &lt;code&gt;503 Service Unavailable&lt;/code&gt; with &lt;code&gt;Retry-After&lt;/code&gt; and &lt;code&gt;Cache-Control: no-store&lt;/code&gt; when a write cannot reach the origin.&lt;/li&gt;
&lt;li&gt;Try the origin again on later requests. The next healthy origin response passes through immediately.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The last point removes a fragile event-day task. No one has to notice a recovery email and manually disable a maintenance page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build the snapshot from rendered production
&lt;/h2&gt;

&lt;p&gt;Our local PHP tree contained unpublished work, so copying it would not have represented the live site. The builder crawled rendered canonical production instead.&lt;/p&gt;

&lt;p&gt;The tested package captured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1,514 rendered pages;&lt;/li&gt;
&lt;li&gt;1,234 referenced first-party assets;&lt;/li&gt;
&lt;li&gt;2,749 total files after manifests and support files;&lt;/li&gt;
&lt;li&gt;about 547.6 MB in total;&lt;/li&gt;
&lt;li&gt;no individual file above Cloudflare's asset limit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The crawler preserved canonical links, hreflang, structured data, internal links, scripts, styles, fonts, and client-side tool assets. It removed service-worker registration and production tracking from the stored copy. A restrained continuity notice was added so visitors could tell that dynamic functions might be unavailable.&lt;/p&gt;

&lt;p&gt;Production analytics and advertising can be injected by the Worker only when fallback HTML is actually served. Private staging should remain authenticated, &lt;code&gt;noindex&lt;/code&gt;, tracker-free, and ad-free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not treat every non-200 response as an outage
&lt;/h2&gt;

&lt;p&gt;A redirect, a 404, or an authorization response can be correct application behavior. Replacing all of them with the snapshot can create false pages and hide real errors.&lt;/p&gt;

&lt;p&gt;Our fallback set was deliberately limited to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;500, 502, 503, 504, 520, 521, 522, 523, 524, 525, 526, 527
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A sanitized version of the origin decision looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FALLBACK_STATUSES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;502&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;504&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;520&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;521&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;522&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;523&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;524&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;525&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;526&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;527&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;try&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;origin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;originRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AbortSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4500&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;manual&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;resolveOverride&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;origin-bypass.example.com&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;FALLBACK_STATUSES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&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;origin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;serveSnapshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;serveSnapshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&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;The hostname is only a placeholder. Do not publish an origin IP, account identifier, route identifier, access token, or real bypass hostname.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same-zone recursion trap
&lt;/h2&gt;

&lt;p&gt;Once a Worker route covers &lt;code&gt;example.com/*&lt;/code&gt;, a naive fetch to &lt;code&gt;https://example.com/...&lt;/code&gt; can run through the same Worker route again.&lt;/p&gt;

&lt;p&gt;Cloudflare's &lt;code&gt;resolveOverride&lt;/code&gt; can direct the origin lookup to a controlled DNS-only hostname in the same zone while preserving the public request URL and canonical &lt;code&gt;Host&lt;/code&gt; header. That avoids recursion without changing the URLs users and crawlers see.&lt;/p&gt;

&lt;p&gt;Treat the bypass hostname like infrastructure. Verify its TLS and virtual-host behavior, keep it out of public examples, and do not create one casually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unknown pages and write actions should fail honestly
&lt;/h2&gt;

&lt;p&gt;Returning the homepage with status 200 for every missing snapshot path would fabricate content and confuse both users and search engines.&lt;/p&gt;

&lt;p&gt;When the origin is unavailable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a known safe path can return its stored page or asset;&lt;/li&gt;
&lt;li&gt;an unknown safe path returns a controlled 503;&lt;/li&gt;
&lt;li&gt;a state-changing request returns 503 with &lt;code&gt;Retry-After&lt;/code&gt; and &lt;code&gt;no-store&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;no write is queued or reported as successful unless a real durable design supports that promise.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&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;HEAD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Temporarily unavailable&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="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&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;Retry-After&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;300&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;Cache-Control&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;no-store&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;Content-Type&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;text/plain; charset=utf-8&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Private staging is a release gate
&lt;/h2&gt;

&lt;p&gt;Before attaching public routes, we tested three different states:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Forced snapshot mode
&lt;/h3&gt;

&lt;p&gt;We checked the fallback marker, canonical URL, one H1, valid JSON-LD, first-party assets, maintenance notice, missing paths, &lt;code&gt;HEAD&lt;/code&gt;, write requests, localized pages, Arabic RTL, and mobile layout.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Origin preview
&lt;/h3&gt;

&lt;p&gt;We confirmed that the alternate lookup reached the real hosting origin without Worker recursion.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Healthy production pass-through
&lt;/h3&gt;

&lt;p&gt;We confirmed the fallback marker was absent and that normal pages, redirects, headers, ads, and analytics remained origin-generated.&lt;/p&gt;

&lt;p&gt;The remote snapshot audit covered 2,748 page and asset paths without failures. We did not deliberately break the public origin to test the design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rollback should be independent of deployment
&lt;/h2&gt;

&lt;p&gt;The fastest rollback is removing only the routes owned by the continuity Worker. It should not require deleting the Worker, changing DNS, rebuilding the site, or touching unrelated routes.&lt;/p&gt;

&lt;p&gt;Route tooling should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;list current routes before any change;&lt;/li&gt;
&lt;li&gt;refuse collisions;&lt;/li&gt;
&lt;li&gt;attach apex and &lt;code&gt;www&lt;/code&gt; one at a time;&lt;/li&gt;
&lt;li&gt;verify each hostname immediately;&lt;/li&gt;
&lt;li&gt;delete only the exact owned routes during rollback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For our availability use case, the public routes were also configured to fail open at the Worker request limit. If the free daily allowance is exhausted, Cloudflare bypasses the Worker and sends requests to the hosting origin instead of letting a quota error create a new outage. That trade-off is appropriate for continuity logic, but it would be wrong for a Worker enforcing authentication or another security boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO, analytics, and ads during fallback
&lt;/h2&gt;

&lt;p&gt;The snapshot stays on the original domain and preserves the existing canonical tags, structured data, hreflang, and internal links. A page that really exists in the snapshot returns 200; an unavailable action or unknown page returns 503.&lt;/p&gt;

&lt;p&gt;There is no public backup domain to index and no duplicate URL set to submit. Private staging remains blocked from crawling.&lt;/p&gt;

&lt;p&gt;For production fallback HTML, analytics and ads can load with the same delayed posture as the main site. In our implementation, a streaming &lt;code&gt;HTMLRewriter&lt;/code&gt; adds them only to fallback &lt;code&gt;GET&lt;/code&gt; HTML. It does not modify &lt;code&gt;HEAD&lt;/code&gt;, CSS, JavaScript, images, or healthy origin responses.&lt;/p&gt;

&lt;p&gt;Ad delivery and revenue are never guaranteed, especially during an outage. Keeping the code available is not the same as guaranteeing fill.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this pattern fits
&lt;/h2&gt;

&lt;p&gt;This approach is useful when most value is in public content and client-side tools, the canonical site already uses Cloudflare, and a stale-but-recent read-only copy is better than a blanket maintenance page.&lt;/p&gt;

&lt;p&gt;It is a poor substitute for real application replication when the product is write-heavy, authenticated, transactional, or dependent on a frequently changing database.&lt;/p&gt;

&lt;p&gt;The broader lesson is simple: choose the smallest continuity layer that matches the failure mode, test it privately, preserve honest HTTP semantics, and make both recovery and rollback boring.&lt;/p&gt;

&lt;p&gt;The full case study includes the provider decision comparison, implementation checklist, status matrix, visual request flow, evidence timeline, and source links: &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/cloudflare-workers-shared-hosting-failover.php" rel="noopener noreferrer"&gt;read the original Cloudflare Workers failover guide&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>cloudflare</category>
      <category>webdev</category>
      <category>devops</category>
      <category>performance</category>
    </item>
    <item>
      <title>Laser Printer Repeating Marks: Drum, Roller or Fuser?</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Thu, 16 Jul 2026 13:44:38 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/laser-printer-repeating-marks-drum-roller-or-fuser-4ogk</link>
      <guid>https://dev.to/keyboard-testerclick/laser-printer-repeating-marks-drum-roller-or-fuser-4ogk</guid>
      <description>&lt;p&gt;A black dot, smear, shadow, or pale patch that returns at an even interval down every sheet is more than an annoying print defect. It is evidence.&lt;/p&gt;

&lt;p&gt;Paper moves forward while drums and rollers rotate. If one point on a rotating surface is dirty, worn, or damaged, it can touch the page once per revolution. That is why measuring the gap between matching marks can narrow the fault.&lt;/p&gt;

&lt;p&gt;But there is one rule worth stating before any measurement:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Distance alone does not identify the failed part.&lt;/strong&gt; The same interval can belong to different components, even in one printer model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Use the interval together with the affected color, whether the toner rubs off, and the image-quality table for your exact printer model.&lt;/p&gt;

&lt;p&gt;You can generate the required sheet with the free &lt;a href="https://keyboardtester.click/printer-test-page.php" rel="noopener noreferrer"&gt;printer test page and repeating-defect ruler&lt;/a&gt;. The complete illustrated version of this workflow is available in the &lt;a href="https://keyboardtester.click/blog/laser-printer-repeating-marks-drum-roller-fuser.php" rel="noopener noreferrer"&gt;original laser-printer repeating-marks guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Confirm that the defect really repeats
&lt;/h2&gt;

&lt;p&gt;Look for at least three appearances of the same recognizable mark. One isolated spot may be loose toner or paper debris. A continuous vertical line is more likely a scratch or contamination that stays in contact with the page; the interval method is designed for separate repeating marks.&lt;/p&gt;

&lt;p&gt;Next, separate the printer engine from the file and scanner path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The same mark appears on an internal configuration or quality page:&lt;/strong&gt; the fault is in the printer, cartridge, or paper path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only one file or application is affected:&lt;/strong&gt; export a fresh PDF or test another driver before buying hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only photocopies are affected:&lt;/strong&gt; clean the flatbed glass and the narrow ADF glass strip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct prints are clean:&lt;/strong&gt; do not open the print engine until you have ruled out the source document and scanner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An internal page printed from the control panel is especially useful because it removes the computer, application, and original document from the test.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Print at 100% and verify the scale
&lt;/h2&gt;

&lt;p&gt;Open the &lt;a href="https://keyboardtester.click/printer-test-page.php" rel="noopener noreferrer"&gt;printer diagnostic page&lt;/a&gt;, choose A4 or Letter to match the paper in the tray, and include the repeating-defect ruler.&lt;/p&gt;

&lt;p&gt;In the system print dialog, select &lt;strong&gt;Actual size&lt;/strong&gt; or &lt;strong&gt;100%&lt;/strong&gt;. Turn off options such as Fit, Shrink, Scale to page, and borderless enlargement.&lt;/p&gt;

&lt;p&gt;After printing, check the page's 100 mm reference with a physical metric ruler. If the reference is not exactly 100 mm, correct the print scale and print again. A scaled sheet produces a scaled measurement, which can point to the wrong component.&lt;/p&gt;

&lt;p&gt;If no physical ruler is available, a calibrated &lt;a href="https://keyboardtester.click/online-ruler.php" rel="noopener noreferrer"&gt;online ruler&lt;/a&gt; can provide a quick screen reference, but a real metric ruler remains the better choice for a printed defect sheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Measure matching points center-to-center
&lt;/h2&gt;

&lt;p&gt;Choose a distinctive feature on the first mark: its center, a sharp upper edge, or its darkest speck. Measure to the identical feature on the next occurrence.&lt;/p&gt;

&lt;p&gt;Then measure the next pair.&lt;/p&gt;

&lt;p&gt;Three appearances give you two intervals. If those measurements are close, the periodic pattern is probably real. If they differ substantially, you may have grouped unrelated marks.&lt;/p&gt;

&lt;p&gt;Record the result in both millimeters and inches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;25.4 mm = 1 inch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using both units makes it easier to compare your result with manufacturer documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Combine the distance with what the mark looks like
&lt;/h2&gt;

&lt;p&gt;Treat the following as triage clues, not a final parts verdict:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you observe&lt;/th&gt;
&lt;th&gt;More plausible area&lt;/th&gt;
&lt;th&gt;Safest next check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One color repeats&lt;/td&gt;
&lt;td&gt;That color's cartridge, drum, or developer&lt;/td&gt;
&lt;td&gt;Print the model's color-quality pages; inspect or swap only if the manual permits it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Every color repeats at the same interval&lt;/td&gt;
&lt;td&gt;Shared fuser or transfer path&lt;/td&gt;
&lt;td&gt;Check the all-color entry in the exact model's defect-spacing table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toner rubs off after the page cools&lt;/td&gt;
&lt;td&gt;Fusing or media setting&lt;/td&gt;
&lt;td&gt;Verify the supported paper type and run the documented cleaning step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A faint earlier image returns&lt;/td&gt;
&lt;td&gt;Ghosting from drum charge, toner, environment, or fuser&lt;/td&gt;
&lt;td&gt;Try plain paper, correct media settings, and the built-in cleaning cycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only copies show the mark&lt;/td&gt;
&lt;td&gt;Scanner or ADF glass&lt;/td&gt;
&lt;td&gt;Clean the flatbed and narrow ADF glass strip as the manual directs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An internal page is clean&lt;/td&gt;
&lt;td&gt;File, application, or driver&lt;/td&gt;
&lt;td&gt;Print another file, export a PDF, and test the manufacturer driver&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Color is particularly useful in a color laser printer. A problem confined to one color occurs before the color paths combine more often than a defect repeated in every color.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why “94 mm = drum” is unsafe
&lt;/h2&gt;

&lt;p&gt;HP's model-specific defect-spacing page for the Color LaserJet Enterprise flow MFP M880 lists &lt;strong&gt;94 mm (3.70 in)&lt;/strong&gt; for two different areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the pressure roller/fuser when every color is affected;&lt;/li&gt;
&lt;li&gt;the corresponding photosensitive drum when only one or two colors are affected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same distance therefore points to different components within the same model. Across printer brands and models, roller diameters, cartridge architecture, paper paths, and serviceable parts vary further.&lt;/p&gt;

&lt;p&gt;Do not take the M880 example and apply it to another printer.&lt;/p&gt;

&lt;p&gt;Write down the full model number from the front panel, rear label, or settings page. Search the manufacturer's support site for that exact model plus terms such as &lt;strong&gt;repeating defects&lt;/strong&gt;, &lt;strong&gt;defect spacing&lt;/strong&gt;, &lt;strong&gt;image quality&lt;/strong&gt;, or &lt;strong&gt;print-quality test pages&lt;/strong&gt;. Match both the interval and the symptom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safe checks before opening the printer
&lt;/h2&gt;

&lt;p&gt;Start with the low-risk steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the printer's built-in cleaning cycle.&lt;/li&gt;
&lt;li&gt;Confirm the selected paper type matches the paper in the tray.&lt;/li&gt;
&lt;li&gt;Test with a fresh sheet from a dry ream of plain paper.&lt;/li&gt;
&lt;li&gt;Follow the manual for the exact model before opening any cover.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Laser printers contain hot surfaces, high voltage, light-sensitive drums, and loose toner. Keep these limits in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Let the fuser cool before reaching near the rear door or paper exit.&lt;/li&gt;
&lt;li&gt;Never touch the shiny photosensitive drum surface.&lt;/li&gt;
&lt;li&gt;Do not open or disassemble a toner cartridge.&lt;/li&gt;
&lt;li&gt;Avoid aerosol cleaners, solvents, and clouds of compressed air.&lt;/li&gt;
&lt;li&gt;Stop when the manual identifies a fuser or transfer assembly as service-only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A fuser may be user-replaceable in one model and technician-only in another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repair, use the warranty, or replace the printer?
&lt;/h2&gt;

&lt;p&gt;Do not compare a generic part price with a new printer. Compare the exact compatible part, technician labor, remaining warranty, page count, supplies already on hand, and the cost of downtime.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Under warranty or service contract:&lt;/strong&gt; save the marked sheet and contact support before opening assemblies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual names a user-replaceable cartridge or drum:&lt;/strong&gt; price the exact supported part and check its return policy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual identifies a technician-only fuser or transfer unit:&lt;/strong&gt; request a written repair quote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Several costly systems are worn or parts are scarce:&lt;/strong&gt; compare the full repair quote with a suitable replacement printer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence is mixed:&lt;/strong&gt; repeat the controlled print before ordering anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One more correctly scaled test page costs far less than the wrong drum or fuser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the diagnostic sheet
&lt;/h2&gt;

&lt;p&gt;Write these details directly on the marked page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exact printer and cartridge model;&lt;/li&gt;
&lt;li&gt;center-to-center interval in mm and inches;&lt;/li&gt;
&lt;li&gt;affected color or colors;&lt;/li&gt;
&lt;li&gt;whether cooled toner rubs off;&lt;/li&gt;
&lt;li&gt;whether an internal page shows the defect;&lt;/li&gt;
&lt;li&gt;paper type and print setting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sheet gives manufacturer support or a repair technician reproducible evidence instead of a vague description.&lt;/p&gt;

&lt;p&gt;For the printable ruler, illustrations, decision table, safety notes, sources, and FAQ, read the original guide:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://keyboardtester.click/blog/laser-printer-repeating-marks-drum-roller-fuser.php" rel="noopener noreferrer"&gt;Laser Printer Repeating Marks: Measure the Gap and Find the Fault&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.hp.com/cpso-support-new/pq/M880/defectspacing.html" rel="noopener noreferrer"&gt;HP M880 defect spacing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.brother-usa.com/app/answers/detail/a_id/185709/~/ghosting-or-text-and-images-repeat-or-double-print" rel="noopener noreferrer"&gt;Brother: ghosting or repeated images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.lexmark.com/content/dam/support/collateral/xerox_hardware/c230_c2432_c300/ug/pdf/Users_Guide_XeroxC240_XeroxC2432_XeroxC300_en.pdf" rel="noopener noreferrer"&gt;Xerox C240/C2432/C300 User Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hardware</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>printing</category>
    </item>
    <item>
      <title>Phone Not Vibrating? A 10-Second Browser Check Tells You If the Motor Is Dead</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Thu, 16 Jul 2026 13:44:19 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/phone-not-vibrating-a-10-second-browser-check-tells-you-if-the-motor-is-dead-5bfb</link>
      <guid>https://dev.to/keyboard-testerclick/phone-not-vibrating-a-10-second-browser-check-tells-you-if-the-motor-is-dead-5bfb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This is a cross-post of a guide I originally published on KeyboardTester.click:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/phone-not-vibrating-test-vibration-motor-fix.php" rel="noopener noreferrer"&gt;Phone Not Vibrating? Test Your Vibration Motor and Fix It&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When a phone stops vibrating, almost everyone guesses. Is it a setting? Is the motor dead? Do I need a repair? You can stop guessing in about ten seconds — and the trick is a browser API most web developers already know.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fork: settings vs a dead motor
&lt;/h2&gt;

&lt;p&gt;The Web Vibration API exposes a single function:&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;// A 200 ms buzz&lt;/span&gt;
&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;vibrate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// A pattern: vibrate 100 ms, pause 50 ms, vibrate 100 ms&lt;/span&gt;
&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;vibrate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// Cancel any ongoing vibration&lt;/span&gt;
&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;vibrate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That call asks the operating system to fire the vibration motor &lt;strong&gt;directly&lt;/strong&gt;, skipping your ringtone, Do Not Disturb, and per-app notification layers. So the result is clean evidence about the hardware itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It buzzes&lt;/strong&gt; → the motor physically works. Your problem is a &lt;em&gt;setting&lt;/em&gt; (sound mode, Do Not Disturb, battery saver, or one app's notification config).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total silence&lt;/strong&gt; → you are probably on the &lt;em&gt;hardware&lt;/em&gt; path: case off, sliders up, retest, then price a repair.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I put a free, no-install tester at &lt;strong&gt;&lt;a href="https://keyboardtester.click/vibration-test.php" rel="noopener noreferrer"&gt;vibration-test.php&lt;/a&gt;&lt;/strong&gt; that plays tap-to-run patterns (short pulse, one-second buzz, triple tap, SOS, heartbeat, and a custom millisecond pattern). Important honesty note: it &lt;em&gt;triggers&lt;/em&gt; vibration; it cannot &lt;em&gt;measure&lt;/em&gt; vibration strength — the browser has no API for that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The platform catch every dev should know
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;navigator.vibrate()&lt;/code&gt; is &lt;strong&gt;Android-only in practice&lt;/strong&gt;. Two gotchas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;iOS Safari has never shipped it.&lt;/strong&gt; Apple cites fingerprinting risk; MDN lists it as unsupported. So on iPhone the browser check simply cannot run — you go to &lt;strong&gt;Settings &amp;gt; Sounds &amp;amp; Haptics&lt;/strong&gt; instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firefox dropped it.&lt;/strong&gt; Firefox removed the Vibration API in 2024, so on Android use &lt;strong&gt;Chrome or Samsung Internet&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worldwide that is still most phones: Android holds &lt;strong&gt;69.14%&lt;/strong&gt; of mobile OS share vs &lt;strong&gt;30.79%&lt;/strong&gt; for iOS (StatCounter, June 2026).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Android settings ladder (when the motor works)
&lt;/h2&gt;

&lt;p&gt;If the test buzzes, walk these in order: ring/vibrate mode → Do Not Disturb → "Vibrate on ring/notifications" toggles → battery saver (it throttles haptics) → per-app notification settings → the system haptic-strength slider. One of them is the culprit.&lt;/p&gt;

&lt;p&gt;The Samsung "Never Play" haptics trap is a common one: a single toggle can silence feedback while everything else looks correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  When it is hardware: what it actually costs
&lt;/h2&gt;

&lt;p&gt;If it stays silent everywhere — no keyboard taps, no call buzz — price a fix with real numbers instead of dread:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Software-level shop fix:&lt;/strong&gt; $39–59 (Owl Repair, 2026)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android vibration motor replacement:&lt;/strong&gt; $69–129 depending on model (Owl Repair, 2026)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iPhone 13 Taptic Engine, Apple self-repair:&lt;/strong&gt; $43.64 part + $49 tool rental = &lt;strong&gt;$92.64&lt;/strong&gt;; $99 with AppleCare+; $449 out-of-warranty "other damage" (AppleInsider, 2022)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A vibration motor is one of the cheaper board-level repairs. Under warranty/AppleCare+/carrier protection, a short video of the silent test is unambiguous claim evidence — Owl Repair attributes roughly 60% of no-vibration phones to hardware faults.&lt;/p&gt;

&lt;p&gt;And the "factory reset first" advice you see everywhere? Skip it. If the browser test buzzes, the hardware is fine and a reset is a waste; if it is silent, a reset will not repair a motor.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Run the check: &lt;strong&gt;&lt;a href="https://keyboardtester.click/vibration-test.php" rel="noopener noreferrer"&gt;vibration motor test&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Full walkthrough (Android ladder + iPhone checklist + costs): &lt;strong&gt;&lt;a href="https://keyboardtester.click/blog/phone-not-vibrating-test-vibration-motor-fix.php" rel="noopener noreferrer"&gt;Phone Not Vibrating? Test Your Vibration Motor and Fix It&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your phone's touchscreen also started misbehaving after a drop, a quick &lt;a href="https://keyboardtester.click/blog/ghost-touch-test-online-touchscreen-dead-zones.php" rel="noopener noreferrer"&gt;ghost touch test&lt;/a&gt; is worth running before you pay for anything, so one repair quote covers everything at once.&lt;/p&gt;

</description>
      <category>android</category>
      <category>webdev</category>
      <category>mobile</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Your 1080p Webcam Is Probably Streaming at 720p — Here's How to Prove It (and Fix It)</title>
      <dc:creator>keyboardTester.Click</dc:creator>
      <pubDate>Sun, 12 Jul 2026 17:34:09 +0000</pubDate>
      <link>https://dev.to/keyboard-testerclick/your-1080p-webcam-is-probably-streaming-at-720p-heres-how-to-prove-it-and-fix-it-655</link>
      <guid>https://dev.to/keyboard-testerclick/your-1080p-webcam-is-probably-streaming-at-720p-heres-how-to-prove-it-and-fix-it-655</guid>
      <description>&lt;p&gt;The number printed on your webcam's box is a capability, not a promise. What actually reaches Zoom, Meet, or Teams is whatever the camera hands over &lt;em&gt;right now&lt;/em&gt; — and for a lot of "1080p" webcams, that is 1280×720 or worse.&lt;/p&gt;

&lt;p&gt;You can check it in about ten seconds, no install: open the &lt;a href="https://keyboardtester.click/camera-resolution-test.php" rel="noopener noreferrer"&gt;camera resolution test&lt;/a&gt;, allow camera access, select a 1080p target, and read the width × height the browser reports back. Browser delivery is exactly what the web clients of Zoom, Meet, and Teams consume, so this readout is the honest baseline.&lt;/p&gt;

&lt;p&gt;Full guide with the resolution table, fix ladder, and FAQ:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://keyboardtester.click/blog/how-to-check-webcam-resolution-really-1080p.php" rel="noopener noreferrer"&gt;How to Check Webcam Resolution (Is It Really 1080p?)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a "1080p" camera delivers 720p
&lt;/h2&gt;

&lt;p&gt;Before blaming the hardware, four things silently cap resolution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Low light.&lt;/strong&gt; Tiny webcam sensors starve in dim rooms; the camera raises gain, adds noise, and many models drop frame rate or resolution to keep the image usable. Same camera, sharp at noon, mush at night.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;USB bandwidth.&lt;/strong&gt; USB 2.0 tops out at 480 Mbps (&lt;a href="https://www.usb.org/document-library/usb-20-specification" rel="noopener noreferrer"&gt;USB-IF spec&lt;/a&gt;). Uncompressed 1080p30 needs roughly 1 Gbps (1920 × 1080 × 2 bytes × 30 fps — plain arithmetic). Cameras cope by compressing or silently stepping down to 720p, and a shared hub makes it worse. A direct rear-panel USB 3.0 port is the clean test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows picked a lower default "media type".&lt;/strong&gt; Settings &amp;gt; Bluetooth &amp;amp; devices &amp;gt; Cameras &amp;gt; your camera &amp;gt; set Media type to the highest resolution instead of "Let Windows choose" — the fix traced in a &lt;a href="https://learn.microsoft.com/en-us/answers/questions/5546070/low-quality-camera-in-teams-desktop" rel="noopener noreferrer"&gt;Microsoft Q&amp;amp;A thread on low-quality Teams video&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The app itself.&lt;/strong&gt; See below — the caps are documented, by design.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The apps cap you on purpose
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zoom:&lt;/strong&gt; in group meetings, HD 720p applies to the active-speaker layout and requires a paid account; Full HD 1080p must be enabled by Zoom Support and needs an i7 quad-core or better with virtual backgrounds off (&lt;a href="https://support.zoom.com/hc/en/article?id=zm_kb&amp;amp;sysparm_article=KB0066166" rel="noopener noreferrer"&gt;Zoom Support&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Meet:&lt;/strong&gt; send resolution is selectable at 360p, 720p, or 1080p — and 360p "uses less data, but your camera will send a lower quality picture" (&lt;a href="https://support.google.com/meet/answer/9302964" rel="noopener noreferrer"&gt;Google Meet Help&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft Teams:&lt;/strong&gt; "always conservative on bandwidth utilization", delivering HD "in under 1.5 Mbps"; on the minimum bandwidth tier, meeting video runs at up to 240p (&lt;a href="https://learn.microsoft.com/en-us/microsoftteams/prepare-network" rel="noopener noreferrer"&gt;Microsoft Learn&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So even a genuinely healthy 1080p webcam is often streamed below its spec. The point of checking first is knowing which side of the pipeline to fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixes, in order of cost
&lt;/h2&gt;

&lt;p&gt;Light on your face first (free, biggest visible win), direct USB port second, turn HD on in the app (Zoom: Settings &amp;gt; Video &amp;gt; HD; Meet: Settings &amp;gt; Video &amp;gt; Send resolution), fix the Windows media type, and only then think about new hardware. After each change, re-run the &lt;a href="https://keyboardtester.click/camera-resolution-test.php" rel="noopener noreferrer"&gt;webcam resolution check&lt;/a&gt; and confirm the number moved.&lt;/p&gt;

&lt;p&gt;For the rest of the pre-call routine: a &lt;a href="https://keyboardtester.click/webcamtesterindex.php" rel="noopener noreferrer"&gt;full webcam test&lt;/a&gt; for framing and device info, the &lt;a href="https://keyboardtester.click/webcam-mirror.php" rel="noopener noreferrer"&gt;webcam mirror&lt;/a&gt; to fix lighting the way the camera sees it, and a &lt;a href="https://keyboardtester.click/mic-tester.php" rel="noopener noreferrer"&gt;microphone check&lt;/a&gt; so you sound as good as you look.&lt;/p&gt;

&lt;p&gt;Everything runs in the browser with standard &lt;code&gt;getUserMedia&lt;/code&gt; constraints — which are, fittingly, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Media_Capture_and_Streams_API/Constraints" rel="noopener noreferrer"&gt;preferences rather than guarantees&lt;/a&gt;. That's the whole story of webcam resolution in one API design decision.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>remotework</category>
      <category>hardware</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
