PageSourceSearch

https://hubverse.io/community/index.html

html hubverse.io collected 2026-10-03 21:38:38 UTC 39,479 bytes, 863 lines download raw bytes

1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
3
4<meta charset="utf-8">
5<meta name="generator" content="quarto-1.10.18">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9
10<title> Community – hubverse</title>
11<style>
12/* Default styles provided by pandoc.
13** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
14*/
15span.smallcaps{font-variant: small-caps;}
16div.columns{display: flex; gap: 1.5em;}
17div.column{flex: auto;}
18@media screen {
19div.columns{gap: min(4vw, 1.5em);}
20div.column{overflow-x: auto;}
21}
22div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
23ul.task-list{list-style: none;}
24ul.task-list li input[type="checkbox"] {
25  width: 0.8em;
26  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 
27  vertical-align: middle;
28}
29</style>
30
31
32<script src="../site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 32
32
33<script src="../site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 33
33
34<script src="../site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="../site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 35
35
36<script src="../site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 36
36
37<script src="../site_libs/quarto-search/quarto-search.js"></script>
37
38<meta name="quarto:offset" content="../">
39<link href="..//brand/logo/logo.png" rel="icon" type="image/png">
40<script src="../site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 40
40
41<script src="../site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 41
41
42<script src="../site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 42
42
43<script src="../site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 43
43
44<script src="../site_libs/quarto-html/anchor.min.js"></script>
44
45<link href="../site_libs/quarto-html/tippy.css" rel="stylesheet">
46<link href="../site_libs/quarto-html/quarto-syntax-highlighting-64a204ab8560d761af7679ceaba22944.css" rel="stylesheet" class="quarto-color-scheme" id="quarto-text-highlighting-styles">
47<link href="../site_libs/quarto-html/quarto-syntax-highlighting-dark-b85bc7c33db8c58e0ec93c3465666fed.css" rel="stylesheet" class="quarto-color-scheme quarto-color-alternate" id="quarto-text-highlighting-styles">
48<link href="../site_libs/quarto-html/quarto-syntax-highlighting-64a204ab8560d761af7679ceaba22944.css" rel="stylesheet" class="quarto-color-scheme-extra" id="quarto-text-highlighting-styles">
49<script src="../site_libs/bootstrap/bootstrap.min.js"></script>
49
50<link href="../site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
51<link href="../site_libs/bootstrap/bootstrap-faa19e120cee703ce4399906c6e9bee7.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme" id="quarto-bootstrap" data-mode="light">
52<link href="../site_libs/bootstrap/bootstrap-dark-faa19e120cee703ce4399906c6e9bee7.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme quarto-color-alternate" id="quarto-bootstrap" data-mode="light">
53<link href="../site_libs/bootstrap/bootstrap-faa19e120cee703ce4399906c6e9bee7.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme-extra" id="quarto-bootstrap" data-mode="light">
54<link href="../site_libs/quarto-contrib/fontawesome6-6.7.2/all.min.css" rel="stylesheet">
55<link href="../site_libs/quarto-contrib/fontawesome6-6.7.2/latex-fontsize.css" rel="stylesheet">
56<script id="quarto-search-options" type="application/json">{
57  "location": "navbar",
58  "copy-button": false,
59  "collapse-after": 3,
60  "panel-placement": "end",
61  "type": "overlay",
62  "limit": 50,
63  "keyboard-shortcut": [
64    "f",
65    "/",
66    "s"
67  ],
68  "show-item-context": false,
69  "language": {
70    "search-no-results-text": "No results",
71    "search-matching-documents-text": "matching documents",
72    "search-copy-link-title": "Copy link to search",
73    "search-hide-matches-text": "Hide additional matches",
74    "search-more-match-text": "more match in this document",
75    "search-more-matches-text": "more matches in this document",
76    "search-clear-button-title": "Clear",
77    "search-text-placeholder": "",
78    "search-detached-cancel-button-title": "Cancel",
79    "search-submit-button-title": "Submit",
80    "search-label": "Search"
81  }
82}</script>
82
83<!-- Privacy-friendly analytics by Plausible -->
84<script async="" src="https://plausible.io/js/pa-Qtr0-pdxejuvymNBgYMIj.js"></script>
vendor: 1 bytes, line 84
84
85<script>
86  window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
87  plausible.init()
88</script>
88
89
90
91<link rel="stylesheet" href="../styles.css">
92</head>
93
94<body class="nav-fixed quarto-light">
95
96<div id="quarto-search-results"></div>
97  <header id="quarto-header" class="headroom fixed-top">
98    <div id="quarto-announcement" data-announcement-id="8501bbe9620e8dff98c7b235d38034d7" class="alert alert-info hidden"><i class="bi bi-baloon quarto-announcement-icon"></i><div class="quarto-announcement-content">
99<p>Welcome to the hubverse. Discover <a href="../community/index.html">our community</a>, get involved, or reach out to share your feedback.</p>
100</div><i class="bi bi-x-lg quarto-announcement-action"></i></div>
101    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
102      <div class="navbar-container container-fluid">
103      <div class="navbar-brand-container mx-auto">
104    <a href="../index.html" class="navbar-brand navbar-brand-logo">
105    <img src="../brand/logo/logo.png" alt="" class="navbar-logo light-content">
106    <img src="../brand/logo/logo.png" alt="" class="navbar-logo dark-content">
107    </a>
108    <a class="navbar-brand" href="../index.html">
109    <span class="navbar-title">hubverse</span>
110    </a>
111  </div>
112            <div id="quarto-search" class="" title="Search"></div>
113          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
114  <span class="navbar-toggler-icon"></span>
115</button>
116          <div class="collapse navbar-collapse" id="navbarCollapse">
117            <ul class="navbar-nav navbar-nav-scroll ms-auto">
118  <li class="nav-item">
119    <a class="nav-link" href="../index.html"> 
120<span class="menu-text">Home</span></a>
121  </li>  
122  <li class="nav-item dropdown ">
123    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-get-started" role="link" data-bs-toggle="dropdown" aria-expanded="false">
124 <span class="menu-text"><strong>Get started</strong></span>
125    </a>
126    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-get-started">    
127        <li>
128    <a class="dropdown-item" href="../quickstart/index.html"><i class="bi bi-question-circle" role="img">
129</i> 
130 <span class="dropdown-text">What is a modeling hub?</span></a>
131  </li>  
132        <li>
133    <a class="dropdown-item" href="../quickstart/create.html"><i class="bi bi-diagram-3" role="img">
134</i> 
135 <span class="dropdown-text">Create a hub</span></a>
136  </li>  
137        <li>
138    <a class="dropdown-item" href="../quickstart/submit.html"><i class="bi bi-file-earmark-arrow-up" role="img">
139</i> 
140 <span class="dropdown-text">Submit model output</span></a>
141  </li>  
142        <li>
143    <a class="dropdown-item" href="../quickstart/analyze.html"><i class="bi bi-graph-up" role="img">
144</i> 
145 <span class="dropdown-text">Analyze data</span></a>
146  </li>  
147        <li>
148    <a class="dropdown-item" href="../quickstart/develop.html"><i class="bi bi-braces" role="img">
149</i> 
150 <span class="dropdown-text">Develop software</span></a>
151  </li>  
152        <li><hr class="dropdown-divider"></li>
153        <li>
154    <a class="dropdown-item" href="../quickstart/support-consulting.html"><i class="bi bi-headset" role="img">
155</i> 
156 <span class="dropdown-text">Consulting support</span></a>
157  </li>  
158    </ul>
159  </li>
160  <li class="nav-item dropdown ">
161    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-tools" role="link" data-bs-toggle="dropdown" aria-expanded="false">
162 <span class="menu-text">Tools</span>
163    </a>
164    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-tools">    
165        <li>
166    <a class="dropdown-item" href="../tools/data.html"><i class="bi bi-compass" role="img">
167</i> 
168 <span class="dropdown-text">Data standards</span></a>
169  </li>  
170        <li>
171    <a class="dropdown-item" href="../tools/software.html"><i class="bi bi-tools" role="img">
172</i> 
173 <span class="dropdown-text">Software</span></a>
174  </li>  
175        <li>
176    <a class="dropdown-item" href="../tools/dashboards.html"><i class="bi bi-speedometer" role="img">
177</i> 
178 <span class="dropdown-text">Dashboards</span></a>
179  </li>  
180    </ul>
181  </li>
182  <li class="nav-item dropdown ">
183    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-community" role="link" data-bs-toggle="dropdown" aria-expanded="false">
184 <span class="menu-text">Community</span>
185    </a>
186    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-community">    
187        <li>
188    <a class="dropdown-item" href="../community/index.html">
189 <span class="dropdown-text"><i class="fa-solid fa-people-line" aria-label="people-line"></i> &nbsp;Community</span></a>
190  </li>  
191        <li>
192    <a class="dropdown-item" href="../community/hubs.html">
193 <span class="dropdown-text"><i class="fa-solid fa-list" aria-label="list"></i> &nbsp;&nbsp;List of hubs</span></a>
194  </li>  
195        <li>
196    <a class="dropdown-item" href="../community/contributors.html">
197 <span class="dropdown-text"><i class="fa-solid fa-pencil" aria-label="pencil"></i> &nbsp;&nbsp;Contributors</span></a>
198  </li>  
199        <li>
200    <a class="dropdown-item" href="../contact.html">
201 <span class="dropdown-text"><i class="fa-solid fa-address-card" aria-label="address-card"></i> &nbsp;&nbsp;Contact</span></a>
202  </li>  
203        <li><hr class="dropdown-divider"></li>
204        <li>
205    <a class="dropdown-item" href="../about.html"><i class="bi bi-info-circle-fill" role="img">
206</i> 
207 <span class="dropdown-text">
207About the hubverse</span></a>
208  </li>  
209    </ul>
210  </li>
211  <li class="nav-item dropdown ">
212    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-resources" role="link" data-bs-toggle="dropdown" aria-expanded="false">
213 <span class="menu-text">Resources</span>
214    </a>
215    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-resources">    
216        <li>
217    <a class="dropdown-item" href="../terminology.html"><i class="bi bi-book" role="img">
218</i> 
219 <span class="dropdown-text">Terminology</span></a>
220  </li>  
221        <li>
222    <a class="dropdown-item" href="https://docs.hubverse.io/">
223 <span class="dropdown-text"><i class="fa-solid fa-book" aria-label="book"></i> &nbsp;&nbsp;Documentation <i class="fa-solid fa-arrow-up-right-from-square" aria-label="arrow-up-right-from-square"></i></span></a>
224  </li>  
225        <li>
226    <a class="dropdown-item" href="../funding.html">
227 <span class="dropdown-text"><i class="fa-solid fa-coins" aria-label="coins"></i> &nbsp;&nbsp;Funding</span></a>
228  </li>  
229        <li>
230    <a class="dropdown-item" href="../researchtalks.html">
231 <span class="dropdown-text"><i class="fa-solid fa-user-graduate" aria-label="user-graduate"></i> &nbsp;Research &amp; talks</span></a>
232  </li>  
233        <li>
234    <a class="dropdown-item" href="../trainings.html">
235 <span class="dropdown-text"><i class="fa-solid fa-laptop-code" aria-label="laptop-code"></i> &nbsp;Trainings</span></a>
236  </li>  
237        <li>
238    <a class="dropdown-item" href="../cite.html">
239 <span class="dropdown-text"><i class="fa-solid fa-quote-left" aria-label="quote-left"></i> &nbsp;&nbsp;How to cite</span></a>
240  </li>  
241        <li>
242    <a class="dropdown-item" href="../CONTRIBUTING.html"><i class="bi bi-github" role="img">
243</i> 
244 <span class="dropdown-text">Contributing to the site</span></a>
245  </li>  
246        <li><hr class="dropdown-divider"></li>
247        <li>
248    <a class="dropdown-item" href="../quickstart/support-consulting.html"><i class="bi bi-headset" role="img">
249</i> 
250 <span class="dropdown-text">Consulting support</span></a>
251  </li>  
252    </ul>
253  </li>
254  <li class="nav-item compact">
255    <a class="nav-link" href="https://github.com/hubverse-org"> <i class="bi bi-github" role="img" aria-label="hubverse GitHub organization">
256</i> 
257<span class="menu-text"></span></a>
258  </li>  
259</ul>
260          </div> <!-- /navcollapse -->
261            <div class="quarto-navbar-tools">
262</div>
263      </div> <!-- /container-fluid -->
264    </nav>
265</header>
266<!-- content -->
267<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
268<!-- sidebar -->
269<!-- margin-sidebar -->
270    <div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
271        <nav id="TOC" role="doc-toc" class="toc-active">
272    <h2 id="toc-title">On this page</h2>
273   
274  <ul>
275  <li><a href="#get-involved" id="toc-get-involved" class="nav-link active" data-scroll-target="#get-involved">Get Involved</a>
276  <ul class="collapse">
277  <li><a href="#mailing-list" id="toc-mailing-list" class="nav-link" data-scroll-target="#mailing-list">Mailing list</a></li>
278  <li><a href="#monthly-community-meetings" id="toc-monthly-community-meetings" class="nav-link" data-scroll-target="#monthly-community-meetings">Monthly community meetings</a></li>
279  </ul></li>
280  <li><a href="#use-and-test-our-software-and-tools" id="toc-use-and-test-our-software-and-tools" class="nav-link" data-scroll-target="#use-and-test-our-software-and-tools">Use and test our software and tools</a>
281  <ul class="collapse">
282  <li><a href="#file-issues" id="toc-file-issues" class="nav-link" data-scroll-target="#file-issues">File issues</a></li>
283  <li><a href="#contribute-code" id="toc-contribute-code" class="nav-link" data-scroll-target="#contribute-code">Contribute code</a></li>
284  <li><a href="#join-the-development-team" id="toc-join-the-development-team" class="nav-link" data-scroll-target="#join-the-development-team">Join the development team</a></li>
285  </ul></li>
286  <li><a href="#governance" id="toc-governance" class="nav-link" data-scroll-target="#governance">Governance</a></li>
287  </ul>
288<div class="toc-actions"><ul><li><a href="https://github.com/hubverse-org/hubverse-site/edit/main/community/index.qmd" class="toc-action"><i class="bi bi-github"></i>Edit this page</a></li><li><a href="https://github.com/hubverse-org/hubverse-site/blob/main/community/index.qmd" class="toc-action"><i class="bi empty"></i>View source</a></li><li><a href="https://github.com/hubverse-org/hubverse-site/issues/new" class="toc-action"><i class="bi empty"></i>Report an issue</a></li></ul></div></nav>
289    </div>
290<!-- main -->
291<main class="content" id="quarto-document-content">
292<script>
293  const path = window.location.pathname;
294  const isDev = window.location.hostname === "localhost";
295
296  // Use console.log for debugging:
297  // console.log("🔍 docs-redirect script loaded");
298  // console.log("🚧 Current path:", path);
299
300  const redirects = {
301    "overview/history.html": "https://hubverse.io/about.html#history",
302    "overview/contributors.html": "https://hubverse.io/community/contributors.html",
303    "overview/contribute.html": "https://hubverse.io/community/",
304    "overview/who-we-are.html": "https://hubverse.io/about.html",
305    "overview/scope.html": "https://hubverse.io/about.html#scope",
306    "overview/support-consulting.html": "https://hubverse.io/quickstart/support-consulting.html",
307    "overview/data-storage.html": "https://docs.hubverse.io/en/latest/user-guide/data-storage.html",
308    "user-guide/presentations.html": "https://hubverse.io/researchtalks.html"
309  };
310
311  const versionedPathRegex = /^\/en\/(\d+\.\d+\.\d+|latest|stable)\//;
312  const isVersionedPath = versionedPathRegex.test(path);
313  const isLatestOrStable = path.startsWith("/en/latest") || path.startsWith("/en/stable");
314
315  let redirected = false;
316
317  if (isDev || isVersionedPath) {
318    if (isLatestOrStable) {
319      for (const [key, url] of Object.entries(redirects)) {
320        if (path.includes(key)) {
321          // console.log("🔀 Redirecting to:", url);
322          window.location.href = url;
323          redirected = true;
324          break;
325        }
326      }
327    }
328  }
329
330  if (!redirected && isVersionedPath) {
331    const fallback = "https://docs.hubverse.io" + path;
332    // console.log("🔀 Redirecting to fallback docs:", fallback);
333    window.location.href = fallback;
334  }
335</script>
335
336
337
338<header id="title-block-header" class="quarto-title-block default">
339<div class="quarto-title">
340<h1 class="title"><i class="fa-solid fa-people-line" aria-label="people-line"></i> Community</h1>
341</div>
342
343
344
345<div class="quarto-title-meta">
346
347    
348  
349    
350  </div>
351  
352
353
354</header>
355
356
357<div class="quarto-figure quarto-figure-center">
358<figure class="figure">
359<p><img src="../includes/img/hubverse-retreat-2023.jpg" class="img-fluid figure-img"></p>
360<figcaption>The Consortium of Infectious Disease Modeling Hubs (June 2023).<br>
361Back row (L-R): Kath Sherratt, Lucie Contamin, Nick Reich, Matthew Biggerstaff, Rebecca Borchering, Martha Zorn<br>
362Front row (L-R): Anna Krystalli, Evan Ray</figcaption>
363</figure>
364</div>
365<section id="get-involved" class="level2">
366<h2 class="anchored" data-anchor-id="get-involved">Get Involved</h2>
367<section id="mailing-list" class="level3">
368<h3 class="anchored" data-anchor-id="mailing-list">Mailing list</h3>
369<p>This group is used to announce new features in the hubverse to the user community. If you would like to become a hubverse community member, go to <a href="https://groups.io/g/hubverse">the hubverse mailing list</a> and click on the <strong>+Apply for Membership in this group</strong> at the bottom left-hand side of the page.</p>
370<p>The Consortium of Infectious Disease Modeling Hubs built the hubverse collaboratively, and we benefit from your contributions.</p>
371</section>
372<section id="monthly-community-meetings" class="level3">
373<h3 class="anchored" data-anchor-id="monthly-community-meetings">Monthly community meetings</h3>
374<p>If you are using the hubverse or are interested in using the hubverse in the future, please consider joining our monthly community hubverse meetings. During these meetings, we provide general updates from a broad mix of developers and public health representatives running hubs or thinking about starting to run hubs.</p>
375<p>To join the community hubverse meeting, please <a href="mailto:[email protected]">send an email to the hubverse group</a>, including your name, email, and a few sentences about how you would like to use the hubverse.</p>
376</section>
377</section>
378<section id="use-and-test-our-software-and-tools" class="level2">
379<h2 class="anchored" data-anchor-id="use-and-test-our-software-and-tools">Use and test our software and tools</h2>
380<p>The hubverse was created for teams to develop and set up collaborative modeling hubs easily, and we benefit from having groups use these tools and tell us about them.</p>
381<section id="file-issues" class="level3">
382<h3 class="anchored" data-anchor-id="file-issues">File issues</h3>
383<p>Let us know if something is not working for you or if something could improve. This could be a bug in the code, a case where the tools are not appropriate for your use case, a problem with the documentation, or something else. Issues can be filed in any of <a href="https://github.com/hubverse-org">the hubverse repositories</a>. You are also welcome to <a href="https://github.com/orgs/hubverse-org/discussions">join the discussion</a> on any existing issue in any of the hubverse repositories.</p>
384</section>
385<section id="contribute-code" class="level3">
386<h3 class="anchored" data-anchor-id="contribute-code">Contribute code</h3>
387<p>If you want to contribute to an existing hubverse repository, please review the <a href="https://docs.hubverse.io/en/latest/developer/index.html">developer guide</a>. Alternatively, please consult the <code>CONTRIBUTING.md</code> document in the repository, if present, or the <code>README</code> for details on how to contribute.</p>
388</section>
389<section id="join-the-development-team" class="level3">
390<h3 class="anchored" data-anchor-id="join-the-development-team">Join the development team</h3>
391<p>If you are an experienced programmer interested in joining the development team, we have “development meetings” on all Wednesdays except the first Wednesday of the month. These meetings are for technical updates and discussions about ongoing development tasks.</p>
392<p>To join the development team, please <a href="mailto:[email protected]">send an email to the hubverse group</a>, including your name, email, and a few sentences about what you can contribute to the development team.</p>
393</section>
394</section>
395<section id="governance" class="level2">
396<h2 class="anchored" data-anchor-id="governance">Governance</h2>
397<p>The governing body of the <a href="../about.html">Consortium of Infectious Disease Modeling Hubs</a> is the Coding Council, which comprises any community member attending one of the peri
397odic virtual meetings. This council generally serves as a deliberative body, discussing and setting directions for new conceptual and software development. Typically, decisions about design and prioritization are made through consensus at the Coding Council level. If differences cannot be solved by consensus, then decisions are passed to the Steering Committee, which comprises three members. Members of the Steering Committee serve one-year terms, with elections occurring in July of each calendar year. Members of the Coding Council may nominate themselves or others to serve on the Steering Committee, and a closed-ballot vote is taken if more than three individuals are nominated. The highest three vote-getters serve on the council.</p>
398<p>On July 22, 2026, the following members of the steering committee were re-elected:</p>
399<ul>
400<li>Lucie Contamin, University of Pittsburgh, MIDAS</li>
401<li>Matthew Cornell, University of Massachusetts in Amherst, Reich Lab</li>
402<li>Anna Krystalli, R-RSE</li>
403</ul>
404<div class="page-nav">
405<div class="prev-page">
406<p><a href="../tools/dashboards.html" class="prev-arrow">‹</a></p>
407<p><a href="../tools/dashboards.html" class="prev-label">Previous</a></p>
408<p><a href="../tools/dashboards.html" class="prev-title"><strong>Dashboards</strong></a></p>
409</div>
410<div class="next-page">
411<p><a href="../community/hubs.html" class="next-label">Next</a></p>
412<p><a href="../community/hubs.html" class="next-arrow">›</a></p>
413<p><a href="../community/hubs.html" class="next-title"><strong>List of hubs</strong></a></p>
414</div>
415</div>
416
417
418</section>
419
420</main> <!-- /main -->
421<script id="quarto-html-after-body" type="application/javascript">
422  window.document.addEventListener("DOMContentLoaded", function (event) {
423    const icon = "";
424    const anchorJS = new window.AnchorJS();
425    anchorJS.options = {
426      placement: 'right',
427      icon: icon
428    };
429    anchorJS.add('.anchored');
430    const isCodeAnnotation = (el) => {
431      for (const clz of el.classList) {
432        if (clz.startsWith('code-annotation-')) {                     
433          return true;
434        }
435      }
436      return false;
437    }
438    const onCopySuccess = function(e) {
439      // button target
440      const button = e.trigger;
441      // don't keep focus
442      button.blur();
443      // flash "checked"
444      button.classList.add('code-copy-button-checked');
445      var currentTitle = button.getAttribute("title");
446      button.setAttribute("title", "Copied!");
447      let tooltip;
448      if (window.bootstrap) {
449        button.setAttribute("data-bs-toggle", "tooltip");
450        button.setAttribute("data-bs-placement", "left");
451        button.setAttribute("data-bs-title", "Copied!");
452        tooltip = new bootstrap.Tooltip(button, 
453          { trigger: "manual", 
454            customClass: "code-copy-button-tooltip",
455            offset: [0, -8]});
456        tooltip.show();    
457      }
458      setTimeout(function() {
459        if (tooltip) {
460          tooltip.hide();
461          button.removeAttribute("data-bs-title");
462          button.removeAttribute("data-bs-toggle");
463          button.removeAttribute("data-bs-placement");
464        }
465        button.setAttribute("title", currentTitle);
466        button.classList.remove('code-copy-button-checked');
467      }, 1000);
468      // clear code selection
469      e.clearSelection();
470    }
471    const getTextToCopy = function(trigger) {
472      const outerScaffold = trigger.parentElement.cloneNode(true);
473      const codeEl = outerScaffold.querySelector('code');
474      for (const childEl of codeEl.children) {
475        if (isCodeAnnotation(childEl)) {
476          childEl.remove();
477        }
478      }
479      return codeEl.innerText;
480    }
481    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
482      text: getTextToCopy
483    });
484    clipboard.on('success', onCopySuccess);
485    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
486      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
487        text: getTextToCopy,
488        container: window.document.getElementById('quarto-embedded-source-code-modal')
489      });
490      clipboardModal.on('success', onCopySuccess);
491    }
492      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
493      var mailtoRegex = new RegExp(/^mailto:/);
494        var filterRegex = new RegExp("https:\/\/hubverse\.io");
495      var isInternal = (href) => {
496          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
497      }
498      // Inspect non-navigation links and adorn them if external
499     var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
500      for (var i=0; i<links.length; i++) {
501        const link = links[i];
502        if (!isInternal(link.href)) {
503          // undo the damage that might have been done by quarto-nav.js in the case of
504          // links that we want to consider external
505          if (link.dataset.originalHref !== undefined) {
506            link.href = link.dataset.originalHref;
507          }
508            // default icon
509            link.classList.add("external");
510        }
511      }
512    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
513      const config = {
514        allowHTML: true,
515        maxWidth: 500,
516        delay: 100,
517        arrow: false,
518        appendTo: function(el) {
519            return el.parentElement;
520        },
521        interactive: true,
522        interactiveBorder: 10,
523        theme: 'quarto',
524        placement: 'bottom-start',
525      };
526      if (contentFn) {
527        config.content = contentFn;
528      }
529      if (onTriggerFn) {
530        config.onTrigger = onTriggerFn;
531      }
532      if (onUntriggerFn) {
533        config.onUntrigger = onUntriggerFn;
534      }
535      window.tippy(el, config); 
536    }
537    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
538    for (var i=0; i<noterefs.length; i++) {
539      const ref = noterefs[i];
540      tippyHover(ref, function() {
541        // use id or data attribute instead here
542        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
543        try { href = new URL(href).hash; } catch {}
544        const id = href.replace(/^#\/?/, "");
545        const note = window.document.getElementById(id);
546        if (note) {
547          return note.innerHTML;
548        } else {
549          return "";
550        }
551      });
552    }
553    const xrefs = window.document.querySelectorAll('a.quarto-xref');
554    const processXRef = (id, note) => {
555      // Strip column container classes
556      const stripColumnClz = (el) => {
557        el.classList.remove("page-full", "page-columns");
558        if (el.children) {
559          for (const child of el.children) {
560            stripColumnClz(child);
561          }
562        }
563      }
564      stripColumnClz(note)
565      if (id === null || id.startsWith('sec-')) {
566        // Special case sections, only their first couple elements
567        const container = document.createElement("div");
568        if (note.children && note.children.length > 2) {
569          container.appendChild(note.children[0].cloneNode(true));
570          for (let i = 1; i < note.children.length; i++) {
571            const child = note.children[i];
572            if (child.tagName === "P" && child.innerText === "") {
573              continue;
574            } else {
575              container.appendChild(child.cloneNode(true));
576              break;
577            }
578          }
579          if (window.Quarto?.typesetMath) {
580            window.Quarto.typesetMath(container);
581          }
582          return container.innerHTML
583        } else {
584          if (window.Quarto?.typesetMath) {
585            window.Quarto.typesetMath(note);
586          }
587          return note.innerHTML;
588        }
589      } else {
590        // Remove any anchor links if they are present
591        const anchorLink = note.querySelector('a.anchorjs-link');
592        if (anchorLink) {
593          anchorLink.remove();
594        }
595        if (window.Quarto?.typesetMath) {
596          window.Quarto.typesetMath(note);
597        }
598        if (note.classList.contains("callout")) {
599          return note.outerHTML;
600        } else {
601          return note.innerHTML;
602        }
603      }
604    }
605    for (var i=0; i<xrefs.length; i++) {
606      const xref = xrefs[i];
607      tippyHover(xref, undefined, function(instance) {
608        instance.disable();
609        let url = xref.getAttribute('href');
610        let hash = undefined; 
611        if (url.startsWith('#')) {
612          hash = url;
613        } else {
614          try { hash = new URL(url).hash; } catch {}
615        }
616        if (hash) {
617          const id = hash.replace(/^#\/?/, "");
618          const note = window.document.getElementById(id);
619          if (note !== null) {
620            try {
621              const html = processXRef(id, note.cloneNode(true));
622              instance.setContent(html);
623            } finally {
624              instance.enable();
625              instance.show();
626            }
627          } else {
628            // See if we can fetch this
629            fetch(url.split('#')[0])
630            .then(res => res.text())
631            .then(html => {
632              const parser = new DOMParser();
633              const htmlDoc = parser.parseFromString(html, "text/html");
634              const note = htmlDoc.getElementById(id);
635              if (note !== null) {
636                const html = processXRef(id, note);
637                instance.setContent(html);
638              } 
639            }).finally(() => {
640              instance.enable();
641              instance.show();
642            });
643          }
644        } else {
645          // See if we can fetch a full url (with no hash to target)
646          // This is a special case and we should probably do some content thinning / targeting
647          fetch(url)
648          .then(res => res.text())
649          .then(html => {
650            const parser = new DOMParser();
651            const htmlDoc = parser.parseFromString(html, "text/html");
652            const note = htmlDoc.querySelector('main.content');
653            if (note !== null) {
654              // This should only happen for chapter cross references
655              // (since there is no id in the URL)
656              // remove the first header
657              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
658                note.children[0].remove();
659              }
660              const html = processXRef(null, note);
661              instance.setContent(html);
662            } 
663          }).finally(() => {
664            instance.enable();
665            instance.show();
666          });
667        }
668      }, function(instance) {
669      });
670    }
671        let selectedAnnoteEl;
672        const selectorForAnnotation = ( cell, annotation) => {
673          let cellAttr = 'data-code-cell="' + cell + '"';
674          let lineAttr = 'data-code-annotation="' +  annotation + '"';
675          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
676          return selector;
677        }
678        const selectCodeLines = (annoteEl) => {
679          const doc = window.document;
680          const targetCell = annoteEl.getAttribute("data-target-cell");
681          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
682          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
683          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
684          const lineIds = lines.map((line) => {
685            return targetCell + "-" + line;
686          })
687          let top = null;
688          let height = null;
689          let parent = null;
690          if (lineIds.length > 0) {
691              //compute the position of the single el (top and bottom and make a div)
692              const el = window.document.getElementById(lineIds[0]);
693              top = el.offsetTop;
694              height = el.offsetHeight;
695              parent = el.parentElement.parentElement;
696            if (lineIds.length > 1) {
697              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
698              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
699              height = bottom - top;
700            }
701            if (top !== null && height !== null && parent !== null) {
702              // cook up a div (if necessary) and position it 
703              let div = window.document.getElementById("code-annotation-line-highlight");
704              if (div === null) {
705                div = window.document.createElement("div");
706                div.setAttribute("id", "code-annotation-line-highlight");
707                div.style.position = 'absolute';
708                parent.appendChild(div);
709              }
710              div.style.top = top - 2 + "px";
711              div.style.height = height + 4 + "px";
712              div.style.left = 0;
713              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
714              if (gutterDiv === null) {
715                gutterDiv = window.document.createElement("div");
716                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
717                gutterDiv.style.position = 'absolute';
718                const codeCell = window.document.getElementById(targetCell);
719                const gutter = codeCell.querySelector('.code-annotation-gutter');
720                gutter.appendChild(gutterDiv);
721              }
722              gutterDiv.style.top = top - 2 + "px";
723              gutterDiv.style.height = height + 4 + "px";
724            }
725            selectedAnnoteEl = annoteEl;
726          }
727        };
728        const unselectCodeLines = () => {
729          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
730          elementsIds.forEach((elId) => {
731            const div = window.document.getElementById(elId);
732            if (div) {
733              div.remove();
734            }
735          });
736          selectedAnnoteEl = undefined;
737        };
738          // Handle positioning of the toggle
739      window.addEventListener(
740        "resize",
741        throttle(() => {
742          elRect = undefined;
743          if (selectedAnnoteEl) {
744            selectCodeLines(selectedAnnoteEl);
745          }
746        }, 10)
747      );
748      function throttle(fn, ms) {
749      let throttle = false;
750      let timer;
751        return (...args) => {
752          if(!throttle) { // first call gets through
753              fn.apply(this, args);
754              throttle = true;
755          } else { // all the others get throttled
756              if(timer) clearTimeout(timer); // cancel #2
757              timer = setTimeout(() => {
758                fn.apply(this, args);
759                timer = throttle = false;
760              }, ms);
761          }
762        };
763      }
764        // Attach click handler to the DT
765        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
766        for (const annoteDlNode of annoteDls) {
767          annoteDlNode.addEventListener('click', (event) => {
768            const clickedEl = event.target;
769            if (clickedEl !== selectedAnnoteEl) {
770              unselectCodeLines();
771              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
772              if (activeEl) {
773                activeEl.classList.remove('code-annotation-active');
774              }
775              selectCodeLines(clickedEl);
776              clickedEl.classList.add('code-annotation-active');
777            } else {
778              // Unselect the line
779              unselectCodeLines();
780              clickedEl.classList.remove('code-annotation-active');
781            }
782          });
783        }
784    const findCites = (el) => {
785      const parentEl = el.parentElement;
786      if (parentEl) {
787        const cites = parentEl.dataset.cites;
788        if (cites) {
789          return {
790            el,
791            cites: cites.split(' ')
792          };
793        } else {
794          return findCites(el.parentElement)
795        }
796      } else {
797        return undefined;
798      }
799    };
800    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
801    for (var i=0; i<bibliorefs.length; i++) {
802      const ref = bibliorefs[i];
803      const citeInfo = findCites(ref);
804      if (citeInfo) {
805        tippyHover(citeInfo.el, function() {
806          var popup = window.document.createElement('div');
807          citeInfo.cites.forEach(function(cite) {
808            var citeDiv = window.document.createElement('div');
809            citeDiv.classList.add('hanging-indent');
810            citeDiv.classList.add('csl-entry');
811            var biblioDiv = window.document.getElementById('ref-' + cite);
812            if (biblioDiv) {
813              citeDiv.innerHTML = biblioDiv.innerHTML;
814            }
815            popup.appendChild(citeDiv);
816          });
817          return popup.innerHTML;
818        });
819      }
820    }
821  });
822  </script>
822
823</div> <!-- /content -->
824<footer class="footer">
825  <div class="nav-footer">
826    <div class="nav-footer-left">
827      <ul class="footer-items list-unstyled">
828    <li class="nav-item">
829      <i class="bi bi-c-circle" role="img">
830</i> 
831 Copyright 2025, Collaborative Modelling Consortium
832  </li>  
833</ul>
834    </div>   
835    <div class="nav-footer-center">
836      &nbsp;
837    <div class="toc-actions d-sm-block d-md-none"><ul><li><a href="https://github.com/hubverse-org/hubverse-site/edit/main/community/index.qmd" class="toc-action"><i class="bi bi-github"></i>Edit this page</a></li><li><a href="https://github.com/hubverse-org/hubverse-site/blob/main/community/index.qmd" class="toc-action"><i class="bi empty"></i>View source</a></li><li><a href="https://github.com/hubverse-org/hubverse-site/issues/new" class="toc-action"><i class="bi empty"></i>Report an issue</a></li></ul></div></div>
838    <div class="nav-footer-right">
839      <ul class="footer-items list-unstyled">
840    <li class="nav-item">
841    <a class="nav-link" href="../funding.html">
842<p><i class="fa-solid fa-coins" aria-label="coins"></i> Funding supporting the hubverse</p>
843</a>
844  </li>  
845    <li class="nav-item">
846    <a class="nav-link" href="../contact.html">
847<p><i class="fa-solid fa-address-card" aria-label="address-card"></i> Contact</p>
848</a>
849  </li>  
850    <li class="nav-item">
851    <a class="nav-link" href="../about.html">
852<p><i class="bi bi-info-circle-fill"></i> About the hubverse</p>
853</a>
854  </li>  
855</ul>
856    </div>
857  </div>
858</footer>
859
860
861
862
863</body></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.