Skip to content

Releases

SyncPilot 0.8.4

Choose a tag to compare

@github-actions github-actions released this 22 Oct 17:20

Fixed

  • The SHA-256 helper no longer loads an unversioned libcrypto on macOS.
    httputil.rkt's native SHA-256 shortcut opened bare libcrypto; current
    macOS releases make dyld abort the whole process on the unversioned
    /usr/lib/libcrypto.dylib stub, 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 bundled libcrypto.3); Linux keeps the unversioned fallback.
  • The first-run rslsync installer works again: http-fetch ran bytes->string/utf-8 over the status value that get-pure-port/headers #:status? #t already 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 a response-code helper covered by its own tests.
  • The embedded official UI renders again in desktop mode: the desktop bridge's callapi method answered a hardcoded null ("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 (with window.btsync present, the UI's jQuery.ajax override routes every /gui/ and /api/ request through callapi and never speaks HTTP to the proxy, so the stub left the interface with no data at all: a blank window). callapi now 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 .error field). The request finishes when the daemon answers, so the ~30s core-events long poll passes through untouched.

SyncPilot 0.8.3

Choose a tag to compare

@github-actions github-actions released this 14 Oct 23:32

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
    carry update-stable.json — what shipped since 0.7.0 and what current
    hosts still fetch — plus its byte-identical twin update-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
    with github.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-level RIVET_PIN env and every raco pkg install references
    it, so a rivet bump is one edit per file (the setup-embed-racket
    uses: pins stay literal — GitHub does not allow expressions there).
    setup-racket rides along at v1.15.

Fixed

  • The release preflight gates the generated client's version stamp.
    check-release-version.sh now reads kVersion from
    linux/GeneratedBackend.hpp and requires it to equal VERSION (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

Choose a tag to compare

@github-actions github-actions released this 14 Oct 03:50

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 to rslsync.conf never 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 same update-stable.json feed 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-i18n keys 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

Choose a tag to compare

@github-actions github-actions released this 13 Oct 18:02

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 as language in 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 custom syncpilot-bridge:// scheme whose handler does the native work, and the WebKit user agent carries the official SyncWebKitWebView marker so the UI's WebKit code path engages.
  • Product site dark theme: a full dark palette (family keepsake values) driven by data-theme on <html>, resolved before first paint from localStorage or 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/#F5F5F7 look.

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 and killall all left a zombie window over a dead backend. The rivet shutdown hook is now installed once the embedded runtime finishes booting: installing in main() 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 links rivet::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 source https://github.com/turinglambdaai/rivet.git#v0.11.0 and use the setup-embed-racket action 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-i18n keys resolved against a JS dictionary instead of per-element data-en/data-zh attributes, <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

Choose a tag to compare

@github-actions github-actions released this 11 Oct 13:13

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 .sha256 sidecar and rides the same SHA256SUMS

SyncPilot 0.7.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 03:07

Added

  • Native Linux packaging, two architectures: releases now ship deb and AppImage installers beside the tar.gz for both linux-x64 and linux-arm64 (arm64 builds on GitHub's ubuntu-24.04-arm with rivet's cached embeddable Racket CS; the backend's crypto dependency 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/syncpilot with a desktop entry and the branded icon (assets/icon-512.png, scaled from the app icon). Every release also publishes a combined SHA256SUMS
  • 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-port call 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 Linux deb/AppImage packaging (linux-formats in rivet.rktd) and family-named portable zips
  • update-stable.json is now signed in the release publish job (scripts/make-update-manifest.sh, same Ed25519 key and key id syncpilot-2026-10) with one targz artifact 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

Choose a tag to compare

@github-actions github-actions released this 09 Oct 04:35

Full Changelog: v0.6.0...v0.6.1