<?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: freeourdays</title>
    <description>The latest articles on DEV Community by freeourdays (@freeourdays).</description>
    <link>https://dev.to/freeourdays</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%2F1320167%2Fd40625f2-d809-44fe-8cba-9d10fb8a4d74.jpeg</url>
      <title>DEV Community: freeourdays</title>
      <link>https://dev.to/freeourdays</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/freeourdays"/>
    <language>en</language>
    <item>
      <title>A fresh free LLM API key,every morning</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Tue, 06 Oct 2026 05:23:34 +0000</pubDate>
      <link>https://dev.to/freeourdays/a-fresh-free-llm-api-keyevery-morning-e8f</link>
      <guid>https://dev.to/freeourdays/a-fresh-free-llm-api-keyevery-morning-e8f</guid>
      <description>&lt;p&gt;Want to try a new model or run a quick script demo without thinking about billing? Now you can. Y-API's "daily shared free key" hands out a ready-to-use key every day with a $20 quota pool behind it — log in and claim it.&lt;/p&gt;

&lt;p&gt;## How it works&lt;/p&gt;

&lt;p&gt;Every day at 00:05 UTC, the system issues a new shared API key backed by a&lt;br&gt;
  $20 pool for that day. First come, first served — once the pool is drained, you wait for tomorrow's key. The old key dies automatically when the new one goes live.&lt;/p&gt;

&lt;p&gt;Why is the key shared? Because it's a trial key by design: it gets you in the door and lets you run real requests the same day, not a long-lived credential.&lt;br&gt;
  The page shows the remaining quota and the number of claims in real time, so check before you head over.&lt;/p&gt;

&lt;p&gt;## Three steps&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign in to Y-API with GitHub or Google;&lt;/li&gt;
&lt;li&gt;Open /daily-key and copy today's key;&lt;/li&gt;
&lt;li&gt;Plug the key and the Base URL shown on the page into any OpenAI-compatible client.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CLI users can go straight to curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;the API endpoint shown on the claim page&amp;gt;
  &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your claimed key&amp;gt;

  curl &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OPENAI_BASE_URL&lt;/span&gt;&lt;span class="s2"&gt;/v1/chat/completions"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$OPENAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"model":"&amp;lt;a model from the list
  below&amp;gt;","messages":[{"role":"user","content":"hi"}]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;## Models available today (snapshot: 2026-10-06)&lt;/p&gt;

&lt;p&gt;20 models, grouped by provider prefix — the live list on the claim page is&lt;br&gt;
  always the source of truth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  openai:     openai/gpt-5.6-sol · openai/gpt-5.6-luna
  anthropic:  anthropic/claude-opus-5 · anthropic/claude-sonnet-5
  deepseek:   deepseek/deepseek-v4-flash · deepseek/deepseek-v4-pro ·
              deepseek/deepseek-v4.1-flash · deepseek/deepseek-v4-flash-0731
  moonshotai: moonshotai/kimi-k3 · moonshotai/kimi-k2.6
  z-ai:       z-ai/glm-5.2 · z-ai/glm-5.3 · z-ai/glm-5.3-flash
  qwen:       qwen/qwen3.8-flash
  minimax:    minimax/minimax-m2.7
  tencent:    tencent/hy3 · tencent/hy4-preview
  xiaomi:     xiaomi/mimo-v2.5 · xiaomi/mimo-v2.6-flash
  stepfun:    stepfun/step-3.7-flash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Good to know
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The pool is shared&lt;/strong&gt;: once today's $20 is used up by everyone, the next
key arrives at 00:05 UTC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't ship it to production&lt;/strong&gt;: this key expires tomorrow. For steady
workloads, use your own account's key — quota and billing stay yours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic gate on new sign-ups&lt;/strong&gt;: to keep bot farms from draining the pool,
registration has an account-age check. Existing users are unaffected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today's key is already on the page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://y-api.bestvirtualgoods.com/daily-key" rel="noopener noreferrer"&gt;https://y-api.bestvirtualgoods.com/daily-key&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Last 3 days of the promotion</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Mon, 28 Sep 2026 04:42:54 +0000</pubDate>
      <link>https://dev.to/freeourdays/last-3-days-of-the-promotion-1npp</link>
      <guid>https://dev.to/freeourdays/last-3-days-of-the-promotion-1npp</guid>
      <description>&lt;p&gt;Final 3 days of the promotion: &lt;/p&gt;

&lt;p&gt;Top up just $1 and get $20 in credits. &lt;/p&gt;

&lt;p&gt;You can use the API for all available models.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://y-api.bestvirtualgoods.com" rel="noopener noreferrer"&gt;Y-API&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>ai</category>
    </item>
    <item>
      <title>A money-saving tip for using LLMs.</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Sun, 20 Sep 2026 14:40:21 +0000</pubDate>
      <link>https://dev.to/freeourdays/a-money-saving-tip-for-using-llms-3mbn</link>
      <guid>https://dev.to/freeourdays/a-money-saving-tip-for-using-llms-3mbn</guid>
      <description>&lt;p&gt;Honestly, for most of my workflows these days, DeepSeek V4, GLM 5.3, and Kimi K3 are more than capable.&lt;/p&gt;

&lt;p&gt;For the smaller number of genuinely challenging tasks, I still turn to GPT-6 to dig deeper and work out a solution.&lt;/p&gt;

&lt;p&gt;Besides keeping the official services as a fallback, I’ve also been using third-party API gateways more often lately. The main appeal is simple: they’re cheap, and some even offer free models.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://y-api.bestvirtualgoods.com" rel="noopener noreferrer"&gt;https://y-api.bestvirtualgoods.com&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Unlimited access to the cheapest DeepSeek.</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Wed, 09 Sep 2026 13:20:07 +0000</pubDate>
      <link>https://dev.to/freeourdays/unlimited-access-to-the-cheapest-deepseek-1i40</link>
      <guid>https://dev.to/freeourdays/unlimited-access-to-the-cheapest-deepseek-1i40</guid>
      <description>&lt;p&gt;I found a website where you can use the DeepSeek API for free, and you can also top up credits for other premium model APIs at just 1/20 of the regular price.&lt;/p&gt;

