janhq/jan · info
No update available
Error message
No update available
What it means
downloadAndInstallWithProgress calls the Tauri updater's check(); when it returns null/undefined (no applicable update), the method throws 'No update available'. check() returns nothing when the app version already satisfies the latest published version in the update manifest (or updates are disabled).
Solutions
- Call check() first and only offer the update button when an update exists; treat this throw as 'already up to date'.
- Verify the updater endpoint (latest.json) actually advertises a version higher than the installed one.
- Confirm the updater plugin endpoint/signature config in tauri.conf.json is correct.
- Catch the error and show 'You are on the latest version' instead of failing.
Example fix
// before
await updater.downloadAndInstallWithProgress(cb)
// after
const update = await check(); if (!update) { showToast('Already up to date'); return } await updater.downloadAndInstallWithProgress(cb) Defensive patterns
Strategy: try-catch
Validate before calling
const update = await check()
if (!update) { /* already up to date */ return } Try / catch
try {
await updater.downloadAndInstallWithProgress(cb)
} catch (e) {
if (e instanceof Error && e.message === 'No update available') {
showToast('You are already on the latest version')
}
} Prevention
- Only render the update button after check() returns an update object.
- Clear update-available UI state after install/restart.
- Keep the updater manifest version strictly ahead of installed builds.
When it happens
Trigger: check() from @tauri-apps/plugin-updater resolves falsy and the user/code still requests downloadAndInstallWithProgress; e.g. clicking 'Update now' when the app is already on the latest version.
Common situations: Update button shown from stale UI state after an update already installed and restarted; updater endpoint manifest not bumped, so check() sees no newer version; version comparison considers the installed build up to date (e.g. same or higher version string); updater plugin misconfigured with a wrong endpoint so it resolves empty.
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 janhq/jan@7205d770c1 (2026-09-17).
Data as JSON: /api/errors/ee9d4307eb34e8b1.
Report an issue: GitHub.
Appendix: source
Thrown at web-app/src/services/updater/tauri.ts:147
try {
const update = await check()
if (update) {
await update.downloadAndInstall()
// Note: Auto-restart happens after installation
}
} catch (error) {
console.error('Error installing update in Tauri:', error)
throw error
}
}
async downloadAndInstallWithProgress(
progressCallback: (event: UpdateProgressEvent) => void
): Promise<void> {
try {
const update = await check()
if (!update) {
throw new Error('No update available')
}
// Use Tauri's downloadAndInstall with progress callback
await update.downloadAndInstall((event) => {
try {
// Forward the event to the callback
progressCallback(event as UpdateProgressEvent)
} catch (callbackError) {
console.warn('Error in download progress callback:', callbackError)
}
})
} catch (error) {
console.error('Error downloading update with progress in Tauri:', error)
throw error
}
}
}
View on GitHub (pinned to 7205d770c1)