Back from FOSDEM!

04.02.2015 00:00 — GeneralOddvar Lovaas

FOSDEM was great fun! Two days full of conferences and demos; lots of interesting technologies and interested people - and most of all: talking to so many new faces about Matrix and potential uses and integration ideas.

Both our lightning talk and IoT-devroom talk were completely filled up with huge queues outside (sorry folks), and our demos seemed to go down fairly well. In fact several people set up their own homeserver and joined the federated network of Matrix servers during FOSDEM itself!

Here's a view from our stand, from our lightning talk and from our IoT-devroom talk.

If you missed the talks, recordings will (soon) be available from the FOSDEM site (links will be added here once available) - in the meantime you can check out the slides here: lightning talk and IoT-devroom talk.

Thanks to everyone who came to have a chat about Matrix and/or help with setting up their own homeserver (or to play with Sentinel, our mascot) - please do reach out to us via our Matrix HQ room or IRC (#matrix on freenode) if you have any problems - or want to help us fix our python packaging ;) Now is a great time to get involved as we are currently landing new APIs and soon will be offering an Application Server API to ease bridging to other services.

Looking forward to FOSDEM!

29.01.2015 00:00 — GeneralOddvar Lovaas

This weekend, Matrix is heading to FOSDEM (Free and Open Source Software Developers' European Meeting) in Brussels, Belgium. We will be hosting two events: a lightning talk on Saturday at 16:30 in room H.2215 (Ferrer), and an IoT devroom talk on Sunday morning at 11:00 in room H.2213.

FOSDEM's schedule is looking very interesting and varied, and we hope we can learn about interesting projects - and of course show how and where Matrix can be used to lots of FOSDEM-attendees. Please come over and have a chat if you are interested; we have a stand on the second floor in the K building - just take a right after coming up the stairs and say hi!

We have also set up a Matrix <-> IRC bridge on the #fosdem channel on freenode, which means that any conversation happening there will be copied over to #fosdem:matrix.org - and vice versa. Making bridges to other services is currently being worked on as part of the Application Services API - we want to be able to connect different services together via Matrix.

Finally, we are always available in the official Matrix HQ room - please join and say hi!

Synapse 0.6.1 released and other news!

07.01.2015 00:00 — TechMatthew Hodgson

Happy 2015 from everyone at Matrix.org!

We're excited to kick off the new year with a major performance upgrade for Synapse: having had a chance to do some profiling over the Christmas break, Synapse 0.6.1 improves performance by up to an order of magnitude thanks to optimising the way events are constructed and manipulated, DB optimisations, etc. Suddenly things are feeling much more snappy and less of a PoC and more of a real system, which hopefully bodes well for 2015! Please upgrade if you're running a homeserver, or install one if you're not - grab the code from http://github.com/matrix-org/synapse.

The iOS SDK and demo app has also been improving lots in the last few weeks - grab the latest code from http://github.com/matrix-org/matrix-ios-sdk. We have zoomable image support; full support for the new media repository in Synapse 0.6.0; file transfer status UI; offline support; snappy message synchronisation and more...

We also released a new simple Python SDK client library for Python called matrix-client, which is now being used by NEB (our general-purpose Matrix helper bot).

Meanwhile, our (constantly evolving) plan for the beginning of 2015 is:

  • Finish v2 of the client-server API based on all the lessons learnt since launch: draft in progress here
  • Finish the Application Services API to allow proper gateways and services in and out of Matrix at last:draft in progress here
  • Re-release the spec based on the above
  • Build robust gateways (IRC, XMPP, SIP and more) on top of the AS API
  • Polish and release the iOS, Android demo clients - including push notification and VoIP support!
  • Overhaul the identity server architecture and add end-to-end crypto

Given the rate at which Matrix is maturing, the next few months should be really exciting - please come join us on #matrix:matrix.org and get involved!

Changes in synapse 0.6.1 (2015-01-07) =====================================
  • Major optimizations to improve performance of initial sync and event sending in large rooms (by up to 10x)
  • Media repository now includes a Content-Length header on media downloads.
  • Improve quality of thumbnails by changing resizing algorithm.

Matrix wins Best Innovation Award at WebRTC Paris!

24.12.2014 00:00 — EventsMatthew Hodgson

Last week we had a great time attending WebRTC Conference Expo Paris 2014 - chatting to lots of new folks about Matrix; speaking in the "To Build or Not To Build" panel discussion; giving a general presentation on Matrix, and participating in the Demo shoot-out.

And we're very proud to say that we won the Best Innovation Award for a slightly frantic demo, showing an iPad mounted on our pet Trossen Robotics PhantomX Hexapod being used for robot telepresence by streaming video and audio to an Oculus Rift VR headset. This was using our proprietary in-house WebRTC stack, but once Matrix has fully taken off we hope to share our WebRTC stack with the world too :) This was a very last minute demo - we wanted to show something different to normal browser-to-browser IM/Video calling via Matrix and had the idea to use the Rift at the last minute - and in fact it still wasn't working when we went on stage (turns out that iOS 8.1 introduces some quirks in the video capture API which were producing corrupt video). By switching from an iPhone 5S running iOS 8.1 to an iPad running iOS 6 we were able to turn the demo around in the nick of time and get it working live on stage (modulo a RGB<->BGR colourspace bug) just in time to win the award. Huge thanks to the jury for voting for us against the odds :D For those interested in displaying raw video straight onto the Oculus Rift (without using any head-mounted tracking), there's an OpenGL code snippet up at https://gist.github.com/ara4n/875b5e8b66be3617efb7.

iOS to Oculus Rift Telepresence

(Image credit to Victor Pascual Avila at Quobis)

Also, huge congratulations to Vladimir Beloborodov who won the Best Data Channel Award for hacking his Romotive telepresence robot to rendezvous via Matrix with his iPad, stream video via Google's WebRTC stack and control the robot's motion via the WebRTC Data Channel:

Vladimir Beloborodov

We're really excited to see other folks' Matrix projects out there winning prizes!

Synapse 0.6.0a released!

19.12.2014 00:00 — TechMatthew Hodgson

We're proud to announce the new 0.6.0 major release of Synapse: the Python reference implementation of Matrix - as well as 0.6.0 of the AngularJS example Matrix client, as a special early Christmas present from the Matrix team :)

The main priority here has been hunting down stability bugs whilst also adding in a few more features. The most exciting new feature is the new Media/Content API: this allows every homeserver to replicate, cache and thumbnail any files associated with Matrix rooms, rather than relying on retrieving them from the origin homeserver as was previously the case. This is really cool, as it effectively makes Matrix a distributed content distribution network and gives the same replication semantics to file attachments as to the rest of JSON in rooms.

We've also landed a major new branch which changes the way events are represented internally in order to make them immutable, and fixes a whole range of minor stability issues. In other news, performance issues are still a work in progress...

To get involved, head over to https://github.com/matrix-org/synapse and install and upgrade today!

Changes in synapse 0.6.0 (2014-12-19) =====================================
  • Add new API for media upload and download that supports thumbnailing.
  • Replicate media uploads over multiple homeservers so media is always served to clients from their local homeserver. This obsoletes the --content-addr parameter and confusion over accessing content directly from remote homeservers.
  • Implement exponential backoff when retrying federation requests when sending to remote homeservers which are offline.
  • Implement typing notifications.
  • Fix bugs where we sent events with invalid signatures due to bugs where we incorrectly persisted events.
  • Improve performance of database queries involving retrieving events.
Changes in Matrix Angular SDK 0.6.0 (2014-12-19) ================================================

Breaking changes:

  • Uploading files in the web client will now hit the new content repository URL introduced in Synapse 0.6, and be incompatible with previous Matrix clients.

Bug fixes:

  • Fixed a bug which caused the event stream to become wedged when the computer is asleep.
  • Fixed a bug which caused the recents to update but not the message window.

Features:

  • Typing notifications will now be sent.
  • Typing notifications will now be displayed for other users.
  • Use the new content repository introduced in Synapse 0.6 when uploading files.

Improvements:

  • Display more error dialogs rather than silently failing.
  • Display loading spinners on signup.
  • Display feedback when joining a room.
  • CTRL + clicking on a recents entry will now open that room in a new tab.
  • Clicking on links in messages will now open them in a new tab.
  • Provide a progress dialog when uploading files.
  • Display a red bar when the event stream connection is lost for an extended period of time.

Synapse 0.5.4 released

03.12.2014 00:00 — TechMatthew Hodgson

We just pushed a bugfix update to Synapse 0.5, mainly to fix a memory leak where federated events could get leaked whilst retrying to send them to a remote server which is unavailable. Please upgrade, especially if you've noticed synapse hogging RAM!

Changes in synapse 0.5.4 (2014-12-03) =====================================
  • Fix presence bug where some rooms did not display presence updates for remote users.
  • Do not log SQL timing log lines when started with "-v"
  • Fix potential memory leak.

Bridging Matrix & SIP via Verto

30.11.2014 00:00 — TutorialsMatthew Hodgson

One of the final remaining missing bits of Matrix today is specifying and implementing the Application Service (AS) APIs which allow you to easily extend Matrix with custom server-side functionality. The AS APIs should let you perform any arbitrary manipulation on chatroom contents, modulo end-to-end encryption constraints - e.g. machine translation; archiving/searching contents; interactive automated services; conferencing; firing push notifications and other hooks; etc. If you really want to look behind the curtain, the bug tracking the development (somewhat out-of-date) is at SPEC-34.

However, the most obvious use case for this is gatewaying Matrix rooms through to existing communication platforms (XMPP, SIP, non-standardised systems) - which is obviously key to Matrix's overall goal of defragmenting communication.  And the good news is that even though the AS APIs don't yet exist, we can still make good progress here through the existing client-server API.  Anyone who's hung around chat systems like IRC should be familiar with the idea of bots - non-human users who participate in chatrooms and but perform arbitrary automated functionality - and you can go quite a long way in using the 'bot' idiom to add automatic functionality to Matrix.

[In fact the first AS API we'll be adding will probably be simply extending the client-server API with some additional privileges to allow homeserver admins to hook up services to their server which are essentially privileged bots (e.g. ability to autojoin rooms created on that server with high power-level; ability to flag themselves as an invisible 'service bot'; ability to monitor events from rooms without joining them: useful for read-only services such as sending push notifications, adding search/archive functionality; etc).  This should also be familiar to IRC users, as it's similar to the model that IRC Services uses.]

So, we already have a few bots hanging around prototyping out bridging to other systems, which hopefully should evolve into full Application Services (where it makes sense; sometimes a bot is good enough).  For instance, we have the Matrix/IRC Bridge thanks to tm604 and LeoNerd.  The way this works is simply a bot which joins IRC channels and their Matrix room equivalents; watching the messages on both sides of the bridge and relaying them to the other side, creating virtual users as required.  In future we can be smarter about having the bridge talk on behalf of actual users, or letting actual users control their virtual users, but it's good enough as a first cut.

So for Friday's VUC 517, we decided at the last minute (on Tuesday) to make as much of VUC accessible via Matrix as possible.  One side of this was hooking up the Jitsi Video Bridge to be accessible by talking to the underlying XMPP server - the other side was hooking up via SIP to the ZipDX audio bridge that is used for audio-only participants in the conference.  Both of these would be done as Matrix bots - a virtual user that you could voice/video call 1:1 over Matrix which would then route your call into VUC appropriately.

By Thursday, the Jitsi bot got to the point of being able to place calls and see a single video stream (picked at random), but the video uplink wasn't getting through and actually selecting the right stream to watch (or viewing multiple streams) wasn't in place either.  I'm sure there'll be a similar blogpost once it's finished, so I'm not going to talk about it further here.  Meanwhile, on Thursday night we hacked together a separate bot to jack into the ZipDX bridge via SIP.  Tim Panton's suggestion was to use FreeSWITCH's mod_verto for this, and after Anthony Minesalle and Mike Jerris from FreeSWITCH had popped up on #matrix:matrix.org on Tuesday to find out what we're up to, this seemed like serendipity.

We hadn't played with mod_verto before, although had been pointed at it by someone on IRC shortly after we released Matrix - it's a cool project from the FreeSWITCH dev team that exposes a simple JSON-RPC interface for call signalling over websockets, providing a much more suitable way for WebRTC developers to get calls in and out of FreeSWITCH than shoehorning a SIP stack into their browser.  In this respect it's quite similar to Matrix, but there are some huge differences:

  • Verto doesn't (yet) do federation - either for message-passing (like XMPP) or history-replication (like Matrix or XMPP FMUCs).  In fact, Matrix fundamentally competes more with JSON-RPC at OSI layer 5 by defining a standardised RESTful API for federated state synchronisation - which so happens to define some datatypes for VoIP signalling; whereas Verto currently seems to be focused solely on the application-layer problem of VoIP signalling.
  • Verto is a generic RPC API with method names like verto.invite, verto.answer, verto.media, verto.bye etc. for handling call signalling.  It's obviously readily extensible to any other functionality expressed as an RPC invocation.  The Matrix client-server API however passes around event objects within the context of a room - it's message passing rather than RPC.
  • Matrix's VoIP events support trickle-ICE; announcing ICE candidates from WebRTC as and when they become available.  This good is for speedy call-setup (you don't have to wait for all ICE to complete before setting up the call) and to support call continuity when roaming between different IP networks (in theory).  However, Verto currently requires ICE candidates to be presented monolithically - it hasn't made sense to implement trickle-ICE as FreeSWITCH's core engine doesn't support it yet.
  • Verto looks to be wired to speak JSON-RPC over Websockets, whereas Matrix deliberately uses plain old HTTP as its baseline for maximum simplicity and compatibility in PUTting and GETting JSON events around
  • Verto could be an interoperable standard but the API hasn't been documented yet (unless I've totally missed it) - to build the bot we looked at the websockets tab in Chrome's network inspector and drew some inferences from the JSON seen in a call placed using the FreeSWITCH Verto demo site, which was very intuitive and almost self-documenting.  Meanwhile, the (minimal) doc for Matrix's events is up at http://matrix.org/docs/spec/#voice-over-ip.
