{"id":23949698,"url":"https://github.com/liaplayground/crosslab-and-friends","last_synced_at":"2026-01-30T05:32:42.643Z","repository":{"id":264678521,"uuid":"894024833","full_name":"LiaPlayground/CrossLab-and-Friends","owner":"LiaPlayground","description":"Presentation of the edrys-Lite remoteLab system in Dortmund 2024 ","archived":false,"fork":false,"pushed_at":"2024-11-28T08:24:56.000Z","size":17669,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-06T13:45:04.669Z","etag":null,"topics":["edrys","edrys-lite","liascript","liascript-course","oer","remote-lab"],"latest_commit_sha":null,"homepage":"https://liascript.github.io/course/?https://github.com/LiaPlayground/CrossLab-and-Friends/raw/refs/heads/main/README.md","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LiaPlayground.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-25T16:08:09.000Z","updated_at":"2024-11-28T08:25:00.000Z","dependencies_parsed_at":"2025-02-24T08:42:56.063Z","dependency_job_id":"cba93900-1e50-40f8-8e88-9132f31c3598","html_url":"https://github.com/LiaPlayground/CrossLab-and-Friends","commit_stats":null,"previous_names":["liaplayground/crosslab-and-friends"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/LiaPlayground/CrossLab-and-Friends","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiaPlayground%2FCrossLab-and-Friends","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiaPlayground%2FCrossLab-and-Friends/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiaPlayground%2FCrossLab-and-Friends/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiaPlayground%2FCrossLab-and-Friends/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LiaPlayground","download_url":"https://codeload.github.com/LiaPlayground/CrossLab-and-Friends/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiaPlayground%2FCrossLab-and-Friends/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28905979,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T04:02:34.702Z","status":"ssl_error","status_checked_at":"2026-01-30T04:02:33.562Z","response_time":66,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["edrys","edrys-lite","liascript","liascript-course","oer","remote-lab"],"created_at":"2025-01-06T11:49:53.275Z","updated_at":"2026-01-30T05:32:42.622Z","avatar_url":"https://github.com/LiaPlayground.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\nauthor:   André Dietrich; Sebastian Zug\n\nemail:    andre.dietrich@informatik.tu-bergakademie.de\n\nicon:     img/icon.png\nlogo:     img/logo.png\n\nversion:  0.0.1\n\nlanguage: en\n\nnarrator: US English Female\n\ncomment:  This presentation introduces **Edrys**, a browser-based remote lab platform designed to enable seamless collaboration in educational and experimental environments. It highlights the core technologies powering Edrys: modular components for flexible lab setups, WebRTC for secure, server-light communication, and CRDTs for consistent state synchronization across users. Attendees will learn how to create and customize virtual classrooms, explore the decentralized nature of the platform, and understand how Edrys's API enables developers to integrate and extend its functionality. By combining accessibility, scalability, and innovation, Edrys transforms the way remote labs and classrooms operate.\n\nimport: https://raw.githubusercontent.com/LiaScript/CodeRunner/master/README.md\n\n--\u003e\n\n# CrossLab and Friends: Edrys-Lite\n\nOpen the interactive presentation at:\n\nhttps://LiaScript.github.io/course/?https://github.com/LiaPlayground/CrossLab-and-Friends/raw/refs/heads/main/README.md\n\nGitHub: https://github.com/LiaPlayground/CrossLab-and-Friends\n\n---\n\n\u003ccenter\u003e\n\n[qr-code](https://LiaScript.github.io/course/?https://github.com/LiaPlayground/CrossLab-and-Friends/raw/refs/heads/main/README.md)\n\n\u003c/center\u003e\n\n## Welcome in 10 Languages\n\n__ADA__\n\n```ada\nwith Ada.Text_IO; use Ada.Text_IO;\nprocedure Main is\nbegin\n   Put_Line (\"Hello CrossLab \u0026 Friends 2024!\\n\");\nend Main;\n```\n@LIA.ada\n\n---\n\n__APL__\n\n```apl\n⎕←'Hello CrossLab \u0026 Friends 2024!'\n```\n@LIA.apl\n\n---\n\n__Assembly__\n\n``` asm\n          global    _start\n\n          section   .text\n_start:   mov       rax, 1                  ; system call for write\n          mov       rdi, 1                  ; file handle 1 is stdout\n          mov       rsi, message            ; address of string to output\n          mov       rdx, 30                 ; number of bytes\n          syscall                           ; invoke operating system to do the write\n          mov       rax, 60                 ; system call for exit\n          xor       rdi, rdi                ; exit code 0\n          syscall                           ; invoke operating system to exit\n\n          section   .data\nmessage:  db        \"Hello CrossLab \u0026 Friends 2024!\", 10      ; note the newline at the end\n```\n@LIA.nasm\n\n---\n\n__C__\n\n```c\n#include \u003cstdio.h\u003e\n\nint main (void){\n  printf (\"Hello CrossLab \u0026 Friends 2024!\\n\");\n\n\treturn 0;\n}\n```\n@LIA.c\n\n---\n\n__COBOL__\n\n```cobol\n       IDENTIFICATION DIVISION.\n       PROGRAM-ID. HelloWorld.\n\n       ENVIRONMENT DIVISION.\n\n       DATA DIVISION.\n\n       PROCEDURE DIVISION.\n           DISPLAY \"Hello CrossLab \u0026 Friends 2024!\".\n           STOP RUN.\n```\n@LIA.cobol\n\n---\n\n``` clojure\n(ns clojure.examples.hello\n   (:gen-class))\n(defn hello-world []\n   (println \"Hello CrossLab \u0026 Friends 2024!\"))\n(hello-world)\n```\n@LIA.clojure\n\n\n---\n\n__Python__\n\n```python\nprint(\"Hello CrossLab \u0026 Friends 2024!\")\n```\n@LIA.python\n\n\n---\n\n__Fortran__\n\n```fortran\nprogram hello\n  print *, \"Hello CrossLab \u0026 Friends 2024!\"\nend program hello\n```\n@LIA.fortran\n\n---\n\n__Go__\n\n``` go\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n  fmt.Println(\"Hello CrossLab \u0026 Friends 2024!\")\n}\n```\n@LIA.go\n\n---\n\n__Java__\n\n``` java\nimport java.io.*;\nclass Hello {\n  public static void main(String args[])\n  throws IOException\n  {\n    System.out.println(\"Hello CrossLab \u0026 Friends 2024!\");\n  }\n}\n```\n@LIA.java(Hello)\n\n## Technologies \u0026 Concept\n\n    --{{0}}--\nThe **Edry-Lite** combines three innovative elements to create a simple and effective browser-based learning environment:\n\nProject WebSite: https://edrys-labs.github.io\n\n{{1}} **Flexible Building Blocks**:\n\n    --{{1}}--\nThe lab uses interchangeable tools like text editors, webcams, and terminals, which can be mixed and matched to suit any lesson or experiment.\n\n{{2}} **Direct Browser Communication**:\n\n    --{{2}}--\nBy connecting browsers directly, users can collaborate in real time without heavy reliance on servers, making the system lightweight and accessible.\n\n{{3}} **Seamless Collaboration**:\n\n    --{{3}}--\nA smart method keeps everyone’s changes in sync, so no matter how or when updates happen, all users stay with the same state.\n\n    --{{4}}--\nThese technologies work together to create an efficient, decentralized, and user-friendly platform for remote labs and classrooms.\n\n### Modularity \u0026 Composability\n\n    --{{0}}--\nA **module** is a self-contained, configurable, and reusable component designed for a specific purpose.\nExamples include an editor, a terminal, a markdown viewer, a webcam interface, or any other tool you might need.\nThese modules are designed to be easy to integrate and customize.  \nExplore a list of available modules here:  \n\nhttps://github.com/topics/edrys-module?q=edrys-lite\n\n    --{{1}}--\nIn this context, a **classroom** or **lab configuration** is simply a collection of pre-configured modules, combined with meta information.\nThese configurations can be easily shared, adapted, and reused, enabling a seamless collaborative experience.\n\n      {{1}}\n![Classroom Setup](img/setup.png)\n\n    --{{2}}--\nPut simply, lab configurations can be treated as **Open Educational Resources (OER)** and **Open Source** projects.\nThis means they can be freely hosted, shared, and even improved upon.\nFor example, check out this curated collection of open lab configurations:\n\nhttps://github.com/topics/edrys-lab\n\nHere’s a refined version of your text, correcting errors, improving readability, and making it accessible to a non-technical audience while retaining technical depth:\n\n### WebRTC - Communication\n\n    --{{0}}--\nTo connect users within a lab environment, we rely on **WebRTC**, which stands for **Web Real-Time Communication**.\nWebRTC allows browsers to communicate directly and securely without requiring a dedicated server.\nA server is only needed for the initial connection setup or as a fallback if network configurations are too restrictive.\n\n     {{0-1}}\n![WebRTC Schema](https://upload.wikimedia.org/wikipedia/commons/2/23/WebRTC_%2813969736553%29.jpg \"**'WebRTC' by Steffen Voß, licensed under CC BY 2.0.**\\\nAvailable at: https://commons.wikimedia.org/wiki/File:WebRTC_%2813969736553%29.jpg\")\n\n    --{{1}}--\nTo establish these connections, we leverage the **WebTorrent network**.\nWhile WebTorrent is commonly known for enabling peer-to-peer file sharing between browsers, we use it solely as a meeting point to initiate communication.\nThis makes the process lightweight, decentralized, and efficient.\n\n      {{1}}\n![WebTorrent Schema](https://camo.githubusercontent.com/ad3fe62845574fe458a186fe76055198fc2d896fc5f50241c7993403e21f9a86/68747470733a2f2f776562746f7272656e742e696f2f696d672f6e6574776f726b2e706e67 \"Taken from the official GitHub repository at https://github.com/webtorrent/webtorrent?tab=readme-ov-file\")\n\n### CRDTs \u0026 State\n\n    --{{0}}--\nThe final key technology required is used to maintain **state** in a distributed system.\nIn the absence of a central authority, ensuring consistency between users in a collaborative environment becomes a critical challenge.\nThis is where **CRDTs** (Conflict-free Replicated Data Types) come into play.\nCRDTs allow systems to maintain consistency by enabling operations to be replicated across multiple nodes without conflicts.\nIn theory, even if updates are made offline or in different orders, CRDTs ensure that all users eventually converge to the same state, thanks to their mathematically proven properties.\n\n![Operation-based replication](img/crdt.png \"Operation-based replication as described in[^1]\")\n\n[^1]: Marc Shapiro, Nuno Preguiça, Carlos Baquero, Marek Zawirski.  \n      A comprehensive study of Convergent and Commutative Replicated Data Types.  \n      [Research Report] RR-7506, Inria – Centre Paris-Rocquencourt; INRIA. 2011, pp.50. inria-00555588  \n      [Read the full study](https://inria.hal.science/inria-00555588/document)\n\n## Creating Labs\n\n    --{{0}}--\nTo start, visit the **Edrys Labs** project website and create a new classroom:  \n\nhttps://edrys-labs.github.io\n\n    --{{1}}--\nBy doing this, you’ve essentially created a global chatroom with a unique ID and a default configuration.\nThis initial setup includes a basic reference module you can use to explore and test various features.\nAs the maintainer, you control this classroom—you can reconfigure it, add modules, and share it as you see fit.\n\n      {{1}}\n!?[Screencast edrys](video/edrys-demo.mp4)\n\n### What Really Happens\n\n    --{{0}}--\nThe entire system, including the lab configuration, user details, chat, and room state, operates as a fully distributed network. All users share the same synchronized state. Every small change—like switching rooms, sending a chat message, updating the configuration, or modifying a module—is communicated to all connected peers in real time.  \n\n![Peer-to-peer schema of Edrys-Lite](img/peer2peer.jpg)\n\n    --{{1}}--\nTo simplify this, the system uses an **operation-based CRDT** (Conflict-free Replicated Data Type) powered by **Yjs**.\nWhen a new peer joins, the current state is transmitted, and afterward, only incremental changes are shared.\n\n      {{1}}\nhttps://yjs.dev\n\n### Developer Happiness - API\n\n    --{{0}}--\nEach module in edrys-Lite is embedded securely as an **iframe**, isolating it from the rest of the system to ensure safety and control.\nThe iframe can interact with the Edrys system using a simple API by importing the following script:\n\nhttps://edrys-labs.github.io/module/edrys.js\n\n    --{{1}}--\nModules can communicate with each other using just two functions. Messages are restricted to users in the same room:\n\n      {{1}}\n```javascript\n// Send a message to a specific topic\nEdrys.sendMessage(\"topic\", { arbitrary: \"data\" })\n\n// Listen for incoming messages\nEdrys.onMessage(({ from, topic, body }) =\u003e {\n    console.log(\"Received message:\", topic, body, \"from:\", from)\n})\n```\n\n    --{{2}}--\nEvery room maintains its own lightweight CRDT, ensuring changes are synchronized across all users and modules.\nThe state can be updated either externally or directly within a module.\nUsing **Yjs** for state management allows seamless nesting of Yjs-compatible data structures or basic values.\n\n      {{2}}\n```javascript\n// Access a shared text state\nconst text = Edrys.getState(\"name\", \"Text\")\ntext.insert(0, \"Hello World\")\n\n// Initialize a shared value with a default\nconst value = Edrys.getState(\"somethingElse\", \"Value\", 12)\n\n// Perform multiple state changes in a single transaction\nEdrys.updateState(() =\u003e {\n    // Batch changes here\n    ...\n})\n```\n\n    --{{3}}--\nThe API also provides functions for managing user roles, accessing configurations, and subscribing to updates. These tools allow developers to create flexible and interactive modules for use in Edrys classrooms.\n\n## Testimonials\n\n\u003e #### RemoteLabs as OER – The next evolutionary step - **U:FF 2024**\n\u003e\n\u003e !?[YouTube: Presentation](https://www.youtube.com/watch?v=Uv79Y8EhBVw)\n\n---\n\n\u003e #### Expanding the Concept of Open Educational Resources to Remote-Labs - **eLearning Africa 2024**\n\u003e\n\u003e !?[YouTube: Discovery Demo](https://www.youtube.com/watch?v=Lri9IQBPJLU)\n\n---\n\n\u003e #### Transforming Education: A Journey from Interactive Markdown to Remote-Labs - **WeAreDevelopers 2024**\n\u003e\n\u003e !?[YouTube: Virtual Presentation](https://www.youtube.com/watch?v=DRz3rMr6OIM)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliaplayground%2Fcrosslab-and-friends","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliaplayground%2Fcrosslab-and-friends","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliaplayground%2Fcrosslab-and-friends/lists"}