&lt;p&gt;For example, if you top up $5, you’ll ultimately receive $100 worth of API credits.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://y-api.bestvirtualgoods.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fy-api.bestvirtualgoods.com%2Fog-default.png" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://y-api.bestvirtualgoods.com/" rel="noopener noreferrer" class="c-link"&gt;
            Y-API — The LLM API everyone can afford
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Limited-time: $1 buys $20 of credit (reverts to 1:10 afterwards) — pay per token, with no monthly fee and no minimum spend. OpenAI-compatible — change one base_url to access DeepSeek, Qwen, MiniMax, Z.ai, Moonshot AI, and Xiaomi.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fy-api.bestvirtualgoods.com%2Ffavicon.svg" width="32" height="32"&gt;
          y-api.bestvirtualgoods.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


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

</description>
    </item>
    <item>
      <title>Our own CDN was 403-ing the official OpenAI SDK, and our test suite couldn't see it</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Mon, 31 Aug 2026 16:17:52 +0000</pubDate>
      <link>https://dev.to/freeourdays/our-own-cdn-was-403-ing-the-official-openai-sdk-and-our-test-suite-couldnt-see-it-3lb7</link>
      <guid>https://dev.to/freeourdays/our-own-cdn-was-403-ing-the-official-openai-sdk-and-our-test-suite-couldnt-see-it-3lb7</guid>
      <description>&lt;p&gt;We wrote a bot-blocking rule at the CDN edge. It matched the official OpenAI and&lt;br&gt;
Anthropic SDKs by the shape of their User-Agent string and returned 403 to all of&lt;br&gt;
them. It ran that way for a while, and our compatibility test suite reported green&lt;br&gt;
the entire time.&lt;/p&gt;

&lt;p&gt;The suite was green because the probe sent its own User-Agent, and its own&lt;br&gt;
User-Agent was on the allowlist. That is the part worth your time. The outage is&lt;br&gt;
ordinary; the blind spot is structural, and it is sitting in most home-grown test&lt;br&gt;
tooling I have seen.&lt;/p&gt;

&lt;p&gt;Three mistakes below, all ours. Numbers are from the retest on 2026-08-31.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the failure actually looked like
&lt;/h2&gt;

&lt;p&gt;The rule was aimed at AI crawlers. It matched on a &lt;code&gt;Vendor/Language version&lt;/code&gt;&lt;br&gt;
User-Agent pattern, which is exactly what the official SDKs send by default:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OpenAI/Python 1.68.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OpenAI/JS 4.104.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Anthropic/JS 0.120.0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The damage split into two layers, which is why it stayed invisible for so long:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Humans were fine.&lt;/strong&gt; Someone clicking a link from an external site got a normal
page. Browser traffic never matched the pattern.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developers were not.&lt;/strong&gt; Anyone who installed the official SDK and pointed it at
our endpoint got &lt;code&gt;403 Your request was blocked.&lt;/code&gt; before their request reached the
application at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI engines were not either.&lt;/strong&gt; The same rule blocked crawler User-Agents, so the
&lt;code&gt;llms.txt&lt;/code&gt; assets we had written specifically for them were unreachable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The 403 is worse than a plain outage, because of what it looks like from the other&lt;br&gt;
side. A blocked request returns 403, not 401. A developer whose first-ever request&lt;br&gt;
to your API returns 403 concludes that they pasted the key wrong. They will not file&lt;br&gt;
a bug. They will close the tab.&lt;/p&gt;
&lt;h2&gt;
  
  
  The mistake that cost the most: our probe was on the allowlist
&lt;/h2&gt;

&lt;p&gt;We do not install nine GUI clients and click through them. We reproduce the&lt;br&gt;
characteristic HTTP request each client sends, fire it at the real user-facing&lt;br&gt;
endpoint, and check the response field by field. It is repeatable, and repeatable&lt;br&gt;
matters when the upstream model catalog changes under you.&lt;/p&gt;

&lt;p&gt;That suite was green. It tested protocol shape: streaming frames, tool-call&lt;br&gt;
assembly, &lt;code&gt;response_format&lt;/code&gt;, the Anthropic event sequence. Every one of those&lt;br&gt;
answers the question &lt;em&gt;does the server understand this request&lt;/em&gt;. Not one of them&lt;br&gt;
answers &lt;em&gt;does this request get in&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;We found it by accident, while double-checking a streaming result with the official&lt;br&gt;
Anthropic SDK. That call returned &lt;code&gt;403 Your request was blocked.&lt;/code&gt; The identical&lt;br&gt;
request sent with curl returned 200. The only difference between the two was the&lt;br&gt;
User-Agent header.&lt;/p&gt;

&lt;p&gt;Our probe's UA was in the allowed set. So the suite was structurally incapable of&lt;br&gt;
seeing a rule that keyed on UA. It was not a missing test case; it was a test client&lt;br&gt;
whose identity happened to be the safe one.&lt;/p&gt;
&lt;h2&gt;
  
  
  Reproduce it against your own endpoint
&lt;/h2&gt;

&lt;p&gt;Two requests, same body, same path, same key. Only the User-Agent differs. If the&lt;br&gt;
statuses disagree, something in front of your application is filtering on UA.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Baseline. curl's default UA is not an SDK shape.&lt;/span&gt;
curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'%{http_code}\n'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BASE_URL&lt;/span&gt;&lt;span class="s2"&gt;/chat/completions"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"model":"'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MODEL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'","messages":[{"role":"user","content":"hi"}],"max_tokens":4}'&lt;/span&gt;

&lt;span class="c"&gt;# 2. Same request, wearing the official SDK's default UA.&lt;/span&gt;
curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'%{http_code}\n'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BASE_URL&lt;/span&gt;&lt;span class="s2"&gt;/chat/completions"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'user-agent: OpenAI/Python 1.68.2'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"model":"'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MODEL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'","messages":[{"role":"user","content":"hi"}],"max_tokens":4}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then confirm with the real SDK, because a hand-written header is still your guess at&lt;br&gt;
what the SDK sends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;choices&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;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do the same for crawlers, against a static asset rather than the API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'%{http_code}\n'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'user-agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.2; +https://openai.com/gptbot'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://your-site.example/llms.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want a live target to check the harness against before pointing it at your own&lt;br&gt;
host, our &lt;a href="https://y-api.bestvirtualgoods.com/llms.txt" rel="noopener noreferrer"&gt;&lt;code&gt;/llms.txt&lt;/code&gt;&lt;/a&gt; answers 200 to all&lt;br&gt;
five crawler UAs as of the retest date — that is the same URL the numbers above were&lt;br&gt;
measured on, so a 403 there means the regression is back on our side.&lt;/p&gt;