Verto has a huge advantage however, in that FreeSWITCH has a mod_verto today, and doesn't have a mod_matrix - so one can use mod_verto right now as an easy way to get VoIP calls in and out of FreeSWITCH from the web and bridge them to SIP!  So, when writing a Matrix<->SIP bridging bot for VUC, Verto turned out to be a really nice way to quickly get something up and running.  The end result is at https://github.com/matrix-org/synapse/blob/develop/contrib/vertobot/bot.pl - a (precisely!) 300 line perl script built on LeoNerd's Net-Async-Matrix and Net::Async::Protocol::WebSocket which logs into Matrix and routes any 1:1 audio calls it receives through to the defined mod_verto service.  Currently it gleefully hardcodes in the destination extension it calls and the caller-ID, but this could trivially be extended.  It also chokes on SSL WebSockets, so your mod_verto needs to be listening unencrypted on port 8081.

The task of mapping between Matrix m.call.* VoIP events and Verto verto.* RPC methods was almost entirely trivial (although I hasten to add that Matrix's and Verto's were developed completely independently - it's just that there are only so many ways to express VoIP signalling in JSON!)

  • Matrix's m.call.invite is equivalent to the combination of verto.invite + verto.media (but may lack ICE candidates)
  • Matrix's m.call.candidates has no direct equivalent, so has to be coalesced and merged into verto.media
  • Matrix's m.call.answer is equivalent to verto.answer (but may lack ICE candidates)
  • Matrix's m.room.displayname is equivalent to verto.display (assuming I understand verto.display)
  • Matrix's m.call.hangup is equivalent to verto.bye
  • …and these are the only verto RPCs we mapped.
For the demo itself, we obviously needed a FreeSWITCH with mod_verto all up and running to hook into the ZipDX bridge: our friends at Truphone were good enough to provide one at zero notice (Thanks James, Andy, Giacomo!), and we were up and running.

Unfortunately we did hit some problems: Net::Async::Matrix has a few quirks which LeoNerd is working out currently; the bot doesn't coalesce the trickle-ICE properly currently causing a race-condition that means ICE setup may fail; Matthew's use of IO::Async was a bit buggy; and moreover we didn't have time to implement DTMF… which was a bit of a shame as you can only unmute yourself on the ZipDX bridge via DTMF *5!

But in general, the mini-hackathon was a success and it was great fun to be able to listen into VUC via the bridge and demonstrate the first ever Matrix<->SIP call!  The bot ran as @vucbot:matrix.org, although is turned off now as there's no VUC to listen to, and the FreeSWITCH & bot were only deployed temporarily.  Once the kinks mentioned above are sorted out we'll hopefully set it running again permanently!  And hopefully this little bot is an exciting precursor to more robust Matrix bridges and application services in the months to come...

If you're crazy enough to want to try to run the bot yourself, then it should actually be quite simple to get up and running:

# grab synapse if you don't have it already git clone https://github.com/matrix-org/synapse.git synapse-develop cd synapse-develop

you'll need the develop branch, as we haven't released a build with vertobot in it yet

git checkout develop cd contrib/vertobot

you'll need cpanm to install the perl dependencies

cpan -i App::cpanminus cpanm --installdeps .

manually install a develop version of Net::Async::Matrix as cpanm can't figure it out, seemingly

cpanm --force PEVANS/Net-Async-Matrix-0.11_002

(you may need to also replace the 'croak' for the "Already have a room with ID" error with 'warn' in Net::Async::Matrix if the bot crashes with this error)

create a username account for your bot on a Matrix homeserver somewhere at this point

set up a config file

cp config.yaml mybot.yaml

edit mybot.yaml to taste - at the least you must specify the login & password & homeserver for your bot!

run it!

./bot.pl -c mybot.yaml

Finally, huge thanks to everyone to helped make the VUC bridging escapade work out - Emil Ivov at Jitsi, James Body, Andy Smith and Giacomo Vacca at Truphone, Anthony Minesalle & Mike Jerris & Brian West at FreeSWITCH for writing freeswitch and mod_verto, Tim Panton for the VUC intro and suggestion of mod_verto, Randy Resnick & Michael Graves at VUC itself, and of course the Matrix team for glueing our side of it together!

Looking forward to lots more ambitious cross-protocol gatewaying and federation in future!

Matrix on the Road #2 - A winning tour!

29.11.2014 00:00 — GeneralAmandine Le Pape

Some updates on the conferences Matrix attended over the last 3 weeks: WebRTC Summit in Santa Clara, TAD Summit in Istanbul, WebRTC World West in San José and fOSSa in Rennes. Great shows, ending in lots of interesting discussions and new excitement in Matrix!

WebRTC Summit (Santa Clara, November 4-6)

Matrix was a sponsor at the Santa Clara WebRTC Summit at CloudExpo, and opened the WebRTC track alongside our friends at Open Peer / Hookflash. Matthew presented Matrix as the missing signalling layer for WebRTC and as a good federated complement to MQTT and COAP for IoT use cases: you can find his presentation here.

Great techie discussions and debates down there, the stand was flooded with interested people and John had a hardtime answering everyone by himself on day 2!

But he still found a few minutes to do a TV interview for SYSCon TV on Tuesday evening! :)

