

This Tech Assistant is designed to support you with clear insights into our company, our work, our services and the people behind our progress.
Powered by CorLab Tech © 2025
A 360° video of the inside of a cell is a wonderful thing to show a third-year medical student. A 360° video on twelve headsets that each need to be unlocked, opened, scrolled to the right file and pressed "play" by twelve different people is a wonderful way to lose fifteen minutes of a fifty-minute class.
That was the situation at the Pathophysiology discipline of USMF "Nicolae Testemițanu" when a set of Meta Quest headsets arrived at the department. The hardware was there. The content was there. What was missing was the piece in the middle: a way for one teacher to press play once and have every student see the same thing at the same second — and to know, from the front of the room, what each of them is actually looking at.
So I built it. It is called CoRLab VR Space, and this article is about what it does, how it is put together, and what the first classes with it looked like.

A practical class at USMF: eleven headsets connected, the master view mirrored on the room screen, and the dashboard open on the laptop. [01-classroom-synced-session.jpg]
CoRLab VR Space has three parts that talk to each other over a local network: a web dashboard for the teacher, a small server, and a VR app installed on every headset.
The teacher opens the dashboard on a laptop or on the room's interactive screen. The headsets appear in a list as they power on — name, model, battery, what they are playing and how far in. The teacher picks a video from the library and presses "Play All". Every headset starts the same video. "Pause All", "Stop All" and "Sync All" do what they say. If one student took the headset off for a minute and fell behind, one click brings that headset back to the same timestamp as everyone else.
One headset is the master. Whatever the master sees is streamed back to the dashboard as a live picture, so the whole room — including students who are waiting their turn — can follow along on the big screen. And the master can also drive the class from inside VR: the student or teacher wearing it gets an in-VR menu with the video list and a "Play All" button, no laptop needed.

The dashboard: master headset view on the left, device list with per-headset controls, global Pause / Stop / Sync. (Screenshot from a demo environment.) [08-screenshot-dashboard-control.png]
Every group goes through the same onboarding before we use VR for anything medical, and it happens in the first lesson of the semester. It takes about twenty minutes and covers four things: how to put the headset on and adjust it so the image is sharp, how to move safely in a room where fifteen other people are standing, the hygiene rules for shared equipment, and what to do if you feel dizzy — take it off, sit down, nobody will mind.
Then comes the first immersive demo: a short walk inside a living cell. One student wears the master headset, the rest watch the mirrored view on the screen, and then they rotate. By the end of the lesson everyone has had the headset on at least once, and by the next lesson the technology is boring — which is exactly what I want. A tool that nobody knows how to use safely is a tool that stays in the box.

First lesson with a new group: one student in the master headset, the rest following on the screen. Everyone rotates before the class ends. [03-onboarding-first-demo.jpg]

What the room sees: the master headset's view, mirrored live on the interactive display. [04-group-watching-master-view.jpg]
Videos are uploaded through the dashboard and land on the server. Anything that is not already an MP4 the headsets can play natively — MKV, MOV, AVI — is transcoded in the background with ffmpeg, and the card shows the progress while it happens. Each video is tagged (cardio, neuro, cancer, repro…) so a colleague can find the right one without asking me, and each one carries two settings the headset needs to render it correctly: the projection (2D flat, 180°, 360°, or the odd half-frame variants some publishers use) and the stereo layout (mono, side-by-side, over-under).
A lot of good medical 360° content lives on YouTube, and YouTube stores 360° video in a cubemap format that a headset player cannot show directly. So the repository also carries a small script that downloads a video and converts it to standard equirectangular, which is what the app expects. Not glamorous, but it is the difference between "we have a great video" and "we can show it on Tuesday".

The video library: tags, projection type, stereo layout and file size on every card. Green dot means the file is ready on the server. [07-screenshot-library.png]
The most important design decision in the whole system is that videos are not streamed to the headsets during class. They are downloaded once, ahead of time, and played from local storage. A 2 GB file streamed to twelve devices over a classroom access point is a guaranteed buffering wheel on at least one of them; the same file already on the device just plays.
The dashboard has a "Download All" for a video and a "Device Management" page that shows what each headset has cached and lets you remove old files. There is also an auto-deploy switch: when it is on, any headset that powers up and connects gets the currently active videos pushed to it automatically. In practice I turn it on the day before a new topic, put the headsets on the charger, and the next morning they are ready.

