PageSourceSearch

https://juvionhs.com/

html juvionhs.com collected 2026-10-09 23:34:51 UTC 43,246 bytes, 856 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.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 &amp; Services</a>
183        <a href="/news"     class="nav-link">News &amp; 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 &amp; Services</a>
195      <a href="/news"     class="nav-mobile-link">News &amp; 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 &amp; 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 &amp; 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 &amp; Services</a></li>
478          <li><a href="/products">Products</a></li>
479          <li><a href="/news">News &amp; 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.