Try to highlight that Matrix is about much more than just about instant messaging or team chat
Try to encourage the community to jump in and build out more interesting use cases
Learn where the state of the art in WebVR + WebGL is
Kick off the process of encouraging folks to think about storing world geometry and physics in Matrix
Have a fun visual demo we could show to excite potential investors in New Vector (which comically backfired when the investment community spontaneously decided that VR is still too early).
In the end it succeeded on some points (highlighting exotic uses of Matrix; learning all about WebVR) and failed on others (a surge in Matrix-for-VR) – although we did have a lot of fun showing it off at the ETHLDN meetup back in October. (Eagle eyed viewers may be amused to spot team Status & Matrix sitting together in the audience ;)
However, we still believe that Matrix is the missing link for decentralised communication within VR/AR, and we were lucky enough to get a talk about Matrix+WebRTC+WebVR accepted to the Real-Time Communications Devroom at FOSDEM 2018! So, given a new chance to show the world how cool Matrix-powered comms could be in VR/AR, myself and Dave Baker went on a (very) quick detour to update the demo a little…
One of the issues of the original demo is that the video calling bits were just putting plain old video planes into the scene – floating television screens of 2D video content, if you will. This is better than nothing, but it’s sort of missing the whole point of VR/AR: surely you want to see who you’re talking to in 3D? Ideally they should have the same presence as if they were physically in your virtual space. This could also be a big step towards fixing one of the oldest problems of video calling: gaze correction. We’ve been obsessed about gaze correction since our early days (pre-Matrix) building mobile video calling stacks: gaze correction tries to fix the fact that the break in eye contact caused by staring at the screen (rather than the camera) has a terrible impact on the emotional connection of a video call. *But* if the person you are talking to is 3D, you can always rotate them in 3D space (or reposition yourself) to correct their line of sight – to re-align their gaze so they’re actually looking (in VR) at the thing they’re looking at in real life!
Back in early 2017 it would have been wildly ambitious to build an off-the-shelf 3D video calling app – but this changed overnight in late 2017 with the introduction of the iPhone X and its TrueDepth infrared-dot-projector based depth camera; effectively a mini-Kinect. Suddenly we have a mainstream high quality depth+video camera perfectly optimised for 3D video calling, with excellent API support from Apple. So we decided to see if we could be first in the world (as far as we know) to do 3D video calling using the iPhone X, using Matrix to signal the WebRTC media and using our WebVR demo as the viewing environment!
Step 2: Build a custom Riot/iOS with the right WebRTC SDK. This is relatively easy thanks to Riot/iOS using CocoaPods and Google shipping a pod for WebRTC these days – it was a matter of tweaking Google’s pod so it could be referred to directly as a local project by Riot/iOS (and so that it provided debug symbols in the form CocoaPods expects). Brief notes are at https://github.com/matrix-org/webrtc/blob/matthew/depth/matrix/build_instructions.txt – many thanks to Manu for helping on this :)
Step 3: Decide how to encode the depth buffer. Now, the official WebRTC working group quite correctly insists that depth data should be treated as a first class citizen which is modelled and compressed in its own right. However, it looks like nobody has added first-class depth support to official WebRTC yet – and if we want to be able to easily display 3D calls on generic browsers capable of running WebVR+WebRTC+Matrix, we have no choice but do the ugly thing and encode the depth into a video signal which can be compressed with VP8/VP8/H.264 etc.
A quick search showed that some folks had already proposed a method for encoding depth data into a video signal, back in the days of the Kinect: https://reality.cs.ucl.ac.uk/projects/depth-streaming/depth-streaming.pdf. The paper outlines a fairly simple approach: you encode the 16-bit depth data into the three 8-bit colour channels; putting the coarse depth data into Blue, and then finer-grained depth data into Red and Green, encoding it as a periodic triangle wave:
Placing a video call through to another Matrix client then coughed up a video stream that looks like this:
As you can see, closer things (my head) are bluer than further things (the wall), and everything’s covered with trippy red & green stripes to refine the fine detail. For the record, the iPhone TrueDepth camera emits 640×480 depth frames at around 24Hz.
Unfortunately, it showed that the depth encoding really wasn’t working very well… you can just about make out my head, but there are dots flying around all over the place, and when you view it in profile the 3D effect was almost entirely missing.
The main problems seem to be:
Whenever there’s a big jump in depth, the stripes get incredibly noisy and don’t compress at all well, generating completely corrupt data at edges of objects (e.g. the sides of my head)
The complexity of the pattern as a whole isn’t particularly compression-friendly
The contrast of the red/green stripes tends to dominate, causing the arguably more important blue to get overpowered during compression.
Converting from 4:4:4 RGB to 4:2:0 YUV (NV12) as required by WebRTC and then back to RGB inevitably entangles the colours – meaning that the extreme contrast of the red/green stripes is very visible on the blue channel after round-tripping due to sampling artefacts.
I probably made a mistake by bitwise casting the 16-bit half-precision floating point depth values directly onto the 16-bit unsigned int lookup index, rather than interpreting the float as a number and building a new index into the lookup table based on its numeric value. As a result, depth values being encoded ended up having a much lower range than they should.
There are probably other bugs too.
Step 5: Give up on the fancy depth encoding (for now): https://github.com/matrix-org/webrtc/commit/2f5d29352ce5d80727639991b1480f610cbdd54c. In practice, simply picking a range of the 16-bit half-precision floats to fit in the integer range [0,255] turns out to be good enough for a quick demo (i.e. 8-bit depth buffer, but over a small subset of the 16-bit depth space) – the dot cloud suddenly looked a lot more 3D and recognisable:
However, the dot cloud obviously has some limitations – especially when you zoom in like this.
Step 7: Replace the dot cloud with a displacement-mapped mesh so that it’s solid. So as a final tweak for the demo, Dave switched out the dot cloud for a simple A-Frame plane with 640×480 vertices, keeping the same vertex shader. Ironically this is where we hit some nasty problems, as for some reason the video texture started being applied to the depth texture (albeit flickering a bit) – eventually we realised that the flickering was the vertex shader inexplicably flapping between using the depth and the video texture for the displacement map. At this point we compared it between laptops, and it turns out that for some reason the integrated Intel graphics on Dave’s Macbook Pro was choking on the two video textures, whereas a AMD Radeon R9 M370X got it right. It’s unclear if this was actually a GPU bug or an A-Frame or Three.js or WebGL or Chrome bug. Eitherway, on switching laptop to one with discrete graphics it started working perfectly! Finally, we tweaked the shader to try to reduce smearing, by discarding vertices where there are big discontinuities in depth (through looking at the partial derivatives of the depth texture). This isn’t perfect yet but it’s better than nothing. https://github.com/matrix-org/matrix-vr-demo/compare/bbd460e81ff1336cd63468e707d858d47261ea42…06abe34957732ba8c728b99f198d987fe48d0420
And here’s the end result! (complete with trancey soundtrack as the audio we recorded at FOSDEM was unusable)
Hopefully this gives a bit of a taste of what proper 3D video calling could be like in VR, and how (relatively) easy it was at the Matrix level to add it in. If anyone wants to follow along at home, the various hacky branches are:
If you’d like to get involved with hacking on Matrix in VR, please come hang out at #vr:matrix.org.
Also, New Vector (where most of the core team work) is also hiring for VoIP/VR specialists right now, so if you’d like to work on this sort of thing fulltime, please contact us at firstname.lastname@example.org asap!
We’re delighted to announce that our friends at Status have made a major strategic investment ($5M) in New Vector: the company which currently employs most of the Matrix.org core team. This means that we now have the financial backing to let us focus entirely on improving the Matrix ecosystem and getting the protocol out of beta… and beyond!!
First up – massive, massive thanks to everyone who has supported us over the last 6 months since our funding situation changed: as of the end of 2017 we had enough Patreon / Liberapay / IBAN / BTC / ETH donations and sponsorship (for Matrix.org) and enough paid consulting work (for New Vector) that we’ve been able to keep almost the whole core team working on Matrix as their day job. Simply: the core Matrix team could not have continued in its current form without the support of the community – so we will be forever indebted to everyone who has supported us: especially all our donating supporters on Patreon/Liberapay/etc, our customers at New Vector, and our big $ sponsors, including UpCloud.com (who provide *incredible* hosting for Matrix.org), PrivateInternetAccess.com, INBlockchain.com, OmiseGO and Tendermint.
The investment from Status that we’re announcing today is a massive step change as it gives us the resources to grow the team and to focus fully on Matrix’s key problem areas without distractions (whilst still supporting paid New Vector work). Please note that donations are still very appreciated however: we are in the process of setting up the Matrix.org Foundation (at last!) as the non-profit target for all future donations, such that Matrix itself has a financial means to support pure Matrix work independently of any other companies (including New Vector).
Many folks will be familiar with Status already as one of the leading projects in the Ethereum ecosystem: building a beautiful usability-focused browser for decentralised apps (DApps) which run on the Ethereum Virtual Machine – as well as providing cryptocurrency payments and chat functionality (via the Whisper protocol). It effectively lets users access Ethereum as a usable meaningful operating system – a bit like how Riot attempts to be a flagship ‘browser’ for the Matrix ecosystem. The reason Status is investing in Matrix is primarily to accelerate decentralisation technology and open protocols in general – and also because there are some pretty obvious advantages to the collaboration, potentially including:
Bridging between Matrix and Whisper (Ethereum’s own real-time communication protocol) – exposing all of the Matrix ecosystem into Ethereum and vice versa
Bundling up Status DApps as Matrix Widgets
Exposing Matrix Widgets into Status
Supporting Olm/Megolm such that it could be used for E2E encryption in Status
Collaboration on the decentralised reputation systems needed to combat abuse in both Matrix & Ethereum
We’ve spent a lot of time working with Status over the last few months whilst arranging this partnership, and we’ve been really impressed by Jarrad and Carl and the team (they even have their own golang Double Ratchet Implementation!). It’s fair to say that Status are very much aligned with Matrix’s vision, and the projects and can help each other a lot.
It’s also worth noting that Status and Matrix are really quite complementary: Whisper (as used by Status) is entirely p2p and focuses on protecting metadata and is tightly coupled to Ethereum, whereas Matrix is standalone and more feature rich but currently lacks metadata protection. We both have fledgling app ecosystems; Matrix through Widgets and Status through Ethereum DApps. That said, Matrix and Status are going to continue on their own paths, and Matrix will of course remain controlled by Matrix.org – but we are looking forward to learning more about each other’s tech and driving decentralisation forward in general!
Meanwhile, on the core Matrix side, the investment lets us focus immediately on the following priorities:
Improving Riot’s usability. As of today we are urgently hiring for a Lead Designer to join the team fulltime to revamp and address Riot’s usability issues, as this is one of the single biggest things getting in the way of Matrix uptake today. Hit up email@example.com if you’re interested! At the same time, we’re excited to ramp up our investment in Riot’s performance and overall polish (as well as achieving feature parity with Slack/Discord and friends) – that means we’re looking for React, Android & iOS folks to join the core team full-time asap to take the apps to the next level. Again, firstname.lastname@example.org if this sounds like you!
Getting End-to-end Encryption out of beta.We know what we need to do to push E2E out of beta (incremental key backup; cross-signing devices; improved device verification) – Status’ investment means we can build the team to get it done! Decentralised end-to-end encryption is not for the faint-hearted, but if you’re up for the challenge please get in touch at email@example.com.
Finishing Dendrite. Dendrite (our next-gen golang homeserver implementation) is a hugely ambitious project and right now the only folks working on it are Rich and Erik… who also happen to be supporting Synapse too. The good news is that the community has been helping considerably with Dendrite, but it would be even better if we had more people supported to work on it full time. If you love Go, and you love massively scalable decentralised systems, please hit up firstname.lastname@example.org!
Supporting Synapse.There is massive scope for performance improvements to Synapse, and there are thousands of deployments out there today, so we really want to improve support for Synapse. If you love Python and Twisted, and interesting performance/profiling and efficiency work, please hit up email@example.com too!
Maintaining the Spec.If Matrix is anything it is the spec, and maintenance of the spec is key to the project’s success. In 2018 we intend to invest heavily in its maintenance and address outstanding API proposals, documenting APIs, not to mention updating the general technical documentation (guides, FAQ etc) on Matrix.org in general. If you are a developer who loves spec work, we need you over at firstname.lastname@example.org immediately! :)
Beyond these immediate priorities, we have a long feature roadmap lined up too (highest priority first): Reactions, Message Editing, improved Widgets (e.g. Sticker Packs), Threading, Decentralised Accounts, Decentralised Identity, Decentralised Reputation, Peer-to-peer Matrix and more. However, right now our focus has to be on improving the quality and stability of what we have today and getting it out of beta before we open yet more battlefronts. In other words: we’re not adding more features (modulo emergencies) until the current features are polished!
So: exciting times ahead! Never before has Matrix had the resources to fully realise its potential, and we’d like to say enormous thanks to Carl, Jarrad, Yessin and Nabil at Status for their patience and support while sorting out the investment. We’d also like to say thanks to everyone else who offered us investment: in the end we had several viable offers on the table – and we owe sincere thanks to those who invested the time and faith to make an offer which we’ve ended up turning down.
For now, however, it’s back to work: making Riot slicker than Slack; making Synapse go faster and use less RAM; making Dendrite federate; making E2E encryption transparent and indestructible; making sure that it’s possible to implement Matrix purely by referring to the Spec.
2018 is going to be an interesting year indeed :) Thank you all for supporting Matrix – and thanks, once again, to Status for helping to take us to the next level.
We’d like to share a guest post from Dmitriy Volkov (who’s been using Matrix almost since day 1!) – announcing the Goto::Hack event at the Tor Onionspace in Berlin in January. The Onionspace will be on fire as folks attack the New Year by tackling the critical problem of internet decentralisation. A week long brainstorm and hack feels like the right way to go after the Christmas break! GNUnet, Tor, Matrix, pick your topic, or mix them all, and join the gang! Hopefully we’ll have someone there from the Matrix core team too (although it depends on funding and timings).
We’d like to invite you to discuss and hack all things decentralized internet: from conceptual issues like identity and foundational tech like network stack to most practical questions, e.g. “What do I advise people at Cryptoparty in lieu of WhatsApp?” or “How do I make a GNUnet app?”.
Broadly, we’ll do networks, distributed systems, infosec and telecom – with GNUnet / secushare and Matrix developers, find out more here.
Time: 02-09 Jan 2018 Space: Onionspace, Gottschedstraße 4, Aufgang 4, 13357 Berlin
It’s well known Big Brother has been listening to our phone calls, reading texts and partnering with companies like Amazon or Google for a while now; more and more countries start censoring Internet – it’s not just China. Most “secure” communications solutions like Threema or Telegram suffer conceptual issues, like being unsecure-by-default or controlled by single commercial entity.
Decentralized systems – the proposed technical part of the solution – bring forth their own challenges: how do we conveniently identify an entity (considering revocation and squatting), and why do blockchains as innovative as Bitcoin and Ethereum churn through gigawatts of energy while handling miserable tens of transactions per second? What can serve as practical, scalable infrastructure for a decentralized network alternative to current Internet: on physical and channel levels, in terms of routing, etc.? How do we forge convenient XMPP, free Signal, a WhatsApp that can be both used universally and trusted?
How do we make the Internet less centralized and what can be done to make existing distributed technologies more popular? Why is Tor not enough and how long are we going to continue communicating in plaintext? How do we cook identity, and can we better consensus?
During the event we will discuss, hack, code, debug and develop – both systems (GNUnet, Tor, Matrix, etc.) and applications based on them, fix UX and write docs. The goal is to make a measurable contribution to solving some of the described problems through the course of the week, meet in person with the people tackling the issues you care about and return home with the desire to continue hacking.
Please register at our website if you’d like to come – also, if you’re not local, we are doing a group booking at a hostel and will be having some Berlin hacker community tours! (Use this if the first link didn’t work for you – that’s an IPNS issue and one thing in scope for the event.)
Synapse 0.24 is out (currently at 0.24.1)! This is a pretty big release as it includes initial support for Groups, also known as Communities (UI for which is landing currently on Riot/Web and later Riot/Mobile). Groups let you associate together a set of users and rooms, letting you define a community – e.g. +matrix:matrix.org is the community of the core Matrix project itself (whose users are the core Matrix.org team, and whose public rooms are the rooms we officially manage/moderate as Matrix.org). We’ll yell more about Groups once the UI is ready for action in the near future, but the good news is that Synapse should be ready to go (although the API is still fairly experimental and very much evolving).
Other stuff worth calling out in this release includes: massive performance improvements on receiving federation traffic (we now process federation traffic for different rooms in parallel); fixing a major cause of performance issues (caused when processing spurious events for rooms you’ve actually left); modularising and improving the the spamchecker; @room notification support; backup media repository support; and finally the ability to autojoin new users to a set of rooms on the server!
You can get the latest release from Github as usual; have fun – and thanks for flying Matrix :)
Changes in synapse v0.24.1 (2017-10-24)
Fix updating group profiles over federation (PR #2567)
On October 19th (next Thursday, as of the time of writing) we’re going to be back in Berlin for various meetings – and we’re incredibly excited that BlueYard have offered to host the world’s first ever official Matrix and Decentralised Communications Meetup at their offices in Kreuzberg! Matthew, Amandine and maybe others will be attending and speaking from the core team, and giving a VIP tour of the long-long-long-awaited Groups/Communities features in Matrix and Riot as well as some of the other good stuff in the pipeline – and we’re also excited to have Exul joining us from the community to talk about his recent Matrix<->Rocket.Chat bridging adventures. We’re also expecting some exciting folks to join us from the Ethereum community to talk about decentralised realtime comms in their ecosystem – plus if anyone wants to talk about other Matrix/XMPP/Tox/Briar/Richochet or similar projects please ping us and let us know asap!
Update: we’re excited to announce that Jack Fransham from Polkadot (who are very active Riot/Matrix users – and just raised >$130M in their token generation event yesterday) will also be joining us to tell us all about how Polkadot bridges together different blockchains!. (The original speaker was Marek Kotewicz, but availability didn’t work out).
Update 2: and our final speaker is confirmed as Maximilian Möhring, CEO of Keyp, who’s going to talk about their self-sovereign decentralised identity system.
Update 3: …and we have a last minute addition for a lightning talk from Secushare (Psyc + GNUnet, fully decentralised p2p encrypted comms)!!
As a taster: the official video of our massive talk from the ETHLDN meetup a few weeks ago was just released (see below). The meetup in Berlin will have different content and be more free-form, letting folks ask their own questions and steer the conversation and discussion as you see fit: so please come hang out in person, grab pizza and beer courtesy of BlueYard, and find the answers to all the deepest Matrix questions you never knew you even had…!
We’ve just released Synapse 0.23 – which contains a bunch of significant performance improvements, bug and stability fixes – as well as a few new features: basic spam checking (the ability to configure your homeserver to reject events which match arbitrary rules, both from users and other servers) – and long-awaited support for privacy-preserving (‘event_id_only’) push notifications. This means that apps can choose to register themselves to receive push notifications which do *not* contain any information about the actual push, but instead act as a simple “wake up!” event, which triggers the app to then sync via the client-server API in order to display the actual push notification details. This is particularly useful for push notifications for E2E encrypted rooms, as it means the client has a chance of decrypting the message in order to display the push notification details in the UI (if the user wants that). matrix-ios-sdk and matrix-android-sdk are in the process of being moved over to use the new ‘event_id_only’ push format.
Long-awaited Communities/Groups will land in Synapse 0.24, which should come quite soon (we’re almost ready to merge it to develop, but it’s a major update so we wanted to get 0.23 out the door first).