Back to the changelog

Release

Syzygy 1.0.1: twelve commits, zero features

A maintenance release 20 days after 1.0.0: one shared retention policy for history and trash, pin order becomes tracked data, Quick Panel focus and preview sessions fixed, pairing rebuilt as tasks, and dev credentials purged from production artifacts.

Syzygy TeamPublished 6 min read
  • #clipboard history
  • #release
  • #maintenance
  • #quick panel
On this page

1.0.0 shipped on July 22. The 1.0.1 version bump landed on August 11 with twelve commits in between, none of them features, and the distribution config updated the next day to push the patch out. A patch release exists to answer one question: what did the first wave of real usage expose. Here is each fix as symptom, cause, and repair.

The rest of the window

A few of the twelve commits don't fit the symptom-repair shape but make the patch whole. Server image builds gained revision tracking, so which image came from which commit is now answerable after the fact. Window lifecycle management documentation landed along with a submodule patch, and test configuration and resource management got a consolidation pass. The repository also gained a Human-in-the-Loop software engineering workflow document: every fix in this window went through human judgment before tool execution, and the doc pins that working style down.

History and trash, one retention policy

The symptom: clipboard history and the trash each maintained their own eviction limit: history defaulted to 2,000 items and trash to 100, two numbers configured independently and unaware of each other. A configured history value could exceed what policy allowed, and the settings UI hardcoded its slider maximum, so config and interface disagreed about the facts.

The repair merges the two numbers into one policy: an authoritative hard ceiling of 2,000 items, a shared default of 100 for both history and trash, a floor of 50, and prune policies switched to the shared constants, with config snapshots clamping legacy values back under the ceiling. The change landed as one coordinated move across three layers: desktop components swapped hardcoded constants for dynamic fallback values and enforced clamping through the config-provided max_items_limit, slider maximums now read that limit, and new tests at both the config and UI layers lock in two behaviors: the default applies, and over-limit legacy values get clamped. This ships as a marked breaking change: default history retention goes from 2,000 to 100. The reasoning is in the commit message and here: clipboard history is a high-frequency cache, favorites and pins carry the archival duty, and deleted content in the trash should not outlive content you kept.

Pin order becomes data

The symptom: pinned was a boolean. It answered "is this pinned" but not "pinned in which position." The Pinlist order had no authoritative data source, and the pinned cap was a hardcoded number.

The repair came in three layers. At the protocol level, the boolean SetHeaderPinned request became a MutateHeaderPinnedV1 mutation, and ClipHeaderV1 and HistoryItemV1 gained a pinned_position field, so order now travels with the item as data, with CLI commands and API handlers migrated onto the new request type. At the policy level, clipboard limits now distinguish profiles by subscription status: the free tier cap dropped from 10 pins to 5, subscribed profiles are unrestricted. At the config level, the modifier keys for number-key quick paste became the quick_paste_pinned_modifiers option instead of a fixed binding. The visible effect: the Pinlist has a dependable source of order, and drag-reordered pins no longer drift after sync.

Quick Panel focus and a shared preview session

Two Quick Panel corrections. Focus handling is now compiled only for macOS and Windows, making "panel summons, keyboard immediately works" an explicitly supported, test-covered path on both platforms. Previews fixed a state desync: the open/closed lifecycle was previously tracked locally per panel route, so navigating between panel routes could leave stale state behind. A single shared session object now tracks the preview lifecycle (open, reset, transition) across panel routes, and the local per-layout state is gone.

Pairing as tasks, subscription sessions that heal

The pairing module was rebuilt from a single path into a task-based architecture: accept, initiate, and show each run through their own task executors behind a new PairShowTaskCommandV1 command, and a waiting show session can now be cleanly replaced by a new one instead of tangling with it. In the same window, the subscription plugin entered the client's dependency list, and the subscription runtime gained session self-repair: reauthentication handling, session renewal state management, access token validation, authenticated snapshot resolution, and explicit state transitions for logout and reset; the entitlement API's account snapshot gained an optional session-renewal field to match; account and activation pages now describe manual activations by benefit duration ("30 days") with the end date still shown, removing the ambiguity of a bare date. File preview picked up test coverage for content-plan-based OCR capability detection and source code syntax highlighting along the way.

Dev credentials in production artifacts

One cleanup that has nothing to do with end users but belongs in the record: development mock credentials left in deployment templates and container builds (NEXT_PUBLIC_PORTAL_DEV_* variables and the dev_auth_enabled flag) were removed entirely, with artifact validation added so mock credentials cannot reenter production images, and the docs updated to match. The server also gained dedicated bootstrap-user environment variables for app store review, so the review environment and production get separate account channels. For completeness: this window also contains an API that lived for one day: an endpoint to focus a history item and return a window around it was removed the next day in favor of standard queries with cursors. We mention it because reverting things is part of shipping.

What upgrading from 1.0.0 looks like

No config surgery required. Legacy retention values above the ceiling are clamped automatically, and the default change only affects users who never explicitly set retention counts. The free-tier pinned cap tightens to 5, and the quick-paste modifier combination is visible and editable in settings. The protocol changes (the pinned mutation request and the shared retention policy) stay sealed inside the client; what you see is different behavior, not migration work. Once the distribution config updated, 1.0.1 went out through the existing distribution channel, and the changes users notice are mostly small and specific: preview open/close state survives panel route changes, history and trash now clean up on the same rhythm, and a waiting pairing session yields cleanly to a new one.

1.0.1 has nothing for a marketing page, which is exactly what it should be. The next release, 1.1.0, returns to feature velocity: a desktop workbench, sync instrumentation, and a Windows hotkey rewrite.

Frequently asked questions

Does 1.0.1 add any features?

No. All twelve commits are fixes, refactors, and release engineering: unified retention policy, pinned position tracking, Quick Panel focus and preview session corrections, task-based pairing, and a production credential cleanup.

Does the retention change delete my existing history?

What changes are the limits and defaults: history and trash share a default of 100 items, a 2,000-item ceiling, and a 50-item floor, with over-limit legacy configs clamped to the ceiling. Eviction still runs through the existing prune policy, gradually.

Why did the default retention drop from 2,000 to 100 items?

1.0.1 merges history and trash into one retention policy: a shared default of 100 items each, a hard ceiling of 2,000, a floor of 50, and clamping for legacy configs above the ceiling. Clipboard history is a high-frequency cache, not an archive; favorites and pins carry what you want to keep.

How many pinned items are allowed?

The free tier cap moved from 10 to 5; subscribed profiles are unrestricted. The modifier combination for number-key quick paste is now a configurable option instead of a fixed value.