1<!DOCTYPE html><html lang="en" class="scrollbar-thub-sky-700 scrollbar-track-sky-300 scrollbar-thin"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/3e5cf33211ef6d1b-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/a50f9a2c50b5a675-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/e4af272ccee01ff0-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" as="image" imageSrcSet="/_next/image?url=%2Fsyncflow.png&w=256&q=75 1x, /_next/image?url=%2Fsyncflow.png&w=640&q=75 2x" fetchPriority="high"/><link rel="preload" as="image" href="/docs/syncflow-logo.png"/><link rel="preload" as="image" href="/docs/mmla.png"/><link rel="preload" as="image" imageSrcSet="/_next/image?url=%2Fsyncflow.png&w=640&q=75 1x, /_next/image?url=%2Fsyncflow.png&w=828&q=75 2x" fetchPriority="high"/><link rel="stylesheet" href="/_next/static/css/d6a64d1d075df43a.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/7cca8e2c5137bd71.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/9a2231a6bb6b7669.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/721fb2fcc4beb010.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-9297789b63b0cdbf.js"/>
1<script src="/_next/static/chunks/fd9d1056-5c15a3666d632230.js" async=""></script>
1<script src="/_next/static/chunks/2117-b6d1e91b6b62ac50.js" async=""></script>
1<script src="/_next/static/chunks/main-app-5294d1645fe5526e.js" async=""></script>
1<script src="/_next/static/chunks/795d4814-08e61653ed74dcee.js" async=""></script>
1<script src="/_next/static/chunks/53c13509-bab4d5ed51ed54cb.js" async=""></script>
1<script src="/_next/static/chunks/8e1d74a4-9c175a671fd54726.js" async=""></script>
1<script src="/_next/static/chunks/66ec4792-21bbac1c90fc45f6.js" async=""></script>
1<script src="/_next/static/chunks/c16f53c3-8797dc76d227c628.js" async=""></script>
1<script src="/_next/static/chunks/9713-83c49c433c444748.js" async=""></script>
1<script src="/_next/static/chunks/7216-1a4832e4a7079924.js" async=""></script>
1<script src="/_next/static/chunks/2972-86359f05cebf0f9e.js" async=""></script>
1<script src="/_next/static/chunks/app/docs/%5B%5B...slug%5D%5D/page-7dbcd7d9ee80efd9.js" async=""></script>
1<script src="/_next/static/chunks/0e762574-7a3cc3ee1301f788.js" async=""></script>
1<script src="/_next/static/chunks/7620-38583a754bb55e53.js" async=""></script>
1<script src="/_next/static/chunks/3869-be23ecf668526809.js" async=""></script>
1<script src="/_next/static/chunks/1440-622ddd41edf53978.js" async=""></script>
1<script src="/_next/static/chunks/app/docs/layout-c5202a66cf8e8f3b.js" async=""></script>
1<title>Introduction - SyncFlow | SyncFlow</title><meta name="description" content="Harmonize your multimodal data collection and analysis with SyncFlow"/><link rel="icon" href="/icon.svg?3b5598bf8e519553" type="image/svg+xml" sizes="any"/><meta name="next-size-adjust"/>
1<script data-flowbite-theme-mode-script="true"> 2 try { 3 const mode = window.localStorage.getItem("flowbite-theme-mode") ?? "undefined" ?? "light"; 4 const computedMode = 5 mode === "auto" ? (window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light") : mode; 6 7 if (computedMode === "dark") { 8 document.documentElement.classList.add("dark"); 9 } else { 10 document.documentElement.classList.remove("dark"); 11 } 12 } catch (e) {} 13 </script>
13<script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script>
13</head><body class="__className_f367f3 dark:bg-gray-800"><div class="mx-auto w-full max-w-8xl lg:flex dark:bg-gray-800"><div class="relative"><nav class="sticky top-0 z-[60] mx-auto flex w-full items-center justify-between border-b border-gray-200 bg-white text-gray-500 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-400"><div class="mx-auto flex w-full max-w-8xl flex-wrap items-center justify-between px-4 py-2.5 lg:px-4"><div class="flex items-center"><button type="button" class="-ml-3 mr-1 p-2 lg:mx-0 lg:hidden"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 20 20" aria-hidden="true" aria-label="Open sidebar" class="size-6 cursor-pointer text-gray-600 dark:text-gray-300" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h6a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z" clip-rule="evenodd"></path></svg></button><a class="flex items-center gap-3 font-semibold text-2xl text-gray-900 dark:text-white" href="/"><img alt="App Logo" fetchPriority="high" width="200" height="200" decoding="async" data-nimg="1" class="relative dark:drop-shadow-[0_0_0.3rem_#ffffff70] dark:invert" style="color:transparent" srcSet="/_next/image?url=%2Fsyncflow.png&w=256&q=75 1x, /_next/image?url=%2Fsyncflow.png&w=640&q=75 2x" src="/_next/image?url=%2Fsyncflow.png&w=640&q=75"/></a><div class="hidden lg:ml-[4.5rem] lg:flex"></div></div><div class="flex items-center gap-2"><div class="w-fit" data-testid="flowbite-tooltip-target"><button type="button" aria-label="Toggle dark mode" data-testid="dark-theme-toggle" class="rounded-lg p-2.5 text-sm text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-700"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 20 20" aria-hidden="true" aria-label="Currently dark mode" data-active="false" class="h-5 w-5 hidden dark:block" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z" clip-rule="evenodd"></path></svg><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 20 20" aria-hidden="true" aria-label="Currently light mode" data-active="false" class="h-5 w-5 dark:hidden" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path></svg></button></div><div data-testid="flowbite-tooltip" tabindex="-1" class="absolute z-10 inline-block rounded-lg px-3 py-2 text-sm font-medium shadow-sm invisible opacity-0 bg-gray-900 text-white dark:bg-gray-700" style="position:absolute;top:0;left:0" id=":R36fkq:" role="tooltip"><div class="relative z-20">Toggle Dark Mode</div><div class="absolute z-10 h-2 w-2 rotate-45 bg-gray-900 dark:bg-gray-700" data-testid="flowbite-tooltip-arrow" style="top:;left:;right:;bottom:-4px">Â </div></div><div class="w-fit" data-testid="flowbite-tooltip-target"><a class="rounded-lg p-2.5 text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-4 focus:ring-gray-200 lg:block dark:text-gray-300 dark:focus:ring-gray-700 dark:hover:bg-gray-700" href="/login"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512" class="h-5 w-5" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M416 448h-84c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h84c17.7 0 32-14.3 32-32V160c0-17.7-14.3-32-32-32h-84c-6.6 0-12-5.4-12-12V76c0-6.6 5.4-12 12-12h84c53 0 96 43 96 96v192c0 53-43 96-96 96zm-47-201L201 79c-15-15-41-4.5-4
131 17v96H24c-13.3 0-24 10.7-24 24v96c0 13.3 10.7 24 24 24h136v96c0 21.5 26 32 41 17l168-168c9.3-9.4 9.3-24.6 0-34z"></path></svg></a></div><div data-testid="flowbite-tooltip" tabindex="-1" class="absolute z-10 inline-block rounded-lg px-3 py-2 text-sm font-medium shadow-sm transition-opacity duration-300 invisible opacity-0 bg-gray-900 text-white dark:bg-gray-700" style="position:absolute;top:0;left:0" id=":R56fkq:" role="tooltip"><div class="relative z-20">Sign In</div><div class="absolute z-10 h-2 w-2 rotate-45 bg-gray-900 dark:bg-gray-700" data-testid="flowbite-tooltip-arrow" style="top:;left:;right:;bottom:-4px">Â </div></div><div class="w-fit" data-testid="flowbite-tooltip-target"><a rel="noopener" target="_blank" href="https://github.com/oele-isis-vanderbilt/SyncFlow" aria-label="View on GitHub" class="hidden rounded-lg p-2.5 text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-4 focus:ring-gray-200 lg:block dark:text-gray-300 dark:focus:ring-gray-700 dark:hover:bg-gray-700"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 16 16" aria-hidden="true" class="size-5" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"></path></svg></a></div><div data-testid="flowbite-tooltip" tabindex="-1" class="absolute z-10 inline-block rounded-lg px-3 py-2 text-sm font-medium shadow-sm invisible opacity-0 bg-gray-900 text-white dark:bg-gray-700" style="position:absolute;top:0;left:0" id=":R76fkq:" role="tooltip"><div class="relative z-20">View on GitHub</div><div class="absolute z-10 h-2 w-2 rotate-45 bg-gray-900 dark:bg-gray-700" data-testid="flowbite-tooltip-arrow" style="top:;left:;right:;bottom:-4px">Â </div></div></div></div></nav><div class="mx-auto w-full max-w-8xl lg:flex"><div class="fixed inset-0 z-50 size-full max-w-64 overflow-y-auto bg-gray-200 px-4 lg:sticky lg:top-[61px] lg:block lg:h-[calc(100vh-4rem)] dark:bg-gray-900 hidden"><nav aria-label="Docs navigation" class="px-1 pt-16 pb-8 pl-3 font-normal text-base lg:pt-2 lg:pl-0 lg:text-sm"><ul><li class="mt-8"><h5 class="mb-2 font-semibold text-gray-900 text-sm uppercase tracking-wide lg:text-xs dark:text-white">introduction</h5><ul class="py-1"><li><a class="flex flex-wrap items-center py-2 font-medium text:black hover:text-blue-700 dark:text-white" href="/docs/introduction/introduction">Introduction</a></li><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/introduction/livekit">Livekit</a></li><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/introduction/architecture">Architecture</a></li><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/introduction/registration">Registration and Account Creation</a></li></ul></li><li class="mt-8"><h5 class="mb-2 font-semibold text-gray-900 text-sm uppercase tracking-wide lg:text-xs dark:text-white">Release Information</h5><ul class="py-1"><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/release/release-information">Release Notes</a></li></ul></li><li class="mt-8"><h5 class="mb-2 font-semibold text-gray-900 text-sm uppercase tracking-wide lg:text-xs dark:text-white">Tutorials</h5><ul class="py-1"><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/tutorials/projects">Projects and Resources</a></li><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/tutorials/integration-guide">
13Integration Guide</a></li></ul></li><li class="mt-8"><h5 class="mb-2 font-semibold text-gray-900 text-sm uppercase tracking-wide lg:text-xs dark:text-white">The SyncFlow EcoSystem</h5><ul class="py-1"><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/syncflow-ecosystem/syncflow-app">SyncFlow App</a></li><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/syncflow-ecosystem/syncflow-text-egress-actor">SyncFlow Text Egress Actor</a></li><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/syncflow-ecosystem/syncflow-node-client">SyncFlow Node Client</a></li><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/syncflow-ecosystem/syncflow-python-client">SyncFlow Python Client</a></li></ul></li><li class="mt-8"><h5 class="mb-2 font-semibold text-gray-900 text-sm uppercase tracking-wide lg:text-xs dark:text-white">How to use SyncFlow</h5><ul class="py-1"><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/how-to/client-development">Client Development</a></li></ul></li><li class="mt-8"><h5 class="mb-2 font-semibold text-gray-900 text-sm uppercase tracking-wide lg:text-xs dark:text-white">Deploying SyncFlow</h5><ul class="py-1"><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/deployment/local">Local Deployment</a></li></ul></li><li class="mt-8"><h5 class="mb-2 font-semibold text-gray-900 text-sm uppercase tracking-wide lg:text-xs dark:text-white">Contributing Guidelines</h5><ul class="py-1"><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/contributing/contributing-guidelines">Contributing</a></li></ul></li><li class="mt-8"><h5 class="mb-2 font-semibold text-gray-900 text-sm uppercase tracking-wide lg:text-xs dark:text-white">Funding and Acknowledgements</h5><ul class="py-1"><li><a class="flex flex-wrap items-center py-2 font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/funding/funding-info">Funding Information</a></li></ul></li></ul></nav></div><div class="w-full min-w-0"><div class="flex"><div class="flex min-w-0 flex-col px-4 py-2"><main>
13<div class="divide-y divide-gray-200 dark:divide-gray-400"><div class="pb-6"><h1 class="mb-2 inline-block w-full font-extrabold text-3xl text-gray-900 tracking-tight dark:text-white">Introduction - SyncFlow</h1><p class="text-gray-600 text-lg dark:text-gray-400">Harmonize your multimodal data collection and analysis with SyncFlow</p></div><div id="mainContent" class="py-5"><div class="text-center p-2 bg-white"><img src="/docs/syncflow-logo.png" alt="SyncFlow" class="mx-auto"/></div> 14<h2 class="group relative z-20 scroll-mt-20 font-bold text-2xl text-gray-900 dark:text-white" id="mmla-collection-and-processing"><a aria-hidden="true" tabindex="-1" target="_blank" rel="noreferrer" href="#mmla-collection-and-processing"><span class="icon icon-link"></span></a>MMLA Collection and Processing<a href="#mmla-collection-and-processing" aria-label="Link to this section: [object Object],MMLA Collection and Processing" class="ml-2 text-gray-900 opacity-0 transition-opacity group-hover:opacity-100 dark:text-white">#</a></h2> 15<p>Multi-modal learning analytics uses data streams of different modalities to analyze and provide feedback to researchers/educators on overall performance of students performing a learning activity, typically using computers. Depending on the nature of the activity, analyses can range from affect detection, log analysis, audio transcription etc⦠among others. Some of these analytics methods are available in realtime.</p> 16<br/> 17<div class="flex flex-col items-center p-10"><img src="/docs/mmla.png"/><p class="dark:text-white italic mt-2">Typical MMLA Collection Setup in different classroom environments</p></div> 18<br/> 19<p>MM collection in a typical classroom research project(usually ranging from few days to months), for each session, students are assigned a particular learning experience, these learning experiences are usually gamified(some are even games) that the students play. For each session, depending on the kinds of analysis needed, researchers usually collect application logs, students' audio and video, overall classroom video/audio, teacher/researchers' interviews, data from a wide array of sensors like eye trackers, heartbeat sensors, positional data etc⦠Well, That's a lot right? Complicating things, the systems generating this volume of data are isolated, controlled by different actors and are built using a wide array of tools/technologies and usually there isn't a level of synergy between them. Additionally, for a session(running from a few minutes to an hour or two), a unified timeline is needed to do a segmented analysis, such that all the collected data can be analyzed as a whole or in segments.</p> 20<h2 class="group relative z-20 scroll-mt-20 font-bold text-2xl text-gray-900 dark:text-white" id="challenges"><a aria-hidden="true" tabindex="-1" target="_blank" rel="noreferrer" href="#challenges"><span class="icon icon-link"></span></a>Challenges<a href="#challenges" aria-label="Link to this section: [object Object],Challenges" class="ml-2 text-gray-900 opacity-0 transition-opacity group-hover:opacity-100 dark:text-white">#</a></h2> 21<p>Here, we have itemized a list of challenges on collecting and analyzing multi modal data for learning analytics. Some of these are purely technical in nature, while others are philosophical concerns affecting the technical implementations at a fundamental level.</p> 22<ol> 23<li class="py-2"><strong>Integration</strong>: Combining data from diverse sources and formats is probably the most tedious aspect of collecting multi-modal data. Firstly, there are a wide range of devices and sensors (multi-modal) used in MMLA research. Anecdotally, here at OELE, we have worked with different sensors including but not limited to audio interfaces, Tobii glasses, web cameras, wireless microphones, stereo cameras, Kinect, etc. The first integration challenge is to write appropriate streaming and control software to get data from the device(s) because of the diversity in devices and their control SDK encompassing various programming languages, frameworks, and software patterns. The second integration challenge arises in getting application logs/other data from a wide array of learning environments (mentioned above). Not only are these learning environments themselves built using a plethora of technologies, but they also employ various strategies for user management and differ in their business logic, such that a unified interface to getting application logs is challenging. A silver lining in this context, however, is that most of these applications are served from the browser, so, a single JavaScript SDK can provide a solution, especially if we intended to use client-side JavaScript. The integration of multi-modal data for classroom research is further complicated by its hierarchical structure, which may include both group and individual data layers, and these boundaries are not so well defined.</li> 24</ol> 25<br/> 26<ol start="2"> 27<li class="py-2"><strong>Synchronization</strong>: Aligning data streams to a unified timeline poses another significant challenge in multimodal data collection, especially when there are multiple sensors streaming data at different bit rates and with actors (both human and sensors) having different times of entry and exit. Any MMLA data collection ecosystem should be deemed useless if it doesnât guarantee synchronization of the modalities such that all the collected data can be analyzed as a whole or in segments.</li> 28</ol> 29<br/> 30<ol start="3"> 31<li class="py-2"><strong>Privacy</strong>: Managing sensitive information, especially with audio and video recordings, poses another set of challenges in multimodal data collection. To an external observer, a multimodal data collection system for MMLA can appear no different from an advanced surveillance system, bringing with it all the associated privacy concerns. There should be sufficient privacy guardrails in place such that participants are anonymized from the outset, and we should follow proper guidelines on how identifiable data is collected and shared, adhering to IRB and compliance policies. This domain cannot and should not operate like a leeching corporation, where a 100-page privacy policy document allows one to get away with daylight robbery. While this is not a direct technical concern or challenge, addressing privacy concerns can and should guide the architecture of an MMLA data collection system.</li> 32</ol> 33<br/> 34<ol start="4"> 35<li class="py-2"><strong>Scalability</strong>: Handling large volumes of data generated from multiple modalities and users poses a technical challenge, similar to other software engineering domains, when issues of scale must be addressed. Scaling becomes particularly challenging with video and audio data, as they tend to consume substantial system bandwidth and require significant disk storage.</li> 36</ol> 37<br/> 38<ol start="5"> 39<li class="py-2"><strong>Data Quality</strong>: Maintaining high standards of accuracy and reliability in data poses significant challenges, including addressing device failures and bugs in various closed, lightly coupled systems. Ensuring consistency across different modalities, especially when they are subject to variable environmental conditions or differing operational standards, further complicates this issue.</li> 40</ol> 41<br/> 42<ol start="6"> 43<li class="py-2"><strong>Ethical Concerns</strong>: Addressing ethical issues around surveillance and consent in educational settings is critical. It involves navigating privacy laws, securing informed consent from participants, and maintaining transparency about data use. These
43concerns are especially acute given the intrusive nature of some data collection methods, such as continuous video and audio monitoring, which can raise significant privacy and ethical red flags.</li> 44</ol> 45<p>Overall, these challenges need to be addressed when developing systems for multi modal data collection for learning analytics. To that end, our goal is to provide a platform that addresses these challenges and provides a seamless experience for researchers and educators to collect and analyze multimodal data in real-time.</p> 46<h2 class="group relative z-20 scroll-mt-20 font-bold text-2xl text-gray-900 dark:text-white" id="what-is-syncflow"><a aria-hidden="true" tabindex="-1" target="_blank" rel="noreferrer" href="#what-is-syncflow"><span class="icon icon-link"></span></a>What is SyncFlow?<a href="#what-is-syncflow" aria-label="Link to this section: [object Object],What is SyncFlow?" class="ml-2 text-gray-900 opacity-0 transition-opacity group-hover:opacity-100 dark:text-white">#</a></h2> 47<p>SyncFlow is a platform that aims to address the challenges of collecting and analyzing multi-modal data for learning analytics. It provides a set of APIs and SDKs to build reliable data streaming/collection channels from various systems and sensors. SyncFlow is designed to be a scalable and secure platform to collect, store and analyze multimodal data in real-time. Levarging modern webrtc stack used in video conferencing applications with <a target="_blank" rel="noreferrer" href="https://livekit.io/">LiveKit</a>, SyncFlow provides a robust platform for building live video and audio streaming integrations from various sources. There are two main components of SyncFlow platform (see the <code>SyncFlow</code> <a href="/docs/introduction/architecture">Architecture</a> for details):</p> 48<ol> 49<li class="py-2"><strong>Dashboard</strong>: A Next.js application that will can be used to create and manage livekit sesssions, manage users and preview/record data streams for various projects that are integrated with SyncFlow.</li> 50</ol> 51<br/> 52<ol start="2"> 53<li class="py-2"><strong>Server</strong>: An actix web application that will be used to control/manage the LiveKit services, manage users and sessions, and provide APIs for the dashboard to interact with the LiveKit services.</li> 54</ol> 55<p>The syncflow platform can be accessed at <a target="_blank" rel="noreferrer" href="https://syncflow.live">https://syncflow.live</a> and is currently in development.</p></div></div></main><aside class="flex font-medium leading-6" aria-label="Previous and next page navigation"><a class="ml-auto flex items-center justify-center text-right text-gray-500 transition-colors duration-200 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white" href="/docs/introduction/livekit">Livekit<svg class="ml-2 size-3.5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 10"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M1 5h12m0 0L9 1m4 4L9 9"></path></svg></a></aside></div><div class="hidden w-64 flex-none px-8 xl:block xl:text-sm"><div class="sticky top-20 flex h-[calc(100vh-5rem)] flex-col justify-between overflow-y-auto pb-6"><div class="mb-8"><h4 class="mt-5 mb-4 pl-2.5 font-semibold text-gray-900 text-sm uppercase tracking-wide lg:text-xs dark:text-white">On this page</h4><nav id="visible-table-of-contents" class="text-gray-900 lg:text-xs dark:text-white"><ul> 56<li><a href="#mmla-collection-and-processing">MMLA Collection and Processing</a></li> 57<li><a href="#challenges">Challenges</a></li> 58<li><a href="#what-is-syncflow">What is SyncFlow?</a></li> 59</ul></nav></div></div></div></div></div></div><div class="w-full"><footer data-testid="flowbite-footer" class="rounded-lg shadow md:flex md:items-center md:justify-between w-full p-6 bg-white dark:bg-gray-900"><div class="container mx-auto"><div class="grid w-full justify-between sm:flex sm:justify-between md:flex md:grid-cols-1"><div class="hidden w-full items-center justify-start md:flex"><div class="w-32 md:w-96"><img alt="App Logo" fetchPriority="high" width="400" height="400" decoding="async" data-nimg="1" class="relative dark:drop-shadow-[0_0_0.3rem_#ffffff70] dark:invert" style="color:transparent" srcSet="/_next/image?url=%2Fsyncflow.png&w=640&q=75 1x, /_next/image?url=%2Fsyncflow.png&w=828&q=75 2x" src="/_next/image?url=%2Fsyncflow.png&w=828&q=75"/></div></div><div class="grid grid-cols-2 gap-8 sm:mt-4 sm:grid-cols-3 sm:gap-6"><div><h2 data-testid="flowbite-footer-title" class="mb-6 text-sm font-semibold uppercase text-gray-500 dark:text-white">about</h2><ul data-testid="footer-groupLink" class="flex flex-wrap text-sm text-gray-500 dark:text-white flex-col space-y-4"><li class="me-4 last:mr-0 md:mr-6"><a href="#" class="hover:underline">About</a></li><li class="me-4 last:mr-0 md:mr-6"><a href="#" class="hover:underline">Library</a></li><li class="me-4 last:mr-0 md:mr-6"><a href="#" class="hover:underline">Documentation</a></li></ul></div><div><h2 data-testid="flowbite-footer-title" class="mb-6 text-sm font-semibold uppercase text-gray-500 dark:text-white">Follow us</h2><ul data-testid="footer-groupLink" class="flex flex-wrap text-sm text-gray-500 dark:text-white flex-col space-y-4"><li class="me-4 last:mr-0 md:mr-6"><a href="https://github.com/oele-isis-vanderbilt/SyncFlow.git" class="hover:underline" target="_blank">Github</a></li></ul></div><div><h2 data-testid="flowbite-footer-title" class="mb-6 text-sm font-semibold uppercase text-gray-500 dark:text-white">Contact</h2><ul data-testid="footer-groupLink" class="flex flex-wrap text-sm text-gray-500 dark:text-white flex-col space-y-4"><li class="me-4 last:mr-0 md:mr-6"><a href="#" class="hover:underline">Contact Us</a></li><li class="me-4 last:mr-0 md:mr-6"><a href="#" class="hover:underline">Terms & Conditions</a></li></ul></div></div></div><hr data-testid="footer-divider" class="w-full border-gray-200 dark:border-gray-700 sm:mx-auto lg:my-8 m-4"/><div class="w-full sm:flex sm:items-center sm:justify-between"><div data-testid="flowbite-footer-copyright" class="text-sm text-gray-500 dark:text-gray-400 sm:text-center">© <!-- -->2024<a href="https://wp0.vanderbilt.edu/oele/" class="ml-1 hover:underline">OELEâ¢</a></div><div class="mt-4 flex space-x-6 sm:mt-0 sm:justify-center"><div><a data-testid="flowbite-footer-icon" href="https://github.com/oele-isis-vanderbilt" class="text-gray-500 dark:hover:text-white" target="_blank"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 16 16" class="h-5 w-5" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.
5904 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"></path></svg></a></div></div></div></div></footer></div></div></div>
59<script src="/_next/static/chunks/webpack-9297789b63b0cdbf.js" async=""></script>
59<script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script>
59<script>self.__next_f.push([1,"1:HL[\"/_next/static/media/3e5cf33211ef6d1b-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/media/a50f9a2c50b5a675-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n3:HL[\"/_next/static/media/e4af272ccee01ff0-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n4:HL[\"/_next/static/css/d6a64d1d075df43a.css\",\"style\"]\n5:HL[\"/_next/static/css/7cca8e2c5137bd71.css\",\"style\"]\n6:HL[\"/_next/static/css/9a2231a6bb6b7669.css\",\"style\"]\n7:HL[\"/_next/static/css/721fb2fcc4beb010.css\",\"style\"]\n"])</script>
59<script>self.__next_f.push([1,"8:I[12846,[],\"\"]\na:I[72972,[\"6051\",\"static/chunks/795d4814-08e61653ed74dcee.js\",\"7240\",\"static/chunks/53c13509-bab4d5ed51ed54cb.js\",\"7699\",\"static/chunks/8e1d74a4-9c175a671fd54726.js\",\"8422\",\"static/chunks/66ec4792-21bbac1c90fc45f6.js\",\"5501\",\"static/chunks/c16f53c3-8797dc76d227c628.js\",\"9713\",\"static/chunks/9713-83c49c433c444748.js\",\"7216\",\"static/chunks/7216-1a4832e4a7079924.js\",\"2972\",\"static/chunks/2972-86359f05cebf0f9e.js\",\"4189\",\"static/chunks/app/docs/%5B%5B...slug%5D%5D/page-7dbcd7d9ee80efd9.js\"],\"\"]\nc:I[4707,[],\"\"]\ne:I[36423,[],\"\"]\nf:I[16014,[\"6051\",\"static/chunks/795d4814-08e61653ed74dcee.js\",\"7240\",\"static/chunks/53c13509-bab4d5ed51ed54cb.js\",\"7699\",\"static/chunks/8e1d74a4-9c175a671fd54726.js\",\"8422\",\"static/chunks/66ec4792-21bbac1c90fc45f6.js\",\"5501\",\"static/chunks/c16f53c3-8797dc76d227c628.js\",\"1779\",\"static/chunks/0e762574-7a3cc3ee1301f788.js\",\"9713\",\"static/chunks/9713-83c49c433c444748.js\",\"7216\",\"static/chunks/7216-1a4832e4a7079924.js\",\"7620\",\"static/chunks/7620-38583a754bb55e53.js\",\"2972\",\"static/chunks/2972-86359f05cebf0f9e.js\",\"3869\",\"static/chunks/3869-be23ecf668526809.js\",\"1440\",\"static/chunks/1440-622ddd41edf53978.js\",\"3998\",\"static/chunks/app/docs/layout-c5202a66cf8e8f3b.js\"],\"default\",1]\n11:I[61060,[],\"\"]\nb:T5d1,: Combining data from diverse sources and formats is probably the most tedious aspect of collecting multi-modal data. Firstly, there are a wide range of devices and sensors (multi-modal) used in MMLA research. Anecdotally, here at OELE, we have worked with different sensors including but not limited to audio interfaces, Tobii glasses, web cameras, wireless microphones, stereo cameras, Kinect, etc. The first integration challenge is to write appropriate streaming and control software to get data from the device(s) because of the diversity in devices and their control SDK encompassing various programming languages, frameworks, and software patterns. The second integration challenge arises in getting application logs/other data from a wide array of learning environments (mentioned abo"])</script>
59<script>self.__next_f.push([1,"ve). Not only are these learning environments themselves built using a plethora of technologies, but they also employ various strategies for user management and differ in their business logic, such that a unified interface to getting application logs is challenging. A silver lining in this context, however, is that most of these applications are served from the browser, so, a single JavaScript SDK can provide a solution, especially if we intended to use client-side JavaScript. The integration of multi-modal data for classroom research is further complicated by its hierarchical structure, which may include both group and individual data layers, and these boundaries are not so well defined.d:[\"slug\",\"introduction/introduction\",\"oc\"]\n12:[]\n"])</script>
59<script>self.__next_f.push([1,"0:[\"$\",\"$L8\",null,{\"buildId\":\"fwoFbyc_HyzLILhr-uanT\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"docs\",\"introduction\",\"introduction\"],\"initialTree\":[\"\",{\"children\":[\"docs\",{\"children\":[[\"slug\",\"introduction/introduction\",\"oc\"],{\"children\":[\"__PAGE__?{\\\"slug\\\":[\\\"introduction\\\",\\\"introduction\\\"]}\",{}]}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"docs\",{\"children\":[[\"slug\",\"introduction/introduction\",\"oc\"],{\"children\":[\"__PAGE__\",{},[[\"$L9\",[\"$\",\"div\",null,{\"className\":\"flex\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col px-4 py-2\",\"children\":[[\"$\",\"main\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"divide-y divide-gray-200 dark:divide-gray-400\",\"children\":[[\"$\",\"div\",null,{\"className\":\"pb-6\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"mb-2 inline-block w-full font-extrabold text-3xl text-gray-900 tracking-tight dark:text-white\",\"children\":\"Introduction - SyncFlow\"}],[\"$\",\"p\",null,{\"className\":\"text-gray-600 text-lg dark:text-gray-400\",\"children\":\"Harmonize your multimodal data collection and analysis with SyncFlow\"}]]}],[\"$\",\"div\",null,{\"id\":\"mainContent\",\"className\":\"py-5\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-center p-2 bg-white\",\"children\":[\"$\",\"img\",null,{\"src\":\"/docs/syncflow-logo.png\",\"alt\":\"SyncFlow\",\"className\":\"mx-auto\"}]}],\"\\n\",[\"$\",\"h2\",null,{\"className\":\"group relative z-20 scroll-mt-20 font-bold text-2xl text-gray-900 dark:text-white\",\"id\":\"mmla-collection-and-processing\",\"children\":[[[\"$\",\"$La\",null,{\"aria-hidden\":\"true\",\"tabIndex\":\"-1\",\"children\":[\"$\",\"span\",null,{\"className\":\"icon icon-link\"}],\"href\":\"#mmla-collection-and-processing\",\"target\":\"_blank\",\"rel\":\"noreferrer\"}],\"MMLA Collection and Processing\"],[\"$\",\"a\",null,{\"href\":\"#mmla-collection-and-processing\",\"aria-label\":\"Link to this section: [object Object],MMLA Collection and Processing\",\"className\":\"ml-2 text-gray-900 opacity-0 transition-opacity group-hover:opacity-100 dark:text-white\",\"children\":\"#\"}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Multi-modal learning analytics uses data streams of different modalities to analyze and provide feedback to researchers/educators on overall performance of students performing a learning activity, typically using computers. Depending on the nature of the activity, analyses can range from affect detection, log analysis, audio transcription etc⦠among others. Some of these analytics methods are available in realtime.\"}],\"\\n\",[\"$\",\"br\",null,{}],\"\\n\",[\"$\",\"div\",null,{\"className\":\"flex flex-col items-center p-10\",\"children\":[[\"$\",\"img\",null,{\"src\":\"/docs/mmla.png\"}],[\"$\",\"p\",null,{\"className\":\"dark:text-white italic mt-2\",\"children\":\"Typical MMLA Collection Setup in different classroom environments\"}]]}],\"\\n\",[\"$\",\"br\",null,{}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"MM collection in a typical classroom research project(usually ranging from few days to months), for each session, students are assigned a particular learning experience, these learning experiences are usually gamified(some are even games) that the students play. For each session, depending on the kinds of analysis needed, researchers usually collect application logs, students' audio and video, overall classroom video/audio, teacher/researchers' interviews, data from a wide array of sensors like eye trackers, heartbeat sensors, positional data etc⦠Well, That's a lot right? Complicating things, the systems generating this volume of data are isolated, controlled by different actors and are built using a wide array of tools/technologies and usually there isn't a level of synergy between them. Additionally, for a session(running from a few minutes to an hour or two), a unified timeline is needed to do a segmented analysis, such that all the collected data can be analyzed as a whole or in segments.\"}],\"\\n\",[\"$\",\"h2\",null,{\"className\":\"group relative z-20 scroll-mt-20 font-bold text-2xl text-gray-900 dark:text-white\",\"id\":\"challenges\",\"children\":[[[\"$\",\"$La\",null,{\"aria-hidden\":\"true\",\"tabIndex\":\"-1\",\"children\":[\"$\",\"span\",null,{\"className\":\"icon icon-link\"}],\"href\":\"#challenges\",\"target\":\"_blank\",\"rel\":\"noreferrer\"}],\"Challenges\"],[\"$\",\"a\",null,{\"href\":\"#challenges\",\"aria-label\":\"Link to this section: [object Object],Challenges\",\"className\":\"ml-2 text-gray-900 opacity-0 transition-opacity group-hover:opacity-100 dark:text-white\",\"children\":\"#\"}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Here, we have itemized a list of challenges on collecting and analyzing multi modal data for learning analytics. Some of these are purely technical in nature, while others are philosophical concerns affecting the technical implementations at a fundamental level.\"}],\"\\n\",[\"$\",\"ol\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"className\":\"py-2\",\"children\":[[\"$\",\"strong\",null,{\"children\":\"Integration\"}],\"$b\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"br\",null,{}],\"\\n\",[\"$\",\"ol\",null,{\"start\":\"2\",\"children\":[\"\\n\",[\"$\",\"li\",null,{\"className\":\"py-2\",\"children\":[[\"$\",\"strong\",null,{\"children\":\"Synchronization\"}],\": Aligning data streams to a unified timeline poses another significant challenge in multimodal data collection, especially when there are multiple sensors streaming data at different bit rates and with actors (both human and sensors) having different times of entry and exit. Any MMLA data collection ecosystem should be deemed useless if it doesnât guarantee synchronization of the modalities such that all the collected data can be analyzed as a whole or in segments.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"br\",null,{}],\"\\n\",[\"$\",\"ol\",null,{\"start\":\"3\",\"children\":[\"\\n\",[\"$\",\"li\",null,{\"className\":\"py-2\",\"children\":[[\"$\",\"strong\",null,{\"children\":\"Privacy\"}],\": Managing sensitive information, especially with audio and video recordings, poses another set of challenges in multimodal data collection. To an external observer, a multimodal data collection system for MMLA can appear no different from an advanced surveillance system, bringing with it all the associated privacy concerns. There should be sufficient privacy guardrails in place such that participants are anonymized from the outset, and we should follow proper guidelines on how identifiable data is collected and shared, adhering to IRB and compliance policies. This domain cannot and should not operate like a leeching corporation, where a 100-page privacy policy document allows one to get away with daylight robbery. While this is not a direct technical concern or challenge, addressing privacy concerns can and should guide the architecture of an MMLA data collection system.\"]}
59],\"\\n\"]}],\"\\n\",[\"$\",\"br\",null,{}],\"\\n\",[\"$\",\"ol\",null,{\"start\":\"4\",\"children\":[\"\\n\",[\"$\",\"li\",null,{\"className\":\"py-2\",\"children\":[[\"$\",\"strong\",null,{\"children\":\"Scalability\"}],\": Handling large volumes of data generated from multiple modalities and users poses a technical challenge, similar to other software engineering domains, when issues of scale must be addressed. Scaling becomes particularly challenging with video and audio data, as they tend to consume substantial system bandwidth and require significant disk storage.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"br\",null,{}],\"\\n\",[\"$\",\"ol\",null,{\"start\":\"5\",\"children\":[\"\\n\",[\"$\",\"li\",null,{\"className\":\"py-2\",\"children\":[[\"$\",\"strong\",null,{\"children\":\"Data Quality\"}],\": Maintaining high standards of accuracy and reliability in data poses significant challenges, including addressing device failures and bugs in various closed, lightly coupled systems. Ensuring consistency across different modalities, especially when they are subject to variable environmental conditions or differing operational standards, further complicates this issue.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"br\",null,{}],\"\\n\",[\"$\",\"ol\",null,{\"start\":\"6\",\"children\":[\"\\n\",[\"$\",\"li\",null,{\"className\":\"py-2\",\"children\":[[\"$\",\"strong\",null,{\"children\":\"Ethical Concerns\"}],\": Addressing ethical issues around surveillance and consent in educational settings is critical. It involves navigating privacy laws, securing informed consent from participants, and maintaining transparency about data use. These concerns are especially acute given the intrusive nature of some data collection methods, such as continuous video and audio monitoring, which can raise significant privacy and ethical red flags.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Overall, these challenges need to be addressed when developing systems for multi modal data collection for learning analytics. To that end, our goal is to provide a platform that addresses these challenges and provides a seamless experience for researchers and educators to collect and analyze multimodal data in real-time.\"}],\"\\n\",[\"$\",\"h2\",null,{\"className\":\"group relative z-20 scroll-mt-20 font-bold text-2xl text-gray-900 dark:text-white\",\"id\":\"what-is-syncflow\",\"children\":[[[\"$\",\"$La\",null,{\"aria-hidden\":\"true\",\"tabIndex\":\"-1\",\"children\":[\"$\",\"span\",null,{\"className\":\"icon icon-link\"}],\"href\":\"#what-is-syncflow\",\"target\":\"_blank\",\"rel\":\"noreferrer\"}],\"What is SyncFlow?\"],[\"$\",\"a\",null,{\"href\":\"#what-is-syncflow\",\"aria-label\":\"Link to this section: [object Object],What is SyncFlow?\",\"className\":\"ml-2 text-gray-900 opacity-0 transition-opacity group-hover:opacity-100 dark:text-white\",\"children\":\"#\"}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"SyncFlow is a platform that aims to address the challenges of collecting and analyzing multi-modal data for learning analytics. It provides a set of APIs and SDKs to build reliable data streaming/collection channels from various systems and sensors. SyncFlow is designed to be a scalable and secure platform to collect, store and analyze multimodal data in real-time. Levarging modern webrtc stack used in video conferencing applications with \",[\"$\",\"$La\",null,{\"children\":\"LiveKit\",\"href\":\"https://livekit.io/\",\"target\":\"_blank\",\"rel\":\"noreferrer\"}],\", SyncFlow provides a robust platform for building live video and audio streaming integrations from various sources. There are two main components of SyncFlow platform (see the \",[\"$\",\"code\",null,{\"children\":\"SyncFlow\"}],\" \",[\"$\",\"$La\",null,{\"children\":\"Architecture\",\"href\":\"/docs/introduction/architecture\"}],\" for details):\"]}],\"\\n\",[\"$\",\"ol\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"className\":\"py-2\",\"children\":[[\"$\",\"strong\",null,{\"children\":\"Dashboard\"}],\": A Next.js application that will can be used to create and manage livekit sesssions, manage users and preview/record data streams for various projects that are integrated
59with SyncFlow.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"br\",null,{}],\"\\n\",[\"$\",\"ol\",null,{\"start\":\"2\",\"children\":[\"\\n\",[\"$\",\"li\",null,{\"className\":\"py-2\",\"children\":[[\"$\",\"strong\",null,{\"children\":\"Server\"}],\": An actix web application that will be used to control/manage the LiveKit services, manage users and sessions, and provide APIs for the dashboard to interact with the LiveKit services.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"The syncflow platform can be accessed at \",[\"$\",\"$La\",null,{\"children\":\"https://syncflow.live\",\"href\":\"https://syncflow.live\",\"target\":\"_blank\",\"rel\":\"noreferrer\"}],\" and is currently in development.\"]}]]}]]}]}],[\"$\",\"aside\",null,{\"className\":\"flex font-medium leading-6\",\"aria-label\":\"Previous and next page navigation\",\"children\":[\"$undefined\",[\"$\",\"$La\",null,{\"className\":\"ml-auto flex items-center justify-center text-right text-gray-500 transition-colors duration-200 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white\",\"href\":\"/docs/introduction/livekit\",\"children\":[\"Livekit\",[\"$\",\"svg\",null,{\"className\":\"ml-2 size-3.5\",\"aria-hidden\":\"true\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"fill\":\"none\",\"viewBox\":\"0 0 14 10\",\"children\":[\"$\",\"path\",null,{\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":\"2\",\"d\":\"M1 5h12m0 0L9 1m4 4L9 9\"}]}]]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"hidden w-64 flex-none px-8 xl:block xl:text-sm\",\"children\":[\"$\",\"div\",null,{\"className\":\"sticky top-20 flex h-[calc(100vh-5rem)] flex-col justify-between overflow-y-auto pb-6\",\"children\":[\"$\",\"div\",null,{\"className\":\"mb-8\",\"children\":[[\"$\",\"h4\",null,{\"className\":\"mt-5 mb-4 pl-2.5 font-semibold text-gray-900 text-sm uppercase tracking-wide lg:text-xs dark:text-white\",\"children\":\"On this page\"}],[\"$\",\"nav\",null,{\"id\":\"visible-table-of-contents\",\"className\":\"text-gray-900 lg:text-xs dark:text-white\",\"children\":[\"$\",\"ul\",\"ul-0\",{\"children\":[\"\\n\",[\"$\",\"li\",\"li-0\",{\"children\":[\"$\",\"a\",\"a-0\",{\"href\":\"#mmla-collection-and-processing\",\"children\":\"MMLA Collection and Processing\"}]}],\"\\n\",[\"$\",\"li\",\"li-1\",{\"children\":[\"$\",\"a\",\"a-0\",{\"href\":\"#challenges\",\"children\":\"Challenges\"}]}],\"\\n\",[\"$\",\"li\",\"li-2\",{\"children\":[\"$\",\"a\",\"a-0\",{\"href\":\"#what-is-syncflow\",\"children\":\"What is SyncFlow?\"}]}],\"\\n\"]}]}]]}]}]}]]}],null],null],null]},[null,[\"$\",\"$Lc\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"docs\",\"children\",\"$d\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Le\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/721fb2fcc4beb010.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$Lc\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"docs\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Le\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}],\"params\":{}}]],null],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/d6a64d1d075df43a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/7cca8e2c5137bd71.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/9a2231a6bb6b7669.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"scrollbar-thub-sky-700 scrollbar-track-sky-300 scrollbar-thin\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"data-flowbite-theme-mode-script\":true,\"dangerouslySetInnerHTML\":{\"__html\":\"\\n try {\\n const mode = window.localStorage.getItem(\\\"flowbite-theme-mode\\\") ?? \\\"undefined\\\" ?? \\\"light\\\";\\n const computedMode =\\n mode === \\\"auto\\\" ? (window.matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches ? \\\"dark\\\" : \\\"light\\\") : mode;\\n\\n if (computedMode === \\\"dark\\\") {\\n document.documentElement.classList.add(\\\"dark\\\");\\n } else {\\n document.documentElement.classList.remove(\\\"dar
59k\\\");\\n }\\n } catch (e) {}\\n \"}}]}],[\"$\",\"body\",null,{\"className\":\"__className_f367f3 dark:bg-gray-800\",\"children\":[\"$\",\"$Lc\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Le\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L10\"],\"globalErrorComponent\":\"$11\",\"missingSlots\":\"$W12\"}]\n"])</script>
59<script>self.__next_f.push([1,"10:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Introduction - SyncFlow | SyncFlow\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Harmonize your multimodal data collection and analysis with SyncFlow\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/icon.svg?3b5598bf8e519553\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"meta\",\"5\",{\"name\":\"next-size-adjust\"}]]\n9:null\n"])</script>
59</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.