<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>ClintonEbadi/JitsiMeet</title><revhistory><revision><revnumber>39</revnumber><date>2021-02-09 04:31:24</date><authorinitials>ClintonEbadi</authorinitials><revremark>link to debian postinst scripts, contains some clues as to why the puppet module is totally broken</revremark></revision><revision><revnumber>38</revnumber><date>2021-02-09 03:58:48</date><authorinitials>ClintonEbadi</authorinitials><revremark>need to update nginx config, turnserver</revremark></revision><revision><revnumber>37</revnumber><date>2021-02-05 19:13:44</date><authorinitials>ClintonEbadi</authorinitials><revremark>some leads on breakout room support</revremark></revision><revision><revnumber>36</revnumber><date>2021-01-21 01:13:11</date><authorinitials>ClintonEbadi</authorinitials><revremark>doesn't look like we have to set the unencrypted auth option</revremark></revision><revision><revnumber>35</revnumber><date>2021-01-21 01:10:42</date><authorinitials>ClintonEbadi</authorinitials><revremark>actually no tokens, just have to actually load the modules into the prosody vhost and whatnot</revremark></revision><revision><revnumber>34</revnumber><date>2021-01-21 00:51:12</date><authorinitials>ClintonEbadi</authorinitials><revremark>using sasl requires using tokens or something</revremark></revision><revision><revnumber>33</revnumber><date>2020-12-08 05:09:02</date><authorinitials>ClintonEbadi</authorinitials><revremark>enablelayersuspension is very important</revremark></revision><revision><revnumber>32</revnumber><date>2020-12-08 04:53:57</date><authorinitials>ClintonEbadi</authorinitials><revremark>link to pwa-worker.js that seems to work</revremark></revision><revision><revnumber>31</revnumber><date>2020-12-08 04:40:27</date><authorinitials>ClintonEbadi</authorinitials><revremark>finding some fun bits while tightening up a default install</revremark></revision><revision><revnumber>30</revnumber><date>2020-12-07 18:29:57</date><authorinitials>ClintonEbadi</authorinitials><revremark>found an entire document dedicated to self-hosting jitsi meet, looked solid on first glance</revremark></revision><revision><revnumber>29</revnumber><date>2020-12-07 01:02:36</date><authorinitials>ClintonEbadi</authorinitials><revremark>note to self to check if the puppet module is using the deprecated nginx vhost style</revremark></revision><revision><revnumber>28</revnumber><date>2020-12-02 04:59:29</date><authorinitials>ClintonEbadi</authorinitials><revremark>auth domain is wonky</revremark></revision><revision><revnumber>27</revnumber><date>2020-12-02 03:48:15</date><authorinitials>ClintonEbadi</authorinitials><revremark>we have a combined pem, the puppet module doesn't like that</revremark></revision><revision><revnumber>26</revnumber><date>2020-09-02 19:32:06</date><authorinitials>ClintonEbadi</authorinitials><revremark>another thread</revremark></revision><revision><revnumber>25</revnumber><date>2020-09-02 19:29:46</date><authorinitials>ClintonEbadi</authorinitials><revremark>found a couple of threads discussing performance tuning</revremark></revision><revision><revnumber>24</revnumber><date>2020-08-24 22:31:59</date><authorinitials>ClintonEbadi</authorinitials></revision><revision><revnumber>23</revnumber><date>2020-08-24 21:22:50</date><authorinitials>ClintonEbadi</authorinitials><revremark>might be worth trying jitsi meet with ejabberd</revremark></revision><revision><revnumber>22</revnumber><date>2020-08-24 05:38:19</date><authorinitials>ClintonEbadi</authorinitials><revremark>big blue button as a possible alternative</revremark></revision><revision><revnumber>21</revnumber><date>2020-08-22 20:59:14</date><authorinitials>ClintonEbadi</authorinitials><revremark>also need to set jicofo heap limit</revremark></revision><revision><revnumber>20</revnumber><date>2020-08-22 20:54:54</date><authorinitials>ClintonEbadi</authorinitials><revremark>make sure we tune ram allocation</revremark></revision><revision><revnumber>19</revnumber><date>2020-08-14 18:52:42</date><authorinitials>ClintonEbadi</authorinitials><revremark>prejoinPageEnabled looks useful</revremark></revision><revision><revnumber>18</revnumber><date>2020-08-13 04:53:04</date><authorinitials>ClintonEbadi</authorinitials><revremark>edumeet might not be worth evaluating after all</revremark></revision><revision><revnumber>17</revnumber><date>2020-08-13 04:50:39</date><authorinitials>ClintonEbadi</authorinitials></revision><revision><revnumber>16</revnumber><date>2020-08-13 04:49:14</date><authorinitials>ClintonEbadi</authorinitials><revremark>edumeet may also be worth evaluating</revremark></revision><revision><revnumber>15</revnumber><date>2020-08-12 20:49:59</date><authorinitials>ClintonEbadi</authorinitials><revremark>we need to set     fileRecordingsEnabled: false</revremark></revision><revision><revnumber>14</revnumber><date>2020-08-10 22:34:42</date><authorinitials>ClintonEbadi</authorinitials><revremark>some initial test data, open issues to explore</revremark></revision><revision><revnumber>13</revnumber><date>2020-08-10 22:32:55</date><authorinitials>ClintonEbadi</authorinitials><revremark>heading level fix</revremark></revision><revision><revnumber>12</revnumber><date>2020-08-10 21:50:36</date><authorinitials>ClintonEbadi</authorinitials><revremark>couldn't get branding url to work</revremark></revision><revision><revnumber>11</revnumber><date>2020-08-10 21:32:58</date><authorinitials>ClintonEbadi</authorinitials><revremark>few interface settings we might want to tweak in addition to the ones the fsf tweaks</revremark></revision><revision><revnumber>10</revnumber><date>2020-08-10 21:21:40</date><authorinitials>ClintonEbadi</authorinitials></revision><revision><revnumber>9</revnumber><date>2020-08-10 21:21:24</date><authorinitials>ClintonEbadi</authorinitials><revremark>there's some apache support, maybe</revremark></revision><revision><revnumber>8</revnumber><date>2020-08-10 21:15:10</date><authorinitials>ClintonEbadi</authorinitials><revremark>etherpad might be nice to have</revremark></revision><revision><revnumber>7</revnumber><date>2020-08-10 21:10:57</date><authorinitials>ClintonEbadi</authorinitials><revremark>open question about youtube</revremark></revision><revision><revnumber>6</revnumber><date>2020-08-10 20:44:49</date><authorinitials>ClintonEbadi</authorinitials><revremark>some config settings we probably want to change</revremark></revision><revision><revnumber>5</revnumber><date>2020-08-10 20:28:31</date><authorinitials>ClintonEbadi</authorinitials><revremark>some bits from the fsf config we probably want</revremark></revision><revision><revnumber>4</revnumber><date>2020-08-10 03:45:12</date><authorinitials>ClintonEbadi</authorinitials></revision><revision><revnumber>3</revnumber><date>2020-08-10 03:01:32</date><authorinitials>ClintonEbadi</authorinitials><revremark>securing the domain is useful</revremark></revision><revision><revnumber>2</revnumber><date>2020-08-10 02:55:59</date><authorinitials>ClintonEbadi</authorinitials></revision><revision><revnumber>1</revnumber><date>2020-08-10 02:41:24</date><authorinitials>ClintonEbadi</authorinitials><revremark>trying out a jitsi meet install</revremark></revision></revhistory></articleinfo><para>Notes on setting up <ulink url="https://jitsi.org/jitsi-meet/">Jitsi Meet</ulink> on a personal server. Main thing is to note what we'd need to do to get this set up on an hcoop server </para><section><title>Setup Script</title><para><ulink url="https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart"/> </para><para>Followed the script and got a working install. </para><itemizedlist><listitem><para>We'll need to set config to provide our own cert </para></listitem><listitem><para>jitsi-meet needs nginx out of the box </para><itemizedlist><listitem><para><code>/etc/nginx/sites-available/sites-available/meet.unknownlamer.org.conf</code> </para></listitem></itemizedlist></listitem><listitem><para>Has its own xmpp server, prosidy (I think in theory we could integrate the videobridge with jabber but in practice probably not worth it at our scale) </para></listitem></itemizedlist><para>Working config out of the box, if we accept having to run this on a dedicated server. </para></section><section><title>Puppet Module Notes</title><para><ulink url="https://gitlab.com/shared-puppet-modules-group/jitsimeet"/> </para><para>The puppet modules has a few rough edges that we should fix and contribute upstream. </para><section><title>Check for Staleness</title><itemizedlist><listitem><para>Since I installed meet.unknownlamer.org in July, jitsi has changed something with the vhost structure to avoid multiplexing: <ulink url="https://jitsi.github.io/handbook/docs/devops-guide/faq#how-to-migrate-away-from-multiplexing-and-enable-bridge-websockets"/>, make sure puppet is generating a config which doesn't do this </para><itemizedlist><listitem><para>Generated config does not work at all... review postinst for clues: </para><itemizedlist><listitem><para><ulink url="https://github.com/jitsi/jitsi-meet/blob/master/debian/jitsi-meet-prosody.postinst"/> </para></listitem><listitem><para><ulink url="https://github.com/jitsi/jicofo/blob/master/debian/postinst"/> </para></listitem><listitem><para><ulink url="https://github.com/jitsi/jitsi-videobridge/blob/master/debian/postinst"/> </para></listitem></itemizedlist></listitem></itemizedlist></listitem></itemizedlist></section><section><title>Not sure if it's just me or not</title><itemizedlist><listitem><para><code>jitsimeet::config</code> created an LE cert for <code>&quot;auth.${jitsimeet::jitsi_domain}&quot;</code>, and using the hcoop wildcard cert we get a cert error, which does not occur on my test instance despite only having a cert for <code>Subject: CN = meet.unknownlamer.org</code> (no wildcard) </para><screen><![CDATA[Jicofo 2020-12-01 23:55:37.933 WARNING: [505] org.jivesoftware.smack.AbstractXMPPConnection.callConnectionClosedOnErrorListener() Connection XMPPTCPConnection[not-authenticated] (0) closed with error
java.security.cert.CertificateException: Hostname verification of certificate failed. Certificate does not authenticate auth.meet-test.hcoop.net
        at org.jivesoftware.smack.tcp.XMPPTCPConnection.proceedTLSReceived(XMPPTCPConnection.java:820)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection.access$1200(XMPPTCPConnection.java:151)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1071)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:1000)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:1016)
        at java.base/java.lang.Thread.run(Thread.java:834)]]></screen></listitem></itemizedlist></section><section><title>Defects</title><itemizedlist><listitem><para>Forced to set <code>jitsi_vhost_ssl_key</code> and <code>auth_vhost_ssl_key</code> even when using combined PEM. </para></listitem><listitem><para>Does not configure turnserver, which is <ulink url="https://jitsi.github.io/handbook/docs/devops-guide/faq#how-to-migrate-away-from-multiplexing-and-enable-bridge-websockets">needed for websockets</ulink> </para></listitem><listitem><para>Nginx config is stale, doesn't work with websockets (and needed config options aren't set), and the mobile client can't connect at all </para></listitem></itemizedlist></section></section><section><title>Testing</title><para>Using <ulink url="https://meet.unknownlamer.org"/> on my personal <ulink url="https://wiki.hcoop.net/ClintonEbadi/JitsiMeet/DigitalOcean#">DigitalOcean</ulink> account. With a 2CPU/2G RAM setup, a 4 person conference used around 4Mbps and 10% CPU. </para><section><title>Things to look out for</title><itemizedlist><listitem><para>MIME type <code>application/wasm                      wasm;</code> was not set, appearing to cause chromium/firefox to just not use any of the wasm which seems bad for performance </para></listitem><listitem><para><ulink url="https://raw.githubusercontent.com/jitsi/jitsi-meet/0d7a7304977b136941547713773d48e472ac91b2/pwa-worker.js">pwa-worker.js</ulink> is missing in stable release packaging 1.0.4466-1 (<ulink url="https://github.com/jitsi/jitsi-meet/issues/8024">Fixed in 4480</ulink>) </para></listitem></itemizedlist></section></section><section><title>Security</title><para><ulink url="https://jitsi.github.io/handbook/docs/devops-guide/secure-domain"/> </para><para>Need to adapt to kerberos, will have to use SASL: <ulink url="https://prosody.im/doc/cyrus_sasl"/> (we have saslauthd in place for exim, so should be straightforward) </para><para>There are some additional steps to auth against sasl:  </para><itemizedlist><listitem><para><ulink url="https://github.com/jitsi/jitsi-meet/wiki/LDAP-Authentication#ldap-authentication-for-jitsi-meet-via-cyrussaslauthd"/> </para></listitem></itemizedlist><para><code>lua-cyrussasl</code> must be installed from <code>buster-backports</code> on Debian 10. </para><para>/etc/prosody/conf.avail/meet-test.hcoop.net.cfg.lua : </para><screen><![CDATA[...
