<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>This Month in Reactive Graph</title><link></link><description>This Month in Reactive Graph is openly developed on GitHub and archives can be viewed at https://this-month-in.reactive-graph.io</description><generator>mdbook-rss 0.1.0</generator><item><title>October 2024 in Reactive Graph</title><link>https://this-month-in.reactive-graph.io/2024-10-this-month-in-reactive-graph.html</link><description><![CDATA[The 'October 2024' issue of 'This Month in Reactive Graph' summarizes the progress of Reactive Graph. The topics of this issue are: Manage the type system via the command line interface, Java GraphQL Client POC and the specification of the Identity and Permission System]]></description><author>Andreas Schaeffer</author><pubDate>Thu, 31 Oct 2024 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>{% import &quot;header.tera&quot; as header %} {% import &quot;footer.tera&quot; as footer %}</p>

<p>{{ header::print(year=&quot;2024&quot;,month=&quot;October&quot;) }}</p>

<p>&lt;hr class=&quot;surface-2&quot;&gt;</p>

<h2 id='table_of_contents'>Table of Contents</h2>

<p>&lt;!-- toc --&gt;</p>

<p>&lt;hr class=&quot;surface-2&quot;&gt;</p>

<p>October 2024 was a very productive month for Reactive Graph. We focused on Continuous Integration and <a href='https://github.com/reactive-graph/reactive-graph/issues/228'>Delivery</a>. The results are impressive:</p>

<h2 id='self_info'>Self Info</h2>

<p>The Reactive Graph binary can now output information about itself. This includes the version number, the rust compiler version, the rust compiler channel, the target triple, and the git commit hash.</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph info&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>+---------+--------------------------+---------+------------------------------------------+---------------+---------------+
| version | target_triple            | git_tag | git_commit                               | rustc_channel | rustc_version |
+---------+--------------------------+---------+------------------------------------------+---------------+---------------+
| 0.10.0  | x86_64-unknown-linux-gnu |         | 7d8b37cf5549a12a4da5feff5184778d25110e62 | stable        | 1.82.0        |
+---------+--------------------------+---------+------------------------------------------+---------------+---------------+</code></pre>

<p>&lt;/details&gt;</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph info --output-format=json&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code class="language-json">[
  {
    &quot;version&quot;: &quot;0.10.0&quot;,
    &quot;target_triple&quot;: &quot;x86_64-unknown-linux-gnu&quot;,
    &quot;git_tag&quot;: &quot;&quot;,
    &quot;git_commit&quot;: &quot;7d8b37cf5549a12a4da5feff5184778d25110e62&quot;,
    &quot;rustc_channel&quot;: &quot;stable&quot;,
    &quot;rustc_version&quot;: &quot;1.82.0&quot;
  }
]</code></pre>

<p>&lt;/details&gt;</p>

<h2 id='self_updater'>Self Updater</h2>

<p>What is probably most interesting for end users is that Reactive Graph now has the ability <a href='https://github.com/reactive-graph/reactive-graph/pull/212'>to update itself</a>. Thanks to the Rust <a href='https://crates.io/crates/self_update'>self_update library</a>, implementation was relatively easy.</p>

<p>A new command has been implemented with which you can process the update:</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph update --help&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>Update the Reactive Graph binary

Usage: reactive-graph update [OPTIONS] [COMMAND]

Commands:
  info  Shows information about the selected release
  list  Lists the releases
  help  Print this message or the help of the given subcommand(s)

Options:
  -n, --nightly                 Updates to the nightly release
  -l, --latest                  Updates to the latest release. Currently, the latest release is the nightly release. This will change in the future
  -c, --current                 Updates to the current release
  -v, --version &lt;VERSION&gt;       Updates to a specific version
      --hide-download-progress  Hides the download progress
      --hide-output             Hides the output
  -q, --quiet                   Hides the download progress and the output
  -y, --no-confirm              Don&#8217;t ask
  -h, --help                    Print help</code></pre>

<p>&lt;/details&gt;</p>

<p>You can use the subcommand info to find out which version would be updated to.</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph update info&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>+---------------+---------+------------+------------------------------------------+------------------------------------------+
| Release Name  | Version | Date       | Asset Name                               | Download URL                             |
+---------------+---------+------------+------------------------------------------+------------------------------------------+
| Nightly Build | nightly | 2024-10-29 | reactive-graph-nightly-x86_64-unknown-li | https://api.github.com/repos/reactive-gr |
|               |         |            | nux-gnu.tar.gz                           | aph/reactive-graph/releases/assets/20270 |
|               |         |            |                                          | 9875                                     |
+---------------+---------+------------+------------------------------------------+------------------------------------------+</code></pre>

<p>&lt;/details&gt;</p>

<p>As you can see, the <code>nightly</code> version would be installed. It also shows the name of the asset to be downloaded and from which URL the download would occur.</p>

<p>If you finally want to carry out the update, you can do this with the command:</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph update&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>Checking target-arch... x86_64-unknown-linux-gnu
Checking current version... v0.10.0
Looking for tag: nightly

reactive-graph release status:
  * Current exe: &quot;/home/user/.cargo/bin/reactive-graph&quot;
  * New exe release: &quot;reactive-graph-nightly-x86_64-unknown-linux-gnu.tar.gz&quot;
  * New exe download url: &quot;https://api.github.com/repos/reactive-graph/reactive-graph/releases/assets/202709875&quot;

The new release will be downloaded/extracted and the existing binary will be replaced.
Do you want to continue? [Y/n] Y
Downloading...
[00:00:02] [====================&gt;-------------------] 19.41 MiB/37.41 MiB (3s)  
Extracting archive... Done
Replacing binary file... Done
Successfully updated to version: nightly</code></pre>

<p>&lt;/details&gt;</p>

<p>You can use the <code>--no-confirm</code> option to ensure that the update is carried out without query.</p>

<h3 id='specify_the_version_to_update_to'>Specify the version to update to</h3>

<p>| Option                     | Description                                                                                                           | |----------------------------|-----------------------------------------------------------------------------------------------------------------------| | <code>--latest</code>                 | Updates to the latest release. Currently, the latest release is the nightly release. This will change in the future.  | | <code>--nightly</code>                | Updates to the nightly release                                                                                        | | <code>--version 0.10.0-alpha-2</code> | Updates to a specific version                                                                                         |</p>

<h3 id='list_of_releases'>List of releases</h3>

<p>You can find out which releases are available from the shell. These version numbers can be used with the <code>--version</code> option to install a specific version of Reactive Graph.</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph update list&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>+-----------------+----------------+------------+------------------------------------------+------------------------------------------+
| Release Name    | Version        | Date       | Asset Name                               | Download URL                             |
+-----------------+----------------+------------+------------------------------------------+------------------------------------------+
| Nightly Build   | nightly        | 2024-10-29 | reactive-graph-nightly-x86_64-unknown-li | https://api.github.com/repos/reactive-gr |
|                 |                |            | nux-gnu.tar.gz                           | aph/reactive-graph/releases/assets/20270 |
|                 |                |            |                                          | 9875                                     |
+-----------------+----------------+------------+------------------------------------------+------------------------------------------+
| v0.10.0-alpha-2 | 0.10.0-alpha-2 | 2024-10-27 | reactive-graph-v0.10.0-alpha-2-x86_64-un | https://api.github.com/repos/reactive-gr |
|                 |                |            | known-linux-gnu.tar.gz                   | aph/reactive-graph/releases/assets/20211 |
|                 |                |            |                                          | 3533                                     |
+-----------------+----------------+------------+------------------------------------------+------------------------------------------+
| v0.10.0-alpha-1 | 0.10.0-alpha-1 | 2024-10-20 | reactive-graph-v0.10.0-alpha-1-x86_64-un | https://api.github.com/repos/reactive-gr |
|                 |                |            | known-linux-gnu.tar.gz                   | aph/reactive-graph/releases/assets/20031 |
|                 |                |            |                                          | 6307                                     |
+-----------------+----------------+------------+------------------------------------------+------------------------------------------+
| v0.9.1-25       | 0.9.1-25       | 2023-07-20 | inexor-rgf-rt-standalone-x86_64-unknown- | https://api.github.com/repos/reactive-gr |
|                 |                |            | linux-gnu.tar.gz                         | aph/reactive-graph/releases/assets/11789 |
|                 |                |            |                                          | 6809                                     |
+-----------------+----------------+------------+------------------------------------------+------------------------------------------+
| v0.9.1-22       | 0.9.1-22       | 2023-05-12 | inexor-rgf-rt-standalone-x86_64-unknown- | https://api.github.com/repos/reactive-gr |
|                 |                |            | linux-gnu.tar.gz                         | aph/reactive-graph/releases/assets/10790 |
|                 |                |            |                                          | 4471                                     |
+-----------------+----------------+------------+------------------------------------------+------------------------------------------+
|                 | 0.9.1-3        | 2023-05-07 | Not available                            |                                          |
+-----------------+----------------+------------+------------------------------------------+------------------------------------------+
| v0.9.1          | 0.9.1          | 2023-05-01 | inexor-rgf-rt-standalone-x86_64-unknown- | https://api.github.com/repos/reactive-gr |
|                 |                |            | linux-gnu.tar.gz                         | aph/reactive-graph/releases/assets/10621 |
|                 |                |            |                                          | 6527                                     |
+-----------------+----------------+------------+------------------------------------------+------------------------------------------+
| v0.9.0-15       | 0.9.0-15       | 2023-05-01 | inexor-rgf-rt-standalone-x86_64-unknown- | https://api.github.com/repos/reactive-gr |
|                 |                |            | linux-gnu.tar.gz                         | aph/reactive-graph/releases/assets/10621 |
|                 |                |            |                                          | 3683                                     |
+-----------------+----------------+------------+------------------------------------------+------------------------------------------+
| v0.2.1-alpha    | 0.2.1-alpha    | 2021-08-29 | Not available                            |                                          |
+-----------------+----------------+------------+------------------------------------------+------------------------------------------+</code></pre>

