<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>passport-alternatives.txt</title>
  <script>
    (() => {
      let storedTheme = null;
      try {
        storedTheme = localStorage.getItem("theme");
      } catch (error) {}

      if (storedTheme === "dark") {
        document.documentElement.dataset.theme = "dark";
      }
    })();
  </script>
  <link rel="stylesheet" href="/%25latex/styles.css">
</head>
<body class="document-page">
  <button class="theme-toggle" type="button" aria-label="Switch to dark mode" title="Dark mode">
    <svg class="theme-icon theme-icon-moon" viewBox="0 0 24 24" aria-hidden="true">
      <path d="M20.4 14.5A8.2 8.2 0 0 1 9.5 3.6a8.7 8.7 0 1 0 10.9 10.9Z"></path>
    </svg>
    <svg class="theme-icon theme-icon-sun" viewBox="0 0 24 24" aria-hidden="true">
      <circle cx="12" cy="12" r="4"></circle>
      <path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"></path>
    </svg>
  </button>
  <script>
    (() => {
      const button = document.querySelector(".theme-toggle");

      const setTheme = (theme) => {
        const isDark = theme === "dark";
        if (isDark) {
          document.documentElement.dataset.theme = "dark";
        } else {
          document.documentElement.removeAttribute("data-theme");
        }

        button.setAttribute("aria-label", isDark ? "Switch to light mode" : "Switch to dark mode");
        button.setAttribute("aria-pressed", String(isDark));
        button.title = isDark ? "Light mode" : "Dark mode";

        try {
          localStorage.setItem("theme", isDark ? "dark" : "light");
        } catch (error) {}
      };

      setTheme(document.documentElement.dataset.theme === "dark" ? "dark" : "light");
      button.addEventListener("click", () => {
        setTheme(document.documentElement.dataset.theme === "dark" ? "light" : "dark");
      });
    })();
  </script>
  <header class="site-header">
    <a class="back-link" href="/outline/passport/">Back to directory</a>
    <h1>passport-alternatives.txt</h1>
    <p class="path-label">outline/passport/passport-alternatives.txt</p>
  </header>
  <main class="document-shell">
    <pre class="document-text">## Alternatives

## Identity Anchors

if there is a significant amount of spam in passports
or there is increased reputation required

create weightings for activity on different platforms

### Approved (optional, Helper Only)
		Steam (OpenID) → sticky gamer ID, rarely abandoned
		Institute of Electrical and Electronic Engineers (IEEE) → membership-based, high trust, professional continuity
		ORCID → open, academic, globally persistent

### Not Preferred Options
		GitHub (OAuth 2.0) → trusted by developers, strong but Microsoft-owned
			semi-mitigation could be using use key on personal repostiroy instead of oauth

		LinkedIn (OAuth 2.0) → universal professional presence, sticky but Microsoft-owned

		Zoom (OAuth 2.0 / OIDC) → school/work universal, stable accounts

		Apple ID (OAuth 2.0 / OIDC) → near-universal for iOS/macOS users, requires dev account
			succumbed to pressure from Chinese Communist Party
				justify as following local laws
					which is technically true
				reliance on their supply chains

### Explicit Exclusions
		Discord → high churn, moderation issues, volatility
		Epic Games → game-specific, corporate-driven, not neutral enough
		Twitch (Amazon) → tied to Amazon ecosystem, heavy corporate identity
		Google → surveillance-oriented, advertising core
		Facebook/Meta → reputation, tracking, loss of trust
		Payments (PayPal, etc.) → not appropriate as anchors; transactional, not identity


## Community Anchors

	possible venue check-ins (QR at events) weighted more than online attestations
	local university desk vouch (calm.college)
	library or maker-space vouch
	event ticket QR (issued via PF tools)
	edu email link (non-persistent, for eligibility only)



## Bad-actors Impersonating Official Content

	if impersonation of campaign materials rises
		switch to signed **content manifests**: each official asset ships with a tiny `.pfp.json` (source hash, issuer, campaign, date)
		release a one-click verifier (web + CLI); dashboards only surface assets with valid manifests


## Onboarding and User-experience Problems

	if sign-up friction blocks growth
		“guest passport” (ephemeral) upgraded to full on first in-person QR
		kiosk mode at events: steward tablet issues a one-time link that the user later binds to their passkey

	if CSS/profile theming is abused
		lock to approved theme tokens by default; full CSS only for trusted age-of-account + manual opt-in


## Recovery Abuse or Loss

	if recovery requests become noisy or manipulated
	 raise threshold (2-of-5 → 3-of-7) and introduce visible cooldowns
	 require previous device co-signature when present
	 show “pending recovery” notice in public log; allow alarms to be raised



## Sybil or Spam Flooding

	if passport spam rises faster than steward capacity
	 limit verification rate per new account (monthly budget)
	 require one cross-campaign verifier per badge (prevents cliques)
	 temporary invite-only window to drain bot waves



## Infrastructure or Legal Pressure

	if the hub is disrupted or served a takedown
	 publish epoch hashes to DNS + Git mirror + IPFS pinset
	 allow read-only mirror mode until new write endpoint appears
	 maintain a warrant-canary page for transparency
</pre>
  </main>
  <footer class="site-footer">
    <a class="back-link" href="/outline/passport/">Back to directory</a>
  </footer>
</body>
</html>
