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.0"> 6 <title>Juvion Health Sciences | Science to Sustain Motion</title> 7 8 <!-- SEO --> 9 <meta name="description" content="Juvion Health Sciences develops science-backed therapeutics to preserve neuromuscular pathways and sustain healthy aging."> 10 <meta name="robots" content="index, follow"> 11 <link rel="canonical" href="https://juvionhs.com/"> 12 13 <!-- Open Graph --> 14 <meta property="og:type" content="website"> 15 <meta property="og:url" content="https://juvionhs.com/"> 16 <meta property="og:title" content="Juvion Health Sciences | Science to Sustain Motion"> 17 <meta property="og:description" content="Preserving neuromuscular pathways for active aging through science-backed therapeutics."> 18 <meta property="og:image" content="https://juvionhs.com/assets/JuvionLogo.png"> 19 20 <!-- Twitter Card --> 21 <meta name="twitter:card" content="summary_large_image"> 22 <meta name="twitter:title" content="Juvion Health Sciences"> 23 <meta name="twitter:description" content="Preserving neuromuscular pathways for active aging."> 24 <meta name="twitter:image" content="https://juvionhs.com/assets/JuvionLogo.png"> 25 26 <!-- Structured Data --> 27
27<script type="application/ld+json"> 28 { 29 "@context": "https://schema.org", 30 "@type": ["Organization", "MedicalOrganization"], 31 "name": "Juvion Health Sciences", 32 "url": "https://juvionhs.com", 33 "logo": "https://juvionhs.com/assets/JuvionLogo.png", 34 "description": "Science-backed therapeutics to preserve neuromuscular pathways for healthy aging.", 35 "address": { 36 "@type": "PostalAddress", 37 "streetAddress": "EPFL Innovation Park, Bâtiment C", 38 "addressLocality": "Lausanne", 39 "postalCode": "1015", 40 "addressRegion": "VD", 41 "addressCountry": "CH" 42 }, 43 "sameAs": [ 44 "https://www.linkedin.com/company/juvion-health-sciences/" 45 ], 46 "founder": { 47 "@type": "Person", 48 "name": "Dr. Soumya Banerjee", 49 "sameAs": "https://www.linkedin.com/in/soumya-banerjee83/" 50 }, 51 "knowsAbout": [ 52 "Neuromuscular junction therapeutics", 53 "Healthy aging", 54 "Drosophila behavioral screening", 55 "Drug discovery", 56 "Sarcopenia" 57 ], 58 "contactPoint": { 59 "@type": "ContactPoint", 60 "contactType": "general", 61 "availableLanguage": ["English", "French"] 62 } 63 } 64 </script>
64 65 66 <!-- Team Person Schema --> 67
67<script type="application/ld+json"> 68 { 69 "@context": "https://schema.org", 70 "@type": "ItemList", 71 "name": "Juvion Health Sciences Core Team", 72 "itemListElement": [ 73 { 74 "@type": "ListItem", 75 "position": 1, 76 "item": { 77 "@type": "Person", 78 "name": "Dr. Soumya Banerjee", 79 "jobTitle": "CEO & Co-Founder", 80 "affiliation": { "@type": "Organization", "name": "Juvion Health Sciences" }, 81 "sameAs": "https://www.linkedin.com/in/soumya-banerjee83/" 82 } 83 }, 84 { 85 "@type": "ListItem", 86 "position": 2, 87 "item": { 88 "@type": "Person", 89 "name": "Professor Brian McCabe", 90 "jobTitle": "Co-Founder & Chairman of the Scientific Advisory Board", 91 "affiliation": { "@type": "Organization", "name": "Juvion Health Sciences" }, 92 "sameAs": "https://www.linkedin.com/in/briandmccabe/" 93 } 94 }, 95 { 96 "@type": "ListItem", 97 "position": 3, 98 "item": { 99 "@type": "Person", 100 "name": "Laly Robyr", 101 "jobTitle": "Head of Innovation", 102 "affiliation": { "@type": "Organization", "name": "Juvion Health Sciences" }, 103 "sameAs": "https://www.linkedin.com/in/laly-robyr-121024305/" 104 } 105 }, 106 { 107 "@type": "ListItem", 108 "position": 4, 109 "item": { 110 "@type": "Person", 111 "name": "Sebastien Guilmot", 112 "jobTitle": "Operations Manager", 113 "affiliation": { "@type": "Organization", "name": "Juvion Health Sciences" }, 114 "sameAs": "https://www.linkedin.com/in/sebastien-guilmot/" 115 } 116 }, 117 { 118 "@type": "ListItem", 119 "position": 5, 120 "item": { 121 "@type": "Person", 122 "name": "Sofia Domingues", 123 "jobTitle": "Business Development Associate", 124 "affiliation": { "@type": "Organization", "name": "Juvion Health Sciences" }, 125 "sameAs": "https://www.linkedin.com/in/sofiamelodomingues/" 126 } 127 }, 128 { 129 "@type": "ListItem", 130 "position": 6, 131 "item": { 132 "@type": "Person", 133 "name": "Priyanka Dutta Passecker", 134 "jobTitle": "Chief, Platform Operations", 135 "affiliation": { "@type": "Organization", "name": "Juvion Health Sciences" }, 136 "sameAs": "https://www.linkedin.com/in/priyankaduttapassecker/" 137 } 138 } 139 ] 140 } 141 </script>
141 142 143
143<script src="https://cdn.tailwindcss.com"></script>
143 144 <link rel="preconnect" href="https://fonts.googleapis.com"> 145 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 146 <link rel="preload" href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,500;0,600;0,700;1,400;1,600&family=Inter:wght@300;400;500;600&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'"> 147 <noscript><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,500;0,600;0,700;1,400;1,600&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet"></noscript> 148 <link rel="stylesheet" href="styles.css"> 149 <link rel="icon" type="image/png" href="assets/JuvionLogo.png"> 150 <link rel="apple-touch-icon" href="assets/JuvionLogo.png"> 151
151<script> 152 tailwind.config = { 153 theme: { 154 extend: { 155 colors: { brand: '#fe6603' }, 156 fontFamily: { 157 display: ['"Playfair Display"', 'Georgia', 'serif'], 158 sans: ['Inter', 'system-ui', 'sans-serif'], 159 } 160 } 161 } 162 } 163 </script>
163 164
164<script defer src="/_vercel/speed-insights/script.js"></script>
164 165
165<script src="https://cdnjs.cloudflare.com/ajax/libs/lottie-web/5.12.2/lottie.min.js"></script>
165 166</head> 167<body class="bg-[#080808] text-[#F2EFE9] font-sans antialiased"> 168 169 <!-- GRAIN OVERLAY --> 170 <div class="grain-overlay" aria-hidden="true"></div> 171 172 <!-- ââ NAVIGATION âââââââââââââââââââââââââââââââââââââââââââ --> 173 <nav id="nav"> 174 <div class="nav-inner"> 175 <a href="#home" class="nav-brand"> 176 <img src="assets/JuvionLogo.png" class="nav-logo-icon" alt="Juvion Health Sciences"> 177 <span class="logo-sub" style="margin-left:0">Juvion Health Sciences</span> 178 </a> 179 <div class="nav-links"> 180 <a href="/" class="nav-link">Home</a> 181 <a href="/products" class="nav-link">Products</a> 182 <a href="/flygym" class="nav-link">FlyGym & Services</a> 183 <a href="/news" class="nav-link">News & Publications</a> 184 <a href="/career" class="nav-link">Careers</a> 185 <a href="/contact" class="nav-cta">Contact</a> 186 </div> 187 <button class="nav-burger" id="navBurger" aria-label="Menu" aria-expanded="false"> 188 <span></span><span></span><span></span> 189 </button> 190 </div> 191 <div class="nav-mobile" id="navMobile"> 192 <a href="/" class="nav-mobile-link">Home</a> 193 <a href="/products" class="nav-mobile-link">Products</a> 194 <a href="/flygym" class="nav-mobile-link">FlyGym & Services</a> 195 <a href="/news" class="nav-mobile-link">News & Publications</a> 196 <a href="/career" class="nav-mobile-link">Careers</a> 197 <a href="/contact" class="nav-mobile-link">Contact</a> 198 <div class="lang-switcher lang-switcher--mobile"> 199 <a class="lang-btn" data-lang="en" href="/">EN</a> 200 <a class="lang-btn" data-lang="fr" href="/fr/">FR</a> 201 <a class="lang-btn" data-lang="de" href="/de/">DE</a> 202 </div> 203 </div> 204 </nav> 205 206 <!-- ââ PAGE SUBNAV âââââââââââââââââââââââââââââââââââââââââ --> 207 <div class="page-subnav" id="pageSubnav"> 208 <div class="page-subnav-inner"> 209 <a href="#home" class="page-subnav-link">Home</a> 210 <a href="#approach" class="page-subnav-link">Approach</a> 211 <a href="#science" class="page-subnav-link">Science</a> 212 <a href="#team" class="page-subnav-link">Team</a> 213 <a href="#news" class="page-subnav-link">News</a> 214 215 <div class="lang-switcher" id="langSwitcher"> 216 <a class="lang-btn" data-lang="en" href="/">EN</a> 217 <a class="lang-btn" data-lang="fr" href="/fr/">FR</a> 218 <a class="lang-btn" data-lang="de" href="/de/">DE</a> 219 </div> 220 </div> 221 </div> 222 223 <!-- ââ HERO âââââââââââââââââââââââââââââââââââââââââââââââââ --> 224 <section id="home" class="hero"> 225 <div class="hero-glow" aria-hidden="true"></div> 226 <div class="container hero-grid"> 227 <div class="hero-left"> 228 <h1 class="hero-heading reveal"> 229 The Future<br><em>of Living</em> 230 </h1> 231 <p class="hero-subtitle reveal">science to sustain motion</p> 232 <p class="hero-sub reveal"> 233 Swiss innovation for healthy aging, dedicated to preserving communication in the nervous system for active living and delaying associated diseases. 234 </p> 235 <div class="hero-ctas reveal"> 236 <a href="/flygym#work-with-us" class="btn-primary">Partner with FlyGym</a> 237 <a href="/products" class="btn-ghost">View Pipeline & Products <span class="arrow">â</span></a> 238 </div> 239 </div> 240 <div class="hero-right reveal"> 241 <div class="neuro-wrap" aria-hidden="true"> 242 <canvas id="neuroCvs" class="neuro-canvas" width="700" height="440"></canvas> 243 <div class="neuro-controls"> 244 <span class="neuro-label">Young</span> 245 <input type="range" id="neuroAge" class="neuro-slider" min="0" max="100" value="0" aria-label="Age slider"> 246 <span class="neuro-label">Old</span> 247 </div> 248 <div id="runnerContainer" class="runner-canvas" aria-hidden="true"></div> 249 250 </div> 251 </div> 252 </div> 253 <div class="scroll-hint" aria-hidden="true">
254 <span>Scroll</span> 255 <div class="scroll-line"></div> 256 </div> 257 </section> 258 259 <!-- ââ STATS BAR ââââââââââââââââââââââââââââââââââââââââââââ --> 260 <section class="stats-bar"> 261 <div class="container stats-grid stats-grid--4"> 262 <div class="stat-item reveal"> 263 <div class="stat-number">1.4B</div> 264 <p class="stat-label">Adults aged 60 or older by 2030, driving unprecedented demand for aging therapeutics</p> 265 </div> 266 <div class="stat-divider" aria-hidden="true"></div> 267 <div class="stat-item reveal" style="--delay:0.08s"> 268 <div class="stat-number">1 in 4</div> 269 <p class="stat-label">Older adults experience significant mobility loss or a fall each year</p> 270 </div> 271 <div class="stat-divider" aria-hidden="true"></div> 272 <div class="stat-item reveal" style="--delay:0.16s"> 273 <div class="stat-number">1 in 3</div> 274 <p class="stat-label">Adults over 70 live with sarcopenia, with prevalence rising sharply with age</p> 275 </div> 276 <div class="stat-divider" aria-hidden="true"></div> 277 <div class="stat-item reveal" style="--delay:0.24s"> 278 <div class="stat-number">$100B+</div> 279 <p class="stat-label">Annual global cost attributed to falls and sarcopenia combined</p> 280 </div> 281 </div> 282 </section> 283 284 <!-- ââ OUR DIFFERENTIATED APPROACH âââââââââââââââââââââââââ --> 285 <section id="approach" class="section section--surface"> 286 <div class="container"> 287 <div class="section-header reveal"> 288 <h2 class="section-heading">Differentiated strategy</h2> 289 </div> 290 291 <!-- Box 1: Science --> 292 <div class="approach-box reveal"> 293 <div class="approach-text"> 294 <h3 class="approach-box-title">Science to preserve<br>neuromuscular pathways</h3> 295 <p class="approach-box-body"> 296 The neuromuscular junction (NMJ) is the vital link between motor neurons and muscle. Aging disrupts this connection, weakening neural signaling and contributing to the gradual loss of strength and mobility. 297 </p> 298 <p class="approach-box-body" style="margin-top:1rem"> 299 Juvion develops therapeutics from natural resources that preserve NMJ structure and function, protecting the communication between nerve and muscle that supports healthy movement throughout life. 300 </p> 301 </div> 302 <div class="approach-media"> 303 <img src="./assets/flygym/NCOMMS-20-34381B_adjusted.jpeg" alt="Young vs Aging NMJ comparison" width="1200" height="725" loading="lazy" class="approach-img" style="object-position: left center;"> 304 <p class="approach-media-caption">Young vs. aging NMJ</p> 305 </div> 306 </div> 307 308 <!-- Box 2: FlyGym --> 309 <div class="approach-box approach-box--reverse reveal" style="--delay:0.1s"> 310 <div class="approach-media"> 311 <div class="approach-img" style="background:#1c1c1c;aspect-ratio:16/9;display:flex;align-items:stretch;justify-content:stretch;padding:0;border-radius:var(--radius);overflow:hidden"> 312 <svg class="tracking-tube-svg" viewBox="0 0 800 450" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:100%;display:block" aria-hidden="true"> 313 <defs> 314 <symbol id="fly-shape-track" viewBox="0 0 230 230" overflow="visible"> 315 <g transform="translate(0,-236.14582)"> 316 <path style="fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 139.21827,332.03946 37.28607,37.28607 13.98227,32.62531"/> 317 <path style="fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 148.53979,313.39643 h 55.92909"/> 318 <path style="fill:currentColor;fill-opacity:1;stroke:currentColor;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 115.91448,420.59387 c -27.964549,0 -27.964549,-55.9291 -27.964549,-55.9291 0,0 0,-23.30379 27.964549,-23.30379 27.96455,0 27.96455,23.30379 27.96455,23.30379 0,0 0,55.9291 -27.96455,55.9291 z"/> 319 <path style="fill:currentColor;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 90.746386,387.96857 4.660758,16.77872 5.592906,9.32152 8.38937,5.59291 8.38936,0.93215 7.45722,-2.79646 4.66076,-3.7286 6.52506,-9.32152 3.7286,-10.25367 0.93216,-6.52505 z"/>
319 320 <path style="fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 87.949931,360.00401 H 143.87903"/> 321 <path style="fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 87.949931,373.98628 H 143.87903"/> 322 <path style="fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 90.746386,387.96857 H 141.08258"/> 323 <circle style="fill:currentColor;fill-opacity:1;stroke:currentColor;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" cx="115.91447" cy="311.53214" r="33.593773"/> 324 <path style="fill:currentColor;fill-opacity:1;stroke:currentColor;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 115.91448,276.11037 H 87.949931 c 0,0 0,-23.30379 27.964549,-23.30379 27.96455,0 27.96455,23.30379 27.96455,23.30379 h -27.96455"/> 325 <path style="fill:currentColor;fill-opacity:1;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 143.87903,276.11037 c -4.93874,2.64313 -10.58217,-4.86995 -13.98227,-9.32152 -2.98209,-3.90429 -7.99881,-10.37758 -4.66076,-13.98227 4.35227,-4.69993 14.70095,-0.38817 18.64303,4.66076 3.82437,4.89817 5.47902,15.71074 0,18.64303 z"/> 326 <path style="fill:none;fill-opacity:1;stroke:currentColor;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 147.93997,292.1488 c 17.27296,11.6661 34.93169,30.24164 47.31396,49.38253 13.61416,21.0452 26.42826,44.70528 28.1967,69.70766 0.57047,8.06547 1.38507,19.91387 -5.84018,23.54332 -15.82876,7.95123 -35.01044,-9.68299 -49.01548,-20.52874 -13.54969,-10.49312 -23.42938,-25.61608 -31.09519,-40.94366 -4.90011,-9.79761 -9.87174,-20.68104 -9.0182,-31.60237 0.87346,-11.17613 12.78439,-19.3854 14.1408,-30.51324 0.59445,-4.87675 -4.86552,-10.01037 -2.80345,-14.46953 1.30417,-2.82021 5.54614,-6.31504 8.12104,-4.57597 z"/> 327 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 140.17344,295.45508 c -0.28226,0.41434 23.32086,56.47482 30.37499,82.38954 3.28979,12.08567 -0.22617,37.57556 -0.22617,37.57556"/> 328 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 142.96425,292.81258 c 0,0 22.46111,55.68145 35.8083,82.53787 10.37137,20.86867 34.31978,60.90775 34.31978,60.90775"/> 329 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 179.23015,376.16257 -8.68172,1.68205"/> 330 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 143.77635,292.35499 27.55892,50.80798 c 21.5446,28.77409 38.94787,56.44409 52.10821,82.98285"/> 331 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 171.33527,343.16297 -5.68471,3.20319"/> 332 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 160.24985,321.5907 48.87979,43.07407"/> 333 <path style="fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 139.21827,285.43188 27.96455,-32.6253 18.64303,-4.66076"/> 334 <path style="fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 92.610689,332.03946 55.324625,369.32553 41.34235,401.95084"/> 335 <path style="fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 83.289174,313.39643 H 27.360077"/> 336 <path style="fill:currentColor;fill-opacity:1;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 87.949931,276.11037 c 4.938735,2.64313 10.582177,-4.86995 13.982279,-9.32152 2.98208,-3.90429 7.9988,-10.37758 4.66076,-13.98227 -4.35229,-4.69993 -14.70095,-0.38817 -18.643039,4.66076 -3.824375,4.89817 -5.479029,15.71074 0,18.64303 z"/> 337 <path style="fill:none;fill-opacity:1;stroke:currentColor;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 83.888995,292.1488 c -17.272975,11.6661 -34.931693,30.24164 -47.313966,49.38253 -13.614159,21.0452 -26.42826,44.70528 -28.1966917,69.70766 -0.5704768,8.06547 -1.3850841,19.91387 5.8401817,23.54332 15.828755,7.95123 35.010431,-9.68299 49.015477,-20.52874 13.549691,-10.49312 23.42938,-25.61608 31.095189,-40.94366 4.900098,-9.79761 9.871735,-20.68104 9.018195,-31.60237 -0.87346,-11.17613 -12.784386,-19.3854 -14.140796,-30.51324 -0.594452,-4.87675 4.865514,-10.01037 2.803445,-14.46953 -1.304173,-2.82021 -5.546143,-6.31504 -8.121034,-4.57597 z"/> 338 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;
338stroke-opacity:1" d="m 91.655522,295.45508 c 0.282256,0.41434 -23.320857,56.47482 -30.374989,82.38954 -3.289787,12.08567 0.226167,37.57556 0.226167,37.57556"/> 339 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 88.864708,292.81258 c 0,0 -22.461107,55.68145 -35.808297,82.53787 C 42.68504,396.21912 18.73663,436.2582 18.73663,436.2582"/> 340 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 52.598818,376.16257 8.681715,1.68205"/> 341 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 88.052608,292.35499 60.493685,343.16297 C 38.949098,371.93706 21.545818,399.60706 8.3854775,426.14582"/> 342 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 60.493685,343.16297 5.684717,3.20319"/> 343 <path style="fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 71.579111,321.5907 22.699318,364.66477"/> 344 <path style="fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 92.610689,285.43188 64.646141,252.80658 46.003108,248.14582"/> 345 </g> 346 </symbol> 347 <clipPath id="clipTrackTube"> 348 <rect x="0" y="0" width="800" height="450"/> 349 </clipPath> 350 </defs> 351 </svg> 352 </div> 353 <p class="approach-media-caption">Real-time locomotion tracking</p> 354 </div> 355 <div class="approach-text"> 356 <h3 class="approach-box-title">FlyGym:<br> Our platform technology</h3> 357 <p class="approach-box-body"> 358 FlyGym is a platform for real time, continuous behavioral tracking in animal models that automatically measures and analyzes the impact of interventions on brain health during aging. 359 </p> 360 <a href="/flygym" class="btn-outline" style="margin-top:1.75rem;display:inline-block">Discover FlyGym â</a> 361 </div> 362 </div> 363 </div> 364 </section> 365 366 <!-- ââ LAB IMAGE ââââââââââââââââââââââââââââââââââââââââââââ --> 367 <section class="lab-image-section"> 368 <div class="container"> 369 <div class="lab-image-wrap reveal"> 370 <img src="./assets/lab_work.jpeg" alt="Scientists at Juvion Health Sciences working in the EPFL neuromuscular research lab" width="1400" height="933" loading="lazy"> 371 <div class="lab-image-overlay"></div> 372 <div class="lab-image-caption"> 373 <span class="lab-image-caption-tag">Lausanne, Switzerland</span> 374 </div> 375 </div> 376 </div> 377 </section> 378 379 <!-- ââ PUBLICATIONS âââââââââââââââââââââââââââââââââââââââââ --> 380 <section id="science" class="section section--surface"> 381 <div class="container"> 382 <div class="section-header reveal"> 383 <h2 class="section-heading">Our Scientific Discoveries on Aging</h2> 384 </div> 385 <div id="pubGrid" class="pub-grid"></div> 386 <div class="section-footer-cta reveal"> 387 <a href="/news#publications" class="btn-ghost">View all publications â</a> 388 </div> 389 </div> 390 </section> 391 392 <!-- ââ TEAM âââââââââââââââââââââââââââââââââââââââââââââââââ --> 393 <section id="team" class="section section--surface"> 394 <div class="container"> 395 <div class="section-header reveal"> 396 <h2 class="section-heading">The Team</h2> 397 </div> 398 399 <!-- Featured founders â always visible --> 400 <h3 class="team-group-label">Founders</h3> 401 <div id="teamFeatured" class="team-featured-list"></div> 402 403 <!-- Rest hidden behind expander --> 404 <div id="teamExpanded" hidden> 405 <h3 class="team-group-label" style="margin-top:3rem">Core Team</h3> 406 <div id="teamCoreGrid" class="team-grid"></div> 407 408 <h3 class="team-group-label" style="margin-top:3rem">Board Members</h3> 409 <div id="teamBoardFeatured" class="team-featured-list"></div> 410 411 <div class="team-secondary-grid" style="margin-top:3rem"> 412 <div class="team-group"> 413 <h3 class="team-group-label">Collaborators</h3> 414 <div id="teamCollaboratorList" class="advisor-list"></div> 415 </div> 416 <div class="team-group"> 417 <h3 class="team-group-label">Advisors</h3> 418 <div id="teamAdvisorList" class="advisor-list"></div> 419 </div> 420 </div> 421 </div> 422 423 <div class="team-expand-row"> 424 <button id="teamExpandBtn" class="btn-ghost team-expand-btn" data-show-more="Show more â" data-show-less="Show less â">Show more â</button> 425 </div> 426 </div> 427 </section> 428 429 <!-- ââ NEWS âââââââââââââââââââââââââââââââââââââââââââââââââ --> 430 <section id="news" class="section"> 431 <div class="container"> 432 <div class="section-header-row reveal"> 433 <h2 class="section-heading">News</h2> 434 <a href="/news" class="btn-ghost">View all â</a> 435 </div> 436 <div id="newsGrid" class="news-grid news-grid--no-image"></div> 437 </div> 438 </section> 439 440 <!-- ââ PARTNERS âââââââââââââââââââââââââââââââââââââââââââââ --> 441 <section class="partners-bar"> 442 <div class="container"> 443 <p class="partners-label reveal">Trusted by leading institutions & partners</p> 444 </div> 445 <div class="partners-outer"> 446 <div class="partners-track" id="partnersTrack"></div> 447 </div> 448 </section> 449 450 <!-- ââ FOOTER / CONTACT âââââââââââââââââââââââââââââââââââââ --> 451 <footer id="contact" class="footer"> 452 <div class="container footer-grid"> 453 <div class="footer-col"> 454 <a href="#home" class="nav-brand footer-brand"> 455 <img src="assets/JuvionLogo.png" class="nav-logo-icon" alt="Juvion Health Sciences">
456 <span class="logo-sub" style="margin-left:0">Juvion Health Sciences</span> 457 </a> 458 <p class="footer-tagline">Science to Sustain Motion</p> 459 <address class="footer-location footer-address"> 460 EPFL Innovation Park, Bâtiment C<br> 461 Lausanne, VD 1015<br> 462 Switzerland 463 </address> 464 <div class="footer-socials"> 465 <a href="https://www.linkedin.com/company/juvion-health-sciences/posts/?feedView=all" class="social-btn" aria-label="LinkedIn" target="_blank" rel="noopener"> 466 <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> 467 <path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/> 468 </svg> 469 </a> 470 </div> 471 </div> 472 473 <div class="footer-col"> 474 <h4 class="footer-heading">Quick Links</h4> 475 <ul class="footer-links"> 476 <li><a href="/">Home</a></li> 477 <li><a href="/flygym">FlyGym & Services</a></li> 478 <li><a href="/products">Products</a></li> 479 <li><a href="/news">News & Publications</a></li> 480 <li><a href="/career">Careers</a></li> 481 <li><a href="/contact">Contact</a></li> 482 </ul> 483 </div> 484 485 <div class="footer-col"> 486 <h4 class="footer-heading">Stay Updated</h4> 487 <p class="footer-newsletter-copy">Get the latest from Juvion delivered monthly.</p> 488 <form class="newsletter-form" id="newsletterForm"> 489 <input type="email" name="email" placeholder="[email protected]" class="newsletter-input" aria-label="Email address" required> 490 <button type="submit" class="newsletter-btn" aria-label="Subscribe">â</button> 491 </form> 492 <div class="footer-contact-info"> 493 <p>[email protected]</p> 494 <p>+41 77 529 74 99</p> 495 </div> 496 </div> 497 </div> 498 499 <div class="footer-bottom"> 500 <div class="container footer-bottom-inner"> 501 <p>© 2026 Juvion Health Sciences. All rights reserved.</p> 502 <a href="/privacy" class="footer-legal-link">Privacy Notice</a> 503 </div> 504 </div> 505 </footer> 506 507
507<script src="content/team.js"></script>
507 508
508<script src="content/partners.js"></script>
508 509
509<script src="content/customers.js"></script>
509 510
510<script src="content/news.js"></script>
510 511
511<script src="content/publications.js"></script>
511 512
512<script src="content/jobs.js"></script>
512 513
513<script src="content/products.js"></script>
513 514
514<script src="app.js"></script>
514 515 516 <!-- ââ Neural Network Hero Animation âââââââââââââââââââââââ --> 517
517<script> 518 (function() { 519 const cvs = document.getElementById('neuroCvs'); 520 if (!cvs) return; 521 const ctx = cvs.getContext('2d'); 522 const W = 700, H = 440; 523 524 function rand(a, b) { return a + Math.random() * (b - a); } 525 function dist(a, b) { return Math.hypot(a.x - b.x, a.y - b.y); } 526 527 // Build nodes â distributed within an ellipse so the canvas looks organic 528 const N = 250; 529 const cx = W / 2, cy = H / 2; 530 const rx = W * 0.46, ry = H * 0.44; 531 const nodes = Array.from({length: N}, () => { 532 let x, y; 533 do { 534 x = rand(0, W); 535 y = rand(0, H); 536 } while (((x - cx) / rx) ** 2 + ((y - cy) / ry) ** 2 > 1); 537 return { x, y, potential: 0, deathAge: Infinity, fireTimer: 0, pendingFire: 0, refractory: 0, dead: false }; 538 }); 539 540 // All candidate pairs sorted by distance 541 const MAX_DIST = 200; 542 const allPairs = []; 543 for (let i = 0; i < N; i++) 544 for (let j = i + 1; j < N; j++) 545 allPairs.push([i, j, dist(nodes[i], nodes[j])]); 546 allPairs.sort((a, b) => a[2] - b[2]); 547 548 // Kruskal MST â track MST edges separately 549 const ufParent = Array.from({length: N}, (_, i) => i); 550 function find(x) { return ufParent[x] === x ? x : (ufParent[x] = find(ufParent[x])); } 551 function union(a, b) { ufParent[find(a)] = find(b); } 552 553 const mstPairs = []; // MST-only edges 554 const edges = []; 555 for (const [a, b, d] of allPairs) { 556 if (find(a) !== find(b)) { union(a, b); edges.push([a, b, d]); mstPairs.push([a, b]); } 557 } 558 559 // Add extra short edges for visual density (avg degree â 3) 560 const TARGET_EDGES = Math.floor(N * 2.8); 561 for (const [a, b, d] of allPairs) { 562 if (edges.length >= TARGET_EDGES) break; 563 if (!edges.some(e => e[0] === a && e[1] === b)) edges.push([a, b, d]); 564 } 565 566 // Adjacency list (full graph, for signal propagation) 567 const adj = Array.from({length: N}, () => []);
568 edges.forEach(([a, b, d]) => { adj[a].push([b, d]); adj[b].push([a, d]); }); 569 570 // ââ Designate source: leftmost node, never dies ââââââââââââââ 571 const srcIdx = nodes.reduce((best, n, i) => n.x < nodes[best].x ? i : best, 0); 572 573 // ââ Assign death ages: peel MST leaves inward ââââââââââââââââ 574 // Nodes that are MST leaves die first; hub nodes die last. 575 // This guarantees surviving nodes always form a connected subtree. 576 const mstAdj = Array.from({length: N}, () => []); 577 mstPairs.forEach(([a, b]) => { mstAdj[a].push(b); mstAdj[b].push(a); }); 578 579 const mstDeg = mstAdj.map(nb => nb.length); 580 const peeled = new Array(N).fill(false); 581 const deathOrder = []; 582 let frontier = nodes.map((_, i) => i).filter(i => i !== srcIdx && mstDeg[i] === 1); 583 584 while (frontier.length) { 585 const next = []; 586 for (const i of frontier) { 587 if (peeled[i] || i === srcIdx) continue; 588 deathOrder.push(i); 589 peeled[i] = true; 590 for (const nb of mstAdj[i]) { 591 if (!peeled[nb] && nb !== srcIdx) { 592 mstDeg[nb]--; 593 if (mstDeg[nb] === 1) next.push(nb); 594 } 595 } 596 } 597 frontier = next; 598 } 599 600 // ~10% of nodes (source + innermost core) survive at max age; rest die 30â95 601 const IMMORTAL = Math.round(N * 0.50) - 1; // extra survivors besides source 602 const mortal = deathOrder.length - IMMORTAL; 603 deathOrder.forEach((nodeIdx, rank) => { 604 if (rank >= mortal) { 605 nodes[nodeIdx].deathAge = Infinity; // core â always alive 606 } else { 607 const t = rank / Math.max(mortal - 1, 1); 608 nodes[nodeIdx].deathAge = 30 + t * 65; // age 30 â 95 609 } 610 }); 611 nodes[srcIdx].deathAge = Infinity; 612 let srcTimer = 0; 613 let currentAge = 0; 614 function getSrcInterval() { 615 if (currentAge < 30) return 12; // Young: dense lightning (~0.2s at 60fps) 616 if (currentAge < 65) return 32; // Middle: noticeably slower 617 return 70; // Old: sparse (already well-rated) 618 } 619 620 // Compute median edge length for travel-time scaling 621 const edgeLengths = edges.map(e => e[2]).sort((a, b) => a - b); 622 const medianEdge = edgeLengths[Math.floor(edgeLengths.length / 2)] || 80; 623 624 // Signal packets traveling along edges: {x0,y0,x1,y1,t,speed} 625 const signals = []; 626 627 function fireNode(idx) { 628 const n = nodes[idx]; 629 n.fireTimer = 10; 630 n.refractory = 40; // ~0.67s immunity after firing 631 // Schedule each live neighbor to fire after delay proportional to edge length 632 adj[idx].forEach(([nb, d]) => { 633 if (nodes[nb].dead) return; 634 if (nodes[nb].pendingFire > 0) return; // already scheduled 635 if (nodes[nb].refractory > 0) return; // in refractory period â no echo 636 // Propagation probability: near-total in Young, attenuating in older ages 637 const spreadChance = currentAge < 30 ? 0.97 : 0.7; 638 if (Math.random() > spreadChance * (1 - d / MAX_DIST * 0.4)) return; 639 const delay = Math.round(2 + (d / medianEdge) * 2); // 2â4 frames 640 nodes[nb].pendingFire = delay; 641 // Spawn signal packet with matching travel time 642 signals.push({ 643 x0: n.x, y0: n.y, 644 x1: nodes[nb].x, y1: nodes[nb].y, 645 t: 0, 646 speed: 1 / delay, // arrives exactly when node fires 647 }); 648 }); 649 } 650 651 function ageColor(alpha) { 652 const t = Math.min(currentAge / 100, 1); 653 const r = Math.round(254 - t * 124); // 254 â 130 654 const g = Math.round(102 - t * 52); // 102 â 50 655 const b = Math.round(3 + t * 12); // 3 â 15 656 return `rgba(${r},${g},${b},${typeof alpha === 'number' ? alpha.toFixed(2) : alpha})`; 657 } 658 659 function tick(age) { 660 currentAge = age; 661 // Mark dead neurons (source is immortal) 662 nodes.forEach((n, i) => { if (i !== srcIdx) n.dead = n.deathAge < age; }); 663 664 // Source fires on age-dependent interval 665 srcTimer++; 666 if (srcTimer >= getSrcInterval()) { srcTimer = 0; fireNode(srcIdx); } 667
668 // Count down pending fires; fire when counter hits 0 669 nodes.forEach((n, idx) => { 670 if (n.fireTimer > 0) n.fireTimer--; 671 if (n.refractory > 0) n.refractory--; 672 if (n.dead || idx === srcIdx) { n.pendingFire = 0; return; } 673 if (n.pendingFire > 0) { 674 n.pendingFire--; 675 if (n.pendingFire === 0) fireNode(idx); 676 } 677 }); 678 679 // Advance signal packets 680 for (let i = signals.length - 1; i >= 0; i--) { 681 signals[i].t += signals[i].speed; 682 if (signals[i].t >= 1) { signals.splice(i, 1); } 683 } 684 685 // ââ Draw ââââââââââââââââââââââââââââââââââââââââââââââââ 686 ctx.clearRect(0, 0, W, H); 687 688 // Resting edges â very faint 689 edges.forEach(([a, b]) => { 690 const na = nodes[a], nb = nodes[b]; 691 if (na.dead || nb.dead) return; 692 ctx.strokeStyle = 'rgba(242,239,233,0.09)'; 693 ctx.lineWidth = 0.5; 694 ctx.beginPath(); 695 ctx.moveTo(na.x, na.y); 696 ctx.lineTo(nb.x, nb.y); 697 ctx.stroke(); 698 }); 699 700 // Signal packets â bright travelling dots with a short glow 701 signals.forEach(s => {
702 const x = s.x0 + (s.x1 - s.x0) * s.t; 703 const y = s.y0 + (s.y1 - s.y0) * s.t; 704 const fade = 1 - s.t * 0.6; 705 // Glow halo 706 const grd = ctx.createRadialGradient(x, y, 0, x, y, 8); 707 grd.addColorStop(0, ageColor(0.5 * fade)); 708 grd.addColorStop(1, ageColor(0)); 709 ctx.fillStyle = grd; 710 ctx.beginPath(); 711 ctx.arc(x, y, 8, 0, Math.PI * 2); 712 ctx.fill(); 713 // Core dot 714 ctx.fillStyle = ageColor(fade); 715 ctx.beginPath(); 716 ctx.arc(x, y, 2.5, 0, Math.PI * 2); 717 ctx.fill(); 718 }); 719 720 // Nodes 721 nodes.forEach((n, idx) => { 722 if (n.dead) { 723 ctx.fillStyle = 'rgba(80,78,76,0.22)'; 724 ctx.beginPath(); 725 ctx.arc(n.x, n.y, 1.8, 0, Math.PI * 2); 726 ctx.fill(); 727 return; 728 } 729 const isSource = idx === srcIdx; 730 const fireStrength = n.fireTimer / 10; // 1.0 â 0.0 as timer counts down 731 if (fireStrength > 0) { 732 const glowR = isSource ? 24 : 18; 733 const grd = ctx.createRadialGradient(n.x, n.y, 0, n.x, n.y, glowR); 734 grd.addColorStop(0, ageColor(0.55 * fireStrength)); 735 grd.addColorStop(1, ageColor(0)); 736 ctx.fillStyle = grd; 737 ctx.beginPath(); 738 ctx.arc(n.x, n.y, glowR, 0, Math.PI * 2); 739 ctx.fill(); 740 } 741 const r = isSource
742 ? 5 + fireStrength * 2 743 : 2.5 + fireStrength * 2.5; 744 const alpha = isSource 745 ? 0.85 746 : (0.22 + fireStrength * 0.78); 747 ctx.fillStyle = ageColor(alpha); 748 ctx.beginPath(); 749 ctx.arc(n.x, n.y, r, 0, Math.PI * 2); 750 ctx.fill(); 751 // Source: persistent outer ring 752 if (isSource) { 753 ctx.strokeStyle = ageColor(0.3 + fireStrength * 0.4); 754 ctx.lineWidth = 1; 755 ctx.beginPath(); 756 ctx.arc(n.x, n.y, 10, 0, Math.PI * 2); 757 ctx.stroke(); 758 } 759 }); 760 761 } 762 763 // Slider + auto-play 764 const slider = document.getElementById('neuroAge'); 765 let ageVal = 0; 766 let autoPlay = true; 767 let resumeTimer = null; 768 769 if (slider) { 770 slider.addEventListener('input', () => { 771 ageVal = +slider.value; 772 autoPlay = false; 773 clearTimeout(resumeTimer); 774 }); 775 slider.addEventListener('pointerup', () => { 776 clearTimeout(resumeTimer); 777 resumeTimer = setTimeout(() => { autoPlay = true; }, 1500); 778 }); 779 } 780 781 // Pre-seed signals so Young stage is immediately active 782 srcTimer = 11; 783 fireNode(srcIdx); 784 785 let oldPause = 0; 786 function loop() { 787 if (autoPlay) { 788 if (ageVal >= 100 && oldPause < 300) { 789 oldPause++; // hold at Old for ~5s (300 frames) 790 } else { 791 if (oldPause >= 300) { ageVal = 0; oldPause = 0; } 792 ageVal += 0.333; 793 if (ageVal > 100) ageVal = 100; 794 } 795 if (slider) slider.value = ageVal; 796 } 797 tick(ageVal); 798 requestAnimationFrame(loop); 799 } 800 requestAnimationFrame(loop); 801 })(); 802 </script>
802 803 804 <!-- ââ Runner Animation âââââââââââââââââââââââââââââââââââââââ --> 805
805<script> 806 (function () { 807 const container = document.getElementById('runnerContainer'); 808 const slider = document.getElementById('neuroAge'); 809 if (!container || !slider || typeof lottie === 'undefined') return; 810 811 const anim = lottie.loadAnimation({ 812 container, 813 renderer: 'canvas', 814 loop: false, 815 autoplay: false, 816 path: '/assets/runner.json', 817 rendererSettings: { clearCanvas: true }, 818 }); 819 820 let totalFrames = 0; 821 let currentFrame = 0; 822 let runnerCtx = null; 823 824 anim.addEventListener('DOMLoaded', () => { 825 totalFrames = anim.totalFrames; 826 const canvas = container.querySelector('canvas'); 827 if (canvas) runnerCtx = canvas.getContext('2d'); 828 loop(); 829 }); 830 831 function toHex(v) { return v.toString(16).padStart(2, '0'); } 832 833 function loop() { 834 const age = parseInt(slider.value, 10); 835 const fps = 1.75 * Math.pow(1 - age / 100, 2) + 0.25; 836 currentFrame = (currentFrame + fps) % totalFrames; 837 anim.goToAndStop(currentFrame, true); 838 839 if (runnerCtx) { 840 const t = age / 100; 841 const r = Math.round(254 - (254 - 90) * t); 842 const g = Math.round(102 - (102 - 34) * t); 843 const b = Math.round(3 + (13 - 3) * t); 844 // Paint exact color over stickman shape, preserving alpha mask 845 runnerCtx.globalCompositeOperation = 'source-atop'; 846 runnerCtx.fillStyle = `#${toHex(r)}${toHex(g)}${toHex(b)}`; 847 runnerCtx.fillRect(0, 0, runnerCtx.canvas.width, runnerCtx.canvas.height); 848 runnerCtx.globalCompositeOperation = 'source-over'; 849 } 850 851 requestAnimationFrame(loop); 852 } 853 })(); 854 </script>
854 855</body> 856</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.