<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
  <title>Doikayt Tech Blog</title>
  <link>https://www.doikayt.org/blog/index.html</link>
  <description>New posts from Doikayt Mobilization Labs.</description>
  <language>en-us</language>
  <lastBuildDate>Tue, 28 Jul 2026 06:50:41 GMT</lastBuildDate>
  <item>
    <title>Bitwarden, Autofill, and the Tedium of Submitting to Community Calendars (Work in Progress)</title>
    <link>https://www.doikayt.org/blog/bitwarden-autofill-community-calendar-submissions.html</link>
    <guid isPermaLink="true">https://www.doikayt.org/blog/bitwarden-autofill-community-calendar-submissions.html</guid>
    <pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
    <category>palestine</category>
    <category>activism</category>
    <category>privacy</category>
    <category>android</category>
    <category>foss</category>
    <description><![CDATA[<!-- IMAGE: hero image goes here --><p>We build organizing tools for the activist community here at Doikayt --
though honestly, anyone&#39;s welcome to borrow them, just use them for nice
things, please. This particular one started with a friend of ours who
organizes a weekly action. Same day, same time, every week -- which means
every week, they&#39;re back on five or six different community calendars,
re-submitting the same notification: the library&#39;s calendar, a mutual aid
coalition&#39;s shared calendar, a tenant union&#39;s Mobilize page, an
Indivisible chapter&#39;s Google Form. The event details are identical, down
to the punctuation. The only thing that ever changes is the date. It&#39;s
pure time sink, repeated on a schedule, usually from a phone, standing
somewhere with five minutes before they need to be elsewhere.</p>
<p>Turns out this isn&#39;t just an activist problem, either -- ask around and
you&#39;ll find the &quot;normies&quot; dealing with their own version of it: job
applicants retyping the same name, address, and work history into a dozen
different applicant-tracking systems, apartment hunters filling out a
near-identical rental application on every listing site, freelancers
re-entering their business info into every new client&#39;s intake form,
parents drowning in school and camp registration forms. Anyone who fills
out a lot of forms online has this exact tedium. Our friend&#39;s weekly
action is just the sharpest version of it -- constant, on a schedule, on a
phone -- but the fix below is genuinely general-purpose.</p>
<p>None of that tedium is <em>necessary</em>. Most of it is credential and
contact-info re-entry that the right pair of apps already knows how to do
for you -- you just haven&#39;t pointed them at the problem yet. This post
walks through setting up Bitwarden on Android for password management, and
pairing it with RoboForm for the address and contact-info fields that show
up in <em>any</em> form -- calendar submissions, donation pages, RSVP forms,
volunteer sign-ups, permit and comment forms, vendor checkout, all of it.</p>
<p>Why two apps instead of one? Android only lets a single app be the system&#39;s
default autofill service at a time, and the obvious way to get a second app
autofilling forms -- Accessibility permission -- hands that app system-wide
screen-reading access. We wanted Bitwarden to keep owning passwords
<em>without</em> handing a second app that level of access just to autofill an
address field. The setup below is the workaround: RoboForm fills forms
through its own in-app browser instead of through Accessibility, so it
never needs to touch Bitwarden&#39;s turf or ask for anything invasive.</p>
<h2 id="who-this-is-for">Who this is for</h2>
<p>You&#39;re a &quot;power user&quot; volunteer or staff technologist at a movement-aligned
org -- comfortable installing an app and poking around in its settings, but
not necessarily an Android developer. You (or your org) already juggle
several logins and would rather not keep them in a notes app, a sticky
note, or &quot;the password everyone uses.&quot; And you or your teammates are the
ones stuck submitting the same event to five calendars a week.</p>
<h2 id="part-1-bitwarden-as-your-teams-password-manager">Part 1: Bitwarden as your team&#39;s password manager</h2>
<p>We&#39;ve recommended Bitwarden on our field-guide wiki before as a strong,
open-source alternative to LastPass -- especially given
LastPass&#39;s 2022 breach, where encrypted customer vaults were stolen. The
free tier covers unlimited passwords across unlimited devices for
individuals, which is often all a shoestring-budget org needs. Organizations
that outgrow the free tier land at $4/user/month for the Teams plan, well
below LastPass&#39;s $7/user/month.</p>
<h3 id="setting-it-up-on-android">Setting it up on Android</h3>
<!-- IMAGE: Play Store listing / install screen --><ol>
<li>Install <strong>Bitwarden Password Manager</strong> from the Play Store.</li>
<li>Log in (or create a free account at
<a href="https://bitwarden.com">bitwarden.com</a> first, if you don&#39;t have one).</li>
<li>Set up biometric unlock (fingerprint or face unlock) under
<strong>Settings → Security → Unlock with biometrics</strong>, so you aren&#39;t typing
your master password every time you need a credential on your phone.</li>
<li>Turn on Bitwarden as your Android <strong>autofill service</strong>: <strong>Settings →
Autofill Service</strong>, select Bitwarden, and confirm.</li>
</ol>
<!-- IMAGE: Autofill service settings screen --><p>That last step is the important one, and it&#39;s easy to skip past. Android&#39;s
autofill framework isn&#39;t just for logins -- once Bitwarden is registered as
your system autofill provider, it can offer to fill <em>any</em> recognized field
across apps and browser tabs, not just username/password pairs. But it&#39;s
also the reason we don&#39;t just add a second autofill app on top: Android
only allows one default autofill service. Whatever handles your address
and contact-info fields has to work <em>around</em> that slot, not compete for it.
That&#39;s what part 2 sets up.</p>
<h3 id="shared-org-vaults">Shared org vaults</h3>
<p>If more than one person on your team submits events, shares accounts, or
needs the same set of logins, set up a Bitwarden <strong>Organization</strong> and put
shared items in a collection rather than emailing passwords around or
maintaining a shared spreadsheet. When someone leaves the team, you revoke
their access to the organization instead of rotating every password by
hand.</p>
<h2 id="part-2-roboform-for-addresses-without-the-accessibility-permission">Part 2: RoboForm for addresses, without the Accessibility permission</h2>
<p>RoboForm has its own concept of an <strong>Identity</strong> -- a saved profile of name,
address, city/state/zip, phone, and email -- the same idea as a Bitwarden
Identity item, just living in a separate app. The classic way RoboForm
offers to fill a form is a floating &quot;RF&quot; button that hovers over whatever
app you&#39;re in, but that button only works if you grant RoboForm the
<strong>Accessibility</strong> permission, and Accessibility is all-or-nothing: you
can&#39;t scope it to &quot;just Chrome&quot; or &quot;just form fields.&quot; It&#39;s the same class
of system-wide access screen readers use, and it&#39;s a lot of trust to hand a
second app when Bitwarden already covers your actual credentials. We
decided against it.</p>
<p>The fix RoboForm supports instead: don&#39;t let it hook into other apps at
all. Send the page <em>to</em> RoboForm, fill it inside RoboForm&#39;s own built-in
browser, then switch back. No Accessibility permission, no conflict with
Bitwarden&#39;s autofill slot, no floating button watching your screen.</p>
<p>RoboForm wasn&#39;t the only candidate we looked at for this job -- LastPass
has its own form-fill feature too, and a lot of orgs already have it
sitting around from before switching to Bitwarden. We ruled it out for a
more fundamental reason than the Accessibility question above
<a href="#1-why-not-lastpass">[1]</a> -- see the appendix at the end for the details.</p>
<h3 id="one-time-setup-create-a-roboform-identity">One-time setup: create a RoboForm Identity</h3>
<!-- IMAGE: Adding a new Identity in RoboForm --><ol>
<li>Open the RoboForm app.</li>
<li>Tap the <strong>Identities</strong> tab at the bottom.</li>
<li>Tap the <strong>+</strong> (Add) button.</li>
<li>Fill in your org&#39;s details: full name / org name, address, city, state,
ZIP, phone, and email.</li>
<li>Save the profile -- name it something you&#39;ll recognize, like &quot;Org&quot; or
the group&#39;s name.</li>
</ol>
<p>If several people submit events on your org&#39;s behalf, treat this the same
way you&#39;d treat a shared Bitwarden item: settle on one canonical version of
your org&#39;s address and contact info, so everyone is filling from the same
source instead of five slightly different typed-out versions.</p>
<h3 id="every-time-you-need-to-fill-a-form-the-share-method">Every time you need to fill a form: the Share method</h3>
<!-- IMAGE: Chrome share sheet with RoboForm listed --><ol>
<li>Open Chrome and navigate to the form -- a calendar submission page, a
checkout form, whatever needs your org&#39;s info.</li>
<li>Tap Chrome&#39;s <strong>3-dot menu</strong> (top right).</li>
<li>Tap <strong>Share</strong>.</li>
<li>From the share sheet, select <strong>RoboForm</strong>.</li>
<li>The page opens inside RoboForm&#39;s own built-in browser.</li>
<li>Tap RoboForm&#39;s fill icon and select your saved Identity.</li>
<li>RoboForm fills the form -- name, address, ZIP, and whatever else the
page recognizes.</li>
<li>Tap back (or use Recent Apps) to return to Chrome and submit.</li>
</ol>
<p>It&#39;s a few more taps than a one-tap autofill suggestion -- roughly five
interactions (menu → share → select RoboForm → fill → return) versus the
two a floating button would take. That gap is the actual price of not
handing a second app screen-wide access, and for most people submitting a
handful of forms a week, it&#39;s a trade worth making.</p>
<h3 id="if-youd-already-turned-accessibility-on-for-roboform">If you&#39;d already turned Accessibility on for RoboForm</h3>
<p>If you tried the floating-button approach before landing on the Share
method, turn Accessibility back off:</p>
<ul>
<li><strong>In RoboForm:</strong> Settings → Integration → toggle <strong>Accessibility
Autofill</strong> off, or</li>
<li><strong>In Android:</strong> Settings → Accessibility → Installed apps → RoboForm →
toggle the main switch off.</li>
</ul>
<p>Either way, this doesn&#39;t touch the Share method above -- that path never
used Accessibility in the first place, so turning it off changes nothing
about how form-filling works, only what permission RoboForm is holding in
the background.</p>
<h2 id="part-3-the-general-workflow-autofill-for-any-form">Part 3: The general workflow -- autofill for any form</h2>
<p>This is the actual payoff, and it&#39;s bigger than calendars. Once you&#39;ve got
a saved RoboForm Identity and the Share-method habit down, <em>any</em> form
asking for a subset of name / organization / email / phone / address goes
from a re-typing exercise to five taps instead of forty. Community calendar
submissions are the example we keep coming back to because you hit them
over and over, but the exact same workflow covers:</p>
<ul>
<li>donation and fundraising platform checkout forms</li>
<li>event RSVP and volunteer sign-up forms</li>
<li>permit applications and public-comment forms</li>
<li>petition sites</li>
<li>vendor and supply-order checkout on any e-commerce site</li>
<li>literally any &quot;contact us&quot; or intake form your org fills out repeatedly</li>
</ul>
<p>Read what follows as a template, not a one-off recipe: wherever a form asks
for that same handful of fields, this is the move.</p>
<p>Community calendar forms -- whether it&#39;s a library&#39;s WordPress plugin, a
Google Form, an Eventbrite listing, or a Mobilize event page -- are a good
worked example because they&#39;re so consistent about <em>which</em> fields they
want. That&#39;s precisely the shape of a RoboForm Identity.</p>
<!-- IMAGE: A calendar submission form mid-fill inside RoboForm's browser --><p>Open the submission form in Chrome, share it to RoboForm, fill from your
saved Identity, and switch back -- the same eight-step loop from part 2,
just applied to whatever form is in front of you this time, instead of you
thumb-typing &quot;Doikayt Mobilization Labs, 123 Somewhere St...&quot; for the fifth
time that week.</p>
<p>A few notes from actually doing this in the field:</p>
<ul>
<li><strong>It&#39;s an app switch, not a one-tap suggestion.</strong> The Share method costs
more taps than a floating autofill button would -- that&#39;s the deliberate
trade for keeping Accessibility off. If that gap starts to feel like real
friction on forms you fill constantly, that&#39;s a sign to weigh it
consciously rather than reach for Accessibility as a shortcut.</li>
<li><strong>Not every form recognizes every field.</strong> Older or hand-rolled forms
sometimes only pick up part of the Identity inside RoboForm&#39;s browser --
you&#39;ll still save time on the fields that <em>do</em> match, and can fill the
rest by hand.</li>
<li><strong>Double-check what actually landed.</strong> Autofill occasionally maps a field
wrong (city into &quot;organization,&quot; for instance) on a poorly-labeled form.
Skim the form before submitting, the same way you&#39;d proofread anything
else going out under your org&#39;s name.</li>
<li><strong>Keep the Identity accurate.</strong> If your org changes its contact email or
moves, update the one Identity -- everyone who fills from it gets the
correction automatically, instead of some submissions carrying a stale
address because a volunteer had an old one saved locally.</li>
<li><strong>Bitwarden doesn&#39;t need to know about any of this.</strong> It stays the
default autofill service, quietly handling logins the whole time. The two
apps never fight over the same job.</li>
</ul>
<h2 id="why-this-is-worth-the-ten-minutes-of-setup">Why this is worth the ten minutes of setup</h2>
<p>None of this is exotic -- it&#39;s the intended use of features most people
never open, split across two apps on purpose. The payoff compounds with
every recurring form, not just calendar submissions: less time spent
hunched over a phone keyboard re-entering the same nine fields, fewer typos
that get an event bounced or a donation misrouted, and one canonical
source of truth for your org&#39;s public-facing info instead of it living in
five different volunteers&#39; muscle memory. Set up the Identity once, and
every form afterward -- calendars, donation pages, permits, sign-up sheets,
whatever your org fills out on repeat -- gets faster, at the cost of a
five-tap app switch instead of one tap.</p>
<p>That trade-off -- a few extra taps in exchange for not handing a second app
system-wide screen access -- is the same instinct behind everything else in
this series: own your tools, understand what permission you&#39;re actually
granting and why, and don&#39;t trade privacy for convenience by default just
because the shortcut is sitting right there. It&#39;s a small piece of the
same broader project we keep coming back to -- de-Big-Tech-ify the
workflow, own your data, and spend the time you save on the organizing
itself.</p>
<!-- IMAGE: closing image --><hr>
<h2 id="1-why-not-lastpass">[1] Why not LastPass</h2>
<p>LastPass&#39;s form-fill engine leans heavily on matching a form field&#39;s <code>id</code>
attribute to guess what kind of data belongs there. That&#39;s the wrong
attribute to key on. <code>id</code> exists for CSS and JavaScript to hook into a
specific element -- nothing in the HTML spec requires it to describe what
the field <em>is</em>, and in practice it often doesn&#39;t: modern component
frameworks (React&#39;s <code>useId()</code>, Formik, plenty of others) routinely
generate <code>id</code>s like <code>:r3:</code> or <code>field-14</code> that carry no semantic meaning at
all.</p>
<p>The <code>name</code> attribute is a much more reliable signal, because it&#39;s what
actually gets sent to the server when the form submits -- a backend has to
be able to make sense of that payload, so <code>name=&quot;email&quot;</code> or
<code>name=&quot;shipping_zip&quot;</code> stays meaningful even on a form whose <code>id</code>s are pure
framework noise. And the real spec-blessed answer, one level better than
either: the <code>autocomplete</code> attribute -- <code>autocomplete=&quot;email&quot;</code>,
<code>autocomplete=&quot;postal-code&quot;</code> -- which is what Android&#39;s own autofill
framework prioritizes. <code>name</code>-pattern matching is the fallback for forms
that skip <code>autocomplete</code> entirely; <code>id</code>-matching is a fallback below even
that.</p>
<p>The practical result: on a lot of the newer, component-framework-built
forms you&#39;ll actually run into -- which is most of them at this point --
LastPass&#39;s form-fill quietly whiffs on fields it should be able to
recognize. That&#39;s not a permissions trade-off like the Accessibility
question in Part 2; it&#39;s just a less reliable tool for the specific job of
reading a form and knowing what goes where.</p>
]]></description>
  </item>
  <item>
    <title>Dummy Blog Three</title>
    <link>https://www.doikayt.org/blog/dummy-blog-three.html</link>
    <guid isPermaLink="true">https://www.doikayt.org/blog/dummy-blog-three.html</guid>
    <pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate>
    <description><![CDATA[<p>Third placeholder post, dated today — should render first in the &quot;Doikayt Tech Blog&quot; list.</p>
]]></description>
  </item>
  <item>
    <title>Dummy Blog Two</title>
    <link>https://www.doikayt.org/blog/dummy-blog-two.html</link>
    <guid isPermaLink="true">https://www.doikayt.org/blog/dummy-blog-two.html</guid>
    <pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate>
    <description><![CDATA[<p>Second placeholder post, dated a day after Dummy Blog One to verify newest-first sorting.</p>
]]></description>
  </item>
  <item>
    <title>Dummy Blog One</title>
    <link>https://www.doikayt.org/blog/dummy-blog-one.html</link>
    <guid isPermaLink="true">https://www.doikayt.org/blog/dummy-blog-one.html</guid>
    <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    <description><![CDATA[<p>Placeholder post used to test that the blog index picks up new posts automatically.</p>
]]></description>
  </item>
</channel>
</rss>
