The Plain Fetch viewer
In short
The viewer requests a URL the way a plain-fetch agent does: no JavaScript, one request for HTML, one for markdown, one for llms.txt and one for a path that should not exist. It shows the initial HTML on the left, the readable text on the right, and seven flags underneath.
Pre-loaded with www.wikipedia.org, read 4 November 2026. Type any public URL to run your own.
The page answers a plain fetch: 5 of 6 checks found.
Initial HTML what a plain fetch receives
<!DOCTYPE html>
<html lang="en" dir="ltr" class="2xl:text-[20px]">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
[... 2 more head elements folded ...]
<link rel="sitemap" href="/sitemap-index.xml">
<link rel="alternate" type="application/rss+xml" title="RustDesk Blog" href="/rss.xml">
<link rel="alternate" type="text/plain" title="RustDesk llms.txt" href="/llms.txt">
[... 7 more head elements folded ...]
<title>RustDesk: Open-Source Remote Desktop with Self-Hosted Server Solutions
</title>
<meta name="description" content="RustDesk is open-source remote desktop software for your own self-hosted server, a TeamViewer and AnyDesk alternative for Windows, macOS, Linux and Android.">
<meta name="robots" content="index,follow">
<link rel="canonical" href="https://rustdesk.com">
[... 21 more head elements folded ...]
<link rel="alternate" hreflang="en" href="https://rustdesk.com">
<link rel="alternate" hreflang="de" href="https://rustdesk.com/de">
<link rel="alternate" hreflang="es" href="https://rustdesk.com/es">
<link rel="alternate" hreflang="fr" href="https://rustdesk.com/fr">
<link rel="alternate" hreflang="it" href="https://rustdesk.com/it">
<link rel="alternate" hreflang="ja" href="https://rustdesk.com/ja">
<link rel="alternate" hreflang="ko" href="https://rustdesk.com/ko">
<link rel="alternate" hreflang="pt" href="https://rustdesk.com/pt">
<link rel="alternate" hreflang="zh-CN" href="https://rustdesk.com/zh-cn">
<link rel="alternate" hreflang="zh-TW" href="https://rustdesk.com/zh-tw">
<link rel="alternate" hreflang="ar" href="https://rustdesk.com/ar">
<link rel="alternate" hreflang="x-default" href="https://rustdesk.com">
[... 4 more head elements folded ...]
</head>
<body class="antialiased text-default bg-page tracking-tight">
<style>astro-island,astro-slot,astro-static-slot{display:contents}
</style>
<script>[... 3,593 characters folded ...]
</script><astro-island uid="1oQC3F" prefix="r0" component-url="/_astro/Scamming.CEExoU6B.js" component-export="default" renderer-url="/_astro/client.BIGLHmRd.js" props="{"lang":[0,"en"]}" ssr="" client="load" opts="{"name":"Scamming","value":true}"></astro-island>
<div class="dark text-muted text-sm bg-black dark:bg-transparent dark:border-b dark:border-slate-800 dark:text-slate-400 hidden md:flex gap-1 overflow-hidden px-3 py-2 relative text-ellipsis whitespace-nowrap justify-center items-center"><span class="bg-secondary text-slate-300 font-semibold px-1 py-0.5 text-xs mr-0.5 rtl:mr-0 rtl:ml-0.5 inline-block">New</span><a href="/blog/rustdesk-1-5-0-webrtc-qos" class="text-muted hover:underline dark:text-slate-400 font-medium">RustDesk 1.5.0: WebRTC Direct Connections and QoS Improvements »
</a>
</div>
<header class="sticky top-0 z-40 flex-none mx-auto w-full border-b border-gray-50/0 transition-[opacity] ease-in-out" data-aw-sticky-header id="header">
<div class="absolute inset-0">
</div>
<div class="relative text-default py-3 px-3 md:px-6 mx-auto w-full md:grid md:grid-cols-3 md:items-center max-w-7xl">
<div class="flex justify-between"> <a class="flex items-center" href="/?lang=en"> <span class="flex items-center self-center ml-2 rtl:ml-0 rtl:mr-2 text-2xl md:text-xl font-bold text-gray-900 whitespace-nowrap dark:text-white"> <img src="/_astro/logo.BKb61-he.svg" loading="lazy" alt="RustDesk Logo" class="h-8 w-8"> <span class="mx-2">rustdesk</span> </span> </a>
<div class="flex items-center md:hidden"> <button type="button" class="flex flex-col h-12 w-12 rounded justify-center items-center cursor-pointer group" aria-label="Toggle Menu" data-aw-toggle-menu> <span class="sr-only">Toggle Menu</span> <span aria-hidden="true" class="h-0.5 w-6 my-1 rounded-full bg-black dark:bg-white transition ease transform duration-200 opacity-80 group-[.expanded]:rotate-45 group-[.expanded]:translate-y-2.5"></span> <span aria-hidden="true" class="h-0.5 w-6 my-1 rounded-full bg-black dark:bg-white transition ease transform duration-200 opacity-80 group-[.expanded]:opacity-0"></span> <span aria-hidden="true" class="h-0.5 w-6 my-1 rounded-full bg-black dark:bg-white transition ease transform duration-200 opacity-80 group-[.expanded]:-rotate-45 group-[.expanded]:-translate-y-2.5"></span> </button>
</div>
</div>
<nav class="items-center w-full md:w-auto hidden md:flex md:mx-5 text-default overflow-y-auto overflow-x-hidden md:overflow-y-visible md:overflow-x-auto md:justify-self-center" aria-label="Main navigation">
<ul class="flex flex-col md:flex-row md:self-center w-full md:w-auto text-xl md:text-[0.9375rem] tracking-[0.01rem] font-medium md:justify-center">
<li class="dropdown"> <button type="button" class="hover:text-link dark:hover:text-white px-4 py-3 flex items-center"> Resources
<svg width="1em" height="1em" viewBox="0 0 24 24" class="w-3.5 h-3.5 ml-0.5 rtl:ml-0 rtl:mr-0.5 hidden md:inline" data-icon="tabler:chevron-down">[... 219 characters folded ...]
</svg> </button>
<ul class="dropdown-menu md:backdrop-blur-md dark:md:bg-dark rounded md:absolute pl-4 md:pl-0 md:hidden font-medium md:bg-white/90 md:min-w-[200px] drop-shadow-xl">
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/team?lang=en"> About us </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/support?lang=en"> Support </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/web"> Web Client </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/self-host/account"> Pro License Portal </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="https://github.com/rustdesk/rustdesk/wiki/FAQ"> FAQ </a>
</li>
</ul>
</li>
<li class=""> <a class="hover:text-link dark:hover:text-white px-4 py-3 flex items-center" href="/pricing?lang=en"> Pricing </a>
</li>
<li class=""> <a class="hover:text-link dark:hover:text-white px-4 py-3 flex items-center" href="/docs"> Docs </a>
</li>
<li class=""> <a class="hover:text-link dark:hover:text-white px-4 py-3 flex items-center" href="/blog?lang=en"> Blog </a>
</li>
</ul>
</nav>
<div class="hidden md:self-center md:flex items-center md:mb-0 fixed w-full md:w-auto md:static justify-end left-0 rtl:left-auto rtl:right-0 bottom-0 p-3 md:p-0 md:justify-self-end">
<div class="items-center flex justify-between w-full md:w-auto">
<div class="flex"> <button type="button" class="text-muted dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5 inline-flex items- [... 84 characters folded ...]>
<svg width="1em" height="1em" viewBox="0 0 24 24" class="w-6 h-6 md:w-5 md:h-5 md:inline-block" data-icon="tabler:sun">[... 302 characters folded ...]
</svg></button> <button id="languageSelect" type="button" class="text-muted dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5 inline-flex items-center">
<svg width="1em" height="1em" viewBox="0 0 24 24" class="w-6 h-6 md:w-5 md:h-5 md:inline-block" data-icon="tabler:language">[... 304 characters folded ...]
</svg>
<svg width="1em" height="1em" viewBox="0 0 24 24" class="w-3.5 h-3.5 ml-0.5 rtl:ml-0 rtl:mr-0.5 hidden md:inline" data-icon="tabler:chevron-down"> <use xlink:href="#ai:tabler:chevron-down"></use>
</svg> </button>
<ul id="languages" class="md:mt-12 hidden bg-white dark:bg-dark dropdown-menu md:backdrop-blur-md dark:md:bg-dark rounded absolute pl-4 md:pl-0 font-medium md:bg-white/90 md:min-w-[200px] drop-shadow-xl">
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap text-primary" href="/?lang=en"> English </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/de"> Deutsch </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/es"> Español </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/fr"> Français </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/it"> Italiano </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/ja"> 日本語 </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/ko"> 한국어 </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/pt"> Português </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/zh-cn"> 简体中文 </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/zh-tw"> 繁體中文 </a>
</li>
<li> <a class="first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap" href="/ar"> العربية </a>
</li>
</ul> <a target="_blank" rel="noopener" class="text-muted dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5 inline [... 134 characters folded ...]> <span class="w-[5.6rem] h-[1.25rem] bg-cover bg-[url(https://img.shields.io/github/stars/rustdesk/rustdesk.svg?style=social&label=Stars&maxAge=86400)]"></span> </a>
</div> <span class="ml-4 rtl:ml-0 rtl:mr-4"> <a class="btn-secondary ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto" target="_blank" rel="noopener noreferrer" href="https://github.com/rustdesk/rustdesk/releases/latest">Download</a> </span>
</div>
</div>
</div>
</header>
<main>
<section class="bg-blue-50 dark:bg-slate-800 not-prose">
<div class="max-w-6xl mx-auto px-4 sm:px-6 py-4 text-md text-center font-medium"> <span class="font-bold">
<svg width="1em" height="1em" viewBox="0 0 24 24" class="w-5 h-5 inline-block align-text-bottom" data-icon="tabler:info-square">[... 314 characters folded ...]
</svg> Note:</span> <span class="text-2xl text-font-bold">rustdesk.com</span> is our only official domain. Please do not download RustDesk from the other domains.
</div>
</section>
<section class="relative md:-mt-[76px] not-prose ">
<div class="absolute inset-0 pointer-events-none" aria-hidden="true">
</div>
<div class="relative max-w-7xl mx-auto px-4 sm:px-6">
<div class="pt-0 md:pt-[76px] pointer-events-none">
</div>
<div class="py-12 md:py-20">
<div class="text-center pb-10 md:pb-16 max-w-5xl mx-auto">
<h1 class="text-5xl md:text-6xl font-bold leading-tighter tracking-tighter mb-4 font-heading dark:text-gray-200"> The Fast Open-Source Remote Access and Support Software
</h1>
<div class="max-w-3xl mx-auto">
<p class="text-xl text-muted mb-6 dark:text-slate-300">
Switch from TeamViewer, AnyDesk, and Splashtop to RustDesk for a secure and reliable remote desktop experience
with your own self-hosted servers.
</p>
<div class="max-w-xs sm:max-w-md m-auto flex flex-nowrap flex-col sm:flex-row sm:justify-center gap-4">
<div class="flex w-full sm:w-auto"> <a class="btn-primary w-full sm:mb-0" target="_blank" rel="noopener noreferrer" href="https://rustdesk.com/download">Download
<svg width="1em" height="1em" viewBox="0 0 24 24" class="w-5 h-5 ml-1 -mr-1.5 rtl:mr-1 rtl:-ml-1.5 inline-block" data-icon="tabler:download"> <use xlink:href="#ai:tabler:download"></use>
</svg></a>
</div>
<div class="flex w-full sm:w-auto"> <a class="btn-secondary w-full sm:mb-0" href="https://rustdesk.com/pricing">Self-Hosting
<svg width="1em" height="1em" viewBox="0 0 24 24" class="w-5 h-5 ml-1 -mr-1.5 rtl:mr-1 rtl:-ml-1.5 inline-block" data-icon="tabler:server"> <use xlink:href="#ai:tabler:server"></use>
</svg></a>
Shown with 37 long blocks (scripts, styles, long tags) folded into a marker that says how many characters they hide; line breaks added before block tags because the source is minified; the pane stops after the first 200 words; the page is 77 KB.
Reading view the text a plain-fetch client can extract
title: RustDesk: Open-Source Remote Desktop with Self-Hosted Server Solutions
The Fast Open-Source Remote Access and Support Software
New RustDesk 1.5.0: WebRTC Direct Connections and QoS Improvements » rustdesk Toggle Menu Resources About us Support Web Client Pro License Portal FAQ Pricing Docs Blog English Deutsch Español Français Italiano 日本語 한국어 Português 简体中文 繁體中文 العربية Download Note: rustdesk.com is our only official domain. Please do not download RustDesk from the other domains. The Fast Open-Source Remote Access and Support Software Switch from TeamViewer, AnyDesk, and Splashtop to RustDesk for a secure and reliable remote desktop experience with your own self-hosted servers. Download Self-Hosting Inside Self-Hosting Empower your remote access with self-hosted servers Why self-hosting? Are you frustrated with SaaS platforms due to their unstable performance, lack of transparency, and uncertain data security risks? Full data control Regulatory compliance made easy: self-hosted RustDesk keeps your data fully under your control. World-class open source With 113K+ GitHub stars, RustDesk ranks among the world's top 100 open-source software projects, backed by a thriving global community. Performance and reliability Run on your own infrastructure — no dependency on third-party SaaS availability, no shared noisy neighbors. Flexibility and customization Tailor RustDesk on-premise to fit your unique requirements. Custom Client Customize your client with your brand and make it truly yours. Your brand, your
351 more words follow in the initial HTML.
| Check | Result | Detail |
|---|---|---|
| H1 in the initial HTML | Found 2 H1 elements | First H1: The Fast Open-Source Remote Access and Support Software |
| First 200 words in the initial HTML | Found 200 of 200 words | The initial HTML carries 551 words of visible text; the first 200 are marked in the left pane. |
| llms.txt present and linked | Found present and linked | 4463 bytes, 0 links. Structure grade C (4 of 6). The home page links it, which is how agents reached it in Ora's lab. |
| Markdown on request | Missing 200 text/html | Accept: text/markdown returned 200 with text/html. The server ignores the header. |
| Status of a made-up path | Found 404 | /agent-ready-html-missing-path-check returned 404: a real status code for a missing page. |
| JSON-LD types | Found ContactPoint, ImageObject, Organization, SoftwareApplication and 2 more | 6 schema.org types in JSON-LD blocks on the home page: ContactPoint, ImageObject, Organization, SoftwareApplication, WebPage, WebSite. |
| OpenAPI link | Note none on the home page | No OpenAPI link on the home page. It matters only for a site that ships an API. |
Run the full check
The viewer read one page with four requests. The full check we recommend next is Ora's scan. Its Access layer runs 42 checks worth 30 of its 100 points, among them content without JavaScript, bot detection, llms.txt, markdown on request, JSON-LD and the sitemap (Ora's check catalogue, contract 1.38.0, read 5 November 2026). Open Ora's report for rustdesk.com.
Limits: Ora reads public URLs only, says two runs of one scan land within a couple of points without publishing repeat-scan data, and keeps the product that fixes what it finds behind a waitlist. Cloudflare's scanner at isitagentready.com is a quick free alternative, and Mintlify's score covers documentation.
What the viewer does
It sends four plain GET requests with the user agent Mozilla/5.0 (compatible; agent-readiness-crawl/1.0): the URL itself, the same URL with Accept: text/markdown, /llms.txt on the same host, and a made-up path at the root. It runs no JavaScript. The left pane is the first bytes of the HTML as text, with long scripts and styles folded into a marker that says how many characters they hide. The H1 and the first 200 words of visible text are marked in both panes. The flags under the panes say what the four responses added up to.
Limits
- Ten seconds for all four requests together, 1.5 MB read from the home page, at most five redirects, each one checked again.
- http and https only, default ports only. Private, local and internal addresses and names are refused.
- Ten runs per address per minute. The counter lives in memory on the edge function, so it is per instance rather than global. Past ten you get a 429 with a Retry-After header.
- Results are cached for 24 hours by the response headers. Nothing is written to a database: the viewer keeps the first 200 words and the extracted fields for the length of the request and keeps no page body beyond that.
What it does not tell you
A plain fetch from this server is not a real agent. Bot protection weighs the source address more than the user agent, so a page that answers 200 here can still refuse an agent, and the reverse. Ora's lab found (2026-10-19) that returning 403 to agent user agents and hiding the answer in JavaScript were the only two of 19 configurations that stopped retrieval; the viewer can see the second, and can only hint at the first. The initial HTML reference covers both. The server logs and the published crawler address ranges settle the first.
The seven flags
- H1 in the initial HTML
- Whether the HTML the server sends already contains an H1. It is the cheapest sign that the page does not depend on scripts to say what it is.
- First 200 words in the initial HTML
- Whether at least 200 words of visible text arrive in the initial HTML. Under 40 words with an app root element is flagged as a JavaScript shell.
- llms.txt present and linked
- Whether /llms.txt answers with a plain-text file, whether the home page links it (an anchor, a link element or a Link header), and the structure grade the index uses.
- Markdown on request
- Whether a request with Accept: text/markdown comes back as text/markdown. Cloudflare Radar found 3.9 percent of scanned top sites passing this at its April 2026 launch.
- Status of a made-up path
- Whether a path that should not exist returns 404 or 410. A 200 is a soft 404 and reads as a live page.
- JSON-LD types
- The schema.org types found in JSON-LD blocks on the page. Ora's lab found JSON-LD made no difference when the answer was already in the HTML.
- OpenAPI link
- Whether the page links an OpenAPI file, by an anchor or a service-desc link relation. It matters only for a site that ships an API.
Sources
- Ora: AgentReady launch post (Ora's lab findings) https://ora.ai/blog/agentready-launch, read 4 November 2026
- Ora check catalogue, contract 1.38.0 (132 checks, 42 in the Access layer) https://ora.ai/api/checks, read 5 November 2026
- Ora home page (the fixing product is behind a waitlist) https://ora.ai/, read 5 November 2026
- Ora: Introducing Deep Scan (repeat scans) https://ora.ai/blog/introducing-deep-scan, read 5 November 2026
- Ora llms.txt (public URLs only) https://ora.ai/llms.txt, read 5 November 2026
- Vercel: Make your site readable by AI agents https://vercel.com/kb/guide/make-your-site-readable-by-ai-agents, read 4 November 2026
- llms.txt proposal (llmstxt.org) https://llmstxt.org/, read 4 November 2026
Last reviewed 5 November 2026