&lt;p&gt;Two details that make the check reliable. An edge block has a signature worth&lt;br&gt;
matching on rather than eyeballing: status 403, plus a &lt;code&gt;server: cloudflare&lt;/code&gt; header,&lt;br&gt;
plus a very short &lt;code&gt;text/plain&lt;/code&gt; body — we treat under 200 bytes as the cutoff.&lt;br&gt;
And run the unauthenticated version too: with no credentials, a healthy endpoint&lt;br&gt;
answers 401 &lt;code&gt;Invalid token&lt;/code&gt;. If it answers 403 instead, you never reached the&lt;br&gt;
application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the fix was, and where it was not
&lt;/h2&gt;

&lt;p&gt;The fix was in the Cloudflare rule. No application code changed. That is worth&lt;br&gt;
stating plainly, because for the entire time this was broken, every line of our&lt;br&gt;
request-handling code was correct and every protocol probe agreed.&lt;/p&gt;

&lt;p&gt;The retest on 2026-08-31:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;7 of 7 SDK User-Agents allowed through.&lt;/li&gt;
&lt;li&gt;5 of 5 AI crawler User-Agents allowed through on &lt;code&gt;llms.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The client matrix went from 6 clients unusable to 8 of 9 usable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 6 were the ones that send an SDK-shaped UA: Cline, Roo Code, LibreChat,&lt;br&gt;
Continue, Claude Code, and the official OpenAI SDK. Aider and Open WebUI were never&lt;br&gt;
blocked, because neither sends that shape — Aider goes through LiteLLM&lt;br&gt;
(&lt;code&gt;litellm/1.63.0&lt;/code&gt;, lowercase, hyphenated) and Open WebUI uses aiohttp directly. Two&lt;br&gt;
clients passing by accident is not coverage.&lt;/p&gt;

&lt;p&gt;The 9th row is still not usable, and not for reachability reasons. It is the official&lt;br&gt;
OpenAI SDK, which we keep as a strict baseline: it requires vision and a&lt;br&gt;
well-formed error shape, and we fail both. Our vision column is worse than the&lt;br&gt;
reachability story suggests — we sent five upstream models a solid green PNG and&lt;br&gt;
asked what color it was, and all five got it wrong, so we do not claim vision&lt;br&gt;
support. Unknown model names return 503 instead of 4xx, which makes SDKs retry a&lt;br&gt;
typo as if it were a server fault. Those are open, not fixed.&lt;/p&gt;

&lt;p&gt;We also added the missing probes: a reachability gate that replays each client's&lt;br&gt;
real UA, run before anything else. When that gate is red the protocol results below&lt;br&gt;
it are meaningless, so it now runs first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake two: the probe pinned the model name from our own docs
&lt;/h2&gt;

&lt;p&gt;The suite's primary model was hard-coded to the model ID in our documentation&lt;br&gt;
examples. When the upstream catalog dropped that ID, the probe threw on startup and&lt;br&gt;
all 19 checks refused to run. A recoverable drift became a hard block, because a&lt;br&gt;
single model name was wired up as the master switch.&lt;/p&gt;

&lt;p&gt;The catalog gets reshuffled routinely and there is always &lt;em&gt;some&lt;/em&gt; working model, so&lt;br&gt;
this was the wrong failure mode. It now picks dynamically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Try the documented example model first. This ordering is deliberate: only if the
suite passes on the model in the docs does "our tests pass" mean "a user pasting
from our &lt;a href="https://y-api.bestvirtualgoods.com/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt; succeeds." One model ID is
shared by the docs page, the homepage snippet, and &lt;code&gt;llms-full.txt&lt;/code&gt;, so when it
stops being callable, every copy-paste path breaks at step one and no page on the
site looks any different.&lt;/li&gt;
&lt;li&gt;If that one will not answer, fall back to the first callable model in the
catalog and keep going.&lt;/li&gt;
&lt;li&gt;Report "is the documented example model callable" as its own separate probe,
demoted from a blocker to a finding.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That third point is the actual repair. The check was worth keeping; it just should&lt;br&gt;
never have been able to stop everything else from running.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake three: the generated doc published a lie during an upstream slowdown
&lt;/h2&gt;

&lt;p&gt;This one took the longest to notice, and it is the one I would most expect other&lt;br&gt;
people to have shipped.&lt;/p&gt;

&lt;p&gt;The compatibility matrix is generated. The script overwrites the file on every run,&lt;br&gt;
and that file is the single source of truth for everything we say publicly about&lt;br&gt;
what we support.&lt;/p&gt;

&lt;p&gt;We ran it once while the upstream was degraded. A non-streaming request took 89&lt;br&gt;
seconds against a 120-second timeout — slow enough to be useless, fast enough to not&lt;br&gt;
time out. Requests that did cross 120 seconds, plus some intermittent 404s, were&lt;br&gt;
recorded as genuine failures. The generator did what it was told and wrote a&lt;br&gt;
document marking &lt;strong&gt;all nine clients unusable&lt;/strong&gt;, including Aider and Open WebUI,&lt;br&gt;
which were working the whole time.&lt;/p&gt;

&lt;p&gt;For as long as that file stood, our own documentation claimed we supported nothing.&lt;br&gt;
Nobody had to be wrong for this to happen; the script was correct and the output was&lt;br&gt;
false.&lt;/p&gt;

&lt;p&gt;The fix is a health gate. The script now measures the primary model's latency, and&lt;br&gt;
past a 30-second budget it declares the run degraded, refuses to write the file, and&lt;br&gt;
prints results to stdout for a human to read. A stale document beats a confidently&lt;br&gt;
wrong one, because a stale one is at least a claim somebody once verified.&lt;/p&gt;

&lt;p&gt;If you generate anything user-facing from live measurements, this applies to you&lt;br&gt;
directly: a generator with write access and no health gate will eventually publish&lt;br&gt;
your worst five minutes as your steady state.&lt;/p&gt;

&lt;h2&gt;
  
  
  The generalization
&lt;/h2&gt;

