<?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: Vectle</title>
    <description>The latest articles on DEV Community by Vectle (vectle).</description>
    <link>https://dev.to/vectle</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%2Forganization%2Fprofile_image%2F14970%2F00d10c25-c4ab-4523-a864-45517c8d524d.png</url>
      <title>DEV Community: Vectle</title>
      <link>https://dev.to/vectle</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vectle"/>
    <language>en</language>
    <item>
      <title>Groq 429s: your retry loop is blind, read the headers instead</title>
      <dc:creator>Rachel Vectle</dc:creator>
      <pubDate>Fri, 09 Oct 2026 17:41:29 +0000</pubDate>
      <link>https://dev.to/vectle/groq-429s-your-retry-loop-is-blind-read-the-headers-instead-l0j</link>
      <guid>https://dev.to/vectle/groq-429s-your-retry-loop-is-blind-read-the-headers-instead-l0j</guid>
      <description>&lt;p&gt;Getting 429s from Groq and just sleeping a few seconds before retrying? That works until it doesn't.&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;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.groq.com/openai/v1/chat/completions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                     &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# blind retry. this is the bug.
&lt;/span&gt;    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is what the Groq docs say that most retry loops ignore: every response carries x-ratelimit-* headers, and retry-after appears ONLY on 429 responses. The wait time you are guessing at is sitting right there in the 429 response, and the loop above threw it away.&lt;/p&gt;

&lt;p&gt;The headers that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;x-ratelimit-limit-requests: your RPD (requests per day) cap&lt;/li&gt;
&lt;li&gt;x-ratelimit-limit-tokens: TPM cap&lt;/li&gt;
&lt;li&gt;x-ratelimit-remaining-requests / -remaining-tokens: how much headroom is left&lt;/li&gt;
&lt;li&gt;x-ratelimit-reset-requests / -reset-tokens: when the window resets&lt;/li&gt;
&lt;li&gt;retry-after: set only on 429s. the authoritative wait time. use it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dead ends we keep seeing in real agent runs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed sleep hammering an org-level limit. Groq enforces limits at the org level, not per user. One noisy retry loop can starve the whole org while it burns through attempts.&lt;/li&gt;
&lt;li&gt;Watching TPM while OTPM trips you. Some accounts get an input/output token split (ITPM/OTPM). A huge output can trip OTPM even when total TPM looks fine, and your loop sees "tokens are fine" and retries straight into the same wall.&lt;/li&gt;
&lt;li&gt;Cached tokens don't count toward limits. A high cache hit rate lowers effective pressure, which is great for throughput but confusing when the usage numbers don't add up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What actually works: read retry-after from the 429 and back off to exactly that window. Check your real numbers at console.groq.com/settings/limits instead of guessing.&lt;/p&gt;

&lt;p&gt;Full notes on the gotchas, including the ITPM/OTPM split and the org-level trap:&lt;br&gt;
&lt;a href="https://vectle.com/skills/skl_2mbinMsdstsavd9J2DD2jA" rel="noopener noreferrer"&gt;https://vectle.com/skills/skl_2mbinMsdstsavd9J2DD2jA&lt;/a&gt;&lt;/p&gt;

</description>
      <category>groq</category>
      <category>llm</category>
      <category>api</category>
      <category>ratelimiting</category>
    </item>
    <item>
      <title>index_id is only valid for api_version='v1': the LlamaIndex Vertex AI v2 migration trap</title>
      <dc:creator>Rachel Vectle</dc:creator>
      <pubDate>Thu, 08 Oct 2026 17:06:11 +0000</pubDate>
      <link>https://dev.to/vectle/indexid-is-only-valid-for-apiversionv1-the-llamaindex-vertex-ai-v2-migration-trap-23nh</link>
      <guid>https://dev.to/vectle/indexid-is-only-valid-for-apiversionv1-the-llamaindex-vertex-ai-v2-migration-trap-23nh</guid>
      <description>&lt;p&gt;Upgraded your LlamaIndex Vertex AI vector store, flipped api_version='v2', and got this?&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;llama_index.vector_stores.vertexaivectorsearch&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;VertexAIVectorStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;VertexAIVectorStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;project_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-central1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;index_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-index-id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# leftover from your v1 config
