Updates as published 2025-03-25
diff --git a/src/docs/about.md b/src/docs/about.md
index 40c44af..56ec640 100644
--- a/src/docs/about.md
+++ b/src/docs/about.md
@@ -1,12 +1,12 @@
 # What is Apostrophy?
 
-In a nutshell, Apostrophy is an Android-based operating system, a bunch of system services, and a
-number of software packages.
+In a nutshell, Apostrophy is an AOSP-based operating system, down to the level of firmware, a bunch
+of infrastructure services, and a number of software packages.
 
 But you knew that already. What is it really?
 
-Apostrophy integrates Android to mobile devices that are a part of a larger eco-system, and provides
-its customers with a turn-key solutions to in-house and on-prem some, many or all of the required
-processes.
+Apostrophy integrates Android to mobile devices that are a part of a larger eco-system, and
+provides its customers with a turn-key solutions to in-house and on-prem some, many or all of the
+required processes.
 
 It's on a mission to fix the eco-system in mobility.
diff --git a/src/docs/carriers/intro.md b/src/docs/carriers/intro.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/docs/carriers/intro.md
diff --git a/src/docs/developers/platform.md b/src/docs/developers/platform.md
index fff8486..e6bd91e 100644
--- a/src/docs/developers/platform.md
+++ b/src/docs/developers/platform.md
@@ -10,7 +10,9 @@
 organizations and projects:
 
   * the Android Open Source Project (*AOSP*)
-  * Original Device Manufacturer (*ODM*) Board Support Packages (*BSP*)
+  * Original Device Manufacturer (*ODM*)
+  * Chipset Manufacturers (Mediatek, Qualcomm)
+  * Board Support Packages (*BSP*)
   * Independent Development Houses (*IDH*)
   * Original Equipment Manufacturer (*OEM*) Software
   * GrapheneOS (*Graphene*)
diff --git a/src/docs/developers/platform/customizing-builds.md b/src/docs/developers/platform/customizing-builds.md
index 095f38f..3de1136 100644
--- a/src/docs/developers/platform/customizing-builds.md
+++ b/src/docs/developers/platform/customizing-builds.md
@@ -5,3 +5,105 @@
 This article is a work in progress
 
 :::