&lt;p&gt;Reproducing a client's &lt;em&gt;request shape&lt;/em&gt; is a good technique and I would use it again.&lt;br&gt;
It is repeatable, it is cheap, and it catches real protocol breakage.&lt;/p&gt;

&lt;p&gt;But it tests the request. It does not test the requester. Everything that gets&lt;br&gt;
decided by who is asking — UA rules, bot detection, WAF heuristics, rate-limit&lt;br&gt;
buckets, IP reputation — is invisible to a probe that shows up wearing its own&lt;br&gt;
identity. And a home-grown probe always shows up wearing an identity you chose,&lt;br&gt;
which means it is almost always in the group you decided to let through. That is not&lt;br&gt;
a gap you can close by adding assertions. You close it by sending the request as the&lt;br&gt;
client, with the client's real User-Agent, or by installing the actual SDK and&lt;br&gt;
letting it speak for itself.&lt;/p&gt;

&lt;p&gt;The question to ask about your own test suite is not "what does it check." It is&lt;br&gt;
"which class of client is it, and who else is in that class." Ours was in the class&lt;br&gt;
we had allowlisted, so the 403 was never something it could have reported.&lt;/p&gt;

</description>
      <category>api</category>
      <category>debugging</category>
      <category>security</category>
      <category>testing</category>
    </item>
    <item>
      <title>Skills Manager - A desktop app to manage your AI coding skills (Tauri 2 + React 19 + Rust)</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Sat, 07 Feb 2026 05:46:59 +0000</pubDate>
      <link>https://dev.to/freeourdays/skills-manager-a-desktop-app-to-manage-your-ai-coding-skills-tauri-2-react-19-rust-1oio</link>
      <guid>https://dev.to/freeourdays/skills-manager-a-desktop-app-to-manage-your-ai-coding-skills-tauri-2-react-19-rust-1oio</guid>
      <description>&lt;p&gt;Hey everyone,&lt;/p&gt;

&lt;p&gt;I recently found myself juggling custom "skills" and prompts across different AI coding assistants (like&lt;br&gt;
  Claude Code and others). It was a pain to keep them organized and synchronized, so I built a tool to solve &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5f90qb93d2jv6yp6j90.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5f90qb93d2jv6yp6j90.png" alt=" " width="800" height="557"&gt;&lt;/a&gt;it.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/jiweiyeah/Skills-Manager" rel="noopener noreferrer"&gt;https://github.com/jiweiyeah/Skills-Manager&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is it?&lt;br&gt;
  Skills Manager is a cross-platform desktop application that acts as a central hub for your AI skills.&lt;br&gt;
  Instead of manually copying files between different configuration directories, it uses a centralized&lt;br&gt;
  storage approach and manages symlinks for you. This means you can edit a skill in one place, and it&lt;br&gt;
  updates everywhere instantly.&lt;/p&gt;

&lt;p&gt;Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 Write Once, Use Everywhere: Centralized management for Claude Code, Codex, and CodeBuddy.&lt;/li&gt;
&lt;li&gt;🔗 Smart Sync: Automatically handles soft links to your tool directories.&lt;/li&gt;
&lt;li&gt;🛠 Modern Tech Stack: Built with Tauri 2.0 (Rust backend), React 19, Vite 7, and Tailwind CSS 4.&lt;/li&gt;
&lt;li&gt;📝 Built-in Editor: Integrated Monaco Editor for editing skills directly in the app.&lt;/li&gt;
&lt;li&gt;⚡ Fast &amp;amp; Lightweight: Native performance thanks to the Rust backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's currently in active development, and I'd love to hear any feedback or feature requests from the community!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>react</category>
      <category>rust</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Linky – AI-powered link submission that adapts to any website</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Mon, 19 Jan 2026 15:37:10 +0000</pubDate>
      <link>https://dev.to/freeourdays/linky-ai-powered-link-submission-that-adapts-to-any-website-6me</link>
      <guid>https://dev.to/freeourdays/linky-ai-powered-link-submission-that-adapts-to-any-website-6me</guid>
      <description>&lt;p&gt;Hey,&lt;/p&gt;

&lt;p&gt;I built Linky because I was frustrated with traditional SEO tools that only&lt;br&gt;
  work with fixed website lists and break whenever sites update their layouts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traditional tools have fixed lists of 500-2000 sites&lt;/li&gt;
&lt;li&gt;They break when websites change their HTML&lt;/li&gt;
&lt;li&gt;They use robotic patterns that are easily detected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;My Solution:&lt;/strong&gt;&lt;br&gt;
  Linky uses AI (Claude/OpenAI + Playwright) to understand any website's&lt;br&gt;
  structure and submit links intelligently. Key features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works with ANY website you provide (not just a fixed list)&lt;/li&gt;
&lt;li&gt;Auto-adapts when sites update their UI&lt;/li&gt;
&lt;li&gt;"Action Replay" records successful submissions for zero-cost replay&lt;/li&gt;
&lt;li&gt;Human-like behavior to avoid detection&lt;/li&gt;
&lt;li&gt;BYOK - bring your own API key, full cost transparency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tech Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Electron + React 19 for the desktop app&lt;/li&gt;
&lt;li&gt;Python + FastAPI + browser-use for the AI backend&lt;/li&gt;
&lt;li&gt;Playwright for browser automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Currently macOS only, Windows coming soon.&lt;br&gt;
This is a work in progress, but the core idea is taking shape. If you’re interested in where this is headed, feel free to star it on GitHub to follow the journey!&lt;br&gt;
  I'm looking for feedback and early adopters, or if you have suggestions for improvement!&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/jiweiyeah/linky-ai" rel="noopener noreferrer"&gt;https://github.com/jiweiyeah/linky-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Built with Claude, ironically using AI to build an AI tool 😄)&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>marketing</category>
      <category>showdev</category>
    </item>
    <item>
      <title>分享一个 SSL 证书监控网站的开发经验</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Sun, 04 Jan 2026 16:43:25 +0000</pubDate>
      <link>https://dev.to/freeourdays/fen-xiang-ge-ssl-zheng-shu-jian-kong-wang-zhan-de-kai-fa-jing-yan-4pe7</link>
      <guid>https://dev.to/freeourdays/fen-xiang-ge-ssl-zheng-shu-jian-kong-wang-zhan-de-kai-fa-jing-yan-4pe7</guid>
      <description>&lt;p&gt;最近做了一个 简单的 SSL 证书监控网站，想和大家分享一些开发过程中的经验。项目地址放在最后了，先聊聊技术实现。&lt;/p&gt;

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