<p>&lt;/details&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='improved_release_process_and_distribution_channels'>Improved Release Process and Distribution Channels</h2>

<p>In order for the self-updater to be useful, the release and distribution process needed to be improved. With the improved release process, different types of <a href='https://github.com/reactive-graph/reactive-graph/releases'>releases</a> are now produced and <a href='https://github.com/reactive-graph/reactive-graph/issues/228'>distributed via a number of channels</a>:</p>

<p>| Channel          | Description                                                                                                                                                | Status  | |------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| | Source           | The source code is available for download for each release.                                                                                                | Done    | | Binary Packages  | Binary packages are produced for each release. The binary distributions can be downloaded manually. See below for expanded support of supported platforms. | Done    | | Self Updater     | The self-updater is based on the binary distributions.                                                                                                     | Done    | | Debian Packages  | Debian packages are produced for each release. The Debian packages can be downloaded manually.                                                             | Done    | | Docker           | Docker images are produced for each release. The Docker images are uploaded to ghcr.io and can be obtained from there.                                     | Done    | | Website Download | In the future, every release should be available for download via the website.                                                                             | Planned | | crates.io        | In the future, every regular release should be published on crates.io.                                                                                     | Planned | | APT              | In the future, each release&#8217;s Debian packages should be available via an APT repository.                                                                   | Planned |</p>

<p>In the following graphic you can see the process of a release.</p>

<p>A submitted pull request can only be merged if a number of prerequisites are met:</p>

<ol type="1">
<li>The code compiles under Rust Stable and Rust Nightly.</li>

<li>The code compiles on Linux, Windows and MacOSx.</li>

<li>Code Formatting is equivalent to automatic formatting.</li>

<li>The minimum Rust compiler version has not increased.</li>

<li>There are no warnings from the linter.</li>
</ol>

<p>After the merge, the checks are also repeated on the <code>main</code> branch and if successful, release builds and Docker builds are triggered.</p>

<p>&lt;pre class=&quot;mermaid&quot;&gt;flowchart LR</p>

<pre><code>A@{ shape: circle, label: &amp;quot;Start&amp;quot; }
PR[Pull Request]
CI[CI Build an &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; Branch]
Release[Release Build]
DB[Docker Build]
NBin@{ shape: doc, label: &amp;quot;Nightly Binary Package&amp;quot; }
RBin@{ shape: doc, label: &amp;quot;Release Binary Package&amp;quot; }
NDeb@{ shape: doc, label: &amp;quot;Nightly Debian Package&amp;quot; }
RDeb@{ shape: doc, label: &amp;quot;Release Debian Package&amp;quot; }
NDI@{ shape: doc, label: &amp;quot;Nightly Docker Image&amp;quot; }
RDI@{ shape: doc, label: &amp;quot;Release Docker Image&amp;quot; }</code></pre>

<pre><code>A-- created PR --&amp;gt;PR
PR-- merge into main --&amp;gt;CI
CI-- successful --&amp;gt;Release
Release --&amp;gt; NBin
Release-- &amp;lt;code&amp;gt;release tag&amp;lt;/code&amp;gt; --&amp;gt;RBin
Release --&amp;gt; NDeb
Release-- &amp;lt;code&amp;gt;release tag&amp;lt;/code&amp;gt; --&amp;gt;RDeb
CI-- successful --&amp;gt;DB
CI-- successful --&amp;gt;DB
DB--&amp;gt;NDI
DB-- &amp;lt;code&amp;gt;release tag&amp;lt;/code&amp;gt; --&amp;gt;RDI</code></pre>

<p>&lt;/pre&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='nightly_builds'>Nightly Builds</h2>

<p>What&#8217;s new is that the release process produces <a href='https://github.com/reactive-graph/reactive-graph/releases/tag/nightly'>nightly builds</a>. This happens with every merge to the <code>main</code> branch. The existing <code>nightly</code> release is updated, the <a href='https://github.com/reactive-graph/reactive-graph/pull/202'>Git tag nightly</a> is moved to the latest commit and finally new binary packages, new Debian packages and new Docker images are produced.</p>

<p>We won&#8217;t produce regular releases often in the near future because we can&#8217;t guarantee compatibility yet. Instead, the constantly updated nightly releases are available.</p>

<p>&lt;div class=&quot;alert alert--warning&quot;&gt;</p>

<pre><code>&lt;h3&gt;
    &lt;i class=&quot;ti ti-alert-triangle&quot;&gt;&lt;/i&gt;
    Warning!
&lt;/h3&gt;
&lt;p&gt;At this point, the software is not yet feature-complete and essential features are still missing, such as the flow editor, the persistence of the type system and instance system, and an authorization layer.&lt;/p&gt;</code></pre>

<p>&lt;/div&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='platform_support'>Platform Support</h2>

<p>Rust is a compiled language. If the software should be able to run on different systems, we should ensure this during development. Reactive Graph has various application areas that go beyond the classic desktop system. For example, Reactive-Graph for smart home applications should run on a Raspberry Pi. This has an ARM processor.</p>

<p>Fortunately, Rust supports cross-compiling for other CPU and OS platforms. This month we added <a href='(https://github.com/reactive-graph/reactive-graph/pull/205'>some new CPU architectures</a>) to continuous integration and are producing binary packages and Debian packages for all of these platforms.</p>

<p>This is the updated list of supported platforms:</p>

<p>| target                         | New | Description                                       | Tier | |--------------------------------|-----|---------------------------------------------------|------| | x86_64-unknown-linux-gnu       |     | 64-bit Linux (kernel 3.2+, glibc 2.17+)           | 1    | | x86_64-pc-windows-msvc         |     | 64-bit MSVC (Windows 10+, Windows Server 2016+)   | 1    | | aarch64-apple-darwin           |     | ARM64 macOS (11.0+, Big Sur+)                     | 1    | | x86_64-apple-darwin            |     | 64-bit macOS (10.12+, Sierra+)                    | 1    | | universal-apple-darwin         |     |                                                   |      | | aarch64-unknown-linux-gnu      |     | ARM64 Linux (kernel 4.1, glibc 2.17+)             | 1    | | aarch64-unknown-linux-musl     | Yes | ARM64 Linux with musl 1.2.3                       | 2    | | armv7-unknown-linux-gnueabihf  | Yes | Armv7-A Linux, hardfloat (kernel 3.2, glibc 2.17) | 2    | | armv7-unknown-linux-musleabihf | Yes | Armv7-A Linux, hardfloat (kernel 3.2, glibc 2.17) | 2    | | i686-unknown-linux-gnu         | Yes | 32-bit Linux (kernel 3.2+, glibc 2.17+)           | 1    | | powerpc-unknown-linux-gnu      | Yes | PowerPC Linux (kernel 3.2, glibc 2.17)            | 2    | | powerpc64-unknown-linux-gnu    | Yes | PPC64 Linux (kernel 3.2, glibc 2.17)              | 2    | | powerpc64le-unknown-linux-gnu  | Yes | PPC64LE Linux (kernel 3.10, glibc 2.17)           | 2    | | riscv64gc-unknown-linux-gnu    | Yes | RISC-V Linux (kernel 4.20, glibc 2.29)            | 2    | | x86_64-pc-windows-gnu          | Yes | 64-bit MinGW (Windows 10+, Windows Server 2016+)  | 1    | | x86_64-unknown-linux-musl      | Yes | 64-bit Linux with musl 1.2.3                      | 2    |</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='docker'>Docker</h2>

<p>Furthermore, the first Docker images are now available for both regular releases and as nightly builds. The Docker images are available via <a href='https://github.com/reactive-graph/reactive-graph/pkgs/container/reactive-graph'>GitHub Packages</a> (i.e. via ghcr.io).</p>

<h3 id='run'>Run</h3>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ docker run -d -p 31415:31415 --name reactive-graph ghcr.io/reactive-graph/reactive-graph:latest&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>85b3a6868f4bc91e336fb1033d349b70c48b207f0122b5284f77002bae2894c4</code></pre>

<p>&lt;/details&gt;</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ docker ps&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>CONTAINER ID   IMAGE                                          COMMAND              CREATED              STATUS              PORTS                                           NAMES                                                                                                                                                   │
85b3a6868f4b   ghcr.io/reactive-graph/reactive-graph:latest   &quot;./reactive-graph&quot;   13 seconds ago       Up 12 seconds       0.0.0.0:31415-&gt;31415/tcp, :::31415-&gt;31415/tcp   reactive-graph</code></pre>

<p>&lt;/details&gt;</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ docker stop 85b3a6868f4b&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>85b3a6868f4b</code></pre>

