MHSanaei/3x-ui · warning

dev release commit is unknown

Error message

dev release commit is unknown

What it means

getDevUpdateInfo fetches the rolling GitHub release tagged devReleaseTag and extracts the built commit (extractReleaseCommit). If the release metadata contains no recognizable commit hash, the dev-channel update check cannot compare versions, so it errors out rather than guessing. This depends entirely on the release having been published with a commit reference (e.g. in the target_commitish/body).

Source

Thrown at internal/web/service/panel/panel.go:167

// release. It is driven solely by the opt-in setting so the panel can
// cross-grade a stable build onto the dev channel once the user enables it;
// nothing updates without an explicit user action, so an unattended stable
// binary with the toggle off stays on the stable channel.
func devChannelActive() bool {
	enabled, err := (&service.SettingService{}).GetDevChannelEnable()
	return err == nil && enabled
}

// getDevUpdateInfo compares the running commit against the commit recorded in the
// rolling dev release.
func getDevUpdateInfo() (*PanelUpdateInfo, error) {
	release, err := fetchPanelRelease(devReleaseTag)
	if err != nil {
		return nil, err
	}
	latestCommit := extractReleaseCommit(release)
	if latestCommit == "" {
		return nil, fmt.Errorf("dev release commit is unknown")
	}
	currentCommit := config.GetBuildCommit()
	return &PanelUpdateInfo{
		Channel:         "dev",
		CurrentVersion:  config.GetPanelVersion(),
		CurrentCommit:   shortCommit(currentCommit),
		LatestCommit:    shortCommit(latestCommit),
		LatestVersion:   "dev+" + shortCommit(latestCommit),
		UpdateAvailable: !commitsEqual(currentCommit, latestCommit),
	}, nil
}

// StartUpdate starts the official updater using this panel's own channel
// setting. Returns the run ID to pass to GetUpdateStatus so the caller can
// tell this run's result apart from a stale one.
func (s *PanelService) StartUpdate() (int64, error) {
	return s.startUpdate(devChannelActive())
}

View on GitHub (pinned to ad32144c42)

Solutions

  1. Retry shortly after — if the upstream dev release was mid-republish, the next release carries the commit again
  2. Inspect the release manually: gh release view <dev tag> --json targetCommitish,body to confirm a commit is present
  3. If it persists, report upstream — the release pipeline is omitting the commit; use the stable channel meanwhile
Defensive patterns

Strategy: retry

Try / catch

info, err := panelService.GetUpdateInfo()
if err != nil && strings.Contains(err.Error(), "dev release commit is unknown") {
    // transient upstream publishing window: fall back to stable channel info or retry later
}

Prevention

When it happens

Trigger: Calling GetUpdateInfo on the dev channel when the upstream dev release was created by a workflow that omitted the commit — e.g. release deleted and re-created without the hash, or a manually drafted release.

Common situations: Upstream repo changed its release automation; the fetched release JSON is a proxied/cached copy that stripped the commit field; checking for updates right as the dev release is being republished.

Related errors


AI-assisted analysis of MHSanaei/3x-ui@ad32144c42 (2026-08-15). Data as JSON: /api/errors/430a5134a4ab3c85. Report an issue: GitHub.