Device Management: what each headset has downloaded, download progress, and the auto-deploy switch. (Screenshot from a demo environment.) [09-screenshot-device-management.png]

The headsets on the charging shelf at the department. Downloads happen here, the night before. [02-headsets-charging-row.jpg]
A few features exist only because I was standing in the room and needed them.

Inside the headset between videos: the waiting room and the in-VR menu. In master mode the menu gets a golden border and a "Play All" for every card. [10-screenshot-in-vr-menu.png]
The repository is a pnpm monorepo with three applications and two shared packages.
Synchronization is deliberately simple. The server tells every headset to play the same file; from then on, each headset compares its own position with the master's reported position once per second and seeks if it has drifted by more than 100 milliseconds. A "Sync All" from the dashboard sends everyone to the master's timestamp and matches its paused/playing state. For lecture-style content — where the goal is that everyone sees the same organ at the same moment, not frame-locked multiplayer — this is more than enough, and it survives a headset going to sleep and waking up.
The master view on the dashboard is a JPEG stream: the master headset renders its camera to a 960×540 texture, encodes it at ten frames per second, and pushes it over the same WebSocket. It is not pretty up close, but on a room display it is exactly what you need to say "look at the top-left — that is the mitochondrion".

Where most of it happened: Unity on one screen, the dashboard on the other, and the headset on my head more often than I would like to admit. [06-dev-desk-unity.jpg]
The first version had no authentication at all, which was fine in my office and not fine in a building with a few hundred students on the Wi-Fi. The current version has proper accounts with four roles — superadmin, admin, editor, viewer — where an editor can manage the library and a viewer can only run a class. New users join through invite links generated by an admin (no email server to configure), sessions use JWT with refresh tokens, and headsets authenticate with a shared access code that lives in the headset config. Every play, download, master change and login is written to an audit log with the user and the target, so when a video "disappeared" it took one filter to see who had deleted it and when.
Big downloads kill WebSockets. The Unity client downloads a 2 GB file on the main thread, and while it does, it cannot answer the server's ping. With Socket.io's default 20-second timeout the server decided the headset was dead, dropped it, and the dashboard showed it disconnecting in the middle of a download that was, in fact, going fine. The fix was boring — a two-minute ping timeout on the server — but it took an afternoon of staring at the wrong logs to find.
YouTube 360° is not 360° video. The first "360°" file I put on a headset showed six warped squares. YouTube stores immersive video as an equi-angular cubemap; a panoramic player expects equirectangular. Now there is a conversion script in the repo and a note in the upload dialog, and I have not been surprised since.
Optimistic status beats honest status. When the teacher presses Pause, the dashboard used to wait for each headset to confirm before updating the badge. On a busy classroom network that lag was long enough that people pressed Pause twice, which resumed the video. Now the dashboard updates the badge immediately and corrects itself later if the headset disagrees. It looks faster and, more importantly, nobody double-clicks.
Headsets do not have names. Twelve devices called "Quest 3" is not a list, it is a puzzle. The client now sends a device name that can be set per headset, and the ping button exists for the days when the names have not been set.
A student who has walked through a coronary artery in three dimensions does not forget where the left anterior descending branch is. That is not a claim about VR in general — it is what I see in the questions students ask after a session compared with the questions they ask after a slide. The technology to do this has been affordable for a while. What was missing in our department was not a headset or a video, but the twenty-minute onboarding, the one-click "Play All", and the confidence that on Tuesday at 8:00 the twelve headsets will do the same thing at the same time.