<p>&lt;/details&gt;</p>

<h3 id='multiple_instances'>Multiple Instances</h3>

<p>It is possible to run multiple instances of Reactive Graph in parallel. All you have to do is bind another port on the host system.</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ docker run -d -p 31416:31415 --name reactive-graph-2 ghcr.io/reactive-graph/reactive-graph:latest&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>7f689869a76df29179478d74872c6d6b4c9d144415bd3fc9d16225ecf8ae8f62</code></pre>

<p>&lt;/details&gt;</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ docker ps&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>CONTAINER ID   IMAGE                                          COMMAND              CREATED              STATUS              PORTS                                           NAMES
85b3a6868f4b   ghcr.io/reactive-graph/reactive-graph:latest   &quot;./reactive-graph&quot;   13 seconds ago       Up 12 seconds       0.0.0.0:31415-&gt;31415/tcp, :::31415-&gt;31415/tcp   reactive-graph
7f689869a76d   ghcr.io/reactive-graph/reactive-graph:latest   &quot;./reactive-graph&quot;   53 seconds ago       Up 52 seconds       0.0.0.0:31417-&gt;31415/tcp, :::31417-&gt;31415/tcp   reactive-graph-2</code></pre>

<p>&lt;/details&gt;</p>

<h3 id='dockerfile'>Dockerfile</h3>

<pre><code class="language-dockerfile">FROM alpine as reactive-graph
RUN apk add zsh nano curl
WORKDIR /opt/reactive-graph
COPY --from=builder --chown=reactive-graph:reactive-graph /app/target/release/reactive-graph .
RUN addgroup --gid 1000 reactive-graph
RUN adduser -h /opt/reactive-graph -s /bin/bash -G reactive-graph -u 1000 -D reactive-graph
USER reactive-graph
RUN ./reactive-graph instances init --uid 1000 --gid 1000
RUN ./reactive-graph instances config graphql --hostname &quot;0.0.0.0&quot; --secure true
RUN ./reactive-graph instances config instance --instance-name &quot;Reactive Graph&quot; --instance-description &quot;Docker&quot;
ENV PATH=&quot;$PATH:/opt/reactive-graph&quot;
EXPOSE 31415</code></pre>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='debian_packages'>Debian Packages</h2>

<p>More platforms are now supported. Debian packages are also provided for regular releases and as nightly builds. The <a href='https://github.com/reactive-graph/reactive-graph/pull/204/files'>new folder structure</a> is now taken into account.</p>

<p>| Debian Package                            | Debian Target | Rust Target                   | |-------------------------------------------|---------------|-------------------------------| | reactive-graph<em>0.10.0-nightly</em>amd64.deb   | amd64         | x86_64-unknown-linux-gnu      | | reactive-graph<em>0.10.0-nightly</em>arm64.deb   | arm64         | aarch64-unknown-linux-gnu     | | reactive-graph<em>0.10.0-nightly</em>armhf.deb   | armhf         | armv7-unknown-linux-gnueabihf | | reactive-graph<em>0.10.0-nightly</em>i386.deb    | i386          | i686-unknown-linux-gnu        | | reactive-graph<em>0.10.0-nightly</em>powerpc.deb | powerpc       | powerpc-unknown-linux-gnu     | | reactive-graph<em>0.10.0-nightly</em>ppc64.deb   | ppc64         | powerpc-unknown-linux-gnu     | | reactive-graph<em>0.10.0-nightly</em>ppc64el.deb | ppc64el       | powerpc64le-unknown-linux-gnu | | reactive-graph<em>0.10.0-nightly</em>riscv64.deb | riscv64       | riscv64gc-unknown-linux-gnu   |</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='cli_instance_management'>CLI Instance Management</h2>

<h3 id='instance_initialization'>Instance Initialization</h3>

<p>The Dockerfile benefits from another new feature: The Reactive Graph Binary can now <a href='https://github.com/reactive-graph/reactive-graph/issues/187'>initialize a folder structure for new instances</a>.</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph instances init --uid 1000 --gid 1000&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>Created ./config
Created ./log
Created ./keys
Created ./plugins/deploy
Created ./plugins/installed
Created ./repositories
Created ./repositories/default/types/components
Created ./repositories/default/types/entities
Created ./repositories/default/types/relations
Created ./repositories/default/types/flows
Created ./repositories/default/instances/entities
Created ./repositories/default/instances/relations
Created ./repositories/default/instances/flows
Wrote file ./config/flow_locations.toml
Wrote file ./config/graphql.toml
Wrote file ./config/instance.toml
Wrote file ./config/logging.toml
Wrote file ./config/plugins.toml
Wrote file ./config/remotes.toml
Created file ./log/reactive-graph.log
Created file ./log/reactive-graph.error.log</code></pre>

<p>&lt;/details&gt;</p>

<h3 id='configure_instances_via_cli'>Configure Instances via CLI</h3>

<p>Another feature is that you can set or overwrite configurations using a command.</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph instances config graphql --hostname &quot;0.0.0.0&quot; --secure true&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>(no output)</code></pre>

<p>&lt;/details&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='continuous_integration'>Continuous Integration</h2>

<ul>
<li><a href='https://github.com/reactive-graph/reactive-graph/pull/218'>Dependabot can automatically merge</a></li>

<li>Automatic Labeling</li>

<li>Upgraded nightly compiler version to <a href='https://github.com/reactive-graph/reactive-graph/pull/214'>2024-10-19</a></li>
</ul>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='book'>Book</h2>

<p><a href='https://github.com/reactive-graph/reactive-graph/pull/215'>Redesigned the book</a> using the <a href='https://design.reactive-graph.io/'>design library</a></p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<p>{{ footer::print(issue<em>date</em>previous=&quot;&quot;, issue<em>date</em>next=&quot;2024-09-30&quot;) }}</p>
]]></content:encoded></item><item><title>September 2024 in Reactive Graph</title><link>https://this-month-in.reactive-graph.io/2024-09-this-month-in-reactive-graph.html</link><description><![CDATA[The 'September 2024' issue of 'This Month in Reactive Graph' summarizes the progress of Reactive Graph. The topics of this issue are: Manage the type system via the command line interface, Java GraphQL Client POC and the specification of the Identity and Permission System]]></description><author>Andreas Schaeffer</author><pubDate>Mon, 30 Sep 2024 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>{% import &quot;header.tera&quot; as header %} {% import &quot;footer.tera&quot; as footer %}</p>

<p>{{ header::print(year=&quot;2024&quot;,month=&quot;September&quot;) }}</p>

<p>&lt;hr class=&quot;surface-2&quot;&gt;</p>

<h2 id='table_of_contents'>Table of Contents</h2>

<p>&lt;!-- toc --&gt;</p>

<p>&lt;hr class=&quot;surface-2&quot;&gt;</p>

<h2 id='build'>Build</h2>

<h3 id='stable_rust'>Stable Rust</h3>

<p>The biggest news this month is that we got managed to <a href='https://github.com/reactive-graph/reactive-graph/pull/148'>compile</a> Reactive Graph with <a href='https://github.com/reactive-graph/reactive-graph/issues/102'>Stable Rust</a>.</p>

<p>&lt;details&gt; &lt;summary&gt;What has changed?&lt;/summary&gt;</p>

<ul>
<li>Implemented <code>DashMap</code> as container for subscribers of <code>Stream</code> and removed usage of the unstable feature <code>unsized_tuple_coercion</code></li>

<li>Inlined implementation of feature <code>path_file_prefix</code> which will be stabilized soon, so that this is not a blocker</li>

<li>Removed usage of the unstable feature <code>test</code> and migrated to criterion (see Benchmarking with Criterion)</li>

<li>Removed usage of the unstable feature <code>register_tool</code> and make tarpaulin work again without this feature</li>

<li>Detect if the compiler is nightly and only if so, make use of the unstable features <code>unboxed_closures</code> and <code>fn_traits</code></li>
</ul>

<p>&lt;/details&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h3 id='support_for_<span_class="token_rg-component">musl</span>_builds'>Support for &lt;span class=&quot;token rg-component&quot;&gt;musl&lt;/span&gt; builds</h3>

<p>We <a href='https://github.com/reactive-graph/reactive-graph/pull/155'>introduced</a> support <a href='https://musl.libc.org/'>MUSL</a> builds.</p>

<p>&lt;details&gt; &lt;summary&gt;What is musl?&lt;/summary&gt;</p>

<p>&lt;span class=&quot;token rg-component&quot;&gt;musl&lt;/span&gt; is an implementation of the C standard library built on top of the Linux system call API, including interfaces defined in the base language standard, POSIX, and widely agreed-upon extensions. musl is lightweight, fast, simple, free, and strives to be correct in the sense of standards-conformance and safety.</p>

<p><a href='https://musl.libc.org/'>https://musl.libc.org/</a></p>

<p>&lt;/details&gt;</p>

<p>&lt;details&gt; &lt;summary&gt;Setup and Compile using musl&lt;/summary&gt;</p>

<p>In order to successfully compile, you also have to install the package <code>musl-tools</code>. For example for Debian / Ubuntu, you can install it like so:</p>

<pre><code>$ apt install musl-tools</code></pre>

<p>Next you have to add the musl target using <code>rustup</code>:</p>

<pre><code>$ rustup target add x86_64-unknown-linux-musl</code></pre>

