<?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-07-21T16:48:41Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=MediaWiki:Doikayt-build-commit&amp;diff=35</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=35"/>
		<updated>2026-07-21T07:39:40Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: git rev-parse HEAD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;3139dea4d13ebecb7e67f5198e15f8c690d3d1cb&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=34</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=34"/>
		<updated>2026-07-21T07:34:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: git rev-parse HEAD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;46d3ad1dbb800b34f23fc3145bfab16f7ef5bacc&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=33</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=33"/>
		<updated>2026-07-21T07:16:04Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: git rev-parse HEAD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;46f64c6aa17fa347c0d64e6ce778d5e6b6d603a0&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=32</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=32"/>
		<updated>2026-07-21T07:09:19Z</updated>

		<summary type="html">&lt;p&gt;Admin: qwiki: git rev-parse HEAD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;00e919ea09505ae20068effcff23fb2f58a7cdbd&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=MediaWiki:Common.js&amp;diff=31</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=31"/>
		<updated>2026-07-21T07:09:18Z</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. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	$( &#039;#p-logo a&#039; ).attr( {&lt;br /&gt;
		href: &#039;https://www.doikayt.org&#039;,&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;
/* 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;
/* 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=Main_Page&amp;diff=30</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Main_Page&amp;diff=30"/>
		<updated>2026-07-21T04:59:04Z</updated>

		<summary type="html">&lt;p&gt;Admin: &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 Doikayt Mobilization Labs. [TBD: need link]&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;technician&#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 technicians 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 chris@datalackey.com&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;long-term-vision&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Long Term Vision ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wiki---database&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wiki -&amp;amp;gt; Database ===&lt;br /&gt;
&lt;br /&gt;
We have formalized the procedure for adding new content to this site so that each entry for a recommended tool has a known structure (schema). We plan to leverage this known structure when we start feeding a database with this site’s content.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;database---tool-for-ai-agent&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Database -&amp;amp;gt; Tool for AI Agent ===&lt;br /&gt;
&lt;br /&gt;
Longer term we plan to expose our content as a tool that be consumed by AI language models via [https://en.wikipedia.org/wiki/Model_Context_Protocol Model Context Protocol]. The goal is to enable conversations along the lines of: “I am looking for a low (or no) cost tool to streamline the process of submitting my organization’s weekly events to various community calendars.”&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=Template:Tool&amp;diff=29</id>
		<title>Template:Tool</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Template:Tool&amp;diff=29"/>
		<updated>2026-07-21T02:10:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;noinclude&amp;gt; {{#cargo_declare:_table=tool |company=String |protocol=String |url=String |pricing=String |amount=String |source_license=String |hosting=String |description=String |usage_notes=String |rejected_alternatives=String |category=String }} &amp;lt;/noinclude&amp;gt; {{#cargo_store:_table=tool |company={{{company|}}} |protocol={{{protocol|}}} |url={{{url|}}} |pricing={{{pricing|}}} |amount={{{amount|}}} |source_license={{{source_license|}}} |hosting={{{hosting|}}} |description={{...&amp;quot;&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;
|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;
|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;
{| 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=Form:Tool&amp;diff=28</id>
		<title>Form:Tool</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Form:Tool&amp;diff=28"/>
		<updated>2026-07-21T02:10:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;noinclude&amp;gt; This is the &amp;quot;Tool&amp;quot; form for adding a recommended tool or service. &amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt; {{{for template|Tool|display=table}}} {{{field|company|label=Company}}} {{{field|protocol|label=URL|input type=dropdown|values=https,http|default=https}}} {{{field|url|label=|placeholder=google.com|tooltip=Enter domain only, no protocol prefix (e.g. google.com).}}} {{{field|pricing|label=Pricing|input type=dropdown|values=free,recurring/mo,recurring/yr,one time,varies|...&amp;quot;&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;
{{{for template|Tool|display=table}}}&lt;br /&gt;
{{{field|company|label=Company}}}&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=Template:EvaluationCriteria&amp;diff=27</id>
		<title>Template:EvaluationCriteria</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Template:EvaluationCriteria&amp;diff=27"/>
		<updated>2026-07-21T02:10:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;{| class=&amp;quot;wikitable&amp;quot; ! Criterion !! Notes |- | Cost || {{{cost_notes|Ongoing cost to maintain}}} |- | Risk || {{{risk_notes|Failure modes and their consequences}}} |- | Accessibility || {{{accessibility_notes|Ease of adoption by non-experts}}} |}&amp;quot;&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=MediaWiki:Sidebar&amp;diff=26</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=MediaWiki:Sidebar&amp;diff=26"/>
		<updated>2026-07-21T02:10:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;* navigation ** mainpage|mainpage-description ** About|About this wiki ** Evaluation Criteria|Evaluation criteria used across this wiki ** Project:New Submission|New Submission * SEARCH * TOOLBOX * LANGUAGES&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** About|About this wiki&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.js&amp;diff=25</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=25"/>
		<updated>2026-07-21T02:10:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;/* Point the site logo at the Doikayt Mobilization Labs homepage, opening    in a new tab so the wiki stays open in the background. */ ( function () { 	&amp;#039;use strict&amp;#039;;  	$( &amp;#039;#p-logo a&amp;#039; ).attr( { 		href: &amp;#039;https://www.doikayt.org&amp;#039;, 		target: &amp;#039;_blank&amp;#039;, 		rel: &amp;#039;noopener&amp;#039; 	} ); }() );  /* Replace PageForms OOUI tooltip buttons with a plain &amp;lt;sup&amp;gt;?&amp;lt;/sup&amp;gt; trigger    that shows the help text in a lightweight floating div on click. */ ( function () { 	&amp;#039;use strict&amp;#039;;  	mw.hook( &amp;#039;pf.fo...&amp;quot;&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. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	$( &#039;#p-logo a&#039; ).attr( {&lt;br /&gt;
		href: &#039;https://www.doikayt.org&#039;,&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;
/* 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;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=MediaWiki:Common.css&amp;diff=24</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=24"/>
		<updated>2026-07-21T02:10:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;/* Classic Vector sidebar width */ #mw-panel {   width: 16em !important; } #content, #footer {   margin-left: 17em !important; } #left-navigation, #mw-head-base {   margin-left: 16em !important; }  /* Field help tooltip: ? superscript trigger + floating popup */ .pf-tip {   font-size: 0.6em;   cursor: pointer;   color: #37723a;   vertical-align: super;   margin-left: 3px;   user-select: none; } .pf-tip-popup {   position: absolute;   left: 0;   top: 100%;   background: #...&amp;quot;&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: match nav link size and prevent wrapping */&lt;br /&gt;
.CategoryTreeItem bdi a {&lt;br /&gt;
  font-size: 12px !important;&lt;br /&gt;
  white-space: nowrap !important;&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=Site_Organization&amp;diff=23</id>
		<title>Site Organization</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Site_Organization&amp;diff=23"/>
		<updated>2026-07-21T02:10:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;site-organization&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Site Organization =  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).  * &amp;#039;&amp;#039;Domain →&amp;#039;&amp;#039; ** &amp;#039;&amp;#039;Operational Area →&amp;#039;&amp;#039; *** &amp;#039;&amp;#039;Operational Sub-area →&amp;#039;&amp;#039; **** &amp;#039;&amp;#039;Task →&amp;#039;&amp;#039; ***** &amp;#039;&amp;#039;Candidate Tool&amp;#039;&amp;#039;  &amp;lt;span id=&amp;quot;relations-to-wiki-categ...&amp;quot;&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 technicians 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;
[[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=22</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=22"/>
		<updated>2026-07-21T02:10:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;== New Submission Wizard ==  Enter the name of the product or service you are suggesting. If a page for this entry already exists, you will be sent to the form for editing that page. Otherwise, you will be sent to the form that allows you to select the appropriate category and other details for your new entry.  {{#forminput:form=Tool|button text=Continue}}&amp;quot;&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=Main_Page&amp;diff=21</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Main_Page&amp;diff=21"/>
		<updated>2026-07-21T02:10:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: &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 Doikayt Mobilization Labs. [TBD: need link]&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;technician&#039;&#039; working as IT staff or as a volunteer at such 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 technicians 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 chris@datalackey.com&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;long-term-vision&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Long Term Vision ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wiki---database&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wiki -&amp;amp;gt; Database ===&lt;br /&gt;
&lt;br /&gt;
We have formalized the procedure for adding new content to this site so that each entry for a recommended tool has a known structure (schema). We plan to leverage this known structure when we start feeding a database with this site’s content.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;database---tool-for-ai-agent&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Database -&amp;amp;gt; Tool for AI Agent ===&lt;br /&gt;
&lt;br /&gt;
Longer term we plan to expose our content as a tool that be consumed by AI language models via [https://en.wikipedia.org/wiki/Model_Context_Protocol Model Context Protocol]. The goal is to enable conversations along the lines of: “I am looking for a low (or no) cost tool to streamline the process of submitting my organization’s weekly events to various community calendars.”&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=Slack&amp;diff=20</id>
		<title>Slack</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Slack&amp;diff=20"/>
		<updated>2026-07-21T02:10:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;{{Tool |company=Salesforce |protocol=https |url=slack.com |pricing=recurring/mo |amount=$8.75/user/month (free tier available) |source_license=closed |hosting=cloud |description=Cloud-based team messaging platform with channels, threads, and integrations. Free tier limits message history to 90 days and caps integrations at 10. |usage_notes=Guest access available on paid plans for external collaborators. Slack Connect allows cross-organization channels with other Slack wo...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Salesforce&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=Cloud-based team messaging platform with channels, threads,&lt;br /&gt;
and integrations. Free tier limits message history to 90 days and caps&lt;br /&gt;
integrations at 10.&lt;br /&gt;
|usage_notes=Guest access available on paid plans for external collaborators.&lt;br /&gt;
Slack Connect allows 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=Qwiki&amp;diff=19</id>
		<title>Qwiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Qwiki&amp;diff=19"/>
		<updated>2026-07-21T02:10:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;{{Tool |company=Doikayt Mobilization Labs |protocol=https |url=github.com/doikayt/qwiki |pricing=free |amount= |source_license=open |hosting=self |description=Doikayt&amp;#039;s own self-hosted MediaWiki stack: Docker Compose infrastructure plus a markdown-to-wikitext content pipeline for authoring and deploying wiki pages (this wiki is built with it). |usage_notes=See the repo README for local setup and deployment instructions. |rejected_alternatives= |category=Run A Wiki }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Doikayt Mobilization Labs&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=Miraheze&amp;diff=18</id>
		<title>Miraheze</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Miraheze&amp;diff=18"/>
		<updated>2026-07-21T02:10:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;{{Tool |company=Miraheze |protocol=https |url=miraheze.org |pricing=free |amount= |source_license=open |hosting=cloud |description=Nonprofit, volunteer-run wiki hosting platform that provides free MediaWiki instances with a wide range of pre-installed extensions. |usage_notes=See https://www.mediawiki.org/wiki/Miraheze for an overview of available extensions and account setup. No cost, donation-supported; account required to create a new wiki. |rejected_alternatives= |ca...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=Miraheze&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=DigitalOcean&amp;diff=17</id>
		<title>DigitalOcean</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=DigitalOcean&amp;diff=17"/>
		<updated>2026-07-21T02:10:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;{{Tool |company=DigitalOcean |protocol=https |url=digitalocean.com |pricing=recurring/mo |amount=$6/month (entry-level Droplet: 1 GB RAM, 1 vCPU, 25 GB SSD NVMe) |source_license=closed |hosting=cloud |description=Cloud VPS provider offering Linux virtual machines (Droplets) suitable for self-hosting applications. Straightforward pricing, solid documentation, and a large library of community tutorials make it a common choice for technically capable teams standing up their...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=DigitalOcean&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=digitalocean.com&lt;br /&gt;
|pricing=recurring/mo&lt;br /&gt;
|amount=$6/month (entry-level Droplet: 1 GB RAM, 1 vCPU, 25 GB SSD NVMe)&lt;br /&gt;
|source_license=closed&lt;br /&gt;
|hosting=cloud&lt;br /&gt;
|description=Cloud VPS provider offering Linux virtual machines (Droplets)&lt;br /&gt;
suitable for self-hosting applications. Straightforward pricing, solid&lt;br /&gt;
documentation, and a large library of community tutorials make it a common&lt;br /&gt;
choice for technically capable teams standing up their own infrastructure.&lt;br /&gt;
|usage_notes=Choose the region closest to your primary users to minimize&lt;br /&gt;
latency. Enable automatic backups ($1.20/month at the entry tier) from the&lt;br /&gt;
start — restoring from a snapshot is far easier than rebuilding from scratch.&lt;br /&gt;
|rejected_alternatives=&lt;br /&gt;
|category=Self Hosting&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=ClickUp&amp;diff=16</id>
		<title>ClickUp</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=ClickUp&amp;diff=16"/>
		<updated>2026-07-21T02:10:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;{{Tool |company=ClickUp |protocol=https |url=clickup.com |pricing=recurring/mo |amount=$7/user/month (free tier available) |source_license=closed |hosting=cloud |description=Cloud-based project and task management platform for assigning tasks, tracking progress, and coordinating team workflows. |usage_notes=Use Board view for kanban-style tracking across teams. Guest access is available on paid plans for external collaborators. |rejected_alternatives= |category=Project M...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tool&lt;br /&gt;
|company=ClickUp&lt;br /&gt;
|protocol=https&lt;br /&gt;
|url=clickup.com&lt;br /&gt;
|pricing=recurring/mo&lt;br /&gt;
|amount=$7/user/month (free tier available)&lt;br /&gt;
|source_license=closed&lt;br /&gt;
|hosting=cloud&lt;br /&gt;
|description=Cloud-based project and task management platform for assigning tasks,&lt;br /&gt;
tracking progress, and coordinating team workflows.&lt;br /&gt;
|usage_notes=Use Board view for kanban-style tracking across teams.&lt;br /&gt;
Guest access is available on paid plans for external collaborators.&lt;br /&gt;
|rejected_alternatives=&lt;br /&gt;
|category=Project Management&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Evaluation_Criteria&amp;diff=15</id>
		<title>Evaluation Criteria</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Evaluation_Criteria&amp;diff=15"/>
		<updated>2026-07-21T02:10:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;evaluation-criteria&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Evaluation Criteria =  Criteria applied when comparing candidate approaches across this wiki.  {| class=&amp;quot;wikitable&amp;quot; |- ! Criterion ! Notes |- | Cost | Ongoing cost to maintain |- | Risk | Failure modes and their consequences |- | Accessibility | Ease of adoption by non-experts |}  Category:Meta&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;evaluation-criteria&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Evaluation Criteria =&lt;br /&gt;
&lt;br /&gt;
Criteria applied when comparing candidate approaches across this wiki.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Criterion&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Cost&lt;br /&gt;
| Ongoing cost to maintain&lt;br /&gt;
|-&lt;br /&gt;
| Risk&lt;br /&gt;
| Failure modes and their consequences&lt;br /&gt;
|-&lt;br /&gt;
| Accessibility&lt;br /&gt;
| Ease of adoption by non-experts&lt;br /&gt;
|}&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=Category:Tools&amp;diff=14</id>
		<title>Category:Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Tools&amp;diff=14"/>
		<updated>2026-07-21T02:10:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;Recommended tools and services for grassroots organizations.  {{#cargo_query:tables=tool |fields=_pageName=Tool,company=Company,pricing=Pricing,amount=Amount,source_license=License,hosting=Hosting |format=table |limit=100 }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recommended tools and services for grassroots organizations.&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:tables=tool&lt;br /&gt;
|fields=_pageName=Tool,company=Company,pricing=Pricing,amount=Amount,source_license=License,hosting=Hosting&lt;br /&gt;
|format=table&lt;br /&gt;
|limit=100&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Category:Team_Collaboration&amp;diff=13</id>
		<title>Category:Team Collaboration</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Team_Collaboration&amp;diff=13"/>
		<updated>2026-07-21T02:10:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;team-collaboration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Team Collaboration =  Persistent chat platforms for day-to-day coordination within the organization (Slack-like tools, self-hosted and cloud).  Category:Internal Comms&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;team-collaboration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Team Collaboration =&lt;br /&gt;
&lt;br /&gt;
Persistent chat platforms for day-to-day coordination within the organization (Slack-like tools, self-hosted and cloud).&lt;br /&gt;
&lt;br /&gt;
[[Category:Internal Comms]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Category:Self_Hosting&amp;diff=12</id>
		<title>Category:Self Hosting</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Self_Hosting&amp;diff=12"/>
		<updated>2026-07-21T02:10:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;self-hosting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Self Hosting =  For technicians who prefer to run infrastructure on their own servers or cloud VPS rather than relying on third-party SaaS platforms. Self hosting offers full control over configuration and data, and eliminates deplatforming risk — but it comes with an ongoing maintenance burden (updates, backups, uptime monitoring) that SaaS tools handle for you. Recommended only for teams with dedicated technical capacity.  Category...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;self-hosting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Self Hosting =&lt;br /&gt;
&lt;br /&gt;
For technicians who prefer to run infrastructure on their own servers or cloud VPS rather than relying on third-party SaaS platforms. Self hosting offers full control over configuration and data, and eliminates deplatforming risk — but it comes with an ongoing maintenance burden (updates, backups, uptime monitoring) that SaaS tools handle for you. Recommended only for teams with dedicated technical capacity.&lt;br /&gt;
&lt;br /&gt;
[[Category:Operations]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Category:Run_A_Wiki&amp;diff=11</id>
		<title>Category:Run A Wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Run_A_Wiki&amp;diff=11"/>
		<updated>2026-07-21T02:10:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;run-a-wiki&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Run A Wiki =  A wiki is a collaborative website that lets any authorized user create and edit interlinked pages directly in the browser. Content is organized into a shared, versioned knowledge base that grows and improves through ongoing contributions from the group.  Category:Team Collaboration&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;run-a-wiki&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Run A Wiki =&lt;br /&gt;
&lt;br /&gt;
A wiki is a collaborative website that lets any authorized user create and edit interlinked pages directly in the browser. Content is organized into a shared, versioned knowledge base that grows and improves through ongoing contributions from the group.&lt;br /&gt;
&lt;br /&gt;
[[Category:Team Collaboration]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Category:Project_Management&amp;diff=10</id>
		<title>Category:Project Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Project_Management&amp;diff=10"/>
		<updated>2026-07-21T02:10:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;project-management&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Project Management =  Concerns related to task tracking, assignment, and progress monitoring.  Category:Operations&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;project-management&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Project Management =&lt;br /&gt;
&lt;br /&gt;
Concerns related to task tracking, assignment, and progress monitoring.&lt;br /&gt;
&lt;br /&gt;
[[Category:Operations]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Category:Outbound_Comms&amp;diff=9</id>
		<title>Category:Outbound Comms</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Outbound_Comms&amp;diff=9"/>
		<updated>2026-07-21T02:10:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;Outbound communications (web site, call center, etc.)  Category:Communications&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Outbound communications (web site, call center, etc.)&lt;br /&gt;
&lt;br /&gt;
[[Category:Communications]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Category:Operations&amp;diff=8</id>
		<title>Category:Operations</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Operations&amp;diff=8"/>
		<updated>2026-07-21T02:10:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;operations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Operations =  Operational concerns related to the internal functioning of a grassroots organization.  Category:Domains&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;operations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Operations =&lt;br /&gt;
&lt;br /&gt;
Operational concerns related to the internal functioning of a grassroots organization.&lt;br /&gt;
&lt;br /&gt;
[[Category:Domains]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Category:Internal_Comms&amp;diff=7</id>
		<title>Category:Internal Comms</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Internal_Comms&amp;diff=7"/>
		<updated>2026-07-21T02:10:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;internal-comms&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Internal Comms =  Concerns related to communication and coordination within the organization.  Category:Communications&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;internal-comms&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Internal Comms =&lt;br /&gt;
&lt;br /&gt;
Concerns related to communication and coordination within the organization.&lt;br /&gt;
&lt;br /&gt;
[[Category:Communications]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Category:Finance%26Accounting&amp;diff=6</id>
		<title>Category:Finance&amp;Accounting</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Finance%26Accounting&amp;diff=6"/>
		<updated>2026-07-21T02:10:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;Online and desktop tools for budgeting, tax reporting, payroll, etc.  Category:Operations&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Online and desktop tools for budgeting, tax reporting, payroll, etc.&lt;br /&gt;
&lt;br /&gt;
[[Category:Operations]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Category:Domains&amp;diff=5</id>
		<title>Category:Domains</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Domains&amp;diff=5"/>
		<updated>2026-07-21T02:10:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;domains&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Domains =  Top-level domains of operational concern for this wiki.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;domains&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Domains =&lt;br /&gt;
&lt;br /&gt;
Top-level domains of operational concern for this wiki.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Category:Communications&amp;diff=4</id>
		<title>Category:Communications</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Communications&amp;diff=4"/>
		<updated>2026-07-21T02:10:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;communications&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Communications =  Internal and external messaging for the organization.  Category:Domains&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;communications&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Communications =&lt;br /&gt;
&lt;br /&gt;
Internal and external messaging for the organization.&lt;br /&gt;
&lt;br /&gt;
[[Category:Domains]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=Category:Calendars&amp;diff=3</id>
		<title>Category:Calendars</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=Category:Calendars&amp;diff=3"/>
		<updated>2026-07-21T02:10:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;Server side tools for hosting and client side tools for posting events and syndication.  Category:Internal Comms&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Server side tools for hosting and client side tools for posting events and syndication.&lt;br /&gt;
&lt;br /&gt;
[[Category:Internal Comms]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=About&amp;diff=2</id>
		<title>About</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=About&amp;diff=2"/>
		<updated>2026-07-21T02:10:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;about&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = About =  &amp;lt;span id=&amp;quot;the-name&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == The Name ==  &amp;#039;&amp;#039;&amp;#039;[https://en.wikipedia.org/wiki/Doikayt Doikayt]&amp;#039;&amp;#039;&amp;#039; is Yiddish for “hereness.” The term refers to the core concept of the Bundists, members of the General Jewish Labour Bund, a secular socialist movement active in the Eastern Europe beginning around the early 1900’s Bundists were explicitly non - or anti-Zionist – holding that Jews should build justice and a good life wherever they...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;about&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= About =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-name&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== The Name ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://en.wikipedia.org/wiki/Doikayt Doikayt]&#039;&#039;&#039; is Yiddish for “hereness.” The term refers to the core concept of the Bundists, members of the General Jewish Labour Bund, a secular socialist movement active in the Eastern Europe beginning around the early 1900’s Bundists were explicitly non - or anti-Zionist – holding that Jews should build justice and a good life wherever they live, in solidarity with other secular, multi-ethnic, working-class movements – rather than deferring collective liberation to a national homeland elsewhere.&lt;br /&gt;
&lt;br /&gt;
The multi-ethnic aspect of the Bundists message bears directly on what we hope to accomplish in building out this project (and numerous other in our pipeline.) In the words of Fredrick Douglas: we will “unite with &#039;&#039;anybody&#039;&#039; to do right and with nobody to do wrong”.&lt;br /&gt;
&lt;br /&gt;
For those interested, our [https://www.doikayt.org website] goes into lots more detail.&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 (in its current state, and as we pursue databas-ification and LLM integration.)&lt;br /&gt;
&lt;br /&gt;
[[Category:Meta]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>