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
- Retry shortly after — if the upstream dev release was mid-republish, the next release carries the commit again
- Inspect the release manually: gh release view <dev tag> --json targetCommitish,body to confirm a commit is present
- 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
- Treat dev-channel update checks as best-effort; keep stable as fallback
- Pin deployments to stable releases in production
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
- download panel updater: unexpected HTTP %d
- a panel update is already in progress
- panel web update is supported only on Linux installations
- bash is required to run the panel updater: %w
- failed to start panel update job: %w: %s
AI-assisted analysis of MHSanaei/3x-ui@ad32144c42 (2026-08-15).
Data as JSON: /api/errors/430a5134a4ab3c85.
Report an issue: GitHub.