<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>OpenProxyAI Blog</title>
        <link>https://docs-site-ten-nu.vercel.app/blog</link>
        <description>Engineering notes on running an LLM control plane.</description>
        <lastBuildDate>Sat, 08 Aug 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 OpenProxyAI</copyright>
        <item>
            <title><![CDATA[OpenProxyAI vs. LiteLLM: the engine vs. the car]]></title>
            <link>https://docs-site-ten-nu.vercel.app/blog/openproxyai-vs-litellm</link>
            <guid>https://docs-site-ten-nu.vercel.app/blog/openproxyai-vs-litellm</guid>
            <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[LiteLLM and OpenProxyAI are both self-hosted proxies you run yourself — but they solve different layers of the problem, and the honest answer for a lot of teams is "both."]]></description>
            <content:encoded><![CDATA[<p>LiteLLM comes up in almost every conversation about self-hosted LLM gateways, and it should — it's the library a large share of this category, OpenProxyAI included, is built on top of for provider abstraction. So the honest framing isn't "OpenProxyAI vs. LiteLLM" as competitors. It's closer to: LiteLLM is the engine, and OpenProxyAI is what you get when you build the rest of the car around it.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-litellm-actually-is">What LiteLLM actually is<a href="https://docs-site-ten-nu.vercel.app/blog/openproxyai-vs-litellm#what-litellm-actually-is" class="hash-link" aria-label="Direct link to What LiteLLM actually is" title="Direct link to What LiteLLM actually is" translate="no">​</a></h2>
<p>LiteLLM is an open-source proxy and Python SDK that gives you a single OpenAI-compatible interface across 100+ providers, with routing, spend tracking, and caching. You self-host it, configure it via a <code>proxy_config.yaml</code>, and it does the provider-abstraction job extremely well — it's a dependable, widely-adopted piece of infrastructure, and if all you need is "one API, many providers, budget tracking," it's a completely reasonable place to stop.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-the-two-diverge">Where the two diverge<a href="https://docs-site-ten-nu.vercel.app/blog/openproxyai-vs-litellm#where-the-two-diverge" class="hash-link" aria-label="Direct link to Where the two diverge" title="Direct link to Where the two diverge" translate="no">​</a></h2>
<p>The gap shows up once "route to the right model" stops being the whole requirement.</p>
<ul>
<li class=""><strong>Policy enforcement.</strong> OpenProxyAI's pipeline runs PII redaction, secrets scanning, topic guarding, and prompt-injection detection on every request as a core stage — not a separate service you wire in. LiteLLM's core proxy is routing- and budget-focused; equivalent guardrail behavior generally means integrating something else in front of or alongside it.</li>
<li class=""><strong>Compliance starting points.</strong> OpenProxyAI ships Healthcare, Finance, and Government policy templates you apply and customize. LiteLLM doesn't have an equivalent — you're building your policy configuration from scratch.</li>
<li class=""><strong>Admin surface.</strong> LiteLLM is primarily config-file and CLI driven, with enterprise features like chargeback attribution gated behind a separate licensed tier. OpenProxyAI ships a full admin console — teams, budgets, policies, audit log — as the default way to operate it, not an add-on.</li>
<li class=""><strong>Audit trail.</strong> OpenProxyAI's logging is immutable by design and built for handing to an auditor. LiteLLM's logging is flexible and integrates with a wide range of observability backends, but "audit-ready by default" isn't the framing it's built around.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-litellm-is-the-better-call">Where LiteLLM is the better call<a href="https://docs-site-ten-nu.vercel.app/blog/openproxyai-vs-litellm#where-litellm-is-the-better-call" class="hash-link" aria-label="Direct link to Where LiteLLM is the better call" title="Direct link to Where LiteLLM is the better call" translate="no">​</a></h2>
<p>If you're a single team that needs multi-provider routing and cost tracking, and you're comfortable owning the guardrail and compliance layer yourself (or you don't need one yet), LiteLLM's simplicity is a real advantage — it's less software to run, and its provider coverage is excellent. Plenty of OpenProxyAI's own architecture leans on the same library for exactly that reason.</p>
<p>The honest split: pick LiteLLM if the org chart approving your AI usage is small. Pick OpenProxyAI if there's a compliance or security team in that approval chain who needs redaction, an audit trail, and policy enforcement to already be there — not bolted on later.</p>]]></content:encoded>
            <category>Product</category>
            <category>Architecture</category>
        </item>
        <item>
            <title><![CDATA[OpenProxyAI vs. Portkey: SaaS-first vs. self-hosted-first]]></title>
            <link>https://docs-site-ten-nu.vercel.app/blog/openproxyai-vs-portkey</link>
            <guid>https://docs-site-ten-nu.vercel.app/blog/openproxyai-vs-portkey</guid>
            <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Portkey and OpenProxyAI cover similar ground on features — gateway, guardrails, observability. The real difference is which deployment model is the default, not an upgrade.]]></description>
            <content:encoded><![CDATA[<p>Portkey is the most feature-comparable product to OpenProxyAI in this space — a unified gateway, real guardrails (including PII redaction), observability, and enterprise governance. If you put the feature lists side by side, they overlap a lot. The difference that actually matters is architectural, not a checklist item: which deployment model is the default, and which one you have to pay to unlock.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="portkeys-model">Portkey's model<a href="https://docs-site-ten-nu.vercel.app/blog/openproxyai-vs-portkey#portkeys-model" class="hash-link" aria-label="Direct link to Portkey's model" title="Direct link to Portkey's model" translate="no">​</a></h2>
<p>Portkey is SaaS-first. The default way to run it is as a managed, multi-tenant service — your traffic goes through infrastructure Portkey operates. VPC hosting and fully air-gapped deployment exist, but as part of the Enterprise tier, not the starting point. For a lot of teams that's a perfectly reasonable trade: less infrastructure to run, a managed service handling scaling and uptime.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openproxyais-model">OpenProxyAI's model<a href="https://docs-site-ten-nu.vercel.app/blog/openproxyai-vs-portkey#openproxyais-model" class="hash-link" aria-label="Direct link to OpenProxyAI's model" title="Direct link to OpenProxyAI's model" translate="no">​</a></h2>
<p>OpenProxyAI is self-hosted from the first tier up. It runs inside your VPC against your own Postgres and Redis from day one — there's no multi-tenant data plane to opt out of later, because it was never the default to begin with.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-the-ordering-is-the-actual-decision">Why the ordering is the actual decision<a href="https://docs-site-ten-nu.vercel.app/blog/openproxyai-vs-portkey#why-the-ordering-is-the-actual-decision" class="hash-link" aria-label="Direct link to Why the ordering is the actual decision" title="Direct link to Why the ordering is the actual decision" translate="no">​</a></h2>
<p>Both products can, in the end, run inside your infrastructure. But "self-hosted is available at the top tier" and "self-hosted is what you start with" are different conversations with your security team. The first one asks them to evaluate a SaaS vendor's data handling practices <em>unless</em> you pay for the option to avoid it. The second one means there's no SaaS data-handling question to evaluate in the first place — the software runs where you tell it to, from the free trial onward.</p>
<p>If your organization is comfortable with a managed multi-tenant service and wants the fastest path to a working gateway, Portkey's SaaS-first model is a legitimate, well-built option — the model catalog and guardrail feature set are genuinely strong. If "our prompts never touch infrastructure we don't control" is a requirement rather than a nice-to-have, that's the gap OpenProxyAI is built to close by default.</p>
<p>See <a class="" href="https://docs-site-ten-nu.vercel.app/guides/deploying-with-docker-compose">Deploying with Docker Compose</a> for what running it in your own VPC actually looks like.</p>]]></content:encoded>
            <category>Product</category>
            <category>Security</category>
        </item>
        <item>
            <title><![CDATA[Compliance templates: policy configs, not badges]]></title>
            <link>https://docs-site-ten-nu.vercel.app/blog/compliance-templates-not-badges</link>
            <guid>https://docs-site-ten-nu.vercel.app/blog/compliance-templates-not-badges</guid>
            <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We shipped Healthcare, Finance, and Government policy templates this phase. Here's exactly what that means, and — just as importantly — what it doesn't.]]></description>
            <content:encoded><![CDATA[<p>We shipped three compliance templates this phase — Healthcare, Finance, and Government — and the most important thing to say about them is what they're <em>not</em>: they're not a claim that OpenProxyAI holds any certification on your behalf. They're pre-built policy configurations you apply, review, and enforce yourself.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-the-distinction-matters">Why the distinction matters<a href="https://docs-site-ten-nu.vercel.app/blog/compliance-templates-not-badges#why-the-distinction-matters" class="hash-link" aria-label="Direct link to Why the distinction matters" title="Direct link to Why the distinction matters" translate="no">​</a></h2>
<p>It's common in this category to see a security page with a row of certification badges and fine print that, read carefully, describes a much narrower claim than the badge implies. We'd rather not do that. If you're evaluating OpenProxyAI for a regulated workload, the honest starting point is: <strong>we don't currently hold SOC 2, ISO 27001, or HIPAA certification.</strong> Full detail on where things actually stand is on the <a class="" href="https://docs-site-ten-nu.vercel.app/security/trust-center">Trust Center</a>.</p>
<p>What we do have is a real, useful thing that's easy to describe accurately: three starting configurations that encode the policy decisions a Healthcare, Finance, or Government deployment usually needs to make anyway.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-actually-in-each-one">What's actually in each one<a href="https://docs-site-ten-nu.vercel.app/blog/compliance-templates-not-badges#whats-actually-in-each-one" class="hash-link" aria-label="Direct link to What's actually in each one" title="Direct link to What's actually in each one" translate="no">​</a></h2>
<p><strong>Healthcare</strong> sets PHI redaction defaults tuned for clinical data, restricts which models can receive requests tagged as containing clinical content, and extends audit retention beyond the platform default.</p>
<p><strong>Finance</strong> blocks cardholder-data patterns before they reach a provider, captures transaction context in the audit log, and tightens default rate limits.</p>
<p><strong>Government</strong> pairs with air-gapped deployment (<code>AIRGAP_MODE=true</code>) and enforces data residency with no fallback outside approved regions, plus 7-year audit retention.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="applying-one-doesnt-lock-you-in">Applying one doesn't lock you in<a href="https://docs-site-ten-nu.vercel.app/blog/compliance-templates-not-badges#applying-one-doesnt-lock-you-in" class="hash-link" aria-label="Direct link to Applying one doesn't lock you in" title="Direct link to Applying one doesn't lock you in" translate="no">​</a></h2>
<p>A template merges into your organization's existing policy configuration — it doesn't overwrite what you've already customized, and nothing about applying one prevents you from adjusting individual policies afterward. Turn a policy from <code>enforce</code> to <code>log-only</code> while you evaluate its false-positive rate. Tighten a threshold. Swap the model allowlist. The template is a starting point calibrated to a framework's typical requirements, not a fixed configuration you're stuck with.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-honest-pitch">The honest pitch<a href="https://docs-site-ten-nu.vercel.app/blog/compliance-templates-not-badges#the-honest-pitch" class="hash-link" aria-label="Direct link to The honest pitch" title="Direct link to The honest pitch" translate="no">​</a></h2>
<p>If your actual requirement is "we need a SOC 2 report to show our auditor," a policy template doesn't satisfy that — no software can, that's an organizational process, not a config file. What it does do: it gets you from a blank policy configuration to something aligned with what your framework typically requires, in one API call instead of reading the framework's requirements document and building each policy from scratch.</p>
<p>See <a class="" href="https://docs-site-ten-nu.vercel.app/guides/compliance-templates">Compliance Templates</a> for how to apply one, and the <a class="" href="https://docs-site-ten-nu.vercel.app/security/trust-center">Trust Center</a> for where our own certification status actually stands today.</p>]]></content:encoded>
            <category>Product</category>
            <category>Security</category>
        </item>
        <item>
            <title><![CDATA[What actually happens in the four milliseconds before your LLM call]]></title>
            <link>https://docs-site-ten-nu.vercel.app/blog/four-milliseconds</link>
            <guid>https://docs-site-ten-nu.vercel.app/blog/four-milliseconds</guid>
            <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A request to gpt-4o passes through six stages before it ever reaches OpenAI. Here's what each one is actually doing, and why the order isn't arbitrary.]]></description>
            <content:encoded><![CDATA[<p>"Adds a few milliseconds of overhead" is the kind of line that shows up in every proxy's marketing copy, ours included. It's true, but it undersells what's actually happening in that window. Six things happen, in a specific order, and the order is load-bearing — get it wrong and you either leak data you meant to redact, or you pay for cache infrastructure you can't actually use.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-pipeline">The pipeline<a href="https://docs-site-ten-nu.vercel.app/blog/four-milliseconds#the-pipeline" class="hash-link" aria-label="Direct link to The pipeline" title="Direct link to The pipeline" translate="no">​</a></h2>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-the-order-isnt-arbitrary">Why the order isn't arbitrary<a href="https://docs-site-ten-nu.vercel.app/blog/four-milliseconds#why-the-order-isnt-arbitrary" class="hash-link" aria-label="Direct link to Why the order isn't arbitrary" title="Direct link to Why the order isn't arbitrary" translate="no">​</a></h2>
<p><strong>Auth and rate limiting come first</strong> because there's no point doing any other work — redacting PII, checking a cache — for a request you're about to reject anyway. Reject cheap failures as early as possible.</p>
<p><strong>Policy runs before cache, not after.</strong> This is the one that actually matters. If a request contains PII and policy redaction ran <em>after</em> the cache check, the cache key would be built from the raw, unredacted content — which means the cached entry itself could contain the PII that was supposed to be stripped. Running policy first means the cache only ever sees the already-redacted version. The cache can't leak something it never saw.</p>
<p><strong>Cache comes before routing</strong> for the obvious reason: a cache hit means there's no routing decision to make at all. The request never reaches the provider-selection logic, because it never reaches a provider.</p>
<p><strong>Logging is the only stage that happens after the response is sent, not before.</strong> Every other stage can reject or delay the request. Logging can't — it's fire-and-forget, written asynchronously once the response has already gone back to the caller. A slow or temporarily unavailable logging backend should never be the reason your application's request takes longer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-this-costs-in-practice">What this costs in practice<a href="https://docs-site-ten-nu.vercel.app/blog/four-milliseconds#what-this-costs-in-practice" class="hash-link" aria-label="Direct link to What this costs in practice" title="Direct link to What this costs in practice" translate="no">​</a></h2>
<p>Stages 1–3 and 5–6 typically add low-single-digit milliseconds combined — the actual overhead is dominated by whichever provider you're calling, not by OpenProxyAI. A cache hit at stage 4 doesn't add latency at all; it <em>replaces</em> the provider round-trip entirely, which is usually hundreds of milliseconds saved, not spent.</p>
<p>The four milliseconds aren't overhead you're paying for nothing. They're the four milliseconds where redaction, budget enforcement, and cache-key correctness all have to happen in the right order — before the request goes anywhere you can't take it back from.</p>
<p>Full detail on each stage in <a class="" href="https://docs-site-ten-nu.vercel.app/core-concepts/request-pipeline">Request Pipeline</a>.</p>]]></content:encoded>
            <category>Engineering</category>
            <category>Architecture</category>
        </item>
        <item>
            <title><![CDATA[Row-level security: making data leaks impossible by construction]]></title>
            <link>https://docs-site-ten-nu.vercel.app/blog/row-level-security-by-construction</link>
            <guid>https://docs-site-ten-nu.vercel.app/blog/row-level-security-by-construction</guid>
            <pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Application-level tenant isolation only works if every query remembers to filter correctly, forever. We moved that guarantee into the database instead.]]></description>
            <content:encoded><![CDATA[<p>Every multi-tenant system has to answer the same question: what stops a bug in organization A's code path from returning organization B's data? The conventional answer is discipline — every query gets a <code>WHERE org_id = ?</code> clause, added by convention, reviewed in code review, hopefully never forgotten.</p>
<p>We didn't want the answer to be discipline. We wanted it to be a database property that doesn't care whether the application code remembered.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-the-application-level-approach-breaks">Where the application-level approach breaks<a href="https://docs-site-ten-nu.vercel.app/blog/row-level-security-by-construction#where-the-application-level-approach-breaks" class="hash-link" aria-label="Direct link to Where the application-level approach breaks" title="Direct link to Where the application-level approach breaks" translate="no">​</a></h2>
<p><code>WHERE org_id = ?</code> is a pattern, not a guarantee. It's only as strong as the least careful query in the codebase — one join that forgets the clause, one raw SQL escape hatch during a migration, one new engineer who doesn't know the convention yet. When it breaks, it doesn't throw an error. It just quietly returns rows that belong to someone else's organization. That's close to the worst possible failure mode for a security bug: silent, and only discovered when someone notices data that shouldn't be there.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-row-level-security-changes">What row-level security changes<a href="https://docs-site-ten-nu.vercel.app/blog/row-level-security-by-construction#what-row-level-security-changes" class="hash-link" aria-label="Direct link to What row-level security changes" title="Direct link to What row-level security changes" translate="no">​</a></h2>
<p>PostgreSQL's row-level security (RLS) moves the boundary into the database itself. Every table that holds organization-scoped data has a policy that filters rows based on a session-level variable — set once, at the start of a database session, before any query runs.</p>
<!-- -->
<p>The critical property: a query that forgets to filter by organization doesn't leak the wrong rows. It returns <em>no</em> rows for anything outside its session's scope, because the database enforces the boundary independently of what the query asked for. The failure mode changes from "silently wrong" to "safely empty" — which is the difference between a data breach and a bug report.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-part-thats-easy-to-get-wrong">The part that's easy to get wrong<a href="https://docs-site-ten-nu.vercel.app/blog/row-level-security-by-construction#the-part-thats-easy-to-get-wrong" class="hash-link" aria-label="Direct link to The part that's easy to get wrong" title="Direct link to The part that's easy to get wrong" translate="no">​</a></h2>
<p>RLS only works if every code path that touches the database actually sets the session's org context before querying. That's straightforward in the request path — one middleware call at the start of every request. It's less obvious for background jobs: log archival, webhook retries, scheduled analytics refreshes all run outside the request-response cycle, on their own schedule, sometimes across every organization in a single sweep. Each of those has to open its own database session and explicitly scope it, rather than assuming a request-scoped session it can borrow — because there isn't one to borrow from.</p>
<p>Get that part right and the guarantee holds everywhere, not just in the code paths someone thought to test.</p>
<p>More detail on the actual policy mechanics in <a class="" href="https://docs-site-ten-nu.vercel.app/security/row-level-security">Row-Level Security</a>.</p>]]></content:encoded>
            <category>Security</category>
            <category>Engineering</category>
        </item>
        <item>
            <title><![CDATA[Why OpenProxyAI runs in your VPC, not ours]]></title>
            <link>https://docs-site-ten-nu.vercel.app/blog/vpc-first-architecture</link>
            <guid>https://docs-site-ten-nu.vercel.app/blog/vpc-first-architecture</guid>
            <pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Most AI gateways are SaaS-first, with self-hosting as an enterprise add-on. We built it the other way around — here's why that ordering matters.]]></description>
            <content:encoded><![CDATA[<p>Most AI gateways you'll evaluate are built SaaS-first: a multi-tenant service you send your traffic to, with a self-hosted or "VPC" option available if you pay for the enterprise tier. OpenProxyAI is built the other way around. Self-hosted is the default, not the upsell.</p>
<p>That ordering isn't a licensing decision. It changes what you're actually agreeing to when you adopt the tool.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-question-a-saas-gateway-cant-answer-cleanly">The question a SaaS gateway can't answer cleanly<a href="https://docs-site-ten-nu.vercel.app/blog/vpc-first-architecture#the-question-a-saas-gateway-cant-answer-cleanly" class="hash-link" aria-label="Direct link to The question a SaaS gateway can't answer cleanly" title="Direct link to The question a SaaS gateway can't answer cleanly" translate="no">​</a></h2>
<p>If your proxy is a multi-tenant SaaS product, every request your organization sends passes through infrastructure someone else operates. That's fine for a lot of tools. It's a much harder sell when the traffic is prompts containing customer PII, internal financial data, or anything else your compliance team has opinions about — because now the question isn't just "does this vendor have good security practices," it's "which of our regulatory obligations just became partially their responsibility."</p>
<p>A self-hosted-by-default proxy sidesteps the question entirely. The service runs on infrastructure <em>you</em> control — your VPC, your Postgres, your Redis. There's no data plane operated by us that your requests need to trust.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-this-actually-looks-like">What this actually looks like<a href="https://docs-site-ten-nu.vercel.app/blog/vpc-first-architecture#what-this-actually-looks-like" class="hash-link" aria-label="Direct link to What this actually looks like" title="Direct link to What this actually looks like" translate="no">​</a></h2>
<!-- -->
<p>The only thing that leaves your network is the outbound call to whichever model provider you've configured — the same call your application would make directly, just routed through policy enforcement and logging first. There's no OpenProxyAI-operated service in the request path at all.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-trade-off-honestly">The trade-off, honestly<a href="https://docs-site-ten-nu.vercel.app/blog/vpc-first-architecture#the-trade-off-honestly" class="hash-link" aria-label="Direct link to The trade-off, honestly" title="Direct link to The trade-off, honestly" translate="no">​</a></h2>
<p>Self-hosted-first isn't free. You're running a service, which means you own its uptime, its scaling, and its patching cadence — that's real operational weight a managed SaaS product takes off your plate. If you'd rather not carry that, the hosted Starter and Growth plans exist for exactly that reason.</p>
<p>But for the buyer this actually matters to — a security team evaluating whether prompts containing regulated data are allowed to leave the building — self-hosted-first isn't a nice-to-have. It's the reason the tool clears procurement at all.</p>
<p>See <a class="" href="https://docs-site-ten-nu.vercel.app/guides/deploying-with-docker-compose">Deploying with Docker Compose</a> or <a class="" href="https://docs-site-ten-nu.vercel.app/guides/deploying-with-helm">Deploying with Helm</a> to see what actually running it looks like.</p>]]></content:encoded>
            <category>Architecture</category>
            <category>Security</category>
        </item>
    </channel>
</rss>