<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.doikayt.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>Doikayt Field Guide - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.doikayt.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php/Special:Contributions/Admin"/>
	<updated>2026-09-11T09:39:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Template:Tool&amp;diff=128</id>
		<title>Template:Tool</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Template:Tool&amp;diff=128"/>
		<updated>2026-08-12T02:35:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: templates/tool.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{#cargo_declare:_table=tool&lt;br /&gt;
|company=String&lt;br /&gt;
|tagline=String&lt;br /&gt;
|protocol=String&lt;br /&gt;
|url=String&lt;br /&gt;
|pricing=String&lt;br /&gt;
|amount=String&lt;br /&gt;
|source_license=String&lt;br /&gt;
|hosting=String&lt;br /&gt;
|description=String&lt;br /&gt;
|usage_notes=String&lt;br /&gt;
|rejected_alternatives=String&lt;br /&gt;
|category=String&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{{#cargo_store:_table=tool&lt;br /&gt;
|company={{{company|}}}&lt;br /&gt;
|tagline={{{tagline|}}}&lt;br /&gt;
|protocol={{{protocol|}}}&lt;br /&gt;
|url={{{url|}}}&lt;br /&gt;
|pricing={{{pricing|}}}&lt;br /&gt;
|amount={{{amount|}}}&lt;br /&gt;
|source_license={{{source_license|}}}&lt;br /&gt;
|hosting={{{hosting|}}}&lt;br /&gt;
|description={{{description|}}}&lt;br /&gt;
|usage_notes={{{usage_notes|}}}&lt;br /&gt;
|rejected_alternatives={{{rejected_alternatives|}}}&lt;br /&gt;
|category={{{category|}}}&lt;br /&gt;
}}&lt;br /&gt;
{{DISPLAYTITLE:{{{company|}}}}}&lt;br /&gt;
&#039;&#039;{{{tagline|}}}&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Overview&lt;br /&gt;
|-&lt;br /&gt;
! Company || {{{company|}}}&lt;br /&gt;
|-&lt;br /&gt;
! URL || [{{{protocol|}}}://{{{url|}}} {{{url|}}}]&lt;br /&gt;
|-&lt;br /&gt;
! Pricing || {{{pricing|}}}{{#if:{{{amount|}}}| — {{{amount|}}}|}}&lt;br /&gt;
|-&lt;br /&gt;
! License || {{{source_license|}}}&lt;br /&gt;
|-&lt;br /&gt;
! Hosting || {{{hosting|}}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{{description|}}}&lt;br /&gt;
&lt;br /&gt;
== Usage Notes ==&lt;br /&gt;
{{{usage_notes|}}}&lt;br /&gt;
&lt;br /&gt;
== Rejected Alternatives ==&lt;br /&gt;
{{{rejected_alternatives|}}}&lt;br /&gt;
&lt;br /&gt;
{{#arraymap:{{{category|}}}|,|x|[[Category:x]]|}}&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=MediaWiki:Doikayt-build-commit&amp;diff=127</id>
		<title>MediaWiki:Doikayt-build-commit</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=MediaWiki:Doikayt-build-commit&amp;diff=127"/>
		<updated>2026-08-12T02:35:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: git rev-parse HEAD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;9351ab9945cd88ab85198c9c08611a5410f9c6c3&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Form:Tool&amp;diff=126</id>
		<title>Form:Tool</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Form:Tool&amp;diff=126"/>
		<updated>2026-08-12T02:35:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: templates/tool-form.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
This is the &amp;quot;Tool&amp;quot; form for adding a recommended tool or service.&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{{info|page name=&amp;lt;Tool[company]&amp;gt; - &amp;lt;Tool[tagline]&amp;gt;}}}&lt;br /&gt;
{{{for template|Tool|display=table}}}&lt;br /&gt;
{{{field|company|label=Company}}}&lt;br /&gt;
{{{field|tagline|label=Tagline|input type=regexp|regexp=/^\S+(\s+\S+){1,9}$/|message=Tagline must be 2–10 words.|tooltip=2–10 word phrase summarising what the tool does (becomes part of the page title).}}}&lt;br /&gt;
{{{field|protocol|label=URL|input type=dropdown|values=https,http|default=https}}}&lt;br /&gt;
{{{field|url|label=|placeholder=google.com|tooltip=Enter domain only, no protocol prefix (e.g. google.com).}}}&lt;br /&gt;
{{{field|pricing|label=Pricing|input type=dropdown|values=free,recurring/mo,recurring/yr,one time,varies|default=free}}}&lt;br /&gt;
{{{field|amount|label=Amount|input type=regexp|regexp=/^$|^\$?\d{1,3}(?:,\d{3})*(?:\.\d{2})?$/|message=Enter a dollar amount (e.g. 7 or $1,234.56)|placeholder=e.g. $1,234.56}}}&lt;br /&gt;
{{{field|source_license|label=Source license|input type=dropdown|values=open,closed|default=open|tooltip=Source code publicly viewable = open, even if licensing is restrictive or aspects are closed (e.g. non-open-weight AI models).}}}&lt;br /&gt;
{{{field|hosting|label=Hosting|input type=dropdown|values=self,cloud,hybrid,N/A|default=self|tooltip=Select hybrid if the hosting model can be a mix of cloud and on-premises.}}}&lt;br /&gt;
{{{field|description|label=Description|input type=textarea|tooltip=1–2 sentence overview of how the product/service meets the needs of the operational area.}}}&lt;br /&gt;
{{{field|usage_notes|label=Usage notes|input type=textarea|tooltip=Key workflows relevant to this operational (sub)area that may not be clear from the documentation.}}}&lt;br /&gt;
{{{field|rejected_alternatives|label=Rejected alternatives|input type=textarea|tooltip=Pros and cons of this product/service versus rejected alternatives.}}}&lt;br /&gt;
{{{field|category|label=Category|input type=tree|top category=Domains|list}}}&lt;br /&gt;
{{{end template}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=MediaWiki:Common.js&amp;diff=125</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=MediaWiki:Common.js&amp;diff=125"/>
		<updated>2026-08-12T02:35:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: system/common-js.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Point the site logo at the Doikayt Mobilization Labs homepage, opening&lt;br /&gt;
   in a new tab so the wiki stays open in the background. Locally, send it&lt;br /&gt;
   to the website preview server (npx serve website/dist -p 3456) instead&lt;br /&gt;
   of production, so clicking it doesn&#039;t navigate away from localhost. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	var isLocal = /^(localhost|127\.0\.0\.1)$/.test( location.hostname );&lt;br /&gt;
	var target  = isLocal ? &#039;http://localhost:3456&#039; : &#039;https://www.doikayt.org&#039;;&lt;br /&gt;
&lt;br /&gt;
	$( &#039;#p-logo a&#039; ).attr( {&lt;br /&gt;
		href: target,&lt;br /&gt;
		target: &#039;_blank&#039;,&lt;br /&gt;
		rel: &#039;noopener&#039;&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
/* Same local/prod split for any content-authored link to doikayt.org (e.g. the&lt;br /&gt;
   About page&#039;s links to the website) -- rewrite so they point at the local&lt;br /&gt;
   preview server instead of jumping out to production. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	var isLocal = /^(localhost|127\.0\.0\.1)$/.test( location.hostname );&lt;br /&gt;
	if ( !isLocal ) { return; }&lt;br /&gt;
&lt;br /&gt;
	$( &#039;#content a[href^=&amp;quot;https://www.doikayt.org/&amp;quot;]&#039; ).each( function () {&lt;br /&gt;
		this.href = this.href.replace( &#039;https://www.doikayt.org&#039;, &#039;http://localhost:3456&#039; );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
/* Replace PageForms OOUI tooltip buttons with a plain &amp;lt;sup&amp;gt;?&amp;lt;/sup&amp;gt; trigger&lt;br /&gt;
   that shows the help text in a lightweight floating div on click. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &#039;pf.formSetupAfter&#039; ).add( function () {&lt;br /&gt;
		$( &#039;th[data-tooltip]&#039; ).each( function () {&lt;br /&gt;
			var $th  = $( this );&lt;br /&gt;
			var safe = $( &#039;&amp;lt;div&amp;gt;&#039; ).text( $th.attr( &#039;data-tooltip&#039; ) ).html();&lt;br /&gt;
&lt;br /&gt;
			var $trigger = $( &#039;&amp;lt;sup class=&amp;quot;pf-tip&amp;quot;&amp;gt;?&amp;lt;/sup&amp;gt;&#039; );&lt;br /&gt;
			var $popup   = $( &#039;&amp;lt;div class=&amp;quot;pf-tip-popup&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; )&lt;br /&gt;
			                   .html( &#039;&amp;lt;p&amp;gt;&#039; + safe + &#039;&amp;lt;/p&amp;gt;&#039; )&lt;br /&gt;
			                   .hide();&lt;br /&gt;
&lt;br /&gt;
			$trigger.on( &#039;click&#039;, function ( e ) {&lt;br /&gt;
				e.stopPropagation();&lt;br /&gt;
				$( &#039;.pf-tip-popup&#039; ).not( $popup ).hide();&lt;br /&gt;
				$popup.toggle();&lt;br /&gt;
			} );&lt;br /&gt;
&lt;br /&gt;
			$th.css( &#039;position&#039;, &#039;relative&#039; ).append( $trigger ).append( $popup );&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		$( document ).on( &#039;click.pf-tip&#039;, function () {&lt;br /&gt;
			$( &#039;.pf-tip-popup&#039; ).hide();&lt;br /&gt;
		} );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
/* Probe the URL field on the Tool form for reachability on blur.&lt;br /&gt;
   Uses no-cors so any server response (any status code) counts as reachable;&lt;br /&gt;
   only genuine network failure (DNS, TLS, timeout) is flagged as unreachable. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	// null = not yet checked, true = reachable, false = unreachable&lt;br /&gt;
	var probeResult = null;&lt;br /&gt;
	var probedUrl   = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
	function getFullUrl() {&lt;br /&gt;
		var $protocol = $( &#039;select[name=&amp;quot;Tool[protocol]&amp;quot;]&#039; );&lt;br /&gt;
		var protocol  = $protocol.length ? $protocol.val().trim() : &#039;https&#039;;&lt;br /&gt;
		var domain    = $( &#039;input[name=&amp;quot;Tool[url]&amp;quot;]&#039; ).val().trim();&lt;br /&gt;
		return domain ? protocol + &#039;://&#039; + domain : &#039;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showStatus( msg, color ) {&lt;br /&gt;
		$( &#039;#pf-url-status&#039; ).text( msg ).css( &#039;color&#039;, color );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function probe( url ) {&lt;br /&gt;
		if ( !url || url === probedUrl ) { return; }&lt;br /&gt;
		probedUrl   = url;&lt;br /&gt;
		probeResult = null;&lt;br /&gt;
		showStatus( &#039;Checking…&#039;, &#039;gray&#039; );&lt;br /&gt;
&lt;br /&gt;
		var timeout = new Promise( function ( _, reject ) {&lt;br /&gt;
			setTimeout( function () { reject( new Error( &#039;timeout&#039; ) ); }, 8000 );&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		Promise.race( [&lt;br /&gt;
			fetch( url, { method: &#039;HEAD&#039;, mode: &#039;no-cors&#039;, cache: &#039;no-cache&#039; } ),&lt;br /&gt;
			timeout&lt;br /&gt;
		] ).then( function () {&lt;br /&gt;
			if ( url !== probedUrl ) { return; }&lt;br /&gt;
			probeResult = true;&lt;br /&gt;
			showStatus( &#039;✓ Reachable&#039;, &#039;green&#039; );&lt;br /&gt;
		} ).catch( function () {&lt;br /&gt;
			if ( url !== probedUrl ) { return; }&lt;br /&gt;
			probeResult = false;&lt;br /&gt;
			showStatus( &#039;✗ Not reachable&#039;, &#039;red&#039; );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$( function () {&lt;br /&gt;
		var $url = $( &#039;input[name=&amp;quot;Tool[url]&amp;quot;]&#039; );&lt;br /&gt;
		if ( !$url.length ) { return; }&lt;br /&gt;
&lt;br /&gt;
		$url.closest( &#039;td&#039; ).append(&lt;br /&gt;
			$( &#039;&amp;lt;span&amp;gt;&#039; ).attr( &#039;id&#039;, &#039;pf-url-status&#039; ).css( { marginLeft: &#039;8px&#039;, fontSize: &#039;0.9em&#039; } )&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		$url.on( &#039;blur&#039;, function () {&lt;br /&gt;
			probe( getFullUrl() );&lt;br /&gt;
		} );&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	// Clear previous error rows before each validation run&lt;br /&gt;
	mw.hook( &#039;pf.formValidation&#039; ).add( function () {&lt;br /&gt;
		$( &#039;.pf-error-row&#039; ).remove();&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &#039;pf.formValidation&#039; ).add( function ( args ) {&lt;br /&gt;
		var $url = $( &#039;input[name=&amp;quot;Tool[url]&amp;quot;]&#039; );&lt;br /&gt;
		if ( !$url.length ) { return; }&lt;br /&gt;
&lt;br /&gt;
		var domain = $url.val().trim();&lt;br /&gt;
		var msg = null;&lt;br /&gt;
&lt;br /&gt;
		if ( !domain ) {&lt;br /&gt;
			msg = &#039;URL is required.&#039;;&lt;br /&gt;
		} else {&lt;br /&gt;
			var url = getFullUrl();&lt;br /&gt;
			if ( probeResult === false ) {&lt;br /&gt;
				msg = &#039;URL is not reachable. Please verify the address.&#039;;&lt;br /&gt;
			} else if ( probeResult === null ) {&lt;br /&gt;
				showStatus( &#039;Checking…&#039;, &#039;gray&#039; );&lt;br /&gt;
				probe( url );&lt;br /&gt;
				msg = &#039;Verifying URL reachability — please try saving again in a moment.&#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( msg ) {&lt;br /&gt;
			args.numErrors++;&lt;br /&gt;
			$( &#039;&amp;lt;tr class=&amp;quot;pf-error-row&amp;quot;&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039; )&lt;br /&gt;
				.find( &#039;td&#039; ).text( msg ).end()&lt;br /&gt;
				.insertAfter( $url.closest( &#039;tr&#039; ) );&lt;br /&gt;
			setTimeout( function () {&lt;br /&gt;
				var $e = $( &#039;.pf-error-row&#039; ).first();&lt;br /&gt;
				if ( $e.length ) { $e[ 0 ].scrollIntoView( { behavior: &#039;smooth&#039;, block: &#039;nearest&#039; } ); }&lt;br /&gt;
			}, 0 );&lt;br /&gt;
		}&lt;br /&gt;
		// probeResult === true: allow through&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
/* Require at least one category before the Tool form can be submitted. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &#039;pf.formValidation&#039; ).add( function ( args ) {&lt;br /&gt;
		var $category = $( &#039;[name=&amp;quot;Tool[category]&amp;quot;]&#039; );&lt;br /&gt;
		if ( !$category.length ) { return; }&lt;br /&gt;
		if ( !( $category.val() || &#039;&#039; ).trim() ) {&lt;br /&gt;
			args.numErrors++;&lt;br /&gt;
			$( &#039;&amp;lt;tr class=&amp;quot;pf-error-row&amp;quot;&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;Please select a category.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039; )&lt;br /&gt;
				.insertAfter( $category.closest( &#039;tr&#039; ) );&lt;br /&gt;
			setTimeout( function () {&lt;br /&gt;
				var $e = $( &#039;.pf-error-row&#039; ).first();&lt;br /&gt;
				if ( $e.length ) { $e[ 0 ].scrollIntoView( { behavior: &#039;smooth&#039;, block: &#039;nearest&#039; } ); }&lt;br /&gt;
			}, 0 );&lt;br /&gt;
		}&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
/* Amount / pricing cross-validation. Two rules:&lt;br /&gt;
   1. pricing=free + non-zero amount → error (amount must be blank for free tools)&lt;br /&gt;
   2. pricing!=free + blank or zero amount → error (amount is required) */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &#039;pf.formValidation&#039; ).add( function ( args ) {&lt;br /&gt;
		var $pricing = $( &#039;[name=&amp;quot;Tool[pricing]&amp;quot;]&#039; );&lt;br /&gt;
		var $amount  = $( &#039;[name=&amp;quot;Tool[amount]&amp;quot;]&#039; );&lt;br /&gt;
		if ( !$pricing.length || !$amount.length ) { return; }&lt;br /&gt;
&lt;br /&gt;
		var pricing = $pricing.val().trim();&lt;br /&gt;
		var amount  = ( $amount.val() || &#039;&#039; ).trim();&lt;br /&gt;
		var numericAmount = parseFloat( amount );&lt;br /&gt;
&lt;br /&gt;
		if ( pricing === &#039;free&#039; &amp;amp;&amp;amp; amount &amp;amp;&amp;amp; numericAmount &amp;gt; 0 ) {&lt;br /&gt;
			args.numErrors++;&lt;br /&gt;
			$( &#039;&amp;lt;tr class=&amp;quot;pf-error-row&amp;quot;&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;Free tools must have a blank amount.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039; )&lt;br /&gt;
				.insertAfter( $amount.closest( &#039;tr&#039; ) );&lt;br /&gt;
			setTimeout( function () {&lt;br /&gt;
				var $e = $( &#039;.pf-error-row&#039; ).first();&lt;br /&gt;
				if ( $e.length ) { $e[ 0 ].scrollIntoView( { behavior: &#039;smooth&#039;, block: &#039;nearest&#039; } ); }&lt;br /&gt;
			}, 0 );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( pricing !== &#039;free&#039; &amp;amp;&amp;amp; ( !amount || numericAmount === 0 ) ) {&lt;br /&gt;
			args.numErrors++;&lt;br /&gt;
			$( &#039;&amp;lt;tr class=&amp;quot;pf-error-row&amp;quot;&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;Amount is required when pricing is not free.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039; )&lt;br /&gt;
				.insertAfter( $amount.closest( &#039;tr&#039; ) );&lt;br /&gt;
			setTimeout( function () {&lt;br /&gt;
				var $e = $( &#039;.pf-error-row&#039; ).first();&lt;br /&gt;
				if ( $e.length ) { $e[ 0 ].scrollIntoView( { behavior: &#039;smooth&#039;, block: &#039;nearest&#039; } ); }&lt;br /&gt;
			}, 0 );&lt;br /&gt;
		}&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
/* Sidebar CategoryTree:&lt;br /&gt;
   - Leaf (page) labels: strip &amp;quot; - tagline&amp;quot; suffix so only the product name&lt;br /&gt;
     shows, and move the full &amp;quot;Name - tagline&amp;quot; text onto the title attribute&lt;br /&gt;
     so it&#039;s still available as a hover tooltip. Category listing pages are&lt;br /&gt;
     unaffected -- only the sidebar tree text is touched.&lt;br /&gt;
   - Category labels: replace the native (redundant, page-name-only) title&lt;br /&gt;
     tooltip with the category&#039;s one-line description, pulled from the first&lt;br /&gt;
     paragraph of the category page&#039;s wikitext via a batched API call.&lt;br /&gt;
   MutationObserver covers nodes loaded via AJAX on expansion. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	var categoryDescCache   = {};&lt;br /&gt;
	var categoryDescPending = {};&lt;br /&gt;
&lt;br /&gt;
	function firstParagraph( wikitext ) {&lt;br /&gt;
		var lines = ( wikitext || &#039;&#039; ).split( &#039;\n&#039; );&lt;br /&gt;
		for ( var i = 0; i &amp;lt; lines.length; i++ ) {&lt;br /&gt;
			// Strip raw HTML first -- pandoc&#039;s markdown-&amp;gt;mediawiki writer emits a&lt;br /&gt;
			// &amp;lt;span id=&amp;quot;...&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; anchor immediately before every heading, which&lt;br /&gt;
			// would otherwise be picked up as the &amp;quot;first line&amp;quot; of body text.&lt;br /&gt;
			var line = lines[ i ].trim().replace( /&amp;lt;[^&amp;gt;]+&amp;gt;/g, &#039;&#039; ).trim();&lt;br /&gt;
			if ( !line || /^=+/.test( line ) ) { continue; }&lt;br /&gt;
			return line.replace( /\[\[(?:[^\]|]+\|)?([^\]]+)\]\]/g, &#039;$1&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		return &#039;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function applyCategoryDescriptions( titleToDesc ) {&lt;br /&gt;
		$( &#039;#mw-panel .CategoryTreeItem a&#039; ).each( function () {&lt;br /&gt;
			var $a  = $( this );&lt;br /&gt;
			var cur = $a.attr( &#039;title&#039; );&lt;br /&gt;
			if ( cur &amp;amp;&amp;amp; titleToDesc[ cur ] ) { $a.attr( &#039;title&#039;, titleToDesc[ cur ] ); }&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function fetchCategoryDescriptions( titles ) {&lt;br /&gt;
		var batches = [];&lt;br /&gt;
		for ( var i = 0; i &amp;lt; titles.length; i += 50 ) { batches.push( titles.slice( i, i + 50 ) ); }&lt;br /&gt;
&lt;br /&gt;
		batches.forEach( function ( batch ) {&lt;br /&gt;
			new mw.Api().get( {&lt;br /&gt;
				action: &#039;query&#039;,&lt;br /&gt;
				titles: batch.join( &#039;|&#039; ),&lt;br /&gt;
				prop: &#039;revisions&#039;,&lt;br /&gt;
				rvprop: &#039;content&#039;,&lt;br /&gt;
				rvslots: &#039;main&#039;,&lt;br /&gt;
				formatversion: 2&lt;br /&gt;
			} ).then( function ( data ) {&lt;br /&gt;
				var titleToDesc = {};&lt;br /&gt;
				( ( data.query &amp;amp;&amp;amp; data.query.pages ) || [] ).forEach( function ( page ) {&lt;br /&gt;
					batch.forEach( function ( t ) { delete categoryDescPending[ t ]; } );&lt;br /&gt;
					if ( !page.revisions ) { return; }&lt;br /&gt;
					var desc = firstParagraph( page.revisions[ 0 ].slots.main.content );&lt;br /&gt;
					if ( !desc ) { return; }&lt;br /&gt;
					categoryDescCache[ page.title ] = desc;&lt;br /&gt;
					titleToDesc[ page.title ] = desc;&lt;br /&gt;
				} );&lt;br /&gt;
				applyCategoryDescriptions( titleToDesc );&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function normalizeTree( root ) {&lt;br /&gt;
		var toFetch = [];&lt;br /&gt;
&lt;br /&gt;
		$( root ).find( &#039;#mw-panel .CategoryTreeItem a&#039; ).each( function () {&lt;br /&gt;
			var $a    = $( this );&lt;br /&gt;
			var href  = $a.attr( &#039;href&#039; ) || &#039;&#039;;&lt;br /&gt;
			var label = $a.attr( &#039;title&#039; ) || &#039;&#039;;&lt;br /&gt;
			var isCategory = /\/Category:/.test( href ) || /^Category:/.test( label );&lt;br /&gt;
&lt;br /&gt;
			if ( isCategory ) {&lt;br /&gt;
				if ( !label ) { return; }&lt;br /&gt;
				if ( categoryDescCache[ label ] ) {&lt;br /&gt;
					$a.attr( &#039;title&#039;, categoryDescCache[ label ] );&lt;br /&gt;
				} else if ( !categoryDescPending[ label ] ) {&lt;br /&gt;
					categoryDescPending[ label ] = true;&lt;br /&gt;
					toFetch.push( label );&lt;br /&gt;
				}&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var t = $a.text(), i = t.indexOf( &#039; - &#039; );&lt;br /&gt;
			if ( i !== -1 ) {&lt;br /&gt;
				$a.attr( &#039;title&#039;, t );&lt;br /&gt;
				$a.text( t.slice( 0, i ) );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		if ( toFetch.length ) { fetchCategoryDescriptions( toFetch ); }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$( function () {&lt;br /&gt;
		var panel = document.getElementById( &#039;mw-panel&#039; );&lt;br /&gt;
		if ( !panel ) { return; }&lt;br /&gt;
		normalizeTree( document );&lt;br /&gt;
		new MutationObserver( function ( mutations ) {&lt;br /&gt;
			mutations.forEach( function ( m ) {&lt;br /&gt;
				m.addedNodes.forEach( function ( n ) {&lt;br /&gt;
					if ( n.nodeType === 1 ) { normalizeTree( n ); }&lt;br /&gt;
				} );&lt;br /&gt;
			} );&lt;br /&gt;
		} ).observe( panel, { childList: true, subtree: true } );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
/* Inject a &amp;quot;built at &amp;lt;commit&amp;gt;&amp;quot; link into the wiki footer. The commit hash is&lt;br /&gt;
   stored in MediaWiki:Doikayt-build-commit and written on every qwiki deploy. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	var GITHUB_REPO = &#039;https://github.com/doikayt/qwiki&#039;;&lt;br /&gt;
&lt;br /&gt;
	new mw.Api().get( {&lt;br /&gt;
		action: &#039;query&#039;,&lt;br /&gt;
		titles: &#039;MediaWiki:Doikayt-build-commit&#039;,&lt;br /&gt;
		prop: &#039;revisions&#039;,&lt;br /&gt;
		rvprop: &#039;content&#039;,&lt;br /&gt;
		rvslots: &#039;main&#039;&lt;br /&gt;
	} ).then( function ( data ) {&lt;br /&gt;
		var pages = data.query.pages;&lt;br /&gt;
		var page  = pages[ Object.keys( pages )[ 0 ] ];&lt;br /&gt;
		if ( !page.revisions ) { return; }&lt;br /&gt;
		var commit = page.revisions[ 0 ].slots.main[ &#039;*&#039; ].trim();&lt;br /&gt;
		if ( !commit ) { return; }&lt;br /&gt;
		var short = commit.slice( 0, 7 );&lt;br /&gt;
		var $link = $( &#039;&amp;lt;a&amp;gt;&#039; ).attr( {&lt;br /&gt;
			href:   GITHUB_REPO + &#039;/commit/&#039; + commit,&lt;br /&gt;
			target: &#039;_blank&#039;,&lt;br /&gt;
			rel:    &#039;noopener&#039;&lt;br /&gt;
		} ).text( &#039;built at &#039; + short );&lt;br /&gt;
		$( &#039;#footer-info&#039; ).append(&lt;br /&gt;
			$( &#039;&amp;lt;li&amp;gt;&#039; ).attr( &#039;id&#039;, &#039;footer-info-buildcommit&#039; ).append( $link )&lt;br /&gt;
		);&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=MediaWiki:Sidebar&amp;diff=124</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=MediaWiki:Sidebar&amp;diff=124"/>
		<updated>2026-08-12T02:35:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: system/sidebar.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Evaluation Criteria|Evaluation criteria used across this wiki&lt;br /&gt;
** Project:New Submission|New Submission&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=MediaWiki:Common.css&amp;diff=123</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=MediaWiki:Common.css&amp;diff=123"/>
		<updated>2026-08-12T02:35:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: system/common-css.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Classic Vector sidebar width */&lt;br /&gt;
#mw-panel {&lt;br /&gt;
  width: 16em !important;&lt;br /&gt;
}&lt;br /&gt;
#content,&lt;br /&gt;
#footer {&lt;br /&gt;
  margin-left: 17em !important;&lt;br /&gt;
}&lt;br /&gt;
#left-navigation,&lt;br /&gt;
#mw-head-base {&lt;br /&gt;
  margin-left: 16em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Field help tooltip: ? superscript trigger + floating popup */&lt;br /&gt;
.pf-tip {&lt;br /&gt;
  font-size: 0.6em;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  color: #37723a;&lt;br /&gt;
  vertical-align: super;&lt;br /&gt;
  margin-left: 3px;&lt;br /&gt;
  user-select: none;&lt;br /&gt;
}&lt;br /&gt;
.pf-tip-popup {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  top: 100%;&lt;br /&gt;
  background: #fff;&lt;br /&gt;
  border: 1px solid #aaa;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  padding: 8px 12px;&lt;br /&gt;
  min-width: 220px;&lt;br /&gt;
  max-width: 320px;&lt;br /&gt;
  z-index: 999;&lt;br /&gt;
  box-shadow: 2px 2px 6px rgba(0,0,0,0.25);&lt;br /&gt;
  font-weight: normal;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  line-height: 1.4;&lt;br /&gt;
}&lt;br /&gt;
.pf-tip-popup p { margin: 0; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the default OOUI tooltip button; replaced by the custom .pf-tip trigger */&lt;br /&gt;
.oo-ui-popupButtonWidget { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
/* Double the default 100px height of the category tree picker */&lt;br /&gt;
.pfTreeInput { height: 200px !important; }&lt;br /&gt;
&lt;br /&gt;
/* Validation error row inserted below failing field */&lt;br /&gt;
.pf-error-row td {&lt;br /&gt;
  background: #fff0f0;&lt;br /&gt;
  color: #c5171a;&lt;br /&gt;
  padding: 4px 8px;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
  border-top: 1px solid #e8a0a0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* CategoryTree sidebar: wrap long titles so they can never spill past the&lt;br /&gt;
   column (was nowrap + h-scroll, which overflowed into content on stale cache). */&lt;br /&gt;
.CategoryTreeItem bdi a {&lt;br /&gt;
  font-size: 12px !important;&lt;br /&gt;
  white-space: normal !important;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
#mw-panel .portal .body {&lt;br /&gt;
  overflow-x: hidden;&lt;br /&gt;
  max-width: 16em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide &amp;quot;no subcategories&amp;quot; clutter in the sidebar tree only (category pages unaffected) */&lt;br /&gt;
#mw-panel i.CategoryTreeNotice {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ── Doikayt watermelon theme: white bg, black text, badge green + red ── */&lt;br /&gt;
/* Colors sampled from the badge: green #37723a, red #c5171a.             */&lt;br /&gt;
/* Green = navigation/actions; red = emphasis/alerts.                     */&lt;br /&gt;
/* Remove this block to revert to default MediaWiki styling.              */&lt;br /&gt;
body { background: #fff; color: #111; }&lt;br /&gt;
&lt;br /&gt;
#content { background: #fff; color: #111; border-color: #37723a; }&lt;br /&gt;
#content h1, #content h2, #content h3, #content h4, #content h5 {&lt;br /&gt;
  color: #111; border-color: #37723a !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a, a:visited { color: #37723a; }&lt;br /&gt;
a:hover { color: #c5171a; }&lt;br /&gt;
&lt;br /&gt;
/* wikitable */&lt;br /&gt;
.wikitable th { background: #37723a; color: #fff; border-color: #2b5a2e; }&lt;br /&gt;
.wikitable td { background: #fff; color: #111; border-color: #ccc; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar */&lt;br /&gt;
#mw-panel { background: #fff; }&lt;br /&gt;
#mw-panel a { color: #37723a; }&lt;br /&gt;
#mw-panel .portal h3 { color: #c5171a; }&lt;br /&gt;
&lt;br /&gt;
/* Logo area */&lt;br /&gt;
#p-logo, #mw-page-base { background: #fff !important; }&lt;br /&gt;
#p-logo a, #p-logo a:hover { background-color: #fff !important; }&lt;br /&gt;
&lt;br /&gt;
/* Header / tab bar */&lt;br /&gt;
#mw-head, #mw-head-base { background: #fff !important; }&lt;br /&gt;
#p-namespaces, #p-namespaces li, #p-views, #p-views li,&lt;br /&gt;
.vector-menu-tabs, .vector-menu-tabs li { background: #fff !important; }&lt;br /&gt;
#p-namespaces li a, #p-views li a,&lt;br /&gt;
.vector-menu-tabs li a { color: #37723a !important; border-color: #ddd !important; }&lt;br /&gt;
li.selected a, .selected a {&lt;br /&gt;
  background: #fff !important;&lt;br /&gt;
  color: #111 !important;&lt;br /&gt;
  box-shadow: inset 0 -3px 0 #c5171a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TOC */&lt;br /&gt;
.toc, #toc { background: #f6f8f6 !important; border-color: #37723a !important; }&lt;br /&gt;
.toctitle h2 { color: #111 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Footer */&lt;br /&gt;
#footer { background: #fff !important; color: #111 !important; border-color: #ddd !important; }&lt;br /&gt;
#footer a, #footer-places a { color: #37723a !important; }&lt;br /&gt;
#footer-info li, #footer-places li { color: #111 !important; }&lt;br /&gt;
#footer-poweredbyico { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
/* Continue / forminput submit button: green = primary action, red on hover */&lt;br /&gt;
.pfCreateOrEditButton .oo-ui-buttonElement-button {&lt;br /&gt;
  background: #37723a !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  border-color: #2b5a2e !important;&lt;br /&gt;
}&lt;br /&gt;
.pfCreateOrEditButton .oo-ui-buttonElement-button:hover {&lt;br /&gt;
  background: #2b5a2e !important;&lt;br /&gt;
  border-color: #c5171a !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Text selection */&lt;br /&gt;
::selection { background: #37723a; color: #fff; }&lt;br /&gt;
&lt;br /&gt;
/* Form inputs */&lt;br /&gt;
input[type=&amp;quot;text&amp;quot;], input[type=&amp;quot;search&amp;quot;], input[type=&amp;quot;url&amp;quot;],&lt;br /&gt;
input[type=&amp;quot;email&amp;quot;], textarea, select {&lt;br /&gt;
  background: #fff !important; color: #111 !important;&lt;br /&gt;
  border: 1px solid #999 !important;&lt;br /&gt;
}&lt;br /&gt;
input[type=&amp;quot;text&amp;quot;]:focus, input[type=&amp;quot;search&amp;quot;]:focus, input[type=&amp;quot;url&amp;quot;]:focus,&lt;br /&gt;
input[type=&amp;quot;email&amp;quot;]:focus, textarea:focus, select:focus {&lt;br /&gt;
  border-color: #37723a !important;&lt;br /&gt;
  outline: 1px solid #37723a !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Search and generic input placeholders */&lt;br /&gt;
#searchInput::placeholder, input[type=&amp;quot;search&amp;quot;]::placeholder,&lt;br /&gt;
input[type=&amp;quot;text&amp;quot;]::placeholder {&lt;br /&gt;
  color: #999 !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Template:EvaluationCriteria&amp;diff=122</id>
		<title>Template:EvaluationCriteria</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Template:EvaluationCriteria&amp;diff=122"/>
		<updated>2026-08-12T02:35:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: templates/evaluation-criteria.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Criterion !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Cost || {{{cost_notes|Ongoing cost to maintain}}}&lt;br /&gt;
|-&lt;br /&gt;
| Risk || {{{risk_notes|Failure modes and their consequences}}}&lt;br /&gt;
|-&lt;br /&gt;
| Accessibility || {{{accessibility_notes|Ease of adoption by non-experts}}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Main_Page&amp;diff=121</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Main_Page&amp;diff=121"/>
		<updated>2026-08-12T02:35:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: main-page.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;digital-mobilization-field-guide&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Digital Mobilization Field Guide =&lt;br /&gt;
&lt;br /&gt;
A technical field guide to digital products, and services that support the operations of organizations aligned with the pro-labor, pro-human rights, pro-free speech and anti-imperialist agenda of [https://www.doikayt.org/ Doikayt Mobilization Labs].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;target-audience&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Target Audience ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;profile&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Profile ===&lt;br /&gt;
&lt;br /&gt;
You are in the right place if you are a &#039;&#039;technologist&#039;&#039; working as IT staff or as a volunteer at a movement-aligned organizations, where you are tasked with:&lt;br /&gt;
&lt;br /&gt;
* identification,&lt;br /&gt;
* evaluation,&lt;br /&gt;
* configuration,&lt;br /&gt;
* customization and&lt;br /&gt;
* ongoing maintenance and support of software and hardware that supports your group’s mission.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proficiency-assumptions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Proficiency Assumptions ===&lt;br /&gt;
&lt;br /&gt;
You should be at least at ‘power user’ level, comfortable with:&lt;br /&gt;
&lt;br /&gt;
* config files&lt;br /&gt;
* command line directives&lt;br /&gt;
* IT operations basics&lt;br /&gt;
** Web, Internet, and cloud concepts&lt;br /&gt;
** basic security&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;unique-challenges&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Unique Challenges ===&lt;br /&gt;
&lt;br /&gt;
You likely need to deal with constraints that technologists in corporate, government and military settings don’t worry much about:&lt;br /&gt;
&lt;br /&gt;
* shoe-string budgets,&lt;br /&gt;
* deplatforming risks, and&lt;br /&gt;
* ethical considerations&lt;br /&gt;
&lt;br /&gt;
See [[New Submissions]] for further discussion of how these criteria factor into our structured protocol for recommending new products and services.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;site-organization&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Site Organization ==&lt;br /&gt;
&lt;br /&gt;
Content is organized as a shallow hierarchy, moving from broad generalized domains of organizational concern to operational areas within a domain (and potentially, an intervening sub-area) – all the way down to the level of individual tools (one per page).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Domain →&#039;&#039;&lt;br /&gt;
** &#039;&#039;Operational Area →&#039;&#039;&lt;br /&gt;
*** &#039;&#039;Operational Sub-area →&#039;&#039;&lt;br /&gt;
**** &#039;&#039;Task →&#039;&#039;&lt;br /&gt;
***** &#039;&#039;Candidate Tool&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
See [[Site Organization]] for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;how-to-contribute&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== How To Contribute ==&lt;br /&gt;
&lt;br /&gt;
* Request an account from admin@doikayt.org&lt;br /&gt;
* [[Project:New Submission|Click here]] to submit a new tool, or click ‘New Submission’ in the sidebar from anywhere on the site&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-software&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== The Software ==&lt;br /&gt;
&lt;br /&gt;
See [https://github.com/doikayt/qwiki this repo] to view the code behind this Wiki, and [https://www.doikayt.org/projects.html#doikayt-wiki here] for more information about new features we plan to roll out soon.&lt;br /&gt;
&lt;br /&gt;
Deployed from commit [https://github.com/doikayt/qwiki/commit/9351ab9945cd88ab85198c9c08611a5410f9c6c3 9351ab9].&lt;br /&gt;
&lt;br /&gt;
[[Category:Meta]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=DoikaytFieldGuide:New_Submission&amp;diff=120</id>
		<title>DoikaytFieldGuide:New Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=DoikaytFieldGuide:New_Submission&amp;diff=120"/>
		<updated>2026-08-12T02:35:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: project/add-new-tool.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== New Submission Wizard ==&lt;br /&gt;
&lt;br /&gt;
Enter the name of the product or service you are suggesting. If a page for this&lt;br /&gt;
entry already exists, you will be sent to the form for editing that page.&lt;br /&gt;
Otherwise, you will be sent to the form that allows you to select the appropriate&lt;br /&gt;
category and other details for your new entry.&lt;br /&gt;
&lt;br /&gt;
{{#forminput:form=Tool|button text=Continue}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Site_Organization&amp;diff=119</id>
		<title>Site Organization</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Site_Organization&amp;diff=119"/>
		<updated>2026-08-12T02:35:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: site-organization.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;site-organization&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Site Organization =&lt;br /&gt;
&lt;br /&gt;
Content is organized as a shallow hierarchy, moving from broad generalized domains of organizational concern to operational areas within a domain (and potentially, an intervening sub-area) – all the way down to the level of individual tools (one per page).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Domain →&#039;&#039;&lt;br /&gt;
** &#039;&#039;Operational Area →&#039;&#039;&lt;br /&gt;
*** &#039;&#039;Operational Sub-area →&#039;&#039;&lt;br /&gt;
**** &#039;&#039;Task →&#039;&#039;&lt;br /&gt;
***** &#039;&#039;Candidate Tool&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;relations-to-wiki-categories&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Relations to Wiki Categories ===&lt;br /&gt;
&lt;br /&gt;
In Wiki-speak each of these levels is simply a [https://en.wikipedia.org/wiki/Wikipedia:Contents/Categories &#039;&#039;page&#039;&#039; &#039;&#039;category&#039;&#039;]. The left-hand navigation panel mirrors this category hierarchy. Top-level entries — such as &#039;&#039;Operations&#039;&#039; or &#039;&#039;Communications&#039;&#039; — link to domain-level Wiki category pages and are maintained by our site administrators.&lt;br /&gt;
&lt;br /&gt;
Below the &#039;&#039;domain&#039;&#039; level (i.e., below the &#039;&#039;top level&#039;&#039;), categories can be added by any site user as needed (but note site admins might roll your proposed category into an existing one or rename it.)&lt;br /&gt;
&lt;br /&gt;
To assign a page to a category, place the following tag near the bottom of the page’s wikitext, replacing &amp;lt;code&amp;gt;CategoryName&amp;lt;/code&amp;gt; with the exact category name (spaces allowed; case-sensitive):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[[Category:CategoryName]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A page can belong to more than one category — add one tag per line. The New Submission form handles this automatically via the &#039;&#039;Category&#039;&#039; tree selector.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;guidelines-for-new-category-additions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Guidelines for New Category Additions ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;short-names&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Short Names ====&lt;br /&gt;
&lt;br /&gt;
Keep the name under three words (ideally two, as the side panel nav tree might start word wrapping or exhibiting other rendering issues.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;check-for-dups&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Check for Dups ====&lt;br /&gt;
&lt;br /&gt;
Verify there is no similar category before you add a new one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;task-level-category-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Task Level Category Rules ====&lt;br /&gt;
&lt;br /&gt;
Each &#039;&#039;Task&#039;&#039; should be a short phrase indicating a concrete action undertaken by technologists in service of either special projects, or ongoing operations.&lt;br /&gt;
&lt;br /&gt;
Tasks can be associated with more than one recommended tool. On any tool page we might have optional discussion of why that tool was selected over rejected alternatives, together with a discussion of those alternatives. But as soon as we start accumulating more than one viable candidate for a task, each one should not only get its own page. But we should create a page ‘Rejected Alternatives’ at the level of the immediate parent Task of the page that is now joined by its new sibling pages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tool-page-naming-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Tool Page Naming Convention ====&lt;br /&gt;
&lt;br /&gt;
Tool page titles are composed of two parts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{Company Name} - {Tagline}&amp;lt;/pre&amp;gt;&lt;br /&gt;
The &#039;&#039;&#039;tagline&#039;&#039;&#039; is a 2–10 word phrase describing what the tool does in the context of this Wiki’s operational area (validated by the New Submission form). Example: &amp;lt;code&amp;gt;Words of Justice - AI co-pilot for Palestine advocacy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A redirect from the bare company name (e.g. &amp;lt;code&amp;gt;WordsOfJustice&amp;lt;/code&amp;gt;) is created automatically so that short-form links and searches still resolve to the full page.&lt;br /&gt;
&lt;br /&gt;
[[Category:Meta]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Zeffy_-_zero-fee_fundraising_and_event_platform&amp;diff=118</id>
		<title>Zeffy - zero-fee fundraising and event platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Zeffy_-_zero-fee_fundraising_and_event_platform&amp;diff=118"/>
		<updated>2026-08-12T02:35:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/zeffy.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Zeffy&lt;br /&gt;
|tagline=zero-fee fundraising and event platform&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=zeffy.com&lt;br /&gt;
|pricing=free&lt;br /&gt;
|amount=$0 platform fee -- Zeffy covers card-processing costs itself, funded by an optional&lt;br /&gt;
donor tip at checkout (roughly two in three donors tip, per Zeffy)&lt;br /&gt;
|source_license=closed&lt;br /&gt;
|hosting=cloud&lt;br /&gt;
|description=Zero-fee fundraising, ticketing, and membership platform for nonprofits. Scale&lt;br /&gt;
(per Zeffy&#039;s own reporting): 100,000+ nonprofits, $2B+ raised to date.&lt;br /&gt;
|usage_notes=Registration: does NOT require a full 501(c)(3) IRS determination letter to&lt;br /&gt;
sign up -- but does require an EIN and a bank account in the org&#039;s own name, plus being&lt;br /&gt;
&amp;quot;registered in some form&amp;quot; (e.g. state nonprofit incorporation, or an IRS determination&lt;br /&gt;
request already filed). A personal bank account can&#039;t be substituted even for a bona fide&lt;br /&gt;
nonprofit-in-formation. Full 501(c)(3) status is only needed later, to unlock automatic&lt;br /&gt;
tax-deductible receipt generation. Also only available in the US, Canada, UK, and Australia.&lt;br /&gt;
Net effect: gated on us filing state nonprofit paperwork and getting an EIN first, not on&lt;br /&gt;
federal tax-exempt approval -- closer to ready than Zeffy&#039;s marketing implies, but not&lt;br /&gt;
usable today.&lt;br /&gt;
|rejected_alternatives=&lt;br /&gt;
|category=Fund Raising&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Zeffy&amp;diff=117</id>
		<title>Zeffy</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Zeffy&amp;diff=117"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/zeffy.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Zeffy - zero-fee fundraising and event platform]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=WireGuard&amp;diff=116</id>
		<title>WireGuard</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=WireGuard&amp;diff=116"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/wireguard-self-hosted.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[WireGuard - run your own self-hosted VPN, no operator to trust]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=WireGuard_-_run_your_own_self-hosted_VPN,_no_operator_to_trust&amp;diff=115</id>
		<title>WireGuard - run your own self-hosted VPN, no operator to trust</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=WireGuard_-_run_your_own_self-hosted_VPN,_no_operator_to_trust&amp;diff=115"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/wireguard-self-hosted.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=WireGuard (Jason A. Donenfeld) / community tooling&lt;br /&gt;
|tagline=run your own VPN, no operator to trust&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=wireguard.com&lt;br /&gt;
|pricing=varies&lt;br /&gt;
|amount=Software is free and open source (GPLv2); your only cost is a VPS -- roughly&lt;br /&gt;
USD 4-6 / month on a provider like [[Digital Ocean]], or a spare box you already run.&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=self&lt;br /&gt;
|description=A modern, lean VPN protocol (~4,000 lines of code vs OpenVPN&#039;s ~70,000, using the&lt;br /&gt;
ChaCha20 cipher) that you run on your own server. Deploy-and-forget tooling makes setup painless:&lt;br /&gt;
Algo VPN (by Trail of Bits) provisions a locked-down WireGuard server on a cloud VPS in minutes;&lt;br /&gt;
WG-Easy adds a web dashboard with QR codes for phones; Headscale / NetBird give you a&lt;br /&gt;
self-hosted mesh if you need many devices to reach each other.&lt;br /&gt;
|usage_notes=Why it&#039;s the top of our preference order: when you run the server, there is no&lt;br /&gt;
third-party operator who can log your traffic, be subpoenaed, be acquired by a Kape-style&lt;br /&gt;
holding company, or deplatform you. The trust question in [[:Category:VPN]] disappears -- you are&lt;br /&gt;
the operator. WireGuard&#039;s small codebase is easy to audit and very fast (~900 Mbps on a cheap&lt;br /&gt;
VPS is typical).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Not for anonymity.&#039;&#039;&#039; A self-hosted VPN hides your traffic from your local network/ISP, but&lt;br /&gt;
it de-anonymizes you *to the wider internet*: the VPS has a single dedicated exit IP that is&lt;br /&gt;
uniquely yours, rented in your name, so every site you visit -- and anyone who can observe that&lt;br /&gt;
IP -- can attribute all of it to one person. There is no crowd to hide in (the opposite of a&lt;br /&gt;
shared-IP provider like [[Mullvad]]), and the hosting company knows who you are and can be&lt;br /&gt;
compelled to log or disclose. Use it for control and hiding from your ISP -- not to be&lt;br /&gt;
anonymous. For that, a shared-IP no-logs provider or Tor.&lt;br /&gt;
&lt;br /&gt;
Other tradeoffs: you own the ops burden (patching, key management, uptime), and a single&lt;br /&gt;
home/VPS exit gives you one location, not a menu of countries. Requires a technically capable&lt;br /&gt;
person -- see [[:Category:Self Hosting]].&lt;br /&gt;
&lt;br /&gt;
Best fit: teams with technical capacity who want maximum infrastructure control and&lt;br /&gt;
deplatform-resistance. For anonymity in a crowd or many exit locations, pair with (or choose)&lt;br /&gt;
[[Mullvad]].&lt;br /&gt;
|rejected_alternatives=Commercial Israeli-owned VPNs (Kape&#039;s ExpressVPN / CyberGhost / PIA /&lt;br /&gt;
ZenMate, Hola, Hotspot Shield) reintroduce exactly the operator you&#039;re trying to remove -- see&lt;br /&gt;
[[:Category:VPN]].&lt;br /&gt;
|category=VPN&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=The_Onion_Router&amp;diff=114</id>
		<title>The Onion Router</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=The_Onion_Router&amp;diff=114"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/tor.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Tor - volunteer-run anonymity network (onion routing)]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=WireGuard_(self-hosted)&amp;diff=113</id>
		<title>WireGuard (self-hosted)</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=WireGuard_(self-hosted)&amp;diff=113"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/wireguard-self-hosted.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[WireGuard - run your own self-hosted VPN, no operator to trust]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Algo_VPN&amp;diff=112</id>
		<title>Algo VPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Algo_VPN&amp;diff=112"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/wireguard-self-hosted.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[WireGuard - run your own self-hosted VPN, no operator to trust]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Tor&amp;diff=111</id>
		<title>Tor</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Tor&amp;diff=111"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/tor.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Tor - volunteer-run anonymity network (onion routing)]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Slack&amp;diff=110</id>
		<title>Slack</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Slack&amp;diff=110"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/slack.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Slack - team messaging with channels and threads, not recommended]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Tor_-_volunteer-run_anonymity_network_(onion_routing)&amp;diff=109</id>
		<title>Tor - volunteer-run anonymity network (onion routing)</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Tor_-_volunteer-run_anonymity_network_(onion_routing)&amp;diff=109"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/tor.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=The Tor Project (US 501(c)(3) nonprofit)&lt;br /&gt;
|tagline=volunteer-run anonymity network (onion routing)&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=torproject.org&lt;br /&gt;
|pricing=free&lt;br /&gt;
|amount=Free and open source. Run by the non-profit Tor Project, funded by grants (historically&lt;br /&gt;
including US-government sources such as the State Department and NRL) plus individual donations.&lt;br /&gt;
Funding is not control here: the code is public, reproducible, and independently audited.&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=hybrid&lt;br /&gt;
|description=An anonymity network, not a VPN. Your traffic is wrapped in layers of encryption and&lt;br /&gt;
bounced through three volunteer-run relays (entry/guard, middle, exit), so no single relay knows&lt;br /&gt;
both who you are and where you&#039;re going. Tor Browser is the hardened reference client; bridges&lt;br /&gt;
and pluggable transports help in censored networks.&lt;br /&gt;
|usage_notes=How it differs from a VPN: there is no single operator to trust or subpoena -- trust&lt;br /&gt;
is spread across independent relays, and anonymity (not just tunnelling) is the whole product.&lt;br /&gt;
That makes it the strongest widely available option for anonymity and for censorship&lt;br /&gt;
circumvention.&lt;br /&gt;
&lt;br /&gt;
The honest threat model -- read this before relying on it: Tor is a *low-latency* network, and by&lt;br /&gt;
its own published design it does NOT defend against a &amp;quot;global passive adversary&amp;quot; who can watch&lt;br /&gt;
traffic entering AND leaving the network. Someone who observes both ends can correlate timing and&lt;br /&gt;
volume to link sender to destination. This is a documented, structural limit of fast anonymity&lt;br /&gt;
systems -- not a hidden backdoor.&lt;br /&gt;
&lt;br /&gt;
What this means in practice: Tor is not known to be cryptographically broken, and the real-world&lt;br /&gt;
deanonymizations on record did not come from breaking the network. They came from:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Browser or device exploits&#039;&#039;&#039; -- e.g. the FBI&#039;s malware in the 2015 Playpen cases attacked&lt;br /&gt;
Tor Browser bugs, not the Tor protocol.&lt;br /&gt;
* &#039;&#039;&#039;Relay-level traffic correlation&#039;&#039;&#039; -- an adversary running or watching many relays (the&lt;br /&gt;
2014 CMU/SEI incident).&lt;br /&gt;
* &#039;&#039;&#039;Operator opsec mistakes&#039;&#039;&#039; -- logging into a real account, reusing a handle, leaking&lt;br /&gt;
metadata.&lt;br /&gt;
&lt;br /&gt;
So the practical defenses are keeping Tor Browser updated, not de-anonymizing yourself by what&lt;br /&gt;
you log into, and -- against a determined state adversary -- assuming nothing is bulletproof (see&lt;br /&gt;
the adversary table in [[:Category:Privacy &amp;amp; Anonymity]]).&lt;br /&gt;
&lt;br /&gt;
Best fit: maximum anonymity when you accept the speed cost, and getting online under censorship.&lt;br /&gt;
For everyday &amp;quot;hide from my ISP with usable speed,&amp;quot; a shared-IP no-logs provider like [[Mullvad]]&lt;br /&gt;
is the better default; the two are complementary, not ranked.&lt;br /&gt;
|rejected_alternatives=A VPN is not a substitute: a self-hosted tunnel ([[WireGuard]]) gives you&lt;br /&gt;
control but a single dedicated exit IP tied to you (no anonymity), and a commercial VPN&lt;br /&gt;
concentrates trust in one operator. Tor removes that single point of trust at the cost of speed.&lt;br /&gt;
For anonymity, do not rely on &amp;quot;free VPN&amp;quot; services -- their business model is usually your data.&lt;br /&gt;
|category=Privacy &amp;amp; Anonymity&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Slack_-_team_messaging_with_channels_and_threads,_not_recommended&amp;diff=108</id>
		<title>Slack - team messaging with channels and threads, not recommended</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Slack_-_team_messaging_with_channels_and_threads,_not_recommended&amp;diff=108"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/slack.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Salesforce&lt;br /&gt;
|tagline=team messaging with channels and threads, not recommended&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=slack.com&lt;br /&gt;
|pricing=recurring/mo&lt;br /&gt;
|amount=$8.75/user/month (free tier available)&lt;br /&gt;
|source_license=closed&lt;br /&gt;
|hosting=cloud&lt;br /&gt;
|description=&#039;&#039;&#039;Not recommended.&#039;&#039;&#039; Cloud-based team messaging platform with channels,&lt;br /&gt;
threads, and integrations. Free tier limits message history to 90 days and caps&lt;br /&gt;
integrations at 10. Included here for comparison against [[Mattermost]] and&lt;br /&gt;
[[Rocket.Chat]], the two self-hosted alternatives we do recommend.&lt;br /&gt;
|usage_notes=&#039;&#039;&#039;Government enforcement ties&#039;&#039;&#039;: Slack&#039;s parent company, Salesforce, has&lt;br /&gt;
held a contract with US Customs and Border Protection (CBP) since March 2018, used to&lt;br /&gt;
help &amp;quot;manage border activities&amp;quot; during the &amp;quot;zero tolerance&amp;quot; family-separation policy.&lt;br /&gt;
Over 650 Salesforce employees signed a letter demanding the company end the contract;&lt;br /&gt;
CEO Marc Benioff refused, and Salesforce has maintained the relationship for years&lt;br /&gt;
despite sustained pressure (see&lt;br /&gt;
[https://techcrunch.com/2018/09/25/protestors-call-on-salesforce-to-end-contract-with-border-patrol-agency/ TechCrunch]).&lt;br /&gt;
&lt;br /&gt;
Guest access available on paid plans for external collaborators. Slack Connect allows&lt;br /&gt;
cross-organization channels with other Slack workspaces.&lt;br /&gt;
|rejected_alternatives=&lt;br /&gt;
|category=Team Collaboration&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Tor_Browser&amp;diff=107</id>
		<title>Tor Browser</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Tor_Browser&amp;diff=107"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/tor.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Tor - volunteer-run anonymity network (onion routing)]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Signal_-_end-to-end_encrypted_messaging_from_a_nonprofit&amp;diff=106</id>
		<title>Signal - end-to-end encrypted messaging from a nonprofit</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Signal_-_end-to-end_encrypted_messaging_from_a_nonprofit&amp;diff=106"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/signal.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Signal Foundation&lt;br /&gt;
|tagline=end-to-end encrypted messaging from a nonprofit&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=signal.org&lt;br /&gt;
|pricing=free&lt;br /&gt;
|amount=Free, no ads, no paid tiers. Run by the Signal Foundation, a US 501(c)(3) nonprofit&lt;br /&gt;
funded by grants and donations; by charter it cannot be acquired.&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=cloud&lt;br /&gt;
|description=End-to-end encrypted 1:1 and group messaging, plus voice/video calls, built on&lt;br /&gt;
the audited Signal Protocol (Double Ratchet + X3DH). ~40M monthly users. Registration&lt;br /&gt;
requires a phone number; usernames (added 2024) let you start chats without sharing it.&lt;br /&gt;
|usage_notes=Why it&#039;s strong for us: the most-scrutinized E2E encryption in production, from a&lt;br /&gt;
mission-aligned privacy nonprofit that collects minimal metadata (sealed sender). Its&lt;br /&gt;
published responses to legal demands show it can only produce registration and last-connection&lt;br /&gt;
dates -- not messages, contacts, groups, or call logs. Free.&lt;br /&gt;
&lt;br /&gt;
Deplatform caveat: Signal is deliberately centralized and does NOT federate or support&lt;br /&gt;
self-hosting -- the Foundation runs every server, so an outage, protocol change, or government&lt;br /&gt;
compulsion hits all users at once and you have no fallback infrastructure. Practical risk is&lt;br /&gt;
low (privacy nonprofit, strong track record), but it does not clear our self-host bar. The&lt;br /&gt;
self-hostable counterpart is [[Element]].&lt;br /&gt;
&lt;br /&gt;
Phone number: registration still needs one; usernames hide it from other users, but a subpoena&lt;br /&gt;
can still map a username to the number. For high-anonymity threat models see [[SimpleX Chat]]&lt;br /&gt;
(no identifier) or [[Briar]] (offline/mesh, censorship-resistant).&lt;br /&gt;
|rejected_alternatives=WhatsApp (uses the Signal protocol but is Meta-owned and harvests&lt;br /&gt;
metadata) and Telegram (chats are not end-to-end encrypted by default, weaker crypto).&lt;br /&gt;
|category=Secure Messaging&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Rocket.Chat&amp;diff=105</id>
		<title>Rocket.Chat</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Rocket.Chat&amp;diff=105"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/rocket-chat.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Rocket.Chat - open-source Slack alternative with omnichannel support]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Rocket.Chat_-_open-source_Slack_alternative_with_omnichannel_support&amp;diff=104</id>
		<title>Rocket.Chat - open-source Slack alternative with omnichannel support</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Rocket.Chat_-_open-source_Slack_alternative_with_omnichannel_support&amp;diff=104"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/rocket-chat.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Rocket.Chat&lt;br /&gt;
|tagline=open-source Slack alternative with omnichannel support&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=rocket.chat&lt;br /&gt;
|pricing=free&lt;br /&gt;
|amount=Commercial/Government/Defense tiers are custom-priced (free self-hosted Community&lt;br /&gt;
edition available)&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=hybrid&lt;br /&gt;
|description=MIT-licensed, self-hostable team chat with channels, voice/video, and broad&lt;br /&gt;
integration support. Its omnichannel inbox unifies live chat, email, WhatsApp, and&lt;br /&gt;
Telegram into one agent queue -- useful if you also want to replace a separate&lt;br /&gt;
customer-support tool, not just internal chat.&lt;br /&gt;
|usage_notes=Has the most GitHub momentum of the self-hosted Slack alternatives&lt;br /&gt;
(~45k stars). The free Community edition covers most day-to-day needs; exceeding&lt;br /&gt;
Starter-plan limits blocks adding new users but does not lock you out of existing&lt;br /&gt;
data.&lt;br /&gt;
|rejected_alternatives=&lt;br /&gt;
|category=Team Collaboration&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=RocketChat&amp;diff=103</id>
		<title>RocketChat</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=RocketChat&amp;diff=103"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/rocket-chat.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Rocket.Chat - open-source Slack alternative with omnichannel support]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Signal&amp;diff=102</id>
		<title>Signal</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Signal&amp;diff=102"/>
		<updated>2026-08-12T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/signal.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Signal - end-to-end encrypted messaging from a nonprofit]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Qwiki_-_locally_edit_wiki_files_in_markdown_then_deploy&amp;diff=101</id>
		<title>Qwiki - locally edit wiki files in markdown then deploy</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Qwiki_-_locally_edit_wiki_files_in_markdown_then_deploy&amp;diff=101"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/qwiki.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Doikayt Mobilization Labs&lt;br /&gt;
|tagline=locally edit wiki files in markdown then deploy&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=github.com/doikayt/qwiki&lt;br /&gt;
|pricing=free&lt;br /&gt;
|amount=&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=self&lt;br /&gt;
|description=Doikayt&#039;s own self-hosted MediaWiki stack: Docker Compose&lt;br /&gt;
infrastructure plus a markdown-to-wikitext content pipeline for authoring&lt;br /&gt;
and deploying wiki pages (this wiki is built with it).&lt;br /&gt;
|usage_notes=See the repo README for local setup and deployment&lt;br /&gt;
instructions.&lt;br /&gt;
|rejected_alternatives=&lt;br /&gt;
|category=Run A Wiki&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Proton_VPN&amp;diff=100</id>
		<title>Proton VPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Proton_VPN&amp;diff=100"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/proton-vpn.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Proton VPN - open-source VPN from a Swiss non-profit, with a free tier]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Proton_VPN_-_open-source_VPN_from_a_Swiss_non-profit,_with_a_free_tier&amp;diff=99</id>
		<title>Proton VPN - open-source VPN from a Swiss non-profit, with a free tier</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Proton_VPN_-_open-source_VPN_from_a_Swiss_non-profit,_with_a_free_tier&amp;diff=99"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/proton-vpn.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Proton AG&lt;br /&gt;
|tagline=open-source VPN from a Swiss non-profit, with a free tier&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=protonvpn.com&lt;br /&gt;
|pricing=varies&lt;br /&gt;
|amount=Genuinely free tier (unlimited data, no ads, one device, 5 countries). Paid plans add&lt;br /&gt;
more countries, up to 10 devices, and streaming/P2P; often bundled with Proton Mail/Drive/Pass.&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=cloud&lt;br /&gt;
|description=WireGuard/OpenVPN provider from Geneva, operated by Proton AG and majority-owned by&lt;br /&gt;
the non-profit Proton Foundation. Founded by scientists who met at CERN; same organisation as&lt;br /&gt;
Proton Mail. Every client app (Windows, macOS, Linux, Android, iOS) is open source.&lt;br /&gt;
|usage_notes=Why it&#039;s our usability fallback: Switzerland sits outside the EU and the 5/9/14&lt;br /&gt;
Eyes blocs with strong data-protection law, and the non-profit foundation structure means the&lt;br /&gt;
company answers to a mission rather than an acquirer. No-logs infrastructure has been audited&lt;br /&gt;
annually by Securitum since 2022, plus a 2025 SOC 2 Type II audit. The free tier is a rare&lt;br /&gt;
honest one -- unlimited data, no ads -- which makes it a safe thing to recommend to&lt;br /&gt;
non-technical members. Bundling with Proton Mail keeps the whole stack under one Swiss&lt;br /&gt;
non-profit.&lt;br /&gt;
&lt;br /&gt;
Tradeoffs: the free tier is limited to one device and five countries; the full app suite is&lt;br /&gt;
heavier than Mullvad&#039;s; and it&#039;s a larger, more mainstream service than the anonymity-first&lt;br /&gt;
options. Account creation typically uses an email address (less anonymous than Mullvad/IVPN&lt;br /&gt;
account numbers).&lt;br /&gt;
&lt;br /&gt;
Best fit: the &amp;quot;just works for everyone&amp;quot; recommendation, and anyone already in the Proton&lt;br /&gt;
ecosystem. For maximum anonymity prefer [[Mullvad]] or [[IVPN]]; to eliminate the operator&lt;br /&gt;
entirely, [[WireGuard]] on your own server.&lt;br /&gt;
|rejected_alternatives=Kape&#039;s ExpressVPN / CyberGhost / PIA / ZenMate, Hola VPN, and Hotspot&lt;br /&gt;
Shield / Betternet are rejected on ownership grounds -- see [[:Category:VPN]].&lt;br /&gt;
|category=VPN&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=ProtonVPN&amp;diff=98</id>
		<title>ProtonVPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=ProtonVPN&amp;diff=98"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/proton-vpn.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Proton VPN - open-source VPN from a Swiss non-profit, with a free tier]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Qwiki&amp;diff=97</id>
		<title>Qwiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Qwiki&amp;diff=97"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/qwiki.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Qwiki - locally edit wiki files in markdown then deploy]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Proton_Meet_-_end-to-end_encrypted_video_conferencing_from_a_Swiss_non-profit&amp;diff=96</id>
		<title>Proton Meet - end-to-end encrypted video conferencing from a Swiss non-profit</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Proton_Meet_-_end-to-end_encrypted_video_conferencing_from_a_Swiss_non-profit&amp;diff=96"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/proton-meet.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Proton AG&lt;br /&gt;
|tagline=end-to-end encrypted video conferencing (Swiss, open-source client)&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=proton.me/meet&lt;br /&gt;
|pricing=varies&lt;br /&gt;
|amount=Free tier hosts up to 50 participants for 1 hour per call; guests join by link with no&lt;br /&gt;
account. Paid Meet Professional raises this to 100 participants and 24-hour calls with recording;&lt;br /&gt;
higher Workspace tiers reach 250. Often bundled with the rest of the Proton suite.&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=cloud&lt;br /&gt;
|description=End-to-end encrypted group video/audio conferencing from Proton AG (Geneva,&lt;br /&gt;
majority-owned by the non-profit Proton Foundation -- same organisation as [[Proton VPN]] and&lt;br /&gt;
Proton Mail). Publicly launched in 2026. Built on WebRTC/LiveKit with the open, independently&lt;br /&gt;
audited MLS (Messaging Layer Security) protocol for E2EE; media and chat are encrypted on the&lt;br /&gt;
client, participant names are encrypted, and email/IP addresses are not shared between attendees.&lt;br /&gt;
|usage_notes=Why it&#039;s strong for us: genuine end-to-end encryption on an open, peer-reviewed&lt;br /&gt;
standard (MLS), under Swiss jurisdiction (outside the US CLOUD Act) and a non-profit that answers&lt;br /&gt;
to a mission rather than an acquirer. Proton says it keeps no record of who attended, and the web&lt;br /&gt;
client is open source so researchers can audit what runs in your browser. The free tier is&lt;br /&gt;
genuinely usable (50 people, 1 hour), attendees need no account, and you can even start an&lt;br /&gt;
instant call for yourself plus up to 3 others with no account at all.&lt;br /&gt;
&lt;br /&gt;
Free-tier limits explained (the common confusion): the &amp;quot;50 participants&amp;quot; cap and &amp;quot;1 hour&amp;quot; limit&lt;br /&gt;
are per-meeting; hosting requires a free Proton account (guests don&#039;t). This is unrelated to&lt;br /&gt;
[[Proton VPN]]&#039;s free-tier &amp;quot;one device&amp;quot; limit, which counts simultaneous VPN connections, not&lt;br /&gt;
meeting attendees -- two different products.&lt;br /&gt;
&lt;br /&gt;
Honest limitation: only the client is open source. The server-side infrastructure is not fully&lt;br /&gt;
open, so while call content is E2EE and unreadable to Proton, you cannot independently verify how&lt;br /&gt;
signaling and metadata (timing, who connects) are handled on their servers. Strong for&lt;br /&gt;
confidentiality of content; not an anonymity tool.&lt;br /&gt;
|rejected_alternatives=Zoom and Google Meet are closed-source and not end-to-end encrypted by&lt;br /&gt;
default, with the provider able to access call data. For a fully self-hosted option, Jitsi Meet&lt;br /&gt;
on your own server keeps infrastructure in your hands (see [[:Category:Self Hosting]]).&lt;br /&gt;
|category=Video Conferencing&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Patreon_-_recurring_membership_funding_for_creators&amp;diff=95</id>
		<title>Patreon - recurring membership funding for creators</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Patreon_-_recurring_membership_funding_for_creators&amp;diff=95"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/patreon.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Patreon&lt;br /&gt;
|tagline=recurring membership funding for creators&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=patreon.com&lt;br /&gt;
|pricing=varies&lt;br /&gt;
|amount=Platform fee 8-12% of earnings by tier (Lite/Pro/Premium), plus roughly 2.9-5%&lt;br /&gt;
payment processing; fee structure was revised in a September 2024 policy overhaul&lt;br /&gt;
|source_license=closed&lt;br /&gt;
|hosting=cloud&lt;br /&gt;
|description=Subscription-based membership platform for ongoing monthly support -- better&lt;br /&gt;
suited to sustained operational funding than one-off campaigns. No nonprofit registration or&lt;br /&gt;
business entity is required to sign up; the org registers and operates like an individual&lt;br /&gt;
creator account.&lt;br /&gt;
|usage_notes=Registration: no nonprofit status or business registration required to sign up.&lt;br /&gt;
&lt;br /&gt;
Deplatforming risk (medium): a 2018-2019 wave of bans targeted right-leaning commentators,&lt;br /&gt;
and a September 2024 policy overhaul (fee increase plus new restrictions on political&lt;br /&gt;
commentary and some educational content) triggered a broader creator exodus over opaque,&lt;br /&gt;
inconsistently-enforced content rules and a slow appeals process. No Palestine-specific&lt;br /&gt;
incidents surfaced in this research pass, but the structural pattern -- broad, vaguely-worded&lt;br /&gt;
bans with weak appeal rights -- carries similar risk to GoFundMe&#039;s for a politically-aligned&lt;br /&gt;
org and is worth monitoring.&lt;br /&gt;
|rejected_alternatives=&lt;br /&gt;
|category=Fund Raising&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Proton_Meet&amp;diff=94</id>
		<title>Proton Meet</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Proton_Meet&amp;diff=94"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/proton-meet.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Proton Meet - end-to-end encrypted video conferencing from a Swiss non-profit]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Open_Collective&amp;diff=93</id>
		<title>Open Collective</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Open_Collective&amp;diff=93"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/open-collective.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Open Collective - transparent fiscal hosting for unincorporated groups]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Patreon&amp;diff=92</id>
		<title>Patreon</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Patreon&amp;diff=92"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/patreon.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Patreon - recurring membership funding for creators]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Mullvad_-_anonymous,_open-source,_audited_no-logs_VPN_(Sweden)&amp;diff=91</id>
		<title>Mullvad - anonymous, open-source, audited no-logs VPN (Sweden)</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Mullvad_-_anonymous,_open-source,_audited_no-logs_VPN_(Sweden)&amp;diff=91"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/mullvad.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Mullvad VPN AB&lt;br /&gt;
|tagline=anonymous, open-source, audited no-logs VPN (Sweden)&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=mullvad.net&lt;br /&gt;
|pricing=recurring/mo&lt;br /&gt;
|amount=Flat EUR 5 / month, no tiers and no discounts for longer commitments. Pay with a card,&lt;br /&gt;
PayPal, bank transfer, cash mailed in an envelope, or cryptocurrency (incl. Monero).&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=cloud&lt;br /&gt;
|description=Privacy-first WireGuard/OpenVPN provider run from Sweden. No email or personal&lt;br /&gt;
details at signup -- you get a random account number instead of a username/password. Owned by&lt;br /&gt;
Mullvad VPN AB (also behind the Mullvad Browser, built with the Tor Project).&lt;br /&gt;
|usage_notes=Why it&#039;s our top hosted pick: fully open-source apps with reproducible builds&lt;br /&gt;
(Android 2025.2+), so you can verify the binary matches the published source. Repeated&lt;br /&gt;
independent audits (Cure53 in 2018/2020/2022/2024, Assured AB in 2025-2026) found no&lt;br /&gt;
significant issues. Most importantly, the no-logs claim was tested for real: when Swedish&lt;br /&gt;
police executed a search warrant in 2023, there was nothing on the servers to seize. Anonymous&lt;br /&gt;
account numbers plus cash-by-mail payment mean you never have to identify yourself.&lt;br /&gt;
&lt;br /&gt;
Tradeoffs: no free tier; a smaller server network and weaker streaming-unblocking than the big&lt;br /&gt;
marketing-driven brands; Sweden is outside Five Eyes but inside the 14 Eyes bloc -- largely&lt;br /&gt;
moot here because there is no data to share. Audits are a snapshot in time, not a permanent&lt;br /&gt;
guarantee.&lt;br /&gt;
&lt;br /&gt;
Best fit: anyone who wants strong, verifiable privacy without running their own server. If you&lt;br /&gt;
can run infrastructure, prefer [[WireGuard]].&lt;br /&gt;
|rejected_alternatives=ExpressVPN, CyberGhost, PIA, and ZenMate are all owned by the&lt;br /&gt;
British-Israeli Kape Technologies (now a delisted black box); Hola VPN is Israeli and resold&lt;br /&gt;
user bandwidth. See [[:Category:VPN]] for the full ownership picture.&lt;br /&gt;
|category=VPN&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Nextcloud_Calendar_-_shared_scheduling_via_self-hosted_Nextcloud&amp;diff=90</id>
		<title>Nextcloud Calendar - shared scheduling via self-hosted Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Nextcloud_Calendar_-_shared_scheduling_via_self-hosted_Nextcloud&amp;diff=90"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/nextcloud-calendar.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Nextcloud&lt;br /&gt;
|tagline=shared scheduling via self-hosted Nextcloud&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=nextcloud.com/calendar&lt;br /&gt;
|pricing=free&lt;br /&gt;
|amount=Free -- zero extra cost if you already run Nextcloud (e.g. for Office Suite).&lt;br /&gt;
If not, standing up Nextcloud itself is also a free self-hosted install (see that&lt;br /&gt;
entry for full pricing/hosting details).&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=self&lt;br /&gt;
|description=CalDAV-based shared calendaring app bundled with Nextcloud: team calendars,&lt;br /&gt;
event invites, resource booking. If your org already runs [[Nextcloud]] (e.g. for&lt;br /&gt;
Office Suite), enabling this is zero extra infrastructure -- just turning on the&lt;br /&gt;
calendar app on the same instance. If not, it means deploying Nextcloud itself first,&lt;br /&gt;
which is still a free self-hosted install on its own.&lt;br /&gt;
|usage_notes=Syncs with any CalDAV-compatible client (Thunderbird, most phone calendar&lt;br /&gt;
apps) so people aren&#039;t locked into a web UI.&lt;br /&gt;
|rejected_alternatives=&lt;br /&gt;
|category=Calendars&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Open_Collective_-_transparent_fiscal_hosting_for_unincorporated_groups&amp;diff=89</id>
		<title>Open Collective - transparent fiscal hosting for unincorporated groups</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Open_Collective_-_transparent_fiscal_hosting_for_unincorporated_groups&amp;diff=89"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/open-collective.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Open Collective&lt;br /&gt;
|tagline=transparent fiscal hosting for unincorporated groups&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=opencollective.com&lt;br /&gt;
|pricing=varies&lt;br /&gt;
|amount=Fee is set by whichever Fiscal Host a collective joins (commonly cited range&lt;br /&gt;
roughly 4-10%, some hosts free); Open Collective&#039;s own platform software is open source and&lt;br /&gt;
does not charge separately from the host&#039;s fee&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=cloud&lt;br /&gt;
|description=Transparent money-management platform built specifically for unincorporated&lt;br /&gt;
groups: a &amp;quot;Fiscal Host&amp;quot; (typically an existing nonprofit) legally holds funds and handles&lt;br /&gt;
compliance and tax filings on the group&#039;s behalf, so the group itself never needs to&lt;br /&gt;
incorporate or open its own bank account. Every transaction is publicly visible on the&lt;br /&gt;
collective&#039;s page by default.&lt;br /&gt;
|usage_notes=What it does for us: no incorporation needed -- a Fiscal Host (a separate org&lt;br /&gt;
that already has legal/tax-exempt status) holds the money and handles compliance on our&lt;br /&gt;
behalf, so we can raise, publicly track, and spend funds now, pre-501(c)(3). A host still has&lt;br /&gt;
to agree to take us on; each sets its own fee and eligibility policy.&lt;br /&gt;
&lt;br /&gt;
Caveat: as of 2026 there&#039;s no easy general-cause US host left on the Open Collective platform&lt;br /&gt;
itself -- Open Collective Foundation, formerly the obvious pick, dissolved its fiscal-sponsor&lt;br /&gt;
program in 2024. The only host still on-platform, Open Source Collective, is OSS-only (fits&lt;br /&gt;
our tooling projects, not the broader mission) -- a general-cause host means looking outside&lt;br /&gt;
the Open Collective platform.&lt;br /&gt;
&lt;br /&gt;
If we later incorporate: funds can generally only transfer to another 501(c)(3), not to a&lt;br /&gt;
for-profit or an individual. Whether a host will let us use raised funds toward our own&lt;br /&gt;
incorporation costs (e.g. attorney fees) is untested -- ask directly, don&#039;t assume.&lt;br /&gt;
&lt;br /&gt;
Scale: most-recent figures found in this research pass are from 2019 (platform funds raised&lt;br /&gt;
grew from $1.6M to $4M+ that year alone, across thousands of collectives) -- stale by 2026&lt;br /&gt;
standards. Check Open Collective&#039;s own &amp;quot;Discover&amp;quot; page directly for current totals before&lt;br /&gt;
relying on this for a decision.&lt;br /&gt;
|rejected_alternatives=&lt;br /&gt;
|category=Fund Raising&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Miraheze&amp;diff=88</id>
		<title>Miraheze</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Miraheze&amp;diff=88"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/miraheze.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Miraheze - free volunteer-run MediaWiki hosting for any wiki]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Mullvad&amp;diff=87</id>
		<title>Mullvad</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Mullvad&amp;diff=87"/>
		<updated>2026-08-12T02:35:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/mullvad.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mullvad - anonymous, open-source, audited no-logs VPN (Sweden)]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Kofi&amp;diff=86</id>
		<title>Kofi</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Kofi&amp;diff=86"/>
		<updated>2026-08-12T02:35:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/ko-fi.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Kofi - free tip jar with optional shop]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Miraheze_-_free_volunteer-run_MediaWiki_hosting_for_any_wiki&amp;diff=85</id>
		<title>Miraheze - free volunteer-run MediaWiki hosting for any wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Miraheze_-_free_volunteer-run_MediaWiki_hosting_for_any_wiki&amp;diff=85"/>
		<updated>2026-08-12T02:35:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/miraheze.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Miraheze&lt;br /&gt;
|tagline=free volunteer-run MediaWiki hosting for any wiki&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=miraheze.org&lt;br /&gt;
|pricing=free&lt;br /&gt;
|amount=&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=cloud&lt;br /&gt;
|description=Nonprofit, volunteer-run wiki hosting platform that provides&lt;br /&gt;
free MediaWiki instances with a wide range of pre-installed extensions.&lt;br /&gt;
|usage_notes=See https://www.mediawiki.org/wiki/Miraheze for an overview of&lt;br /&gt;
available extensions and account setup. No cost, donation-supported;&lt;br /&gt;
account required to create a new wiki.&lt;br /&gt;
|rejected_alternatives=&lt;br /&gt;
|category=Run A Wiki&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Mattermost&amp;diff=84</id>
		<title>Mattermost</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Mattermost&amp;diff=84"/>
		<updated>2026-08-12T02:35:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/mattermost.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mattermost - open-source Slack alternative with self-hosted free tier]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Mattermost_-_open-source_Slack_alternative_with_self-hosted_free_tier&amp;diff=83</id>
		<title>Mattermost - open-source Slack alternative with self-hosted free tier</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Mattermost_-_open-source_Slack_alternative_with_self-hosted_free_tier&amp;diff=83"/>
		<updated>2026-08-12T02:35:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/mattermost.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Mattermost&lt;br /&gt;
|tagline=open-source Slack alternative with self-hosted free tier&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=mattermost.com&lt;br /&gt;
|pricing=free&lt;br /&gt;
|amount=Professional $10/user/mo; Enterprise custom pricing (self-hosted free tier available)&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=hybrid&lt;br /&gt;
|description=Self-hostable, MIT-licensed team chat closely modeled on Slack&#039;s channel-based&lt;br /&gt;
UX -- includes a Slack export/import path to ease migration. Free self-hosted tier&lt;br /&gt;
runs indefinitely with no per-seat licensing cost; paid tiers add SSO, compliance&lt;br /&gt;
exports, and HIPAA/FedRAMP-aligned deployment options.&lt;br /&gt;
|usage_notes=Fewer native integrations than Slack out of the box -- most third-party&lt;br /&gt;
connections go through incoming/outgoing webhooks rather than a marketplace, so budget&lt;br /&gt;
some setup time. Good fit for teams that want a near drop-in Slack replacement and&lt;br /&gt;
value Go-based, ops-friendly self-hosting.&lt;br /&gt;
|rejected_alternatives=&lt;br /&gt;
|category=Team Collaboration&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Ko-fi&amp;diff=82</id>
		<title>Ko-fi</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Ko-fi&amp;diff=82"/>
		<updated>2026-08-12T02:35:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/ko-fi.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Kofi - free tip jar with optional shop]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Jitsi_Meet_-_self-hostable,_open-source_video_conferencing_(WebRTC)&amp;diff=81</id>
		<title>Jitsi Meet - self-hostable, open-source video conferencing (WebRTC)</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Jitsi_Meet_-_self-hostable,_open-source_video_conferencing_(WebRTC)&amp;diff=81"/>
		<updated>2026-08-12T02:35:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/jitsi-meet.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Jitsi (8x8, Inc.)&lt;br /&gt;
|tagline=self-hostable, open-source video conferencing (WebRTC)&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=jitsi.org&lt;br /&gt;
|pricing=free&lt;br /&gt;
|amount=Free and open source (Apache 2.0). Self-host at only your hosting cost, use the free&lt;br /&gt;
public meet.jit.si instance, or buy 8x8&#039;s managed Jitsi as a Service (JaaS) for scale/branding.&lt;br /&gt;
|source_license=open&lt;br /&gt;
|hosting=hybrid&lt;br /&gt;
|description=Open-source WebRTC video/audio conferencing you can run on your own server. No&lt;br /&gt;
account needed -- create a room and share the link. Uses the Jitsi Videobridge (an SFU) to route&lt;br /&gt;
streams; deployable via Docker or Debian packages. Maintained by 8x8. It is the video-call&lt;br /&gt;
analogue of [[Element]] for messaging: the reference self-hostable option.&lt;br /&gt;
|usage_notes=Why it clears the self-host bar: run your own Jitsi server and you own the&lt;br /&gt;
infrastructure and your call data -- no operator can cut you off, log your meetings, or be&lt;br /&gt;
compelled to hand them over. Gate-keeping is solid (room passwords, lobby mode, JWT auth), and it&lt;br /&gt;
doesn&#039;t track users or sell data. This is the option when you have technical capacity and want&lt;br /&gt;
full control.&lt;br /&gt;
&lt;br /&gt;
Tradeoffs: self-hosting is real ops work -- a modest deployment needs ~2 vCPUs / 4 GB RAM plus a&lt;br /&gt;
TURN server, and you own patching and uptime. End-to-end encryption (via WebRTC insertable&lt;br /&gt;
streams) is limited to 1:1 and smaller group calls and is not the default -- larger calls are&lt;br /&gt;
encrypted in transit but decrypted at the bridge, so the server operator (you, if self-hosted)&lt;br /&gt;
can technically access media. The public meet.jit.si instance is 8x8-operated under their terms,&lt;br /&gt;
so you must run your own server to get the control/privacy benefit.&lt;br /&gt;
&lt;br /&gt;
Best fit: teams that can run a server and want maximum control over meetings. For a zero-setup,&lt;br /&gt;
E2EE-by-default hosted option from a privacy non-profit, pair with (or choose) [[Proton Meet]].&lt;br /&gt;
|rejected_alternatives=Zoom and Google Meet are closed-source and not end-to-end encrypted by&lt;br /&gt;
default, with the provider able to access call data. If you can&#039;t self-host, [[Proton Meet]] is&lt;br /&gt;
the managed alternative that still gives you E2EE. Relying on the public meet.jit.si instance&lt;br /&gt;
reintroduces an operator/jurisdiction -- self-host to get the benefit (see&lt;br /&gt;
[[:Category:Self Hosting]]).&lt;br /&gt;
|category=Video Conferencing&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Jitsi_Meet&amp;diff=80</id>
		<title>Jitsi Meet</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Jitsi_Meet&amp;diff=80"/>
		<updated>2026-08-12T02:35:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/jitsi-meet.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Jitsi Meet - self-hostable, open-source video conferencing (WebRTC)]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=IVPN&amp;diff=79</id>
		<title>IVPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=IVPN&amp;diff=79"/>
		<updated>2026-08-12T02:35:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: internal-operations/ivpn.md (redirect)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[IVPN - annually-audited, open-source no-logs VPN (Gibraltar)]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>