{"id":713,"date":"2026-05-05T17:44:40","date_gmt":"2026-05-05T17:44:40","guid":{"rendered":"https:\/\/hosting.international\/blog\/?p=713"},"modified":"2026-05-05T17:44:40","modified_gmt":"2026-05-05T17:44:40","slug":"hosting-a-telegram-bot-on-a-vps-a-complete-guide","status":"publish","type":"post","link":"https:\/\/hosting.international\/blog\/hosting-a-telegram-bot-on-a-vps-a-complete-guide\/","title":{"rendered":"Hosting a Telegram Bot on a VPS: A Complete Guide"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Telegram bots are one of the most practical things you can deploy on a VPS. They&#8217;re lightweight, always-on services that need a stable connection, a public IP, and a process that doesn&#8217;t die when you close your terminal. A VPS checks all three boxes \u2014 and once you&#8217;ve done this once, you&#8217;ll wonder why you ever tried running a bot on your laptop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide walks you through the entire process: from creating a bot to deploying it on a VPS with proper process management, HTTPS webhooks, and automatic restarts. We&#8217;ll use Python and the popular <code>python-telegram-bot<\/code> library, but the infrastructure concepts apply equally to Node.js, Go, or any other stack.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What You&#8217;ll Need<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A VPS running Ubuntu 22.04 or 24.04 (any plan with 1 vCPU and 1Gb RAM is sufficient for most bots)<\/li>\n\n\n\n<li>A domain name or a dedicated IP address<\/li>\n\n\n\n<li>A Telegram account to create the bot<\/li>\n\n\n\n<li>Basic familiarity with the Linux command line<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Create Your Bot with BotFather<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every Telegram bot starts with BotFather \u2014 Telegram&#8217;s official bot for creating and managing bots.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open Telegram and search for <code>@BotFather<\/code><\/li>\n\n\n\n<li>Send <code>\/newbot<\/code><\/li>\n\n\n\n<li>Choose a display name (e.g., <em>My Awesome Bot<\/em>)<\/li>\n\n\n\n<li>Choose a username ending in <code>bot<\/code> (e.g., <code>myawesomebot<\/code>)<\/li>\n\n\n\n<li>BotFather will reply with your <strong>bot token<\/strong> \u2014 a string that looks like <code>7123456789:AAF...<\/code><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Copy this token and keep it safe. Anyone with this token can control your bot.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Connect to Your VPS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Connect via SSH:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh root@your-server-ip<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s good practice to create a dedicated user for running your bot rather than using root:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>adduser botuser\nusermod -aG sudo botuser\nsu - botuser<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Install Python and Dependencies<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ubuntu 22.04 and 24.04 come with Python 3 pre-installed. Verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 --version<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Install pip and venv:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install python3-pip python3-venv -y<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Create a project directory and a virtual environment:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir ~\/mybot &amp;&amp; cd ~\/mybot\npython3 -m venv venv\nsource venv\/bin\/activate<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Install the Telegram bot library:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install python-telegram-bot<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Write Your Bot<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create the bot script:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano bot.py<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s a minimal but functional bot that responds to <code>\/start<\/code> and echoes any text message:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#python\nimport logging\nfrom telegram import Update\nfrom telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, ContextTypes\n\nlogging.basicConfig(\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n    level=logging.INFO\n)\n\nBOT_TOKEN = \"YOUR_BOT_TOKEN_HERE\"\n\nasync def start(update: Update, context: ContextTypes.DEFAULT_TYPE):\n    await update.message.reply_text(\"Hello! I'm running on a VPS 24\/7.\")\n\nasync def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):\n    await update.message.reply_text(update.message.text)\n\nif __name__ == \"__main__\":\n    app = ApplicationBuilder().token(BOT_TOKEN).build()\n    app.add_handler(CommandHandler(\"start\", start))\n    app.add_handler(MessageHandler(filters.TEXT &amp; ~filters.COMMAND, echo))\n    app.run_polling()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>YOUR_BOT_TOKEN_HERE<\/code> with the token from BotFather.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Test it locally first:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python bot.py<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Open Telegram, find your bot, and send <code>\/start<\/code>. If it responds, the code works. Press <code>Ctrl+C<\/code> to stop it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Keep It Running with systemd<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Running your bot manually in a terminal means it dies the moment you disconnect. The right solution is <code>systemd<\/code> \u2014 the process manager built into every modern Linux distribution. It will start your bot automatically on boot and restart it if it crashes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create a service file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/systemd\/system\/mybot.service<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Paste the following (adjust paths if your username isn&#8217;t <code>botuser<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=Telegram Bot\nAfter=network.target\n\n&#91;Service]\nType=simple\nUser=botuser\nWorkingDirectory=\/home\/botuser\/mybot\nExecStart=\/home\/botuser\/mybot\/venv\/bin\/python bot.py\nRestart=always\nRestartSec=5\nStandardOutput=journal\nStandardError=journal\n\n&#91;Install]\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Enable and start the service:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl daemon-reload\nsudo systemctl enable mybot\nsudo systemctl start mybot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check that it&#8217;s running:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl status mybot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see <code>active (running)<\/code>. Your bot now starts automatically on every reboot and restarts within 5 seconds if it crashes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To view logs:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>journalctl -u mybot -f<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Polling vs Webhooks \u2014 Which Should You Use?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Your bot can receive updates from Telegram in two ways:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Polling<\/strong> (what the example above uses): Your bot constantly asks Telegram &#8220;any new messages?&#8221; every few seconds. Simple to set up, no SSL required, works behind NAT. Fine for development and low-traffic bots.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Webhooks<\/strong>: Telegram pushes updates to your server instantly the moment a message arrives. Faster response times, more efficient, and scales better. Requires a public HTTPS endpoint \u2014 meaning you need a domain and an SSL certificate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a production bot that needs to feel responsive, webhooks are the right choice.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7: Setting Up Webhooks with SSL (Production Setup)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">7.1 Point a Domain to Your VPS<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In your DNS settings, create an A record pointing your domain (or a subdomain like <code>bot.yourdomain.com<\/code>) to your VPS IP address. Allow a few minutes for propagation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.2 Install Nginx and Certbot<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install nginx certbot python3-certbot-nginx -y<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">7.3 Create an Nginx Config<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/nginx\/sites-available\/mybot<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n    listen 80;\n    server_name bot.yourdomain.com;\n\n    location \/webhook {\n        proxy_pass http:\/\/127.0.0.1:8443;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Enable the config:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ln -s \/etc\/nginx\/sites-available\/mybot \/etc\/nginx\/sites-enabled\/\nsudo nginx -t\nsudo systemctl reload nginx<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">7.4 Get an SSL Certificate<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo certbot --nginx -d bot.yourdomain.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Certbot will automatically update your Nginx config with HTTPS and set up auto-renewal.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.5 Update Your Bot to Use Webhooks<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Update <code>bot.py<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#python\nimport logging\nfrom telegram import Update\nfrom telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, ContextTypes\n\nlogging.basicConfig(\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n    level=logging.INFO\n)\n\nBOT_TOKEN = \"YOUR_BOT_TOKEN_HERE\"\nWEBHOOK_URL = \"https:\/\/bot.yourdomain.com\/webhook\"\n\nasync def start(update: Update, context: ContextTypes.DEFAULT_TYPE):\n    await update.message.reply_text(\"Hello! Running on VPS with webhooks.\")\n\nasync def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):\n    await update.message.reply_text(update.message.text)\n\nif __name__ == \"__main__\":\n    app = ApplicationBuilder().token(BOT_TOKEN).build()\n    app.add_handler(CommandHandler(\"start\", start))\n    app.add_handler(MessageHandler(filters.TEXT &amp; ~filters.COMMAND, echo))\n    app.run_webhook(\n        listen=\"0.0.0.0\",\n        port=8443,\n        webhook_url=WEBHOOK_URL\n    )<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Restart the service:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart mybot<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 8: Store Secrets Properly<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hardcoding your bot token in <code>bot.py<\/code> is fine for testing but bad practice for anything you&#8217;ll commit to version control or share. Use environment variables instead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create a <code>.env<\/code> file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano \/home\/botuser\/mybot\/.env<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>BOT_TOKEN=7123456789:AAF...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Install <code>python-dotenv<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install python-dotenv<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Update <code>bot.py<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#python\nimport os\nfrom dotenv import load_dotenv\n\nload_dotenv()\nBOT_TOKEN = os.getenv(\"BOT_TOKEN\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Restrict permissions on the <code>.env<\/code> file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod 600 \/home\/botuser\/mybot\/.env<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 9: Basic Firewall Setup<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lock down your VPS to only allow the traffic you need:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow OpenSSH\nsudo ufw allow 80\nsudo ufw allow 443\nsudo ufw enable<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re using polling (no Nginx), also allow the bot&#8217;s port:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow 8443<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 10: Monitoring and Updates<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check bot status at any time:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl status mybot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>View live logs:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>journalctl -u mybot -f<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Deploy an update:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/mybot\n# edit bot.py or pull from git\nsudo systemctl restart mybot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Set up a Git-based workflow<\/strong> (optional but recommended): push your bot code to a private Git repository and pull updates to the VPS when you deploy. This gives you version history, easy rollbacks, and a clean separation between development and production.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting Common Issues<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Bot doesn&#8217;t respond after deploy<\/strong> Check the logs: <code>journalctl -u mybot -n 50<\/code>. Most issues are import errors or a wrong bot token.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Webhook not receiving updates<\/strong> Verify the SSL certificate is valid, Nginx is running, and the webhook URL matches exactly what Telegram expects. You can check the current webhook status via the Telegram Bot API:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;api.telegram.org\/bot&lt;TOKEN&gt;\/getWebhookInfo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Bot crashes on restart<\/strong> If the bot crashes immediately at start, systemd will retry every 5 seconds. Check logs to find the root cause before it fills your journal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Port already in use<\/strong> If you see <code>Address already in use<\/code>, another process is on port 8443. Find it with <code>sudo lsof -i :8443<\/code> and stop it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Scaling Up<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A basic bot on a 1 vCPU \/ 1Gb VPS will handle thousands of users without breaking a sweat. But if your bot grows \u2014 adding databases, image processing, external API calls, or multiple concurrent workflows \u2014 you&#8217;ll want to think about:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A database<\/strong>: PostgreSQL or SQLite for storing user state, conversation history, or application data<\/li>\n\n\n\n<li><strong>Redis<\/strong>: For job queues, rate limiting, and caching<\/li>\n\n\n\n<li><strong>More RAM<\/strong>: Especially if you&#8217;re running multiple bots or heavy dependencies on the same server<\/li>\n\n\n\n<li><strong>Multiple bots on one VPS<\/strong>: Each gets its own systemd service and Nginx location block \u2014 straightforward to manage<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Hosting.international&#8217;s KVM VPS plans let you scale CPU and RAM without migrating to a new server, so you can start small and grow as your bot&#8217;s user base does.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Step<\/th><th>What you did<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Created a bot token with BotFather<\/td><\/tr><tr><td>2<\/td><td>Connected to VPS via SSH<\/td><\/tr><tr><td>3<\/td><td>Set up Python and a virtual environment<\/td><\/tr><tr><td>4<\/td><td>Wrote and tested the bot locally<\/td><\/tr><tr><td>5<\/td><td>Configured systemd for always-on operation<\/td><\/tr><tr><td>6<\/td><td>Chose between polling and webhooks<\/td><\/tr><tr><td>7<\/td><td>Set up Nginx + SSL for webhook mode<\/td><\/tr><tr><td>8<\/td><td>Stored secrets in environment variables<\/td><\/tr><tr><td>9<\/td><td>Configured UFW firewall<\/td><\/tr><tr><td>10<\/td><td>Established a deployment and monitoring workflow<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A VPS is the cleanest way to run a Telegram bot in production. You get a stable IP, 24\/7 uptime, full control over the environment, and none of the cold-start latency of serverless platforms.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><a href=\"https:\/\/hosting.international\/cart.php?gid=5\">Get a VPS for your Telegram bot \u2192<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Telegram bots are one of the most practical things you can deploy on a VPS. They&#8217;re lightweight, always-on services that need a stable connection, a public IP, and a process that doesn&#8217;t die when you close your terminal. A VPS checks all three boxes \u2014 and once you&#8217;ve done this once, you&#8217;ll wonder why you [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32],"tags":[186],"class_list":["post-713","post","type-post","status-publish","format-standard","hentry","category-knowledge-base","tag-telegram-bot-on-vps"],"_links":{"self":[{"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/posts\/713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/comments?post=713"}],"version-history":[{"count":1,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/posts\/713\/revisions"}],"predecessor-version":[{"id":714,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/posts\/713\/revisions\/714"}],"wp:attachment":[{"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/media?parent=713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/categories?post=713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hosting.international\/blog\/wp-json\/wp\/v2\/tags?post=713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}