CI & Build / Python lint (push) Successful in 3s
CI & Build / TypeScript typecheck (push) Successful in 5s
CI & Build / Python tests (push) Successful in 8s
CI & Build / Build & push image (push) Successful in 35s
Desktop (Tauri) / Tauri desktop (Linux) (push) Failing after 1m29s
Desktop (Tauri) / Windows installer (cross-compiled) (push) Successful in 1m47s
The client half of task 1942's server work. Metadata already rides the delta feed; this fetches the payload so a synced image exists on the device. Blobs are filed under their own sha256, so the same image attached to five notes is stored once and re-downloading it is free — the dedupe the task asks for falls out of content addressing rather than needing bookkeeping. The hash is also the integrity check, applied on the way IN. Bytes that don't hash to what the server advertised are refused rather than filed under a name that lies about them — and because the blob then still counts as missing, the next sync simply tries again. SECURITY: the hash arrives in a server response and becomes a FILENAME, so it is validated as 64 hex characters before touching the filesystem. Without that, a hostile or buggy server could send "../../..." and steer a write outside the blob directory. Tested. A failed attachment never fails the sync. Notes are the primary data and have already landed; aborting here would let one unreachable file block every future sync. Counted, logged, surfaced in the UI as "they'll retry on the next sync", and retried because the blob is still absent. sha2 is pure Rust, so the Windows cross-compile lane pays nothing for it — the constraint recorded in ci-requirements.md. SPLIT, deliberately: this stores the bytes but does NOT yet render them in the webview. That half needs a custom URI scheme or the asset protocol, whose URL form differs by platform (Windows uses http://scheme.localhost/, others scheme://localhost/) — and CI cannot verify webview rendering at all, being headless with no webview. Guessing at it here would ship an unverifiable change on the most fragile lane. Follow-up filed; synced images will show as broken until it lands. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SreJkbxB4gx8pPsu8QbLPi
53 lines
2.3 KiB
TOML
53 lines
2.3 KiB
TOML
[package]
|
|
name = "thoughtsync-desktop"
|
|
version = "0.1.0"
|
|
description = "ThoughtSync desktop — local-first Keep-style thought capture"
|
|
authors = ["bvandeusen"]
|
|
edition = "2021"
|
|
|
|
# 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"]
|
|
|
|
[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"
|
|
# 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
|