&lt;/span&gt;    &lt;span class="n"&gt;api_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# index_id is only valid for api_version='v1'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Heres the thing the release notes dont spell out clearly: v1 and v2 are not the same API with a version flag. v2 replaces the index-plus-endpoint model with collections. Passing v1 params next to api_version='v2' just dies. Mixing the two param styles is the most common way agents blow up a migration, because the old code "looks" almost right.&lt;/p&gt;

&lt;p&gt;The dead ends we kept seeing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assuming v2 accepts index_id/index_endpoint_id the way v1 did. It doesnt. Those params belong to api_version='v1' only.&lt;/li&gt;
&lt;li&gt;Calling v2 operations without the right package. v2 ops need google-cloud-vectorsearch installed. pip install the [v2] extra or things fail before you get anywhere.&lt;/li&gt;
&lt;li&gt;Trying store.clear() on v1. v1 doesnt support clear() at all, so if your cleanup code has been calling it, it has silently never worked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What actually works: drop index_id, use collections with v2, install the v2 extra. And heres the migration bonus, clear() is supported on v2, so moving over is also the only way to get deletes working.&lt;/p&gt;

&lt;p&gt;Not ready to migrate? Set VERTEX_AI_ENABLE_V2 to false and you get the old v1 behavior back while you sort out the collections move.&lt;/p&gt;

&lt;p&gt;Full notes on the migration gotchas, including the package and env-var details:&lt;br&gt;
&lt;a href="https://vectle.com/skills/skl_2Jr-p1oGDU48kT03YyIUmA" rel="noopener noreferrer"&gt;https://vectle.com/skills/skl_2Jr-p1oGDU48kT03YyIUmA&lt;/a&gt;&lt;/p&gt;

</description>
      <category>llamaindex</category>
      <category>googlecloud</category>
      <category>vectorsearch</category>
      <category>rag</category>
    </item>
    <item>
      <title>Eppo PHP SDK works on your laptop, then dies on a read-only filesystem</title>
      <dc:creator>Rachel Vectle</dc:creator>
      <pubDate>Mon, 05 Oct 2026 17:14:23 +0000</pubDate>
      <link>https://dev.to/vectle/eppo-php-sdk-works-on-your-laptop-then-dies-on-a-read-only-filesystem-1d3l</link>
      <guid>https://dev.to/vectle/eppo-php-sdk-works-on-your-laptop-then-dies-on-a-read-only-filesystem-1d3l</guid>
      <description>&lt;p&gt;You deploy to your usual staging box and the feature flags work. You push the same code to Lambda, or a container with a read-only root filesystem, and the app dies on boot with a cache write failure.&lt;/p&gt;

&lt;p&gt;Here is the line from the Eppo PHP quickstart that does it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Eppo\EppoClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$eppoClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EppoClient&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'&amp;lt;your_api_key&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// SDK key, first arg&lt;/span&gt;
    &lt;span class="s1"&gt;'&amp;lt;base_url&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// optional, defaults to the Eppo CDN&lt;/span&gt;
    &lt;span class="nv"&gt;$assignmentLogger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// optional&lt;/span&gt;
    &lt;span class="nv"&gt;$cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="c1"&gt;// optional PSR-16 cache. skip it and FileSystem cache is used&lt;/span&gt;
    &lt;span class="nv"&gt;$httpClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// optional PSR-18, else auto-discovered&lt;/span&gt;
    &lt;span class="nv"&gt;$requestFactory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// optional PSR-17, else auto-discovered&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See &lt;code&gt;$cache&lt;/code&gt;. Optional means nobody passes it. The default is a FileSystem cache, which is fine everywhere you tested and fatal on any box where the process cannot write. The error surfaces on boot, before any flag config matters, so the first dead end people chase is the SDK key or the network. It is neither.&lt;/p&gt;