<p>Finally you can compile reactive-graph for the target <code>x86_64-unknown-linux-musl</code>:</p>

<pre><code>$ cargo build --target x86_64-unknown-linux-musl</code></pre>

<p>&lt;/details&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h3 id='rustls'>rustls</h3>

<p>We&#8217;ve <a href='https://github.com/reactive-graph/reactive-graph/pull/121'>finished</a> work on replacing <a href='https://github.com/reactive-graph/reactive-graph/issues/107'>OpenSSL with rustls</a>. OpenSSL is no more needed to build Reactive Graph.</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h3 id='benchmarking_with_criterion'>Benchmarking with Criterion</h3>

<p>Now the benchmark tests are run with <a href='https://crates.io/crates/criterion'>criterion</a> (which doesn&#8217;t need Nightly Rust). Furthermore, the benchmarks has been moved into its own <code>benches/</code> folders.</p>

<p>&lt;details&gt; &lt;summary&gt;Features of Criterion&lt;/summary&gt;</p>

<ul>
<li>Statistics: Statistical analysis detects if, and by how much, performance has changed since the last benchmark run</li>

<li>Charts: Uses gnuplot to generate detailed graphs of benchmark results</li>

<li>Stable-compatible: Benchmark your code without installing nightly Rust</li>
</ul>

<p>&lt;/details&gt;</p>

<p>A future task would be to write more benchmark tests and to execute benchmarking in the CI.</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='continuous_integration'>Continuous Integration</h2>

<h3 id='upgrade_workflows_and_improve_ci_performance'>Upgrade Workflows and Improve CI performance</h3>

<p>We&#8217;ve <a href='https://github.com/reactive-graph/reactive-graph/pull/145'>upgraded the workflow actions</a> to recent versions. Furthermore, we made some changes to &lt;span class=&quot;token rg-component&quot;&gt;speed up&lt;/span&gt; the CI. We&#8217;ve merge workflow files and made build jobs and test jobs dependent on the formatting check job and linting jobs. With this change, no build time is wasted if linting and formatting doesn&#8217;t meet the requirements. Furthermore, we&#8217;re run linting and test suite on Linux GNU and Linux &lt;span class=&quot;token rg-component&quot;&gt;musl&lt;/span&gt; for Rust &lt;span class=&quot;token rg-component&quot;&gt;stable&lt;/span&gt; and Rust &lt;span class=&quot;token rg-component&quot;&gt;nightly&lt;/span&gt;. But we don&#8217;t run the complete test suite on Windows and macOS anymore. This is because running the test suite on Windows is 2x slower and on macOS is 6x slower compared to running on Linux. At a later point we may reintroduce a smaller subset of the test suite to run on Windows and macOS.</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h3 id='new_checks'>New Checks</h3>

<ul>
<li>Minimal Supported Rust Version (MSRV)</li>

<li>Dependabot now checks for outdated dependencies</li>

<li>Checks that the CHANGELOG was edited</li>
</ul>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='command_line_interface'>Command Line Interface</h2>

<h3 id='managing_the_instance_system'>Managing the Instance System</h3>

<p>We finished the implementation of managing the instance system via CLI (<a href='https://github.com/reactive-graph/reactive-graph/pull/134'>entity instances</a> and <a href='https://github.com/reactive-graph/reactive-graph/pull/135'>relation instances</a>). Furthermore, the CLI lists the applied components of the reactive instances.</p>

<h3 id='documented_command_line_interface'>Documented Command Line Interface</h3>

<p>The <a href='https://docs.reactive-graph.io/book/'>book</a> now contains a section about the <a href='https://docs.reactive-graph.io/book/CLI_Usage.html'>Command Line Interface</a>. We&#8217;ve added a section about the <a href='https://docs.reactive-graph.io/book/CLI_REPL.html'>interactive mode</a> and a section about the <a href='https://docs.reactive-graph.io/book/CLI_Reference.html'>command reference</a>. For the command reference we make use of a new option to automatically generate the help in Markdown format:</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph --markdown-help&lt;/code&gt;&lt;/summary&gt;</p>

<p>TODO: Insert output here</p>

<p>&lt;/details&gt;</p>

<h3 id='output_format_count'>Output Format Count</h3>

<p>We&#8217;ve <a href='https://github.com/reactive-graph/reactive-graph/pull/135'>added a new output format</a> that simply prints the count instead of a table with the results. The purpose of the new feature is similar to <code>count(*)</code> in SQL and is also useful for shell automation.</p>

<pre><code>$ reactive-graph client components list --output-format count
$ reactive-graph client entity-types list --output-format count
$ reactive-graph client relation-types list --output-format count
$ reactive-graph client entity-instances list --output-format count
$ reactive-graph client relation-instances list --output-format count</code></pre>

<p>&lt;details&gt; &lt;summary&gt;Examples&lt;/summary&gt;</p>

<p><strong>Print the count of components</strong></p>

<pre><code>$ reactive-graph client components list --output-format count
34 result(s)</code></pre>

<p><strong>Example: Print the count of entity-instances</strong></p>

<pre><code>$ reactive-graph client entity-instances list --output-format count
1554 result(s)</code></pre>

<p><strong>Example: Print the count of entity-instances that having the component <code>core__action</code></strong></p>

<pre><code>$ reactive-graph client entity-instances list --components core__action --output-format count
2 result(s)</code></pre>

<p>&lt;/details&gt;</p>

<h3 id='output_format_html'>Output Format HTML</h3>

<p>We have added a new option to output the result as HTML table. This applies to all type system and instance system operations.</p>

<p><img src='images/2024-09-30/output-format-html.png' title='Output Format HTML' alt='Output Format HTML' /></p>

<h4 id='list_types_and_instances_as_html_table'>List types and instances as HTML table</h4>

<pre><code>$ reactive-graph client components list --output-format html-table
$ reactive-graph client entity-types list --output-format html-table
$ reactive-graph client relation-types list --output-format html-table
$ reactive-graph client entity-instances list --output-format html-table
$ reactive-graph client relation-instances list --output-format html-table</code></pre>

<h4 id='list_all_components_as_html_table'>List all components as HTML table</h4>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph client components list --output-format html-table&lt;/code&gt;&lt;/summary&gt;</p>

<p>&lt;pre&gt;&lt;code&gt; &lt;table&gt;</p>

<pre><code>&lt;thead&gt;
&lt;tr&gt;
    &lt;th&gt;namespace&lt;/th&gt;
    &lt;th&gt;name&lt;/th&gt;
    &lt;th&gt;description&lt;/th&gt;
    &lt;th&gt;properties&lt;/th&gt;
    &lt;th&gt;extensions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
    &lt;td&gt;state&lt;/td&gt;
    &lt;td&gt;state_object&lt;/td&gt;
    &lt;td&gt;State of type object&lt;/td&gt;
    &lt;td&gt;
        &lt;table&gt;
            &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;name&lt;/th&gt;
                &lt;th&gt;data_type&lt;/th&gt;
                &lt;th&gt;socket_type&lt;/th&gt;
                &lt;th&gt;mutability&lt;/th&gt;
            &lt;/tr&gt;
            &lt;/thead&gt;
            &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td&gt;state&lt;/td&gt;
                &lt;td&gt;Object&lt;/td&gt;
                &lt;td&gt;None&lt;/td&gt;
                &lt;td&gt;Immutable&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;set_state&lt;/td&gt;
                &lt;td&gt;Object&lt;/td&gt;
                &lt;td&gt;Input&lt;/td&gt;
                &lt;td&gt;Mutable&lt;/td&gt;
            &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/td&gt;
    &lt;td&gt;
    &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;value&lt;/td&gt;
    &lt;td&gt;value_debugger_trace&lt;/td&gt;
    &lt;td&gt;&lt;/td&gt;
    &lt;td&gt;&lt;/td&gt;
    &lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;arithmetic&lt;/td&gt;
    &lt;td&gt;arithmetic_operation&lt;/td&gt;
    &lt;td&gt;Arithmetic operation with one input and one result&lt;/td&gt;
    &lt;td&gt;
        &lt;table&gt;
            &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;name&lt;/th&gt;
                &lt;th&gt;data_type&lt;/th&gt;
                &lt;th&gt;socket_type&lt;/th&gt;
                &lt;th&gt;mutability&lt;/th&gt;
            &lt;/tr&gt;
            &lt;/thead&gt;
            &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td&gt;result&lt;/td&gt;
                &lt;td&gt;Number&lt;/td&gt;
                &lt;td&gt;Output&lt;/td&gt;
                &lt;td&gt;Immutable&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;lhs&lt;/td&gt;
                &lt;td&gt;Number&lt;/td&gt;
                &lt;td&gt;Input&lt;/td&gt;
                &lt;td&gt;Mutable&lt;/td&gt;
            &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/td&gt;
    &lt;td&gt;
        &lt;table&gt;
            &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;Namespace&lt;/th&gt;
                &lt;th&gt;TypeName&lt;/th&gt;
                &lt;th&gt;Description&lt;/th&gt;
                &lt;th&gt;Extension&lt;/th&gt;
            &lt;/tr&gt;
            &lt;/thead&gt;
            &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td&gt;core&lt;/td&gt;
                &lt;td&gt;component_category&lt;/td&gt;
                &lt;td&gt;&lt;/td&gt;
                &lt;td&gt;&quot;math&quot;&lt;/td&gt;
            &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;base&lt;/td&gt;
    &lt;td&gt;named&lt;/td&gt;
    &lt;td&gt;The entity or relation has a name.&lt;/td&gt;
    &lt;td&gt;
        &lt;table&gt;
            &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;name&lt;/th&gt;
                &lt;th&gt;data_type&lt;/th&gt;
                &lt;th&gt;socket_type&lt;/th&gt;
                &lt;th&gt;mutability&lt;/th&gt;
            &lt;/tr&gt;
            &lt;/thead&gt;
            &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td&gt;name&lt;/td&gt;
                &lt;td&gt;String&lt;/td&gt;
                &lt;td&gt;None&lt;/td&gt;
                &lt;td&gt;Mutable&lt;/td&gt;
            &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/td&gt;
    &lt;td&gt;
        &lt;table&gt;
            &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;Namespace&lt;/th&gt;
                &lt;th&gt;TypeName&lt;/th&gt;
                &lt;th&gt;Description&lt;/th&gt;
                &lt;th&gt;Extension&lt;/th&gt;
            &lt;/tr&gt;
            &lt;/thead&gt;
            &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td&gt;core&lt;/td&gt;
                &lt;td&gt;component_category&lt;/td&gt;
                &lt;td&gt;&lt;/td&gt;
                &lt;td&gt;&quot;base&quot;&lt;/td&gt;
            &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;value&lt;/td&gt;
    &lt;td&gt;value_object&lt;/td&gt;
    &lt;td&gt;Value of type object&lt;/td&gt;
    &lt;td&gt;
        &lt;table&gt;
            &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;name&lt;/th&gt;
                &lt;th&gt;data_type&lt;/th&gt;
                &lt;th&gt;socket_type&lt;/th&gt;
                &lt;th&gt;mutability&lt;/th&gt;
            &lt;/tr&gt;
            &lt;/thead&gt;
            &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td&gt;value&lt;/td&gt;
                &lt;td&gt;Object&lt;/td&gt;
                &lt;td&gt;Output&lt;/td&gt;
                &lt;td&gt;Mutable&lt;/td&gt;
            &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/td&gt;
    &lt;td&gt;
    &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;result&lt;/td&gt;
    &lt;td&gt;result_boolean&lt;/td&gt;
    &lt;td&gt;The entity returns a boolean&lt;/td&gt;
    &lt;td&gt;
        &lt;table&gt;
            &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;name&lt;/th&gt;
                &lt;th&gt;data_type&lt;/th&gt;
                &lt;th&gt;socket_type&lt;/th&gt;
                &lt;th&gt;mutability&lt;/th&gt;
            &lt;/tr&gt;
            &lt;/thead&gt;
            &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td&gt;result&lt;/td&gt;
                &lt;td&gt;Bool&lt;/td&gt;
                &lt;td&gt;Output&lt;/td&gt;
                &lt;td&gt;Immutable&lt;/td&gt;
            &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/td&gt;
    &lt;td&gt;
        &lt;table&gt;
            &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;Namespace&lt;/th&gt;
                &lt;th&gt;TypeName&lt;/th&gt;
                &lt;th&gt;Description&lt;/th&gt;
                &lt;th&gt;Extension&lt;/th&gt;
            &lt;/tr&gt;
            &lt;/thead&gt;
            &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td&gt;core&lt;/td&gt;
                &lt;td&gt;component_category&lt;/td&gt;
                &lt;td&gt;&lt;/td&gt;
                &lt;td&gt;&quot;result&quot;&lt;/td&gt;
            &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;</code></pre>

<p>&lt;/table&gt; &lt;/code&gt;&lt;/pre&gt;</p>

<p>&lt;/details&gt;</p>

<h4 id='output_a_single_type_or_a_single_instance_as_html_table'>Output a single type or a single instance as HTML table</h4>

<pre><code>$ reactive-graph client components get &lt;namespace&gt; &lt;type_name&gt; --output-format html-table
$ reactive-graph client entity-types get &lt;namespace&gt; &lt;type_name&gt; --output-format html-table
$ reactive-graph client relation-types get &lt;namespace&gt; &lt;type_name&gt; --output-format html-table
$ reactive-graph client entity-instances get &lt;namespace&gt; &lt;type_name&gt; --output-format html-table
$ reactive-graph client relation-instances get &lt;namespace&gt; &lt;type_name&gt; --output-format html-table</code></pre>

<h4 id='output_a_single_component_as_html_table'>Output a single component as HTML table</h4>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph client components get value value_number --output-format html-table&lt;/code&gt;&lt;/summary&gt;</p>

<p>&lt;table&gt;</p>

<pre><code>&lt;thead&gt;
    &lt;tr&gt;
        &lt;th&gt;namespace&lt;/th&gt;
        &lt;th&gt;name&lt;/th&gt;
        &lt;th&gt;description&lt;/th&gt;
        &lt;th&gt;properties&lt;/th&gt;
        &lt;th&gt;extensions&lt;/th&gt;
    &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
    &lt;tr&gt;
        &lt;td&gt;value&lt;/td&gt;
        &lt;td&gt;value_number&lt;/td&gt;
        &lt;td&gt;Value of type number&lt;/td&gt;
        &lt;td&gt;
            &lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;name&lt;/th&gt;&lt;th&gt;data_type&lt;/th&gt;&lt;th&gt;socket_type&lt;/th&gt;&lt;th&gt;mutability&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;value&lt;/td&gt;&lt;td&gt;Number&lt;/td&gt;&lt;td&gt;Output&lt;/td&gt;&lt;td&gt;Mutable&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
        &lt;/td&gt;
        &lt;td&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
&lt;/tbody&gt;</code></pre>

<p>&lt;/table&gt;</p>

<p>&lt;/details&gt;</p>

<h3 id='output_format_markdown'>Output Format Markdown</h3>

<p>Similar to the Output Format HTML, the Output Format Markdown prints the result as Markdown Table.</p>

<p><img src='images/2024-09-30/output-format-markdown.png' title='Output Format Markdown' alt='Output Format Markdown' /></p>

<h4 id='list_types_and_instances_as_markdown_table'>List types and instances as Markdown table</h4>

<pre><code>$ reactive-graph client components list --output-format markdown-table
$ reactive-graph client entity-types list --output-format markdown-table
$ reactive-graph client relation-types list --output-format markdown-table
$ reactive-graph client entity-instances list --output-format markdown-table
$ reactive-graph client relation-instances list --output-format markdown-table</code></pre>

<h4 id='list_all_components_as_markdown_table'>List all components as Markdown table</h4>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph client components list --output-format markdown-table&lt;/code&gt;&lt;/summary&gt;</p>

<p>| namespace  | name                 | description                                                                                             | properties                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | extensions                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | |------------|----------------------|---------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | state      | state<em>object         | State of type object                                                                                    | &lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;name&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;data</em>type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;socket<em>type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;mutability&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;set</em>state&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Object&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Input&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Mutable&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;state&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Object&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;None&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Immutable&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                            |                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | | value      | value<em>debugger</em>trace |                                                                                                         |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | | arithmetic | arithmetic<em>operation | Arithmetic operation with one input and one result                                                      | &lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;name&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;data</em>type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;socket<em>type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;mutability&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;result&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Number&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Output&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Immutable&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;lhs&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Number&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Input&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Mutable&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                               | &lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;Namespace&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;TypeName&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;Extension&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;core&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;component</em>category&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;&quot;math&quot;&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;                                                                                                                     | | base       | named                | The entity or relation has a name.                                                                      | &lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;name&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;data<em>type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;socket</em>type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;mutability&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;name&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;String&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;None&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Mutable&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | &lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;Namespace&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;TypeName&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;Extension&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;core&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;component_category&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;&quot;base&quot;&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;                                                                                                                     | | value      | value<em>object         | Value of type object                                                                                    | &lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;name&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;data</em>type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;socket_type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;mutability&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;value&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Object&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Output&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Mutable&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | | result     | result<em>boolean       | The entity returns a boolean                                                                            | &lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;name&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;data</em>type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;socket<em>type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;mutability&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;result&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Bool&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Output&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Immutable&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | &lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;Namespace&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;TypeName&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;Extension&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;core&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;component</em>category&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;&quot;result&quot;&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;                                                                                                                   |</p>

<p>&lt;/details&gt;</p>

<h4 id='output_a_single_type_or_a_single_instance_as_markdown_table'>Output a single type or a single instance as Markdown table</h4>

<pre><code>$ reactive-graph client components get &lt;namespace&gt; &lt;type_name&gt; --output-format markdown-table
$ reactive-graph client entity-types get &lt;namespace&gt; &lt;type_name&gt; --output-format markdown-table
$ reactive-graph client relation-types get &lt;namespace&gt; &lt;type_name&gt; --output-format markdown-table
$ reactive-graph client entity-instances get &lt;namespace&gt; &lt;type_name&gt; --output-format markdown-table
$ reactive-graph client relation-instances get &lt;namespace&gt; &lt;type_name&gt; --output-format markdown-table</code></pre>

<h4 id='output_a_single_component_as_markdown_table'>Output a single component as Markdown table</h4>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph client components get value value_number --output-format markdown-table&lt;/code&gt;&lt;/summary&gt;</p>

<p>| namespace | name         | description          | properties                                                                                                                                                                                                                                                                                                                                        | extensions | |-----------|--------------|----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------| | value     | value<em>number | Value of type number | &lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;name&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;data</em>type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;socket_type&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;th&gt;&lt;div&gt;&lt;p&gt;mutability&lt;/p&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;value&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Number&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Output&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div&gt;&lt;p&gt;Mutable&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; |            |</p>

<p>&lt;/details&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h3 id='shell_completions'>Shell Completions</h3>

<p>In order to further improve the user experience with the command line interface we&#8217;ve implemented the feature to generate shell completions.</p>

<p>&lt;details&gt; &lt;summary&gt;List of Supported Shells&lt;/summary&gt;</p>

<ul>
<li>bash</li>

<li>elvish</li>

<li>fish</li>

<li>powershell</li>

<li>zsh</li>
</ul>

<p>&lt;/details&gt;</p>

<p>On linux it&#8217;s possible to install the shell completions for the given shell by executing:</p>

<pre><code class="language-    ">$ reactive-graph --install-shell-completions bash|fish|zsh</code></pre>

<p>Then you have to restart the shell, for example:</p>

<pre><code>$ zsh</code></pre>

<p>Profit!</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph --&lt;/code&gt; &lt;kbd&gt;TAB&lt;/kbd&gt;&lt;/summary&gt;</p>

<pre><code>--daemon-group               -- If set will drop privileges to the specified group. Note: Both must be given: user and group
--daemon                     -- If true, the process will run as daemon
--daemon-name                -- Sets the name of the daemon
--daemon-pid                 -- The location of the daemon PID file. By default, no PID file will be created
--daemon-stderr              -- Stderr will be written into this file
--daemon-stdout              -- Stdout will be written into this file
--daemon-user                -- If set will drop privileges to the specified user. Note: Both must be given: user and group
--daemon-working-directory   -- The working directory of the daemon
--default-context-path       -- The default context path which redirects the root context to a web resource provider
--disable-all-plugins        -- If true, all plugins will be disabled
--disabled-plugins           -- The list of plugins to disable
--disable-hot-deploy         -- If true, hot deployment will be disabled
--enabled-plugins            -- The list of plugins to enable
--graphql-config             -- The GraphQL config location
--help                       -- Print help
--hostname                   -- The hostname to bind the GraphQL HTTP server
--hot-deploy-location        -- The folder which is watched for hot deployment
--install-location           -- The folder which plugins are installed permanently
--install-man-pages          -- If true, installs man pages
--install-shell-completions  -- If true, installs shell completions
--instance-config            -- The instance config location
--instance-description       -- The description of the instance
--instance-name              -- The name of the instance
--logging-config             -- The logging config location
--markdown-help              -- If true, generates command line documentation
--plugins-config             -- The plugins config location
--port                       -- The port to bind the GraphQL HTTP server
--print-man-pages            -- If true, generates man pages
--print-shell-completions    -- If true, prints shell completions
--quiet                      -- If true, logging is disabled completely
--secure                     -- If true, HTTPS is enabled
--shutdown-timeout           -- Timeout for graceful workers shutdown in seconds. After receiving a stop signal, workers have this much time to finish serving requests. Workers still alive after the timeout are force dropped. By default, shutdown timeout sets to 30 seconds
--ssl-certificate-path       -- The location of the certificate
--ssl-private-key-path       -- The location of the private key
--stop-immediately           -- If true, the runtime does not wait before exiting
--version                    -- Print version
--workers                    -- The number of workers to start. The default worker count is the number of physical CPU cores available</code></pre>

<p>&lt;/details&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h3 id='man_pages_(linux_only)'>Man Pages (Linux only)</h3>

<p>Similarly to shell completions, the command line interface can generate, print and install man pages.</p>

<p>&lt;details&gt; &lt;summary&gt;What is a man page?&lt;/summary&gt;</p>

<p>A man page (short for manual page) is a form of software documentation usually found on a Unix or Unix-like operating system. Topics covered include computer programs (including library and system calls), formal standards and conventions, and even abstract concepts. A user may invoke a man page by issuing the man command.</p>

<p><a href='https://en.wikipedia.org/wiki/Man_page'>Wikipedia</a></p>

<p>&lt;/details&gt;</p>

<p>First, you can install man pages:</p>

<pre><code>$ reactive-graph --install-man-pages</code></pre>

<p>Then you can use the <code>man</code> command:</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ man reactive-graph&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>reactive-graph(1)                                                                                                                                          General Commands Manual                                                                                                                                          reactive-graph(1)

NAME
       reactive-graph - Reactive Graph is a reactive runtime based on a graph database, empowering everyone to build reliable and efficient software.

SYNOPSIS
       reactive-graph  [--logging-config] [--instance-config] [--graphql-config] [--plugins-config] [-n|--instance-name] [-d|--instance-description] [--hostname] [--port] [--secure] [--ssl-certificate-path] [--ssl-private-key-path] [--shutdown-timeout] [-w|--workers] [-c|--default-context-path] [-x|--disable-all-plugins] [-p|--dis‐
       abled-plugins] [-P|--enabled-plugins] [--disable-hot-deploy] [--hot-deploy-location] [--install-location] [--stop-immediately] [-q|--quiet] [--print-man-pages] [--install-man-pages] [--print-shell-completions] [--install-shell-completions]  [-D|--daemon]  [--daemon-name]  [--daemon-pid]  [--daemon-working-directory]  [--dae‐
       mon-stdout] [--daemon-stderr] [--daemon-user] [--daemon-group] [-h|--help] [-V|--version] [subcommands]

DESCRIPTION
       Reactive Graph is a reactive runtime based on a graph database, empowering everyone to build reliable and efficient software.

OPTIONS
       --logging-config=LOGGING_CONFIG
              The logging config location
              May also be specified with the REACTIVE_GRAPH_LOGGING_CONFIG environment variable.

       --instance-config=INSTANCE_CONFIG
              The instance config location
              May also be specified with the REACTIVE_GRAPH_INSTANCE_CONFIG environment variable.

...</code></pre>

<p>&lt;/details&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h3 id='dedicated_client_binary'>Dedicated client binary</h3>

<p>We follow the approach to have one binary for all use cases (server &amp; client).</p>

<p>Additionally, we <a href='https://github.com/reactive-graph/reactive-graph/pull/135'>now provide a second binary that only contains the client</a>.</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ ls -lah target/debug/reactive-graph*&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>-rwxrwxr-x 2 rust rust 81M reactive-graph
-rwxrwxr-x 2 rust rust 29M reactive-graph-client</code></pre>

<p>&lt;/details&gt;</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph-client relation-instances list --output-format count&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>9366 result(s)</code></pre>

<p>&lt;/details&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h3 id='daemonize'>Daemonize</h3>

<p>On Linux, it&#8217;s <a href='https://github.com/reactive-graph/reactive-graph/pull/153'>now possible to start the process and run it in the background</a>. Because the daemon has no stdout and stderr, a file can be given as output. Also, the process can drop privileges to a given user+group. Optionally, a PID and name can be specified.</p>

<p>&lt;details&gt; &lt;summary&gt;&lt;code&gt;$ reactive-graph --help&lt;/code&gt;&lt;/summary&gt;</p>

<pre><code>  -D, --daemon
          If true, the process will run as daemon [env: REACTIVE_GRAPH_DAEMON=]
      --daemon-name &lt;DAEMON_NAME&gt;
          Sets the name of the daemon [env: REACTIVE_GRAPH_DAEMON_NAME=]
      --daemon-pid &lt;DAEMON_PID&gt;
          The location of the daemon PID file. By default, no PID file will be created [env: REACTIVE_GRAPH_DAEMON_PID=]
      --daemon-working-directory &lt;DAEMON_WORKING_DIRECTORY&gt;
          The working directory of the daemon [env: REACTIVE_GRAPH_DAEMON_WORKING_DIRECTORY=]
      --daemon-stdout &lt;DAEMON_STDOUT&gt;
          Stdout will be written into this file [env: REACTIVE_GRAPH_DAEMON_STDOUT=]
      --daemon-stderr &lt;DAEMON_STDERR&gt;
          Stderr will be written into this file [env: REACTIVE_GRAPH_DAEMON_STDERR=]
      --daemon-user &lt;DAEMON_USER&gt;
          If set will drop privileges to the specified user. Note: Both must be given: user and group [env: REACTIVE_GRAPH_DAEMON_USER=]
      --daemon-group &lt;DAEMON_GROUP&gt;
          If set will drop privileges to the specified group. Note: Both must be given: user and group [env: REACTIVE_GRAPH_DAEMON_GROUP=]</code></pre>

<p>&lt;/details&gt;</p>

<p>In order to start Reactive Graph as a daemon, you have to pass the parameter <code>-D</code> or set the environment variable <code>REACTIVE_GRAPH_DAEMON=true</code>:</p>

<pre><code>$ reactive-graph --daemon</code></pre>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='refactoring'>Refactoring</h2>

<h3 id='extracted_table_model'>Extracted table model</h3>

<p>The table model has been <a href='https://github.com/reactive-graph/reactive-graph/pull/135'>refactored into its own crate</a>. This allows to print tables in other command line applications.</p>

<p>The examples are now using the table model. The printed tables look better than before. Thanks to the table model, it is no more necessary to render tables manually.</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h3 id='graphql_schema'>GraphQL Schema</h3>

<p>There are some changes to the GraphQL schema:</p>

<p>&lt;details&gt; &lt;summary&gt;List of Changes&lt;/summary&gt;</p>

<ul>
<li>edgeKey has been renamed to relationInstanceId for consistency</li>

<li>EdgeKeyDefinition has been renamed to RelationInstanceIdDefinition for consistency</li>

<li>Extended mutation <code>instances -&gt; relations -&gt; update()</code> with the new parameters addProperties and removeProperties in order to add or remove one or multiple properties</li>
</ul>

<p>&lt;/details&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='design_system_enhancements'>Design System Enhancements</h2>

<h3 id='circle_logos'>Circle Logos</h3>

<p>We added a <a href='https://design.reactive-graph.io/docs/fundamentals/logo.html'>new set of logos</a> with a circle around the inner graph symbol:</p>

<p>&lt;table&gt;</p>

<pre><code>&lt;tr&gt;
    &lt;td&gt;Black/White&lt;/td&gt;
    &lt;td&gt;Malachite&lt;/td&gt;
    &lt;td&gt;Selective Yellow&lt;/td&gt;
    &lt;td&gt;Celestial Blue&lt;/td&gt;
    &lt;td&gt;Mexican Pink&lt;/td&gt;
    &lt;td&gt;Chartreuse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-malachite.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-selective-yellow.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-celestial-blue.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-mexican-pink.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-chartreuse.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-black.svg&quot; style=&quot;width:64px;height:64px;text-align:center;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-black-malachite.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-black-selective-yellow.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-black-celestial-blue.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-black-mexican-pink.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-black-chartreuse.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-white.svg&quot; style=&quot;width:64px;height:64px;text-align:center;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-white-malachite.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-white-selective-yellow.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-white-celestial-blue.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-white-mexican-pink.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src=&quot;design/public/logo/circle/reactive-graph-circle-white-chartreuse.svg&quot; style=&quot;width:64px;height:64px;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;</code></pre>

<p>&lt;/table&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h3 id='horizontal_rules'>Horizontal Rules</h3>

<p>Nothing special, but useful: <a href='https://design.reactive-graph.io/components/detail/hr--default.html'>horizontal rules</a></p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='project_maintenance'>Project Maintenance</h2>

<h3 id='social_media'>Social Media</h3>

<p>We created a <a href='https://www.youtube.com/@reactive-graph'>YouTube channel</a>, a <a href='https://www.facebook.com/reactive.graph'>facebook profile</a> and a <a href='https://floss.social/@reactive_graph'>mastodon account</a>. We will start social media activities in near future.</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h3 id='contribution_guidelines_&_security_policy'>Contribution Guidelines &amp; Security Policy</h3>

<p>We&#8217;ve extended the <a href='https://github.com/reactive-graph/reactive-graph/blob/main/CONTRIBUTING.md'>Contribution Guidelines</a> and added a <a href='https://github.com/reactive-graph/reactive-graph/blob/main/SECURITY.md'>Security Policy</a>.</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<p>{{ footer::print(issue<em>date</em>previous=&quot;2024-08-31&quot;, issue<em>date</em>next=&quot;&quot;) }}</p>
]]></content:encoded></item><item><title>August 2024 in Reactive Graph</title><link>https://this-month-in.reactive-graph.io/2024-08-this-month-in-reactive-graph.html</link><description><![CDATA[The 'August 2024' issue of 'This Month in Reactive Graph' summarizes the progress of Reactive Graph. The topics of this issue are: Manage the type system via the command line interface, Java GraphQL Client POC and the specification of the Identity and Permission System]]></description><author>Andreas Schaeffer</author><pubDate>Sat, 31 Aug 2024 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>{% import &quot;header.tera&quot; as header %} {% import &quot;footer.tera&quot; as footer %}</p>

