diff --git a/index.html b/index.html
index a721403..de1648d 100644
--- a/index.html
+++ b/index.html
@@ -1303,7 +1303,7 @@ button.sidebar-toggle{
{"created":"20230427204906096","text":"comma-separated coordinates e.g. which after parsing can be accessed using `.x`, `.y`, `.z` etc.\n\n| type | example |\n|-|-|\n| vector2 | `1.2,3` or `0.4,0.6` | \n| vector3 | `1.2,3,4` or `0.4,0.6,5` | \n\nhere are some interactive examples:\n\n\u003Cdiv>\n \u003Ctextarea spellcheck=\"false\" autofocus class=\"sandboxify\">frags = {}\nok = xrfragment.Parser.parse('pos','1.2,2,3',frags)\nconsole.log( frags.pos.z )\n\n\u003C/textarea>\n\t\u003Cpre class=\"result\">\u003C/pre>\n\u003C/div>\n","tags":"","title":"vector","modified":"20230427205327718","type":"text/markdown"},
{"created":"20250904105246150","text":"> **NOTE**: a subtitle-file allows for hasslefree [XR movies](#XR%20Movies) optimized for accessibility (screenreader, text-to-speech)\n\nSubtitle files must be provided as [sidecar-files](#📜%20level0:%20File) either in:\n\n* standard SRT format (with the header renamed to WEBVTT, and `.srt` to `.vtt`)\n* WebVTT format (`.vtt`), in which case only the SRT-equivalent subset of features will be processed. Specifically, the parser recognizes plain cue blocks consisting of an optional identifier, a start --> end timestamp line, and unstyled text. Any additional WebVTT features such as styling, positioning, regions, notes, or metadata will be ignored.\n\n## Example .vtt file\n\n```\nWEBVTT\n\n1\n00:00:01.000 --> 00:00:04.000\nHello, world!\n\n2\n00:00:05.000 --> 00:00:07.000\nThis is an example subtitle.\n```\n\n","tags":"","title":"WebVTT subtitles","modified":"20250904105904428","type":"text/markdown"},
{"created":"20230427103350051","text":"","tags":"","title":"WebXR","modified":"20230427103400217"},
-{"created":"20230424092557827","text":"\u003Cb>Hyperlink the 3D world\u003C/b>.\u003Cbr>\nA standard for (deep)linking 3D files.\u003Cbr>\n''Turn'' 3D files ''into'' local-first, interactive, accessible \u003Ca href=\"#XR%Movies\">XR movies\u003C/a> & 3D websites.\n\u003Cbr>\u003Cbr>\n\n\u003Cdiv style=\"max-width:800px;box-shadow:none\" class=\"border\">\n\u003C$videojs _autoplay controls=\"controls\" aspectratio=\"16:9\" preload=\"auto\" poster=\"\" fluid=\"fluid\" class=\"vjs-big-play-centered\">\n \u003Csource src=\"https://coderofsalvation.codeberg.page/xrfragment.media/hyperlinking-the-3d-world.mp4\" type=\"video/mp4\"/>\n\u003C/$videojs>\n\u003C/div>\n\n\u003Cbr>\nEmpower existing 3D\n\u003Cu tabindex=\"0\">fileformats\n \u003Cspan>like \u003Cb>glTF\u003C/b>, \u003Cb>usdz\u003C/b>, \u003Cb>obj\u003C/b>, \u003Cb>collada\u003C/b> which are used in websites, Game Engines, and like \u003Ca href=\"#Edit%20a%203D%20scene%20file\">3D editors\u003C/a>.\u003Cbr>XR Fragments makes 3D files interactive \u003C/span>\n\u003C/u> via \n\u003Cu tabindex=\"0\">URLS\n \u003Cspan>, using any \n \u003Cu tabindex=\"0\">protocol\n \u003Cspan>, not necessarily served via HTTP, but also \u003Ca href=\"https://ipfs.com\" target=\"_blank\">IPFS\u003C/a>, \u003Ca href=\"https://hypercore-protocol.github.io/new-website/guides/getting-started/\" target=\"_blank\">hypercore\u003C/a>, \u003Ca href=\"https://github.com/webtorrent/webtorrent\" target=\"_blank\">webtorrent\u003C/a> e.g\u003C/span>\n\t \u003C/u>\n\t\u003C/span>\n\u003C/u>.\nThis allows spatial\n \u003Cu tabindex=\"0\">interactions \n\t \u003Cspan>, like browser-navigation, teleportation, importing scenes, spatial hypermedia, allowing useful audiovisual immersive\u003C/span>\n\t\t\u003Cu tabindex=\"0\">experiences\n\t\t \u003Cspan>like e-learnings, quiz, realtime-rendered 3D movies, and audiovisual storytelling\u003C/span>\n\t\t\u003C/u>\n\t\u003C/u>\nvia 3D \n\u003Cu tabindex=\"0\">metadata\n \u003Cspan>, so called 'extras' embedded in 3D files ('custom properties' in \u003Ca href=\"https://blender.org\" target=\"_blank\">Blender\u003C/a>)\u003C/span>\n\u003C/u>\nand promote URI's and \n\u003Cu tabindex=\"0\">Local-First\n \u003Cspan> data, which lives local, and ideally only syncs/shares elsewhere via ''open user-operated internet'' protocols.\u003C/span>\n\u003C/u>\n.\n\n\n\u003Cdiv style=\"text-align:center\">\n\u003Cb style=\"font-size:11px\">~10 mins podcast introduction\u003C/b>\u003Cbr>\n\u003Caudio controls src=\"https://coderofsalvation.codeberg.page/xrfragment.media/podcast-xrfragments-intro.mp3\" type=\"audio/mpeg\">\n\u003C/audio>\n\u003C/div>\n\u003Cbr>\nAvoid \u003Cb>cloud lock-in\u003C/b>, and make your 3D experiences \u003Cb>outlast\u003C/b> current technologies.\n\n\u003Cdiv style=\"display:inline-block; padding:0px 20px; border-radius:5px 5px 0px 0px; border:2px solid #555;background: #ededed;font-weight: bold;font-size: 16px;border-bottom: none;\">website.glb#scene1\u003C/div>\n\u003Ca href=\"/example/aframe/sandbox?./../../assets/website.glb\" target=\"_blank\">\n \u003Cimg src=\"https://coderofsalvation.codeberg.page/xrfragment.media/images/website.glb.jpg\" style=\"border-left: 2px solid #555; cursor:pointer\">\n\u003C/a>\n\u003Ccenter>\n \u003Ca class=\"btn\" href=\"/example/aframe/sandbox?./../../assets/website.glb\" target=\"_blank\" style=\"padding:10px 30px\">Try 3D file\u003C/a>\n\u003C/center>\n\n\u003Cbr>\n\u003Cdiv style=\"max-width:800px;box-shadow:none\" class=\"border\">\n\u003C$videojs _autoplay controls=\"controls\" aspectratio=\"16:9\" preload=\"auto\" poster=\"\" fluid=\"fluid\" class=\"vjs-big-play-centered\">\n \u003Csource src=\"https://coderofsalvation.codeberg.page/xrfragment.media/showreel_2024.mp4\" type=\"video/mp4\"/>\n\u003C/$videojs>\n\u003C/div>\n\n\u003Cdiv>#spatialweb #openinternet #interoperable #accessibility #3Dhypermedia\u003C/div>\n\u003Ccenter>\n \u003Ca class=\"btn\" href=\"https://matrix.to/#/#xrfragments:matrix.org\" target=\"_blank\" style=\"padding:10px 30px\">Join Matrix Community\u003C/a>\n\u003C/center>\n\u003Cbr>\n\n\u003Ctable style=\"border:none\">\n \u003Ctr>\n\t \u003Ctd style=\"border:none;vertical-align:top; width:49%\">\n\t\t\t\u003Cb>🎨 no-code design-first\u003C/b>\u003Cbr/>\n\t\t\t\u003Cb>🏄 surf 3D scenes in AR/VR\u003C/b>\u003Cbr/>\n\t \u003Cb>📎 embeddable\u003C/b>\u003Cbr/>\n\t\t\t\u003Cb>🤝 interoperable\u003C/b>\u003Cbr/>\n\t\t\t\u003Cb>⛔ network-agnostic, local-first\u003C/b>\u003Cbr/>\n \u003Cb>💾 compatible with glTF FBX USDZ OBJ and more\u003C/b>\u003Cbr/>\t\t\t\t\t\n\t\t\u003C/td>\n\t\t\u003Ctd style=\"border:none;vertical-align:top\">\n\t\t\t\u003Cb>🔮 99% compatible with \u003Cb>future fileformats\u003C/b>\u003C/b>\u003Cbr/>\n \u003Cb>🌱 friendly to opensource & corporations\u003C/b>\u003Cbr/>\n\t\t\t\u003Cb>❤️ \u003Cb>no\u003C/b> fileformat or editor lock-in\u003C/b>\u003Cbr/>\n\t\t\t\u003Cb>🧑🌾 solo-user read-only 3D content\u003C/b>\u003Cbr/>\n\t\t\u003C/td>\n\t\u003C/tr>\n\u003C/table>\n\u003Cbr>\n\n\u003Ch2>Made for 3D designers\u003C/h2>\n[img[xrfragment.jpg]]\n\u003Cbr>\u003CBr>\n\n\n\u003C\u003C\u003C\nSee [[How it works]]\n\u003C\u003C\u003C\n\n\n\u003Ch2>TLDR\u003C/h2>\n\nThe \u003Cb>TLDR\u003C/b> of processing 3D files with XR Fragments [pseudocode]:\n\u003Cbr>\u003Cbr>\n\u003Cdiv>\n \u003Ctextarea spellcheck=\"false\" class=\"sandboxify noresult\" style=\"min-height:190px;width:100%;max-width:800px;\">foreach object in scene:\n if object.extra.href:\n\t object.onClick = updateCameraFromURL(object.extra.href, camera, timeline)\n \nif changed(app.URL):\n camera.updateCameraFromURL(app.URL)\n \t\ndocument.location.href = 'my.org/foo.glb#roomC'\n\n\u003C/textarea>\n\u003C/div> \n\u003Cbr>\n\u003Ch2>Virtual worlds without lock-in\u003C/h2>\n\nScale beyond companies, appstores, network protocols and file-formats:\n\n\u003Cdiv style=\"max-width:600px;box-shadow:none;padding:15px\" class=\"border\">\n\u003C$videojs _autoplay controls=\"controls\" aspectratio=\"16:9\" preload=\"auto\" poster=\"\" fluid=\"fluid\" class=\"vjs-big-play-centered\">\n \u003Csource src=\"https://coderofsalvation.codeberg.page/xrfragment.media/xrfragment.bumper2.mp4\" type=\"video/mp4\"/>\n\u003C/$videojs>\n\u003C/div>\n\u003Cbr>\n\n\u003Ch3>Virtual worlds connected via URLs\u003C/h3>\n\n[img[urls.svg]]\n\n\u003Cbr>\n\nXR Fragments is a spec to link 3D models into a basic interactive XR experience.\u003Cbr>\nThink of it as bundling virtual worlds into a \u003Cb>spatial book\u003C/b>.\u003Cbr>\n\u003Cb>Basically:\u003C/b> 3D hypermedia files (the middle greenzone below).\u003Cbr>\n\u003Cbr>\u003Cbr>\n\u003Cdiv style=\"width:100%;max-width:900px;border-radius:15px;box-shadow:none;padding:20px\" class=\"border\">\n[img[xrfsweetspot.jpg]]\n\u003C/div>\n\u003Cbr>\u003Cbr>\nXR Fragments \u003Cb>empowers designers\u003C/b> to embed \u003Cb>simple interactions & navigation\u003C/b> inside a \u003Cb>3D file\u003C/b>.\u003Cbr>\nThis \u003Cb>no longer\u003C/b> requires developers to implement trivial interactive stuff.\u003Cbr>\nIt promotes \u003Cb>design-first, secure, durable and interoperable\u003C/b> XR experiences from \u003Cb>3D models\u003C/b>, basically 3D hypermedia, mitigating \u003Cb>handcoded-XR-apps-as-3D-content-burial-sites\u003C/b>.\u003Cbr>\n\u003Cbr>\n\u003Ch2>Why focus on designers and 3D files?\u003C/h2>\n\u003Cbr>\n\u003Cquote>\u003Ci>\"Future 3D file formats commoditize yesterdays 3D engines\"\u003C/i> ~ Leon van Kammen\u003C/quote>\n\u003Cbr>\u003Cbr>\nDevelopers tend to fall in love with \u003Cb>specific shiny\u003C/b> 3D technologies, which typically \u003Cb>buries\u003C/b> 3D content inside them.\u003Cbr>\nThese however, still lack \u003Cb>addressibility\u003C/b> and \u003Cb>interoperability\u003C/b> unlike \u003Cb>3D Models\u003C/b>, which can use XR Fragments \u003Cb>URLs\u003C/b> as a basic primitive.\n\u003Cbr>\u003Cbr>\n\u003Ch2>Getting Started\u003C/h2>\n\nJust get your hands on a 3D editor and follow the steps in the video:\n\u003Cbr>\u003Cbr>\n\u003Cdiv style=\"max-width:600px\">\n\u003C$videojs controls=\"controls\" aspectratio=\"16:9\" preload=\"auto\" poster=\"\" fluid=\"fluid\" class=\"vjs-big-play-centered\">\n \u003Csource src=\"https://coderofsalvation.codeberg.page/xrfragment.media/gettingstarted2024.mp4\" type=\"video/mp4\"/>\n\u003C/$videojs>\n\u003C/div>\n\u003Cbr>\u003CBr>\nCheck [[How it works|How it works]], or \u003Ca href=\"example/aframe/sandbox\" target=\"_blank\">view a \u003Cb>demo.glb\u003C/b> scene right now\u003C/a>, or see the menu in the left corner for more.\n\u003Cbr>\u003Cbr>\n\u003Ch2>Presentation\u003C/h2>\n\u003Cbr>\n\u003Ciframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/bfxqm1q_GXw?start=1445\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen>\u003C/iframe>\n\n\u003C!-- persist telescopic unfolds -->\n\u003C\u003Cscript>>\n\u003Cscript>\n([...document.querySelectorAll('u')]).map( (u) => {\n u.addEventListener('click', e => e.target.className = 'show' )\n});\n\u003C/script>\n\u003C\u003Cscript 0>>\n","tags":"Home","title":"XR Fragments","modified":"20250925102926494","list-before":"How it works"},
+{"created":"20230424092557827","text":"\u003Cb>Hyperlink the 3D world\u003C/b>.\u003Cbr>\nA standard for (deep)linking 3D files.\u003Cbr>\n''Turn'' 3D files ''into'' local-first, interactive, accessible \u003Ca href=\"#XR%Movies\">XR movies\u003C/a>,\u003Cbr>E-learnings & 3D websites.\n\u003Cbr>\u003Cbr>\n\n\u003Cdiv style=\"max-width:800px;box-shadow:none\" class=\"border\">\n\u003C$videojs _autoplay controls=\"controls\" aspectratio=\"16:9\" preload=\"auto\" poster=\"\" fluid=\"fluid\" class=\"vjs-big-play-centered\">\n \u003Csource src=\"https://coderofsalvation.codeberg.page/xrfragment.media/hyperlinking-the-3d-world.mp4\" type=\"video/mp4\"/>\n\u003C/$videojs>\n\u003C/div>\n\n\u003Cbr>\nEmpower existing 3D\n\u003Cu tabindex=\"0\">fileformats\n \u003Cspan>like \u003Cb>glTF\u003C/b>, \u003Cb>usdz\u003C/b>, \u003Cb>obj\u003C/b>, \u003Cb>collada\u003C/b> which are used in websites, Game Engines, and like \u003Ca href=\"#Edit%20a%203D%20scene%20file\">3D editors\u003C/a>.\u003Cbr>XR Fragments makes 3D files interactive \u003C/span>\n\u003C/u> via \n\u003Cu tabindex=\"0\">URLS\n \u003Cspan>, using any \n \u003Cu tabindex=\"0\">protocol\n \u003Cspan>, not necessarily served via HTTP, but also \u003Ca href=\"https://ipfs.com\" target=\"_blank\">IPFS\u003C/a>, \u003Ca href=\"https://hypercore-protocol.github.io/new-website/guides/getting-started/\" target=\"_blank\">hypercore\u003C/a>, \u003Ca href=\"https://github.com/webtorrent/webtorrent\" target=\"_blank\">webtorrent\u003C/a> e.g\u003C/span>\n\t \u003C/u>\n\t\u003C/span>\n\u003C/u>.\nThis allows spatial\n \u003Cu tabindex=\"0\">interactions \n\t \u003Cspan>, like browser-navigation, teleportation, importing scenes, spatial hypermedia, allowing useful audiovisual immersive\u003C/span>\n\t\t\u003Cu tabindex=\"0\">experiences\n\t\t \u003Cspan>like e-learnings, quiz, realtime-rendered 3D movies, and audiovisual storytelling\u003C/span>\n\t\t\u003C/u>\n\t\u003C/u>\nvia 3D \n\u003Cu tabindex=\"0\">metadata\n \u003Cspan>, so called 'extras' embedded in 3D files ('custom properties' in \u003Ca href=\"https://blender.org\" target=\"_blank\">Blender\u003C/a>)\u003C/span>\n\u003C/u>\nand promote URI's and \n\u003Cu tabindex=\"0\">Local-First\n \u003Cspan> data, which lives local, and ideally only syncs/shares elsewhere via ''open user-operated internet'' protocols.\u003C/span>\n\u003C/u>\n.\n\n\n\u003Cdiv style=\"text-align:center\">\n\u003Cb style=\"font-size:11px\">~10 mins podcast introduction\u003C/b>\u003Cbr>\n\u003Caudio controls src=\"https://coderofsalvation.codeberg.page/xrfragment.media/podcast-xrfragments-intro.mp3\" type=\"audio/mpeg\">\n\u003C/audio>\n\u003C/div>\n\u003Cbr>\nAvoid \u003Cb>cloud lock-in\u003C/b>, and make your 3D experiences \u003Cb>outlast\u003C/b> current technologies.\n\n\u003Cdiv style=\"display:inline-block; padding:0px 20px; border-radius:5px 5px 0px 0px; border:2px solid #555;background: #ededed;font-weight: bold;font-size: 16px;border-bottom: none;\">website.glb#scene1\u003C/div>\n\u003Ca href=\"/example/aframe/sandbox?./../../assets/website.glb\" target=\"_blank\">\n \u003Cimg src=\"https://coderofsalvation.codeberg.page/xrfragment.media/images/website.glb.jpg\" style=\"border-left: 2px solid #555; cursor:pointer\">\n\u003C/a>\n\u003Ccenter>\n \u003Ca class=\"btn\" href=\"/example/aframe/sandbox?./../../assets/website.glb\" target=\"_blank\" style=\"padding:10px 30px\">Try 3D file\u003C/a>\n\u003C/center>\n\n\u003Cbr>\n\u003Cdiv style=\"max-width:800px;box-shadow:none\" class=\"border\">\n\u003C$videojs _autoplay controls=\"controls\" aspectratio=\"16:9\" preload=\"auto\" poster=\"\" fluid=\"fluid\" class=\"vjs-big-play-centered\">\n \u003Csource src=\"https://coderofsalvation.codeberg.page/xrfragment.media/showreel_2024.mp4\" type=\"video/mp4\"/>\n\u003C/$videojs>\n\u003C/div>\n\n\u003Cdiv>#spatialweb #openinternet #interoperable #accessibility #3Dhypermedia\u003C/div>\n\u003Ccenter>\n \u003Ca class=\"btn\" href=\"https://matrix.to/#/#xrfragments:matrix.org\" target=\"_blank\" style=\"padding:10px 30px\">Join Matrix Community\u003C/a>\n\u003C/center>\n\u003Cbr>\n\n\u003Ctable style=\"border:none\">\n \u003Ctr>\n\t \u003Ctd style=\"border:none;vertical-align:top; width:49%\">\n\t\t\t\u003Cb>🎨 no-code design-first\u003C/b>\u003Cbr/>\n\t\t\t\u003Cb>🏄 surf 3D scenes in AR/VR\u003C/b>\u003Cbr/>\n\t \u003Cb>📎 embeddable\u003C/b>\u003Cbr/>\n\t\t\t\u003Cb>🤝 interoperable\u003C/b>\u003Cbr/>\n\t\t\t\u003Cb>⛔ network-agnostic, local-first\u003C/b>\u003Cbr/>\n \u003Cb>💾 compatible with glTF FBX USDZ OBJ and more\u003C/b>\u003Cbr/>\t\t\t\t\t\n\t\t\u003C/td>\n\t\t\u003Ctd style=\"border:none;vertical-align:top\">\n\t\t\t\u003Cb>🔮 99% compatible with \u003Cb>future fileformats\u003C/b>\u003C/b>\u003Cbr/>\n \u003Cb>🌱 friendly to opensource & corporations\u003C/b>\u003Cbr/>\n\t\t\t\u003Cb>❤️ \u003Cb>no\u003C/b> fileformat or editor lock-in\u003C/b>\u003Cbr/>\n\t\t\t\u003Cb>🧑🌾 solo-user read-only 3D content\u003C/b>\u003Cbr/>\n\t\t\u003C/td>\n\t\u003C/tr>\n\u003C/table>\n\u003Cbr>\n\n\u003Ch2>Made for 3D designers\u003C/h2>\n[img[xrfragment.jpg]]\n\u003Cbr>\u003CBr>\n\n\n\u003C\u003C\u003C\nSee [[How it works]]\n\u003C\u003C\u003C\n\n\n\u003Ch2>TLDR\u003C/h2>\n\nThe \u003Cb>TLDR\u003C/b> of processing 3D files with XR Fragments [pseudocode]:\n\u003Cbr>\u003Cbr>\n\u003Cdiv>\n \u003Ctextarea spellcheck=\"false\" class=\"sandboxify noresult\" style=\"min-height:190px;width:100%;max-width:800px;\">foreach object in scene:\n if object.extra.href:\n\t object.onClick = updateCameraFromURL(object.extra.href, camera, timeline)\n \nif changed(app.URL):\n camera.updateCameraFromURL(app.URL)\n \t\ndocument.location.href = 'my.org/foo.glb#roomC'\n\n\u003C/textarea>\n\u003C/div> \n\u003Cbr>\n\u003Ch2>Virtual worlds without lock-in\u003C/h2>\n\nScale beyond companies, appstores, network protocols and file-formats:\n\n\u003Cdiv style=\"max-width:600px;box-shadow:none;padding:15px\" class=\"border\">\n\u003C$videojs _autoplay controls=\"controls\" aspectratio=\"16:9\" preload=\"auto\" poster=\"\" fluid=\"fluid\" class=\"vjs-big-play-centered\">\n \u003Csource src=\"https://coderofsalvation.codeberg.page/xrfragment.media/xrfragment.bumper2.mp4\" type=\"video/mp4\"/>\n\u003C/$videojs>\n\u003C/div>\n\u003Cbr>\n\n\u003Ch3>Virtual worlds connected via URLs\u003C/h3>\n\n[img[urls.svg]]\n\n\u003Cbr>\n\nXR Fragments is a spec to link 3D models into a basic interactive XR experience.\u003Cbr>\nThink of it as bundling virtual worlds into a \u003Cb>spatial book\u003C/b>.\u003Cbr>\n\u003Cb>Basically:\u003C/b> 3D hypermedia files (the middle greenzone below).\u003Cbr>\n\u003Cbr>\u003Cbr>\n\u003Cdiv style=\"width:100%;max-width:900px;border-radius:15px;box-shadow:none;padding:20px\" class=\"border\">\n[img[xrfsweetspot.jpg]]\n\u003C/div>\n\u003Cbr>\u003Cbr>\nXR Fragments \u003Cb>empowers designers\u003C/b> to embed \u003Cb>simple interactions & navigation\u003C/b> inside a \u003Cb>3D file\u003C/b>.\u003Cbr>\nThis \u003Cb>no longer\u003C/b> requires developers to implement trivial interactive stuff.\u003Cbr>\nIt promotes \u003Cb>design-first, secure, durable and interoperable\u003C/b> XR experiences from \u003Cb>3D models\u003C/b>, basically 3D hypermedia, mitigating \u003Cb>handcoded-XR-apps-as-3D-content-burial-sites\u003C/b>.\u003Cbr>\n\u003Cbr>\n\u003Ch2>Why focus on designers and 3D files?\u003C/h2>\n\u003Cbr>\n\u003Cquote>\u003Ci>\"Future 3D file formats commoditize yesterdays 3D engines\"\u003C/i> ~ Leon van Kammen\u003C/quote>\n\u003Cbr>\u003Cbr>\nDevelopers tend to fall in love with \u003Cb>specific shiny\u003C/b> 3D technologies, which typically \u003Cb>buries\u003C/b> 3D content inside them.\u003Cbr>\nThese however, still lack \u003Cb>addressibility\u003C/b> and \u003Cb>interoperability\u003C/b> unlike \u003Cb>3D Models\u003C/b>, which can use XR Fragments \u003Cb>URLs\u003C/b> as a basic primitive.\n\u003Cbr>\u003Cbr>\n\u003Ch2>Getting Started\u003C/h2>\n\nJust get your hands on a 3D editor and follow the steps in the video:\n\u003Cbr>\u003Cbr>\n\u003Cdiv style=\"max-width:600px\">\n\u003C$videojs controls=\"controls\" aspectratio=\"16:9\" preload=\"auto\" poster=\"\" fluid=\"fluid\" class=\"vjs-big-play-centered\">\n \u003Csource src=\"https://coderofsalvation.codeberg.page/xrfragment.media/gettingstarted2024.mp4\" type=\"video/mp4\"/>\n\u003C/$videojs>\n\u003C/div>\n\u003Cbr>\u003CBr>\nCheck [[How it works|How it works]], or \u003Ca href=\"example/aframe/sandbox\" target=\"_blank\">view a \u003Cb>demo.glb\u003C/b> scene right now\u003C/a>, or see the menu in the left corner for more.\n\u003Cbr>\u003Cbr>\n\u003Ch2>Presentation\u003C/h2>\n\u003Cbr>\n\u003Ciframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/bfxqm1q_GXw?start=1445\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen>\u003C/iframe>\n\n\u003C!-- persist telescopic unfolds -->\n\u003C\u003Cscript>>\n\u003Cscript>\n([...document.querySelectorAll('u')]).map( (u) => {\n u.addEventListener('click', e => e.target.className = 'show' )\n});\n\u003C/script>\n\u003C\u003Cscript 0>>\n","tags":"Home","title":"XR Fragments","modified":"20250925112220059","list-before":"How it works"},
{"created":"20250903111630328","text":"The viewer should ideally \u003Cb>presents a play-button\u003C/b> when:\n\n* at least one animationdata-item is defined in the 3D file\n* and/or when a timeline file (soundtrack or subtitle) sidecar-file is detected\n\nSee [complementary file](#📜%20level0:%20File) for detection of sidecar-files, for enhanced accessibility via [WebVTT subtitles](#WebVTT%20subtitles), thumbnails, soundtrack e.g.\n\n\n\n","tags":"","title":"XR Movies","modified":"20250904105805727","type":"text/markdown"},
{"created":"20250516081212327","text":"How can applications discover 3D experiences on a network?\n\n> Answer: the **XRF microformat** \n\nThe XRF microformat are **OPTIONAL** network heuristics which applications can detect across various usecases.\n\n## via HTML webpage\n\nIf the browser/application requests an webpage (`https://nlnet.nl` e.g.) it should check for the [rel-me microformat](https://gmpg.org/xfn/) :\n\n```\n\u003Clink rel=\"me\" href=\"scene.xrf.glb\"/>\n```\n\nThis way the application loads `https://nlnet.nl/scene.glb` when the user types `nlnet.nl` into the URLbar.\u003Cbr>\nOptionally, `type` can be specified for dynamically generated 3D files:\n\n```\n\u003Clink rel=\"me\" href=\"https://worlds.org/scene.php\" type=\"model/gltf+binary\" />\n```\n\nThe `type`-attribute is for fallback-purposes.\u003Cbr>\nViewer-supported 3D file-extensions (`.glb` e.g.) will **ALWAYS** take precedence over the (non)presence of the `type` attribute.\u003Cbr>\nThe reason is that platforms (Mastodon 'labels' e.g.) don't allow specifying type-attributes.\u003Cbr>\nAnother reason is that XR Fragments is filetype-agnostic, so flexibility is expected on the viewer-side.\n\n> NOTE: in case of multiple 3D files mentioned in `\u003Clink rel=\"me\"`, only the first (supported 3D filetype) will be chosen.\n\n## via WebFinger\n\nWhen John has an account on foo.com, how can other applications request his 3D homepage by simply entering `john@foo.com`?\n\n> Answer: it can be requested at `https://foo.com/.well-known/webfinger?resource=acct:john@foo.com`, resulting in:\n\n```\n{\n \"subject\": \"acct:john@foo.com\",\n \"aliases\": [\n \"https://mastodon.example/social/john\",\n \"https://john.foo.com\",\n \"https://3d.john.foo.com/model/scene.glb\"\n ],\n \"properties\": {\n \"http://schema.org/name\": \"John Doe\",\n \"http://schema.org/description\": \"Developer, 3D Enthusiast, and Social Explorer\"\n },\n \"links\": [\n {\n \"rel\": \"http://ostatus.org/schema/1.0/subscribe\",\n \"template\": \"https://mastodon.example/social/john/{uri}\"\n },\n {\n \"rel\": \"self\",\n \"type\": \"text/html\",\n \"href\": \"https://john.foo.com\"\n },\n {\n \"rel\": \"me\",\n \"type\": \"text/html\",\n \"href\": \"https://john.foo.com\"\n },\n {\n \"rel\": \"me\",\n \"type\": \"model/gltf+binary\",\n \"href\": \"https://3d.john.foo.com/model/scene.xrf.glb\"\n }\n ]\n}\n```\n\nThis way the application will load `https://3d.john.foo.com/model/scene.glb` when the user types `john@foo.com` into the user field.\n\n## via Text (URI)\n\nAnother way for an application to trigger loading a 3D scene is by detecting URI's of 3D scene-files any text:\n\n* `foo.glb` (or any other popular 3D extension)\n* `https://foo.com/scene.glb` (or any other popular protocol)\n\nThis way, the application can highlight the link whenever it detects the URI (in a text-file or text-section of a 3D model)","tags":"[[📜 level1: URL]]","title":"XRF microformat","modified":"20250922171213120","type":"text/markdown"},
{"created":"20250910100333866","text":"Prefixing the `xrf:` to [href](#href)-values **will prevent** [level2](#📜%20level2:%20explicit%20links) [href](#href)-values from changing the top-Level URL.\n\n> **Usecase**: for non-shareable URLs like `href: xrf:#t=4,5`, to display a stateful msg e.g.).\n\n**Reason:** XR Fragments is inspired by HTML's [href-attribute](https://en.wikipedia.org/wiki/Hyperlink), which does various things:\n\n1. it updates the browser-location\n2. it makes something clickable\n3. it jumps to another document / elsewhere in the same document\n4. and more\n\nThe `xrf:` scheme will just do 2 & 3 (so the URL-values will not leak into the top-level URL).\n\n## compliance with RFC 3986\n\n* unimplemented/unknown URI schemes (`xrf:...` e.g.) will not update the top-level URL","tags":"[[📜 level4: prefix operators]] level4","title":"xrf: URI scheme","modified":"20250910100955904","type":"text/markdown"},