PageSourceSearch

https://carpool.school/families/

html carpool.school collected 2026-10-02 00:40:21 UTC 63,339 bytes, 1,092 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3<head>
4  <meta charset="utf-8" />
5  <meta name="viewport" content="width=device-width, initial-scale=1" />
6  <title>For Families | Carpool.School</title>
7  <meta name="description" content="Connect with families in your community. Find nearby parents, coordinate carpools, and stay in the loop. Free for families, forever." />
8  
9  <link rel="icon" type="image/png" href="/assets/images/favicon.png" />
10  
11
12  
13  
13<script type="application/ld+json">
14  {
15    "@context": "https://schema.org",
16    "@type": "Organization",
17    "name": "Carpool.School",
18    "url": "https://carpool.school",
19    "logo": "https://carpool.school/assets/images/logo-mark.png",
20    "sameAs": [
21      "https://www.linkedin.com/company/carpool-school/",
22      "https://www.facebook.com/profile.php?id=100089203043240",
23      "https://twitter.com/CarpoolSchool",
24      "https://www.instagram.com/carpool.school/"
25    ]
26  }
27  </script>
27
28
29  
30  
31  
32  <meta property="og:type" content="website" />
33  <meta property="og:title" content="For Families | Carpool.School" />
34  <meta property="og:description" content="Connect with families in your community. Find nearby parents, coordinate carpools, and stay in the loop. Free for families, forever." />
35  <meta property="og:image" content="https://carpool.school/assets/images/og-card.png" />
36  <meta name="twitter:card" content="summary_large_image" />
37  <meta name="twitter:title" content="For Families" />
38  <meta name="twitter:description" content="Connect with families in your community. Find nearby parents, coordinate carpools, and stay in the loop. Free for families, forever." />
39  <meta name="twitter:image" content="https://carpool.school/assets/images/og-card.png" />
40
41  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=Fraunces:ital,opsz,wght@0,9..144,400..600;1,9..144,400..600&display=swap" rel="stylesheet" />
42  <link rel="stylesheet" href="/assets/styles.6853c22e78.css" />
43
44  
45<script>
46  ;(function (w, d, s, l, i) {
47    w[l] = w[l] || []
48    w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' })
49    var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''
50    j.async = true
51    j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl
52    f.parentNode.insertBefore(j, f)
53  })(window, document, 'script', 'dataLayer', 'GTM-56VQSNS')
54</script>
54
55
56</head>
57<body style="padding-top:68px">
vendor: 70 bytes, lines 57-58
57
58  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
58GTM-56VQSNS
vendor: 91 bytes, lines 58-62
58" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
59
60
61  
62  
63<nav class="cs-nav">
64  <div class="nav-inner">
65    <button id="menu-btn" class="nav-menu-btn" aria-label="Toggle menu">
66      <svg id="menu-icon" width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"/></svg>
67    </button>
68    <a href="/" class="brand-mark">
69      <img src="/assets/images/logo-mark.png" alt="">
70      <span class="logo-text">Carpool.School</span>
71    </a>
72    
73    
74    <ul class="nav-links">
75      <li><a href="/families/" aria-current="page">Families</a></li>
76      <li><a href="/schools/">Schools &amp; Organizations</a></li>
77      <li><a href="/#pricing">Pricing</a></li>
78      <li><a href="/blog/">Blog</a></li>
79    </ul>
80    
81    <div class="nav-right">
82      
83      <div class="nav-signed-out" data-nav-signed-out>
84        <a href="https://app.carpool.school/signin" class="nav-cta outline" data-app-href="/signin">Sign in</a>
85        <a href="https://app.carpool.school/signup" class="nav-cta" data-app-href="/signup" data-track data-event="signup_click" data-location="nav">
86          Get started
87          <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><path d="M5 12h14M13 5l7 7-7 7"/></svg>
88        </a>
89      </div>
90      
91      <div class="nav-identity-wrap hidden" data-nav-identity>
92        <button type="button" class="nav-identity" data-nav-identity-trigger aria-haspopup="menu" aria-expanded="false">
93          <span class="nav-identity-avatar" data-nav-identity-initials></span>
94          <span class="nav-identity-name nav-identity-name-full" data-nav-identity-name-full></span>
95          <span class="nav-identity-name nav-identity-name-short" data-nav-identity-name-short></span>
96          <svg class="nav-identity-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
97        </button>
98        <div class="nav-identity-menu hidden" data-nav-identity-menu role="menu">
99          <a role="menuitem" data-nav-identity-account>
100            <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
101            Account
102          </a>
103          <a role="menuitem" data-nav-identity-signout>
104            <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><polyline points="16 17 21 12 16 7"/><line x1="21" y1="12" x2="9" y2="12"/></svg>
105            Sign out
106          </a>
107        </div>
108      </div>
109    </div>
110  </div>
111</nav>
112
113<div id="mobile-menu" class="cs-nav-mobile hidden">
114  <nav>
115    
116    <a href="/families/">Families</a>
117    <a href="/schools/">Schools &amp; Organizations</a>
118    <a href="/#pricing">Pricing</a>
119    <a href="/blog/">Blog</a>
120    
121    <a href="https://app.carpool.school/signin" data-app-href="/signin">Sign in</a>
122  </nav>
123</div>
124
125
126  
127<div class="cs-home">
128
129  <!-- SUBPAGE HEADER -->
130  <section class="subhead">
131    <div class="container">
132      <span class="hero-eyebrow">
133        Member-only family communities
134      </span>
135      <h1>Find the families<br><span class="serif">in your child's</span> <span class="hl">community.</span></h1>
136      <p class="sub-lead">Connect with families at your <b>school, daycare, team, or camp</b>. Coordinate carpools, pickups, and activities in one place.</p>
137      <div class="cta-row">
138        <a href="https://apps.apple.com/app/id6443997462" class="btn-primary" data-track data-event="download_click" data-location="families_hero" data-platform="ios">Download for iOS
139          <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><path d="M5 12h14M13 5l7 7-7 7"/></svg>
140        </a>
141        <a href="https://play.google.com/store/apps/details?id=school.carpool" class="btn-secondary" data-track data-event="download_click" data-location="families_hero" data-platform="android">Get on Android</a>
142      </div>
143      <div class="hero-fineprint"><span><b>Free</b> for families</span><span class="dot"></span><span>Private to your community</span></div>
144    </div>
145  </section>
146
147  <!-- TRUST BAND -->
148  <section class="trust">
149    <div class="container">
150      <div class="trust-inner">
151        <span class="trust-label">Communities on Carpool.School</span>
152        <div class="trust-scroll">
153          <div class="trust-schools" data-communities-band></div>
154        </div>
155        <p class="trust-honesty">Parent-led communities are started by families. Organizations can claim their community and verify families against an official roster.</p>
156      </div>
157    </div>
158  </section>
159
160  <!-- WALKTHROUGH -->
161  <section class="s pillars" id="features">
162    <div class="container">
163      <div class="s-head">
164        <span class="eyebrow center">How families use Carpool.School</span>
165        <h2>From your first ride to <span class="serif">year-long carpools</span>.</h2>
166        <p>Download the app, say hello to nearby families, meet up, then connect and carpool.</p>
167      </div>
168
169      <div class="walk-stack">
170
171        <!-- 01 — Download the app -->
172        <div class="walk-row">
173          <div class="walk-text">
174            <div class="walk-step">
175              <div class="ico">
176                <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="2" width="14" height="20" rx="2"/><line x1="12" y1="18" x2="12.01" y2="18"/></svg>
177              </div>
178            </div>
179            <h3>Download the <span class="serif">app</span>.</h3>
180            <p>Sign in with your phone number. See nearby families on the same routes, and post a morning drop-off or afternoon pickup request.</p>
181            <p><b>The fastest way to find nearby families on the same routes.</b></p>
182          </div>
183          <div class="walk-phone">
184            <div class="phone">
185              <div class="screen">
186                <img src="/assets/images/app/request.webp" alt="Post a new request and see nearby families" loading="lazy">
187              </div>
188            </div>
189          </div>
190        </div>
191
192        <!-- 02 — Start a conversation -->
193        <div class="walk-row reverse">
194          <div class="walk-text">
195            <div class="walk-step">
196              <div class="ico">
197                <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>
198              </div>
199            </div>
200            <h3>Say <span class="serif">hello</span>.</h3>
201            <p>Browse families near you and message anyone whose location or schedule looks promising, or give a thumbs-up to a posted request. It's just a chat, not a commitment.</p>
202            <p><b>No public feed. No social media noise.</b></p>
203          </div>
204          <div class="walk-phone">
205            <div class="phone">
206              <div class="screen">
207                <div class="mock">
208                  <div class="dot"></div>
209                  <div class="mock-status"><span>9:41</span><span class="right">•••</span></div>
210                  <div class="mock-head">
211                    <span class="back">‹</span>
212                    <div class="ttl"><b>Soccer Moms</b><small>12 members</small></div>
213                    <span class="more">⋯</span>
214                  </div>
215                  <div class="mock-chat">
216                    <div>
217                      <div class="who">Jennifer L.</div>
218                      <div class="msg"><div class="av" style="background:#d3b89a"></div><div class="bubble">Does anyone need a ride to practice today?</div></div>
219                      <div class="time">8:31 AM</div>
220                    </div>
221                    <div>
222                      <div class="msg me"><div class="bubble">Yes! I can help.</div></div>
223                      <div class="time">8:32 AM ✓</div>
224                    </div>
225                    <div>
226                      <div class="who">Sarah M.</div>
227                      <div class="msg"><div class="av" style="background:#c9a584"></div><div class="bubble">I can also help on Tuesday.</div></div>
228                      <div class="time">8:33 AM</div>
229                    </div>
230                  </div>
231                </div>
232              </div>
233            </div>
234          </div>
235        </div>
236
237        <!-- 03 — Connect with families -->
238        <div class="walk-row">
239          <div class="walk-text">
240            <div class="walk-step">
241              <div class="ico">
242                <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M19 8v6M22 11h-6"/></svg>
243              </div>
244            </div>
245            <h3>Connect with <span class="serif">families you trust</span>.</h3>
246            <p>Connecting is mutual - once they accept, you can assign each other as drivers. Meeting up first is a good way to know it's the right fit.</p>
247            <p><b>Only connected families can build a schedule together.</b></p>
248          </div>
249          <div class="walk-phone">
250            <div class="phone">
251              <div class="screen">
252                <img src="/assets/images/app/connect.webp" alt="Send a connect request to another family" loading="lazy">
253              </div>
254            </div>
255          </div>
256        </div>
257
258        <!-- 04 — Carpool -->
259        <div class="walk-row reverse">
260          <div class="walk-text">
261            <div class="walk-step">
262              <div class="ico">
263                <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="18" rx="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg>
264              </div>
265            </div>
266            <h3><span class="serif">Carpool</span>.</h3>
267            <p>Share your driving schedules, take turns driving, and track pickups. No more "who's driving today?" texts.</p>
268            <p><b>Everything you need, in one place.</b></p>
269          </div>
270          <div class="walk-phone">
271            <div class="phone">
272              <div class="screen">
273                <img src="/assets/images/app/schedule.webp" alt="Schedule and recurring plans" loading="lazy">
274              </div>
275            </div>
276          </div>
277        </div>
278
279      </div>
280    </div>
281  </section>
282
283  <!-- HOW TO JOIN (4-step) -->
284  <section class="s" id="how">
285    <div class="container">
286      <div class="s-head">
287        <span class="eyebrow center">Getting started</span>
288        <h2>How to <span class="serif">join</span>.</h2>
289        <p>Communities are started by schools, organizations, PTAs, or parents. Joining your community is quick and free.</p>
290      </div>
291      <div class="how-grid how-grid--4">
292        <div class="step">
293          <div class="step-num">01</div>
294          <div class="step-ico">
295            <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><polyline points="3 7 12 13 21 7"/></svg>
296          </div>
297          <div class="step-body">
298            <h3>Get an invite</h3>
299            <p>Receive an invite link from your community.</p>
300          </div>
301        </div>
302        <div class="step">
303          <div class="step-num">02</div>
304          <div class="step-ico">
305            <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><line x1="20" y1="8" x2="20" y2="14"/><line x1="23" y1="11" x2="17" y2="11"/></svg>
306          </div>
307          <div class="step-body">
308            <h3>Create your account</h3>
309            <p>Verify your phone and build your family profile.</p>
310          </div>
311        </div>
312        <div class="step">
313          <div class="step-num">03</div>
314          <div class="step-ico">
315            <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>
316          </div>
317          <div class="step-body">
318            <h3>Join your community</h3>
319            <p>See the families, groups, and requests connected to your school or activity.</p>
320          </div>
321        </div>
322        <div class="step">
323          <div class="step-num">04</div>
324          <div class="step-ico step-ico-trio">
325            <span class="mini"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg></span>
326            <span class="mini"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="18" rx="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg></span>
327            <span class="mini"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><path d="M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0z"/><circle cx="12" cy="10" r="3"/></svg></span>
328          </div>
329          <div class="step-body">
330            <h3>Coordinate rides</h3>
331            <p>Message families, compare schedules, and build carpools that work for your family.</p>
332          </div>
333        </div>
334      </div>
335    </div>
336  </section>
337
338  <!-- PRIVACY & SAFETY -->
339  <section class="s trust-edit" id="trust">
340    <div class="container">
341      <div class="s-head">
342        <span class="eyebrow center light">Privacy &amp; safety</span>
343        <h2>Built around <span class="serif">your family</span>.</h2>
344        <p>You choose who sees your profile, who you connect with, and when. We never sell your information.</p>
345      </div>
346      <div class="trust-grid trust-grid--3col">
347
348        <!-- Card 1: Private by default -->
349        <div class="trust-card">
350          <div class="trust-head">
351            <div class="ti">
352              <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2 4 5v6c0 5 3.5 9 8 11 4.5-2 8-6 8-11V5l-8-3z"/>
352<rect x="9" y="11" width="6" height="5" rx="1"/><path d="M10.5 11V9.5a1.5 1.5 0 0 1 3 0V11"/></svg>
353            </div>
354            <h3>Private<br>by default</h3>
355          </div>
356          <div class="trust-illo" aria-hidden="true">
357            <svg viewBox="0 0 320 170" preserveAspectRatio="xMidYMid meet">
358              <defs>
359                <radialGradient id="glow1" cx="50%" cy="55%" r="40%">
360                  <stop offset="0%" stop-color="#ffc904" stop-opacity=".55"/>
361                  <stop offset="60%" stop-color="#ffc904" stop-opacity=".08"/>
362                  <stop offset="100%" stop-color="#ffc904" stop-opacity="0"/>
363                </radialGradient>
364              </defs>
365              <g stroke="rgba(255,255,255,.07)" stroke-width="1">
366                <path d="M40 130 L160 60 L280 130"/>
367                <path d="M40 100 L160 30 L280 100"/>
368                <path d="M40 70 L160 0"/>
369                <path d="M280 70 L160 0"/>
370                <path d="M40 70 L40 130"/>
371                <path d="M280 70 L280 130"/>
372                <path d="M160 0 L160 60"/>
373              </g>
374              <ellipse cx="160" cy="100" rx="110" ry="40" fill="url(#glow1)"/>
375              <g fill="#1c2536" stroke="rgba(255,255,255,.12)" stroke-width="1" stroke-linejoin="round">
376                <g transform="translate(50,90)">
377                  <path d="M0 14 L14 0 L28 14 L28 30 L0 30 Z"/>
378                  <rect x="11" y="18" width="6" height="12" fill="#ffc904" fill-opacity=".55" stroke="none"/>
379                </g>
380                <g transform="translate(244,90)">
381                  <path d="M0 14 L14 0 L28 14 L28 30 L0 30 Z"/>
382                  <rect x="11" y="18" width="6" height="12" fill="#ffc904" fill-opacity=".35" stroke="none"/>
383                </g>
384                <g transform="translate(95,55)">
385                  <path d="M0 12 L12 0 L24 12 L24 26 L0 26 Z"/>
386                  <rect x="9" y="15" width="6" height="11" fill="#ffc904" fill-opacity=".25" stroke="none"/>
387                </g>
388                <g transform="translate(205,55)">
389                  <path d="M0 12 L12 0 L24 12 L24 26 L0 26 Z"/>
390                  <rect x="9" y="15" width="6" height="11" fill="#ffc904" fill-opacity=".45" stroke="none"/>
391                </g>
392              </g>
393              <g transform="translate(160,72)">
394                <path d="M0 -8 C-14 -8 -22 2 -22 14 C-22 26 -10 38 0 50 C10 38 22 26 22 14 C22 2 14 -8 0 -8 Z" fill="#0b1220" stroke="#ffc904" stroke-width="2"/>
395                <circle cx="0" cy="14" r="9" fill="#ffc904"/>
396                <circle cx="0" cy="14" r="15" fill="#ffc904" fill-opacity=".15"/>
397              </g>
398            </svg>
399          </div>
400          <hr>
401          <ul class="trust-list">
402            <li>
403              <span class="chk"></span>
404              <div><b>Community-scoped</b><span>Only members of your community can see your profile.</span></div>
405            </li>
406            <li>
407              <span class="chk"></span>
408              <div><b>No exact address</b><span>Maps show a neighborhood pin. Your address is never shown.</span></div>
409            </li>
410            <li>
411              <span class="chk"></span>
412              <div><b>Never sold</b><span>Your data is never sold to advertisers, brokers, or third parties.</span></div>
413            </li>
414          </ul>
415        </div>
416
417        <!-- Card 2: Family controlled -->
418        <div class="trust-card">
419          <div class="trust-head">
420            <div class="ti">
421              <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="8" r="3"/><circle cx="17" cy="9" r="2.5"/><path d="M3 20c0-3 2.7-5 6-5s6 2 6 5"/><path d="M14 19c.4-2 2.1-3.2 4-3.2 2 0 3.5 1.2 3.9 3.2"/></svg>
422            </div>
423            <h3>Family<br>controlled</h3>
424          </div>
425          <div class="trust-illo" aria-hidden="true">
426            <svg viewBox="0 0 320 170" preserveAspectRatio="xMidYMid meet">
427              <defs>
428                <radialGradient id="glow2" cx="50%" cy="55%" r="45%">
429                  <stop offset="0%" stop-color="#ffc904" stop-opacity=".22"/>
429
430                  <stop offset="100%" stop-color="#ffc904" stop-opacity="0"/>
431                </radialGradient>
432              </defs>
433              <ellipse cx="160" cy="110" rx="140" ry="50" fill="url(#glow2)"/>
434              <g transform="translate(80,38)">
435                <circle cx="0" cy="0" r="20" fill="#2a3447" stroke="rgba(255,255,255,.12)"/>
436                <circle cx="0" cy="0" r="13" fill="#e8c9a8"/>
437                <path d="M-18 -8 Q-20 14 -6 18 L-2 -2 Z" fill="#2a3447"/>
438                <path d="M-22 30 Q-22 80 0 80 L0 50 Z" fill="#2a3447"/>
439                <path d="M-22 30 L0 30 L0 80 L-22 80 Z" fill="#2a3447"/>
440                <rect x="-22" y="28" width="44" height="58" rx="6" fill="#2a3447" stroke="rgba(255,255,255,.10)"/>
441                <rect x="6" y="48" width="14" height="22" rx="2.5" fill="#0b1220" stroke="#ffc904" stroke-width="1"/>
442                <rect x="8" y="51" width="10" height="14" fill="#ffc904" fill-opacity=".2"/>
443              </g>
444              <g transform="translate(240,38)">
445                <circle cx="0" cy="0" r="20" fill="#2a3447" stroke="rgba(255,255,255,.12)"/>
446                <circle cx="0" cy="0" r="13" fill="#d9b48a"/>
447                <path d="M-13 -10 Q-12 -16 -4 -16 Q8 -16 13 -8 Q13 -2 8 -2 L-8 -2 Z" fill="#2a3447"/>
448                <rect x="-22" y="28" width="44" height="58" rx="6" fill="#2a3447" stroke="rgba(255,255,255,.12)"/>
449                <rect x="-20" y="48" width="14" height="22" rx="2.5" fill="#0b1220" stroke="#ffc904" stroke-width="1"/>
450                <rect x="-18" y="51" width="10" height="14" fill="#ffc904" fill-opacity=".2"/>
451              </g>
452              <g transform="translate(160,58)">
453                <circle cx="0" cy="0" r="16" fill="#2a3447" stroke="rgba(255,255,255,.12)"/>
454                <circle cx="0" cy="0" r="10.5" fill="#f0d4b2"/>
455                <path d="M-12 -4 Q-10 -14 0 -14 Q10 -14 12 -4 L8 -2 L-8 -2 Z" fill="#2a3447"/>
456                <rect x="-18" y="22" width="36" height="50" rx="5" fill="#ffc904" fill-opacity=".85" stroke="rgba(255,255,255,.15)"/>
457              </g>
458              <g transform="translate(160,18)">
459                <path d="M-22 -10 Q-22 -22 -10 -22 L10 -22 Q22 -22 22 -10 L22 4 Q22 14 12 14 L4 14 L0 20 L-4 14 L-10 14 Q-22 14 -22 4 Z" fill="#1c2536" stroke="rgba(255,255,255,.18)"/>
460                <circle cx="0" cy="-4" r="9" fill="#ffc904"/>
461                <polyline points="-4,-4 -1,-1 4,-7" fill="none" stroke="#0b1220" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
462              </g>
463            </svg>
464          </div>
465          <hr>
466          <ul class="trust-list">
467            <li>
468              <span class="chk"></span>
469              <div><b>You choose who you contact</b><span>You decide which families you message, pause requests anytime, or delete your account from settings.</span></div>
470            </li>
471            <li>
472              <span class="chk"></span>
473              <div><b>You vet your partners</b><span>Meet new carpool partners in person, confirm insurance and driving history, just as you would with any informal carpool.</span></div>
474            </li>
475            <li>
476              <span class="chk"></span>
477              <div><b>Participation is always optional</b><span>You opt in and control your involvement every step of the way.</span></div>
478            </li>
479          </ul>
480        </div>
481
482        <!-- Card 3: School backed -->
483        <div class="trust-card">
484          <div class="trust-head">
485            <div class="ti">
486              <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21V11l9-6 9 6v10"/><path d="M9 21v-7h6v7"/><path d="M12 5V2"/><path d="M11 2h2"/></svg>
487            </div>
488            <h3>Organization<br>backed</h3>
489          </div>
490          <div class="trust-illo" aria-hidden="true">
491            <svg viewBox="0 0 320 170" preserveAspectRatio="xMidYMid meet">
492              <defs>
493                <radialGradient id="glow3" cx="50%" cy="65%" r="40%">
494                  <stop offset="0%" stop-color="#ffc904" stop-opacity=".30"/>
495                  <stop offset="100%" stop-color="#ffc904" stop-opacity="0"/>
496                </radialGradient>
497              </defs>
498              <ellipse cx="160" cy="135" rx="130" ry="28" fill="url(#glow3)"/>
499              <g fill="#1a2230" stroke="rgba(255,255,255,.08)">
500                <path d="M40 130 Q40 100 52 100 Q64 100 64 130 Z"/>
501                <path d="M268 130 Q268 102 280 102 Q292 102 292 130 Z"/>
502              </g>
503              <g stroke="rgba(255,255,255,.14)" stroke-linejoin="round">
504                <rect x="80" y="70" width="160" height="60" fill="#2a3447"/>
505                <rect x="140" y="40" width="40" height="40" fill="#2a3447"/>
506                <path d="M138 40 L160 22 L182 40 Z" fill="#3a455c"/>
507                <circle cx="160" cy="55" r="7" fill="#0b1220" stroke="#ffc904" stroke-width="1.5"/>
508                <line x1="160" y1="55" x2="160" y2="51" stroke="#ffc904" stroke-width="1.5" stroke-linecap="round"/>
509                <line x1="160" y1="55" x2="163" y2="55" stroke="#ffc904" stroke-width="1.5" stroke-linecap="round"/>
510                <line x1="160" y1="22" x2="160" y2="10" stroke="rgba(255,255,255,.3)" stroke-width="1.2"/>
511                <path d="M160 11 L170 14 L160 17 Z" fill="#ffc904" stroke="none"/>
512                <g fill="#ffc904" fill-opacity=".55" stroke="none">
513                  <rect x="92" y="84" width="14" height="18" rx="1"/>
514                  <rect x="110" y="84" width="14" height="18" rx="1" fill-opacity=".3"/>
515                  <rect x="196" y="84" width="14" height="18" rx="1" fill-opacity=".3"/>
516                  <rect x="214" y="84" width="14" height="18" rx="1"/>
517                </g>
518                <rect x="152" y="60" width="16" height="20" fill="#0b1220" stroke="rgba(255,255,255,.18)"/>
519                <line x1="40" y1="130" x2="292" y2="130" stroke="rgba(255,255,255,.10)"/>
520              </g>
521              <g transform="translate(200,108)">
522                <path d="M0 -22 L20 -16 L20 0 C20 14 10 22 0 26 C-10 22 -20 14 -20 0 L-20 -16 Z" fill="#0b1220" stroke="#ffc904" stroke-width="2"/>
523                <path d="M0 -22 L20 -16 L20 0 C20 14 10 22 0 26 C-10 22 -20 14 -20 0 L-20 -16 Z" fill="#ffc904" fill-opacity=".10"/>
524                <polyline points="-8,2 -2,8 9,-6" fill="none" stroke="#ffc904" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
525              </g>
526            </svg>
527          </div>
528          <hr>
529          <ul class="trust-list">
530            <li>
531              <span class="chk"></span>
532              <div><b>Verified communities</b><span>Schools and organizations can make their community official.</span></div>
533            </li>
534            <li>
535              <span class="chk"></span>
536              <div><b>Roster verification</b><span>Families are verified against the organization's official roster.</span></div>
537            </li>
538            <li>
539              <span class="chk"></span>
540              <div><b>Real-time pickup coordination</b><span>If your school uses dismissal management, staff confirm identity before release and send live updates.</span></div>
541            </li>
542          </ul>
543        </div>
544
545      </div>
546
547      <!-- Privacy promise bar -->
548      <div class="trust-promise">
549        <div class="lock">
550          <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="11" width="16" height="10" rx="2"/><path d="M8 11V7a4 4 0 0 1 8 0v4"/><circle cx="12" cy="16" r="1.2" fill="currentColor"/></svg>
551        </div>
552        <div class="promise-text">
553          <h4>Privacy is our promise.</h4>
554          <p>We're a connection platform, not a data broker. Your trust comes first.</p>
555        </div>
556        <a href="/blog/posts/how-privacy-works/" class="promise-link">Learn more about our privacy <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg></a>
557      </div>
558
559    </div>
560  </section>
561
562  <!-- FAQ -->
563  <section class="s faq" id="faq">
564    <div class="container">
565      <div class="s-head">
566        <span class="eyebrow center">Common questions</span>
567        <h2>Family <span class="serif">questions</span>.</h2>
568        <p>What families most often ask before joining Carpool.School.</p>
569      </div>
570      <div class="faq-wrap">
571        <h4 class="faq-group">Getting started</h4>
572        <details class="faq-item">
573          <summary>Do families pay to use Carpool.School?</summary>
574          <div class="faq-body">Carpool.School is always free for families. When a school or other organization claims and verifies its community, the organization pays the subscription. Parent-led communities remain free for everyone.</div>
575        </details>
576        <details class="faq-item">
577          <summary>Can I use the app if my school hasn't launched it?</summary>
578          <div class="faq-body">A community must exist before you can join it. Your school, PTA, or another parent can start one. If yours isn't listed yet, ask an organizer - or start it yourself.</div>
579        </details>
580        <details class="faq-item">
581          <summary>How do I sign up?</summary>
582          <div class="faq-body">
583            <p style="margin-bottom:10px">You join Carpool.School through your community. There are two paths:</p>
584            <ul style="margin:0;padding-left:20px;display:flex;flex-direction:column;gap:6px">
585              <li><b>From your school or org</b> - if your school has a Verified community, you'll receive a personal invite link by email once they upload their roster. Open it, verify your phone, and create your profile.</li>
586              <li><b>From another parent</b> - if a parent in your community has already started it, they can share an invite link with you. Some parent-led communities are open enrollment, meaning any family at the school can join without a link.</li>
587            </ul>
588          </div>
589        </details>
590
591        <h4 class="faq-group">Finding &amp; organizing rides</h4>
592        <details class="faq-item">
593          <summary>Who can join my community?</summary>
594          <div class="faq-body">Parent-led communities are intended for families connected to that school, daycare, team, camp, or activity. Members can see who has joined and who invited them. Verified communities add an official roster check - families must be on the organization's roster before joining, and the organization can remove anyone who does not belong.</div>
595        </details>
596        <details class="faq-item">
597          <summary>What does Verified mean?</summary>
598          <div class="faq-body">Verified communities are claimed by the school, daycare, team, camp, or other organization. Families are verified against the organization's official roster before joining, and the organization can manage membership through its admin portal.</div>
599        </details>
600        <details class="faq-item">
601          <summary>How do I find and connect with other families?</summary>
602          <div class="faq-body">After creating a carpool request, nearby families appear in map view and table view (browsable list). Send a direct message to any family, join activity-based groups, or create a private group for a dedicated carpool circle.</div>
603        </details>
604        <details class="faq-item">
605          <summary>How do I set up a carpool request?</summary>
606          <div class="faq-body">Create a request by telling other families when and where you need help with transportation. Nearby families can discover your request, contact you directly, and decide whether a carpool makes sense. Requests can be updated or removed at any time.</div>
607        </details>
608        <details class="faq-item">
609          <summary>Will a carpool automatically form once I set up a request?</summary>
610          <div class="faq-body">No. Setting up a request makes it possible for families to find you, but carpools only form when families choose to coordinate together. Many families use the app simply to discover nearby families before deciding whether to carpool.</div>
611        </details>
612        <details class="faq-item">
613          <summary>Is participation mandatory?</summary>
614          <div class="faq-body">No. Carpool.School is always opt-in. Families who prefer not to participate simply don't create an account. Registered families can pause their carpool requests or delete their account anytime from app settings.</div>
615        </details>
616        <details class="faq-item">
617          <summary>How does school pickup coordination work?</summary>
618          <div class="faq-body">
619            <p style="margin-bottom:8px">If your school has enabled dismissal management, the app coordinates pickups with staff:</p>
620            <ul style="margin:0;padding-left:20px;
620display:flex;flex-direction:column;gap:6px">
621              <li><b>Set pickup plans</b> - choose who is picking up your child and when.</li>
622              <li><b>Announce arrival</b> - share your location or tap to let the school know you've arrived.</li>
623              <li><b>Verification</b> - staff confirm your identity before releasing your child.</li>
624              <li><b>Last-minute changes</b> - update plans instantly; the school sees it immediately.</li>
625            </ul>
626          </div>
627        </details>
628
629        <h4 class="faq-group">Trust &amp; safety</h4>
630        <details class="faq-item">
631          <summary>Can other families see my exact address?</summary>
632          <div class="faq-body">No. Carpool.School never displays exact home addresses to other families. When you post a carpool request, a neighborhood pin appears on the map so nearby families can find you. Your address is never shown as text.</div>
633        </details>
634        <details class="faq-item">
635          <summary>How does Carpool.School protect my family's privacy?</summary>
636          <div class="faq-body">
637            <ul style="margin:0;padding-left:20px;display:flex;flex-direction:column;gap:6px">
638              <li><b>Community-scoped visibility</b> - only members of your community can see your profile.</li>
639              <li><b>No exact addresses</b> - other families never see your exact home address.</li>
640              <li><b>Your data is never sold.</b> See our <a href="/legal/privacy/" style="color:var(--brand-deep);font-weight:600">Privacy Policy</a> for details.</li>
641              <li><b>You control connections</b> - you decide which families you message and coordinate with.</li>
642            </ul>
643          </div>
644        </details>
645        <details class="faq-item">
646          <summary>Does Carpool.School do background checks on drivers?</summary>
647          <div class="faq-body">No. Carpool.School is a connection platform, not a vetting service. Parents are responsible for independently vetting anyone they choose to carpool with - just as you would with any informal carpool arrangement.</div>
648        </details>
649        <details class="faq-item">
650          <summary>Who decides who I ride with?</summary>
651          <div class="faq-body">You do. The directory shows nearby families sorted by distance. You reach out to the ones that work for you. No auto-assignments, no system deciding who goes with whom. You can leave any pool anytime.</div>
652        </details>
653        <details class="faq-item">
654          <summary>Who is liable for the actual carpool?</summary>
655          <div class="faq-body">Carpool.School helps families find each other and coordinate rides, but families decide who they ride with and are responsible for their own carpool arrangements. Carpool.School is not a transportation provider. See our <a href="/legal/terms/" style="color:var(--brand-deep);font-weight:600">Terms of Use</a> and <a href="/legal/eula/" style="color:var(--brand-deep);font-weight:600">EULA</a> for full details.</div>
656        </details>
657        <details class="faq-item">
658          <summary>What are my responsibilities for carpool safety?</summary>
659          <div class="faq-body">
660            <p style="margin-bottom:8px">You're responsible for the same care and judgment you'd use arranging a carpool with anyone else, on or off the app — Carpool.School doesn't screen or certify any user's safety. A few practices other families find useful, not a complete list:</p>
661            <ul style="margin:0;padding-left:20px;display:flex;flex-direction:column;gap:6px">
662              <li>Meet new carpool partners in person, in a public place, before the first ride.</li>
663              <li>Verify their identity and confirm driving history, insurance, and vehicle condition.</li>
664              <li>Exchange emergency contact information before the first ride.</li>
665              <li>Carry a phone during rides in case you need to reach someone.</li>
666              <li>Only form carpools with families you feel completely comfortable with.</li>
667              <li>Trust your instincts - you are never obligated to participate.</li>
668            </ul>
669          </div>
670        </details>
671
672        <h4 class="faq-group">Communities &amp; accounts</h4>
673        <details class="faq-item">
674          <summary>
674What happens if my school later joins Carpool.School?</summary>
675          <div class="faq-body">Nothing is lost. If your school claims and verifies its community, existing families keep their accounts, connections, conversations, and carpool arrangements. The community simply gains additional features, including roster verification, organization oversight, and administrative tools.</div>
676        </details>
677        <details class="faq-item">
678          <summary>Can I use Carpool.School for activities, camps, and teams - not just schools?</summary>
679          <div class="faq-body">Yes. A community can represent any group of families that regularly coordinate transportation together, including schools, daycares, camps, sports teams, clubs, classes, and other activities.</div>
680        </details>
681        <details class="faq-item">
682          <summary>Can I use Carpool.School for children at different schools?</summary>
683          <div class="faq-body">Yes. If your children attend different schools that both use Carpool.School, add multiple schools to a single account and switch between networks from the same app.</div>
684        </details>
685        <details class="faq-item">
686          <summary>Can I leave a community or delete my information?</summary>
687          <div class="faq-body">Yes. You can leave a community at any time. You may also request deletion of your account and personal information in accordance with our <a href="/legal/privacy/" style="color:var(--brand-deep);font-weight:600">Privacy Policy</a>. Once removed, your profile and information are no longer visible to other members of that community.</div>
688        </details>
689        <details class="faq-item">
690          <summary>What devices does Carpool.School run on?</summary>
691          <div class="faq-body">Available as a native app on iOS and Android. You can also sign up on the web at <a href="https://app.carpool.school/signup" style="color:var(--brand-deep);font-weight:600">app.carpool.school</a>, but the full experience - push notifications, real-time location, and ride coordination - requires the mobile app.</div>
692        </details>
693      </div>
694    </div>
695  </section>
696
697  <!-- CTA -->
698  <section class="cta-band" id="cta">
699    <div class="container">
700      <span class="eyebrow center light">Get started</span>
701      <h2 style="margin-top:18px">Download the app. <span class="serif">Join your community.</span></h2>
702      <p>Free for families. Available on iOS and Android.</p>
703      <div class="cta-row">
704        <a href="https://apps.apple.com/app/id6443997462" class="btn-primary" data-track data-event="download_click" data-location="families_final_band" data-platform="ios">
705          <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83zM13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z"/></svg>
706          App Store
707        </a>
708        <a href="https://play.google.com/store/apps/details?id=school.carpool" class="btn-secondary" data-track data-event="download_click" data-location="families_final_band" data-platform="android">
709          <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M3.609 1.814L13.792 12 3.61 22.186a.996.996 0 0 1-.61-.92V2.734a1 1 0 0 1 .609-.92zm10.89 10.893l2.302 2.302-10.937 6.333 8.635-8.635zm3.199-3.198l2.807 1.626a1 1 0 0 1 0 1.73l-2.808 1.626L15.206 12l2.492-2.491zM5.864 2.658L16.802 8.99l-2.303 2.303-8.635-8.635z"/></svg>
710          Google Play
711        </a>
712      </div>
713    </div>
714  </section>
715
716</div>
717
718
719  <footer class="cs-footer">
720  <div class="container">
721    <div class="foot-grid">
722      <div>
723        <a href="/" class="foot-brand">
724          <img src="/assets/images/logo-mark.png" alt="">
725          <span>
725Carpool.School</span>
726        </a>
727        
728        <p class="foot-tag">The carpool network for schools, camps, daycares, and youth programs.</p>
729        
730        
731        <div class="foot-stores">
732          <a href="https://apps.apple.com/app/id6443997462" class="foot-store">
733            <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z"/></svg>
734            Download on iOS
735          </a>
736          <a href="https://play.google.com/store/apps/details?id=school.carpool" class="foot-store">
737            <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M3.609 1.814L13.792 12 3.61 22.186a.996.996 0 0 1-.61-.92V2.734a1 1 0 0 1 .609-.92zm10.89 10.893l2.302 2.302-10.937 6.333 8.635-8.635zm3.199-3.198l2.807 1.626a1 1 0 0 1 0 1.73l-2.808 1.626L15.206 12l2.492-2.491zM5.864 2.658L16.802 8.99l-2.303 2.303-8.635-8.635z"/></svg>
738            Get it on Android
739          </a>
740        </div>
741        
742      </div>
743      
744      <div class="foot-col">
745        <h5>Product</h5>
746        <ul>
747          <li><a href="/#pricing">Pricing</a></li>
748          <li><a href="/families/">Families</a></li>
749          <li><a href="/schools/">Schools &amp; Organizations</a></li>
750        </ul>
751      </div>
752      <div class="foot-col">
753        <h5>Company</h5>
754        <ul>
755          <li><a href="/#about">About</a></li>
756          <li><a href="/blog/">Blog</a></li>
757          <li><a href="/#support">Contact</a></li>
758        </ul>
759      </div>
760      <div class="foot-col">
761        <h5>Legal</h5>
762        <ul>
763          <li><a href="/legal/terms/">Terms and Conditions of Use</a></li>
764          <li><a href="/legal/privacy/">Privacy Policy</a></li>
765          <li><a href="/legal/eula/">End User License Agreement</a></li>
766          <li><a href="/legal/tos/">Terms of Service</a></li>
767        </ul>
768      </div>
769      
770    </div>
771    <div class="foot-bottom">
772      
773      <span>© 2026 Carpool School Inc. · Built for families.</span>
774      
775      <div class="socials">
776        
777        <a href="https://www.youtube.com/@Carpool.School" target="_blank" rel="noopener noreferrer" aria-label="YouTube"><svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor"><path d="M19.615 3.184c-3.604-.246-11.631-.245-15.23 0-3.897.266-4.356 2.62-4.385 8.816.029 6.185.484 8.549 4.385 8.816 3.6.245 11.626.246 15.23 0 3.897-.266 4.356-2.62 4.385-8.816-.029-6.185-.484-8.549-4.385-8.816zm-10.615 12.816v-8l8 3.993-8 4.007z"/></svg></a>
778        <a href="https://www.linkedin.com/company/carpool-school/" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn"><svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor"><path d="M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z"/></svg></a>
779        <a href="https://www.facebook.com/profile.php?id=100089203043240" target="_blank" rel="noopener noreferrer" aria-label="Facebook"><svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor"><path d="M9 8h-3v4h3v12h5v-12h3.642l.358-4h-4v-1.667c0-.955.192-1.333 1.115-1.333h2.885v-5h-3.808c-3.596 0-5.192 1.583-5.192 4.615v3.385z"/></svg></a>
780        <a href="https://twitter.com/CarpoolSchool" target="_blank" rel="noopener noreferrer" aria-label="Twitter/X"><svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor"><path d="M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-
7805.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z"/></svg></a>
781        <a href="https://www.instagram.com/carpool.school/" target="_blank" rel="noopener noreferrer" aria-label="Instagram"><svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z"/></svg></a>
782        <a href="mailto:[email protected]" aria-label="Email"><svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor"><path d="M0 3v18h24v-18h-24zm21.518 2l-9.518 7.713-9.518-7.713h19.036zm-19.518 14v-11.817l10 8.104 10-8.104v11.817h-20z"/></svg></a>
783        
784      </div>
785    </div>
786  </div>
787</footer>
788
789  
789<script>
790  // Runtime app base — the build already knows the right environment/brand
791  // (env.appUrl), so bake it in directly rather than re-deriving it from
792  // window.location at runtime.
793  const appBase = 'https://app.carpool.school'
794
795  document.querySelectorAll('[data-app-href]').forEach(el => {
796    el.href = appBase + el.dataset.appHref
797  })
798
799  // Data layer + click tracking. Any element with data-track fires a dataLayer
800  // push on click using its data-event (default 'click') plus whatever other
801  // data-* attributes it carries, so tagging a new CTA never needs a new listener.
802  window.dataLayer = window.dataLayer || []
803  document.addEventListener('click', (e) => {
804    const target = e.target.closest('[data-track]')
805    if (!target) return
806    window.dataLayer.push({ event: target.dataset.event || 'click', ...target.dataset })
807  })
808
809  // Mobile nav toggle
810  const menuBtn = document.getElementById('menu-btn')
811  const mobileMenu = document.getElementById('mobile-menu')
812  const menuIcon = document.getElementById('menu-icon')
813
814  function openMobileMenu() {
815    mobileMenu.classList.remove('hidden')
816    document.body.style.overflow = 'hidden'
817    menuIcon.innerHTML = '<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>'
818  }
819
820  function closeMobileMenu() {
821    mobileMenu.classList.add('hidden')
822    document.body.style.overflow = ''
823    menuIcon.innerHTML = '<path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"/>'
824  }
825
826  if (menuBtn && mobileMenu) {
827    menuBtn.addEventListener('click', (e) => {
828      e.stopPropagation()
829      mobileMenu.classList.contains('hidden') ? openMobileMenu() : closeMobileMenu()
830    })
831    document.addEventListener('click', (e) => {
832      if (!mobileMenu.contains(e.target) && !menuBtn.contains(e.target)) closeMobileMenu()
833    })
834    mobileMenu.querySelectorAll('a').forEach(l => l.addEventListener('click', () => closeMobileMenu()))
835  }
836
837  // Lite YouTube facade — loads iframe on click
838  document.querySelectorAll('.lite-yt').forEach(el => {
839    function activate() {
840      if (el.classList.contains('activated')) return
841      el.classList.add('activated')
842      const id = el.dataset.ytId
843      const iframe = document.createElement('iframe')
844      iframe.src = `https://www.youtube-nocookie.com/embed/${id}?autoplay=1&rel=0&cc_load_policy=1`
845      iframe.allow = 'autoplay; encrypted-media'
846      iframe.allowFullscreen = true
847      iframe.referrerPolicy = 'strict-origin-when-cross-origin'
848      el.appendChild(iframe)
849    }
850    el.addEventListener('click', activate)
851    el.addEventListener('keydown', e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); activate() } })
852  })
853
854  // Auth-aware nav — reads `cs_id` cookie (set by app.carpool.school on signin)
855  // and swaps the signed-out CTAs for an avatar + name link. Cookie is
856  // display-only; it carries no privilege.
857  ;(function applyNavIdentity() {
858    const match = document.cookie.match(/(?:^|;\s*)cs_id=([^;]+)/)
859    if (!match) return
860    let payload
861    try {
862      payload = JSON.parse(decodeURIComponent(match[1]))
863    } catch (e) {
864      return
865    }
866    if (!payload || !payload.n || !payload.i || !payload.ap || !payload.sp) return
867    if (payload.exp && Date.now() > payload.exp) {
868      document.cookie = 'cs_id=; Max-Age=0; Path=/; SameSite=Lax; Domain=.carpool.school'
869      return
870    }
871    const appUrl = 'https://app.carpool.school'
872    const signedOut = document.querySelector('[data-nav-signed-out]')
873    const identity = document.querySelector('[data-nav-identity]')
874    const initialsEl = document.querySelector('[data-nav-identity-initials]')
875    const nameFullEl = document.querySelector('[data-nav-identity-name-full]')
876    const nameShortEl = document.querySelector('[data-nav-identity-name-short]')
877    const trigger = document.querySelector('[data-nav-identity-trigger]')
878    const menu = document.querySelector('[data-nav-identity-menu]')
879    const accountLink = document.querySelector('[data-nav-identity-account]')
880    const signOutLink = document.querySelector('[data-nav-identity-signout]')
881    if (signedOut) signedOut.classList.add('hidden')
882    if (identity) identity.classList.remove('hidden')
883    if (initialsEl) initialsEl.textContent = payload.i
884    if (nameFullEl) nameFullEl.textContent = payload.n
885    if (nameShortEl) nameShortEl.textContent = payload.n.split(/\s+/)[0]
886    if (trigger) trigger.setAttribute('title', payload.n)
887    if (accountLink) accountLink.href = appUrl + payload.ap
888    if (signOutLink) signOutLink.href = appUrl + payload.sp
889
890    // Dropdown toggle + click-outside. Mirrors the app's <UserMenu> behavior
891    // (two clicks: open, then choose) so pill semantics match across origins.
892    if (trigger && menu) {
893      const setOpen = (open) => {
894        menu.classList.toggle('hidden', !open)
895        trigger.setAttribute('aria-expanded', open ? 'true' : 'false')
896      }
897      trigger.addEventListener('click', (e) => {
898        e.stopPropagation()
899        setOpen(menu.classList.contains('hidden'))
900      })
901      document.addEventListener('click', (e) => {
902        if (!menu.classList.contains('hidden') && !trigger.contains(e.target) && !menu.contains(e.target)) {
903          setOpen(false)
904        }
905      })
906      document.addEventListener('keydown', (e) => { if (e.key === 'Escape') setOpen(false) })
907    }
908  })()
909
910  // Communities band + hero search.
911  // Band: renders build-time baked data (window.__CS_COMMUNITIES__) first for an
912  // instant, no-flash paint, then re-renders from the runtime fetch once it lands
913  // so communities deleted/purged since the last site build disappear without
914  // waiting for a redeploy.
915  // Search: always uses a fresh runtime fetch so results are never stale.
916  ;(function initCommunityData() {
917    const band = document.querySelector('[data-communities-band]')
918    const searchInput = document.querySelector('[data-search-input]')
919    const searchResults = document.querySelector('[data-search-results]')
920    const searchWrap = searchInput ? searchInput.closest('.hero-search-wrap') : null
921    const defaultPlaceholder = searchInput ? searchInput.placeholder : ''
922    if (!band && !searchInput) return
923
924    const COLORS = ['#7048e8','#0d6b3e','#d97557','#1b4ca8','#b07f00','#a13e3e','#1a7a6e','#6b4c0d']
925    function colorFor(name) {
926      const hash = (name || '').split('').reduce((acc, c) => acc + c.charCodeAt(0), 0)
927      return COLORS[hash % COLORS.length]
928    }
929
930    // Community names, locations, and photo URLs are live user-supplied data
931    // (anyone can create a community) rendered via innerHTML on this public
932    // page — escape before interpolating into any HTML template string here.
933    const HTML_ESCAPES = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }
934    function escapeHtml(str) {
935      return (str || '').replace(/[&<>"']/g, (c) => HTML_ESCAPES[c])
936    }
937
938    function avatar(name, photoUrl, initClass) {
939      const initial = escapeHtml((name || '?').charAt(0).toUpperCase())
940      const color = colorFor(name || '')
941      if (!photoUrl) return `<span class="${initClass}" style="background:${color}">${initial}</span>`
942      return `<img src="${escapeHtml(photoUrl)}" alt=""
943        onerror="this.style.display='none';this.nextElementSibling.style.display='flex'"><span class="${initClass}" style="display:none;background:${color}">${initial}</span>`
944    }
945
946    function truncateName(name) {
947      const words = name.split(' ')
948      return words.length > 3 ? words.slice(0, 3).join(' ') + '…' : name
949    }
950
951    function schoolItem(c) {
952      const managed = c.managed === 'staff' ? 'verified' : 'parent-led'
953      const label = managed === 'verified' ? 'Verified' : 'Parent-led'
954      const chk = managed === 'verified'
955        ? `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><polyline fill="none" points="20 6 9 17 4 12"/></svg>`
956        : ''
957      return `<span class="trust-school">
958        ${avatar(c.communityName, c.photoUrl, 'trust-school-init')}
959        <span class="ts-name">${escapeHtml(truncateName(c.communityName))}</span>
960        ${managed === 'verified' ? `<span class="ts-badge verified">${chk}${label}</span>` : ''}
961      </span>`
962    }
963
964    function renderBand(list) {
965      if (!band || !list?.length) return
966      const shuffled = [...list].sort(() => Math.random() - 0.5)
967      band.innerHTML = [...shuffled, ...shuffled].map(schoolItem).join('')
968      const PIXELS_PER_SEC = 40
969      band.style.animationDuration = `${band.scrollWidth / 2 / PIXELS_PER_SEC}s`
970    }
971
972    function wireSearch(list) {
973      if (!searchInput || !searchResults || !list?.length) return
974
975      searchInput.addEventListener('input', () => {
976        const q = searchInput.value.trim().toLowerCase()
977        if (q.length < 1) {
978          searchResults.classList.add('hidden')
979          searchResults.innerHTML = ''
980          return
981        }
982        const matches = list.filter(c =>
983          c.communityName.toLowerCase().includes(q)
984        ).slice(0, 8)
985
986        if (!matches.length) {
987          const startUrl = `${appBase}/signup`
988          searchResults.innerHTML = `<li class="sr-empty">
989            <span class="sr-empty-icon">
990              <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
991            </span>
992            <span class="sr-empty-body">
993              <strong>Not on Carpool.School yet.</strong>
994              <span>Be the first to start this community.</span>
995            </span>
996            <a href="${startUrl}" class="sr-empty-cta">Start community</a>
997          </li>`
998        } else {
999          searchResults.innerHTML = matches.map(c => {
1000            const managed = c.managed === 'staff' ? 'verified' : 'parent-led'
1001            const label = managed === 'verified' ? '✓ Verified' : 'Parent-led'
1002            const loc = [c.locality, c.adminArea].filter(Boolean).join(', ')
1003            const url = `${appBase}/signup?comId=${encodeURIComponent(c.communityId)}&cn=${encodeURIComponent(c.communityName)}`
1004            return `<li><a href="${url}" class="sr-item">
1005              ${avatar(c.communityName, c.photoUrl, 'sr-init')}
1006              <span class="sr-body">
1007                <span class="sr-name">${escapeHtml(c.communityName)}</span>
1008                ${loc ? `<span class="sr-loc">${escapeHtml(loc)}</span>` : ''}
1009              </span>
1010              <span class="sr-right">
1011                ${managed === 'verified' ? `<span class="sr-badge verified">${label}</span>` : ''}
1012                <span class="sr-arrow">→</span>
1013              </span>
1014            </a></li>`
1015          }).join('')
1016        }
1017        searchResults.classList.remove('hidden')
1018      })
1019
1020      document.addEventListener('click', e => {
1021        if (!searchInput.contains(e.target) && !searchResults.contains(e.target)) {
1022          searchResults.classList.add('hidden')
1023        }
1024      })
1025
1026      searchInput.addEventListener('keydown', e => {
1027        if (e.key === 'Escape') {
1028          searchResults.classList.add('hidden')
1029          searchInput.value = ''
1030        }
1031      })
1032    }
1033
1034    // ── Band: build-time data (instant) ──────────────────────────────────────
1035    const baked = window.__CS_COMMUNITIES__
1036    if (baked?.length) {
1037      renderBand(baked)
1038    }
1039
1040    // ── Search: runtime fetch (always fresh) ─────────────────────────────────
1041    if (searchInput && searchWrap) {
1042      searchWrap.classList.add('is-loading')
1043      searchInput.disabled = true
1044      searchInput.placeholder = 'Finding communities near you…'
1045    }
1046
1047    fetch(`${appBase}/api/communities/activated`)
1048      .then(r => r.ok ? r.json() : null)
1049      .then(data => {
1050        const list = data?.communities
1051        if (!list?.length) return
1052
1053        // Refresh the band with live data — supersedes the build-time snapshot
1054        // so purged communities drop out without a site rebuild.
1055        renderBand(list)
1056
1057        if (searchWrap) {
1058          searchWrap.classList.remove('is-loading')
1059          searchInput.disabled = false
1060          searchInput.placeholder = defaultPlaceholder
1061          // Brief glow to signal the input is now live
1062          searchWrap.classList.add('is-ready')
1063          setTimeout(() => searchWrap.classList.remove('is-ready'), 900)
1064        }
1065
1066        wireSearch(list)
1067      })
1068      .catch(() => {
1069        if (searchWrap) {
1070          searchWrap.classList.remove('is-loading')
1071          searchInput.disabled = false
1072          searchInput.placeholder = defaultPlaceholder
1073        }
1074      })
1075  })()
1076
1077  // Scroll reveal
1078  const revealEls = document.querySelectorAll('[data-reveal]')
1079  if (revealEls.length && 'IntersectionObserver' in window) {
1080    const obs = new IntersectionObserver((entries) => {
1081      entries.forEach((entry) => {
1082        if (entry.isIntersecting) { entry.target.classList.add('revealed'); obs.unobserve(entry.target) }
1083      })
1084    }, { threshold: 0.08, rootMargin: '0px 0px -30px 0px' })
1085    revealEls.forEach(el => obs.observe(el))
1086  } else {
1087    revealEls.forEach(el => el.classList.add('revealed'))
1088  }
1089</script>
1089
1090
1091</body>
1092</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.