[embed]http://youtu.be/JVq6S9V1Jcg[/embed]

TAD Summit (Istanbul, November 12-13)

Matrix was a partner at TAD Summit in Istanbul this year, a great opportunity to meet a very good mix of developers, industry players and mobile networks! TAD mixes conferences and technical workshops where everyone gets involved to create a vibrant ecosystem for Telecom Application Developers. Again really productive discussions and meetings as we continue our search for partners to help support the uptake of Matrix.

Matthew's talk was fully recorded so just watch the video to get the real pitch!

[embed]http://youtu.be/ER3g4-4bFYk?list=PLO-gJ4-4x_IIYVTuLmVr8iUedvVdduYY4[/embed]

[embed]https://www.youtube.com/watch?v=As-5vVdXhu0[/embed]

WebRTC World (San Jose, November 18-20)

Matrix's attendance at WebRTC World in San Jose was more rewarding than expected! The team was ready to be part of the expo and give a talk on FOSS WebRTC options... but didn't hesitate to jump at the opportunity when a demo slot opened up! And that was a worthwhile decision as Matrix ended up winning not one but TWO awards from the demo: The Audience Choice Award as the audience's favourite demo of the 10 shown on Tuesday, and also the overall Best Social Integration Award from the Jury! So a big congrats to the dev team who were rushing to get the fine details ready in time and to Matthew for getting the audience's attention! And of course a even bigger thank you to everyone who voted for us, including in the Jury!