Six headsets, one cell, one Play button. [05-selfie-cell-on-screen.jpg]
A 360° video of the inside of a cell is a wonderful thing to show a third-year medical student. A 360° video on twelve headsets that each need to be unlocked, opened, scrolled to the right file and pressed "play" by twelve different people is a wonderful way to lose fifteen minutes of a fifty-minute class.
That was the situation at the Pathophysiology discipline of USMF "Nicolae Testemițanu" when a set of Meta Quest headsets arrived at the department. The hardware was there. The content was there. What was missing was the piece in the middle: a way for one teacher to press play once and have every student see the same thing at the same second — and to know, from the front of the room, what each of them is actually looking at.
So I built it. It is called CoRLab VR Space, and this article is about what it does, how it is put together, and what the first classes with it looked like.

A practical class at USMF: eleven headsets connected, the master view mirrored on the room screen, and the dashboard open on the laptop. [01-classroom-synced-session.jpg]
CoRLab VR Space has three parts that talk to each other over a local network: a web dashboard for the teacher, a small server, and a VR app installed on every headset.
The teacher opens the dashboard on a laptop or on the room's interactive screen. The headsets appear in a list as they power on — name, model, battery, what they are playing and how far in. The teacher picks a video from the library and presses "Play All". Every headset starts the same video. "Pause All", "Stop All" and "Sync All" do what they say. If one student took the headset off for a minute and fell behind, one click brings that headset back to the same timestamp as everyone else.
One headset is the master. Whatever the master sees is streamed back to the dashboard as a live picture, so the whole room — including students who are waiting their turn — can follow along on the big screen. And the master can also drive the class from inside VR: the student or teacher wearing it gets an in-VR menu with the video list and a "Play All" button, no laptop needed.

The dashboard: master headset view on the left, device list with per-headset controls, global Pause / Stop / Sync. (Screenshot from a demo environment.) [08-screenshot-dashboard-control.png]
Every group goes through the same onboarding before we use VR for anything medical, and it happens in the first lesson of the semester. It takes about twenty minutes and covers four things: how to put the headset on and adjust it so the image is sharp, how to move safely in a room where fifteen other people are standing, the hygiene rules for shared equipment, and what to do if you feel dizzy — take it off, sit down, nobody will mind.
Then comes the first immersive demo: a short walk inside a living cell. One student wears the master headset, the rest watch the mirrored view on the screen, and then they rotate. By the end of the lesson everyone has had the headset on at least once, and by the next lesson the technology is boring — which is exactly what I want. A tool that nobody knows how to use safely is a tool that stays in the box.

First lesson with a new group: one student in the master headset, the rest following on the screen. Everyone rotates before the class ends. [03-onboarding-first-demo.jpg]

What the room sees: the master headset's view, mirrored live on the interactive display. [04-group-watching-master-view.jpg]
Videos are uploaded through the dashboard and land on the server. Anything that is not already an MP4 the headsets can play natively — MKV, MOV, AVI — is transcoded in the background with ffmpeg, and the card shows the progress while it happens. Each video is tagged (cardio, neuro, cancer, repro…) so a colleague can find the right one without asking me, and each one carries two settings the headset needs to render it correctly: the projection (2D flat, 180°, 360°, or the odd half-frame variants some publishers use) and the stereo layout (mono, side-by-side, over-under).
A lot of good medical 360° content lives on YouTube, and YouTube stores 360° video in a cubemap format that a headset player cannot show directly. So the repository also carries a small script that downloads a video and converts it to standard equirectangular, which is what the app expects. Not glamorous, but it is the difference between "we have a great video" and "we can show it on Tuesday".

The video library: tags, projection type, stereo layout and file size on every card. Green dot means the file is ready on the server. [07-screenshot-library.png]
The most important design decision in the whole system is that videos are not streamed to the headsets during class. They are downloaded once, ahead of time, and played from local storage. A 2 GB file streamed to twelve devices over a classroom access point is a guaranteed buffering wheel on at least one of them; the same file already on the device just plays.
The dashboard has a "Download All" for a video and a "Device Management" page that shows what each headset has cached and lets you remove old files. There is also an auto-deploy switch: when it is on, any headset that powers up and connects gets the currently active videos pushed to it automatically. In practice I turn it on the day before a new topic, put the headsets on the charger, and the next morning they are ready.

