siyuan-note/siyuan · error

no release is available for the update channel

Error message

no release is available for the update channel

What it means

On a non-stable channel, getGitHubUpdateRelease fetches all GitHub releases and uses selectGitHubRelease to pick the highest non-draft release whose tag matches the channel's prerelease rules (isReleaseAllowed). If no release in the list qualifies — e.g. the channel expects a prerelease tag that does not exist, or only invalid tags are present — this error is returned.

Solutions

  1. Retry with force=true to bypass the 6-hour GitHub releases cache and get the current list
  2. Verify on https://github.com/siyuan-note/siyuan/releases that a non-draft release with the expected prerelease tag exists; if not, wait or switch to the stable channel
  3. Confirm the configured channel is the one you intend (see 'update channel is invalid' for config issues)
  4. If GitHub is returning the list but tags are malformed, report/await maintainer fix; the channel matcher cannot select anything
Defensive patterns

Strategy: fallback

Validate before calling

releases, err := getGitHubReleases(ctx, force)
if err == nil && selectGitHubRelease(releases, channel) == nil {
    logging.LogWarnf("no release matches channel %s; falling back to stable", channel)
}

Try / catch

rel, err := getUpdateRelease(force)
if err != nil {
    // fall back to the stable channel or cached release info
    rel, err = getStableUpdateRelease(false)
}

Prevention

When it happens

Trigger: CheckUpdate on a preview channel when the siyuan-note/siyuan repo currently has no published (non-draft) release matching that channel's prerelease convention; GitHub API returns releases but all are drafts, have invalid semver tags, or are filtered out by isReleaseAllowed.

Common situations: Monitoring a preview channel right after the maintainer unpublished a prerelease or before publishing the first one; GitHub releases temporarily marked draft; cached release list (6h cache) lacking newly expected tags.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


AI-assisted analysis of siyuan-note/siyuan@9f775e8a12 (2026-09-19). Data as JSON: /api/errors/4f7642975c59bd3e. Report an issue: GitHub.

Appendix: 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 9f775e8a12)