diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3807a344cbd64466ddd32c668d80ff4dbcdd593d..f43761d0bd50e1852e5774a50199a01f5f7f22eb 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,7 @@
 build-and-test-with-drm:
   image: alpine:3.19
   script:
+    - set -e # Stop on first error
     - apk -q add git bash build-base meson linux-headers inih-dev libinput-dev libxkbcommon-dev libdrm-dev scdoc
     - git submodule init
     - git submodule update
@@ -9,6 +10,7 @@ build-and-test-with-drm:
 build-and-test-without-drm:
   image: alpine:3.19
   script:
+    - set -e # Stop on first error
     - apk -q add git bash build-base meson linux-headers inih-dev libinput-dev libxkbcommon-dev scdoc
     - git submodule init
     - git submodule update
@@ -17,6 +19,7 @@ build-and-test-without-drm:
 build-iskey:
   image: alpine:3.19
   script:
+    - set -e # Stop on first error
     - apk -q add git bash build-base meson linux-headers libevdev-dev
     - cd iskey
     - meson setup _build
diff --git a/.gitmodules b/.gitmodules
index fcb8f14422c09a65ca90ac8c66ab8501103f052c..83e7cf6fcad1a2d13e77d9df7e40ad71483ac5ee 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,3 @@
 [submodule "lvgl"]
 	path = lvgl
-	url = https://github.com/littlevgl/lvgl.git
+	url = https://github.com/lvgl/lvgl.git
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0058f18cb142ace24aba7b7f966ad825e0d0ce7c..47f9f822b5ed2e3f944620fcc6c189e1279aee5b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,6 +21,7 @@ If a change only affects particular applications, they are listed in parentheses
 - feat(buffyboard): Add a buffyboard.service systemd service (!34, @uninsane)
 - fix(unl0kr): Select an available DRM device instead of a hard-coded one (!35, thanks @Sorcus)
 - feat(unl0kr): Enable software rotation (!32, thanks @xs5871 & @craftyguy)
+- misc: do not hardcode endianess of a system (!41, thanks @vstoiakin)
 - misc(unl0kr): Optimize the main loop (!38, thanks @vstoiakin)
 
 ## 3.2.0 (2024-06-03)
diff --git a/buffyboard/lv_conf.h b/buffyboard/lv_conf.h
index 23acdb9aa48f590daa4aec44952c88df4f1d9375..f711deda8aafb24147df17681ccf3a2343f8dafa 100644
--- a/buffyboard/lv_conf.h
+++ b/buffyboard/lv_conf.h
@@ -313,9 +313,6 @@ e.g. "stm32f769xx.h" or "stm32f429xx.h"*/
  *  COMPILER SETTINGS
  *====================*/
 
-/*For big endian systems set to 1*/
-#define LV_BIG_ENDIAN_SYSTEM    0
-
 /*Define a custom attribute to `lv_tick_inc` function*/
 #define LV_ATTRIBUTE_TICK_INC
 
diff --git a/man/unl0kr.1.scd b/man/unl0kr.1.scd
index 7aa9ed5ea9c46da56155a0bd57839f670998ee5a..523fc6193a846238c804df8eb6609fbe85bf9a89 100644
--- a/man/unl0kr.1.scd
+++ b/man/unl0kr.1.scd
@@ -32,7 +32,7 @@ password is printed to STDOUT. All other output happens on STDERR.
 *-g, --geometry=NxM[@X,Y]*
 	Force a display size of N horizontal times M vertical pixels, offset 
 	horizontally by X pixels and vertically by Y pixels.
-*-d  --dpi=N*               
+*-d  --dpi=N*
 	Override the display's DPI value.
 *-r, --rotate=[0-3]*
 	Rotate the UI to the given orientation. The
@@ -42,11 +42,13 @@ password is printed to STDOUT. All other output happens on STDERR.
 	* 1 - clockwise orientation (90 degrees)
 	* 2 - upside down orientation (180 degrees)
 	* 3 - counterclockwise orientation (270 degrees)
-*-h, --help*                
+*-h, --help*
 	Print this message and exit.
-*-v, --verbose*             
+*-n*
+	Do not append a newline character to a password.
+*-v, --verbose*
 	Enable more detailed logging output on STDERR.
-*-V, --version*             
+*-V, --version*
 	Print the unl0kr version and exit.
 
 # EXAMPLES