<p>{{ header::print(year=&quot;2024&quot;,month=&quot;August&quot;) }}</p>

<p>&lt;hr class=&quot;surface-2&quot;&gt;</p>

<h2 id='table_of_contents'>Table of Contents</h2>

<p>&lt;!-- toc --&gt;</p>

<p>&lt;hr class=&quot;surface-2&quot;&gt;</p>

<h2 id='extended_the_<span_class="token_rg-component">rust_graphql_client</span>'>Extended the &lt;span class=&quot;token rg-component&quot;&gt;Rust GraphQL Client&lt;/span&gt;</h2>

<p>The Rust GraphQL Client is important to make Reactive Graph more useful and accessible. It allows to access the Reactive Graph programmatically by simply using the crate <code>reactive-graph-client</code>. The client crate is the foundation for the command line interface and for rust applications.</p>

<p>The Rust GraphQL Client is now capable to &lt;span class=&quot;token rg-component&quot;&gt;manage the type system&lt;/span&gt;. This means you can query or alter components, entity types and relation types. Furthermore, we started with the implementation of &lt;span class=&quot;token rg-component&quot;&gt;managing the instance system&lt;/span&gt;. This means you can query and alter entity instances and relation instances. Last but not least, we decided to defer work on the flow types and flow instances till instance system has been fully implemented.</p>

