Skip to content

Development

Tests

scripts/test.sh          # everything: unit tests, X11 tests on a private Xvfb, server + E2E 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.