CINXE.COM
discuss infrastructure - IndieWeb
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-zebra-design-disabled vector-feature-custom-font-size-clientpref-disabled vector-feature-client-preferences-disabled vector-feature-typography-survey-disabled vector-toc-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>discuss infrastructure - IndieWeb</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-zebra-design-disabled vector-feature-custom-font-size-clientpref-disabled vector-feature-client-preferences-disabled vector-feature-typography-survey-disabled vector-toc-available";var cookie=document.cookie.match(/(?:^|; )wikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""], "wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"84b7d145db52d799524954c0","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"discuss_infrastructure","wgTitle":"discuss infrastructure","wgCurRevisionId":75958,"wgRevisionId":75958,"wgArticleId":12817,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":[],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"discuss_infrastructure","wgRelevantArticleId":12817,"wgIsProbablyEditable":false,"wgRelevantPageIsProbablyEditable":false,"wgRestrictionEdit":[],"wgRestrictionMove":[]};RLSTATE={"skins.vector.user.styles":"ready","site.styles":"ready","user.styles":"ready","skins.vector.user":"ready","user":"ready","user.options":"loading","codex-search-styles":"ready", "skins.vector.styles":"ready","skins.vector.icons":"ready"};RLPAGEMODULES=["site","mediawiki.page.ready","mediawiki.toc","skins.vector.js"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/wiki/load.php?lang=en&modules=codex-search-styles%7Cskins.vector.icons%2Cstyles&only=styles&skin=vector-2022"> <script async="" src="/wiki/load.php?lang=en&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/wiki/load.php?lang=en&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.41.0"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="description" content="discuss infrastructure is documentation of various internal plumbing which runs the IndieWeb discussion chat rooms, chat logs, bots, dealing with spam, and experiments related to that plumbing."> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes, minimum-scale=0.25, maximum-scale=5.0"> <link rel="icon" href="/favicon.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/wiki/opensearch_desc.php" title="IndieWeb (en)"> <link rel="EditURI" type="application/rsd+xml" href="https://indieweb.org/wiki/api.php?action=rsd"> <link rel="license" href="/IndieWebCamp:Copyrights"> <link rel="alternate" type="application/atom+xml" title="IndieWeb Atom feed" href="/wiki/index.php?title=Special:RecentChanges&feed=atom"> <meta property="og:type" content="article"> <meta property="og:site_name" content="IndieWeb"> <meta property="og:title" content="discuss infrastructure"> <meta property="og:description" content="discuss infrastructure is documentation of various internal plumbing which runs the IndieWeb discussion chat rooms, chat logs, bots, dealing with spam, and experiments related to that plumbing."> <meta property="og:url" content="https://indieweb.org/discuss_infrastructure"> <link rel="webmention" href="https://webmention.io/indiewebcamp/webmention"> <script src="https://cdn.usefathom.com/script.js" site="ZPHFRYAA" defer></script> </head> <body class="skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-discuss_infrastructure rootpage-discuss_infrastructure skin-vector-2022 action-view skin--responsive"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site" role="navigation"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-" class="vector-menu mw-portlet mw-portlet- emptyPortlet" > <div class="vector-menu-heading"> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-Explore_the_IndieWeb" class="vector-menu mw-portlet mw-portlet-Explore_the_IndieWeb" > <div class="vector-menu-heading"> Explore the IndieWeb </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-🗽-Principles" class="mw-list-item"><a href="/principles"><span>🗽 Principles</span></a></li><li id="n-📜-Community-posts" class="mw-list-item"><a href="https://stream.indieweb.org/"><span>📜 Community posts</span></a></li><li id="n-🌐-Visit-a-random-site" class="mw-list-item"><a href="https://xn--sr8hvo.ws/random"><span>🌐 Visit a random site</span></a></li><li id="n-🎉-Get-a-personal-site" class="mw-list-item"><a href="/Getting_Started"><span>🎉 Get a personal site</span></a></li><li id="n-ℹ️-FAQ" class="mw-list-item"><a href="/FAQ"><span>ℹ️ FAQ</span></a></li><li id="n-🎁-2024-Gift-Calendar!" class="mw-list-item"><a href="/IndieWeb_Gift_Calendar"><span>🎁 2024 Gift Calendar!</span></a></li> </ul> </div> </div> <div id="p-Join_the_community!" class="vector-menu mw-portlet mw-portlet-Join_the_community" > <div class="vector-menu-heading"> Join the community! </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-🌈-Code-of-conduct" class="mw-list-item"><a href="/code-of-conduct"><span>🌈 Code of conduct</span></a></li><li id="n-📅-Events:-IndieWebCamps,-Homebrew-Website-Clubs-(HWC),-and-more!" class="mw-list-item"><a href="https://events.indieweb.org/"><span>📅 Events: IndieWebCamps, Homebrew Website Clubs (HWC), and more!</span></a></li><li id="n-👥--Meetups:-2025-01-08" class="mw-list-item"><a href="https://events.indieweb.org/tag/hwc"><span>👥 Meetups: 2025-01-08</span></a></li><li id="n-🎪-IWC-San-Diego-12/7…8" class="mw-list-item"><a href="/next-iwc"><span>🎪 IWC San Diego 12/7…8</span></a></li><li id="n-💬-Join-#indieweb-chat" class="mw-list-item"><a href="/discuss"><span>💬 Join #indieweb chat</span></a></li><li id="n-📜-Chat-log" class="mw-list-item"><a href="https://chat.indieweb.org/"><span>📜 Chat log</span></a></li><li id="n-📩-Subscribe-to-newsletter" class="mw-list-item"><a href="/this-week-in-the-indieweb"><span>📩 Subscribe to newsletter</span></a></li><li id="n-❤️-Sponsor" class="mw-list-item"><a href="/how-to-sponsor"><span>❤️ Sponsor</span></a></li> </ul> </div> </div> <div id="p-Developers" class="vector-menu mw-portlet mw-portlet-Developers" > <div class="vector-menu-heading"> Developers </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-🔩-Building-Blocks" class="mw-list-item"><a href="/Category:building-blocks"><span>🔩 Building Blocks</span></a></li><li id="n-📑-Projects" class="mw-list-item"><a href="/Projects"><span>📑 Projects</span></a></li><li id="n-🧰-Standards" class="mw-list-item"><a href="https://spec.indieweb.org/"><span>🧰 Standards</span></a></li><li id="n-💬-Join-developer-chat" class="mw-list-item"><a href="/discuss#dev"><span>💬 Join developer chat</span></a></li> </ul> </div> </div> <div id="p-Wiki_resources" class="vector-menu mw-portlet mw-portlet-Wiki_resources" > <div class="vector-menu-heading"> Wiki resources </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-👤-Login" class="mw-list-item"><a href="https://sso.indieweb.org/login?url=https%3A%2F%2Findieweb.org%2F"><span>👤 Login</span></a></li><li id="n-✳️-Recent-changes" class="mw-list-item"><a href="/Special:RecentChanges"><span>✳️ Recent changes</span></a></li><li id="n-🖼-Recent-uploads" class="mw-list-item"><a href="/Special:ListFiles"><span>🖼 Recent uploads</span></a></li><li id="n-🎲-Random-page" class="mw-list-item"><a href="/Special:Random"><span>🎲 Random page</span></a></li><li id="n-📑-5,550-articles" class="mw-list-item"><a href="/Special:Statistics"><span>📑 5,550 articles</span></a></li><li id="n-©-Wiki-content-is-CC0" class="mw-list-item"><a href="/IndieWebCamp:Copyrights"><span>© Wiki content is CC0</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/Main_Page" class="mw-logo"> <span class="mw-logo-container"> <img class="mw-logo-wordmark" alt="IndieWeb" src="/img/indiewebcamp-logo-lockup-color@1x.png" style="width: 10.125em; height: 4.8125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" id="" title="Search IndieWeb [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/wiki/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search IndieWeb" aria-label="Search IndieWeb" autocapitalize="none" title="Search IndieWeb [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links" aria-label="Personal tools" role="navigation" > <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet mw-portlet-vector-user-menu-overflow" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item"><a href="https://sso.indieweb.org/login?url=https%3A%2F%2Findieweb.org%2Fdiscuss_infrastructure" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span>Log in</span></a></li> </ul> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="More options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="https://sso.indieweb.org/login?url=https%3A%2F%2Findieweb.org%2Fdiscuss_infrastructure" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"></div> </div> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site" role="navigation"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <input type="checkbox" id="vector-toc-collapsed-checkbox" class="vector-menu-checkbox"> <nav id="mw-panel-toc" role="navigation" aria-label="Contents" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark vector-sticky-pinned-container"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contents</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">hide</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">Beginning</div> </a> </li> <li id="toc-Bots_on_IRC" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Bots_on_IRC"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span>Bots on IRC</div> </a> <ul id="toc-Bots_on_IRC-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Logs" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Logs"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span>Logs</div> </a> <button aria-controls="toc-Logs-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon vector-icon--x-small mw-ui-icon-wikimedia-expand"></span> <span>Toggle Logs subsection</span> </button> <ul id="toc-Logs-sublist" class="vector-toc-list"> <li id="toc-IRC_Log_Atom_Feed" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#IRC_Log_Atom_Feed"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.1</span>IRC Log Atom Feed</div> </a> <ul id="toc-IRC_Log_Atom_Feed-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Spam" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Spam"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2</span>Spam</div> </a> <ul id="toc-Spam-sublist" class="vector-toc-list"> <li id="toc-Red_Alert_Mode" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#Red_Alert_Mode"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2.1</span>Red Alert Mode</div> </a> <ul id="toc-Red_Alert_Mode-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Spam_in_Chat_Logs" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#Spam_in_Chat_Logs"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2.2</span>Spam in Chat Logs</div> </a> <ul id="toc-Spam_in_Chat_Logs-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-How-to_remove_spam" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#How-to_remove_spam"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2.3</span>How-to remove spam</div> </a> <ul id="toc-How-to_remove_spam-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> </ul> </li> <li id="toc-See_Also" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#See_Also"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span>See Also</div> </a> <ul id="toc-See_Also-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> <div class="mw-content-container"> <main id="content" class="mw-body h-entry" role="main"> <header class="mw-body-header vector-page-titlebar"> <label id="vector-toc-collapsed-button" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet vector-button-flush-left cdx-button--icon-only" for="vector-toc-collapsed-checkbox" role="button" aria-controls="vector-toc" tabindex="0" title="Table of Contents"> <span class="vector-icon mw-ui-icon-wikimedia-listBullet"></span> <span>Toggle the table of contents</span> </label> <nav role="navigation" aria-label="Contents" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Toggle the table of contents" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">discuss infrastructure</span></h1> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected vector-tab-noicon mw-list-item"><a href="/discuss_infrastructure" title="View the content page [c]" accesskey="c"><span>Page</span></a></li><li id="ca-talk" class="new vector-tab-noicon mw-list-item"><a href="/wiki/index.php?title=Talk:discuss_infrastructure&action=edit&redlink=1" rel="discussion" title="Discussion about the content page (page does not exist) [t]" accesskey="t"><span>Discussion</span></a></li> </ul> </div> </div> <div id="p-variants" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="p-variants-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-variants" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="p-variants-label" for="p-variants-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/discuss_infrastructure"><span>Read</span></a></li><li id="ca-viewsource" class="vector-tab-noicon mw-list-item"><a href="/wiki/index.php?title=discuss_infrastructure&action=edit" title="This page is protected. You can view its source [e]" accesskey="e"><span>View source</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/wiki/index.php?title=discuss_infrastructure&action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/discuss_infrastructure"><span>Read</span></a></li><li id="ca-more-viewsource" class="vector-more-collapsible-item mw-list-item"><a href="/wiki/index.php?title=discuss_infrastructure&action=edit"><span>View source</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/wiki/index.php?title=discuss_infrastructure&action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/Special:WhatLinksHere/discuss_infrastructure" title="A list of all wiki pages that link here [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/Special:RecentChangesLinked/discuss_infrastructure" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-print" class="mw-list-item"><a href="javascript:print();" rel="alternate" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/wiki/index.php?title=discuss_infrastructure&oldid=75958" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/wiki/index.php?title=discuss_infrastructure&action=info" title="More information about this page"><span>Page information</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <nav class="vector-page-tools-landmark vector-sticky-pinned-container" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> </div> <div id="siteSub" class="noprint">From IndieWeb</div> </div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-parser-output"><p><span class="p-summary"><dfn>discuss infrastructure</dfn> is documentation of various internal plumbing which runs the IndieWeb <a href="/discuss" title="discuss">discussion</a> chat rooms, chat logs, bots, dealing with spam, and experiments related to that plumbing.</span> </p><p>For information about the chat and how to connect to it, refer to <a href="/discuss" title="discuss">discuss</a>. </p> <meta property="mw:PageProp/toc" /> <h2><span class="mw-headline" id="Bots_on_IRC">Bots on IRC</span></h2> <p>The IRC channel uses these bots: </p> <ul><li><a class="external text" href="http://aaronparecki.com/Loqi">Loqi</a> - Contact: <a href="/User:Aaronpk" class="mw-redirect" title="User:Aaronpk">aaronpk</a>, <a href="/Loqi" title="Loqi">wiki page</a> <ul><li>logs all edits to this wiki</li> <li>logs the irc channel itself to archives on the web</li> <li>logs Twitter mentions of #indieweb or #indiewebcamp to the channel</li> <li>logs <a href="/webmentions" class="mw-redirect" title="webmentions">webmentions</a> of wiki pages</li></ul></li> <li><a href="/Kaja" class="mw-redirect" title="Kaja">Kaja</a> - Contact: <span class="h-card" style="white-space:nowrap"><a href="/User:Www.svenknebel.de" title="User:Www.svenknebel.de">Sven Knebel</a></span> <ul><li>microformat parsing commands</li> <li>indieweb youtube channel announcements</li></ul></li></ul> <p>want to write your own bots: see <a href="#bot_development">#bot development</a> </p> <h2><span class="mw-headline" id="Logs">Logs</span></h2> <ul><li><a class="external free" href="https://chat.indieweb.org/today">https://chat.indieweb.org/today</a></li></ul> <p>If the logs have stopped logging or have any other problems, notify <span class="h-card" style="white-space:nowrap"><img src="https://aaronparecki.com/images/profile.jpg" class="" style="height:1.1em;vertical-align:-.1em" alt="" /> <a href="/User:Aaronparecki.com" title="User:Aaronparecki.com">Aaron Parecki</a></span> on the IRC channel. </p> <h3><span class="mw-headline" id="IRC_Log_Atom_Feed">IRC Log Atom Feed</span></h3> <p>(Currently unavailable) </p><p>An experimental atom feed was available for the IRC logs. This feed delivers the last full day's log to your feed reader. </p><p>Please report any feed issues to <a class="external free" href="https://github.com/bcomnes/iwc-log-feed/issues">https://github.com/bcomnes/iwc-log-feed/issues</a> </p> <h3><span class="mw-headline" id="Spam">Spam</span></h3> <p>Occasionally, Libera gets hit with a wave of IRC spam. Typically the pattern is an account joins many channels across Libera and sends repeated similar messages to as many channels as it can, often mentioning other peoples' nicknames in order to get their attention. </p> <ul><li>Anyone registered on <a href="/chat-names" title="chat-names">chat-names</a> can kick users by telling Loqi to kick them using <code>!kick spammer</code></li> <li>Any channel op in our channels can also <code>/kick spammer</code> to remove them from the specific channel immediately</li> <li>Other Libera admins often catch the bots and block them from the server</li></ul> <h4><span class="mw-headline" id="Red_Alert_Mode">Red Alert Mode</span></h4> <p>In very large spam waves, such as the one starting on 2018-07-31, we can employ additional tricks to prevent the spam from hitting the channels at all. </p> <ul><li>Set everyone currently in the channel to +v (<code>/voice nickname</code>)</li> <li>Set the channel modes to +zm (<code>/mode #indieweb-dev +zm</code>) <ul><li>+m means only people with +v mode can speak in the channel</li> <li>+z allows channel ops to still see the messages from unvoiced users, so Loqi can still see messages from new people and spammers</li> <li>(If the channel is in MLOCK mode, use <code>/msg chanserv set #indieweb-dev mlock +zm</code>)</li></ul></li> <li>When someone joins a channel, Loqi sets a timer for 30 seconds. If they are still in the channel after 30 seconds, they are automatically given +v</li> <li>When an unvoiced user says something, if it matches a spam keyword phrase, they are immediately kicked. <ul><li>If it does not match a spam phrase, then Loqi says "Welcome, {nickname}. Since you weren't yet recognized as a real person, your message wasn't sent to the channel. I'm repeating it below for you.", repeats their message to the channel, and sets +v</li> <li>If the spam does not consistently match a pattern, this last rule can be dropped</li></ul></li></ul> <p>To stand down from red alert, set the channel modes back to <code>-zm</code>, and disable Loqi's auto-voicing hooks. </p> <ul><li><code>/mode #indieweb-dev -zm</code></li></ul> <h4><span class="mw-headline" id="Spam_in_Chat_Logs">Spam in Chat Logs</span></h4> <p>The IndieWeb chat logs are all stored as files in a GitHub repo, which is where the web interface pulls from. Individual lines in the file can be marked as deleted to avoid them being shown in the web interface. This should only be used to block actual spam, not remove legitimate text from users, even if it is something you don't agree with. </p><p>To help remove spam from the logs, you can send a pull request to the <a class="external text" href="https://github.com/indieweb/indieweb-chat-archive">chat archive</a> repo to mark specific lines as deleted. Find the specific file containing the messages, and then find the specific chat line to mark as deleted. Each line in the file corresponds to a single IRC message, and begins with a timestamp, followed by a JSON string with the log info. To mark as deleted, add <code>"deleted":true</code> as the first property in the JSON text. </p><p>For example, change: </p> <pre>2018-01-01 01:05:10.931300 {"type":"message", ... </pre> <p>to: </p> <pre>2018-01-01 01:05:10.931300 {"deleted":true,"type":"message", ... </pre> <p>Send a pull request containing all your edits together, like <a class="external text" href="https://github.com/indieweb/indieweb-chat-archive/pull/2">this one</a>. Anyone with write access to the repo can merge the change, and <span class="h-card" style="white-space:nowrap"><img src="https://aaronparecki.com/images/profile.jpg" class="" style="height:1.1em;vertical-align:-.1em" alt="" /> <a href="/User:Aaronparecki.com" title="User:Aaronparecki.com">Aaron Parecki</a></span> will then deploy it to the server. This will prevent the spam from being shown in the web logs. </p> <h4><span class="mw-headline" id="How-to_remove_spam">How-to remove spam</span></h4> <p>This is how <span class="h-card" style="white-space:nowrap"><a href="https://vanderven.se/martijn/" class="external u-url" style="padding-right:0;background:none"><img src="https://vanderven.se/martijn/martijn.jpg" class="" style="height:1.1em;vertical-align:-.1em" alt="" /></a> <span class="p-name"><a href="/User:Vanderven.se_martijn" title="User:Vanderven.se martijn">Martijn van der Ven</a></span></span> has been removing spam from the chat.indieweb.org logs: </p> <ol><li>Find the log file with spam in it on <a href="/GitHub" title="GitHub">GitHub</a>. <ol><li>Go to <a class="external text" href="https://github.com/indieweb/indieweb-chat-archive/tree/master/freenode">the GitHub archive</a>.</li> <li>Choose the folder of the matching channel.</li> <li>Follow a folder structure down to the specific day’s log file. Note that days are in UTC.</li></ol></li> <li>Use GitHub’s editor by clicking the pencil icon.<br /><span class="mw-default-size" typeof="mw:File"><a href="/File:fork-and-edit.png" class="mw-file-description"><img src="/images/6/62/fork-and-edit.png" decoding="async" width="297" height="88" class="mw-file-element" /></a></span></li> <li>Copy the entire file to a plain text editor with <a href="/regular_expression" title="regular expression">regular expression</a> find and replace support. (E.g. <a href="/wiki/index.php?title=BBEdit&action=edit&redlink=1" class="new" title="BBEdit (page does not exist)">BBEdit</a>.)</li> <li>Run a find and replace that marks all lines from a specified user as <code>deleted</code>.<br /><span typeof="mw:File"><a href="/File:bbedit-find-and-replace-spam.png" class="mw-file-description"><img src="/images/thumb/c/cc/bbedit-find-and-replace-spam.png/500px-bbedit-find-and-replace-spam.png" decoding="async" width="500" height="153" class="mw-file-element" srcset="/images/thumb/c/cc/bbedit-find-and-replace-spam.png/750px-bbedit-find-and-replace-spam.png 1.5x, /images/c/cc/bbedit-find-and-replace-spam.png 2x" /></a></span> <ul><li>Match the pattern: <code>(^[0-9:. -]+ {)(.+?,"author":{"uid":"spammername")</code>. Replace <code>spammername</code> with the actual name of the spammer.</li> <li>Replace it with: <code>\1"deleted":true,\2</code>.</li></ul></li> <li>Copy it all back into GitHub’s editor, making sure it ends with exactly 1 empty line.</li> <li>Give it a clear title in the “Propose file change” section identifying what spam you have removed.</li> <li>Press the (green) “Propose file change” button.</li> <li>Check the diff to double check you haven’t made any destructive changes.</li> <li>Press the (green) “Create pull request” button.</li> <li>The <a href="/wiki/index.php?title=pull_request&action=edit&redlink=1" class="new" title="pull request (page does not exist)">pull request</a> should be auto-filled with the title from step 6. If the title was clear enough you do not need to write anything more, otherwise comment on why/what you changed in the logs.</li></ol> <p><b>Please also send an email to remove the spam from freenode.logbot.info</b> logs per <a class="external free" href="https://freenode.logbot.info/#how-to-scrub">https://freenode.logbot.info/#how-to-scrub</a>: </p> <blockquote><p><a class="external text" href="mailto:byron@glob.com.au">Send me an email</a> or message me on IRC ("glob" on irc.mozilla.org) if there's data that you feel should be scrubbed (eg. spam, accidental leakage of passwords, etc).</p></blockquote> <h2><span class="mw-headline" id="See_Also">See Also</span></h2> <ul><li><a href="/discuss" title="discuss">discuss</a></li></ul> <!-- NewPP limit report Cached time: 20250102143951 Cache expiry: 86400 Reduced expiry: false Complications: [show‐toc] CPU time usage: 0.021 seconds Real time usage: 0.025 seconds Preprocessor visited node count: 87/1000000 Post‐expand include size: 898/2097152 bytes Template argument size: 83/2097152 bytes Highest expansion depth: 5/100 Expensive parser function count: 0/100 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 359/5000000 bytes --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 8.807 1 -total 44.26% 3.898 2 Template:aaronpk 27.48% 2.420 1 Template:martijnvdven 24.23% 2.134 1 Template:sknebel 22.42% 1.975 2 Template:sparkline --> <!-- Saved in parser cache with key wiki:pcache:idhash:12817-0!canonical and timestamp 20250102143951 and revision id 75958. Rendering was triggered because: page-view --> </div> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://indieweb.org/wiki/index.php?title=discuss_infrastructure&oldid=75958">https://indieweb.org/wiki/index.php?title=discuss_infrastructure&oldid=75958</a>"</div></div> <div id="catlinks" class="catlinks catlinks-allhidden" data-mw="interface"></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" role="contentinfo" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 28 May 2021, at 20:34.</li> <li id="footer-info-copyright">Content is available under <a href="/IndieWebCamp:Copyrights" class="mw-redirect" title="IndieWebCamp:Copyrights">a CC0 public domain dedication</a> unless otherwise noted.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="/IndieWeb:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/IndieWeb:About">About IndieWeb</a></li> <li id="footer-places-disclaimers"><a href="/IndieWeb:General_disclaimer">Code of Conduct</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="http://creativecommons.org/publicdomain/zero/1.0/"><img src="https://i.creativecommons.org/p/zero/1.0/88x31.png" alt="a CC0 public domain dedication" width="88" height="31" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/"><img src="/wiki/resources/assets/poweredby_mediawiki_88x31.png" alt="Powered by MediaWiki" srcset="/wiki/resources/assets/poweredby_mediawiki_132x47.png 1.5x, /wiki/resources/assets/poweredby_mediawiki_176x62.png 2x" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul> <li> <button class="cdx-button cdx-button--icon-only vector-limited-width-toggle" id=""><span class="vector-icon mw-ui-icon-fullScreen mw-ui-icon-wikimedia-fullScreen"></span> <span>Toggle limited content width</span> </button> </li> </ul> </div> <script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgBackendResponseTime":211,"wgPageParseReport":{"limitreport":{"cputime":"0.021","walltime":"0.025","ppvisitednodes":{"value":87,"limit":1000000},"postexpandincludesize":{"value":898,"limit":2097152},"templateargumentsize":{"value":83,"limit":2097152},"expansiondepth":{"value":5,"limit":100},"expensivefunctioncount":{"value":0,"limit":100},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":359,"limit":5000000},"timingprofile":["100.00% 8.807 1 -total"," 44.26% 3.898 2 Template:aaronpk"," 27.48% 2.420 1 Template:martijnvdven"," 24.23% 2.134 1 Template:sknebel"," 22.42% 1.975 2 Template:sparkline"]},"cachereport":{"timestamp":"20250102143951","ttl":86400,"transientcontent":false}}});});</script> </body> </html>