1 2<!DOCTYPE html> 3<html lang="en"> 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 8 <!-- Title: Use HTML_TITLE from generateMetaTags if set, else build dynamically --> 9 <title>Our Ecosystem | ServiceSpace</title> 10 11 <!-- Meta Tags: Use META from generateMetaTags if set, else use inline defaults --> 12 <meta name="description" content="Explore 20+ ServiceSpace initiatives including DailyGood, Karma Kitchen, Awakin Circles, KindSpring, and more."> 13<meta name="keywords" content="servicespace, gift economy, volunteerism, kindness, compassion, gandhi 3.0, inner transformation, service"> 14<meta name="author" content="ServiceSpace.org"> 15<meta property="og:title" content="Our Ecosystem"> 16<meta property="og:description" content="Small acts that change the world. A volunteer-run ecosystem incubating compassionate action since 1999."> 17<meta property="og:image" content="https://www.servicespace.org/images/og-image.jpg"> 18<meta property="og:type" content="website"> 19<meta property="og:url" content="https://www.servicespace.org/"> 20<meta property="twitter:card" content="summary_large_image"> 21<meta name="title" content="Our Ecosystem"> 22<meta property="twitter:title" content="Our Ecosystem"> 23<meta property="twitter:description" content="Explore 20+ ServiceSpace initiatives including DailyGood, Karma Kitchen, Awakin Circles, KindSpring, and more."> 24<meta property="twitter:image" content="https://www.servicespace.org/images/og-image.jpg"> 25 26 27 <!-- Base URL - Set per site --> 28 <base href="https://www.servicespace.org/"> 29 30 <!-- Favicons --> 31 <link rel="shortcut icon" href="https://www.servicespace.org/favicon.ico"> 32 <link rel="apple-touch-icon-precomposed" sizes="144x144" href="images/ico/apple-touch-icon-144-precomposed.png"> 33 34 <!-- Google Fonts --> 35 <link rel="preconnect" href="https://fonts.googleapis.com"> 36 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 37 <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;1,400&family=DM+Sans:opsz,[email protected],400;9..40,500;9..40,600&display=swap" rel="stylesheet"> 38 39 <!-- Bootstrap Icons --> 40 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css"> 41 42 <!-- Swiper CSS (for carousels) --> 43 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css"> 44 45 <!-- ============================================ 46 GLOBAL STYLES - Header/Footer (all sites) 47 ============================================ --> 48 <link rel="stylesheet" href="https://pod.servicespace.org/assets/css/welcome/global_styles.css?v=1furn"> 49 50 <!-- ============================================ 51 PAGE STYLES - Site-specific 52 ============================================ --> 53 <!-- ServiceSpace.org Base Styles --> 54 <link rel="stylesheet" href="https://www.servicespace.org/welcome/css/ss_base.css?v=1furn"> 55 56 57 58 <link rel="stylesheet" href="welcome/css/projects.css"> </head> 59<body class=""> 60 61 <!-- ============================================ 62 GLOBAL HEADER 63 ============================================ --> 64 <header class="ss-header"> 65 <div class="ss-header-container"> 66 67 <!-- Logo Area --> 68 <div class="ss-logo-area"> 69 <a href="https://www.servicespace.org/" class="ss-logo"> 70 <img src="https://www.servicespace.org/images/index2026/logo_sm2.png" alt="ServiceSpace"> 71 </a> 72 </div> 73 74 <!-- Desktop Navigation --> 75 <nav class="ss-nav"> 76 77 <!-- Ecosystem Dropdown --> 78 <div class="ss-nav-item"> 79 <button class="ss-nav-link"> 80 Ecosystem <i class="bi bi-chevron-down"></i> 81 </button> 82 <div class="ss-dropdown ss-dropdown-wide"> 83 <a href="https://www.servicespace.org/projects" class="ss-dropdown-item"> 84 <div class="ss-dropdown-icon" style="background: linear-gradient(135deg, var(--ss-teal) 0%, var(--ss-teal-deep) 100%);"> 85 <i class="bi bi-flower1"></i> 86 </div> 87 <div class="ss-dropdown-content"> 88 <div class="ss-dropdown-title">Explore All Projects</div> 89 <div class="ss-dropdown-desc">Our family of projects</div> 90 </div> 91 </a> 92 93 <div class="ss-dropdown-divider"></div> 94 95 <a href="https://www.dailygood.org" class="ss-dropdown-item" target="_blank"> 96 <div class="ss-dropdown-icon" style="background: linear-gradient(135deg, var(--ss-gold) 0%, #e8b84a 100%);"> 97 <i class="bi bi-sun"></i> 98 </div> 99 <div class="ss-dropdown-content"> 100 <div class="ss-dropdown-title">DailyGood</div> 101 <div class="ss-dropdown-desc">News that inspires</div> 102 </div> 103 </a> 104 105 <a href="https://www.karmakitchen.org" class="ss-dropdown-item" target="_blank"> 106 <div class="ss-dropdown-icon" style="background: linear-gradient(135deg, var(--ss-coral) 0%, #e07a65 100%);"> 107 <i class="bi bi-heart"></i> 108 </div> 109 <div class="ss-dropdown-content"> 110 <div class="ss-dropdown-title">Karma Kitchen</div> 111 <div class="ss-dropdown-desc">Pay-it-forward restaurants</div> 112 </div> 113 </a> 114 115 <a href="https://www.awakin.org" class="ss-dropdown-item" target="_blank"> 116 <div class="ss-dropdown-icon" style="background: linear-gradient(135deg, var(--ss-sage) 0%, #7fb578 100%);"> 117 <i class="bi bi-circle"></i> 118 </div> 119 <div class="ss-dropdown-content"> 120 <div class="ss-dropdown-title">Awakin Circles</div> 121 <div class="ss-dropdown-desc">Weekly meditation gatherings</div> 122 </div> 123 </a> 124 125 <div class="ss-dropdown-footer"> 126 <a href="https://www.servicespace.org/projects">View all 20+ initiatives â</a> 127 </div> 128 </div> 129 </div> 130 131 <!-- Pods Dropdown --> 132 <div class="ss-nav-item"> 133 <button class="ss-nav-link "> 134 Pods <i class="bi bi-chevron-down"></i> 135 </button> 136 <div class="ss-dropdown"> 137 <a href="https://pod.servicespace.org/welcome" class="ss-dropdown-item"> 138 <div class="ss-dropdown-icon" style="background: linear-gradient(135deg, var(--ss-teal) 0%, var(--ss-teal-light) 100%);"> 139 <i class="bi bi-brightness-high"></i> 140 </div> 141 <div class="ss-dropdown-content"> 142 <div class="ss-dropdown-title">What Are Pods?</div> 143 <div class="ss-dropdown-desc">An introduction to learning pods</div> 144 </div> 145 </a> 146 147 <div class="ss-dropdown-divider"></div> 148 149 <a href="https://pod.servicespace.org/apply" class="ss-dropdown-item"> 150 <div class="ss-dropdown-icon" style="background: linear-gradient(135deg, var(--ss-gold) 0%, #e8b84a 100%);"> 151 <i class="bi bi-search"></i> 152 </div> 153 <div class="ss-dropdown-content"> 154 <div class="ss-dropdown-title">Join a Pod</div> 155 <div class="ss-dropdown-desc">Find your next journey</div> 156 </div> 157 </a> 158 159 <a href="https://pod.servicespace.org/about" class="ss-dropdown-item"> 160 <div class="ss-dropdown-icon" style="background: linear-gradient(135deg, var(--ss-sage) 0%, #7fb578 100%);"> 161 <i class="bi bi-book"></i> 162 </div> 163 <div class="ss-dropdown-content"> 164 <div class="ss-dropdown-title">Our Approach</div> 165 <div class="ss-dropdown-desc">How transformative learning works</div> 166 </div> 167 </a> 168 169 <a href="https://pod.servicespace.org/host" class="ss-dropdown-item"> 170 <div class="ss-dropdown-icon" style="background: linear-gradient(135deg, var(--ss-coral) 0%, #e07a65 100%);">
171 <i class="bi bi-person-plus"></i> 172 </div> 173 <div class="ss-dropdown-content"> 174 <div class="ss-dropdown-title">Host a Pod</div> 175 <div class="ss-dropdown-desc">Create space for others</div> 176 </div> 177 </a> 178 </div> 179 </div> 180 181 <!-- About Dropdown --> 182 <div class="ss-nav-item"> 183 <button class="ss-nav-link"> 184 About <i class="bi bi-chevron-down"></i> 185 </button> 186 <div class="ss-dropdown"> 187 <a href="https://www.servicespace.org/about" class="ss-dropdown-item"> 188 <div class="ss-dropdown-icon" style="background: linear-gradient(135deg, var(--ss-teal) 0%, var(--ss-teal-deep) 100%);"> 189 <i class="bi bi-book"></i> 190 </div> 191 <div class="ss-dropdown-content"> 192 <div class="ss-dropdown-title">About Us</div> 193 <div class="ss-dropdown-desc">Our values, story & people</div> 194 </div> 195 </a> 196 197 <a href="https://www.servicespace.org/vision" class="ss-dropdown-item"> 198 <div class="ss-dropdown-icon" style="background: linear-gradient(135deg, var(--ss-gold) 0%, #e8b84a 100%);"> 199 <i class="bi bi-eye"></i> 200 </div> 201 <div class="ss-dropdown-content"> 202 <div class="ss-dropdown-title">Our Vision</div> 203 <div class="ss-dropdown-desc">Change yourself, change the world</div> 204 </div> 205 </a> 206 207 <a href="https://www.servicespace.org/join" class="ss-dropdown-item"> 208 <div class="ss-dropdown-icon" style="background: linear-gradient(135deg, var(--ss-sage) 0%, #7fb578 100%);"> 209 <i class="bi bi-people"></i> 210 </div> 211 <div class="ss-dropdown-content"> 212 <div class="ss-dropdown-title">Get Involved</div> 213 <div class="ss-dropdown-desc">Join the movement</div> 214 </div> 215 </a> 216 217 <div class="ss-dropdown-divider"></div> 218 219 <a href="https://pod.servicespace.org/contact" class="ss-dropdown-item"> 220 <div class="ss-dropdown-icon" style="background: var(--ss-cream); color: var(--ss-teal);"> 221 <i class="bi bi-envelope"></i> 222 </div> 223 <div class="ss-dropdown-content"> 224 <div class="ss-dropdown-title">Contact Us</div> 225 <div class="ss-dropdown-desc">Reach our team</div> 226 </div> 227 </a> 228 </div> 229 </div> 230 231 </nav> 232 233 <!-- Auth Buttons --> 234 <div class="ss-auth"> 235 <!-- Logged Out State --> 236 <a href="https://pod.servicespace.org/login" class="ss-btn ss-btn-outline"> 237 Sign In 238 </a> 239 <a href="https://pod.servicespace.org/join" class="ss-btn ss-btn-primary"> 240 Join <i class="bi bi-arrow-right"></i> 241 </a> 242 </div> 243 244 <!-- Mobile Toggle --> 245 <button class="ss-mobile-toggle" aria-label="Toggle menu">
246 <span class="ss-hamburger"></span> 247 </button> 248 249 </div> 250 </header> 251 252 <!-- Mobile Menu --> 253 <div class="ss-mobile-menu"> 254 255 <div class="ss-mobile-nav-item"> 256 <button class="ss-mobile-nav-link"> 257 Ecosystem <i class="bi bi-chevron-down"></i> 258 </button> 259 <div class="ss-mobile-subnav"> 260 <a href="https://www.servicespace.org/projects">Explore All Projects</a> 261 <a href="https://www.dailygood.org">DailyGood</a> 262 <a href="https://www.karmakitchen.org">Karma Kitchen</a> 263 <a href="https://www.awakin.org">Awakin Circles</a> 264 <a href="https://www.kindspring.org">KindSpring</a> 265 </div> 266 </div> 267 268 <div class="ss-mobile-nav-item"> 269 <button class="ss-mobile-nav-link"> 270 Pods <i class="bi bi-chevron-down"></i> 271 </button> 272 <div class="ss-mobile-subnav"> 273 <a href="https://pod.servicespace.org/welcome">What Are Pods?</a> 274 <a href="https://pod.servicespace.org/apply">Join a Pod</a> 275 <a href="https://pod.servicespace.org/about">Our Approach</a> 276 <a href="https://pod.servicespace.org/host">Host a Pod</a> 277 </div> 278 </div> 279 280 <div class="ss-mobile-nav-item"> 281 <button class="ss-mobile-nav-link"> 282 About <i class="bi bi-chevron-down"></i> 283 </button> 284 <div class="ss-mobile-subnav"> 285 <a href="https://www.servicespace.org/about">Who We Are</a> 286 <a href="https://www.servicespace.org/vision">Our Vision</a> 287 <a href="https://www.servicespace.org/join">Get Involved</a> 288 <a href="https://pod.servicespace.org/contact">Contact Us</a> 289 </div> 290 </div> 291 292 <div class="ss-mobile-auth"> 293 <a href="https://pod.servicespace.org/login" class="ss-btn ss-btn-outline">Sign In</a> 294 <a href="https://pod.servicespace.org/join" class="ss-btn ss-btn-primary">Join Now</a> 295 </div> 296 297 </div> 298 299
299<script> 300 document.addEventListener('DOMContentLoaded', function() { 301 const header = document.querySelector('.ss-header'); 302 const mobileToggle = document.querySelector('.ss-mobile-toggle'); 303 const mobileMenu = document.querySelector('.ss-mobile-menu'); 304 305 // Header scroll effect 306 if (header) { 307 window.addEventListener('scroll', function() { 308 if (window.scrollY > 50) { 309 header.classList.add('scrolled'); 310 } else { 311 header.classList.remove('scrolled'); 312 } 313 }); 314 } 315 316 // Mobile toggle 317 if (mobileToggle && mobileMenu) { 318 mobileToggle.addEventListener('click', function() { 319 this.classList.toggle('active'); 320 mobileMenu.classList.toggle('open'); 321 document.body.style.overflow = mobileMenu.classList.contains('open') ? 'hidden' : ''; 322 }); 323 } 324 325 document.querySelectorAll('.ss-mobile-nav-item').forEach(item => { 326 item.querySelector('.ss-mobile-nav-link').addEventListener('click', function() { 327 document.querySelectorAll('.ss-mobile-nav-item').forEach(other => { 328 if (other !== item) other.classList.remove('open'); 329 }); 330 item.classList.toggle('open'); 331 }); 332 }); 333 334 document.querySelectorAll('.ss-mobile-subnav a').forEach(link => { 335 link.addEventListener('click', function() { 336 mobileToggle.classList.remove('active'); 337 mobileMenu.classList.remove('open'); 338 document.body.style.overflow = ''; 339 }); 340 }); 341 }); 342 </script>
342 343 344 <main> 345 346 347 <link rel="stylesheet" href="welcome/css/projects.css?1furn"> 348 349 <!-- ============================================ 350 HERO SECTION 351 ============================================ --> 352 <section class="projects-hero"> 353 <div class="projects-hero-bg"> 354 <img src="https://pod.servicespace.org/pics/mem/2/rz_ssp_65c1d9a1e87b8.jpg" alt="Community holding hands in a circle on a field" class="hero-bg-image"> 355 <div class="hero-bg-overlay"></div> 356 </div> 357 <div class="container"> 358 <div class="projects-hero-content"> 359 <span class="section-label">Our Ecosystem</span> 360 <h1>A Living Ecosystem</h1> 361 <p class="projects-hero-subtitle">ServiceSpace isn't an organization — it's an ecosystem. Some things bloom on the surface. Others grow roots over years. And beneath it all, invisible soil nourishes everything.</p> 362 </div> 363 </div> 364 <div class="hero-scroll-hint"> 365 <span>Explore the Layers</span> 366 <i class="bi bi-chevron-down"></i> 367 </div> 368 </section> 369 370 <!-- ============================================ 371 ECOSYSTEM PHILOSOPHY 372 ============================================ --> 373 <section class="section-intro"> 374 <div class="container"> 375 <div class="intro-content"> 376 <p class="intro-lead">Let a thousand flowers bloom.</p> 377 378 <p>Instead of one grand plan executed by staff, we create conditions for generosity to flourish. Some ideas don't take root. Some become unexpectedly revolutionary. Leadership here means <strong>search and amplify</strong> rather than plan and execute.</p> 379 380 <p>All projects share common DNA: volunteer-run, gift-economy, no fundraising, and commitment to inner transformation over external metrics. They're interconnected but autonomous — like mycorrhizal networks in a forest.</p> 381 </div> 382 383 <!-- Ecosystem Layer Navigator --> 384 <div class="layer-nav"> 385 <div class="ecosystem-cross-section"> 386 <a href="#seeds" class="layer-zone zone-seeds"> 387 <div class="zone-icon"><i class="bi bi-sun"></i></div> 388 <div class="zone-text"> 389 <span class="zone-name">Seeds</span> 390 <span class="zone-desc">Receive inspiration</span> 391 </div> 392 </a> 393 <a href="#flowers" class="layer-zone zone-flowers"> 394 <div class="zone-icon"><i class="bi bi-flower2"></i></div> 395 <div class="zone-text"> 396 <span class="zone-name">Flowers</span> 397 <span class="zone-desc">Show up & participate</span> 398 </div> 399 </a> 400 <div class="ground-line"> 401 <span>ground level</span> 402 </div> 403 <a href="#roots" class="layer-zone zone-roots"> 404 <div class="zone-icon"><i class="bi bi-diagram-3"></i></div> 405 <div class="zone-text"> 406 <span class="zone-name">Roots</span> 407 <span class="zone-desc">Commit & belong</span> 408 </div> 409 </a> 410 <a href="#soil" class="layer-zone zone-soil"> 411 <div class="zone-icon"><i class="bi bi-gear"></i></div> 412 <div class="zone-text"> 413 <span class="zone-name">Soil</span> 414 <span class="zone-desc">Build & create</span> 415 </div> 416 </a> 417 </div> 418 </div> 419 420 <p class="intro-note">Scroll down to explore each layer, or click to jump directly.</p> 421 </div> 422 </section> 423 424 <!-- ============================================ 425 SEEDS: Receive Inspiration 426 ============================================ --> 427 <section class="section-layer section-seeds" id="seeds"> 428 <div class="container"> 429 <div class="layer-header"> 430 <div class="layer-depth-indicator">
431 <span class="depth-label">Surface</span> 432 <div class="depth-line"></div> 433 </div> 434 <h2>Seeds</h2> 435 <p class="layer-tagline">Receive Inspiration</p> 436 <p class="layer-philosophy">Brief encounters that plant themselves in receptive soil. No commitment required — just openness. A story, a video, an act of kindness. Something lands, and you're slightly different than before.</p> 437 </div> 438 439 <div class="seeds-grid"> 440 <!-- READ --> 441 <div class="seed-card"> 442 <div class="seed-card-image"> 443 <img src="https://media.giphy.com/media/LXZVGBQlavb2vT2OM2/giphy.gif" alt="Flower blooming"> 444 </div> 445 <div class="seed-card-content"> 446 <div class="seed-card-header"> 447 <i class="bi bi-book"></i> 448 <h3>Read</h3> 449 </div> 450 <p>Let words shift your perspective. One story, one passage, one article at a time.</p> 451 <div class="seed-links"> 452 <a href="https://www.dailygood.org" target="_blank"> 453 <span class="seed-link-name">DailyGood</span> 454 <span class="seed-link-desc">News that inspires, daily</span> 455 </a> 456 <a href="https://www.awakin.org/v2/read" target="_blank"> 457 <span class="seed-link-name">Awakin Weekly</span> 458 <span class="seed-link-desc">Wisdom passages with audio</span> 459 </a> 460 <a href="https://www.conversations.org" target="_blank"> 461 <span class="seed-link-name">Conversations</span> 462 <span class="seed-link-desc">Deep dives into art & culture</span> 463 </a> 464 </div> 465 </div> 466 </div> 467 468 <!-- LISTEN & WATCH --> 469 <div class="seed-card"> 470 <div class="seed-card-image"> 471 <img src="https://plus.unsplash.com/premium_photo-1708366645191-6c2a83564545?q=80&w=600&auto=format&fit=crop" alt="Dog listening attentively"> 472 </div> 473 <div class="seed-card-content"> 474 <div class="seed-card-header"> 475 <i class="bi bi-headphones"></i> 476 <h3>Listen & Watch</h3> 477 </div> 478 <p>Let sound and image open doors. Conversations, music, and films that move the heart.</p> 479 <div class="seed-links"> 480 <a href="https://www.awakin.org/v2/calls" target="_blank"> 481 <span class="seed-link-name">Awakin Calls</span> 482 <span class="seed-link-desc">Heart-centered conversations</span> 483 </a> 484 <a href="https://www.maitritunes.org" target="_blank"> 485 <span class="seed-link-name">MaitriTunes</span> 486 <span class="seed-link-desc">Sacred music portal</span> 487 </a> 488 <a href="https://www.karmatube.org" target="_blank"> 489 <span class="seed-link-name">KarmaTube</span> 490 <span class="seed-link-desc">Videos that spark action</span> 491 </a> 492 </div> 493 </div> 494 </div> 495 496 <!-- REFLECT & ACT --> 497 <div class="seed-card"> 498 <div class="seed-card-image"> 499 <img src="https://www.charityfocus.org/blog/upload/2008/smile_deck2.jpg" alt="Deck of Smile Cards"> 500 </div> 501 <div class="seed-card-content"> 502 <div class="seed-card-header"> 503 <i class="bi bi-heart"></i> 504 <h3>Reflect & Act</h3> 505 </div> 506 <p>Let inspiration move through you. A moment of inquiry, a small act of kindness.</p> 507 <div class="seed-links"> 508 <a href="https://www.awakin.ai" target="_blank">
509 <span class="seed-link-name">Awakin AI</span> 510 <span class="seed-link-desc">Pose a question to wisdom bots</span> 511 </a> 512 <a href="https://www.kindspring.org" target="_blank"> 513 <span class="seed-link-name">KindSpring</span> 514 <span class="seed-link-desc">Small acts, big ripples</span> 515 </a> 516 <a href="https://www.kindspring.org/smilecards" target="_blank"> 517 <span class="seed-link-name">Smile Cards</span> 518 <span class="seed-link-desc">Anonymous kindness, pay it forward</span> 519 </a> 520 </div> 521 </div> 522 </div> 523 </div> 524 </div> 525 </section> 526 527 <!-- ============================================ 528 FLOWERS: Show Up & Participate 529 ============================================ --> 530 <section class="section-layer section-flowers" id="flowers"> 531 <div class="container"> 532 <div class="layer-header"> 533 <div class="layer-depth-indicator"> 534 <div class="depth-line"></div> 535 <span class="depth-label">Above Ground</span> 536 <div class="depth-line"></div> 537 </div> 538 <h2>Flowers</h2> 539 <p class="layer-tagline">Show Up & Participate</p> 540 <p class="layer-philosophy">Visible expressions where inspiration meets action. You show up, something happens, and you return to your life — but something has bloomed in you.</p> 541 </div> 542 543 <div class="flowers-grid"> 544 <!-- Karma Kitchen --> 545 <a href="https://www.karmakitchen.org" target="_blank" class="flower-card"> 546 <div class="flower-image"> 547 <img src="https://img.youtube.com/vi/_S5r7fbLvvc/mqdefault.jpg" alt="Karma Kitchen pay-it-forward restaurant"> 548 <div class="flower-badge">30+ cities</div> 549 </div> 550 <div class="flower-content"> 551 <h3>Karma Kitchen</h3> 552 <p class="flower-tagline">Pay-it-forward restaurant</p> 553 <p>Your bill is $0.00. Your meal was gifted by someone before you. If you wish, pay forward for those who come after.</p> 554 <span class="flower-link">Find a Kitchen <i class="bi bi-arrow-up-right"></i></span> 555 </div> 556 </a> 557 558 <!-- Awakin Circles --> 559 <a href="https://www.awakin.org/v2/local" target="_blank" class="flower-card"> 560 <div class="flower-image"> 561 <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTvWg1xIMAKO8-vnUjIVZ3UiQp6fB3MQ2CnAA&s" alt="People sitting in an Awakin Circle"> 562 <div class="flower-badge">90+ cities</div> 563 </div> 564 <div class="flower-content"> 565 <h3>Awakin Circles</h3> 566 <p class="flower-tagline">Weekly stillness in community</p> 567 <p>An hour of silence, a reading, and heartfelt sharing. No teachers, no fees — just presence.</p> 568 <span class="flower-link">
568Find a Circle <i class="bi bi-arrow-up-right"></i></span> 569 </div> 570 </a> 571 572 <!-- Join a Pod --> 573 <a href="https://pod.servicespace.org/welcome" target="_blank" class="flower-card"> 574 <div class="flower-image"> 575 <img src="https://pod.servicespace.org/pics/mem/2/rz_ssp_631ffa95a257a.jpg" alt="Pod learning circle"> 576 <div class="flower-badge">Global</div> 577 </div> 578 <div class="flower-content"> 579 <h3>Join a Pod</h3> 580 <p class="flower-tagline">Online learning circles</p> 581 <p>Multi-week journeys blending contemplation, micro-practices, and deep sharing. Everyone teaches, everyone learns.</p> 582 <span class="flower-link">Explore Pods <i class="bi bi-arrow-up-right"></i></span> 583 </div> 584 </a> 585 586 <!-- Local Events --> 587 <a href="https://www.awakin.org/v2/local" target="_blank" class="flower-card"> 588 <div class="flower-image"> 589 <img src="https://awakin.org/pics/abad2.jpg" alt="Local community gathering"> 590 </div> 591 <div class="flower-content"> 592 <h3>Local Events</h3> 593 <p class="flower-tagline">Gatherings near you</p> 594 <p>Day retreats, community service days, special gatherings. A taste of immersion without the full commitment.</p> 595 <span class="flower-link">See Upcoming <i class="bi bi-arrow-up-right"></i></span> 596 </div> 597 </a> 598 599 <!-- Volunteer --> 600 <a href="volunteer" class="flower-card"> 601 <div class="flower-image"> 602 <img src="https://images.unsplash.com/photo-1559027615-cd4628902d4a?w=800&q=80" alt="Volunteers working together"> 603 </div> 604 <div class="flower-content"> 605 <h3>Lend Your Hands</h3> 606 <p class="flower-tagline">Online or in-person</p> 607 <p>Serve at a Karma Kitchen, help with a retreat, join a virtual project. Give your hands for a few hours — or a lifetime.</p> 608 <span class="flower-link">How to Volunteer <i class="bi bi-arrow-up-right"></i></span> 609 </div> 610 </a> 611 </div> 612 </div> 613 </section> 614 615 <!-- ============================================ 616 ROOTS: Commit & Belong 617 ============================================ --> 618 <section class="section-layer section-roots" id="roots"> 619 <div class="container"> 620 <div class="layer-header"> 621 <div class="layer-depth-indicator"> 622 <div class="depth-line"></div> 623 <span class="depth-label">Below Ground</span> 624 <div class="depth-line"></div> 625 </div> 626 <h2>Roots</h2> 627 <p class="layer-tagline">Commit & Belong</p> 628 <p class="layer-philosophy">This is where the ecosystem's real strength lies — invisible networks of ongoing connection. Relationships that deepen over months and years. Roots intertwine; you become part of something larger.</p> 629 </div> 630 631 <!-- Featured: Multi-Day Retreats --> 632 <div class="root-featured"> 633 <div class="root-featured-image"> 634 <img src="https://cf2.org/misc/g3-2025.gif" alt="Retreat community moments"> 635 <div class="root-featured-overlay"> 636 <div class="retreat-locations"> 637 <span class="retreat-tag"><span class="flag">ð®ð³</span> Gandhi 3.0</span> 638 <span class="retreat-tag"><span class="flag">ð¦ð¹</span> Awakin Europe</span> 639 <span class="retreat-tag"><span class="flag">ð¯ðµ</span> Kuni Pilgrimage</span>
640 <span class="retreat-tag"><span class="flag">ð»ð³</span> Spirit of Service</span> 641 <span class="retreat-tag"><span class="flag">ðºð¸</span> Bodhisattva</span> 642 </div> 643 </div> 644 </div> 645 <div class="root-featured-content"> 646 <h3>Multi-Day Retreats</h3> 647 <p class="root-tagline">Bonds forged in immersion</p> 648 <p>Step away from ordinary time. 3-7 day gatherings where transformation has room to breathe. No fees, no agendas — entirely gift-based. 11,000+ volunteer hours go into each one.</p> 649 <p>Gandhi 3.0 alumni. Awakin Europe family. Spirit of Service pilgrims. These aren't just events — they're communities born from shared surrender.</p> 650 <a href="https://www.movedbylove.org" class="btn btn-primary" target="_blank"> 651 Explore Retreats <i class="bi bi-arrow-right"></i> 652 </a> 653 </div> 654 </div> 655 656 <!-- Retreat Diversity Showcase --> 657 <div class="retreat-diversity"> 658 <h4>Every Context, One Intention</h4> 659 <p class="retreat-diversity-intro">The same principles — inner transformation, gift culture, emergent design — adapt to radically different contexts:</p> 660 661 <div class="retreat-types-grid"> 662 <a href="https://www.servicespace.org/blog/view.php?id=20515" target="_blank" class="retreat-type"> 663 <i class="bi bi-universal-access"></i> 664 <span class="retreat-type-name">Inclusion</span> 665 <span class="retreat-type-desc">With differently-abled communities</span> 666 </a> 667 <a href="https://www.movedbylove.org/join/youth" target="_blank" class="retreat-type"> 668 <i class="bi bi-stars"></i> 669 <span class="retreat-type-name">Youth</span> 670 <span class="retreat-type-desc">Next generation of heartivists</span> 671 </a> 672 <a href="https://pod.servicespace.org/story/78987/view" target="_blank" class="retreat-type"> 673 <i class="bi bi-tree"></i> 674 <span class="retreat-type-name">Farmers</span> 675 <span class="retreat-type-desc">Permaculture meets inner ecology</span> 676 </a> 677 <a href="https://movedbylove.org/fargo" target="_blank" class="retreat-type"> 678 <i class="bi bi-geo-alt"></i> 679 <span class="retreat-type-name">Heartland</span> 680 <span class="retreat-type-desc">Bridging rural & urban divides</span> 681 </a> 682 <a href="https://awakin.ai/murmur" target="_blank" class="retreat-type"> 683 <i class="bi bi-cpu-fill"></i> 684 <span class="retreat-type-name">AI + Humanity</span> 685 <span class="retreat-type-desc">Technology in service of connection</span> 686 </a> 687 <a href="https://www.dailygood.org/story/3352/when-the-path-leads-kotaro-aoki/" target="_blank" class="retreat-type"> 688 <i class="bi bi-signpost-split"></i> 689 <span class="retreat-type-name">Pilgrimages</span> 690 <span class="retreat-type-desc">Walking as spiritual practice</span> 691 </a> 692 <a href="https://www.servicespace.org/blog/view.php?id=16900" target="_blank" class="retreat-type"> 693 <i class="bi bi-peace"></i> 694 <span class="retreat-type-name">Peace Prayers</span> 695 <span class="retreat-type-desc">At Mount Fuji and beyond</span> 696 </a> 697 <a href="https://www.movedbylove.org/blog/view.php?id=433" target="_blank" class="retreat-type"> 698 <i class="bi bi-people"></i>
699 <span class="retreat-type-name">NGO Leaders</span> 700 <span class="retreat-type-desc">Changemakers reconnecting</span> 701 </a> 702 </div> 703 </div> 704 705 <!-- Video: Immersion in Action --> 706 <div class="roots-video"> 707 <div class="video-container"> 708 <iframe src="https://player.vimeo.com/video/883673126?h=de06d111af" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe> 709 </div> 710 <div class="video-caption"> 711 <p>From a Spirit of Service retreat in Vietnam — farmers, youth, authors, and entrepreneurs becoming brothers and sisters. The language of love communicates everywhere.</p> 712 </div> 713 </div> 714 </div> 715 </section> 716 717 <!-- ============================================ 718 SOIL: Build & Create 719 ============================================ --> 720 <section class="section-layer section-soil" id="soil"> 721 <div class="container"> 722 <div class="layer-header"> 723 <div class="layer-depth-indicator"> 724 <div class="depth-line"></div> 725 <span class="depth-label">Deep Underground</span> 726 </div> 727 <h2>Soil</h2> 728 <p class="layer-tagline">Build & Create</p> 729 <p class="layer-philosophy">Beneath every flower is infrastructure that took years to cultivate. Technology, platforms, accumulated wisdom — all built by volunteers, all offered freely. Here's how you can start something of your own.</p> 730 </div> 731 732 <!-- Host & Create - Primary Actions --> 733 <div class="host-section"> 734 <div class="host-header"> 735 <i class="bi bi-plus-circle"></i> 736 <h3>Start Something</h3> 737 <p>The deepest contribution comes from creating space for others. When you host, you become a nucleus — a center around which community forms.</p> 738 </div> 739 740 <div class="host-grid"> 741 <!-- Host a Circle --> 742 <div class="host-card-expanded"> 743 <div class="host-card-image"> 744 <img src="https://pod.servicespace.org/news/pics/jul2025/austria_retreat.jpg" alt="Circle gathering"> 745 </div> 746 <div class="host-card-content"> 747 <h4>Host a Circle</h4> 748 <p>Weekly gatherings in your living room. An hour of silence, a reading, heartfelt sharing. No expertise required — just presence.</p> 749 <div class="host-examples"> 750 <span class="host-example-label">Types of circles:</span> 751 <span class="host-example">Awakin</span> 752 <span class="host-example">Gratitude</span> 753 <span class="host-example">Death Cafe</span> 754 <span class="host-example">Kindness</span> 755 <span class="host-example">+ more</span> 756 </div> 757 <a href="https://www.movedbylove.org/circles/" target="_blank" class="host-card-link"> 758 Explore 10 Circle Types <i class="bi bi-arrow-right"></i> 759 </a> 760 </div> 761 </div> 762 763 <!-- Host a Pod --> 764 <div class="host-card-expanded"> 765 <div class="host-card-image"> 766 <img src="https://pod.servicespace.org/pics/mem/2/rz_ssp_631ffa95a257a.jpg" alt="Pod learning circle"> 767 </div> 768 <div class="host-card-content"> 769 <h4>Host a Pod</h4> 770 <p>Multi-week online journeys blending contemplation, micro-practices, and deep sharing. Design your own or use existing templates.</p> 771 <div class="host-examples">
772 <span class="host-example-label">Past pods:</span> 773 <span class="host-example">Mystical Music</span> 774 <span class="host-example">Qi Gong</span> 775 <span class="host-example">Rumi</span> 776 <span class="host-example">New Story</span> 777 </div> 778 <a href="https://pod.servicespace.org/host" target="_blank" class="host-card-link"> 779 Start a Pod <i class="bi bi-arrow-right"></i> 780 </a> 781 </div> 782 </div> 783 784 <!-- Build with Awakin AI --> 785 <div class="host-card-expanded"> 786 <div class="host-card-image"> 787 <img src="https://pod.servicespace.org/news/pics/nov2024/ai_hi2.jpg" alt="AI and humanity"> 788 </div> 789 <div class="host-card-content"> 790 <h4>Build with Awakin AI</h4> 791 <p>Dream up and build ways for technology to bring humans together. Create wisdom bots, design sacred interfaces, or join our explorations.</p> 792 <div class="host-examples"> 793 <span class="host-example-label">Possibilities:</span> 794 <span class="host-example">Wisdom Bots</span> 795 <span class="host-example">Murmuration</span> 796 <span class="host-example">Sacred Tech</span> 797 </div> 798 <a href="https://www.awakin.ai" target="_blank" class="host-card-link"> 799 Explore Awakin AI <i class="bi bi-arrow-right"></i> 800 </a> 801 </div> 802 </div> 803 </div> 804 </div> 805 806 <!-- Infrastructure Tools --> 807 <div class="soil-infrastructure"> 808 <h4>Use Our Infrastructure</h4> 809 <p class="infrastructure-intro">All of this was built by volunteers over 26 years. Use it freely to amplify your own work.</p> 810 811 <div class="soil-grid"> 812 <!-- Create a Podcast --> 813 <div class="soil-card"> 814 <div class="soil-icon"><i class="bi bi-mic"></i></div> 815 <h4>Create a Podcast</h4> 816 <p>Use our Awakin Calls infrastructure to host your own interview series.</p> 817 <a href="https://www.awakin.org/v2/calls" target="_blank">Learn More <i class="bi bi-arrow-up-right"></i></a> 818 </div> 819 820 <!-- Start a Newsletter --> 821 <div class="soil-card"> 822 <div class="soil-icon"><i class="bi bi-envelope-heart"></i></div> 823 <h4>Start a Newsletter</h4> 824 <p>Launch your own stream of inspiration, like "Kindful Kids" or themed curations.</p> 825 <a href="partner">Get Started <i class="bi bi-arrow-up-right"></i></a> 826 </div> 827 828 <!-- Host Local Events --> 829 <div class="soil-card"> 830 <div class="soil-icon"><i class="bi bi-calendar-event"></i></div> 831 <h4>Host Local Events</h4> 832 <p>
832Tap into our event infrastructure — registration, communication, coordination.</p> 833 <a href="partner">Partner With Us <i class="bi bi-arrow-up-right"></i></a> 834 </div> 835 836 <!-- Build a Website --> 837 <div class="soil-card"> 838 <div class="soil-icon"><i class="bi bi-window"></i></div> 839 <h4>Build a Website</h4> 840 <p>How we started in 1999. We still host 6,000+ sites for causes worldwide.</p> 841 <a href="https://www.cfsites.org" target="_blank">Visit CFSites <i class="bi bi-arrow-up-right"></i></a> 842 </div> 843 </div> 844 </div> 845 846 <div class="soil-philosophy"> 847 <blockquote> 848 "The best technology is invisible. It creates conditions for connection, then disappears." 849 </blockquote> 850 <p>All of this is strictly non-commercial. No ads. No data harvesting. No venture capital. Just volunteers building tools for a more compassionate world.</p> 851 </div> 852 853 <div class="soil-cta"> 854 <a href="partner" class="btn btn-primary"> 855 <i class="bi bi-handshake"></i> Partner With Us 856 </a> 857 </div> 858 </div> 859 </section> 860 861 <!-- ============================================ 862 LIVING PROOF - A Moment of Emergence 863 ============================================ --> 864 <section class="section-living-proof"> 865 <div class="container"> 866 <div class="living-proof-content"> 867 <div class="living-proof-video"> 868 <div class="video-container"> 869 <iframe src="https://player.vimeo.com/video/789918800?h=34ad56e212" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe> 870 </div> 871 </div> 872 <div class="living-proof-text"> 873 <span class="section-label">Living Proof</span> 874 <h3>When the Whole Becomes Greater</h3> 875 <p>These projects aren't separate. They weave together — seeds become flowers, flowers develop roots, roots enrich the soil. And sometimes, in a village immersion or a silent retreat, something emerges that none of us planned.</p> 876 <p class="living-proof-note">Over 26 years, millions have been touched. But we don't lead with numbers. We lead with the invitation.</p> 877 <a href="https://www.movedbylove.org/retreat/g3/?pg=alumni" target="_blank" class="living-proof-link"> 878 <i class="bi bi-people"></i> Hear from retreat alumni 879 </a> 880 </div> 881 </div> 882 </div> 883 </section> 884 885 <!-- ============================================ 886 CLOSING SECTION 887 ============================================ --> 888 <section class="section-closing"> 889 <div class="container"> 890 <div class="closing-content"> 891 <h2>Enter the Ecosystem</h2> 892 <p>There's no wrong door. Receive a seed if that's what you have capacity for. Show up to a flower if you're ready to meet others. Let roots grow if you're craving belonging. Or help build the soil if you want to nurture what nurtures everyone.</p> 893 894 <div class="closing-layers"> 895 <a href="#seeds" class="closing-layer"> 896 <i class="bi bi-sun"></i> 897 <span>I want to receive something</span> 898 </a> 899 <a href="#flowers" class="closing-layer"> 900 <i class="bi bi-flower2"></i> 901 <span>I want to show up somewhere</span> 902 </a> 903 <a href="#roots" class="closing-layer"> 904 <i class="bi bi-diagram-3"></i> 905 <span>I want to belong somewhere</span> 906 </a> 907 <a href="#soil" class="closing-layer"> 908 <i class="bi bi-gear"></i>
909 <span>I want to build something</span> 910 </a> 911 </div> 912 913 <div class="closing-links"> 914 <a href="join" class="btn btn-primary"> 915 Begin Your Journey <i class="bi bi-arrow-right"></i> 916 </a> 917 <a href="vision" class="btn btn-secondary">Our Vision</a> 918 <a href="about" class="btn btn-secondary">Our Story</a> 919 </div> 920 </div> 921 </div> 922 </section> 923 924 925 </main> 926 927 <!-- ============================================ 928 GLOBAL FOOTER 929 ============================================ --> 930 <footer class="ss-footer"> 931 <div class="ss-footer-container"> 932 933 <div class="ss-footer-main"> 934 935 <!-- Brand Column --> 936 <div class="ss-footer-brand"> 937 <a href="https://www.servicespace.org" class="ss-footer-logo"> 938 <img src="https://www.servicespace.org/images/index2026/logo_sm_light.png" alt="ServiceSpace"> 939 </a> 940 <p class="ss-footer-tagline"> 941 Small acts that change the world.<br> 942 Volunteer-run since 1999. 943 </p> 944 <div class="ss-footer-social"> 945 <a href="https://www.facebook.com/servicespace" target="_blank" aria-label="Facebook"> 946 <i class="bi bi-facebook"></i> 947 </a> 948 <a href="https://twitter.com/servicespace" target="_blank" aria-label="Twitter"> 949 <i class="bi bi-twitter-x"></i> 950 </a> 951 <a href="https://www.instagram.com/servicespace" target="_blank" aria-label="Instagram"> 952 <i class="bi bi-instagram"></i> 953 </a> 954 <a href="https://www.youtube.com/charityfocus" target="_blank" aria-label="YouTube"> 955 <i class="bi bi-youtube"></i> 956 </a> 957 </div> 958 </div> 959 960 <!-- Projects Column (was Ecosystem) --> 961 <div class="ss-footer-column"> 962 <h4>Projects</h4> 963 <ul> 964 <li><a href="https://www.servicespace.org/projects">All Projects</a></li> 965 <li><a href="https://www.dailygood.org" target="_blank">DailyGood</a></li> 966 <li><a href="https://www.karmakitchen.org" target="_blank">Karma Kitchen</a></li> 967 <li><a href="https://www.awakin.org" target="_blank">Awakin Circles</a></li> 968 <li><a href="https://www.kindspring.org" target="_blank">KindSpring</a></li> 969 </ul> 970 </div> 971 972 <!-- Pods Column --> 973 <div class="ss-footer-column"> 974 <h4>Pods</h4> 975 <ul> 976 <li><a href="https://pod.servicespace.org/">What Are Pods?</a></li> 977 <li><a href="https://pod.servicespace.org/apply">Join a Pod</a></li> 978 <li><a href="https://pod.servicespace.org/about">Our Approach</a></li> 979 <li><a href="https://pod.servicespace.org/host">Host a Pod</a></li> 980 <li><a href="https://pod.servicespace.org/faq">FAQ</a></li> 981 </ul> 982 </div> 983 984 <!-- About Column --> 985 <div class="ss-footer-column"> 986 <h4>About</h4> 987 <ul> 988 <li><a href="https://www.servicespace.org/about">About Us</a></li> 989 <li><a href="https://www.servicespace.org/join">Get Involved</a></li> 990 <li><a href="https://www.servicespace.org/donate">Donate</a></li> 991 <li><a href="https://pod.servicespace.org/contact">Contact Us</a></li> 992 <li><a href="https://pod.servicespace.org/privacy">Privacy</a>, <a href="https://pod.servicespace.org/terms">Terms</a></li> 993 </ul> 994 </div> 995 996 </div> 997 998 <div class="ss-footer-bottom"> 999 <p class="ss-footer-copyright"> 1000 <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank" rel="license" class="cc-license">
1001 <span class="cc-icons"> 1002 <i class="bi bi-cc-circle"></i> 1003 <i class="bi bi-person-circle"></i> 1004 </span> 1005 <span>CC BY-NC-ND 4.0</span> 1006 </a> 1007 </p> 1008 <p class="ss-footer-gift"> 1009 <i class="bi bi-gift"></i> 1010 100% volunteer-run. No ads. No fundraising. Just love. 1011 </p> 1012 </div> 1013 1014 </div> 1015 </footer> 1016 1017 <!-- Swiper JS (for carousels) --> 1018
1018<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
1018 1019 1020 <!-- ============================================ 1021 SCRIPTS 1022 ============================================ --> 1023 1024
1024<script src="welcome/js/scripts.js"></script>
1024 1025 1026 1027 <!-- Google Analytics --> 1028
1028<script>
vendor: 368 bytes, lines 1028-1033
1028 1029 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 1030 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 1031 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 1032 })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 1033 ga('create', '
1033UA-472633-14
vendor: 48 bytes, lines 1033-1035
1033', 'auto'); 1034 ga('send', 'pageview'); 1035
1035</script>
1035 1036 1037 1038
1038<script> 1039(function() { 1040 'use strict'; 1041 console.log('SSO: Script starting'); 1042 1043 // Skip SSO on dev/coder environments â no production Pod to check against 1044 if (window.location.hostname.endsWith('.coder.dev.servicespace.org')) { 1045 console.log('SSO: Dev environment detected, skipping SSO check'); 1046 return; 1047 } 1048 1049 // 2026-09-10: Skip on Pod itself. Pod is the SSO primary -- there is no 1050 // other site whose cookie could log a Pod guest in. Running this here 1051 // (pod's welcome/tpl/footer_global.tpl includes it) sent cold-session 1052 // visitors through check.php with return=pod.servicespace.org, which 1053 // check.php rejected with a blank "Invalid return URL domain" page. 1054 if (window.location.hostname === 'pod.servicespace.org') { 1055 console.log('SSO: On Pod (primary), skipping SSO check'); 1056 return; 1057 } 1058 1059 // Cooldown periods (in milliseconds) 1060 var QUICK_COOLDOWN = 10000; // 10 seconds - between any checks (per-tab) 1061 var NOT_LOGGED_IN_TTL = 1800000; // 30 minutes - how long to remember "not logged in" 1062 var VISIBILITY_MIN_AGE = 300000; // 5 minutes - min age before tab-switch triggers recheck 1063 1064 // When user returns to this tab after being away a while, clear the 1065 // "not logged in" cache so we re-check SSO status. This handles the 1066 // case where user logs in on another tab/site then returns here. 1067 document.addEventListener('visibilitychange', function() { 1068 if (document.visibilityState === 'visible') { 1069 var checkedAt = parseInt(localStorage.getItem('sso_not_logged_in_at') || '0'); 1070 if (checkedAt && (Date.now() - checkedAt >= VISIBILITY_MIN_AGE)) { 1071 console.log('SSO: Tab visible after 5+ min, clearing cache for fresh check'); 1072 localStorage.removeItem('sso_not_logged_in_at'); 1073 sessionStorage.removeItem('sso_last_attempt'); 1074 } 1075 } 1076 }); 1077 1078 // Check if user just logged out - skip SSO check to prevent re-login loop 1079 if (document.cookie.indexOf('sso_logout=') !== -1) { 1080 console.log('SSO: Recent logout detected, skipping check'); 1081 // Clear the cookie now that we've respected it 1082 document.cookie = 'sso_logout=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; 1083 // Also cache that we're not logged in (prevents check on next tab) 1084 localStorage.setItem('sso_not_logged_in_at', Date.now().toString()); 1085 return; 1086 } 1087 1088 var urlParams = new URLSearchParams(window.location.search); 1089 var ssoToken = urlParams.get('sso_token'); 1090 1091 // Handle returning from redirect-based flow with sso_token 1092 if (ssoToken) { 1093 console.log('SSO: Has sso_token from redirect flow, completing login'); 1094 sessionStorage.setItem('sso_last_attempt', Date.now().toString()); 1095 // Clear the "not logged in" cache since we're about to log in 1096 localStorage.removeItem('sso_not_logged_in_at'); 1097 1098 // Clean the URL by removing sso_token parameter 1099 var cleanUrl = window.location.href.split('?')[0]; 1100 var params = new URLSearchParams(window.location.search); 1101 params.delete('sso_token'); 1102 params.delete('sso_checked'); 1103 var remainingParams = params.toString(); 1104 if (remainingParams) { 1105 cleanUrl += '?' + remainingParams; 1106 } 1107 1108 // Redirect to local login endpoint with the token 1109 window.location.href = '/sso/login.php?token=' + 1110 encodeURIComponent(ssoToken) + 1111 '&return=' + encodeURIComponent(cleanUrl); 1112 return; 1113 } 1114 1115 // If sso_checked flag is present, Pod confirmed we're not logged in there 1116 if (urlParams.get('sso_checked')) { 1117 console.log('SSO: sso_checked param present, user not logged in on Pod'); 1118 // Store in localStorage so ALL tabs know we're not logged in 1119 localStorage.setItem('sso_not_logged_in_at', Date.now().toString()); 1120 sessionStorage.setItem('sso_last_attempt', Date.now().toString()); 1121 // Clean sso_checked from URL so it doesn't appear in shared/copied links 1122 var params = new URLSearchParams(window.location.search); 1123 params.delete('sso_checked'); 1124 var clean = params.toString(); 1125 var cleanUrl = window.location.pathname + (clean ? '?' + clean : '') + window.location.hash; 1126 history.replaceState(null, '', cleanUrl); 1127 return; 1128 } 1129
1130 // Check localStorage cache: are we already confirmed "not logged in"? 1131 var notLoggedInAt = parseInt(localStorage.getItem('sso_not_logged_in_at') || '0'); 1132 if (notLoggedInAt && (Date.now() - notLoggedInAt < NOT_LOGGED_IN_TTL)) { 1133 console.log('SSO: Cached not-logged-in (' + Math.round((NOT_LOGGED_IN_TTL - (Date.now() - notLoggedInAt))/60000) + ' min remaining), skipping'); 1134 return; 1135 } 1136 1137 // Quick cooldown: Don't check too frequently within same tab (10 seconds) 1138 var lastAttempt = parseInt(sessionStorage.getItem('sso_last_attempt') || '0'); 1139 if (Date.now() - lastAttempt < QUICK_COOLDOWN) { 1140 console.log('SSO: Within quick cooldown, skipping check'); 1141 return; 1142 } 1143 1144 // Prevent concurrent checks 1145 if (window.ssoChecking) { 1146 console.log('SSO: Already checking, skipping'); 1147 return; 1148 } 1149 window.ssoChecking = true; 1150 1151 // Helper function to do redirect-based SSO check 1152 function doRedirectCheck() { 1153 console.log('SSO: Using redirect approach'); 1154 sessionStorage.setItem('sso_last_attempt', Date.now().toString()); 1155 var returnUrl = encodeURIComponent(window.location.href); 1156 window.location.href = 'https://pod.servicespace.org/sso/check.php?return=' + returnUrl; 1157 } 1158 1159 // Check if we already tried fetch and it failed (use redirect instead) 1160 var fetchFailed = sessionStorage.getItem('sso_fetch_failed'); 1161 if (fetchFailed) { 1162 console.log('SSO: Fetch previously failed, using redirect approach'); 1163 sessionStorage.removeItem('sso_fetch_failed'); 1164 doRedirectCheck(); 1165 return; 1166 } 1167 1168 console.log('SSO: Starting fetch to Pod status endpoint'); 1169 1170 // Try fetch approach first (works when third-party cookies allowed) 1171 fetch('https://pod.servicespace.org/sso/status.php', { 1172 method: 'GET', 1173 credentials: 'include', 1174 mode: 'cors', 1175 cache: 'no-store' 1176 }) 1177 .then(function(response) { 1178 console.log('SSO: Got response', response.status); 1179 if (!response.ok) throw new Error('Network error: ' + response.status); 1180 return response.json(); 1181 }) 1182 .then(function(data) { 1183 console.log('SSO: Parsed data', data); 1184 sessionStorage.setItem('sso_last_attempt', Date.now().toString()); 1185 1186 if (data.logged_in && data.token) { 1187 console.log('SSO: User logged in on Pod, redirecting to local login');
1188 // Clear cached "not logged in" since user IS logged in 1189 localStorage.removeItem('sso_not_logged_in_at'); 1190 window.location.href = '/sso/login.php?token=' + 1191 encodeURIComponent(data.token) + 1192 '&return=' + encodeURIComponent(window.location.href); 1193 } else if (!data.logged_in && data.cookie_present === false) { 1194 // Third-party cookies are blocked! 1195 // Pod didn't receive any cookies, so it can't know if user is logged in 1196 // Try redirect fallback which uses first-party Pod cookie 1197 console.log('SSO: Cookies blocked (third-party), trying redirect fallback'); 1198 doRedirectCheck(); 1199 } else { 1200 console.log('SSO: Not logged in on Pod (confirmed with cookies present)'); 1201 // User genuinely not logged in on Pod - cache in localStorage 1202 localStorage.setItem('sso_not_logged_in_at', Date.now().toString()); 1203 window.ssoChecking = false; 1204 } 1205 }) 1206 .catch(function(error) { 1207 console.log('SSO: Fetch failed:', error.message); 1208 // Mark that fetch failed so we use redirect 1209 sessionStorage.setItem('sso_fetch_failed', '1'); 1210 sessionStorage.setItem('sso_last_attempt', Date.now().toString()); 1211 doRedirectCheck(); 1212 }); 1213})(); 1214</script>
1214 1215 1216</body> 1217</html> 1218
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.