All tests run on an 8-year-old MacBook Air.
All results from shipping 7 Mac apps as a solo developer. No sponsored opinion.
"Offline-first" gets thrown around a lot. For a Tauri desktop app, it has a specific meaning — and it's not complicated.
Here's what I mean when I say my apps are offline-first, and how I built it.
What offline-first means for a desktop app
A desktop app is already local by default. The question is what happens when it needs external resources — AI APIs, sync endpoints, update servers.
Offline-first means: the app is fully functional without any network connection. Network access enhances the experience; it doesn't enable it.
For my apps:
HiyokoAutoSync: syncs files when ADB device is connected. No internet required.
PDF Vault: all PDF operations run locally. Gemini OCR is optional enhancement.
HiyokoHelper: all history, caching, and UI runs locally. AI analysis requires network.
The distinction: required vs optional network.
The practical implementation
Local-first data. Everything goes to SQLite first. Network sync (if any) happens after.
rustasync fn process_action(input: Input) -> Result {
// Write to local DB immediately
db.save(&input).await?;
// Try network enhancement — fail gracefully
match enhance_with_api(&input).await {
Ok(enhanced) => Ok(enhanced),
Err(_) => Ok(Output::from_local(&input)), // degrade gracefully
}
}
Graceful degradation for AI features. If Gemini is unavailable, show the raw data. Don't block the UI waiting for a network response.
No blocking network calls on the hot path. The user's primary workflow should never wait for the network. Background sync, optional enrichment — yes. Mandatory network call before the user can do anything — no.
Why it matters for desktop apps
Desktop apps get used in planes, conferences, basements, rural areas. Users expect desktop software to work without internet. Web app expectations don't apply.
More practically: a flaky network call that hangs the UI is the fastest way to get a bad review.
The one exception
Update checks and license validation. These require network by definition. Handle them gracefully: check in the background, don't block launch, degrade to last-known state on network failure.
If this was useful, a ❤️ helps more than you'd think — thanks!
Hiyoko PDF Vault → https://hiyokoko.gumroad.com/l/HiyokoPDFVault
X → @hiyoyok
Top comments (0)