DEV Community

Agent Island
Agent Island

Posted on • Originally published at agent-island.dev

The Updater Was Present. The Release Feed Was Empty.

Agent Island's macOS app had an updater framework, but the feed URL was empty. Checks failed quietly, so old installs never learned that a new GitHub release existed.

Version 1.7.1 added a separate release-discovery path:

  • wait 20 seconds after launch;
  • query the latest GitHub release;
  • repeat every six hours with timer tolerance;
  • compare numeric dotted versions;
  • prompt only for a newer, unsnoozed version.

The automatic path stays silent when the network fails. The manual "Check now" action always answers with a newer-version prompt, an up-to-date message, or an error. Background work and explicit user requests should not share the same failure UX.

The snooze stores a version and a seven-day deadline. Storing only the date would hide a new patch released during that week. Storing only the version would never expire. The pair suppresses repeated prompts for one release without muting the next one.

macOS opens the GitHub release page when the user chooses Update. Windows uses the same discovery cadence but keeps its existing download-and-relaunch flow. Shared discovery is not evidence of identical installation behavior.

The uncomfortable part is bootstrap. Builds at or below 1.6.1 do not contain the new checker, and their old feed remains empty. They cannot discover the version that fixes discovery. Those users need one manual download or brew upgrade; later releases can then appear in-app.

That boundary belongs in release communication. "Added update checks" sounds retroactive, but code shipped in a new binary cannot repair a discovery path inside binaries that never receive it.

Agent Island 1.7.1 is free, MIT licensed, and available for macOS and Windows.

Canonical article: https://agent-island.dev/blog/desktop-update-poller-empty-feed/

Top comments (1)

Collapse
 
alexshev profile image
Alex Shev

This is a good reminder that presence is not capability. An updater component existing in the app does not mean the update system is alive. The feed, signature, version policy, rollback story, and user-visible failure mode are the actual product contract.