&lt;h2&gt;
  
  
  起因
&lt;/h2&gt;

&lt;p&gt;之前遇到过几次 SSL 证书过期导致服务中断的情况，每次都是用户发现后才去处理，很被动。市面上有一些监控工具，但要么太重，要么功能不够用，就想着自己做一个。&lt;/p&gt;

&lt;h2&gt;
  
  
  技术选型
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Next.js 16 + shadcn/ui + TypeScript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;选 Next.js 是因为：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App Router 的开发体验很好，路由和文件结构对应&lt;/li&gt;
&lt;li&gt;Server Components 减少了客户端 JavaScript&lt;/li&gt;
&lt;li&gt;内置的图片优化、字体加载等开箱即用&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;shadcn/ui 是基于 Radix UI 的组件库，优点是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;组件复制到项目中，完全可控&lt;/li&gt;
&lt;li&gt;使用 Tailwind CSS，样式定制方便&lt;/li&gt;
&lt;li&gt;Accessibility 做得很好&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Drizzle ORM + PostgreSQL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;之前用过 Prisma，这次试了 Drizzle，感觉更轻量：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;类型生成更快&lt;/li&gt;
&lt;li&gt;SQL 操作更直观&lt;/li&gt;
&lt;li&gt;查询性能更好&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;better-auth 认证系统&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这个是最近发现的，比 NextAuth 更新：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript 支持更好&lt;/li&gt;
&lt;li&gt;API 设计更简洁&lt;/li&gt;
&lt;li&gt;支持邮箱密码 + 多种 OAuth（GitHub、Google）&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  遇到的一些坑
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 证书链验证的复杂性
&lt;/h3&gt;

&lt;p&gt;一开始以为 SSL 证书检查很简单，就是获取证书信息。后来发现证书链验证很复杂：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;需要验证每个证书的签名&lt;/li&gt;
&lt;li&gt;检查证书链的完整性&lt;/li&gt;
&lt;li&gt;判断根证书是否可信（浏览器内置）&lt;/li&gt;
&lt;li&gt;处理中间证书缺失的情况&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;解决方案是写了一个完整的证书链提取和验证模块，包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;从 TLS 连接提取完整证书链&lt;/li&gt;
&lt;li&gt;验证每个证书的签名和有效期&lt;/li&gt;
&lt;li&gt;检测链断裂和不完整的情况&lt;/li&gt;
&lt;li&gt;树形结构可视化展示&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  2. 安全评分系统的设计
&lt;/h3&gt;

&lt;p&gt;为了让用户快速了解证书的安全状况，做了一个 A+ 到 F 的评分系统。核心逻辑：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;四个维度加权评分
- 证书有效性：30%
- 链完整性：25%
- 加密强度：25%
- 协议版本：20%

如果有严重问题（如证书过期），评级上限为 C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;难点在于：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;权重分配如何合理&lt;/li&gt;
&lt;li&gt;扣分规则如何设计&lt;/li&gt;
&lt;li&gt;如何给出有价值的改进建议&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最终采用了分层评分，每个维度独立计算，再加权汇总。&lt;/p&gt;

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

&lt;h3&gt;
  
  
  3. 多语言路由的 Hydration 问题
&lt;/h3&gt;

&lt;p&gt;支持 6 种语言时遇到了 React Hydration 错误：&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="c1"&gt;// ❌ 错误做法&lt;/span&gt;
&lt;span class="c1"&gt;// app/[locale]/layout.tsx 中包含 &amp;lt;html&amp;gt; 标签&lt;/span&gt;
&lt;span class="c1"&gt;// 与根 layout 冲突&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ 正确做法&lt;/span&gt;
&lt;span class="c1"&gt;// 根 layout 只有一个 &amp;lt;html&amp;gt; 标签&lt;/span&gt;
&lt;span class="c1"&gt;// 使用客户端组件动态更新 lang 属性&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Redis 缓存的降级处理
&lt;/h3&gt;

&lt;p&gt;为了提升认证性能，加了 Redis 缓存。但需要考虑：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redis 不可用时怎么办？&lt;/li&gt;
&lt;li&gt;缓存和数据库数据不一致怎么办？&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;解决方案：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redis 连接失败自动降级到数据库&lt;/li&gt;
&lt;li&gt;数据库更新时主动失效缓存&lt;/li&gt;
&lt;li&gt;提供缓存统计 API 监控命中率&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. PageSpeed 优化
&lt;/h3&gt;

&lt;p&gt;最初 Lighthouse 跑分只有 60 多分，主要问题：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript Bundle 太大&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用 Next.js 的动态导入（dynamic import）按需加载组件&lt;/li&gt;
&lt;li&gt;移除未使用的依赖&lt;/li&gt;
&lt;li&gt;启用 Tree Shaking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;图片优化&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用 Next.js Image 组件自动优化&lt;/li&gt;
&lt;li&gt;添加合适的 placeholder&lt;/li&gt;
&lt;li&gt;启用图片懒加载&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;字体加载&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用 next/font 自动优化字体&lt;/li&gt;
&lt;li&gt;减少字体变体数量&lt;/li&gt;
&lt;li&gt;使用 font-display: swap 避免布局偏移&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;关键渲染路径&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;识别关键 CSS，内联到 HTML&lt;/li&gt;
&lt;li&gt;延迟加载非关键 JavaScript&lt;/li&gt;
&lt;li&gt;优化第三方脚本加载顺序&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;第三方脚本优化&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Analytics、Crisp Chat 等延迟加载&lt;/li&gt;
&lt;li&gt;使用 defer/async 属性&lt;/li&gt;
&lt;li&gt;考虑使用 Web Workers 处理耗时任务&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最终优化后：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performance: 60 → 95&lt;/li&gt;
&lt;li&gt;Accessibility: 85 → 98&lt;/li&gt;
&lt;li&gt;Best Practices: 90 → 100&lt;/li&gt;
&lt;li&gt;SEO: 100&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  一些技术亮点
&lt;/h2&gt;

&lt;h3&gt;
  
  
  证书链可视化
&lt;/h3&gt;