+
+## Boot Logo
+
+The boot logo is shown when the device is powered on, and before any boot animation starts. It is a
+static BMP file that should display a logo.
+
+Since the resolutions of screens vary, it should be centrally located, and use a background that is
+the same as the start of the boot animation documented below.
+
+Unless otherwise agreed, this is the Apostrophy logo.
+
+## Boot Animation
+
+The boot sequence of the phone consists of the following three components;
+
+1.  A static Apostrophy logo is displayed for approximately 3 seconds, see [Boot Logo](#boot-logo),
+
+1.  An animation plays for approximately 5 seconds, during which a sound may be heard,
+
+1.  Either the setup wizard dialog, or the default user (owner) lock screen is displayed.
+
+#### Implementation of a Boot Animation
+
+* A static Apostrophy logo is displayed preceeding the animation part, and it is not normally
+  customized. However, it's color scheme may need to be altered to facilitate the starting frame of
+  the custom boot animation.
+
+* Custom boot animations are controlled through a description text file containing the devices
+  horizontal and vertical resolution and the framerate at which the animation is to run, as well as
+  the stages at which certain animations are to play, in the following syntax;
+
+  ```
+  [width] [height] [framerate]
+  [c|p] [loops] [pause] [folder] [background]
+  [c|p] [loops] [pause] [folder] [background]
+  [c|p] [loops] [pause] [folder] [background]
+
+  ```
+
+  :::note[The last line of `desc.txt` must be an empty line]
+  :::
+
+  For example;
+
+  ```
+  1080 2400 24
+  c 1 0 part0 000000
+  c 1 0 part1 000000
+  p 1 0 part2 000000
+
+  ```
+
+  This constitutes a 3-phase animation, 2 parts of which are forcefully continuous and the last
+  part being one that is abruptly cut when the OS has completed loading.
+
+* The images MUST be in PNG format.
+
+* Neither the directory hierarchy nor the image filenames can contain spaces. Use dashes and
+  underscores where needed.
+
+* Images are played in the order in which they appear when alphabetically sorted. It is
+  recommended to use a suffix for numbering and thus sequencing, and not a prefix.
+
+* The zip file you deliver must be created **without compression**.
+
+  An example command-line invocation (that avoids `.DS_Store` and alike):
+
+  ```
+  $ cd /path/to/boot-animation-source-material/
+  $ zip -0qry -i \*.txt \*.png \*.wav @ ../bootanimation.zip *.txt part*
+  ```
+
+* At a framerate that does not correspond to the refresh rate of the screen in a sensible way,
+  divergence may result in a poor animation quality.
+
+* At a framerate of 24, the phone will rotate through a directory `part0` with 24 images in 1
+  second. Design the number of images to use in the animation accordingly.
+
+  This means your sequence existing of 120 images will last for 5 seconds.
+
+* You MAY supply an `audio.wav` to be included in your animation. The duration of this audio file
+  playing must not exceed the animation.
+
+  Apostrophy will by default include a carefully crafted, specifically designed 384 kbit/s silence.
+
+* You MUST leave the last phase as interruptable by the OS having loaded succesfully.
+
+## Setup Wizard
+
+TBD
+
+## Iconography
+
+TBD
+
+## Sound Package
+
+TBD
+
+## Wallpapers
+
+TBD
diff --git a/src/docs/developers/platform/development-process.md b/src/docs/developers/platform/development-process.md
index be112e4..f66e534 100644
--- a/src/docs/developers/platform/development-process.md
+++ b/src/docs/developers/platform/development-process.md
@@ -59,13 +59,15 @@
 
 ## Branch, Code, Commit & Submit
 
-The process of coding in changes is a natural process, and of course you don't really want to commit
-and submit for review, a sloppy work-in-progress series of commits (that include superfluous log
-messages, maybe some logical mistakes, summary skill issues, etc.).
+The process of coding in changes is a natural process, and of course you don't really want to
+submit for review, a sloppy work-in-progress series of commits (that include superfluous log
+messages, maybe some typos or skill issues, etc.).
+
+In the example in this section, we choose a strategy of branching off specific repositories.
 
 ### Step 1: Branch off Individual Repositories
 
-We start work by branching off a repository:
+Start work by branching off a repository:
 
 ```bash
 $ repo start <topic-branch-name> <path/to/repository/>
@@ -80,8 +82,8 @@
 :::note[This is not the only repository that is going to need to be forked]
 :::
 
-Now, we edit `aphy/aos/aos.mk` and eject the `PRODUCT_PACKAGES += AphyLauncher` and associated
-lines, and remove associated artifacts. Commit it, push it;
+Now, edit `aphy/aos/aos.mk` and eject the `PRODUCT_PACKAGES += AphyLauncher` and associated lines,
+and remove associated artifacts. Commit it, push it;
 
 ```bash
 # git -C aphy/aos/ push <remote> HEAD:refs/heads/<topic-branch-name>
@@ -91,8 +93,8 @@
 :::note[Force Pushes are (should be) permitted for `dev/` branches]
 :::
 
-The effective change here is that the inclusion of AphyLauncher no longer overrides the inclusion of
-`packages/apps/Launcher3` (if that just so happened to be already there, otherwise see Step 3).
+The effective change here is that the inclusion of AphyLauncher no longer overrides the inclusion
+of `packages/apps/Launcher3` (if that just so happened to be already there, otherwise see Step 3).
 
 ### Step 2: A New Repository?
 
@@ -119,7 +121,8 @@
 
 ```bash
 $ cd $APHY_ROOT/build/
-$ repo init -u ssh://gerrit.aphy.ag/mc02/platform_manifest -b dev/T1785
+# This assumes an already initialized repo against URL ssh://gerrit.aphy.ag/mc02/platform_manifest
+$ repo init -b dev/T1785
 $ repo sync -j8
 ```
 
diff --git a/src/docs/developers/platform/getting-started.md b/src/docs/developers/platform/getting-started.md
index 3c9c984..419eea1 100644
--- a/src/docs/developers/platform/getting-started.md
+++ b/src/docs/developers/platform/getting-started.md
@@ -27,6 +27,13 @@
 While it doesn't really matter where exactly you put this `APHY_ROOT`, it should have more than
 enough disk space, and ideally also rather speedy disks.
 
+:::note[Mind the Gap]
+
+Please limit the string-length of the `APHY_ROOT` path length
+[here](hardware-requirements#mind-your-build-hierarchy-path-length)
+
+:::
+
 :::tip[We will continue to refer to `$APHY_ROOT`, so ...]
 
 ... maybe include the following line in `~/.bashrc`:
@@ -42,10 +49,23 @@
 ```bash title="Example process for the mainstream source and build hierarchy"
 $ mkdir -p $APHY_ROOT/build/
 $ cd $APHY_ROOT/build/
-$ repo init -u ssh://gerrit.aphy.ag/aphy/platform_manifest -b master
+$ repo init -u ssh://gerrit.aphy.ag/aphy/platform_manifest -b dev/graphene-rebase -m mc02.xml
 $ repo sync -j8
 ```
 
+:::tip[`~/.ssh/config`]
+
+Consider configuring your `~/.ssh/config` to include the following;
+
+```
+Host gerrit.aphy.ag
+    User YOUR_USERNAME
+    Port 29418
+    IdentityFile ~/.ssh/id_rsa_your_public_key
+```
+
+:::
+
 :::note[TODO]
 
 We have to work on;
diff --git a/src/docs/developers/platform/hardware-requirements.md b/src/docs/developers/platform/hardware-requirements.md
index 89fb752..f45af69 100644
--- a/src/docs/developers/platform/hardware-requirements.md
+++ b/src/docs/developers/platform/hardware-requirements.md
@@ -20,6 +20,36 @@
 
 The signing system is a different system, about which you could dream, or speculate, or care less.
 
+## Tips
+
+### Mind Your Build Hierarchy Path Length
+
+While you may of course originally develop in a hierarchy located at
+`/home/your-username/devel/src/aphy/aphyos/build-topic1/`, it should be noted this path can become
+too long for certain build commands (and effectively run out of `MAX_ARGS_LEN`).
+
+If you encounter errors such as the following
+
+```bash
+$ make vts
+(...)
+posix_spawn: Argument list too long
+09:42:16 ninja failed with: exit status 1
+
+#### failed to build some targets (03:00 (mm:ss)) ####
+```
+
+then perhaps temporarily (or permanently) bind-mount to an effectively much shorter path length as
+examplified below, keeping in mind to perform at least one clean build.
+
+```bash
+$ sudo mkdir /srv/aphy
+$ sudo mount -o bind \
+    /home/your-username/devel/src/aphy/aphyos/build-topic1/ \
+    /srv/aphy
+$ cd /srv/aphy
+```
+
 [^1]: It shouldn't really take *that* much, but the release engineer's favorite editor is *emacs*,
     OK?
 
diff --git a/src/docs/developers/platform/kernel-building.md b/src/docs/developers/platform/kernel-building.md
new file mode 100644
index 0000000..b4561fe
--- /dev/null
+++ b/src/docs/developers/platform/kernel-building.md
@@ -0,0 +1,19 @@
+# Release Management
+
+:::note[TODO]
+
+This article is a work in progress.
+
+:::
+
+## Aphyium Testing (!)
+
+
+
+## CTS Testing (!)
+
+```
+export UNZIP_DISABLE_ZIPBOMB_DETECTION=TRUE
+unzip ~/Downloads/android-cts-13_r9-linux_x86-arm.zip
+adb install -r android-cts/repository/testcases/CtsDelegatingAccessibilityService.apk
+```
\ No newline at end of file
diff --git a/src/docs/developers/platform/software-requirements.md b/src/docs/developers/platform/software-requirements.md
index 9cdd975..842f9f7 100644
--- a/src/docs/developers/platform/software-requirements.md
+++ b/src/docs/developers/platform/software-requirements.md
@@ -8,20 +8,35 @@
     * `binutils-aarch64-linux-gnu`
     * `binutils-arm-linux-gnu`
     * `binutils-x86_64-linux-gnu`
+    * `brotli`
+    * `cargo`
     * `ccache`
     * `java`
     * `java-devel`
+    * `java-17-openjdk-devel`
     * `gcc-c++`
+    * `git-filter-repo`
     * `glibc.i686`
+    * `gperf`
     * `libstdc++.i686`
     * `libxcrypt-compat`
     * `ncurses-compat-libs-6.4`
-    * `openssl`
+    * `ninja`
+    * `java-1.8.0-openjdk-headless`
+    * `java-17-openjdk-headless`
+    * `java-21-openjdk-headless`
+    * `openssl-devel`
+    * `openssl-engine-devel`
     * `p7zip`
+    * `parallel`
+    * `perl-FindBin`
     * `python2.7`
+    * `python3.12`
     * `repo`
+    * `secilc`
     * `zlib.i686`
     * `zlib-ng-compat.i686`
+    * `zopfli`
 
 To do this in one fell swoop:
 
@@ -32,18 +47,53 @@
     binutils-aarch64-linux-gnu \
     binutils-arm-linux-gnu \
     binutils-x86_64-linux-gnu \
+    brotli \
+    cargo \
     ccache \
     java \
     java-devel \
+    java-17-openjdk-devel \
     gcc-c++ \
+    git-filter-repo \
     glibc.i686 \
+    gperf \
     libstdc++.i686 \
     libxcrypt-compat \
     ncurses-compat-libs-6.4 \
-    openssl \
+    ninja \
+    java-1.8.0-openjdk-headless \
+    java-17-openjdk-headless \
+    java-21-openjdk-headless \
+    openssl-devel \
+    openssl-devel-engine \
     p7zip \
+    parallel \
+    perl-FindBin \
     python2.7 \
+    python3.12 \
     repo \
+    secilc \
     zlib.i686 \
-    zlib-ng-compat.i686
+    zlib-ng-compat.i686 \
+    zopfli
+```
+
+Further, you may wish to wrap the `repo` command like so:
+
+```bash
+$ cat ~/bin/repo
+#!/bin/bash
+
+if [ -x "$PWD/.repo/repo/repo" ]; then
+    repo_cmd="$PWD/.repo/repo/repo"
+else
+    repo_cmd=/bin/repo
+fi
+
+if [ -z "${repo_cmd}" ]; then
+    echo "No such command repo"
+    exit 1
+fi
+
+${repo_cmd} $@
 ```
diff --git a/src/docs/developers/platform/system-packages/digitalnomad.md b/src/docs/developers/platform/system-packages/digitalnomad.md
index 04ecaa4..c8f4941 100644
--- a/src/docs/developers/platform/system-packages/digitalnomad.md
+++ b/src/docs/developers/platform/system-packages/digitalnomad.md
@@ -6,8 +6,30 @@
 
 :::
 
+DigitalNomad is a VPN client integrated with Apostrophy Services and users require a valid
+subscription to be able to use DigitalNomad.
+
 ## Application Functionality
 
 ## Client-Server Communication Model
 
+When DigitalNomad is started, it submits the Wireguard public key alongside a contemporary (signed)
+token to the VPN management server. The contemporary token originates from the Apostrophy Services
+subscription management API, which only returns such a token for valid subscriptions.
+
+The token does not contain any identifying information.
+
+Upon submission of these two artifacts (and after validation), the VPN management server API
+responds with a connection manifest that describes the entry points and exit points available.
+
+DigitalNomad projects these on the world map (and lists them), so the user can choose where their
+VPN connection should have them end up.
+
 ## Known Limitations
+
+There are a few known limitations to the current DigitalNomad client and VPN management server
+implementation;
+
+  * DigitalNomad does not currently support IPv6-only networks.
+
+  * TBD
diff --git a/src/docs/developers/platform/system-packages/threema.md b/src/docs/developers/platform/system-packages/threema.md
new file mode 100644
index 0000000..8c097aa
--- /dev/null
+++ b/src/docs/developers/platform/system-packages/threema.md
@@ -0,0 +1,475 @@
+# Threema
+
+:::note[Deliberately a version behind]
+
+We use 974 or 5.4.1(l) specifically, so that the functioning of the internal
+application check for updates can be validated end-to-end.
+
+:::
+
+
+## Attempt 20240821.D6
+
+* fdroid apk
+* sha256sum: ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5
+
+```
+$ keytool -printcert -jarfile ch.threema.app.libre_974.apk
+Signer #1:
+
+Certificate #1:
+Owner: CN=Unknown, OU=Unknown, O=Threema GmbH, L=Pfäffikon, ST=SZ, C=CH
+Issuer: CN=Unknown, OU=Unknown, O=Threema GmbH, L=Pfäffikon, ST=SZ, C=CH
+```
+
+Android.mk
+
+```
+$ cat Android.mk
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := ThreemaLibre
+LOCAL_MODULE_CLASS := APPS
+LOCAL_MULTILIB := both
+LOCAL_CERTIFICATE := PRESIGNED
+LOCAL_SRC_FILES := ch.threema.app.libre_974.apk
+LOCAL_PRODUCT_MODULE := true
+LOCAL_DEX_PREOPT := false
+LOCAL_ENFORCE_USES_LIBRARIES := false
+
+include $(BUILD_PREBUILT)
+```
+
+Will fail:
+
+```
+$ sha256sum git-T0MP1/external/Threema/ch.threema.app.libre_974.apk userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk userdebug/out_sys/target/product/mssi_64_cn_armv82/product/app/ThreemaLibre/ThreemaLibre.apk
+ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5  git-T0MP1/external/Threema/ch.threema.app.libre_974.apk
+b9f6ebd114145383691c165222175446df035c251fdbb653de9e1d2f3fadc807  userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk
+b9f6ebd114145383691c165222175446df035c251fdbb653de9e1d2f3fadc807  userdebug/out_sys/target/product/mssi_64_cn_armv82/product/app/ThreemaLibre/ThreemaLibre.apk
+```
+
+and
+
+```
+$ apksigner verify -v userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk
+DOES NOT VERIFY
+ERROR: JAR signer ANDROID_.RSA: JAR signature META-INF/ANDROID_.SF indicates the APK is signed using APK Signature Scheme v2 but no such signature was found. Signature stripped?
+ERROR: JAR signer ANDROID_.RSA: JAR signature META-INF/ANDROID_.SF indicates the APK is signed using APK Signature Scheme v3 but no such signature was found. Signature stripped?
+```
+
+and indeed fails:
+
+```
+$ adb logcat -d | grep -i threema
+01-01 01:00:26.191  1102  1102 I PackageManager: /product/app/ThreemaLibre changed; collecting certs
+01-01 01:00:26.192  1102  1102 W PackageManager: Failed to scan /product/app/ThreemaLibre: No APK Signature Scheme v2 signature in package /product/app/ThreemaLibre/ThreemaLibre.apk
+```
+
+and:
+
+```
+$ adb shell
+MC02:/ $ su
+MC02:/ # sha256sum /product/app/ThreemaLibre/ThreemaLibre.apk
+b9f6ebd114145383691c165222175446df035c251fdbb653de9e1d2f3fadc807  /product/app/ThreemaLibre/ThreemaLibre.apk
+MC02:/ #
+```
+
+## Attempt 20240821.D7
+
+* fdroid apk
+* sha256sum: ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5
+
+Add to Android.mk:
+
+```
+ LOCAL_PRODUCT_MODULE := true
+ LOCAL_DEX_PREOPT := false
+ LOCAL_ENFORCE_USES_LIBRARIES := false
++LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/$(LOCAL_SRC_FILES)
+```
+
+Not yet failing:
+
+```
+$ sha256sum git-T0MP1/external/Threema/ch.threema.app.libre_974.apk userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk userdebug/out_sys/target/product/mssi_64_cn_armv82/product/app/ThreemaLibre/ThreemaLibre.apk
+ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5  git-T0MP1/external/Threema/ch.threema.app.libre_974.apk
+ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5  userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk
+ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5  userdebug/out_sys/target/product/mssi_64_cn_armv82/product/app/ThreemaLibre/ThreemaLibre.apk
+$ apksigner verify -v userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk
+Verifies
+Verified using v1 scheme (JAR signing): true
+Verified using v2 scheme (APK Signature Scheme v2): true
+Verified using v3 scheme (APK Signature Scheme v3): true
+Verified using v3.1 scheme (APK Signature Scheme v3.1): false
+Verified using v4 scheme (APK Signature Scheme v4): false
+Verified for SourceStamp: false
+Number of signers: 1
+(...)
+```
+
+fails unable to find libsqlcipher.so;
+
+```
+$ adb logcat -d | grep -i threema
+* daemon not running; starting now at tcp:5037
+* daemon started successfully
+01-01 01:00:26.521  1123  1123 I PackageManager: /product/app/ThreemaLibre changed; collecting certs
+08-21 00:00:14.247  1123  1123 V StorageManagerService: Package ch.threema.app.libre does not have legacy storage
+08-21 00:00:21.121  1123  1150 D AppWidgetServiceImpl: Provider info from ComponentInfo{ch.threema.app.libre/ch.threema.app.receivers.WidgetProvider} won't be persisted.
+08-21 00:00:22.627  1123  1152 I ActivityManager: Start proc 4748:ch.threema.app.libre/u0a91 for broadcast {ch.threema.app.libre/ch.threema.app.receivers.AutoStartNotifyReceiver}
+08-21 00:00:22.722  4748  4748 W ch.threema.app.libre: ART APEX data files are untrusted.
+08-21 00:00:22.722  4748  4748 I ch.threema.app.libre: Core platform API reporting enabled, enforcing=false
+08-21 00:00:22.800  4748  4748 D ch.threema.app.libre: Time zone APEX ICU file found: /apex/com.android.tzdata/etc/icu/icu_tzdata.dat
+08-21 00:00:22.800  4748  4748 D ch.threema.app.libre: I18n APEX ICU file found: /apex/com.android.i18n/etc/icu/icudt70l.dat
+08-21 00:00:22.890  4748  4748 D libMEOW : applied 1 plugins for [ch.threema.app.libre]:
+08-21 00:00:22.910  4748  4748 E ch.threema.app.libre: Unable to find pattern file or unable to map it for am
+08-21 00:00:23.051  4748  4748 D nativeloader: classloader namespace configured for unbundled product apk. library_path=/product/app/ThreemaLibre/lib/arm64:/product/app/ThreemaLibre/ThreemaLibre.apk!/lib/arm64-v8a:/product/lib64:/system/product/lib64
+08-21 00:00:23.096  4748  4748 V GraphicsEnvironment: ANGLE Developer option for 'ch.threema.app.libre' set to: 'default'
+08-21 00:00:23.097  4748  4748 V GraphicsEnvironment: ANGLE GameManagerService for ch.threema.app.libre: false
+08-21 00:00:23.204  4748  4748 W reema.app.libre: type=1400 audit(0.0:1534): avc: denied { read } for name="u:object_r:incremental_prop:s0" dev="tmpfs" ino=20496 scontext=u:r:untrusted_app:s0:c91,c256,c512,c768 tcontext=u:object_r:incremental_prop:s0 tclass=file permissive=0 app=ch.threema.app.libre
+08-21 00:00:23.204  4748  4748 W reema.app.libre: type=1400 audit(0.0:1535): avc: denied { read } for name="filesystems" dev="proc" ino=4026532399 scontext=u:r:untrusted_app:s0:c91,c256,c512,c768 tcontext=u:object_r:proc_filesystems:s0 tclass=file permissive=0 app=ch.threema.app.libre
+(...)
+```
+
+and:
+
+```
+08-21 00:00:23.396  4748  4748 D AndroidRuntime: Shutting down VM
+--------- beginning of crash
+08-21 00:00:23.397  4748  4748 E AndroidRuntime: FATAL EXCEPTION: main
+08-21 00:00:23.397  4748  4748 E AndroidRuntime: Process: ch.threema.app.libre, PID: 4748
+08-21 00:00:23.397  4748  4748 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libsqlcipher.so" not found
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at java.lang.Runtime.loadLibrary0(Runtime.java:1077)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at java.lang.Runtime.loadLibrary0(Runtime.java:998)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at java.lang.System.loadLibrary(System.java:1661)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at ch.threema.app.ThreemaApplication.reset(ThreemaApplication.java:847)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at ch.threema.app.ThreemaApplication.onCreate(ThreemaApplication.java:473)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1282)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6827)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2139)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:106)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at android.os.Looper.loopOnce(Looper.java:201)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:288)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:7940)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at com.android.internal.os.ExecInit.main(ExecInit.java:49)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
+08-21 00:00:23.397  4748  4748 E AndroidRuntime:        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:355)
+08-21 00:00:23.401  1123  4808 I DropBoxManagerService: add tag=system_app_crash isTagEnabled=true flags=0x2
+08-21 00:00:23.404  1123  1151 D OomAdjuster: Not killing cached processes
+08-21 00:00:23.405  4748  4748 I Process : Sending signal. PID: 4748 SIG: 9
+```
+
+but also:
+
+```
+$ adb shell
+MC02:/ $ su
+MC02:/ # sha256sum /product/app/ThreemaLibre/ThreemaLibre.apk
+ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5  /product/app/ThreemaLibre/ThreemaLibre.apk
+MC02:/ #
+```
+
+## Attempt 20240821.D9
+
+Reset, just to show that it can work.
+
+* fdroid apk
+* sha256sum: ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5
+
+Remove `LOCAL_REPLACE_PREBUILT_APK_INSTALLED` and replace `LOCAL_CERTIFICATE` with `platform` as opposed to `PRESIGNED`:
+
+```
+$ cat Android.mk
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := ThreemaLibre
+LOCAL_MODULE_CLASS := APPS
+LOCAL_MULTILIB := both
+LOCAL_CERTIFICATE := platform
+LOCAL_SRC_FILES := ch.threema.app.libre_974.apk
+LOCAL_PRODUCT_MODULE := true
+LOCAL_DEX_PREOPT := false
+LOCAL_ENFORCE_USES_LIBRARIES := false
+
+include $(BUILD_PREBUILT)
+```
+
+This should cause the APK to be resigned with the platform release key
+
+Intermediate result:
+
+```
+$ sha256sum git-T0MP1/external/Threema/ch.threema.app.libre_974.apk userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk userdebug/out_sys/target/product/mssi_64_cn_armv82/product/app/ThreemaLibre/ThreemaLibre.apk
+ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5  git-T0MP1/external/Threema/ch.threema.app.libre_974.apk
+b39d9f3a0f9f383962f6eaba1360a0cb8ed76090587cb92a96ec057e2b1f02e3  userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk
+b39d9f3a0f9f383962f6eaba1360a0cb8ed76090587cb92a96ec057e2b1f02e3  userdebug/out_sys/target/product/mssi_64_cn_armv82/product/app/ThreemaLibre/ThreemaLibre.apk
+```
+
+Works!
+
+## Attempt 20240821.D10
+
+* fdroid apk
+* sha256sum: ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5
+* revert to PRESIGNED
+* omit LOCAL_REPLACE_PREBUILT_APK_INSTALLED for the moment
+* use `LOCAL_SDK_VERSION := 30`
+
+Build failure:
+
+```
+[ 99% 5433/5458] target Prebuilt: ThreemaLibre (userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk)
+FAILED: userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk
+/bin/bash -c "(rm -f userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk ) && (cp \"external/Threema/ch.threema.app.libre_974.apk\" \"userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk\" ) && (if (zipinfo userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk 'lib/*.so' '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then echo -e \"\\033[1muserdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk: \\033[31merror:\\033[0m\\033[1m\" 'Contains compressed JNI libraries and/or dex files'  \"\\033[0m\" >&2; exit 1; fi ) && (if ! userdebug/out_sys/host/linux-x86/bin/zipalign -c -p 4 userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk >/dev/null ; then echo -e \"\\033[1muserdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk: \\033[31merror:\\033[0m\\033[1m\" 'Improper package alignment'  \"\\033[0m\" >&2; exit 1; fi )"
+userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk: error: Contains compressed JNI libraries and/or dex files
+```
+
+```
+$ sha256sum git-T0MP1/external/Threema/ch.threema.app.libre_974.apk userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk userdebug/out_sys/target/product/mssi_64_cn_armv82/product/app/ThreemaLibre/ThreemaLibre.apk
+ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5  git-T0MP1/external/Threema/ch.threema.app.libre_974.apk
+ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5  userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk
+```
+
+## Attempt 20240821.D11
+
+* fdroid apk
+* sha256sum: ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5
+* add back `LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/$(LOCAL_SRC_FILES)`
+
+Intermediate result:
+
+```
+$ sha256sum git-T0MP1/external/Threema/ch.threema.app.libre_974.apk userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk userdebug/out_sys/target/product/mssi_64_cn_armv82/product/app/ThreemaLibre/ThreemaLibre.apk
+ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5  git-T0MP1/external/Threema/ch.threema.app.libre_974.apk
+ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5  userdebug/out_sys/target/product/mssi_64_cn_armv82/obj/APPS/ThreemaLibre_intermediates/package.apk
+ebdbc3647ff901f7ecafe5601bdabf28f95b4d97068fe77e92758393ac48eec5  userdebug/out_sys/target/product/mssi_64_cn_armv82/product/app/ThreemaLibre/ThreemaLibre.apk
+```
+
+Same result as [Attempt 20240821.D7](#attempt-20240821d7)
+
+```
+08-21 00:00:22.908  4634  4634 D nativeloader: classloader namespace configured for unbundled product apk. library_path=/product/app/ThreemaLibre/lib/arm64:/product/app/ThreemaLibre/ThreemaLibre.apk!/lib/arm64-v8a:/product/lib64:/system/product/lib64
+(...)
+08-21 00:00:23.167  4634  4634 D AndroidRuntime: Shutting down VM
+--------- beginning of crash
+08-21 00:00:23.167  4634  4634 E AndroidRuntime: FATAL EXCEPTION: main
+08-21 00:00:23.167  4634  4634 E AndroidRuntime: Process: ch.threema.app.libre, PID: 4634
+08-21 00:00:23.167  4634  4634 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libsqlcipher.so" not found
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at java.lang.Runtime.loadLibrary0(Runtime.java:1077)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at java.lang.Runtime.loadLibrary0(Runtime.java:998)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at java.lang.System.loadLibrary(System.java:1661)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at ch.threema.app.ThreemaApplication.reset(ThreemaApplication.java:847)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at ch.threema.app.ThreemaApplication.onCreate(ThreemaApplication.java:473)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1282)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6827)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2139)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:106)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at android.os.Looper.loopOnce(Looper.java:201)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:288)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:7940)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at com.android.internal.os.ExecInit.main(ExecInit.java:49)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
+08-21 00:00:23.167  4634  4634 E AndroidRuntime:        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:355)
+08-21 00:00:23.172  1123  4680 I DropBoxManagerService: add tag=system_app_crash isTagEnabled=true flags=0x2
+08-21 00:00:23.175  4634  4634 I Process : Sending signal. PID: 4634 SIG: 9
+```
+
+```
+$ adb shell
+MC02:/ $ su
+MC02:/ # setenforce 0
+MC02:/ # find / -type f -name "*sqlcipher*" 2>/dev/null
+1|MC02:/ # ^D
+1|MC02:/ $ ^D
+```
+
+
+
+Extract from working build [Attempt 20240821.D9](#attempt-20240821d9):
+
+```
+$ adb shell
+MC02:/ $ su
+MC02:/ # setenforce 0
+MC02:/product/app/ThreemaLibre # cd /data/data/
+MC02:/data/data # mkdir tmp
+MC02:/data/data # cd tmp/
+MC02:/data/data/tmp # unzip /product/app/ThreemaLibre/ThreemaLibre.apk
+(...)
+MC02:/data/data/tmp # find lib/
+lib/
+lib/x86
+lib/x86/libsqlcipher.so
+lib/x86/libmaplibre.so
+lib/x86/libjingle_peerconnection_so.so
+lib/x86/libnacl-jni.so
+lib/x86/libimage_processing_util_jni.so
+lib/arm64-v8a
+lib/arm64-v8a/libnacl-jni.so
+lib/arm64-v8a/libjingle_peerconnection_so.so
+lib/arm64-v8a/libmaplibre.so
+lib/arm64-v8a/libimage_processing_util_jni.so
+lib/arm64-v8a/libsqlcipher.so
+lib/x86_64
+lib/x86_64/libjingle_peerconnection_so.so
+lib/x86_64/libnacl-jni.so
+lib/x86_64/libimage_processing_util_jni.so
+lib/x86_64/libmaplibre.so
+lib/x86_64/libsqlcipher.so
+lib/armeabi-v7a
+lib/armeabi-v7a/libnacl-jni.so
+lib/armeabi-v7a/libsqlcipher.so
+lib/armeabi-v7a/libjingle_peerconnection_so.so
+lib/armeabi-v7a/libimage_processing_util_jni.so
+lib/armeabi-v7a/libmaplibre.so
+```
+
+## Attempt 20240821.D12
+
+* apostrophy build
+* same Android.mk
+
+also noticed, not verified in other builds:
+
+```
+08-21 00:12:14.697  3057  3057 W ch.threema.app.libre: ART APEX data files are untrusted.
+(...)
+08-21 00:12:14.776  3057  3057 D ch.threema.app.libre: Time zone APEX ICU file found: /apex/com.android.tzdata/etc/icu/icu_tzdata.dat
+```
+
+## Attempt D14??
+
+* modify the bionic linker
+
+Note that this is only the current diff (it has evolved)
+
+```diff
+diff --git a/linker/linker.cpp b/linker/linker.cpp
+index abc00a8f9..2229d6235 100644
+--- a/linker/linker.cpp
++++ b/linker/linker.cpp
+@@ -922,21 +922,34 @@ static int open_library_in_zipfile(ZipArchiveCache* zip_archive_cache,
+
+   ZipArchiveHandle handle;
+   if (!zip_archive_cache->get_or_open(zip_path, fd, &handle)) {
++    PRINT("THREEMA: Invalid zip file? %s", zip_path);
+     // invalid zip-file (?)
+     close(fd);
+     return -1;
+   }
+
++  PRINT("THREEMA: Valid zip file. %s", zip_path);
++
+   ZipEntry entry;
+
+   if (FindEntry(handle, file_path, &entry) != 0) {
++    PRINT("THREEMA: Entry not found? %s", file_path);
+     // Entry was not found.
+     close(fd);
+     return -1;
+   }
+
++  PRINT("THREEMA: Entry found. %s", file_path);
++
+   // Check if it is properly stored
+   if (entry.method != kCompressStored || (entry.offset % PAGE_SIZE) != 0) {
++    if (entry.method != kCompressStored) {
++        PRINT("THREEMA: entry.method != kCompressStored?");
++    }
++    if ((entry.offset % PAGE_SIZE) != 0) {
++        PRINT("THREEMA: (entry.offset modulo PAGE_SIZE) != 0?");
++    }
++
+     close(fd);
+     return -1;
+   }
+```
+
+## Attempt 15
+
+* add additional zip_path and file_path to the aforementioned linker outputs
+
+```
+08-21 00:00:23.185  4702  4702 E linker  : THREEMA: Valid zip file. /product/app/ThreemaLibre/ThreemaLibre.apk
+08-21 00:00:23.185  4702  4702 E linker  : THREEMA: Entry found. lib/arm64-v8a/libsqlcipher.so
+08-21 00:00:23.185  4702  4702 E linker  : THREEMA: entry.method != kCompressStored?
+08-21 00:00:23.186  4702  4702 D AndroidRuntime: Shutting down VM
+--------- beginning of crash
+08-21 00:00:23.187  4702  4702 E AndroidRuntime: FATAL EXCEPTION: main
+08-21 00:00:23.187  4702  4702 E AndroidRuntime: Process: ch.threema.app.libre, PID: 4702
+08-21 00:00:23.187  4702  4702 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libsqlcipher.so" not found
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at java.lang.Runtime.loadLibrary0(Runtime.java:1077)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at java.lang.Runtime.loadLibrary0(Runtime.java:998)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at java.lang.System.loadLibrary(System.java:1661)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at ch.threema.app.ThreemaApplication.reset(ThreemaApplication.java:847)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at ch.threema.app.ThreemaApplication.onCreate(ThreemaApplication.java:473)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1282)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6827)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2139)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:106)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at android.os.Looper.loopOnce(Looper.java:201)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:288)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:7940)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at com.android.internal.os.ExecInit.main(ExecInit.java:49)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
+08-21 00:00:23.187  4702  4702 E AndroidRuntime:        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:355)
+08-21 00:00:23.191  1090  4744 I DropBoxManagerService: add tag=system_app_crash isTagEnabled=true flags=0x2
+```
+
+## Attempt 17
+
+* same, but with the fdroid apk
+* split the failure conditions matched above to both trigger, if so inclined
+
+```
+(...)
+08-21 00:00:23.013  4654  4654 E linker  : THREEMA: Valid zip file. /product/app/ThreemaLibre/ThreemaLibre.apk
+08-21 00:00:23.013  4654  4654 E linker  : THREEMA: Entry found. lib/arm64-v8a/libsqlcipher.so
+08-21 00:00:23.013  4654  4654 E linker  : THREEMA: entry.method != kCompressStored?
+08-21 00:00:23.013  4654  4654 E linker  : THREEMA: (entry.offset modulo PAGE_SIZE) != 0?
+08-21 00:00:23.013  4654  4654 D AndroidRuntime: Shutting down VM
+--------- beginning of crash
+08-21 00:00:23.014  4654  4654 E AndroidRuntime: FATAL EXCEPTION: main
+08-21 00:00:23.014  4654  4654 E AndroidRuntime: Process: ch.threema.app.libre, PID: 4654
+08-21 00:00:23.014  4654  4654 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libsqlcipher.so" not found
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at java.lang.Runtime.loadLibrary0(Runtime.java:1077)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at java.lang.Runtime.loadLibrary0(Runtime.java:998)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at java.lang.System.loadLibrary(System.java:1661)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at ch.threema.app.ThreemaApplication.reset(ThreemaApplication.java:847)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at ch.threema.app.ThreemaApplication.onCreate(ThreemaApplication.java:473)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1282)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6827)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2139)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:106)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at android.os.Looper.loopOnce(Looper.java:201)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:288)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:7940)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at com.android.internal.os.ExecInit.main(ExecInit.java:49)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
+08-21 00:00:23.014  4654  4654 E AndroidRuntime:        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:355)
+08-21 00:00:23.018  1125  4699 I DropBoxManagerService: add tag=system_app_crash isTagEnabled=true flags=0x2
+```
+
+```
+$ zipalign -c -v 4 ch.threema.app.libre_974.apk | grep -v OK
+Verifying alignment of ch.threema.app.libre_974.apk (4)...
+Verification succesful
+```
diff --git a/src/docs/developers/platform/testing.md b/src/docs/developers/platform/testing.md
new file mode 100644
index 0000000..3285ee3
--- /dev/null
+++ b/src/docs/developers/platform/testing.md
@@ -0,0 +1,67 @@
+# Testing
+
+:::note[TODO]
+
+This article is a work in progress.
+
+:::
+
+## CTS Testing
+
+TBD
+
+## VTS Testing
+
+### Prerequisites
+
+*   You have run `./build.sh` with the `--with-vts` option enabled
+
+*   Ensure the resulting userdebug variant build is flashed on to at least one device
+
+*   Start up these devices and complete the setup wizard as follows;
+
+    * select language, time format,
+    * connect to a wifi network,
+    * skip the Aphy account signup or signin,
+    * turn the volume down or off.
+
+*   Connect the devices USB-C port to the system running the VTS testing framework.
+
+### Executing Tests
+
+Simply put, run `./vts-test.sh`.
+
+This script will;
+
+*   run `source build/envsetup.sh` from `${APHY_ROOT}/vendor/`,
+
+*   run `lunch full_<model>-userdebug`, where `<model>` is, for example, `k6877v1_64_k419`,
+
+*   run `make vts`,
+
+*   unzip the resulting **android-vts.zip** to `${APHY_ROOT}/tmp/android-vts/`
+
+*   optionally, adjust `JAVA_HOME` and `PATH` to fit your setup:
+
+    ```bash
+    export JAVA_HOME=/usr/lib/jvm/java-1.8.0/
+    export PATH=/usr/lib/jvm/java-1.8.0/bin/:$PATH
+    ```
+
+*   preferrably in the same shell, run `tmp/android-vts/tools/vts-tradefed`,
+
+*   execute the `run vts --shard-count <NUM>` command in the **vts-tradefed** shell, where `<NUM>`
+    is the number of devices with unique serial numbers attached to the workstation (see the
+    standard output of **vts-tradefed** for devices successfully detected).
+
+:::note[Outputs are independent from `tmp/`]
+
+If **vts-tradefed** has been executed in the same shell, the results live in
+`${APHY_ROOT}/userdebug/out/host/linux-x86/vts/android-vts/results/`. If launched from a separate
+shell, results may live in `${APHY_ROOT}/tmp/android-vts/results/`.
+
+:::
+
+## Aphyium Testing
+
+TBD
diff --git a/src/docs/developers/roadmap/MDM.md b/src/docs/developers/roadmap/MDM.md
index 52c5077..f59dfbc 100644
--- a/src/docs/developers/roadmap/MDM.md
+++ b/src/docs/developers/roadmap/MDM.md
@@ -13,3 +13,36 @@
 ## Elaboration(s)
 
 ## Solution(s) & Validation(s)
+
+```json
+{
+  "version": 1,   // format version
+  "revision": 1,  // revision version
+  "policies": [   // a list of references to policies to be applied
+    {
+      "handler": "ActionHandler",
+      "categories": [],
+      "packageId": "com.foo.bar",
+      "activity": "MainActivity",
+      "schemes": [],
+      "hosts": [],
+      "mimeTypes": []
+    },
+    {
+      "handler": "WipeHandler",
+      "enabled": true,
+      "active": false,
+      "timeoutMdm": 24,               // the maximum number of hours the device will go without
+                                      // having contacted the MDM successfully
+      "timeoutDevice": 24,            // the maximum number of hours the device will go without
+                                      // having been unlocked
+    },
+    {
+      "handler": "ScreenTimeoutHandler",
+      "enabled": true,                    // enabled
+      "timeout": 60                       // timeout in seconds
+  ],
+  "update_interval": 10,  // schedule the next update after this interval
+  (...)
+}
+```
diff --git a/src/docs/developers/roadmap/app-store.md b/src/docs/developers/roadmap/app-store.md
index b7bc1de..b4a7eee 100644
--- a/src/docs/developers/roadmap/app-store.md
+++ b/src/docs/developers/roadmap/app-store.md
@@ -8,8 +8,48 @@
 
 ## Problem Space(s)
 
+Overall, the current eco-system of Application Stores and Markets does not benefit application
+developers, service providers, enterprises, nor users.
+
+* Just Free Software Just Won't Work
+
+  In the approach of the popular F-Droid type of market place, the restrictions placed on what
+  is considered eligible for inclusion are too restrictive, and can not achieve anywhere near a
+  critical mass market momentum of any sort by simply being "different".
+
+* Cost of Operation
+
+  Application store providers like Apple and Google will charge the customer, or the seller, a
+  significant proportion of the earnings originating from the sale of either the product, or the
+  services associated with the product.
+
+* Terms and Conditions
+
+  The end-user as well as the provider of applications is subjected to volatile Terms &
+  Conditions under the auspicous that these work out for both as well as the broker -- but they
+  really only work for the broker, and customers and providers find themselves subjected to the
+  volatility without much of an opportunity to redress grievances.
+
+* Incentive Structures
+
+  Ubiquitous availability of third-party controlled advertising as often the only means to generate
+  revenue from the consumption of an application is, by definition, a privacy-intrusive incentive
+  with an aim to draw the user's attention by (almost) whatever means necessary, impacting health.
+  Surely, there is a better way.
+
+* Certification of Devices
+
+  The artificial facility of fictive increased security through certification at the discretion of
+  a sole party creates a vendor lock-in dependency for consumers, third-party customers, and the
+  mobility eco-system as a whole.
+
 ## Context(s)
 
+An application store is a distribution channel for providers of applications that run on all, or
+selected sub-sets of mobile devices.
+
+
+
 ## Elaboration(s)
 
 ## Solution(s) & Validation(s)
diff --git a/src/docs/developers/roadmap/parental-control.md b/src/docs/developers/roadmap/parental-control.md
index 86de19d..0f445a3 100644
--- a/src/docs/developers/roadmap/parental-control.md
+++ b/src/docs/developers/roadmap/parental-control.md
@@ -6,14 +6,136 @@
 
 :::
 
+The document for this roadmap item is structured as follows;
+
+*   one or more problem spaces need to be articulated,
+
+*   one or more contexts within which the problem spaces exist need to be articulated,
+
+*   one or more elaborations on various aspects relevant to resolving the problem spaces (within
+    certain contexts) need to be articulated,
+
+*   candidate solutions need to be proposed, and evaluated (against the extent to which solutions
+    resolve problem spaces), including ultimately invalid solutions.
+
 ## Problem Space(s)
 
+Parental controls provide guardians the means to control, restrict, permit or
+validate the applications installed on, and usage of, a child's mobile device.
+
+If not properly implemented, parental control features could quickly and irrepairibly damage a
+trust relationship built up carefully over years and years, or inadvertently under-expose children
+to the experiences and tools they will undoubtedly encounter later in life.
+
+For example, if the child is not aware of the extent to which guardians have control and/or
+insights, but discovers it having happened, it could be experienced as a betrayal.
+
+Further consideration should include varying guardians' attitude towards raising children, such as
+cultural and societal differences, and changes therein, as well as an ever-evolving technology
+landscape (including the rise and fall of platforms, good and bad).
+
+Children are uniquely positioned to find factory resetting their devices to bypass parental
+controls, even if a solution is used preventing the standard course of action to factory reset
+(i.e. through Settings > System > Reset Options), such as pressing and holding "Volume Down" and
+"Power On", or switching the SIM card to another device.
+
 ## Context(s)
 
-* requires pop-up at first setup providing option to set up the device with parental controls?
+The mobile device is an Internet-connected smartphone.
 
-    * citation needed
+The guardians buy the device for their children, but want to be able to avoid some if not all of
+the negative aspects of a child's online exposure (i.e. privacy, cyber-bullying, body dysmorphia,
+grooming, brain-rot, pay-to-win in-app purchases, homework assistance, ...).
+
+Common parental control methods include;
+
+*   application activity reports
+*   limitations on screen time
+*   managing content and purchases (approve / decline apps, in-app purchases)
+*   restricting which applications may be installed on the device
+*   monitoring the location of devices
+*   capturing the contents of communications
+
+In other words, existing technology does not provide sufficiently specific controls to provide
+guardians and children a trust-based, cooperative environment.
 
 ## Elaboration(s)
 
+This section of the document elaborates on problem spaces and candidate approaches to resolve the
+problem space(s) (semantically, not technically).
+
+In designing a solution, we would likely also need to take in to account that guardians may not
+always know what's best. Psychological and physiological developments in young brains are
+impacted by the use of certain applications and platforms, but not others, both negatively and
+positively -- there's probably a difference between "TikTok" and "Curiosity Stream".
+
+### The Dinner Table
+
+This approach would focus on the concept of "having a dinner table conversation" between parent and
+child at all stages of whatever implications the parent's policy has on the abilities of the child
+(in the operation of the mobile device).
+
+The child might wish to install something, or register to a platform, or add a contact to their
+address book (including but not limited to a new WhatsApp, Telegram, (...) contact).
+
+It should largely be left to the parent and child, what policy facilitates a "dinner table
+conversation" -- meaning, the parent could choose a policy of "inform and consent", resulting in a
+parental approval block, or the parent could choose a policy of "unleash, but inform" (or possibly,
+anything in between).
+
+### Guide the Child, Inform the Parent
+
+This approach would interrupt the installation routine of an application (or registration routine
+to an online platform) with an advisory to the child, possibly ranging from "Don't do it!" to
+"Please be aware that (...)", and maybe including a sort of congratulatory message.
+
+The child would thus be more informed, and could still choose to continue.
+
+The parent would be informed.
+
+This approach would, in general form, not be mutually exclusive with the
+["Dinner Table"](#the-dinner-table) elaboration.
+
+Questions to resolve;
+
+*   Would the parent also be informed about subsequent application usage (in terms of "hours
+    per day")?
+
+*   Would the parent be allowed to list "absolutely not under any circumstance"
+    applications/platforms?
+
+*   Would the parent still have an opportunity to "revert"?
+
+### Solution to Factory Reset Vector
+
+There are two ways to prevent a device from being factory reset circumventing parental controls:
+
+1.  Remove or prevent access to all exposed surfaces to factory reset functionality
+2.  Replace running software such that it can only enroll in to a parental control program
+
+### Solution to Second Device Vector
+
+Assuming that it is the guardian who, on behalf of the child, purchases service from a mobile
+telecommunications provider, the service entitlement should probably be an eSIM, so that children
+can not bypass parental control through a second device.
+
+### Incentive Program
+
+TL:DR; Somehow reward desired behaviour (as opposed to punishing undesired behaviour)
+
 ## Solution(s) & Validation(s)
+
+The following components are necessary / need changing to complete delivery of the solution;
+
+*   a SetupWizard that allows guardians to enroll in to a parental control service
+
+*   a subsequent (OTA) replacement of the software on the device (preventing factory reset vectors)
+
+*   a SetupWizard (or alike) first-start boot mode, that requires the device to be re-enrolled,
+
+*   a remotely configurable LPA for eSIM (re-)provisioning,
+
+*   some communication facility between the device and the parental control service allowing for
+    reports, notifications, etc.
+
+*   TBD
diff --git a/src/docs/education/intro.md b/src/docs/education/intro.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/docs/education/intro.md
diff --git a/src/docs/enterprises/intro.md b/src/docs/enterprises/intro.md
new file mode 100644
index 0000000..bf60afb
--- /dev/null
+++ b/src/docs/enterprises/intro.md
@@ -0,0 +1,7 @@
+# Enterprises
+
+:::note[TODO]
+
+This article is a work in progress.
+
+:::
diff --git a/src/docs/enterprises/partner-portfolio.md b/src/docs/enterprises/partner-portfolio.md
new file mode 100644
index 0000000..5ac1b36
--- /dev/null
+++ b/src/docs/enterprises/partner-portfolio.md
@@ -0,0 +1,4 @@
+* Esper
+* Telekom26
+* Threema
+* Wire
diff --git a/src/docs/governments/intro.md b/src/docs/governments/intro.md
new file mode 100644
index 0000000..44fec23
--- /dev/null
+++ b/src/docs/governments/intro.md
@@ -0,0 +1,3 @@
+# Governments
+
+Reliance and control without MDM
diff --git a/src/docs/idhs/intro.md b/src/docs/idhs/intro.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/docs/idhs/intro.md
diff --git a/src/docs/odms/intro.md b/src/docs/odms/intro.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/docs/odms/intro.md
diff --git a/src/docs/oems/intro.md b/src/docs/oems/intro.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/docs/oems/intro.md
diff --git a/src/docs/repair-houses/intro.md b/src/docs/repair-houses/intro.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/docs/repair-houses/intro.md
diff --git a/src/docs/smes/intro.md b/src/docs/smes/intro.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/docs/smes/intro.md
diff --git a/src/docs/system-integrators/intro.md b/src/docs/system-integrators/intro.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/docs/system-integrators/intro.md
diff --git a/src/docs/value-added-resellers/intro.md b/src/docs/value-added-resellers/intro.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/docs/value-added-resellers/intro.md
diff --git a/src/docusaurus.config.js b/src/docusaurus.config.js
index 3fd12f4..6a2bd99 100644
--- a/src/docusaurus.config.js
+++ b/src/docusaurus.config.js
@@ -4,41 +4,41 @@
 // There are various equivalent ways to declare your Docusaurus config.
 // See: https://docusaurus.io/docs/api/docusaurus-config
 
-import {themes as prismThemes} from 'prism-react-renderer';
+import { themes as prismThemes } from "prism-react-renderer";
 
 /** @type {import('@docusaurus/types').Config} */
 const config = {
-  title: 'Aphy Guides',
-  tagline: 'Apostrophy OS Documentation',
-  favicon: 'img/favicon.ico',
+  title: "Aphy Guides",
+  tagline: "Apostrophy OS Documentation",
+  favicon: "img/favicon.ico",
 
   // Set the production url of your site here
-  url: 'https://aphy.guide',
+  url: "https://aphy.guide",
   // Set the /<baseUrl>/ pathname under which your site is served
   // For GitHub pages deployment, it is often '/<projectName>/'
-  baseUrl: '/',
+  baseUrl: "/",
 
-  onBrokenLinks: 'warn',
-  onBrokenMarkdownLinks: 'warn',
+  onBrokenLinks: "warn",
+  onBrokenMarkdownLinks: "warn",
 
   // Even if you don't use internationalization, you can use this field to set
   // useful metadata like html lang. For example, if your site is Chinese, you
   // may want to replace "en" with "zh-Hans".
   i18n: {
-    defaultLocale: 'en',
-    locales: ['en'],
+    defaultLocale: "en",
+    locales: ["en"],
   },
 
   presets: [
     [
-      'classic',
+      "classic",
       /** @type {import('@docusaurus/preset-classic').Options} */
       ({
         docs: {
-          sidebarPath: './sidebars.js',
+          sidebarPath: "./sidebars.js",
         },
         theme: {
-          customCss: './src/css/custom.css',
+          customCss: "./src/css/custom.css",
         },
       }),
     ],
@@ -48,63 +48,130 @@
     /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
     ({
       // Replace with your project's social card
-      image: 'img/docusaurus-social-card.jpg',
+      image: "img/docusaurus-social-card.jpg",
       navbar: {
-        title: 'Aphy Docs',
+        title: "Aphy Docs",
         logo: {
-          alt: 'My Site Logo',
-          src: 'img/logo.svg',
+          alt: "My Site Logo",
+          src: "img/logo.svg",
         },
         items: [
           {
-            type: 'docSidebar',
-            sidebarId: 'developerSidebar',
-            position: 'left',
-            label: 'Developers',
+            type: "docSidebar",
+            sidebarId: "developerSidebar",
+            position: "left",
+            label: "Developers",
           },
           {
-            type: 'docSidebar',
-            sidebarId: 'userSidebar',
-            position: 'left',
-            label: 'Users',
+            type: "docSidebar",
+            sidebarId: "userSidebar",
+            position: "left",
+            label: "Users",
           },
+/*
+          {
+            type: "docSidebar",
+            sidebarId: "oemSidebar",
+            position: "left",
+            label: "OEMs",
+          },
+          {
+            type: "docSidebar",
+            sidebarId: "odmSidebar",
+            position: "left",
+            label: "ODMs",
+          },
+          {
+            type: "docSidebar",
+            sidebarId: "idhSidebar",
+            position: "left",
+            label: "IDHs",
+          },
+          {
+            type: "docSidebar",
+            sidebarId: "carrierSidebar",
+            position: "left",
+            label: "Carriers",
+          },
+          {
+            type: "docSidebar",
+            sidebarId: "repairHouseSidebar",
+            position: "left",
+            label: "Repair Houses",
+          },
+          {
+            type: "docSidebar",
+            sidebarId: "enterpriseSidebar",
+            position: "left",
+            label: "Enterprises",
+          },
+          {
+            type: "docSidebar",
+            sidebarId: "smeSidebar",
+            position: "left",
+            label: "SMEs",
+          },
+          {
+            type: "docSidebar",
+            sidebarId: "governmentSidebar",
+            position: "left",
+            label: "Governments",
+          },
+          {
+            type: "docSidebar",
+            sidebarId: "educationSidebar",
+            position: "left",
+            label: "Education",
+          },
+          {
+            type: "docSidebar",
+            sidebarId: "varSidebar",
+            position: "left",
+            label: "Value-added Resellers",
+          },
+          {
+            type: "docSidebar",
+            sidebarId: "siSidebar",
+            position: "left",
+            label: "System Integrators",
+          },
+*/
         ],
       },
       footer: {
-        style: 'dark',
+        style: "dark",
         links: [
           {
-            title: 'Developers',
+            title: "Developers",
             items: [
               {
-                label: 'Platform',
-                to: '/docs/developers/platform',
+                label: "Platform",
+                to: "/docs/developers/platform",
               },
               {
-                label: 'Apps',
-                to: '/docs/developers/apps',
+                label: "Apps",
+                to: "/docs/developers/apps",
               },
               {
-                label: 'Services',
-                to: '/docs/developers/services',
+                label: "Services",
+                to: "/docs/developers/services",
               },
             ],
           },
           {
-            title: 'Users',
-            items: [
-            ],
+            title: "Users",
+            items: [],
           },
           {
-            title: 'Company',
+            title: "Company",
             items: [
               {
-                label: 'Website',
-                href: 'https://www.apostrophy.ch',
+                label: "Website",
+                href: "https://www.apostrophy.ch",
               },
               {
-                label: 'Subscription',
-                href: 'https://aphy.app',
+                label: "Subscription",
+                href: "https://aphy.app",
               },
             ],
           },
@@ -114,7 +181,7 @@
       prism: {
         theme: prismThemes.github,
         darkTheme: prismThemes.dracula,
-        additionalLanguages: ['bash', 'makefile'],
+        additionalLanguages: ["bash", "diff", "makefile"],
       },
     }),
 };
diff --git a/src/sidebars.js b/src/sidebars.js
index 272b892..91fa8f6 100644
--- a/src/sidebars.js
+++ b/src/sidebars.js
@@ -13,101 +13,225 @@
 
 /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
 const sidebars = {
-    developerSidebar: [
+  developerSidebar: [
+    {
+      type: "category",
+      label: "Developers",
+      link: {
+        type: "generated-index",
+        title: "Developers",
+        slug: "/category/developers",
+      },
+      items: [
         {
-            type: 'category',
-            label: 'Developers',
-            link: {
-                type: "generated-index",
-                title: "Developers",
-                slug: "/category/developers",
-            },
-            items: [
-                {
-                    type: 'category',
-                    label: 'Platform',
-                    link: {
-                        type: "doc",
-                        id: 'developers/platform'
-                    },
-                    items: [
-                        'developers/platform/source-code-management',
-                        'developers/platform/hardware-requirements',
-                        'developers/platform/system-app-development',
-                        {
-                            type: 'category',
-                            label: 'System Packages',
-                            link: {
-                                type: 'doc',
-                                id: 'developers/platform/system-packages'
-                            },
-                            items: [
-                                'developers/platform/system-packages/aphy-account',
-                                'developers/platform/system-packages/aphy-apps',
-                                'developers/platform/system-packages/aphy-calendar',
-                                'developers/platform/system-packages/aphy-companion',
-                                'developers/platform/system-packages/aphy-contacts',
-                                'developers/platform/system-packages/aphy-email',
-                                'developers/platform/system-packages/aphy-gmswizard',
-                                'developers/platform/system-packages/aphy-launcher',
-                                'developers/platform/system-packages/aphy-tasks',
-                                'developers/platform/system-packages/aphy-setupwizard',
-                                'developers/platform/system-packages/aphy-store',
-                                'developers/platform/system-packages/digitalnomad',
-                                'developers/platform/system-packages/vanadium',
-                            ]
-                        },
-                        'developers/platform/development-process',
-                        'developers/platform/release-management',
-                        'developers/platform/platform-build-process',
-                        'developers/platform/signing-keys',
-                        'developers/platform/customizing-builds',
-                    ],
-                },
-                {
-                    type: 'category',
-                    label: 'Apps',
-                    link: {
-                        type: "doc",
-                        id: 'developers/apps/application-development'
-                    },
-                    items: [
-                    ]
-                },
-                'developers/services',
-                'developers/roadmap',
-                'developers/documentation',
-            ],
-        },
-    ],
-    userSidebar: [
-        {
-            type: 'category',
-            label: 'Users',
-            link: {
+          type: "category",
+          label: "Platform",
+          link: {
+            type: "doc",
+            id: "developers/platform",
+          },
+          items: [
+            "developers/platform/source-code-management",
+            "developers/platform/hardware-requirements",
+            "developers/platform/software-requirements",
+            "developers/platform/getting-started",
+            "developers/platform/system-app-development",
+            {
+              type: "category",
+              label: "System Packages",
+              link: {
                 type: "doc",
-                id: "users/intro",
+                id: "developers/platform/system-packages",
+              },
+              items: [
+                "developers/platform/system-packages/aphy-account",
+                "developers/platform/system-packages/aphy-apps",
+                "developers/platform/system-packages/aphy-calendar",
+                "developers/platform/system-packages/aphy-companion",
+                "developers/platform/system-packages/aphy-contacts",
+                "developers/platform/system-packages/aphy-email",
+                "developers/platform/system-packages/aphy-gmswizard",
+                "developers/platform/system-packages/aphy-launcher",
+                "developers/platform/system-packages/aphy-tasks",
+                "developers/platform/system-packages/aphy-setupwizard",
+                "developers/platform/system-packages/aphy-store",
+                "developers/platform/system-packages/digitalnomad",
+                "developers/platform/system-packages/threema",
+                "developers/platform/system-packages/vanadium",
+              ],
             },
-            items: [
-                'users/intro',
-                {
-                    type: 'category',
-                    label: 'Features',
-                    link: {
-                        type: "doc",
-                        id: 'users/features'
-                    },
-                    items: [
-                        'users/features/domus-and-piazza',
-                        'users/features/privacy-and-carbon-ledger',
-                    ],
-                },
-                'users/opsec',
-                'users/bill-of-materials',
-
-            ],
+            "developers/platform/development-process",
+            "developers/platform/release-management",
+            "developers/platform/platform-build-process",
+            "developers/platform/signing-keys",
+            "developers/platform/customizing-builds",
+          ],
         },
-    ],
+        {
+          type: "category",
+          label: "Apps",
+          link: {
+            type: "doc",
+            id: "developers/apps/application-development",
+          },
+          items: [],
+        },
+        "developers/services",
+        "developers/roadmap",
+        "developers/documentation",
+      ],
+    },
+  ],
+  userSidebar: [
+    {
+      type: "category",
+      label: "Users",
+      link: {
+        type: "doc",
+        id: "users/intro",
+      },
+      items: [
+        "users/intro",
+        {
+          type: "category",
+          label: "Features",
+          link: {
+            type: "doc",
+            id: "users/features",
+          },
+          items: [
+            "users/features/domus-and-piazza",
+            "users/features/privacy-and-carbon-ledger",
+          ],
+        },
+        "users/opsec",
+        "users/bill-of-materials",
+      ],
+    },
+  ],
+/*
+  oemSidebar: [
+    {
+      type: "category",
+      label: "OEMs",
+      link: {
+        type: "doc",
+        id: "oems/intro"
+      },
+      items: []
+    }
+  ],
+  odmSidebar: [
+    {
+      type: "category",
+      label: "ODMs",
+      link: {
+        type: "doc",
+        id: "odms/intro"
+      },
+      items: []
+    }
+  ],
+  idhSidebar: [
+    {
+      type: "category",
+      label: "IDHs",
+      link: {
+        type: "doc",
+        id: "idhs/intro"
+      },
+      items: []
+    }
+  ],
+  carrierSidebar: [
+    {
+      type: "category",
+      label: "Carriers",
+      link: {
+        type: "doc",
+        id: "carriers/intro"
+      },
+      items: []
+    }
+  ],
+  repairHouseSidebar: [
+    {
+      type: "category",
+      label: "Repair Houses",
+      link: {
+        type: "doc",
+        id: "repair-houses/intro"
+      },
+      items: []
+    }
+  ],
+  enterpriseSidebar: [
+    {
+      type: "category",
+      label: "Enterprises",
+      link: {
+        type: "doc",
+        id: "enterprises/intro"
+      },
+      items: []
+    }
+  ],
+  governmentSidebar: [
+    {
+      type: "category",
+      label: "Governments",
+      link: {
+        type: "doc",
+        id: "governments/intro"
+      },
+      items: []
+    }
+  ],
+  educationSidebar: [
+    {
+      type: "category",
+      label: "Education",
+      link: {
+        type: "doc",
+        id: "education/intro"
+      },
+      items: []
+    }
+  ],
+  varSidebar: [
+    {
+      type: "category",
+      label: "Value-added Resellers",
+      link: {
+        type: "doc",
+        id: "value-added-resellers/intro"
+      },
+      items: []
+    }
+  ],
+  siSidebar: [
+    {
+      type: "category",
+      label: "System Integrators",
+      link: {
+        type: "doc",
+        id: "system-integrators/intro"
+      },
+      items: []
+    }
+  ],
+  smeSidebar: [
+    {
+      type: "category",
+      label: "SMEs",
+      link: {
+        type: "doc",
+        id: "smes/intro"
+      },
+      items: []
+    }
+  ],
+*/
 };
 
 export default sidebars;