<p>The following diagram shows the importance of the Rust GraphQL Client:</p>

<p>&lt;pre class=&quot;mermaid&quot;&gt;flowchart TD</p>

<pre><code>subgraph Runtime
    G[GraphQL API]
    A[Reactive Graph]</code></pre>

<pre><code>    G --&amp;gt; A
end</code></pre>

<pre><code>subgraph Client
    CLI[Command Line Interface]
    RC1[Rust Client]</code></pre>

<pre><code>    CLI --&amp;gt; RC1
    RC1 --&amp;gt; G
end</code></pre>

<pre><code>subgraph Rust Application
    RA[Rust Application]
    RC2[Rust Client]</code></pre>

<pre><code>    RA --&amp;gt; RC2
    RC2 --&amp;gt; G
end</code></pre>

<p>&lt;/pre&gt;</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='extended_the_<span_class="token_rg-component">command_line_interface</span>'>Extended the &lt;span class=&quot;token rg-component&quot;&gt;Command Line Interface&lt;/span&gt;</h2>

<p>The command line interface made big progress.</p>

<h3 id='manage_type_system_via_cli'>Manage Type System via CLI</h3>

<pre><code class="language-shell">➜ reactive-graph client entity-types get string title_case                                                        </code></pre>

<p>&lt;details&gt; &lt;summary&gt;Command Output&lt;/summary&gt;</p>