&lt;p&gt;用树形结构展示证书链，支持展开/折叠，不同状态用颜色编码：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;绿色：有效&lt;/li&gt;
&lt;li&gt;黄色：即将过期&lt;/li&gt;
&lt;li&gt;红色：已过期&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  安全问题检测
&lt;/h3&gt;

&lt;p&gt;自动检测不安全的加密算法：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MD5、SHA-1 签名算法&lt;/li&gt;
&lt;li&gt;RC4、DES 等弱加密&lt;/li&gt;
&lt;li&gt;TLS 1.0/1.1 等旧协议&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  多渠道通知
&lt;/h3&gt;

&lt;p&gt;目前支持邮件、Slack、Discord、Telegram、飞书五种通知渠道，用户可以自由组合。&lt;/p&gt;

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

&lt;h2&gt;
  
  
  项目地址
&lt;/h2&gt;

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

&lt;p&gt;功能：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;免费 SSL 证书检查&lt;/li&gt;
&lt;li&gt;域名监控和过期提醒&lt;/li&gt;
&lt;li&gt;安全评分和改进建议&lt;/li&gt;
&lt;li&gt;多语言支持（中英日法西）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;欢迎试用和反馈，有什么问题可以一起交流。&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>showdev</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Finally Cracked the Code on Finding Side Hustle Ideas (Spoiler: I Was Doing It All Wrong)</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Tue, 05 Aug 2025 14:44:38 +0000</pubDate>
      <link>https://dev.to/freeourdays/how-i-finally-cracked-the-code-on-finding-side-hustle-ideas-spoiler-i-was-doing-it-all-wrong-4e62</link>
      <guid>https://dev.to/freeourdays/how-i-finally-cracked-the-code-on-finding-side-hustle-ideas-spoiler-i-was-doing-it-all-wrong-4e62</guid>
      <description>&lt;h2&gt;
  
  
  The Dumbest $0 "Investment" That Actually Changed Everything
&lt;/h2&gt;

&lt;p&gt;Okay, so last year I was basically stuck in this endless loop that I'm sure you guys know all too well. You know the drill - working my regular 9-5, coming home exhausted, then somehow finding the energy to scroll through those "how to make $10k a month" YouTube videos until like 2am.&lt;/p&gt;

&lt;p&gt;And honestly? I felt more overwhelmed after each video. All these complex business plans, drop shipping courses, crypto trading strategies... it was like everyone was speaking a different language and I needed a $5,000 course just to understand the basics.&lt;/p&gt;

&lt;p&gt;Then I had this weird realization that completely flipped my perspective.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turns out, I wasn't looking for the wrong ideas - I was looking in the wrong way entirely.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Things That Actually Matter (And Why I Wish I'd Known This Sooner)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Stop Trying to Change the World&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I used to think every business idea had to be this groundbreaking, world-changing concept. Like, if it wasn't going to disrupt an entire industry, why bother, right?&lt;/p&gt;

&lt;p&gt;Man, was I wrong.&lt;/p&gt;

&lt;p&gt;My friend Sarah makes over $2k a month selling... wait for it... grocery lists. Yep, just grocery lists organized by how different stores are laid out. Took her maybe 2 hours to make the first batch, and now busy parents pay $12/month because it saves them 20 minutes every grocery trip.&lt;/p&gt;

&lt;p&gt;I was out here trying to invent the next Uber while Sarah was solving the "why can I never find the damn pasta sauce" problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Your Complaints Are Actually Treasure Maps&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This one's huge, and I totally missed it for months. Every single time you catch yourself thinking "ugh, there's gotta be a better way to do this" or "why doesn't someone just make a thing that does X," stop everything and write that down.&lt;/p&gt;

&lt;p&gt;I'm serious. Those little moments of frustration? That's where the money is hiding.&lt;/p&gt;

&lt;p&gt;I started keeping a note in my phone just for this stuff. Within like a month, I had 47 different "why doesn't this exist" moments. Some were stupid, sure, but a few... man, those turned into real opportunities.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;If You Can't Explain It to Your Grandma, It's Too Complicated&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here's the thing about side hustles - they should be simple enough that you can explain them in the time it takes to ride an elevator. If you need a PowerPoint presentation and a business degree to understand what you're doing, you're probably overcomplicating it.&lt;/p&gt;

&lt;p&gt;The best ideas are almost embarrassingly simple.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Random Discovery That Changed My Whole Approach
&lt;/h2&gt;

&lt;p&gt;So here's where it gets interesting (and where I found something that actually helped instead of just adding to my confusion).&lt;/p&gt;

&lt;p&gt;I was deep in some Reddit rabbit hole about side hustles when someone mentioned this site called TinyIdea. I figured it was just another blog with recycled "10 ways to make money online" content, but I was bored so I clicked anyway.&lt;/p&gt;

&lt;p&gt;Dude, it's like TikTok but for business ideas. Just these bite-sized concepts that real people are actually doing or thinking about. But here's what hooked me - it wasn't just the ideas themselves.&lt;/p&gt;

&lt;p&gt;It was watching how people's brains work differently. Someone would post something super simple like "selling custom pet portraits on Etsy" and then the comments would blow my mind. People would be like "what about memorial portraits for pets that passed away?" or "have you considered digital delivery vs physical paintings?"&lt;/p&gt;

&lt;p&gt;I'm sitting there like "holy crap, I never would have thought of those angles."&lt;/p&gt;

&lt;p&gt;Oh, and they have this AI chat thing that's actually useful (shocking, I know). You can literally ask it stuff like "how do I test this idea with only $50?" and it gives you real, specific steps instead of generic advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Simple System I Wish I'd Started With
&lt;/h2&gt;

&lt;p&gt;After way too many months of just collecting ideas and doing nothing with them, I finally developed this stupidly simple process:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1:&lt;/strong&gt; Just collect problems. Aim for at least 10. Don't judge them, just write them down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 2:&lt;/strong&gt; Research time. For each problem, figure out who actually has it and how much they might pay to solve it. Google is your friend here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 3:&lt;/strong&gt; Pick your top 3 favorites and create the most basic landing pages ever. I'm talking one page, some text, maybe a signup form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 4:&lt;/strong&gt; Throw $20 at driving traffic to each page and see what happens.&lt;/p&gt;

