% bandali-jami-libreplanet-2021.tex --- Jami and how it empowers users -*-latex-*-
  
% Copyright (C) 2021 Amin Bandali <bandali@gnu.org>

% This presentation is free software: you can redistribute it and/or
% modify it under the terms of the GNU General Public License as
% published by the Free Software Foundation, either version 3 of the
% License, or (at your option) any later version.

% This presentation is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.

% You should have received a copy of the GNU General Public License
% along with this presentation.  If not, see
% <https://www.gnu.org/licenses/>.


\documentclass[presentation]{beamer}

\def\name{Amin Bandali}
\def\mail{bandali@gnu.org}
\def\talktitle{Jami and how it empowers users}
\def\venue{LibrePlanet 2021}

%% ===================================================================
%% Packages
%% ===================================================================

\usepackage{pgfpages}
\setbeameroption{hide notes}
%% \setbeameroption{show only notes}
%% \setbeameroption{show notes on second screen=right}

%% fonts
\usepackage{fontspec}
\setsansfont{DraftingMono}
\newfontfamily{\drafting}{DraftingMono}
\newfontfamily{\draftingmed}{DraftingMono-Medium}
\newfontfamily{\sachac}[Scale=1.25]{sachacHand}

\usepackage{caption}
\usepackage{xcolor}
\usepackage{float}
\usepackage{tikz}
\usepackage{hyperref}
\usepackage{setspace}
\setstretch{1.1}
\titlegraphic{\vspace{1em}%
  \includegraphics[width=.06\paperwidth]{g/jami}}
\author{\name}
\date{\venue}
\title{\talktitle}
\definecolor{bblue}{HTML}{1068bf}
\hypersetup{
  pdfinfo={
    CreationDate={D:20210320004037-04'00'},
  },
  pdfauthor={\name},
  pdftitle={\talktitle},
  pdfkeywords={LibrePlanet, Conference, Jami, Communication,%
    Free Software, Empowering Users},
  pdfsubject={LibrePlanet 2021 Conference},
  pdfcreator={GNU Emacs 28.0.50},
  pdflang={English},
  colorlinks=true,    % false: boxed links
  linkcolor=bblue,    % colour of internal links
  filecolor=magenta,  % colour of file links
  urlcolor=bblue      % colour of external links
}

%% ===================================================================
%% Colour Definitions and Settings
%% ===================================================================

\definecolor{bgrey}{HTML}{EBEAE4}
\definecolor{bgreydarker}{HTML}{D9D8D1}
\setbeamercolor{background canvas}{bg=bgrey}
\setbeamercolor{structure}{fg=black}

%% ===================================================================
%% Beamer customizations (templates, ...)
%% ===================================================================

\makeatletter
\setbeamertemplate{title page}{
  \vbox{}
  \vfill
  \begingroup
    \centering
    \begin{beamercolorbox}[sep=8pt,center]{title}
      \usebeamerfont{title}\inserttitle\par%
      \ifx\insertsubtitle\@empty%
      \else%
        \vskip0.25em%
        {\usebeamerfont{subtitle}%
          \usebeamercolor[fg]{subtitle}\insertsubtitle\par}%
      \fi%
    \end{beamercolorbox}%
    % \vskip1em\par
    \vskip0.5em
    % \begin{beamercolorbox}[sep=8pt,center]{institute}
    %   \usebeamerfont{institute}\insertinstitute
    % \end{beamercolorbox}
    \begin{beamercolorbox}[sep=8pt,center]{date}
      \usebeamerfont{date}\insertdate
    \end{beamercolorbox}\vskip0.5em
    \begin{beamercolorbox}[sep=6pt,center]{author}
      \usebeamerfont{author}\insertauthor
    \end{beamercolorbox}
    %% \vskip-1em
    {\usebeamercolor[fg]{titlegraphic}\inserttitlegraphic\par}
  \endgroup
  %% \vfill
}
\makeatother

%% disable footline navigation links
\beamertemplatenavigationsymbolsempty

%% custom size and alignment for itemize bullets
\setbeamertemplate{itemize items}%
                  {\raisebox{-0.4em}{\scalebox{2.5}{$\cdot$}}}

%% tweak the styling of the notes pages
\setbeamercolor{note page}{bg=yellow!5}
\setbeamercolor{note title}{bg=gray!6}
\setbeamercolor{note date}{fg=gray!6} % hide date