<pre><code class="language-shell">╔════════════════════════╦════════════════════════╦══════════════════════════════════╦══════════════════════════════════════╦══════════════════════════════════════════════════════════════════════════════╦════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ namespace              ║ name                   ║ description                      ║ components                           ║ properties                                                                   ║ extensions                                                                                                         ║
╠════════════════════════╬════════════════════════╬══════════════════════════════════╬══════════════════════════════════════╬══════════════════════════════════════════════════════════════════════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ string                 ║ title_case             ║ Converts the input to title case ║  namespace       │ name              ║  name                                │ data_type │ socket_type │ mutability  ║  namespace              │ name                   │ description │ extension                                         ║
║                        ║                        ║                                  ║ ─────────────────┼────────────────── ║ ─────────────────────────────────────┼───────────┼─────────────┼──────────── ║ ────────────────────────┼────────────────────────┼─────────────┼────────────────────────────────────────────────── ║
║                        ║                        ║                                  ║  string          │ string_operation  ║  result                              │ String    │ Output      │ Immutable   ║  core                   │ divergent              │             │ []                                                ║
║                        ║                        ║                                  ║                                      ║ ─────────────────────────────────────┼───────────┼─────────────┼──────────── ║ ────────────────────────┼────────────────────────┼─────────────┼────────────────────────────────────────────────── ║
║                        ║                        ║                                  ║                                      ║  lhs                                 │ String    │ Input       │ Mutable     ║  metadata               │ dublin-core            │             │ {                                                 ║
║                        ║                        ║                                  ║                                      ║                                                                              ║                         │                        │             │   &quot;creator&quot;: &quot;Hanack&quot;,                            ║
║                        ║                        ║                                  ║                                      ║                                                                              ║                         │                        │             │   &quot;subject&quot;: &quot;Converts the input to title case&quot;,  ║
║                        ║                        ║                                  ║                                      ║                                                                              ║                         │                        │             │   &quot;title&quot;: &quot;Title Case&quot;                           ║
║                        ║                        ║                                  ║                                      ║                                                                              ║                         │                        │             │ }                                                 ║
╚════════════════════════╩════════════════════════╩══════════════════════════════════╩══════════════════════════════════════╩══════════════════════════════════════════════════════════════════════════════╩════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝</code></pre>

<p>&lt;/details&gt;</p>

<h3 id='output_format_table'>Output Format Table</h3>

<p>With the new parameter <code>--output-format</code> it is possible to output the data in table format (default), or as JSON or as TOML.</p>

<p>You can explicitly define the output format is table:</p>

<pre><code class="language-shell">➜ reactive-graph client entity-instances list-properties 6ba7b810-9e15-11d1-50b4-00c04fd530c7 --output-format=table</code></pre>

<p>Or you can just omit the option, because table is the default output format:</p>

