Offline First: Using SQLite and Caching in Desktop Apps



Powerful Local Data Handling with NativePHP

One of the most important characteristics of a great desktop app is its ability to function offline. With NativePHP, combining Laravel's powerful architecture with desktop-native capabilities makes this seamless. In this article, we’ll walk through how to design an offline-first app using:

  • 🗃 SQLite (lightweight, file-based DB)

  • ⚡ Laravel Caching

  • 🔁 Sync-friendly architecture

Let’s make your desktop app independent from internet connectivity — without sacrificing speed or structure.


🧱 Why SQLite for NativePHP?

SQLite is ideal for desktop applications because:

  • ✅ It’s embedded (no server required)

  • ✅ Super lightweight

  • ✅ Fully supported by Laravel

  • ✅ Easy to bundle and deploy

And since NativePHP is built on Laravel, switching your app to SQLite is just a matter of config.


⚙️ Step 1: Set Up SQLite in Laravel

Open your .env file and update your database connection:

DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite

Or, for a relative project path:

DB_DATABASE=database/database.sqlite

If database.sqlite doesn’t exist yet, create it:

touch database/database.sqlite

Then, run migrations as usual:

php artisan migrate

You're now running Laravel with a local SQLite DB — perfect for offline use.


🔁 Step 2: Working with Laravel Cache

Use caching to speed up access to frequently used data and to minimize unnecessary DB or API calls when offline.

Example: Caching a Fetched Dataset

use Illuminate\Support\Facades\Cache;

$data = Cache::remember('user.stats', now()->addMinutes(30), function () {
    return User::all();
});

This approach stores the data for 30 minutes and falls back to the cache even if you're offline during the next request.


🚨 Step 3: Detect Offline Mode

You can set a flag when internet access is lost, and use it to switch between cached/local DB and live APIs.

function isOnline(): bool {
    return @fsockopen("www.google.com", 80);
}

Use this in your controllers or services to fallback to SQLite/local data when the internet is unavailable.


💡 Bonus: Queued Syncing

When your app regains connectivity, you can queue tasks or sync local changes with a remote server.

use App\Jobs\SyncUserData;

if (isOnline()) {
    dispatch(new SyncUserData($localUserData));
}

🧪 Use Case Example: To-Do App

A simple To-Do app using SQLite and caching can:

  • Save tasks locally in SQLite

  • Cache frequently accessed data

  • Sync tasks with a cloud API when online

  • Still function 100% offline with the same UI


🧰 Tools That Pair Well

  • Spatie’s Laravel Backup: For backing up SQLite data

  • Laravel Horizon: Queue management for syncing

  • LocalStorage + NativePHP: Combine with browser/local UI storage too!



Building offline-first apps with NativePHP and Laravel allows you to deliver performance and reliability — even when your users go off the grid. With SQLite and Laravel caching, you're equipped to handle real-world offline usage with confidence.