&lt;p&gt;Most people (including past me) skip straight to building the thing. But honestly, the magic happens in those first two weeks when you're just researching and understanding the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Actually Making Now (With Real Numbers Because Receipts Matter)
&lt;/h2&gt;

&lt;p&gt;Okay, so using this approach, I've got three little things running right now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom workout plans for busy parents&lt;/strong&gt; - Making about $400/month. Started with just Google Forms and email. Nothing fancy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Weekly meal prep guides for college students&lt;/strong&gt; - $280/month. It's literally just PDFs I email out every Sunday.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Budget templates for freelancers&lt;/strong&gt; - $150/month through Gumroad. Took me one weekend to make all the templates.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these cost me more than $50 to start. Total monthly revenue is sitting around $830, which... honestly, that's more than I made from any of those complicated "business plans" I spent months researching.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mental Shift That Actually Made the Difference
&lt;/h2&gt;

&lt;p&gt;Stop hunting for the million-dollar idea. Start looking for the $100/month idea that you can do 10 different ways.&lt;/p&gt;

&lt;p&gt;Every successful person I know? They didn't hit some massive home run on their first try. They just got really good at hitting singles over and over again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stuff I Wish Someone Had Just Told Me Straight Up
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with what you already know&lt;/strong&gt; - Seriously, whatever you're decent at (even if it feels basic to you) is probably gold to someone who's just starting out.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Solve your own problems first&lt;/strong&gt; - If you have the problem, other people probably do too. And you'll understand what they're going through because you're living it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make your first dollar before you worry about your thousandth&lt;/strong&gt; - I wasted so much time planning for scale before I had anything to scale.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real people beat courses every time&lt;/strong&gt; - Join communities where people are actually doing this stuff. Their random comments are worth more than any $500 course.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A Few Resources That Don't Suck (No Affiliate BS)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;For finding problems:&lt;/strong&gt; Literally just walk through Target or Walmart and pay attention to what's on the shelves. If it's there, someone's buying it, which means someone has that problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;For testing ideas:&lt;/strong&gt; Create simple polls in relevant Reddit communities. People love giving their opinions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;For inspiration:&lt;/strong&gt; Find platforms where real people share what they're working on. There aren't many good ones, but when you find them, bookmark immediately.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The One Question That Started This Whole Thing
&lt;/h2&gt;

&lt;p&gt;If you only remember one thing from this wall of text, remember this question: &lt;/p&gt;

&lt;p&gt;"What's one 10-minute task I do regularly that I'd happily pay $5 to never do again?"&lt;/p&gt;

&lt;p&gt;Your answer might be exactly what someone else needs to hear.&lt;/p&gt;




&lt;p&gt;Alright, that's my story. What about you guys? Anyone have simple ideas that turned out way more profitable than expected? I'm always curious what's actually working for people in real life.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; Wow, thanks for all the comments! A bunch of people asked about that idea platform I mentioned - it's &lt;a href="https://tinyidea.net" rel="noopener noreferrer"&gt;tinyidea.net&lt;/a&gt; if you want to check it out. No affiliation or anything, just genuinely found it helpful for getting my brain unstuck.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>8 months into my side hustle, finally hitting $1.4k/month - some lessons learned</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Mon, 04 Aug 2025 13:26:12 +0000</pubDate>
      <link>https://dev.to/freeourdays/8-months-into-my-side-hustle-finally-hitting-14kmonth-some-lessons-learned-4l7f</link>
      <guid>https://dev.to/freeourdays/8-months-into-my-side-hustle-finally-hitting-14kmonth-some-lessons-learned-4l7f</guid>
      <description>&lt;p&gt;Seeing a lot of posts about side hustles lately, thought I'd share my journey.&lt;/p&gt;

&lt;p&gt;Started last year trying everything: dropshipping, print-on-demand, freelance writing, app development... first few months were basically just burning money 😅&lt;/p&gt;

&lt;p&gt;Things turned around in March when I started actually researching different business models systematically. Stumbled across this idea on &lt;a href="https://tinyidea.net" rel="noopener noreferrer"&gt;TinyIdea&lt;/a&gt; about local service businesses, so I started a "errands + home services booking" thing in my neighborhood.&lt;/p&gt;

&lt;p&gt;Now pulling in around $1.4k consistently, which covers rent and groceries at least.&lt;/p&gt;

&lt;p&gt;Few things I learned:&lt;/p&gt;

&lt;p&gt;1.Don't try to scale before you validate demand&lt;br&gt;
2.Local services often have way less competition than online stuff&lt;br&gt;
3.Word of mouth beats any paid advertising&lt;/p&gt;

&lt;p&gt;Anyone else grinding on side projects? Would love to hear your stories.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Your words can effortlessly reach a global audience.</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Fri, 22 Nov 2024 12:17:36 +0000</pubDate>
      <link>https://dev.to/freeourdays/your-words-can-effortlessly-reach-a-global-audience-lm8</link>
      <guid>https://dev.to/freeourdays/your-words-can-effortlessly-reach-a-global-audience-lm8</guid>
      <description>&lt;p&gt;As a developer, I occasionally stay active on various self-media platforms.&lt;/p&gt;

&lt;p&gt;Whether it’s publishing long-form articles on platforms like WeChat Official Account, Toutiao, or Zhihu, or posting short updates on Weibo, Jike, or even international platforms like Twitter, Facebook, and Medium, I always try to distribute my content across these platforms. After all, it takes a lot of effort to write an article, so not sharing it on multiple platforms would be a missed opportunity for more visibility, right?&lt;/p&gt;

&lt;p&gt;I’m curious if any of you reading this have tried self-media or are planning to. From my perspective, here are some challenges I often face:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.  Manually copying and pasting text and images across multiple platforms is extremely time-consuming and gets frustrating after a few times, seriously cutting into creative time.
2.  Using third-party clients like Yixiaoer can be expensive, with limitations on the number of syncs and accounts. Moreover, the formatting on many platforms often ends up problematic.
3.  When publishing on international platforms, I often need to translate my articles into the target languages, which adds even more work.
4.  Sometimes, I only have a few keywords as inspiration and haven’t figured out how to connect them into a cohesive piece. It would be great if I had an AI that truly understood me.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In light of these efficiency demands, the Distributer tool emerged. It’s available as a browser plugin, making it lightweight and free from the constraints of installing a dedicated client.&lt;/p&gt;

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