Matthew at WebRTC World 2014

Of course this drew lots of interest, and WebRTC Expo ended up the busiest show ever for the team who pitched solidly at the booth for 2 days in a row!

Audience_Choice_14 Best_Social_Integration_14

fOSSa (Rennes, November 20)

And eventually, while Matthew and John were celebrating in San José (or flying home, more accurately), Amandine was also evangelising at home in Rennes (France), where fOSSa was gathering experts from the opensource world for 3 days. Matrix was presented within the Serendipity section on the conférence, "Le Carrefour des Possibles": 6 minutes to pitch an open project that making dreams possible.

So if you speak French or are not afraid to only read from the slides, check out the video the team made of the pitch. The official one should be available soon!

[embed]http://youtu.be/DyL9Ue0KlBU[/embed]

Synapse 0.5.3a released!

29.11.2014 00:00 — TechMatthew Hodgson

Since we exited alpha and released Synapse 0.5.0 last week there's been a flurry of bug fix releases as we ran around firefighting some of the more exciting problems which popped up thanks to merging the federation-auth and event-signing branches.

We released 0.5.3a on Nov 27, which seems to now be pretty stable - if you were holding off on upgrading your homeserver and trying to federate with the new 0.5 release branch, now would be a great time to press the button!

Most excitingly, we believe we have finally fixed the PyNaCL dependency problems which have plagued pretty much anyone setting up a homeserver. This was a problem in PyNaCL itself - huge thanks to Mark for hunting it down and sending the PyNaCL team pull requests to get it fixed. As a result, installing synapse as of 0.5.3a really should be a one-liner at last (please let us know if it isn't!):

pip install --user --process-dependency-links https://github.com/matrix-org/synapse/tarball/master

The full changelog of what's been going on since 0.5.0 is as follows:

Changes in synapse 0.5.3a (2014-11-27)
=====================================

 * Depend on a fixed version of PyNaCL
 * Fix bug that caused joining a remote room to fail if a single event was not
   signed correctly.
 * Fix bug which caused servers to continuously try and fetch events from other
   servers.

Changes in synapse 0.5.2 (2014-11-26)
=====================================

 * Fix major bug that caused rooms to disappear from people's initial sync.

Changes in synapse 0.5.1 (2014-11-26)
=====================================
See UPGRADES.rst for specific instructions on how to upgrade.

 * Fix bug where we served up an Event that did not match its signatures.
 * Fix regression where we no longer correctly handled the case where a
   homeserver receives an event for a room it doesn't recognise (but is in.)

Don't miss Matrix in tonight's #vuc session!

28.11.2014 00:00 — GeneralAmandine Le Pape

Crazy session tonight at 5pm UK time (12 Noon Eastern Time; 9AM Pacific) on VUC as Matrix, Truphone and Jitsi were crazy enough to hack a federated demo in 48h!

Join us live for the demo from the inside by using Matrix to attend the conference (see steps below)! No browser supporting WebRTC at hand but still willing to play with Matrix? You can also follow the chatroom (bridged to IRC) by entering #vuc:matrix.org.

For other connection means:

Steps to join the call from Matrix:
  1. Register on Matrix from Chrome if not already done :)
  2. Start a chat with @vucbot:matrix.org by entering the ID in the appropriate textfield at the bottom of the public rooms list on http://matrix.org/beta and click on "Message User"
  3. In the chat room start a voice call by clicking on the mic icon in the top right corner. Don't forget to allow your browser to access your mic and speakerphones!
vuc