The phone client is Tauri v2 mobile (operator decision), so it reuses the Vue frontend and the Rust store and sync engine that already exist rather than becoming a third implementation to keep in step by hand. gen/android is committed. tauri android init generated it, its own .gitignore already excludes the build outputs and every keystore file, and CI must not have to regenerate a project that manifest edits will accumulate in. What the scaffold confirms is that the image's JDK pin was load-bearing rather than incidental: Tauri templated Gradle 8.14.3 with AGP 8.11.0, and CI-android's versions.env records that JDK 25 needs Gradle 9.1.0+ and that anything older fails with an opaque "25.0.3" message. Picking 17 for ci-tauri-android avoided exactly that. namespace and applicationId came out as com.fabledsword.thoughtsync, matching the desktop identifier, so the app-data story stays consistent. The lane builds a DEBUG APK for arm64 only. Release APKs need signing, and the keystore has to be generated by the operator and never pass through CI logs or an agent session — the constraint recorded for the updater key applies unchanged. Gradle's throwaway debug keystore needs nothing from anyone, so this can prove the app compiles and packages today and grow a signed job when a key exists. arm64 is every real device; the image carries the other three ABIs, so widening is a word. Triggered by frontend/** as well as desktop/**, because generate_context! compiles the frontend into the app — the same reasoning that widened desktop.yml. Android, desktop and web are peers on one quality bar, and a frontend commit that skipped this lane would ship a stale phone build. Green here will mean it BUILT. A Linux runner cannot execute an APK, so nothing in this lane proves the app runs, renders, or is usable by finger. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
73 lines
3.5 KiB
TOML
73 lines
3.5 KiB
TOML
[package]
|
|
name = "thoughtsync-desktop"
|
|
version = "0.1.0"
|
|
description = "ThoughtSync desktop — local-first Keep-style thought capture"
|
|
authors = ["bvandeusen"]
|
|
edition = "2021"
|
|
# The executable is named below, not inferred from this package name. Off so the
|
|
# inferred `thoughtsync-desktop` target and the explicit one can't both claim
|
|
# src/main.rs.
|
|
autobins = false
|
|
|
|
# App logic lives in the library (Tauri v2 pattern: a single `run()` entry point
|
|
# reusable across desktop and any future mobile target); main.rs is a thin shim.
|
|
[lib]
|
|
name = "thoughtsync_desktop_lib"
|
|
crate-type = ["staticlib", "cdylib", "rlib"]
|
|
|
|
# The shipped command is `thoughtsync` on every install channel, and the binary's
|
|
# own name is what the desktop actually keys on: GTK derives the window's WM_CLASS
|
|
# from it, and Tauri's generated .desktop file sets StartupWMClass to that same
|
|
# name. (Written without braces on purpose: `tauri android init` round-trips this
|
|
# file through a TOML serializer that reformats brace tokens inside comments.)
|
|
# So the canonical name has to be carried by the build target itself, not just by
|
|
# the path it gets installed to (issue 2075). The crate stays `thoughtsync-desktop`
|
|
# — only the executable is renamed. `thoughtsync` is also fixed under kebab-casing,
|
|
# which the AppImage bundler applies to the binary name on its way in.
|
|
[[bin]]
|
|
name = "thoughtsync"
|
|
path = "src/main.rs"
|
|
|
|
[build-dependencies]
|
|
tauri-build = { version = "2", features = [] }
|
|
|
|
[dependencies]
|
|
tauri = { version = "2", features = [] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
# Local-first store (M10.4): bundled = compile SQLite in, so there's no system
|
|
# libsqlite dependency to vary across the AppImage / native / Windows builds.
|
|
rusqlite = { version = "0.32", features = ["bundled"] }
|
|
uuid = { version = "1", features = ["v4"] }
|
|
# RFC3339 timestamps for created_at/updated_at/remind_at (Date.parse-able on the JS side).
|
|
chrono = { version = "0.4", default-features = false, features = ["clock"] }
|
|
# Startup + operation logging to stdout AND a persistent file, so portability
|
|
# issues are diagnosable from any environment. `log` is the facade the code uses.
|
|
tauri-plugin-log = "2"
|
|
log = "0.4"
|
|
# In-app updates (M10.9). Signature verification is minisign; the public half lives
|
|
# in tauri.conf.json and the private half only ever as a CI secret.
|
|
tauri-plugin-updater = "2"
|
|
# HTTP for the opt-in server handshake (M10.6) and, next, the sync engine (M10.7).
|
|
#
|
|
# native-tls, NOT rustls, deliberately: on x86_64-pc-windows-msvc native-tls
|
|
# resolves to `schannel` — pure-Rust bindings to the OS TLS stack — so nothing C or
|
|
# assembly has to cross-compile on the Windows lane, which is the fragile one (it
|
|
# builds on Linux via cargo-xwin, and a C dependency there is what broke it before).
|
|
# rustls would instead pull in ring/aws-lc-rs and their assembler. On Linux
|
|
# native-tls uses OpenSSL, whose headers (libssl-dev) ci-tauri already ships.
|
|
# default-features off drops http2/charset we don't need for a JSON API.
|
|
reqwest = { version = "0.12", default-features = false, features = ["json", "native-tls"] }
|
|
# Verifying downloaded attachment bytes against the sha256 the server advertised.
|
|
# Pure Rust (no C/asm beyond optional cpufeatures), so it costs the Windows
|
|
# cross-compile lane nothing — see ci-requirements.md on why that matters here.
|
|
sha2 = "0.10"
|
|
|
|
# Tauri's default release profile: smaller, faster shipped binaries.
|
|
[profile.release]
|
|
codegen-units = 1
|
|
lto = true
|
|
opt-level = "s"
|
|
panic = "abort"
|
|
strip = true
|