Linux x86_64 on native Wayland is supported and distributed as an AppImage.
The GPUI build enables Wayland and does not support X11 as a runtime target.
The AppImage build instructions and host-library notes live in
packaging/appimage/README.md. Linux-only
release behavior includes per-user desktop registration, Wayland title-bar
controls, Freedesktop notifications, and XDG portal/runtime smoke checks.
Native macOS arm64 and x86_64 are supported and packaged as a DMG. A native
macOS host can build the local DMG with the system packaging tools and the
instructions in packaging/macos/README.md:
VERSION=0.1.34-local packaging/macos/build-dmg.shThe script selects the host architecture from uname, builds and validates a
signed Jira Desk.app, and writes a compressed read-only DMG plus adjacent
SHA-256 checksum under dist/. Use --skip-build only with an existing native
release binary built for that host. This procedure does not cross-compile and
macOS validation is independent of Linux AppImage validation. macOS uses native
GPUI support, the native keyring feature, native file picker behavior, and
~/Library/Application Support/dev.jiradesk.JiraDesk plus
~/Library/Logs/dev.jiradesk.JiraDesk; the Freedesktop notification adapter
and test are unavailable, while in-app feed and feedback remain available.
Build from Linux with the required Wayland development libraries:
VERSION=0.1.4-local \
LINUXDEPLOY=/path/to/linuxdeploy \
APPIMAGETOOL=/path/to/appimagetool \
APPIMAGE_RUNTIME=/path/to/pinned/runtime-x86_64 \
packaging/appimage/build-appimage.shAPPIMAGE_RUNTIME is optional for local experiments but should be a pinned,
verified runtime for reproducible builds. The script refuses to overwrite an
existing AppImage or checksum. It produces an AppImage and adjacent SHA-256
checksum. Inspecting an extracted AppImage is supported without FUSE; see the
packaging README for the exact commands.
The packaging script rejects drift in the launcher-neutral Exec=jira-gpui
template, named icon, AppStream ID, and desktop launchable ID. On a real
AppImage launch, the application installs an idempotent per-user desktop entry
and icon using the absolute current APPIMAGE path before creating the GPUI
window; registration failures are best-effort and do not block startup.
Extracted AppDir smoke runs should verify that registration is skipped when
APPIMAGE is absent. The embedded desktop template retains the named
Icon=dev.jiradesk.JiraDesk; a stable PNG remains available for named
notification lookup and desktop-entry association, while the generated
per-user entry uses an absolute dev.jiradesk.JiraDesk-<fingerprint>.png
path. Icon-content changes therefore change GNOME Shell's cache key; old
managed variants are not automatically deleted, and no desktop-cache updater
is assumed.
The icon build invokes ImageMagick's magick command. Ubuntu 22.04 ships
ImageMagick 6, so CI must install the compatibility launcher described in
packaging/appimage/README.md, or run the
packaging job on Ubuntu 24.04 (where the expected command is available). This
is a packaging prerequisite, not an application runtime dependency.
Generated AppImages and checksum files belong in the local/CI dist/ output
directory and remain untracked source artifacts. Publish them through the
release workflow or an explicitly selected artifact store; do not add them to
the source commit.
On the native macOS build host, validate the checksum and inspect the compressed read-only DMG without launching the app:
VERSION=0.1.34-local
arch="$(uname -m)"
dmg="dist/Jira_Desk-${VERSION}-${arch}.dmg"
(cd dist && shasum -a 256 --check "$(basename "$dmg").sha256")
hdiutil imageinfo "$dmg" >/dev/null
mount_point="$(mktemp -d "${TMPDIR:-/tmp}/jira-desk-dmg-check.XXXXXXXX")"
attached=$(hdiutil attach -readonly -nobrowse -mountpoint "$mount_point" "$dmg" \
| awk 'END { print $NF }')
test -d "$mount_point/Jira Desk.app/Contents/MacOS"
test -x "$mount_point/Jira Desk.app/Contents/MacOS/jira-gpui"
test -L "$mount_point/Applications"
hdiutil detach "$attached" >/dev/null
rmdir "$mount_point"The native macOS build validates the bundle layout, plist values, icon, and code signature before creating the DMG. Ad-hoc signing is local validation, not notarization or a public-release readiness claim. Remove the output DMG and checksum before rebuilding the same version.
Validation is command-based rather than tied to a fixed test-count snapshot.
Run the commands below against the current tree to establish the workspace test
total and validation status; test totals and smoke-artifact versions are expected
to change as the project evolves. The 0.1.4-local Wayland smoke run noted under
Known limits is retained as historical milestone evidence:
cargo fmt --all -- --check
cargo test --workspace --all-targets --locked
cargo clippy --workspace --lib --bins --locked -- -D warnings
git diff --checkFor a focused GPUI pass on either supported native host:
RUST_FONTCONFIG_DLOPEN=1 cargo test -p jira-gpui --lib
RUST_FONTCONFIG_DLOPEN=1 cargo check -p jira-gpui --libThe Linux artifact build, extraction checks, checksums, required desktop files,
and library inspection are automated. A local Wayland smoke run was exercised
for the historical 0.1.4-local milestone. Native macOS build, bundle, code
signature, DMG layout, checksum, and read-only mount checks are documented in
the macOS packaging README but still need broader host coverage. GNOME, KDE,
and wlroots compositor coverage; real Jira permission/account combinations;
Linux notification-daemon delivery; FUSE execution on multiple distributions;
macOS runtime behavior; public OAuth release; and long-running
offline/reconnect behavior still need broader release testing.
The application is intentionally session-oriented: polling runs only while the process is alive, and the current API-token flow is not suitable for public distribution. X11 and Windows remain unsupported. Linux AppImage and macOS DMG artifacts must be built and validated natively on their respective hosts; one platform's artifact does not validate the other.
The Linux Wayland release smoke should exercise the responsive dashboard at narrow and wide window sizes, drag the desktop list/detail divider, select multiple status categories and clear them back to All, verify the issue-list scrollbar and refresh spinner, and confirm that every manual refresh raises one in-app summary even when there are no new updates. Verify update timestamps use the system local timezone with an explicit offset, exercise the Unread and All feed filters, and confirm generic activity uses compact fallback wording with progressive disclosure. The refresh summary's desktop counts must be checked as notifications accepted by the desktop service, not as a guarantee that the shell displayed them. Verify that OS Freedesktop desktop alerts are still delivered independently of the in-app notification layer. Verify display-name-only identity labels, confirm that title-bar minimize, maximize, and close controls are clearly discoverable with the window idle (hover should not be required), and confirm that the registered component asset bundle renders title-bar and semantic icons. Rich-text placeholders and inert links must remain safe.
Linux update-feed smoke must create multiple detected events for one issue, verify that they render in one ticket group in newest-first order, and verify the group's Mark as read action persists every contained event locally without a Jira request. Jira-edit smoke must verify that the first assignable-user read uses one bounded empty query, later searches filter the persisted candidate set locally, and fresh transition choices are reused for 24 hours. It must also verify that a successful transition invalidates those choices before the next read, while the separate confirmation step dispatches exactly one assignment or transition request. Safe definite failures and refresh-required handling for unknown outcomes remain required.
Linux update-feed smoke should also verify that changed cached/incoming snapshots
use the bounded bulk-changelog read, that history timestamps are filtered to
the snapshot window, and that safe field changes render directly as
Field: old → new. A changelog failure or unsupported gateway must leave the
sync successful and show only the generic fallback for the affected issue;
pagination, cancellation, and the eight-page safety cap remain bounded.
Linux media and attachment smoke must cover:
- an unambiguous description image loading as an authenticated Jira thumbnail;
- an IX-1873-like ADF media node containing a Media Services UUID that cannot be converted through documented Jira REST, showing the labeled bounded allowlisted-attachment gallery without claiming ADF placement, and recording the safe unavailable-media diagnostic;
- an ambiguous image reference falling back safely without an arbitrary remote Media Services read;
- a thumbnail 404, and separately a bounded unknown-MIME response whose bytes do not match an image signature, each rejected as thumbnail bytes and then falling back at most once to bounded authenticated original content; the original response must still pass strict attachment ID, MIME, nonempty, and size preflight. Authentication, transport, non-404 status, malformed-MIME, empty, and oversize thumbnail errors do not fall back;
- cached image metadata remaining allowlisted while authenticated thumbnail
responses using
application/octet-streamorimage/jpgare accepted only with valid image byte signatures; unsupported MIME and bad signatures remain rejected as thumbnail responses, while arbitrary origins, redirects, and oversize content remain rejected; - cancellation before and during thumbnail loading, including stale-selection protection;
- per-image 8 MiB, 16-reference, and 32 MiB aggregate rejection boundaries;
- an explicit attachment download showing the Linux XDG portal, cancellation, and successful local destination write;
- rejection of oversize or redirected content and verification of downloaded contents; and
- isolation between remote Jira/cache state and the selected local file.
No media action should be automatic or mutate Jira. Comments/details and thumbnails are remote and memory-only, so a restart test should expect cached issue snapshots but not cached comment bodies or thumbnail bytes. Confirm that Linux OS Freedesktop alerts remain delivered independently throughout media loads and local download activity.
Linux image diagnostics smoke should use a fresh temporary XDG_STATE_HOME
for the run, preserving any existing user diagnostics logs, then inspect the
JSONL records after exercising an IX-1873-like unresolved ADF Media Services
UUID. Confirm that the record distinguishes each pre-GPUI
failed or pre-GPUI missing state from the safe gpui_decode_fallback category,
without exposing any excluded identifiers, URLs, filenames, text, payloads, or
raw errors. Exercise enough image activity to verify rotation leaves no more
than a 256 KiB active log and one 256 KiB backup. Verify the state directory is
0700 and both log files are 0600; a missing or unwritable log must not block
startup. Finally, confirm that the existing Linux OS Freedesktop desktop alerts are
unchanged and still delivered independently of diagnostics and in-app
notifications.
On a native macOS host, smoke the same core dashboard, sync, detail, confirmed
write, cancellation, and in-app feedback paths. Verify native GPUI window
behavior, native keyring save/load, the native file picker for an explicit
attachment download, and application data/log locations under
~/Library/Application Support/dev.jiradesk.JiraDesk and
~/Library/Logs/dev.jiradesk.JiraDesk. Do not require per-user Linux desktop
registration, Wayland controls, XDG portals, Freedesktop notifications, or the
Freedesktop notification test: that adapter/test is unavailable on macOS.