interactive intro to open social at-me.zzstoatzz.io
at main 173 lines 9.8 kB view raw
1<!DOCTYPE html> 2<html> 3 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>@me - explore your atproto identity</title> 8 <link rel="icon" type="image/svg+xml" href="/favicon.svg"> 9 10 <!-- Open Graph / Facebook --> 11 <meta property="og:type" content="website"> 12 <meta property="og:url" content="https://at-me.wisp.place/"> 13 <meta property="og:title" content="@me - explore your atproto identity"> 14 <meta property="og:description" 15 content="visualize your decentralized identity and see what apps have stored data in your Personal Data Server"> 16 <meta property="og:image" content="https://at-me.wisp.place/og-image.png"> 17 18 <!-- Twitter --> 19 <meta property="twitter:card" content="summary_large_image"> 20 <meta property="twitter:url" content="https://at-me.wisp.place/"> 21 <meta property="twitter:title" content="@me - explore your atproto identity"> 22 <meta property="twitter:description" 23 content="visualize your decentralized identity and see what apps have stored data in your Personal Data Server"> 24 <meta property="twitter:image" content="https://at-me.wisp.place/og-image.png"> 25</head> 26 27<body> 28 <a href="/" class="home-btn" title="back to landing"> 29 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" 30 stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 31 <path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" /> 32 <polyline points="9 22 9 12 15 12 15 22" /> 33 </svg> 34 </a> 35 <div class="info" id="infoBtn" title="learn about your data"> 36 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" 37 stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 38 <circle cx="12" cy="12" r="10" /> 39 <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" /> 40 <path d="M12 17h.01" /> 41 </svg> 42 </div> 43 <div class="top-right-buttons"> 44 <button class="filter-btn" id="filterBtn"> 45 <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" 46 stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 47 <polygon points="22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3" /> 48 </svg> 49 <span class="filter-label-text">filter</span> 50 <span class="filter-count" id="filterCount" style="display: none;"></span> 51 </button> 52 <button class="watch-live-btn" id="watchLiveBtn"> 53 <span class="watch-indicator"></span> 54 <span class="watch-label">watch live</span> 55 </button> 56 </div> 57 <div class="filter-panel" id="filterPanel"> 58 <div class="filter-panel-header"> 59 <span class="filter-panel-title">show apps</span> 60 <div class="filter-panel-actions"> 61 <button type="button" class="filter-action-btn" id="filterShowAll">all</button> 62 <button type="button" class="filter-action-btn" id="filterHideUnresolved">valid</button> 63 <button type="button" class="filter-action-btn" id="filterHideAll">none</button> 64 </div> 65 </div> 66 <div class="filter-list" id="filterList"></div> 67 </div> 68 <div class="pov-indicator">point of view of <a class="pov-handle" id="povHandle" href="#" target="_blank" 69 rel="noopener noreferrer"></a></div> 70 <div class="guestbook-sign">sign the guest list</div> 71 <div class="guestbook-buttons-container"> 72 <button class="view-guestbook-btn" id="viewGuestbookBtn" title="view all signatures"> 73 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" 74 stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 75 <line x1="8" x2="21" y1="6" y2="6" /> 76 <line x1="8" x2="21" y1="12" y2="12" /> 77 <line x1="8" x2="21" y1="18" y2="18" /> 78 <line x1="3" x2="3.01" y1="6" y2="6" /> 79 <line x1="3" x2="3.01" y1="12" y2="12" /> 80 <line x1="3" x2="3.01" y1="18" y2="18" /> 81 </svg> 82 </button> 83 <button class="sign-guestbook-btn" id="signGuestbookBtn" title="sign the guestbook"> 84 <span class="guestbook-icon"> 85 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" 86 stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 87 <path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20" /> 88 </svg> 89 </span> 90 <span class="guestbook-text">sign guestbook</span> 91 <img class="guestbook-avatar" id="guestbookAvatar" style="display: none;" /> 92 </button> 93 </div> 94 95 <div class="firehose-toast" id="firehoseToast"> 96 <div class="firehose-toast-action"></div> 97 <div class="firehose-toast-collection"></div> 98 <a class='firehose-toast-link' id='firehoseToastLink' href='#' target='_blank' rel='noopener noreferrer'>view 99 record</a> 100 </div> 101 102 <div class="overlay" id="overlay"></div> 103 <div class="info-modal" id="infoModal"> 104 <h2>this is your data</h2> 105 <p>this visualization shows your <a href="https://atproto.com/guides/data-repos" target="_blank" 106 rel="noopener noreferrer" style="color: var(--text); text-decoration: underline;">Personal Data 107 Server</a> - where your social data actually lives. unlike traditional platforms that lock everything in 108 their database, your posts, likes, and follows are stored here, on infrastructure you control.</p> 109 <p>each circle represents an app that writes to your space. <a href="https://bsky.app" target="_blank" 110 rel="noopener noreferrer" style="color: var(--text); text-decoration: underline;">bluesky</a> for 111 microblogging. <a href="https://whtwnd.com" target="_blank" rel="noopener noreferrer" 112 style="color: var(--text); text-decoration: underline;">whitewind</a> for long-form posts. <a 113 href="https://tangled.org" target="_blank" rel="noopener noreferrer" 114 style="color: var(--text); text-decoration: underline;">tangled.org</a> for code hosting. they're all 115 just different views of the same underlying data - <strong>your</strong> data.</p> 116 <p>this is what "<a href="https://overreacted.io/open-social/" target="_blank" rel="noopener noreferrer" 117 style="color: var(--text); text-decoration: underline;">open social</a>" means: your followers, your 118 content, your connections - they all belong to you, not the app. switch apps anytime and take everything 119 with you. no platform can hold your social graph hostage.</p> 120 <p style="margin-bottom: 1rem;"><strong>how to explore:</strong> click your avatar in the center to see the 121 details of your identity. click any app to browse the records it's created in your repository.</p> 122 <button id="closeInfo">got it</button> 123 <p 124 style="margin-top: 1.5rem; padding-top: 1rem; border-top: 1px solid var(--border); font-size: 0.7rem; color: var(--text-light); display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap;"> 125 <span>view <a href="https://tangled.org/@zzstoatzz.io/at-me" target="_blank" rel="noopener noreferrer" 126 style="color: var(--text); text-decoration: underline;">the source code</a> on</span> 127 <a href="https://tangled.org" target="_blank" rel="noopener noreferrer" 128 style="color: var(--text); text-decoration: underline;">tangled.org</a> 129 </p> 130 </div> 131 132 <div class="guestbook-modal" id="guestbookModal"> 133 <button class="guestbook-close" id="guestbookClose">x</button> 134 <div id="guestbookContent"></div> 135 </div> 136 137 <div class="onboarding-overlay" id="onboardingOverlay"> 138 <div class="onboarding-spotlight" id="onboardingSpotlight"></div> 139 <div class="onboarding-content" id="onboardingContent"></div> 140 </div> 141 142 <div class="canvas"> 143 <div class="identity"> 144 <img class="identity-avatar" id="identityAvatar" /> 145 <div class="identity-handle" id="handleDisplay"></div> 146 </div> 147 <div id="field" class="loading"> 148 <div class="loading-spinner"></div> 149 <div class="loading-text">loading your data</div> 150 <div class="loading-progress" id="status">resolving identity...</div> 151 </div> 152 </div> 153 <div id="detail" class="detail-panel"></div> 154 155 <script type="module" src="/src/view/main.js"></script> 156 <script> 157 // Info modal handlers (kept inline as they're simple UI toggles) 158 document.getElementById('infoBtn').addEventListener('click', () => { 159 document.getElementById('infoModal').classList.add('visible'); 160 document.getElementById('overlay').classList.add('visible'); 161 }); 162 document.getElementById('closeInfo').addEventListener('click', () => { 163 document.getElementById('infoModal').classList.remove('visible'); 164 document.getElementById('overlay').classList.remove('visible'); 165 }); 166 document.getElementById('overlay').addEventListener('click', () => { 167 document.getElementById('infoModal').classList.remove('visible'); 168 document.getElementById('overlay').classList.remove('visible'); 169 }); 170 </script> 171</body> 172 173</html>