&lt;p&gt;The fix is to stop treating those init args as optional in production:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Eppo\EppoClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Symfony\Component\Cache\Adapter\RedisAdapter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Symfony\Component\Cache\Psr16Cache&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$redisCache&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;Psr16Cache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RedisAdapter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;createConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'redis://localhost'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="nv"&gt;$eppoClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EppoClient&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nv"&gt;$_ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'EPPO_SDK_KEY'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// SDK key first&lt;/span&gt;
    &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// leave the base URL unset unless you run a custom endpoint&lt;/span&gt;
    &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// assignment logger, if you have one&lt;/span&gt;
    &lt;span class="nv"&gt;$redisCache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;// explicit PSR-16 cache, Redis or Memcached in prod&lt;/span&gt;
    &lt;span class="nv"&gt;$httpClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;// your own PSR-18 client, not discovery's guess&lt;/span&gt;
    &lt;span class="nv"&gt;$requestFactory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// your own PSR-17 factory&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last point is the quiet part of the same bug: letting HTTP client discovery pick whatever is installed is fine locally and a lottery in production. Pin it.&lt;/p&gt;

&lt;p&gt;The agent-readable version of this, fetchable via curl, lives on Vectle:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vectle.com/skills/skl_1TDVbXyxhKSxkxHObep0VQ" rel="noopener noreferrer"&gt;https://vectle.com/skills/skl_1TDVbXyxhKSxkxHObep0VQ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Source: Eppo PHP quickstart, docs.geteppo.com/sdks/server-sdks/php/quickstart)&lt;/p&gt;

</description>
      <category>php</category>
      <category>featureflags</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Your Oxylabs SOCKS5 geo targeting is doing nothing</title>
      <dc:creator>Rachel Vectle</dc:creator>
      <pubDate>Sun, 04 Oct 2026 16:58:07 +0000</pubDate>
      <link>https://dev.to/vectle/your-oxylabs-socks5-geo-targeting-is-doing-nothing-59mi</link>
      <guid>https://dev.to/vectle/your-oxylabs-socks5-geo-targeting-is-doing-nothing-59mi</guid>
      <description>&lt;p&gt;If you are routing traffic through Oxylabs and set geo targeting in the username, it works right up until you switch protocols. Then it quietly stops doing anything.&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;# HTTPS: this works. country entry node, port 10000&lt;/span&gt;
curl &lt;span class="nt"&gt;-x&lt;/span&gt; https://customer-USERNAME:pass@us-pr.oxylabs.io:10000 https://ip.oxylabs.io/location

&lt;span class="c"&gt;# SOCKS5: this entry node has no geo routing at all&lt;/span&gt;
curl &lt;span class="nt"&gt;-x&lt;/span&gt; socks5://customer-USERNAME:pass@us-pr.oxylabs.io:10000 ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the catch. Oxylabs country entry nodes only exist for HTTPS-style proxying. There is no SOCKS5 equivalent. If your tooling or agent flips to SOCKS5 (plenty of them default to it), your &lt;code&gt;cc-DE&lt;/code&gt; username param is what actually carries the geo, not the entry node. Ignore this and you end up with traffic entering through whatever country the generic node picks.&lt;/p&gt;

&lt;p&gt;The working combos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS / HTTP:&lt;/strong&gt; us-pr.oxylabs.io:10000 (US), eu-pr.oxylabs.io:10000 (EU), port 10001 for sticky country entry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SOCKS5:&lt;/strong&gt; forget entry nodes, use &lt;code&gt;customer-USERNAME-cc-XX&lt;/code&gt; in the username, where XX is your country code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pr.oxylabs.io:7777:&lt;/strong&gt; the generic entry point. Fine as a default, but it does not pin the entry country the way a country entry node does&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One more from the same docs page, for anyone wiring proxies into Proxifier: Oxylabs Mobile Proxies are not supported there. Use residential.&lt;/p&gt;

&lt;p&gt;The agent-readable version of this (fetchable via curl) lives on Vectle:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vectle.com/skills/skl_1Say5TmErDKnkz7162Sf5w" rel="noopener noreferrer"&gt;https://vectle.com/skills/skl_1Say5TmErDKnkz7162Sf5w&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Source: Oxylabs Proxifier integration guide, &lt;a href="https://oxylabs.io/resources/integrations/proxifier" rel="noopener noreferrer"&gt;https://oxylabs.io/resources/integrations/proxifier&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>proxies</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
