Development¶
Tests¶
The clipboard test also needs xsel. Database tests need SOMEDESK_TEST_DATABASE_URL (an admin connection used to create throwaway
databases; scripts/test.sh defaults to the local dev role). X11 tests need Xvfb.
.github/workflows/ci.yml runs on GitHub Actions: formatting and clippy, the Linux suite with
PostgreSQL and Xvfb plus the NAT test, unit tests and app builds on real Windows and macOS
runners (uploaded as artifacts), clippy on the Android build, and the .deb packages and server
image.
scripts/nat-test.sh (needs sudo) builds two private networks behind real Linux NATs with
network namespaces and checks that peers connect directly behind ordinary NATs and fall back to the
relay behind symmetric ones.
scripts/demo-env.sh starts a server and two virtual displays for manual testing.
somedesk --mobile-ui (or SOMEDESK_MOBILE_UI=1) shows the phone layout on the desktop.
Android¶
The Android app is the same Slint UI and client core, built as a native library
(crates/android, libsomedesk.so) that Android's NativeActivity loads; there is no Java code
of its own. packaging/android/build-apk.sh builds it with cargo ndk and packs the APK with the
SDK's aapt2, zipalign and apksigner (no Gradle). The script lists what it needs.
To try it on an emulator (emulator -avd <name>), install the APK with
adb install target/dist/SomeDesk-*.apk. The emulator reaches the computer it runs on as
10.0.2.2, so a local scripts/demo-env.sh server is at that address. Logs go to logcat under
the tag somedesk (adb logcat -s somedesk).
scripts/wayland-env.sh starts a headless GNOME Wayland session (with PipeWire and the portal);
scripts/gnome-input.sh drives it like xdotool, and scripts/wayland-grant.sh answers the
portal's permission dialog once. scripts/test.sh uses them for the Wayland end-to-end test.
Brand¶
assets/brand/ holds the logo (logo.svg, logo-light.svg for light backgrounds, mark.svg) and
the app icon (app-icon.svg plus PNG renders and app-icon.ico). They are generated by
scripts/gen-brand.py, which defines the mark once; the app's Mark widget draws the same paths,
and the Android launcher icon (packaging/android/res) is generated from them too.
Desi, the mascot, is in assets/mascot/ (one SVG per pose: wave, point, connect, key, cheer),
generated by scripts/gen-mascot.py, which also copies them to docs/assets/mascot/ for the
website. She's a placeholder drawing; replace the files and keep the names to change her. The
welcome tour (crates/app/ui/tour.slint) shows her once after the first sign-in, and Settings
starts it again.
assets/icons/ is the icon set: 24 px, 2 px round strokes. Icons are defined once in
scripts/gen-icons.py, which writes both the SVGs and crates/app/ui/icons.slint.