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
- Retry with force=true to bypass the 6-hour GitHub releases cache and get the current list
- 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
- Confirm the configured channel is the one you intend (see 'update channel is invalid' for config issues)
- 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
- Force-refresh (bypass the 6h cache) before concluding no release exists
- Check the GitHub releases page for non-draft releases matching the channel before debugging code
- Offer a UI fallback to the stable channel when a preview channel has no candidates
- Remember drafts and invalid tags are intentionally filtered out
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
- checksum manifest is unavailable
- get GitHub releases failed
- GitHub API returned status
- GitHub releases are empty
- load GitHub user failed
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)