open source is social v-it.org
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

landing page restructure: lead with problem, add visual contrast

Replaces jargon-heavy intro with clear problem statement, adds full-bleed
architecture contrast SVG (today vs with vit), defines "capability" in one
plain sentence, tightens doctrine excerpt to two paragraphs. Adds social
loop SVG to get-started page. Updates og:image and meta descriptions.

Implements CMO landing page improvement plan (adversarial review feedback).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+368 -13
+27 -12
docs/index.html
··· 4 4 <meta charset="utf-8"> 5 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 6 <title>vit — open source is social</title> 7 - <meta name="description" content="vit is a social network of capabilities — where builders and their agents discover, remix, vet, and ship improvements across a living bazaar of codebases."> 7 + <meta name="description" content="software improvements should flow between projects like conversation — not bottleneck through a single maintainer."> 8 8 <meta property="og:title" content="vit — open source is social"> 9 - <meta property="og:description" content="vit is a social network of capabilities — where builders and their agents discover, remix, vet, and ship improvements across a living bazaar of codebases."> 9 + <meta property="og:description" content="software improvements should flow between projects like conversation — not bottleneck through a single maintainer."> 10 + <meta property="og:image" content="https://v-it.org/vit-architecture-contrast.png"> 10 11 <meta property="og:type" content="website"> 11 12 <link rel="icon" type="image/svg+xml" href="/brand/vit-mark.svg"> 12 13 <style> ··· 114 115 line-height: 1.2; 115 116 } 116 117 118 + .hero-visual { 119 + margin: 1.2em -80px; 120 + } 121 + 122 + .hero-visual img { 123 + width: 100%; 124 + height: auto; 125 + display: block; 126 + } 127 + 128 + @media (max-width: 880px) { 129 + .hero-visual { 130 + margin-left: -20px; 131 + margin-right: -20px; 132 + } 133 + } 134 + 117 135 .cta-row { 118 136 display: flex; 119 137 flex-wrap: wrap; ··· 237 255 </header> 238 256 239 257 <main> 240 - 258 + 241 259 <h2 class="hero">open source is social</h2> 242 - <p>vit is a social network of capabilities — where builders and their agents discover, remix, vet, and ship improvements across a living bazaar of codebases.</p> 260 + <p>software improvements should flow between projects like conversation &mdash; not bottleneck through a single maintainer.</p> 261 + <div class="hero-visual"> 262 + <img src="/vit-architecture-contrast.svg" alt="Architecture contrast: today's hub-and-spoke open source model versus vit's distributed capability mesh"> 263 + </div> 243 264 <p class="cta-row"> 244 265 <a href="/start/">get started in 60 seconds &rarr;</a> 245 266 <a href="https://explore.v-it.org">explore the network &rarr;</a> 246 267 </p> 247 268 <hr> 269 + <p>a capability is a structured change instruction &mdash; what to do, why it matters, how to integrate it. not a diff. not a PR. a social post that humans and agents can both read, evaluate, and remix.</p> 248 270 <section> 249 - <h2>software should live</h2> 250 - <p>vit is a <strong>social system for personalized software</strong> where the unit of exchange is not pull requests, not screenshots, not diffs, not even git.</p> 251 - <p>the unit of exchange is <strong>capability</strong>: structured, attributable, auditable capabilities, published into a network where other builders (and their agents) can <strong>discover it, remix it into their own codebases, vet it locally, vouch for it publicly, and ship new capabilities back into the stream</strong>.</p> 252 - <p>vit is how software becomes <em>organic</em> and <em>yours</em>.</p> 253 - <hr> 254 - <p>most open source codebases today are treated like artifacts: limited maintainers, often abandoned, complicated contribution options.</p> 255 - <p>vit assumes something different:</p> 256 271 <p>a codebase is not a distribution artifact. a codebase is a <strong>living organism</strong> that can adapt to each install, and it deserves a living ecosystem.</p> 257 - <p>the future is not &ldquo;one repo, one roadmap.&rdquo; the future is <strong>many codebases</strong>, each personalized, each living, and all sharing capabilities with each other through a social network that rewards provenance and trust.</p> 272 + <p>the future is not &ldquo;one repo, one roadmap.&rdquo; the future is <strong>many codebases</strong>, each living, all sharing capabilities with each other through a social network that rewards provenance and trust.</p> 258 273 </section> 259 274 <p><a href="/doctrine/">read the full doctrine &rarr;</a></p> 260 275 </main>
+1 -1
docs/start/index.html
··· 266 266 <p>describe what it does, where it applies, and why it matters. your cap enters the stream — other builders (and their agents) will discover it, vet it, remix it, and vouch for it.</p> 267 267 <hr> 268 268 <h2>the full loop</h2> 269 - <p><strong>skim</strong> &rarr; <strong>vet</strong> &rarr; <strong>remix</strong> &rarr; <strong>vouch</strong> &rarr; <strong>ship</strong></p> 269 + <p><img src="/vit-social-loop.svg" alt="The vit social loop: skim, vet, remix, vouch, ship" style="max-width:100%;height:auto;display:block;margin:1em 0"></p> 270 270 <p>that&#39;s the cycle. every verb has a purpose:</p> 271 271 <ul> 272 272 <li><strong>skim</strong> — browse the capability stream</li>
docs/vit-architecture-contrast.png

This is a binary file and will not be displayed.

+276
docs/vit-architecture-contrast.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 440" font-family="system-ui, -apple-system, sans-serif"> 2 + <defs> 3 + <filter id="glow" x="-50%" y="-50%" width="200%" height="200%"> 4 + <feGaussianBlur stdDeviation="4" result="blur"/> 5 + <feMerge> 6 + <feMergeNode in="blur"/> 7 + <feMergeNode in="SourceGraphic"/> 8 + </feMerge> 9 + </filter> 10 + <filter id="dotGlow" x="-100%" y="-100%" width="300%" height="300%"> 11 + <feGaussianBlur stdDeviation="2" result="blur"/> 12 + <feMerge> 13 + <feMergeNode in="blur"/> 14 + <feMergeNode in="SourceGraphic"/> 15 + </feMerge> 16 + </filter> 17 + <filter id="pressure" x="-50%" y="-50%" width="200%" height="200%"> 18 + <feGaussianBlur stdDeviation="8" result="blur"/> 19 + <feMerge> 20 + <feMergeNode in="blur"/> 21 + <feMergeNode in="SourceGraphic"/> 22 + </feMerge> 23 + </filter> 24 + </defs> 25 + 26 + <!-- Background --> 27 + <rect width="800" height="440" fill="#0f1119" rx="12"/> 28 + 29 + <!-- Subtle center divider --> 30 + <line x1="400" y1="55" x2="400" y2="395" stroke="#1a1d2a" stroke-width="1"/> 31 + 32 + <!-- ==================== LEFT SIDE: OLD WORLD ==================== --> 33 + 34 + <text x="195" y="50" text-anchor="middle" font-size="18" font-weight="600" fill="#6b7280" letter-spacing="0.05em">today</text> 35 + 36 + <!-- Pressure halo behind upstream --> 37 + <circle cx="195" cy="122" r="40" fill="none" stroke="#374151" stroke-width="1" opacity="0.2" filter="url(#pressure)"/> 38 + 39 + <!-- Central upstream node --> 40 + <circle cx="195" cy="122" r="28" fill="#1a1d2a" stroke="#6b7280" stroke-width="3"/> 41 + <text x="195" y="119" text-anchor="middle" font-size="9.5" font-weight="700" fill="#9ca3af" letter-spacing="0.04em">upstream</text> 42 + <text x="195" y="131" text-anchor="middle" font-size="7.5" fill="#4b5563">maintainer</text> 43 + 44 + <!-- "wait" badge --> 45 + <g transform="translate(228, 99)"> 46 + <rect x="0" y="0" width="30" height="15" rx="3" fill="#1a1d2a" stroke="#374151" stroke-width="0.8"/> 47 + <text x="15" y="11" text-anchor="middle" font-size="7.5" fill="#4b5563" font-style="italic">wait</text> 48 + </g> 49 + 50 + <!-- Fork positions: 51 + A: 85, 200 → upstream ~173, 140 52 + B: 110, 255 → upstream ~178, 143 53 + C: 155, 290 → upstream ~189, 150 54 + D: 195, 305 → upstream 195, 150 55 + E: 235, 290 → upstream ~201, 150 56 + F: 280, 255 → upstream ~212, 143 57 + G: 305, 200 → upstream ~217, 140 58 + --> 59 + 60 + <!-- Lines from forks to upstream --> 61 + <g stroke="#374151" fill="none" stroke-width="1.2"> 62 + <line x1="85" y1="200" x2="173" y2="140"/> 63 + <line x1="110" y1="255" x2="178" y2="143"/> 64 + <line x1="155" y1="290" x2="189" y2="150"/> 65 + <line x1="195" y1="305" x2="195" y2="150"/> 66 + <line x1="235" y1="290" x2="201" y2="150"/> 67 + <line x1="280" y1="255" x2="212" y2="143"/> 68 + <line x1="305" y1="200" x2="217" y2="140"/> 69 + </g> 70 + 71 + <!-- Chevrons pointing toward upstream 72 + Each chevron: two lines forming a V that opens away from upstream. 73 + Placed at ~35% from fork toward upstream. 74 + Computed: for a line from (fx,fy) to (ux,uy), 75 + point = (fx + 0.35*(ux-fx), fy + 0.35*(uy-fy)) 76 + direction = normalize(ux-fx, uy-fy) 77 + perpendicular = (-dy, dx) 78 + chevron tip = point, wings = point - 5*dir +/- 4*perp 79 + --> 80 + <g stroke="#505868" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"> 81 + <!-- A: fork(85,200)→up(173,140). vec=(88,-60), len=106.5, dir=(0.826,-0.564), perp=(0.564,0.826) 82 + 35% point: (85+30.8, 200-21) = (115.8, 179) 83 + tip = (115.8, 179) 84 + wing1 = (115.8 - 5*0.826 + 4*0.564, 179 - 5*(-0.564) + 4*0.826) = (115.8-4.13+2.26, 179+2.82+3.30) = (113.9, 185.1) 85 + wing2 = (115.8 - 5*0.826 - 4*0.564, 179 - 5*(-0.564) - 4*0.826) = (115.8-4.13-2.26, 179+2.82-3.30) = (109.4, 178.5) 86 + --> 87 + <path d="M114,185 L116,179 L109,179"/> 88 + 89 + <!-- B: fork(110,255)→up(178,143). vec=(68,-112), len=131, dir=(0.519,-0.855), perp=(0.855,0.519) 90 + 35% point: (110+23.8, 255-39.2) = (133.8, 215.8) 91 + tip = (134, 216) 92 + wing1 = (134 - 5*0.519 + 4*0.855, 216 - 5*(-0.855) + 4*0.519) = (134-2.6+3.4, 216+4.3+2.1) = (134.8, 222.4) 93 + wing2 = (134 - 5*0.519 - 4*0.855, 216 - 5*(-0.855) - 4*0.519) = (134-2.6-3.4, 216+4.3-2.1) = (128, 218.2) 94 + --> 95 + <path d="M135,222 L134,216 L128,218"/> 96 + 97 + <!-- C: fork(155,290)→up(189,150). vec=(34,-140), len=144, dir=(0.236,-0.972), perp=(0.972,0.236) 98 + 35% point: (155+11.9, 290-49) = (166.9, 241) 99 + tip = (167, 241) 100 + wing1 = (167 - 5*0.236 + 4*0.972, 241 - 5*(-0.972) + 4*0.236) = (167-1.2+3.9, 241+4.9+0.9) = (169.7, 246.8) 101 + wing2 = (167 - 5*0.236 - 4*0.972, 241 - 5*(-0.972) - 4*0.236) = (167-1.2-3.9, 241+4.9-0.9) = (161.9, 245) 102 + --> 103 + <path d="M170,247 L167,241 L162,245"/> 104 + 105 + <!-- D: fork(195,305)→up(195,150). vec=(0,-155), dir=(0,-1), perp=(1,0) 106 + 35% point: (195, 305-54.25) = (195, 250.75) 107 + tip = (195, 251) 108 + wing1 = (195 - 0 + 4, 251 + 5 + 0) = (199, 256) 109 + wing2 = (195 - 0 - 4, 251 + 5 - 0) = (191, 256) 110 + --> 111 + <path d="M199,256 L195,251 L191,256"/> 112 + 113 + <!-- E: fork(235,290)→up(201,150). vec=(-34,-140), dir=(-0.236,-0.972), perp=(0.972,-0.236) 114 + 35% point: (235-11.9, 290-49) = (223.1, 241) 115 + tip = (223, 241) 116 + wing1 = (223 + 5*0.236 + 4*0.972, 241 + 5*0.972 - 4*0.236) = (223+1.2+3.9, 241+4.9-0.9) = (228.1, 245) 117 + wing2 = (223 + 5*0.236 - 4*0.972, 241 + 5*0.972 + 4*0.236) = (223+1.2-3.9, 241+4.9+0.9) = (220.3, 246.8) 118 + --> 119 + <path d="M228,245 L223,241 L220,247"/> 120 + 121 + <!-- F: fork(280,255)→up(212,143). vec=(-68,-112), dir=(-0.519,-0.855), perp=(0.855,-0.519) 122 + 35% point: (280-23.8, 255-39.2) = (256.2, 215.8) 123 + tip = (256, 216) 124 + wing1 = (256 + 5*0.519 + 4*0.855, 216 + 5*0.855 - 4*0.519) = (256+2.6+3.4, 216+4.3-2.1) = (262, 218.2) 125 + wing2 = (256 + 5*0.519 - 4*0.855, 216 + 5*0.855 + 4*0.519) = (256+2.6-3.4, 216+4.3+2.1) = (255.2, 222.4) 126 + --> 127 + <path d="M262,218 L256,216 L255,222"/> 128 + 129 + <!-- G: fork(305,200)→up(217,140). vec=(-88,-60), dir=(-0.826,-0.564), perp=(0.564,-0.826) 130 + 35% point: (305-30.8, 200-21) = (274.2, 179) 131 + tip = (274, 179) 132 + wing1 = (274 + 5*0.826 + 4*0.564, 179 + 5*0.564 - 4*0.826) = (274+4.1+2.3, 179+2.8-3.3) = (280.4, 178.5) 133 + wing2 = (274 + 5*0.826 - 4*0.564, 179 + 5*0.564 + 4*0.826) = (274+4.1-2.3, 179+2.8+3.3) = (275.8, 185.1) 134 + --> 135 + <path d="M280,179 L274,179 L276,185"/> 136 + </g> 137 + 138 + <!-- Fork nodes --> 139 + <g> 140 + <circle cx="85" cy="208" r="12" fill="#1a1d2a" stroke="#4b5563" stroke-width="1.3"/> 141 + <text x="85" y="211" text-anchor="middle" font-size="7.5" fill="#6b7280">fork</text> 142 + 143 + <circle cx="110" cy="263" r="12" fill="#1a1d2a" stroke="#4b5563" stroke-width="1.3"/> 144 + <text x="110" y="266" text-anchor="middle" font-size="7.5" fill="#6b7280">fork</text> 145 + 146 + <circle cx="155" cy="298" r="12" fill="#1a1d2a" stroke="#4b5563" stroke-width="1.3"/> 147 + <text x="155" y="301" text-anchor="middle" font-size="7.5" fill="#6b7280">fork</text> 148 + 149 + <circle cx="195" cy="313" r="12" fill="#1a1d2a" stroke="#4b5563" stroke-width="1.3"/> 150 + <text x="195" y="316" text-anchor="middle" font-size="7.5" fill="#6b7280">fork</text> 151 + 152 + <circle cx="235" cy="298" r="12" fill="#1a1d2a" stroke="#4b5563" stroke-width="1.3"/> 153 + <text x="235" y="301" text-anchor="middle" font-size="7.5" fill="#6b7280">fork</text> 154 + 155 + <circle cx="280" cy="263" r="12" fill="#1a1d2a" stroke="#4b5563" stroke-width="1.3"/> 156 + <text x="280" y="266" text-anchor="middle" font-size="7.5" fill="#6b7280">fork</text> 157 + 158 + <circle cx="305" cy="208" r="12" fill="#1a1d2a" stroke="#4b5563" stroke-width="1.3"/> 159 + <text x="305" y="211" text-anchor="middle" font-size="7.5" fill="#6b7280">fork</text> 160 + </g> 161 + 162 + <!-- Stale/abandoned forks --> 163 + <g opacity="0.4"> 164 + <line x1="55" y1="168" x2="172" y2="134" stroke="#252836" stroke-width="0.7" stroke-dasharray="3,4"/> 165 + <circle cx="47" cy="170" r="7" fill="none" stroke="#252836" stroke-width="1" stroke-dasharray="3,3"/> 166 + 167 + <line x1="340" y1="173" x2="218" y2="134" stroke="#252836" stroke-width="0.7" stroke-dasharray="3,4"/> 168 + <circle cx="348" cy="175" r="7" fill="none" stroke="#252836" stroke-width="1" stroke-dasharray="3,3"/> 169 + 170 + <line x1="280" y1="340" x2="201" y2="150" stroke="#252836" stroke-width="0.7" stroke-dasharray="3,4"/> 171 + <circle cx="285" cy="345" r="7" fill="none" stroke="#252836" stroke-width="1" stroke-dasharray="3,3"/> 172 + </g> 173 + 174 + <!-- Labels --> 175 + <text x="125" y="168" text-anchor="middle" font-size="8.5" fill="#4b5563" font-style="italic">PR</text> 176 + <text x="268" y="168" text-anchor="middle" font-size="8.5" fill="#4b5563" font-style="italic">PR</text> 177 + <text x="215" y="232" text-anchor="middle" font-size="8.5" fill="#4b5563" font-style="italic">issue</text> 178 + <text x="90" y="240" text-anchor="middle" font-size="8.5" fill="#4b5563" font-style="italic">PR</text> 179 + 180 + <!-- Left caption --> 181 + <text x="195" y="392" text-anchor="middle" font-size="10.5" fill="#4b5563">clone · file issues · fork · merge PRs · wait for releases</text> 182 + 183 + <!-- ==================== EVOLUTION ARROW ==================== --> 184 + <g transform="translate(400, 220)"> 185 + <circle r="16" fill="#141722" stroke="#252836" stroke-width="1"/> 186 + <path d="M-5.5 0 L4.5 0 M1.5 -3.5 L5.5 0 L1.5 3.5" stroke="#4b5563" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/> 187 + </g> 188 + 189 + <!-- ==================== RIGHT SIDE: NEW WORLD ==================== --> 190 + 191 + <text x="600" y="50" text-anchor="middle" font-size="18" font-weight="600" fill="#059669" letter-spacing="0.05em">with vit</text> 192 + 193 + <!-- Mesh connections (slightly increased opacity for density) --> 194 + <g stroke="#06D6A0" stroke-width="0.8" opacity="0.25"> 195 + <line x1="505" y1="120" x2="618" y2="95"/> 196 + <line x1="618" y1="95" x2="710" y2="130"/> 197 + <line x1="505" y1="120" x2="465" y2="210"/> 198 + <line x1="505" y1="120" x2="575" y2="200"/> 199 + <line x1="618" y1="95" x2="575" y2="200"/> 200 + <line x1="618" y1="95" x2="685" y2="195"/> 201 + <line x1="710" y1="130" x2="685" y2="195"/> 202 + <line x1="710" y1="130" x2="740" y2="260"/> 203 + <line x1="465" y1="210" x2="575" y2="200"/> 204 + <line x1="575" y1="200" x2="685" y2="195"/> 205 + <line x1="685" y1="195" x2="740" y2="260"/> 206 + <line x1="465" y1="210" x2="500" y2="305"/> 207 + <line x1="575" y1="200" x2="500" y2="305"/> 208 + <line x1="575" y1="200" x2="620" y2="315"/> 209 + <line x1="685" y1="195" x2="620" y2="315"/> 210 + <line x1="685" y1="195" x2="715" y2="300"/> 211 + <line x1="740" y1="260" x2="715" y2="300"/> 212 + <line x1="500" y1="305" x2="620" y2="315"/> 213 + <line x1="620" y1="315" x2="715" y2="300"/> 214 + <line x1="505" y1="120" x2="685" y2="195"/> 215 + <line x1="710" y1="130" x2="620" y2="315"/> 216 + <line x1="465" y1="210" x2="620" y2="315"/> 217 + <line x1="740" y1="260" x2="620" y2="315"/> 218 + </g> 219 + 220 + <!-- Capability dots --> 221 + <g> 222 + <circle cx="558" cy="109" r="2.5" fill="#06D6A0" opacity="0.8" filter="url(#dotGlow)"/> 223 + <circle cx="668" cy="110" r="2" fill="#34D399" opacity="0.7" filter="url(#dotGlow)"/> 224 + <circle cx="488" cy="162" r="2.5" fill="#06D6A0" opacity="0.7" filter="url(#dotGlow)"/> 225 + <circle cx="545" cy="155" r="2" fill="#34D399" opacity="0.75" filter="url(#dotGlow)"/> 226 + <circle cx="648" cy="148" r="2.5" fill="#06D6A0" opacity="0.65" filter="url(#dotGlow)"/> 227 + <circle cx="700" cy="162" r="2" fill="#34D399" opacity="0.7" filter="url(#dotGlow)"/> 228 + <circle cx="525" cy="205" r="2.5" fill="#06D6A0" opacity="0.75" filter="url(#dotGlow)"/> 229 + <circle cx="632" cy="197" r="2" fill="#34D399" opacity="0.8" filter="url(#dotGlow)"/> 230 + <circle cx="718" cy="228" r="2.5" fill="#06D6A0" opacity="0.7" filter="url(#dotGlow)"/> 231 + <circle cx="485" cy="258" r="2" fill="#34D399" opacity="0.65" filter="url(#dotGlow)"/> 232 + <circle cx="543" cy="252" r="2.5" fill="#06D6A0" opacity="0.75" filter="url(#dotGlow)"/> 233 + <circle cx="655" cy="258" r="2" fill="#34D399" opacity="0.7" filter="url(#dotGlow)"/> 234 + <circle cx="728" cy="280" r="2.5" fill="#06D6A0" opacity="0.8" filter="url(#dotGlow)"/> 235 + <circle cx="560" cy="310" r="2" fill="#34D399" opacity="0.7" filter="url(#dotGlow)"/> 236 + <circle cx="670" cy="307" r="2.5" fill="#06D6A0" opacity="0.75" filter="url(#dotGlow)"/> 237 + <circle cx="600" cy="148" r="2" fill="#06D6A0" opacity="0.5" filter="url(#dotGlow)"/> 238 + </g> 239 + 240 + <!-- Mesh nodes --> 241 + <g> 242 + <circle cx="505" cy="120" r="13" fill="#0a2a1f" stroke="#06D6A0" stroke-width="1.5" filter="url(#glow)"/> 243 + <circle cx="618" cy="95" r="13" fill="#0a2a1f" stroke="#06D6A0" stroke-width="1.5" filter="url(#glow)"/> 244 + <circle cx="710" cy="130" r="13" fill="#0a2a1f" stroke="#06D6A0" stroke-width="1.5" filter="url(#glow)"/> 245 + <circle cx="465" cy="210" r="13" fill="#0a2a1f" stroke="#06D6A0" stroke-width="1.5" filter="url(#glow)"/> 246 + <circle cx="575" cy="200" r="13" fill="#0a2a1f" stroke="#06D6A0" stroke-width="1.5" filter="url(#glow)"/> 247 + <circle cx="685" cy="195" r="13" fill="#0a2a1f" stroke="#06D6A0" stroke-width="1.5" filter="url(#glow)"/> 248 + <circle cx="740" cy="260" r="13" fill="#0a2a1f" stroke="#06D6A0" stroke-width="1.5" filter="url(#glow)"/> 249 + <circle cx="500" cy="305" r="13" fill="#0a2a1f" stroke="#06D6A0" stroke-width="1.5" filter="url(#glow)"/> 250 + <circle cx="620" cy="315" r="13" fill="#0a2a1f" stroke="#06D6A0" stroke-width="1.5" filter="url(#glow)"/> 251 + <circle cx="715" cy="300" r="13" fill="#0a2a1f" stroke="#06D6A0" stroke-width="1.5" filter="url(#glow)"/> 252 + </g> 253 + 254 + <!-- Inner alive dots --> 255 + <g fill="#06D6A0" opacity="0.45"> 256 + <circle cx="505" cy="120" r="3.5"/> 257 + <circle cx="618" cy="95" r="3.5"/> 258 + <circle cx="710" cy="130" r="3.5"/> 259 + <circle cx="465" cy="210" r="3.5"/> 260 + <circle cx="575" cy="200" r="3.5"/> 261 + <circle cx="685" cy="195" r="3.5"/> 262 + <circle cx="740" cy="260" r="3.5"/> 263 + <circle cx="500" cy="305" r="3.5"/> 264 + <circle cx="620" cy="315" r="3.5"/> 265 + <circle cx="715" cy="300" r="3.5"/> 266 + </g> 267 + 268 + <!-- Right caption --> 269 + <text x="600" y="392" text-anchor="middle" font-size="10.5" fill="#059669">capabilities flow · every repo lives · no upstream</text> 270 + 271 + <!-- VIT MARK --> 272 + <g transform="translate(758, 406) scale(0.65)" opacity="0.35"> 273 + <circle cx="16" cy="5.5" r="3" fill="#06D6A0"/> 274 + <path d="M5.5 10 L16 26 L26.5 10" stroke="#06D6A0" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/> 275 + </g> 276 + </svg>
+64
docs/vit-social-loop.svg
··· 1 + <svg viewBox="0 0 800 490" xmlns="http://www.w3.org/2000/svg"> 2 + <style> 3 + text { font-family: system-ui, -apple-system, sans-serif; } 4 + </style> 5 + 6 + <defs> 7 + <marker id="arr" markerWidth="10" markerHeight="7" refX="8" refY="3.5" orient="auto"> 8 + <path d="M1.5,1 L8,3.5 L1.5,6" fill="none" stroke="#06D6A0" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/> 9 + </marker> 10 + </defs> 11 + 12 + <!-- 13 + All arcs: segments of one circle, r=185, center=(400,255). 14 + Labels sit inside at r=130 — 55px clearance from arcs. 15 + 13° gap on each side of each vertex. 16 + --> 17 + 18 + <!-- vertex dots — on the arc ring, anchoring each label to the flow --> 19 + <g fill="#06D6A0"> 20 + <circle cx="400" cy="70" r="4.5"/> <!-- skim --> 21 + <circle cx="576" cy="198" r="4.5"/> <!-- vet --> 22 + <circle cx="509" cy="405" r="4.5"/> <!-- remix --> 23 + <circle cx="291" cy="405" r="4.5"/> <!-- vouch --> 24 + <circle cx="224" cy="198" r="4.5"/> <!-- ship --> 25 + </g> 26 + 27 + <!-- flow arcs — clockwise: skim → vet → remix → vouch → ship → skim --> 28 + <g fill="none" stroke="#06D6A0" stroke-width="2.5" stroke-linecap="round"> 29 + <path d="M442,75 A185,185 0 0 1 559,160" marker-end="url(#arr)"/> 30 + <path d="M584,239 A185,185 0 0 1 540,376" marker-end="url(#arr)"/> 31 + <path d="M472,425 A185,185 0 0 1 328,425" marker-end="url(#arr)"/> 32 + <path d="M260,376 A185,185 0 0 1 216,239" marker-end="url(#arr)"/> 33 + <path d="M241,160 A185,185 0 0 1 358,75" marker-end="url(#arr)"/> 34 + </g> 35 + 36 + <!-- skim — top --> 37 + <text x="400" y="123" text-anchor="middle" font-size="26" font-weight="700" fill="#059669" letter-spacing="1">skim</text> 38 + <text x="400" y="143" text-anchor="middle" font-size="13" fill="#6b7280">browse what others share</text> 39 + 40 + <!-- vet — upper right --> 41 + <text x="524" y="213" text-anchor="middle" font-size="26" font-weight="700" fill="#059669" letter-spacing="1">vet</text> 42 + <text x="524" y="233" text-anchor="middle" font-size="13" fill="#6b7280">check it</text> 43 + 44 + <!-- remix — lower right --> 45 + <text x="476" y="358" text-anchor="middle" font-size="26" font-weight="700" fill="#059669" letter-spacing="1">remix</text> 46 + <text x="476" y="378" text-anchor="middle" font-size="13" fill="#6b7280">make it yours</text> 47 + 48 + <!-- vouch — lower left --> 49 + <text x="324" y="358" text-anchor="middle" font-size="26" font-weight="700" fill="#059669" letter-spacing="1">vouch</text> 50 + <text x="324" y="378" text-anchor="middle" font-size="13" fill="#6b7280">endorse what works</text> 51 + 52 + <!-- ship — upper left --> 53 + <text x="276" y="213" text-anchor="middle" font-size="26" font-weight="700" fill="#059669" letter-spacing="1">ship</text> 54 + <text x="276" y="233" text-anchor="middle" font-size="13" fill="#6b7280">share it back</text> 55 + 56 + <!-- center tagline --> 57 + <text x="400" y="268" text-anchor="middle" font-size="18" font-weight="600" fill="#059669" letter-spacing="0.5">open source is social</text> 58 + 59 + <!-- vit mark — subtle, bottom right --> 60 + <g transform="translate(755, 458) scale(0.55)" opacity="0.25"> 61 + <circle cx="16" cy="5.5" r="3" fill="#06D6A0"/> 62 + <path d="M5.5 10 L16 26 L26.5 10" stroke="#06D6A0" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/> 63 + </g> 64 + </svg>