<pre><code class="language-shell">➜ reactive-graph client entity-instances list-properties 6ba7b810-9e15-11d1-50b4-00c04fd530c7</code></pre>

<p>&lt;details&gt; &lt;summary&gt;Command Output&lt;/summary&gt;</p>

<pre><code class="language-shell">╔════════════╦═════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ name       ║ value                                                                                               ║
╠════════════╬═════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ args       ║ [{&quot;help&quot;:&quot;Delay shutdown by N seconds&quot;,&quot;long&quot;:&quot;delay&quot;,&quot;name&quot;:&quot;delay&quot;,&quot;required&quot;:false,&quot;short&quot;:&quot;d&quot;}] ║
╠════════════╬═════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ cmd_result ║ 0                                                                                                   ║
╠════════════╬═════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ prop_name  ║ &quot;New Value&quot;                                                                                         ║
╠════════════╬═════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ label      ║ &quot;/org/inexor/commands/core/shutdown&quot;                                                                ║
╠════════════╬═════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ delay      ║ 0                                                                                                   ║
╠════════════╬═════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ command    ║ &quot;shutdown&quot;                                                                                          ║
╠════════════╬═════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ trigger    ║ false                                                                                               ║
╠════════════╬═════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ namespace  ║ &quot;core&quot;                                                                                              ║
╠════════════╬═════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ help       ║ &quot;Shutdown the application&quot;                                                                          ║
╚════════════╩═════════════════════════════════════════════════════════════════════════════════════════════════════╝</code></pre>

<p>&lt;/details&gt;</p>

<h3 id='output_format_json'>Output Format JSON</h3>

<p>Additionally to the output format table, two new output formats have been implemented <code>json</code> and <code>toml</code>. This allows to use the Reactive Graph CLI as tool for exporting types and instances.</p>

<pre><code class="language-shell">➜ reactive-graph client entity-instances list-properties 6ba7b810-9e15-11d1-50b4-00c04fd530c7 --output-format=json</code></pre>

<p>&lt;details&gt; &lt;summary&gt;Command Output&lt;/summary&gt;</p>

<pre><code class="language-shell">[
  {
    &quot;name&quot;: &quot;help&quot;,
    &quot;value&quot;: &quot;Shutdown the application&quot;
  },
  {
    &quot;name&quot;: &quot;label&quot;,
    &quot;value&quot;: &quot;/org/inexor/commands/core/shutdown&quot;
  },
  {
    &quot;name&quot;: &quot;trigger&quot;,
    &quot;value&quot;: false
  },
  {
    &quot;name&quot;: &quot;cmd_result&quot;,
    &quot;value&quot;: 0
  },
  {
    &quot;name&quot;: &quot;prop_name&quot;,
    &quot;value&quot;: &quot;New Value&quot;
  },
  {
    &quot;name&quot;: &quot;args&quot;,
    &quot;value&quot;: [
      {
        &quot;help&quot;: &quot;Delay shutdown by N seconds&quot;,
        &quot;long&quot;: &quot;delay&quot;,
        &quot;name&quot;: &quot;delay&quot;,
        &quot;required&quot;: false,
        &quot;short&quot;: &quot;d&quot;
      }
    ]
  },
  {
    &quot;name&quot;: &quot;delay&quot;,
    &quot;value&quot;: 0
  },
  {
    &quot;name&quot;: &quot;namespace&quot;,
    &quot;value&quot;: &quot;core&quot;
  },
  {
    &quot;name&quot;: &quot;command&quot;,
    &quot;value&quot;: &quot;shutdown&quot;
  }
]</code></pre>

<p>&lt;/details&gt;</p>

<p>Also, it allows to use the CLI as stdin for other CLI programs by using shell pipes. For example:</p>

<pre><code class="language-shell">reactive-graph client entity-type get namespace type_name --output-format=JSON | less</code></pre>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='replacing_openssl_with_<span_class="token_rg-component">rustls</span>'>Replacing OpenSSL with &lt;span class=&quot;token rg-component&quot;&gt;rustls&lt;/span&gt;</h2>

<ul>
<li>Started work on replacing OpenSSL with rustls</li>

<li>Actix Web now supports rustls</li>

<li>Patched the gql-client crate for rustls support</li>

<li>Waiting for a PR in aws-lc-rs to be merged (https://github.com/aws/aws-lc-rs/pull/491) since aws-lc-rs requires NASM on windows and this breaks the CI</li>
</ul>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='continuous_modernization'>Continuous Modernization</h2>

<ul>
<li>Fixed a bunch of &lt;span class=&quot;token rg-component&quot;&gt;clippy lints&lt;/span&gt;</li>

<li>Upgraded builds to use the &lt;span class=&quot;token rg-component&quot;&gt;latest nightly rust compiler&lt;/span&gt;</li>

<li>Replaced old GitHub Actions (actions-rs) with &lt;span class=&quot;token rg-component&quot;&gt;modern GitHub Actions&lt;/span&gt;</li>

<li>We are not quite happy that windows builds needs more than an hour and mac builds more than three hours, so we &lt;span class=&quot;token rg-component&quot;&gt;added another layer of cache&lt;/span&gt; to speed up the CI</li>

<li>&lt;span class=&quot;token rg-component&quot;&gt;Pinned the nightly version&lt;/span&gt; in order to make caching in the CI more effective</li>
</ul>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='<span_class="token_rg-component">java</span>_graphql_client'>&lt;span class=&quot;token rg-component&quot;&gt;Java&lt;/span&gt; GraphQL Client</h2>

<ul>
<li>The goal was to show that it&#8217;s possible to manage the Reactive Graph &lt;span class=&quot;token rg-component&quot;&gt;from a programming language other than Rust&lt;/span&gt;</li>

<li>A gradle plugin &lt;span class=&quot;token rg-component&quot;&gt;generates&lt;/span&gt; POJOs and interfaces from the GraphQL schema (&lt;span class=&quot;token rg-component&quot;&gt;schema first approach&lt;/span&gt;). It&#8217;s even possible to implement Spring Data alike repositories</li>

<li>The status of the Java GraphQL Client is only a proof of concept. In the future, the Java GraphQL Client shall be on &lt;span class=&quot;token rg-component&quot;&gt;feature parity with the Rust GraphQL Client&lt;/span&gt;</li>
</ul>

<p>The following diagram shows how the GraphQL Client APIs are used by applications:</p>

<p>&lt;pre class=&quot;mermaid&quot;&gt;flowchart TD</p>

<pre><code>subgraph Runtime
    G[GraphQL API]
    A[Reactive Graph]</code></pre>

<pre><code>    G --&amp;gt; A
end</code></pre>

<pre><code>subgraph Client
    CLI[Command Line Interface]
    RC1[Rust Client]</code></pre>

<pre><code>    CLI --&amp;gt; RC1
    RC1 --&amp;gt; G
end</code></pre>

<pre><code>subgraph Rust Application
    RA[Rust Application]
    RC2[Rust Client]</code></pre>

<pre><code>    RA --&amp;gt; RC2
    RC2 --&amp;gt; G
end</code></pre>

<pre><code>subgraph Java Application
    JA[Java Application]
    JC[Java Client]</code></pre>

<pre><code>    JA --&amp;gt; JC
    JC --&amp;gt; G
end</code></pre>

<p>&lt;/pre&gt;</p>

<p>As you can see, thanks to the &lt;span class=&quot;token rg-component&quot;&gt;GraphQL API&lt;/span&gt; it is possible to build applications in different programming languages.</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='poc_wasm_/_wasi'>POC WASM / WASI</h2>

<p>We implemented a <a href='https://github.com/reactive-graph/poc-wasm-wasi-preview-2-plugin-system'>POC</a> to check the current status of WASM. WASM will be an important part of the Reactive Graph. One use case is that the Reactive Graph could use WASM to load plugins written in &quot;any&quot; language that compiles to WASM. Another use case is that the Reactive Graph could use WASM to load behaviours for reactive entities or reactive relations. The POC showed that it now possible to interop with more complex data than primitive data types like integers.</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='identity_and_permission_system'>Identity and Permission System</h2>

<p>Currently, Reactive Graph lacks an &lt;span class=&quot;token rg-component&quot;&gt;Identity and Permission System&lt;/span&gt;. One of the next steps will be to implement it. We decided to not use an existing framework. The type system has to be threatened a bit different from the instance system. Also, the permission system is more complex for the instance system. In a first step we &lt;span class=&quot;token rg-component&quot;&gt;specified the requirements and the data model&lt;/span&gt; of the upcoming identity management and the permission system (https://github.com/reactive-graph/reactive-graph/issues/26).</p>

<p>&lt;hr class=&quot;celestial-blue&quot;&gt;</p>

<h2 id='goals_for_september_2024'>Goals for September 2024</h2>

<p>(highest priority on top)</p>

<ol type="1">
<li>Finish work on the rust GraphQL client and the Command Line Interface</li>

<li>Finish replacing OpenSSL with rustls</li>

<li>Start work on the Identity and Permission System</li>

<li>Specify the Type System Persistence (&lt;span class=&quot;token rg-component&quot;&gt;Graph Relational Mapper&lt;/span&gt;)</li>
</ol>

<p>{{ footer::print(issue<em>date</em>previous=&quot;&quot;, issue<em>date</em>next=&quot;2024-09-30&quot;) }}</p>
]]></content:encoded></item></channel></rss>