&lt;p&gt;After using it for some time, here are my thoughts:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.  The Distributer plugin operates as a sidebar, so it doesn’t interfere with browsing. You can use it alongside your usual web activities seamlessly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyd036gwn56x1buzmmfrt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyd036gwn56x1buzmmfrt.png" alt="Image description" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
    2.  It focuses mainly on text and image content, which suits my needs since I don’t post videos. The sync success rate is generally high, and occasional sync issues can be resolved with a quick retry.&lt;br&gt;
    3.  One notable feature is that it assists in opening all the platforms you need to sync to and formatting the content but doesn’t publish it automatically. Since each platform has unique settings, manually selecting options for the best results is ideal. Additionally, this manual step gives you a chance to double-check and tweak the layout—a small time investment that’s worth it, considering the bulk of the work is handled by the plugin.&lt;br&gt;
    4.  One standout feature of Distributer is its ability to set different languages for different platforms. For example, I need my articles on domestic platforms but also want them to reach an international audience. Since each country has its language preferences, distributing content in only Chinese would diminish its effectiveness. The plugin translates uploaded Chinese content into multiple languages (currently supporting English and Japanese) and lets you assign specific languages to different platforms. This ensures the content is distributed in the appropriate language—a fantastic feature.&lt;br&gt;
    5.  With AI integration, the plugin also supports text generation. Based on your input ideas, it can create a short article automatically. However, I haven’t used this much yet, as I mainly distribute pre-written content.&lt;br&gt;
    6.  Since the plugin supports many platforms, the interface can feel a bit cluttered. Not all platforms are relevant to my needs. Thankfully, Distributer allows you to drag and rearrange platforms so your frequently used ones appear at the top. Once sorted, the layout is saved for future use, eliminating the need to rearrange each time.&lt;/p&gt;

&lt;p&gt;Overall, as a lightweight browser-based tool, Distributer is quite well-developed, with a clean interface and official website support. That said, there’s still room for improvement.&lt;/p&gt;

&lt;p&gt;For example, currently, it only supports email registration and login, without third-party platform integration for one-click login, which can be inconvenient. Additionally, the AI-generated content lacks the emotional depth of human writing, though it is undeniably fast.&lt;/p&gt;

&lt;p&gt;If you’ve encountered the issues I mentioned earlier, this plugin is worth a try. It can save you a significant amount of time on content distribution and synchronization. Plus, as the plugin is still in its early stages, it’s continually being updated and improved, and I believe it will become even more user-friendly in the future.&lt;/p&gt;

&lt;p&gt;Finally, here’s the link to the plugin: &lt;a href="https://distributer.top" rel="noopener noreferrer"&gt;https://distributer.top&lt;/a&gt;&lt;/p&gt;

</description>
      <category>distributer</category>
      <category>distributor</category>
    </item>
    <item>
      <title>4 Killer Free AI Text-to-Speech Websites You Need to Try</title>
      <dc:creator>freeourdays</dc:creator>
      <pubDate>Sat, 06 Jul 2024 06:20:46 +0000</pubDate>
      <link>https://dev.to/freeourdays/4-killer-free-ai-text-to-speech-websites-you-need-to-try-3cfj</link>
      <guid>https://dev.to/freeourdays/4-killer-free-ai-text-to-speech-websites-you-need-to-try-3cfj</guid>
      <description>&lt;p&gt;Text-to-speech (TTS) technology has become increasingly popular among content creators and voiceover artists. While many professional voiceover platforms offer high-quality voices, their subscription fees can be quite expensive, especially for infrequent users.&lt;/p&gt;

&lt;p&gt;However, with the rise of AI, many websites now offer free TTS services with impressive audio quality, rivaling even some paid software.&lt;/p&gt;

&lt;p&gt;Here are a few user-friendly and completely free TTS websites worth exploring:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tiktok AI Voice&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;● Description: This website allows you to convert text to speech for free, preview the results, and download the audio in MP3 format.&lt;/p&gt;

&lt;p&gt;● Features: The homepage acts as the tool itself, making it incredibly easy to use. It supports 5 different voices with surprisingly good quality, almost devoid of any robotic sound. The character limit is 1000.&lt;/p&gt;

&lt;p&gt;● Link: &lt;a href="https://tiktokaivoice.top" rel="noopener noreferrer"&gt;https://tiktokaivoice.top&lt;/a&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Countik
● Description: Countik specializes in converting text to TikTok-style voices, which can be easily downloaded from your browser.
● Features: In addition to voice generation, it also offers music generation. However, it has a character limit of 300.
● Link: &lt;a href="https://countik.com/tiktok-voice-generator" rel="noopener noreferrer"&gt;https://countik.com/tiktok-voice-generator&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;Ttsmaker&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;● Description: This is a free and versatile text-to-speech tool.&lt;/p&gt;

&lt;p&gt;● Features: Ttsmaker supports multiple languages and has a limit of 2000 characters per conversion and 20,000 characters per week. While the voice quality isn't as natural as Tiktok AI Voice, it's more than sufficient for light use.&lt;/p&gt;

&lt;p&gt;● Link: &lt;a href="https://ttsmaker.com" rel="noopener noreferrer"&gt;https://ttsmaker.com&lt;/a&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Play.ht&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;● Description: Play.ht is a text-to-speech and AI voiceover tool.&lt;/p&gt;

&lt;p&gt;● Features: It boasts support for a wider range of languages compared to the previous options. However, the voice quality is similar to Ttsmaker, with a noticeable robotic tone that lacks the naturalness of Tiktok AI Voice and Countik. It has a limit of 1000 characters per conversion.&lt;/p&gt;

&lt;p&gt;● Link: &lt;a href="https://play.ht/text-to-speech" rel="noopener noreferrer"&gt;https://play.ht/text-to-speech&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Of course, there are many other free and paid TTS websites available. Feel free to share your recommendations in the comments!&lt;/p&gt;

&lt;p&gt;Now, it's your turn! Don't forget to give this video a thumbs up, subscribe to my channel, and share it with your friends!&lt;/p&gt;

&lt;p&gt;If you're even slightly interested in building your online presence, exploring freelance opportunities, diving into independent development, earning extra income, or simply pursuing a brighter future, subscribing to my channel might be a good idea. While I might not make you rich directly, connecting with like-minded individuals is always a win-win! Let's chase our dreams together!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
