feat: add ownership visualization and silo comparison
- show stats (record types, apps) when clicking identity - contrast walled gardens vs atproto ownership - update info modal to emphasize ownership - add visual styling for ownership boxes
···878878 .onboarding-progress span.done {{
879879 background: var(--text-light);
880880 }}
881881+882882+ .stats-box {{
883883+ display: flex;
884884+ gap: 1.5rem;
885885+ margin: 1.5rem 0;
886886+ padding: 1rem;
887887+ background: var(--bg);
888888+ border-radius: 4px;
889889+ border: 1px solid var(--border);
890890+ }}
891891+892892+ .stat {{
893893+ flex: 1;
894894+ text-align: center;
895895+ }}
896896+897897+ .stat-value {{
898898+ font-size: 1.8rem;
899899+ font-weight: 600;
900900+ color: var(--text);
901901+ margin-bottom: 0.25rem;
902902+ }}
903903+904904+ .stat-label {{
905905+ font-size: 0.65rem;
906906+ color: var(--text-light);
907907+ text-transform: uppercase;
908908+ letter-spacing: 0.05em;
909909+ }}
910910+911911+ .ownership-box {{
912912+ margin: 1rem 0;
913913+ padding: 1rem;
914914+ background: var(--bg);
915915+ border-radius: 4px;
916916+ border: 1px solid var(--border);
917917+ }}
918918+919919+ .ownership-box.yours {{
920920+ background: rgba(76, 175, 80, 0.05);
921921+ border-color: rgba(76, 175, 80, 0.3);
922922+ }}
923923+924924+ @media (prefers-color-scheme: dark) {{
925925+ .ownership-box.yours {{
926926+ background: rgba(76, 175, 80, 0.08);
927927+ border-color: rgba(76, 175, 80, 0.4);
928928+ }}
929929+ }}
930930+931931+ .ownership-header {{
932932+ font-size: 0.7rem;
933933+ font-weight: 600;
934934+ color: var(--text);
935935+ margin-bottom: 0.5rem;
936936+ text-transform: uppercase;
937937+ letter-spacing: 0.05em;
938938+ }}
939939+940940+ .ownership-text {{
941941+ font-size: 0.7rem;
942942+ color: var(--text-lighter);
943943+ line-height: 1.5;
944944+ }}
945945+946946+ .ownership-text strong {{
947947+ color: var(--text);
948948+ }}
881949 </style>
882950</head>
883951<body>
···886954887955 <div class="overlay" id="overlay"></div>
888956 <div class="info-modal" id="infoModal">
889889- <h2>@me - your at protocol identity</h2>
890890- <p>in decentralized social networks, you own your identity and your data lives in your personal data server (pds).</p>
891891- <p>third-party applications create records in your repository using different lexicons (data schemas). for example, bluesky creates posts, white wind stores blog entries, tangled.org hosts code repositories, and frontpage aggregates links - all in the same place.</p>
892892- <p>this visualization shows your identity at the center, surrounded by the third-party apps that have created data for you. click an app to see what types of records it stores, then click a record type to see the actual data.</p>
957957+ <h2>@me - your repository</h2>
958958+ <p>on instagram, facebook, or twitter: the platform owns your content. if they ban you, it's all gone. you can't move it, export it, or control who accesses it.</p>
959959+ <p>on atproto: you own everything. your data lives in your personal server. apps like bluesky, whitewind, and frontpage just write to YOUR repository. you can switch apps, move servers, or revoke access anytime.</p>
960960+ <p>click your @ in the center to see what you've built. click any app to see what it's stored in your space.</p>
893961 <button id="closeInfo">got it</button>
894962 <button id="restartTour" onclick="window.restartOnboarding()" style="margin-left: 0.5rem; background: var(--surface-hover);">restart tour</button>
895963 </div>
+42-18
static/app.js
···9393 // User may not have an avatar set
9494 });
95959696+ // Store collections for later use
9797+ let allCollections = [];
9898+9699 // Add identity click handler to show PDS info
97100 document.querySelector('.identity').addEventListener('click', () => {
98101 const detail = document.getElementById('detail');
99102 const pdsHost = pds.replace('https://', '').replace('http://', '');
103103+104104+ // Count total apps
105105+ const appCount = Object.keys(apps).length;
106106+100107 detail.innerHTML = `
101108 <button class="detail-close" id="detailClose">×</button>
102102- <h3>your identity</h3>
103103- <div class="subtitle">decentralized identifier & storage</div>
104104- <div class="tree-item">
105105- <div class="tree-item-header">
106106- <span style="color: var(--text-light);">did</span>
107107- <span style="font-size: 0.6rem; color: var(--text);">${did}</span>
109109+ <h3>your repository</h3>
110110+ <div class="subtitle">what you've built</div>
111111+112112+ <div class="stats-box">
113113+ <div class="stat">
114114+ <div class="stat-value">${allCollections.length}</div>
115115+ <div class="stat-label">record types</div>
108116 </div>
109109- </div>
110110- <div class="tree-item">
111111- <div class="tree-item-header">
112112- <span style="color: var(--text-light);">handle</span>
113113- <span style="font-size: 0.6rem; color: var(--text);">@${handle}</span>
117117+ <div class="stat">
118118+ <div class="stat-value">${appCount}</div>
119119+ <div class="stat-label">apps</div>
114120 </div>
115121 </div>
116116- <div class="tree-item">
117117- <div class="tree-item-header">
118118- <span style="color: var(--text-light);">personal data server</span>
119119- <span style="font-size: 0.6rem; color: var(--text);">${pds}</span>
120120- </div>
122122+123123+ <div class="ownership-box">
124124+ <div class="ownership-header">on walled gardens</div>
125125+ <div class="ownership-text">platform owns your content. account ban = everything gone. no export, no control.</div>
121126 </div>
122122- <div style="margin-top: 1rem; padding: 0.6rem; background: var(--bg); border-radius: 4px; font-size: 0.65rem; line-height: 1.5; color: var(--text-lighter);">
123123- your data lives at <strong style="color: var(--text);">${pdsHost}</strong>. apps like bluesky write to and read from this server. you control @<strong style="color: var(--text);">${handle}</strong> and can move it to a different server anytime.
127127+128128+ <div class="ownership-box yours">
129129+ <div class="ownership-header">on atproto</div>
130130+ <div class="ownership-text">you own it. lives at <strong>${pdsHost}</strong>. move servers, switch apps, export anytime. can't be taken away.</div>
131131+ </div>
132132+133133+ <div style="margin-top: 1.5rem; padding-top: 1rem; border-top: 1px solid var(--border);">
134134+ <div style="font-size: 0.65rem; color: var(--text-light); margin-bottom: 0.5rem;">technical details</div>
135135+ <div class="tree-item">
136136+ <div class="tree-item-header">
137137+ <span style="color: var(--text-light);">did</span>
138138+ <span style="font-size: 0.55rem; color: var(--text);">${did}</span>
139139+ </div>
140140+ </div>
141141+ <div class="tree-item">
142142+ <div class="tree-item-header">
143143+ <span style="color: var(--text-light);">handle</span>
144144+ <span style="font-size: 0.6rem; color: var(--text);">@${handle}</span>
145145+ </div>
146146+ </div>
124147 </div>
125148 `;
126149 detail.classList.add('visible');
···138161 .then(r => r.json())
139162 .then(repo => {
140163 const collections = repo.collections || [];
164164+ allCollections = collections;
141165142166 // Group by app namespace (first two parts of lexicon)
143167 const apps = {};