Device Management: what each headset has downloaded, download progress, and the auto-deploy switch. (Screenshot from a demo environment.) [09-screenshot-device-management.png]

The headsets on the charging shelf at the department. Downloads happen here, the night before. [02-headsets-charging-row.jpg]
A few features exist only because I was standing in the room and needed them.

Inside the headset between videos: the waiting room and the in-VR menu. In master mode the menu gets a golden border and a "Play All" for every card. [10-screenshot-in-vr-menu.png]
The repository is a pnpm monorepo with three applications and two shared packages.
Synchronization is deliberately simple. The server tells every headset to play the same file; from then on, each headset compares its own position with the master's reported position once per second and seeks if it has drifted by more than 100 milliseconds. A "Sync All" from the dashboard sends everyone to the master's timestamp and matches its paused/playing state. For lecture-style content — where the goal is that everyone sees the same organ at the same moment, not frame-locked multiplayer — this is more than enough, and it survives a headset going to sleep and waking up.
The master view on the dashboard is a JPEG stream: the master headset renders its camera to a 960×540 texture, encodes it at ten frames per second, and pushes it over the same WebSocket. It is not pretty up close, but on a room display it is exactly what you need to say "look at the top-left — that is the mitochondrion".

Where most of it happened: Unity on one screen, the dashboard on the other, and the headset on my head more often than I would like to admit. [06-dev-desk-unity.jpg]
The first version had no authentication at all, which was fine in my office and not fine in a building with a few hundred students on the Wi-Fi. The current version has proper accounts with four roles — superadmin, admin, editor, viewer — where an editor can manage the library and a viewer can only run a class. New users join through invite links generated by an admin (no email server to configure), sessions use JWT with refresh tokens, and headsets authenticate with a shared access code that lives in the headset config. Every play, download, master change and login is written to an audit log with the user and the target, so when a video "disappeared" it took one filter to see who had deleted it and when.
Big downloads kill WebSockets. The Unity client downloads a 2 GB file on the main thread, and while it does, it cannot answer the server's ping. With Socket.io's default 20-second timeout the server decided the headset was dead, dropped it, and the dashboard showed it disconnecting in the middle of a download that was, in fact, going fine. The fix was boring — a two-minute ping timeout on the server — but it took an afternoon of staring at the wrong logs to find.
YouTube 360° is not 360° video. The first "360°" file I put on a headset showed six warped squares. YouTube stores immersive video as an equi-angular cubemap; a panoramic player expects equirectangular. Now there is a conversion script in the repo and a note in the upload dialog, and I have not been surprised since.
Optimistic status beats honest status. When the teacher presses Pause, the dashboard used to wait for each headset to confirm before updating the badge. On a busy classroom network that lag was long enough that people pressed Pause twice, which resumed the video. Now the dashboard updates the badge immediately and corrects itself later if the headset disagrees. It looks faster and, more importantly, nobody double-clicks.
Headsets do not have names. Twelve devices called "Quest 3" is not a list, it is a puzzle. The client now sends a device name that can be set per headset, and the ping button exists for the days when the names have not been set.
A student who has walked through a coronary artery in three dimensions does not forget where the left anterior descending branch is. That is not a claim about VR in general — it is what I see in the questions students ask after a session compared with the questions they ask after a slide. The technology to do this has been affordable for a while. What was missing in our department was not a headset or a video, but the twenty-minute onboarding, the one-click "Play All", and the confidence that on Tuesday at 8:00 the twelve headsets will do the same thing at the same time.

Six headsets, one cell, one Play button. [05-selfie-cell-on-screen.jpg]
Our Best Insights
Want to know what’s trending in the tech world? Our articles break it all down - quickly and clearly.
November 4th, 2024
AI and ML are at the forefront of healthcare transformation—automating tasks, unlocking insights from data, and enabling next-gen treatment breakthroughs.
October 3rd, 2024
From clinics to enterprise systems, digital transformation is making healthcare software more accessible, efficient, and patient-focused.