siyuan-note/siyuan · warning

no release is available for the update channel

Error message

no release is available for the update channel

What it means

Returned by getGitHubUpdateRelease(channel, force) when selectGitHubRelease(releases, channel) returns nil. The GitHub releases list was fetched successfully, but after filtering out drafts and releases whose tag is not allowed for the channel (isReleaseAllowed), none remain. For beta this means no beta/rc prerelease exists; for alpha no alpha/beta/rc; for stable no final release.

Source

Thrown at kernel/model/updater_release.go:168

func getStablePackageURLs(version, pkgName string) []string {
	b3logURL := "https://release.b3log.org/siyuan/" + pkgName
	liuyunURL := "https://release.liuyun.io/siyuan/" + pkgName
	githubURL := "https://github.com/siyuan-note/siyuan/releases/download/v" + strings.TrimPrefix(version, "v") + "/" + pkgName
	ghproxyURL := "https://ghfast.top/" + githubURL
	if util.IsChinaCloud() {
		return []string{b3logURL, liuyunURL, ghproxyURL, githubURL}
	}
	return []string{b3logURL, liuyunURL, githubURL, ghproxyURL}
}

func getGitHubUpdateRelease(channel string, force bool) (*updateRelease, error) {
	releases, err := getGitHubReleases(context.TODO(), force)
	if err != nil {
		return nil, err
	}
	selected := selectGitHubRelease(releases, channel)
	if nil == selected {
		return nil, errors.New("no release is available for the update channel")
	}

	version := strings.TrimPrefix(normalizeReleaseVersion(selected.TagName), "v")
	release := &updateRelease{
		Version:    version,
		ReleaseURL: selected.HTMLURL,
		Packages:   map[string]*updatePackage{},
	}
	if "" == release.ReleaseURL {
		release.ReleaseURL = githubReleaseURLPrefix + version
	}

	pkgName := currentInstallPackageName(version)
	if "" == pkgName {
		return release, nil
	}
	asset := findGitHubReleaseAsset(selected, pkgName)
	if nil == asset || "uploaded" != asset.State || "" == asset.BrowserDownloadURL {

View on GitHub (pinned to 251596fc0d)

Solutions

  1. Switch to a channel that matches the available prerelease type, or to stable if no prereleases exist.
  2. Verify the desired release is not marked as Draft on GitHub — drafts are always skipped.
  3. Retry after force-refresh; a freshly published prerelease may not yet be in the cached list.
Defensive patterns

Strategy: fallback

Validate before calling

// Check whether any release matches the channel before committing to it.
releases, _ := getGitHubReleases(context.TODO(), false)
if selectGitHubRelease(releases, desiredChannel) == nil {
    // no prerelease of this type exists; stay on stable
    desiredChannel = conf.UpdateChannelStable
}

Prevention

When it happens

Trigger: User switched to the beta or alpha channel but the GitHub repo currently has no prerelease matching that label (all recent releases are stable finals, or only a different prerelease type exists). selectGitHubRelease skips every release because each is either a Draft or fails isReleaseAllowed — e.g. a tag like 'v3.1.0-nightly' whose prerelease label isn't alpha/beta/rc.

Common situations: Selecting 'alpha' when only a 'beta' is published (alpha allows alpha/beta/rc, so this would actually work — but stable allows none). Selecting 'beta' when only an 'alpha' tag exists (beta excludes alpha). Repo temporarily has only stable releases and the user is on a newer custom build.

Related errors


AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12). Data as JSON: /api/errors/4f7642975c59bd3e. Report an issue: GitHub.