\setbeamerfont{title}{family=\drafting, series=\bfseries}
\setbeamerfont{author}{family=\sachac}
\setbeamerfont{date}{family=\draftingmed}
\setbeamerfont{frametitle}{series=\bfseries}

%% align frametitle with the frame body text
%% \makeatletter
%% \setbeamertemplate{frametitle}[default][left,%
%%   leftskip=\the\dimexpr\beamer@leftmargin-0.3cm\relax]
%% \makeatother

%% symmetric vertical centering
\makeatletter
\define@key{beamerframe}{c}[true]{%
  \beamer@frametopskip=0pt plus 1fill\relax%
  \beamer@framebottomskip=0pt plus 1fill\relax% instead of 1.5fill
}
\makeatother

%% show faded overlays
\setbeamercovered{transparent}

%% ===================================================================
%% Custom symbols or commands
%% ===================================================================

%% for continuous enumerate numbers when needed
\newcounter{cenumi}
\newcommand{\saveenumi}{\setcounter{cenumi}{\value{enumi}}}
\newcommand{\loadenumi}{\setcounter{enumi}{\value{cenumi}}}
\resetcounteronoverlays{cenumi}

\let\oldhref\href
\renewcommand{\href}[2]{\oldhref{#1}{\ttfamily\bfseries#2}}

%% \def\UrlFont{\ttfamily\bfseries}

%% ===================================================================
%% The document (slides)
%% ===================================================================

\begin{document}


{
  \setbeamercolor{background canvas}{bg=bgreydarker}
  \frame[plain]{\titlepage}
  \note{hello, and thank you for the introduction!\\
    so, let's talk about \talktitle\par}
}

\section[label={sec:intro}]{Introduction}

\begin{frame}[label={frm:what}, plain]{}
  \centering
  {\LARGE\textbf{What is Jami?}}%
\end{frame}

{
  \setbeamertemplate{background}{%
    \tikz[overlay, remember picture]%
    \node[opacity=0.1, at=(current page.center)]{%
      \includegraphics[height=0.7\paperheight]{g/jami}};%
  }
  \begin{frame}[label={frm:what}, plain]{}
    \small
    \begin{center}
      \begin{minipage}{.93\linewidth}
        \textbf{Jami} is free software for universal communication
        that respects the freedom and privacy of its users
      \end{minipage}
    \end{center}
    \note{GNU package for universal communication\par}
  \end{frame}
}

\begin{frame}[label={frm:sfl}, plain]{}
  \small
  \begin{center}
    \vspace*{-2.5em}
    \includegraphics[width=0.4\paperwidth]{g/sfl}
    \vspace*{2.25em}

    \begin{minipage}{.93\linewidth}
      Jami is developed by
      \textbf{Savoir-faire Linux}\textsuperscript{\textregistered}
      based in Montr\'{e}al, Canada.  Savoir-faire Linux is a team
      of free software consultants providing training, consulting,
      development, and support services for free software
      technologies.
    \end{minipage}
  \end{center}
\end{frame}

\begin{frame}[label={frm:feats}, plain]{}
  \begin{itemize}
    \item one-on-one conversations
    \item file sharing
    \item audio/video calls \& conferences
    \item screen sharing in video calls \& conferences
    \item recording \& sending audio/video messages
    \item SIP phone software functionality
    \item cross-platform communication framework
  \end{itemize}
  \note{some of the high-level features of Jami include \ldots\par}
\end{frame}

\section[label={sec:arch}]{Architecture overview}

\begin{frame}[label={frm:arch}, plain]{}
  \centering
  {\LARGE\textbf{Architecture overview}}%
\end{frame}

\begin{frame}[label={frm:archg}, plain]{}
  \centering
  \begin{figure}
    \vspace{-3em}
    \includegraphics[width=\textwidth]{g/arch}
    \vspace{-6em}
    \caption*{\footnotesize Architecture \& components of Jami}
  \end{figure}
  \note{Jami's architecture can be divided into three layers:

    \begin{enumerate}
    \item daemon: core of Jami.  is not user-facing, and contains all
      the connectivity, communication, crypto, media, etc logic.
      interacts with libs like opendht, pjsip, ffmpeg, and so on.
      has several APIs, namely: dbus, libwrap, JNI, REST
    \item lrc: depends on QtCore and interfaces with the daemon,
      providing shared code for clients across several platforms
      (except for android)
    \item clients: or frontends, which are user-facing applications
      that Jami users interact with
    \end{enumerate}\par}
\end{frame}

\begin{frame}[label={frm:archdef}, plain]{}
  \begin{center}
    Jami is

    \medskip

    \begin{minipage}{.67\linewidth}
      an \textbf{end-to-end encrypted} secure and \textbf{distributed}
      voice, video, and chat \textbf{communication platform} that
      requires \textbf{no central server} and leaves the power of
      \textbf{privacy} and \textbf{freedom} in the hands of
      \emph{users}
    \end{minipage}
  \end{center}
\end{frame}

\begin{frame}[label={frm:net}, plain]{}
  \centering
  \begin{figure}
    \begin{minipage}[b]{0.32\textwidth}
      \centering
      \includegraphics[width=0.9\textwidth]{g/net-centralized}
      \caption*{\sachac{}Centralized}
    \end{minipage}
    \begin{minipage}[b]{0.32\textwidth}
      \centering
      \includegraphics[width=\textwidth]{g/net-decentralized}
      \caption*{\sachac{}Decentralized}
    \end{minipage}
    \begin{minipage}[b]{0.32\textwidth}
      \centering
      \includegraphics[width=0.62\textwidth]{g/net-distributed}
      \caption*{\sachac{}Distributed}
    \end{minipage}
  \end{figure}
  \note{typology of networks, dating back to the early 1960s.  from a
    research memorandum by paul baran, one of the two independent
    inventors of packet switching\par}
\end{frame}

\begin{frame}[label={frm:opendht}, plain]{}
  \vspace*{-1em}
  \begin{center}
    \textbf{OpenDHT}
    \raisebox{-0.3\height}%
             {\includegraphics[width=0.06\textwidth]{g/opendht}}
  \end{center}
  \note{establishing p2p connections today in the face of NATs and
    firewalls can be quite tricky.  so how does Jami achieve
    distributed communication?  OpenDHT is at the heart of Jami's
    p2p communication

    \bigskip

    C++14 distributed hash table implementation

    \bigskip

    API similar to mainline BitTorrent DHT

    \bigskip

    provides easy-to-use distributed in-memory key-value data store.
    every node in the network can read and write values to the store.
    values are distributed over the network, with redundancy.\par}

  \small
  \begin{itemize}
  \item lightweight and scalable, designed for\\
    large networks and small devices
  \item high resilience to network disruption
  \item IPv4 and IPv6 support
  \item clean and powerful C++14 \emph{map} API
  \item C, Rust, and Python 3 bindings
  \item public key crypto layer providing optional\\
    data signing and encryption (using GnuTLS)
  \item REST API with optional HTTP client+server\\
    and push notification support
  \end{itemize}
\end{frame}

%% \makeatletter
%% \newcounter{conn}
%% \@whilenum\value{conn}<7\do{
%%   \stepcounter{conn}
%%   \begin{frame}[label={frm:conn-0\theconn}, plain]{}
%%     \centering
%%     \includegraphics[width=\textwidth]{g/conn-0\theconn}
%%   \end{frame}
%% }
%% \makeatother

\begin{frame}[label={frm:conn-01}, plain]{}
  \centering
  \includegraphics[width=\textwidth]{g/conn-01}
  \note{say we have a network of users, including alice and bob
    who would like to establish a connection

    \bigskip

    the circle is our network and the points are nodes\par}
\end{frame}

\begin{frame}[label={frm:conn-02}, plain]{}
  \centering
  \includegraphics[width=\textwidth]{g/conn-02}
  \note{bob performs a \texttt{listen} operation on the network
    (typically served by closest node on the network), with
    the 160-bit key being the hash of his public key

    \bigskip

    the mailbox represents the `key' in the dictionary\par}
\end{frame}

\begin{frame}[label={frm:conn-03}, plain]{}
  \centering
  \includegraphics[width=\textwidth]{g/conn-03}
  \note{alice then performs a \texttt{put} operation at
    the same key, which bob will be immediately notified of
    and receive the value that was put on the dht

    \bigskip

    the value \texttt{put} on the dht (the blue envelope in
    the mailbox in our diagram) is an encrypted list of
    ICE candidates (IP addresses used to try and establish
    p2p communication)\par}
\end{frame}

\begin{frame}[label={frm:conn-04}, plain]{}
  \centering
  \includegraphics[width=\textwidth]{g/conn-04}
  \note{this is used to establish p2p communication using ICE
    (interactive connectivity establishment)\par}
\end{frame}

\begin{frame}[label={frm:conn-05}, plain]{}
  \centering
  \includegraphics[width=\textwidth]{g/conn-05}
  \note{over the ICE connection we establish a TLS connection

    \bigskip

    the connection is authenticated both ways:

    in contrast to web browsers where only clients authenticate
    the web servers and the servers typically don't authenticate
    clients using certs (but usually use other web technologies
    like SSO, cookie-based auth, etc), in Jami both parties
    exchange cert chains and check each other's certs and keys

    \bigskip

    we have a p2p authenticated e2e-encrypted connection,
    including if through a relay (via TURN) \ldots\par}
\end{frame}

\begin{frame}[label={frm:conn-06}, plain]{}
  \centering
  \includegraphics[width=\textwidth]{g/conn-06}
  \note{over which we do SIP (using pjsip)

    \bigskip

    we use SIP to negotiate the call and its parameters (like
    which audio and/or video codecs to use, etc)\par}
\end{frame}

\begin{frame}[label={frm:conn-07}, plain]{}
  \centering
  \includegraphics[width=\textwidth]{g/conn-07}
  \note{which we use to perform SRTP communication
    (Secure Real-time Transport Protocol) which carries
    the media streams

    \bigskip

    notice the key aspect of Jami establishing this
    p2p ICE communication without use of a central server
    and instead over the opendht distributed network\par}
\end{frame}

\section[label={sec:news}]{Development news}

\begin{frame}[label={frm:news}, plain]{}
  \centering
  {\LARGE\textbf{Development news}}%
  \note{some important recent or upcoming changes/features\par}
\end{frame}

\begin{frame}[label={frm:news-intro}, plain]{}
  \note{many fixes \& improvements throughout Jami's codebases

    \bigskip

    major UPnP refactoring adding handler for automatic
    port mapping provisioning to keep a pool of mappings
    ready for use for incoming or outgoing calls\par}
  \small
  \begin{itemize}
  \item many connectivity improvements
  \item automatic video bitrate adjustment
  \item detached host rendezvous points
  \item notification improvements
  \item bidi text in the chat view
  \item video renderer improvements
  \item conference call moderation
  \item improved error handling
  \item object copy reductions
  \item plugin API overhaul
  \item \ldots{} and more!
  \end{itemize}
\end{frame}

\begin{frame}[label={frm:rdv}, plain]{}
  \centering
  {\LARGE\textbf{Rendezvous points}}%
\end{frame}

\begin{frame}[label={frm:rdvscr}, plain]{}
  \centering
  \includegraphics[width=\textwidth]{g/rdv}
  \note{\footnotesize
    Jami has long supported group calls with multiple participants.
    rendezvous point accounts introduced last year take that to the
    next level, essentially allowing you to turn your machine running
    Jami into a conference server.

    \bigskip

    rendezvous points automatically answer incoming calls, and by
    default are in a `detached' or `headless' state and don't transmit
    the host's audio/video\par}
\end{frame}

\begin{frame}[label={frm:rdvscr2}, plain]{}
  \centering
  \includegraphics[width=\textwidth]{g/rdv2}
  \note{\footnotesize
    you can create new rendezvous point accounts or easily turn any
    existing account into a rendezvous point from the account settings
    page

    \bigskip

    rendezvous points help empower people who don't have the means or
    interest in setting up and running self-hosted instances of other
    free/libre conferencing tools like Jitsi and BigBlueButton\par}
\end{frame}

\begin{frame}[label={frm:plugins}, plain]{}
  \centering
  {\LARGE\textbf{Plugins}}%

  \note{are a new addition to the Jami universe

    \bigskip

    written in C++ using the ChatHandler and MediaHandler
    APIs of Jami daemon

    \bigskip

    Python SDK for easily creating new plugins from
    skeleton projects

    \bigskip

    AudioFilter: audio-related filters for audio/video
    calls. for instance, a reverb effect\par}
\end{frame}

\begin{frame}[label={frm:plugins-autoanswer}, plain]{}
  \centering
  \begin{figure}
    \includegraphics[width=\textwidth]{g/plugins-autoanswer}
    \caption*{\footnotesize AutoAnswer}
  \end{figure}
  \note{\footnotesize AutoAnswer:
    chat bot-like plugin for automated replies\par}
\end{frame}

\begin{frame}[label={frm:plugins-greenscreen}, plain]{}
  \centering
  \begin{figure}
    \includegraphics[width=\textwidth]{g/plugins-greenscreen}
    \caption*{\footnotesize GreenScreen}
  \end{figure}
  \note{GreenScreen: a neural network-based plugin for adding a green
    screen effect of putting you in the foreground of an image

    \bigskip

    note that the green screen feature of many other conferencing
    tools are either nonfree, or worse are SaaSS (Service as a
    Software Substitute), meaning that they send the data to remote
    servers and do the processing there.  the Jami GreenScreen plugin
    on the other hand is free software and does all the processing
    locally, on your own machine\par}
\end{frame}

\begin{frame}[label={frm:plugins-watermark}, plain]{}
  \centering
  \begin{figure}
    \includegraphics[width=\textwidth]{g/plugins-watermark}%
    \caption*{\footnotesize WaterMark}
  \end{figure}
  \note{WaterMark: enables you to add a watermark in video calls.
    can be an image and can additionally contain location, date,
    and time as well\par}
\end{frame}

\begin{frame}[label={frm:plugins-more}, plain]{}
  \centering
  \begin{tabular}{l}
    discover more Jami plugins\\
    \href{https://jami.net/plugins}{jami.net/plugins}
    \\[1em]
    \pause
    learn more about the plugins SDK\\
    \href{https://jami.net/plugins-sdk}{jami.net/plugins-sdk}
  \end{tabular}
  \note<2>{if you're interested in getting started hacking on plugins
    and creating your own, we have a tutorial that walks you through
    setting things up and writing a simple plugin that draws a circle
    at the center of the frame in video calls

    \bigskip

    the plugins API can be a really useful method for extending Jami's
    behaviour with regards to text and audio/video call processing and
    distributing your changes to others, without necessarily
    concerning yourself with other parts of the jami-daemon codebase
    \par}
\end{frame}

\begin{frame}[label={frm:jams}, plain]{}
  \centering
  {\LARGE\textbf{JAMS}}%
  \note{\emph{Jami Account Management Server} enables organizations to
    manage their own community of Jami users while taking advantage of
    Jami's distributed network architecture

    \bigskip

    JAMS can either run standalone and use its own local database, or
    integrate with an existing LDAP or AD installation, and allows
    managing contact lists and pushing specific configurations to
    groups of users

    \bigskip

    SFL offers paid commercial support via the Jami Store\par}
\end{frame}

\begin{frame}[label={frm:jams-x509}, plain]{}
  \centering
  \begin{figure}
    \includegraphics[width=\textwidth]{g/x509}
    \vspace{-5.5em}
    \caption*{\footnotesize Jami account \& device management}
  \end{figure}
  \note{how does Jami authenticate users and manage accounts in a
    non-centralized way and without any central authority?
    using X.509 certs \& cert chains

    \bigskip

    it's a well-known and widely used standard (e.g. by web browsers
    when visiting web sites over TLS, and various large organizations
    use it internally for user authentication and account management)

    \bigskip

    Jami extends the use of cert chains to device management, covering
    the multiple-devices-per-account use-case, enabling easy addition
    or revocation of devices.  contacts are managed similarly to
    openssh\par}
\end{frame}

\begin{frame}[label={frm:jams-x509-ca}, plain]{}
  \centering
  \begin{figure}
    \includegraphics[width=\textwidth]{g/x509-ca}
    \vspace{-5.5em}
    \caption*{\footnotesize%
      Jami account \& device management (with JAMS)}
  \end{figure}
  \note{JAMS brings in a CA into the picture, enabling organizations
    to manage and revoke users and so on.  the JAMS server will
    fulfill CSRs for users via the org CA (when using Jami outside
    this kind of setting, account certs are self-signed)

    \bigskip

    using X.509 certs in this way enables mixed distributed \&
    centralized authentication: in an org setting, allows
    authenticating users and members of the same org, or even
    another org you're working with, if configured

    \bigskip

    thus JAMS helps empower Jami users to form and manage their own
    smaller communities in a hybird way\par}
\end{frame}

\begin{frame}[label={frm:jami-qt}, plain]{}
  \centering
  {\LARGE jami-qt \textbf{client}}%
\end{frame}

\begin{frame}[label={frm:jami-qt-main}, plain]{}
  \centering
  \begin{figure}
    \includegraphics[width=\textwidth]{g/jami-qt-main}
    \caption*{\footnotesize jami-qt --- main window}
  \end{figure}
\end{frame}

\begin{frame}[label={frm:jami-qt-chatview}, plain]{}
  \centering
  \begin{figure}
    \includegraphics[width=\textwidth]{g/jami-qt-chatview}
    \caption*{\footnotesize jami-qt --- chat view}
  \end{figure}
\end{frame}

\begin{frame}[label={frm:jami-qt-settings-account}, plain]{}
  \centering
  \begin{figure}
    \includegraphics[width=\textwidth]{g/jami-qt-settings-account}
    \caption*{\footnotesize jami-qt --- settings view (account)}
  \end{figure}
\end{frame}

\begin{frame}[label={frm:jami-qt-settings-general}, plain]{}
  \centering
  \begin{figure}
    \includegraphics[width=\textwidth]{g/jami-qt-settings-general}
    \caption*{\footnotesize jami-qt --- settings view (general)}
  \end{figure}
\end{frame}

\begin{frame}[label={frm:mod}, plain]{}
  \centering
  {\LARGE\textbf{Moderation}}%
\end{frame}

\begin{frame}[label={frm:modscr}, plain]{}
  \centering
  \begin{figure}
    \includegraphics[width=\textwidth]{g/moderation}
    \caption*{\footnotesize jami-qt --- moderation}
  \end{figure}
\end{frame}

\begin{frame}[label={frm:swarm}, plain]{}
  \centering
  {\LARGE\textbf{Swarm chat}}%
  \note<1>{
    currently Jami supports linking multiple devices
    to a single account; however, as most Jami users already
    know and would point it out, message histories are not
    synchronized.  this has been an important missing feature and
    probably the most frequently requested one so far, along with
    group chats.

    \bigskip

    there's been a reason; implementing these features in a fully
    distributed setting like Jami is a real challenge: it needs to be
    done without any central server or authority.

    \bigskip

    Jami team proud to introduce Swarm chats\par}
\end{frame}

\begin{frame}[label={frm:swarm-features}, plain]{}
  \note<1>{swarms are fully distributed p2p text conversations,
    with a potentially unlimited number of participants, and are
    characterized by the following features \ldots\par}

  characteristic features of swarm chats:

  \begin{itemize}[<+->]
  \item split and merge based on connectivity
  \item message history synchronization
  \item no central authority or server
  \item non-repudiation: each device must be able to verify validity
    of old messages and replay the whole history
  \item PFS during transport
  \item device-local storage
  \end{itemize}
  \note<5>{PFS (perfect forward secrecy): assurance that session keys
    will not be compromised, even if longer-term secrets used in the
    key exchange for session initiation are compromised.  in other
    words, that potential future compromise of these keys does not
    affect secrecy of past sessions\par}
\end{frame}

\begin{frame}[label={frm:swarm-modes}, plain]{}
  four modes for swarm chats:

  \begin{itemize}[<+->]
  \item 1-to-1 (conversation with another Jami user)
  \item admin-invite-only (e.g. a class where the teacher can invite
    people, but not students)
  \item invite-only (a private group of friends)
  \item public (a public chat forum)
  \end{itemize}
\end{frame}

\begin{frame}[label={frm:swarm-design-1}, plain]{}
  \centering
  maintain a synchronized Merkle tree of messages
  \note<1>{a merkle tree or a hash tree, invented by ralph merkle in
    1979, is a tree where each leaf node is labelled with the crypto
    hash of a piece of data, and each parent node is labelled with
    the crypto hash of the labels of its children.

    \medskip

    have the nice property that verifying a given leaf node is part of
    the tree has logarithmic complexity (hashing computations
    proportional to logarithm of number of leaf nodes; so, very fast)

    \medskip

    have applications in wide areas of computing such as file systems
    (like btrfs and zfs), databases, and distributed p2p systems like
    git and mercurial\par}

  \bigskip

  \pause
  each conversation will be a git repository
  \note<2>{we decided to go with git, and have each conversation be
    a git repository\par}
\end{frame}

\begin{frame}[label={frm:swarm-design-2}, plain]{}
  reasons for using git include:

  \begin{itemize}[<+->]
  \item need to synchronize and order messages
    \note<1>{the Merkle Tree data structure helps us do
      just that, and can be linearized by merging
      branches.  are widely used by git, and thus easy
      to synchronize between multiple devices\par}
  \item git is distributed by nature
  \item widely used and popular
    \note<3>{much potential for further development
      and extension in the future\par}
  \item can verify commits using hooks and cryptographic
    signatures
  \item can be stored in a database if needed
  \item conflicts arising from splits/merges are much better
    handled by using commit messages rather than files
  \end{itemize}
  \note<6>{all git operations, control messages, files, etc will
    be done over p2p TLS-1.3 connections, using only ciphers
    guarantying PFS being used.  so keys are renegotiated for
    each new session\par}
\end{frame}

\begin{frame}[label={frm:jami-qt-swarm-demo}, plain]{}
  \centering
  {\large\textbf{demo time!}}
  \note{we plan on rolling swarms out in three phases:

    \begin{enumerate}
    \item for new one-on-one conversations, mainly enabling history
      synchronization across devices
    \item group conversations with a limited maximum number of users
      (our current goal is 8 users in a conversation)
    \item increase or lift that limit, and implement public groups
    \end{enumerate}
    \par}
\end{frame}

\begin{frame}[label={frm:jami-qt-dl}, plain]{}
  \centering
  \begin{tabular}{l}
    download jami-qt\\
    \href{https://jami.net/download}{jami.net/download}
  \end{tabular}
\end{frame}

\begin{frame}[label={frm:community}, plain]{}
  \centering
  {\LARGE\textbf{Community}}
  \note{very happy to say that i think we have a healthy and
    growing community around Jami, and we'd love to have \emph{you}
    with us as well!

    \bigskip

    folks ask ``how can i get involved in the community?''
    here are some ways\par}
\end{frame}

\begin{frame}[label={frm:community}, plain]{}
  \ttfamily
  \begin{itemize}[<+->]
  \item \href{https://jami.net}{jami.net}
    \note<1>{the main Jami website, with blog posts and articles
      from the Jami team with latest news about Jami\par}
  \item<2-> \href{https://forum.jami.net}{forum.jami.net}
    \note<2>{Jami forum for discussing Jami, getting help, and helping
      others\par}
  \item<2->
    \href{https://lists.gnu.org/mailman/listinfo/jami}{jami@gnu.org}
    \note<2>{can also use the mailing list for that\par}
  \item<+-> \href{ircs://chat.freenode.net:6697/jami}{\#jami} on
    \href{https://freenode.net}{freenode}
    \note<2>{irc for quick questions or chatting with users/devs\par}
  \item \href{https://git.jami.net}{git.jami.net}
    \note<3>{report bugs on git.jami.net\par}
  \item \href{https://review.jami.net}{review.jami.net}
    \note<4>{send patches on review.jami.net; i'd love to receive
      patches to jami-gnome and help from the community to maintain
      it\par}
  \item \href{https://docs.jami.net}{docs.jami.net}
    \note<5>{help write and improve documentation for jami\par}
  \item write and share your own plugins
  \item help translate Jami to your language(s)
  \item package Jami in your GNU/Linux distribution
  \item \large\emph{use Jami and help spread the word {\color{red}<3}}
  \end{itemize}
\end{frame}

{
  \setbeamercolor{background canvas}{bg=bgreydarker}
  \begin{frame}[label={frm:thanks}, plain]{}
    \vfill
    \begin{center}
        {\LARGE\textbf{Thanks!}}%

        \bigskip

        {\large
          {\sachac{}\name}%
          \kern.4em%
          \texttt{{\small<}\kern.1em}%
          \href{mailto:\mail}{\mail}%
          \texttt{\kern.1em{\small>}}\\
          \href{https://kelar.org/~bandali/jami-empowers-users.html}%
               {\small kelar.org/\char`\~bandali/jami-empowers-users.html}\\
          \small\texttt{(GPLv3+)}%
        }
    \end{center}
    \vfill
  \end{frame}
}


\end{document}