diff --git a/meson.build b/meson.build
index 042ab15cc0ad883565fee1827f67785d90d1dcf9..3cc51f48044476661732c460926a4099b79be12d 100644
--- a/meson.build
+++ b/meson.build
@@ -4,7 +4,11 @@ project('buffybox', 'c',
     meson_version: '>= 0.59.0'
 )
 
-add_project_arguments('-DPROJECT_VERSION="@0@"'.format(meson.project_version()), language: 'c')
+add_project_arguments(
+    '-DPROJECT_VERSION="@0@"'.format(meson.project_version()),
+    '-DLV_BIG_ENDIAN_SYSTEM=' + (host_machine.endian() == 'big'? '1' : '0'),
+    language: 'c'
+)
 
 depinih      = dependency('inih')
 deplibinput  = dependency('libinput')
diff --git a/test/helpers.sh b/test/helpers.sh
index 027fca9f81d9ea0ca1240dfe0f16a84ec2b4f627..7e80e3b946b401a2205938f454bf96662b9226c6 100644
--- a/test/helpers.sh
+++ b/test/helpers.sh
@@ -58,8 +58,10 @@ function ok() {
 
 function run_script() {
     info "Executing $1"
-    "$1"
+    rc=0
+    "$1" || rc=1
     echo
+    return $rc
 }
 
 function read_version_from_meson() {
diff --git a/test/test-with-drm.sh b/test/test-with-drm.sh
index 82255104566640498a8502c12fb101eb738fc091..58fc1b76f96da8e2ae48d2fe02d88851c6bb2a32 100755
--- a/test/test-with-drm.sh
+++ b/test/test-with-drm.sh
@@ -4,8 +4,12 @@ root=$(dirname "${BASH_SOURCE[0]}")
 
 source "$root/helpers.sh"
 
-run_script "$root/build-with-drm.sh"
-run_script "$root/test-version-matches-meson-and-changelog.sh"
-run_script "$root/test-uses-fb-backend-by-default.sh"
-run_script "$root/test-uses-fb-backend-if-selected-via-config.sh"
-run_script "$root/test-uses-drm-backend-if-selected-via-config-and-available.sh"
+rc=0
+
+run_script "$root/build-with-drm.sh" || rc=1
+run_script "$root/test-version-matches-meson-and-changelog.sh" || rc=1
+run_script "$root/test-uses-fb-backend-by-default.sh" || rc=1
+run_script "$root/test-uses-fb-backend-if-selected-via-config.sh" || rc=1
+run_script "$root/test-uses-drm-backend-if-selected-via-config-and-available.sh" || rc=1
+
+exit $rc
diff --git a/test/test-without-drm.sh b/test/test-without-drm.sh
index a8e86c99008bf5820e31ba08be1aff8bf2ecbb1d..34830416f55ccfbcf30caccd808a350f50635aee 100755
--- a/test/test-without-drm.sh
+++ b/test/test-without-drm.sh
@@ -4,8 +4,12 @@ root=$(dirname "${BASH_SOURCE[0]}")
 
 source "$root/helpers.sh"
 
-run_script "$root/build-without-drm.sh"
-run_script "$root/test-version-matches-meson-and-changelog.sh"
-run_script "$root/test-uses-fb-backend-by-default.sh"
-run_script "$root/test-uses-fb-backend-if-selected-via-config.sh"
-run_script "$root/test-uses-fb-backend-if-drm-selected-via-config-but-unavailable.sh"
+rc=0
+
+run_script "$root/build-without-drm.sh" || rc=1
+run_script "$root/test-version-matches-meson-and-changelog.sh" || rc=1
+run_script "$root/test-uses-fb-backend-by-default.sh" || rc=1
+run_script "$root/test-uses-fb-backend-if-selected-via-config.sh" || rc=1
+run_script "$root/test-uses-fb-backend-if-drm-selected-via-config-but-unavailable.sh" || rc=1
+
+exit $rc
diff --git a/unl0kr/command_line.c b/unl0kr/command_line.c
index 9d8f4c5f08dfa5f48a556a5894b35bce43f073f0..100a82693049a539eb5726c11251c90fa5ff49cf 100644
--- a/unl0kr/command_line.c
+++ b/unl0kr/command_line.c
@@ -45,6 +45,7 @@ static void init_opts(ul_cli_opts *opts) {
     opts->y_offset = 0;
     opts->dpi = 0;
     opts->rotation = LV_DISPLAY_ROTATION_0;
+    opts->newline = true;
     opts->verbose = false;
 }
 
@@ -77,6 +78,7 @@ static void print_usage() {
         "                            * 2 - upside down orientation (180 degrees)\n"
         "                            * 3 - counterclockwise orientation (270 degrees)\n"
         "  -h, --help                Print this message and exit\n"
+        "  -n                        Do not append a newline character to a password\n"
         "  -v, --verbose             Enable more detailed logging output on STDERR\n"
         "  -V, --version             Print the unl0kr version and exit\n");
         /*-------------------------------- 78 CHARS --------------------------------*/
@@ -103,7 +105,7 @@ void ul_cli_parse_opts(int argc, char *argv[], ul_cli_opts *opts) {
 
     int opt, index = 0;
 
-    while ((opt = getopt_long(argc, argv, "C:g:d:r:hvV", long_opts, &index)) != -1) {
+    while ((opt = getopt_long(argc, argv, "C:g:d:r:hnvV", long_opts, &index)) != -1) {
         switch (opt) {
         case 'C':
             opts->config_files = realloc(opts->config_files, (opts->num_config_files + 1) * sizeof(char *));
@@ -153,6 +155,9 @@ void ul_cli_parse_opts(int argc, char *argv[], ul_cli_opts *opts) {
         case 'h':
             print_usage();
             exit(EXIT_SUCCESS);
+        case 'n':
+            opts->newline = false;
+            break;
         case 'v':
             opts->verbose = true;
             break;
diff --git a/unl0kr/command_line.h b/unl0kr/command_line.h
index b9cea7e354e3d2b9aa2ab79f4733a998ee955cc7..c6e075f3377143a47786177f1f914de31ecb8830 100644
--- a/unl0kr/command_line.h
+++ b/unl0kr/command_line.h
@@ -30,6 +30,8 @@ typedef struct {
     int dpi;
     /* Display rotation */
     lv_display_rotation_t rotation;
+    /* If true, append a newline character to a password */
+    bool newline;
     /* Verbose mode. If true, provide more detailed logging output on STDERR. */
     bool verbose;
 } ul_cli_opts;
diff --git a/unl0kr/lv_conf.h b/unl0kr/lv_conf.h
index d2597e2b2c7a5139e2337131ba12c8928d5a76c5..de6a8e232ad1064659430c539d7182871cb5b052 100644
--- a/unl0kr/lv_conf.h
+++ b/unl0kr/lv_conf.h
@@ -207,9 +207,6 @@ e.g. "stm32f769xx.h" or "stm32f429xx.h"*/
  *  COMPILER SETTINGS
  *====================*/
 
-/*For big endian systems set to 1*/
-#define LV_BIG_ENDIAN_SYSTEM    0
-
 /*Define a custom attribute to `lv_tick_inc` function*/
 #define LV_ATTRIBUTE_TICK_INC
 
diff --git a/unl0kr/main.c b/unl0kr/main.c
index ca26bf09e4634f3cd46ca0a4199906f64066b3b3..d2a5b84443545d5b4775d398e97a5b1d64fddbb2 100644
--- a/unl0kr/main.c
+++ b/unl0kr/main.c
@@ -331,7 +331,7 @@ static void textarea_ready_cb(lv_event_t *event) {
 
 static void print_password_and_exit(lv_obj_t *textarea) {
     /* Print the password to STDOUT */
-    printf("%s\n", lv_textarea_get_text(textarea));
+    printf(cli_opts.newline? "%s\n" : "%s", lv_textarea_get_text(textarea));
 
     /* Clear the screen so that when the password field was unobscured, it cannot
      * leak via stale display buffers after we've exited */
diff --git a/unl0kr/unl0kr-agent.c b/unl0kr/unl0kr-agent.c
index 6f0b01f05e258a7615863bab0c38ee396910aa4e..e62edb8c99dc5aef4e0e9afcff87f6633dccd64b 100644
--- a/unl0kr/unl0kr-agent.c
+++ b/unl0kr/unl0kr-agent.c
@@ -418,7 +418,7 @@ int exec_unl0kr(char** ret_password)
             exit(EXIT_FAILURE);
         }
 
-        execl(UNL0KR_BINARY, "unl0kr", (char*) 0);
+        execl(UNL0KR_BINARY, UNL0KR_BINARY, "-n", (char*) 0);
 
         perror("exec() is failed");
         exit(EXIT_FAILURE);