VirtualHost "meet-test.hcoop.net"
    -- enabled = false -- Remove this line to enable this host
    authentication = "cyrus"
    cyrus_application_name = "xmpp"
    --allow_unencrypted_plain_auth = true -- is this safe ? / it worked fine without it
...
    modules_enabled = {
        "auth_cyrus";
...
    }
...]]></screen><para>/etc/sasl/xmpp.conf: </para><screen><![CDATA[pwcheck_method: saslauthd
mech_list: PLAIN]]></screen></section><section><title>Open Questions</title><itemizedlist><listitem><para>Can we limit room sizes? </para></listitem></itemizedlist></section><section><title>FSF setup</title><para><ulink url="https://vcs.fsf.org/?p=jitsi-ansible.git"/> review </para><section><title>Useful snippets</title><screen><![CDATA[- name: custom css
  lineinfile:
    path: /usr/share/jitsi-meet/css/all.css
    line: ".header-text-description, .unsupported-desktop-browser__description {display:none!important}"
]]><![CDATA[
- name: fellow hacker
  replace:
    path: /usr/share/jitsi-meet/interface_config.js
    regexp: "Fellow Jitster"
    replace: "Fellow Hacker"
]]><![CDATA[
- name: link
  replace:
    path: /usr/share/jitsi-meet/interface_config.js
    regexp: "https://jitsi.org"
    replace: "https://{{ inventory_hostname }}/"
]]><![CDATA[
]]><![CDATA[
- name: hide logo
  replace:
    path: /usr/share/jitsi-meet/interface_config.js
    regexp: "SHOW_WATERMARK_FOR_GUESTS: true,"
    replace: "SHOW_WATERMARK_FOR_GUESTS: false,"
]]><![CDATA[
- name: hide logo
  replace:
    path: /usr/share/jitsi-meet/interface_config.js
    regexp: "SHOW_JITSI_WATERMARK: true,"
    replace: "SHOW_JITSI_WATERMARK: false,"
]]><![CDATA[
]]><![CDATA[
- name: copy watermark logo
  copy:
    src: files/LPlogo.png
    dest: /usr/share/jitsi-meet/images/watermark.png
    owner: root
    group: root
    mode: 0444
  when: j.stat.exists]]></screen></section><section><title>Custom index</title><para><ulink url="https://vcs.fsf.org/?p=jitsi-ansible.git;a=blob;f=files/index.html;h=ab0a76f3973b53069ec884b7dcea67931c585a5f;hb=HEAD"/> </para><para>We'll want to customize the css at least to match our usual color schema and insert the hcoop logo, and something like the blurb about the coop we include on git.hcoop.net </para><para>Also, do we want to add librejs info? Not sure what the licensing on the youtube stuff is... </para></section></section><section><title>Config changes</title><itemizedlist><listitem><para>If we leave youtube support on, do we need to generate our own API keys, or is using the ones built into jitsi fine? <ulink url="https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-web-integrations"/> </para></listitem></itemizedlist><section><title>Performance</title><itemizedlist><listitem><para><ulink url="https://community.jitsi.org/t/maximum-number-of-participants-on-a-meeting-on-meet-jit-si-server/22273">Thread on serving a large number of users</ulink> </para></listitem><listitem><para><ulink url="https://community.jitsi.org/t/reducing-resource-usage-to-improve-performance-both-client-side-and-server-side/39891">Another thread on reducing cpu use</ulink> </para></listitem><listitem><para><ulink url="https://community.jitsi.org/t/host-a-meeting-with-500-people-ideas/34672/4">Discussing hosting 500 person meetings</ulink> (not feasible, but some advice there) </para></listitem><listitem><para><ulink url="https://jitsi-club.gitlab.io/jitsi-self-hosting/en/01-deployment-howto/03-tuning/">Jitsi Club Self-Hosting Tuning Guide</ulink> worth a review </para></listitem></itemizedlist><para>Recommends disabling currently speaking dot to lower client and server cpu use (fsf does this, I left it on in my testing instance): the detection apparently uses quite a bit of CPU. </para><para>Further suggested tweaks to reduce client cpu use: </para><screen><![CDATA[disableAudioLevels: true
]]><![CDATA[
DISABLE_JOIN_LEAVE_NOTIFICATIONS: true,
DISABLE_VIDEO_BACKGROUND: true,
DISABLE_FOCUS_INDICATOR: true,
DISABLE_DOMINANT_SPEAKER_INDICATOR: true,
DISABLE_VIDEO_BACKGROUND: true,]]></screen></section><section><title>/etc/jitsi/meet/meet.hcoop.net-config.js</title><itemizedlist><listitem><para><code>fileRecordingsEnabled</code> defaults to true, since we will not support dropbox integration and don't want local recordings, we should set this to <code>false</code> to hide the interface elements that don't work </para></listitem><listitem><para><code>resolution: 720</code> is the default (so 720p) max resolution, which seems reasonable for video conferencing </para></listitem><listitem><para>Jiti by defaults starts with the mic and camera of participants on. The FSF starts with participants muted. I think that would be a more reasonable, privacy respecting default? Alternatively, we could set <code>prejoinPageEnabled</code> which allows participants to set or disable their camera/mic and set their nickname before entering the room </para><screen><![CDATA[    // Every participant after the Nth will start audio muted.
    // startAudioMuted: 10,
]]><![CDATA[
    // Start calls with audio muted. Unlike the option above, this one is only
    // applied locally. FIXME: having these 2 options is confusing.
    // startWithAudioMuted: false,
]]><![CDATA[
    // Every participant after the Nth will start video muted.
    // startVideoMuted: 10,
]]><![CDATA[
    // Start calls with video muted. Unlike the option above, this one is only
    // applied locally. FIXME: having these 2 options is confusing.
    // startWithVideoMuted: false,]]></screen></listitem><listitem><para>should we use our own STUN server instead of the default provided by jitsi?: </para><screen><![CDATA[         stunServers: [
]]><![CDATA[
            // { urls: 'stun:meet.unknownlamer.org:3478' },
            { urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' }
        ]]]></screen></listitem><listitem><para>Instead of patching internal data, maybe we could just have a static json file on hcoop.net and use this to override logos? (My attempt to get this work on my local install didn't work, the react frontend should be making a request to brandingDataUrl but it never does for me)  </para><screen><![CDATA[    /**
     External API url used to receive branding specific information.
     If there is no url set or there are missing fields, the defaults are applied.
     None of the fields are mandatory and the response must have the shape:
     {
         // The hex value for the colour used as background
         backgroundColor: '#fff',
         // The url for the image used as background
         backgroundImageUrl: 'https://example.com/background-img.png',
         // The anchor url used when clicking the logo image
         logoClickUrl: 'https://example-company.org',
         // The url used for the image used as logo
         logoImageUrl: 'https://example.com/logo-img.png'
     }
    */
    // brandingDataUrl: '',]]></screen></listitem><listitem><para>Maybe some bandwidth savings to be had? </para><screen><![CDATA[    // Enable / disable layer suspension.  If enabled, endpoints whose HD
    // layers are not in use will be suspended (no longer sent) until they
    // are requested again.
    // enableLayerSuspension: false,
]]><![CDATA[
    // Optional desktop sharing frame rate options. Default value: min:5, max:5.
    // desktopSharingFrameRate: {
    //     min: 5,
    //     max: 5
    // },]]></screen></listitem></itemizedlist><para>Update: yes, <code>enableLayerSuspension: true</code> is essential, it's not clear why it is not enabled by default at all. </para><itemizedlist><listitem><para>Misc </para><screen><![CDATA[    // Require users to always specify a display name.
    // requireDisplayName: true,
]]><![CDATA[
    // If true, shows the unsafe room name warning label when a room name is
    // deemed unsafe (due to the simplicity in the name) and a password is not
    // set or the lobby is not enabled.
    // enableInsecureRoomNameWarning: false,
]]><![CDATA[
    // Privacy
    //
]]><![CDATA[
    // If third party requests are disabled, no other server will be contacted.
    // This means avatars will be locally generated and callstats integration
    // will not function.
    // disableThirdPartyRequests: false,]]></screen></listitem></itemizedlist></section><section><title>/usr/share/jitsi-meet/interface_config.js</title><itemizedlist><listitem><para>Override mobile download link to use F-Droid? </para><screen><![CDATA[    /**
     * Specify custom URL for downloading android mobile app.
     */
    // MOBILE_DOWNLOAD_LINK_ANDROID: 'https://play.google.com/store/apps/details?id=org.jitsi.meet',]]></screen></listitem><listitem><para>Might want/need to customize these </para><screen><![CDATA[    JITSI_WATERMARK_LINK: 'https://jitsi.org',
    POLICY_LOGO: null,
    PROVIDER_NAME: 'Jitsi',
    SHOW_POWERED_BY: false,
    SUPPORT_URL: 'https://community.jitsi.org/', /* probably should point to our support */
    TOOLBAR_BUTTONS: [ ... ] /* disable things like video recording that we aren't going to support */
    // HIDE_KICK_BUTTON_FOR_GUESTS: false,]]></screen></listitem></itemizedlist></section><section><title>/usr/share/jitsi-meet/logging_config.js</title><para>Make sure we don't log more than the bare minimum. </para></section><section><title>/etc/jitsi/videobridge/config</title><itemizedlist><listitem><para><code>VIDEOBRIDGE_MAX_MEMORY</code> is converted to java <code>-Xmx</code>, make sure to tune appropriately for available ram on the server </para></listitem></itemizedlist></section><section><title>/etc/jitsi/jicofo/config</title><itemizedlist><listitem><para><code>JICOFO_MAX_MEMORY</code> is converted to java <code>-Xmx</code>, make sure to tune appropriately for available ram on the server </para></listitem></itemizedlist></section></section><section><title>Add-Ons / Etc</title><itemizedlist><listitem><para><ulink url="https://github.com/jitsi/jitsi-meet/wiki/Etherpad-addition-example">Etherpad integration</ulink> not sure how complete this is, but could be useful </para></listitem><listitem><para>Packages come with an example apache config <code>/usr/share/jitsi-meet-web-config/jitsi-meet.example-apache</code>. Looks like all directives would work with domtool. </para></listitem><listitem><para><ulink url="https://blog.windfluechter.net/content/blog/2020/06/19/1759-jitsi-meet-and-ejabberd"/> it appears possible to use ejabberd instead of prosody if we want to integrate this with existing infrastructure </para></listitem><listitem><para><ulink url="https://jitsi.github.io/handbook/docs/community/breakout-rooms"/> there are several addon components that add break out room support </para></listitem></itemizedlist></section><section><title>Possible Alternatives</title><itemizedlist><listitem><para><ulink url="https://github.com/edumeet/edumeet"/> promises better performance by using VP9 instead of VP8 (40% reduced bandwidth). Advantage might be negated soon: <ulink url="https://community.jitsi.org/t/flagship-vp9-support-notes-and-discussion/33921/66">Jitsi Meet has VP9 support actively under development</ulink>. </para></listitem><listitem><para><ulink url="https://docs.bigbluebutton.org/"/> according to <ulink url="https://wiki.hcoop.net/ClintonEbadi/JitsiMeet/JackHill#">JackHill</ulink> <ulink url="https://wiki.hcoop.net/ClintonEbadi/JitsiMeet/BigBlueButton#">BigBlueButton</ulink> may have more compatibility. It also integrates evernote and other nice things like breakout rooms, useful if we want to target organizations for membership. </para></listitem></itemizedlist></section></article>