Repository navigation
Releases
Releases · turlamai/syncpilot
SyncPilot 0.8.4
Fixed
- The SHA-256 helper no longer loads an unversioned libcrypto on macOS.
httputil.rkt's native SHA-256 shortcut opened barelibcrypto; current
macOS releases make dyld abort the whole process on the unversioned
/usr/lib/libcrypto.dylibstub, which killed every process that merely
required the module (the test suite included) — the exception handler
never sees a dyld-level abort. macOS now resolves versioned names only
(Racket's bundledlibcrypto.3); Linux keeps the unversioned fallback. - The first-run rslsync installer works again:
http-fetchranbytes->string/utf-8over the status value thatget-pure-port/headers#:status? #talready returns as a string, so every successful 200 response died on a contract violation — the download card failed unconditionally on every machine, with the retry loop dressing it up as a network error ("check your network connection"). The status parsing now accepts the string shape (bytes kept as a guard for older net/url revisions) in aresponse-codehelper covered by its own tests. - The embedded official UI renders again in desktop mode: the desktop bridge's
callapimethod answered a hardcodednull("no entries are reachable in this UI build") — true for the UI it was written against, false since the daemon's Web UI moved its whole data plane into the desktop bridge (withwindow.btsyncpresent, the UI's jQuery.ajax override routes every/gui/and/api/request throughcallapiand never speaks HTTP to the proxy, so the stub left the interface with no data at all: a blank window).callapinow forwards{action, params, type}to the same origin the web view loads — the auth-injecting proxy — over a libsoup session and answers with the daemon's response; transport and HTTP failures surface as{"error": …}results rather than rejected promises (a rejection crashes the UI's request wrapper on a missing.errorfield). The request finishes when the daemon answers, so the ~30s core-events long poll passes through untouched.
SyncPilot 0.8.3
The release-hygiene round: everything below tightens how SyncPilot ships
and reports itself — feedback surfaces and release gates, no change to the
app's own behaviour.
Added
- GitHub issue templates (bug report + feature request) so feedback
lands structured: the bug form asks for the distro/desktop-environment
pair, the package shape and the rslsync binary provenance — the three
facts every Linux-only report needs — and points update failures at the
now-copyable dialog text. The manual (syncpilot.jrtx.site/guide.html)
is offered as a contact link before a blank issue. - The release ships the signed feed under both names. Release assets
carryupdate-stable.json— what shipped since 0.7.0 and what current
hosts still fetch — plus its byte-identical twinupdate-manifest.json
(the family-standard feed name; the signature covers the payload, not
the filename, so both verify). Zero client change this round; the twin
exists so the feed name can migrate client-side later without
re-releasing.
Changed
- The About card names the issue tracker. The About text now ends
withgithub.com/turinglambdaai/syncpilot/issues(zh and en, plain
text in the i18n single source), beside the existing repo link — a bug
report starts one glance away from the About card that describes it. - Update failure text is selectable. The update dialogs' message
label (errors and status alike) is a selectable GTK label, so the exact
failure text — URLs, errno strings — can be copied out instead of
retyped. - CI single-sources the rivet pin: both workflows declare a
workflow-levelRIVET_PINenv and everyraco pkg installreferences
it, so a rivet bump is one edit per file (thesetup-embed-racket
uses:pins stay literal — GitHub does not allow expressions there).
setup-racketrides along at v1.15.
Fixed
- The release preflight gates the generated client's version stamp.
check-release-version.shnow readskVersionfrom
linux/GeneratedBackend.hppand requires it to equalVERSION(the
GeneratedBackend.swift gate autarx already had, ported) — 0.8.2 shipped
while the hpp still stamped 0.8.0 and nothing checked it. The stamp was
corrected after the fact, so this release is the first whose generated
client matches its version on day one; four gates (VERSION ==
rivet.rktd == updater identity == generated stamp, plus tag and
CHANGELOG) now stand between main and a mislabeled release.
SyncPilot 0.8.2
Added
- User manual on the product site (
docs/guide.html, linked from the nav as 手册): a five-minute start (per-format install → first-run fetch of the official rslsync binary → the official Web UI → daemon and settings), the core features (daemon start/stop and adoption, the crash watchdog and its status phases, config editing — including why hand edits torslsync.confnever survive a daemon start, the loopback auth-injecting proxy, autostart and tray), and an FAQ (where data lives, root, the honest Linux-only platform story with desktop-environment differences, language and theme, updates — including how 0.7.x installs ride the sameupdate-stable.jsonfeed and why 0.6.1-and-earlier must update manually once — and uninstall). Same family mechanism as the landing page: one self-contained file,data-i18nkeys resolved against a JS dictionary, defaulting to Chinese, with the shared light/dark theme. It cites the real product screenshot; no app functionality changes in this release.
Changed
- The site states the real asset matrix: the hero trust row now lists zip beside deb · rpm · AppImage · tar.gz — the portable zips have shipped in every release since 0.7.0 — and the nav gains the manual link.
- docs/UPDATE.md caught up with 0.7.0: its "known gaps" still claimed the artifact downloader ignores 302 redirects (fixed in 0.7.0, #1) and that no deb/rpm/AppImage packaging exists (shipped since 0.7.0/0.8.0). It now states the one gap that remains: updates never self-replace, with the per-format apply path.
SyncPilot 0.8.1
Added
- UI language setting, follow-system by default: Settings → Desktop gains a language row offering 跟随系统 / Follow system, 简体中文 and English — the entries render in both scripts regardless of the active UI language, so someone facing an all-zh window (what every install got until now: the language variable existed but nothing ever moved it off zh) can still find and read the row.
system(the new default) resolves from the session locale at startup — zh-family sessions get zh, everything else en — so first impressions match the user's desktop instead of the author's. The choice persists aslanguagein syncpilot-settings.json (pre-existing files fall back per the usual serde(default) semantics, no migration stamp needed) and applies on the next launch; saving it toasts the restart hint, same pattern as the port change. - Desktop integration bridge for the official UI (
window.btsync): the official client injects this object into its embedded web view and the UI routes every desktop behavior through it — double-clicking a synced folder opens the file manager at that folder (until now an explanation dialog appeared instead), adding a folder uses the native directory chooser, share links and docs hand off to the browser, notifications leave the page, and copy buttons reach the real clipboard. A web-process extension defines the object in the page world at document start (UserContentManager user scripts miss the first document on WebKitGTK 2.52), calls ride a customsyncpilot-bridge://scheme whose handler does the native work, and the WebKit user agent carries the officialSyncWebKitWebViewmarker so the UI's WebKit code path engages. - Product site dark theme: a full dark palette (family keepsake values) driven by
data-themeon<html>, resolved before first paint fromlocalStorageor the system preference (no flash), with a◐toggle that persists the explicit choice — plus the family warm palette in light mode, replacing the old Apple-blue/#F5F5F7look.
Fixed
- SIGTERM shuts the app down instead of killing the backend under a living window (#3): OS signals bypass the GTK main loop, so the orderly teardown never ran —
systemd --user stop, session logout andkillallall left a zombie window over a dead backend. The rivet shutdown hook is now installed once the embedded runtime finishes booting: installing inmain()loses the race to the Racket runtime's own SIGTERM handler, which is what kept the hook inert. Teardown is exactly-once across the GTK and signal paths, and each step traces into the host log. - README described a tar.gz-only world that ended in 0.7.0: the "Honest gaps" entry claiming no deb/rpm/AppImage packaging and the Install section's "that tarball is the only artifact — Linux x64 only" were both stale; Install now documents the real per-architecture matrix (deb · rpm · AppImage · tar.gz · zip, x64 + arm64, with
SHA256SUMS, SBOM, notices and the signed update manifest). The product-site URL is also gone from the README header — the GitHub About field is the single home for it.
Changed
- Rivet is consumed as a package, pinned to v0.11.0: the Linux host CMake no longer hand-copies rivet's 14 platform translation units into its executable list — it
add_subdirectorys the installed Rivet platform and linksrivet::platform(the rivet#238 contract taskly already follows), so rivet adding a translation unit needs no downstream change. CI and release install the package from the tag-pinned Git sourcehttps://github.com/turinglambdaai/rivet.git#v0.11.0and use thesetup-embed-racketaction at@v0.11.0— the hold-back form rivet docs/ci.md prescribes for releases (the package catalog has one moving entry per name and no version selector, so catalog floating was never a release pin). - Product site defaults to Chinese (
lang="zh-CN") with the family i18n mechanism:data-i18nkeys resolved against a JS dictionary instead of per-elementdata-en/data-zhattributes,<title>/meta description following the active language; explicit choice still persists, otherwise the browser locale decides. Still one self-contained file, zero dependencies.
SyncPilot 0.8.0
Added
- RPM packages for both Linux architectures (
syncpilot-<version>-<build>-linux-x86_64.rpm,...-aarch64.rpm), built by rivet's native rpmbuild path from the same payload as the deb and AppImage — the Linux set now matches the family benchmark (taskly) format-for-format: deb + rpm + AppImage + tar.gz + zip per architecture. Each rpm ships with a.sha256sidecar and rides the sameSHA256SUMS
SyncPilot 0.7.0
Added
- Native Linux packaging, two architectures: releases now ship
debandAppImageinstallers beside thetar.gzfor bothlinux-x64andlinux-arm64(arm64 builds on GitHub'subuntu-24.04-armwith rivet's cached embeddable Racket CS; the backend'scryptodependency is installed into that minimal runtime explicitly). The AppImage carries its own GTK4 dependency closure so it runs on distributions older than the build image; the deb installs under/opt/syncpilotwith a desktop entry and the branded icon (assets/icon-512.png, scaled from the app icon). Every release also publishes a combinedSHA256SUMS - The portable zip that rides along with every installer since rivet 0.6.1 is now part of the published asset set too
Fixed
- The updater's artifact download follows HTTP redirects (#1): the hand-rolled
get-pure-portcall saved the empty 302 body GitHub serves before the CDN redirect and failed the signed size/SHA-256 check — the same trap rivet#153 fixed for the manifest fetch, which is why the check succeeded and the download then broke. Covered by a loopback regression test that 302s onto a real payload. Note for 0.6.1 users: the broken downloader ships in your build, so the in-app update to 0.7.0 fails at download — update manually this one time; from 0.7.0 on, auto-update works
Changed
- CI and release pin rivet to 0.6.1 (
410fc7c) — the first release line with native Linuxdeb/AppImagepackaging (linux-formatsin rivet.rktd) and family-named portable zips update-stable.jsonis now signed in the release publish job (scripts/make-update-manifest.sh, same Ed25519 key and key idsyncpilot-2026-10) with onetargzartifact per architecture and versioned download URLs — same schema-1 manifest contract 0.6.1 clients already verify; rivet 0.6.1's built-in manifest points at the portable zip instead, which the updater does not consume
SyncPilot 0.6.1
Full Changelog: v0.6.0...v0.6.1