Membangun aplikasi desktop macOS/Windows/Linux dengan NativePHP Electron: menu bar, system tray, window management, strategi code sharing satu repo untuk web + desktop + mobile, serta build distribusi desktop.

Setelah di episode 16 kita mengoptimalkan development loop dengan hot reload dan debugging, pada episode ini kita melihat NativePHP dari sisi desktop: bagaimana kode Laravel yang sama bisa dijalankan sebagai aplikasi desktop di macOS, Windows, dan Linux menggunakan Electron. Ini adalah fitur asli NativePHP sejak 2023 — sebelum mobile.
Jika kalian punya aplikasi web Laravel yang ingin dijadikan desktop tanpa rewrite, NativePHP Electron adalah jawabannya. Kode Laravel berjalan di embedded PHP runtime, dan Electron menyediakan shell Chromium + Node.js untuk rendering.
composer require nativephp/electron
php artisan native:install --platform=desktopphp artisan native:serveAplikasi akan terbuka sebagai window desktop — Laravel berjalan di embedded PHP, dan Electron menampilkan UI di dalam Chromium window.
Menu bar adalah fitur desktop yang tidak ada di mobile. NativePHP menyediakan facade untuk mengelola menu:
<?php
use Native\Laravel\Facades\MenuBar;
MenuBar::create()
->label('My App')
->icon(public_path('images/tray-icon.png'))
->show()
->options([
['label' => 'Dashboard', 'action' => 'dashboard', 'shortcut' => 'CmdOrCtrl+D'],
['label' => 'Tasks', 'action' => 'tasks', 'shortcut' => 'CmdOrCtrl+T'],
['separator'],
['label' => 'Quit', 'action' => 'quit', 'shortcut' => 'CmdOrCtrl+Q'],
]);System tray memungkinkan aplikasi berjalan di background tanpa window yang terlihat:
<?php
use Native\Laravel\Facades\Tray;
Tray::create()
->icon(public_path('images/tray-icon.png'))
->tooltip('My App - Running')
->menu([
['label' => 'Show Window', 'action' => 'show'],
['label' => 'Hide Window', 'action' => 'hide'],
['separator'],
['label' => 'Quit', 'action' => 'quit'],
]);<?php
use Native\Laravel\Facades\Window;
// Buat window baru
Window::new()
->title('Settings')
->size(800, 600)
->resizable(false)
->show();
// Kontrol window utama
Window::getMain()
->minimize()
->maximize()
->close();Strategi untuk share kode antara web, desktop, dan mobile:
app/
├── Http/Controllers/ ← Shared logic
├── Models/ ← Shared Eloquent
├── Livewire/ ← Shared components
├── Services/ ← Shared business logic
resources/
├── views/ ← Shared Blade templates
├── native/
│ ├── ios/ ← iOS-specific shell
│ ├── android/ ← Android-specific shell
│ └── desktop/ ← Electron-specific config
config/
├── nativephp.php ← Platform-specific configKode di app/ dan resources/views/ dipakai oleh semua platform. Perbedaan hanya ada di:
nativephp.php dikonfigurasi per platform.<?php
return [
'name' => env('APP_NAME', 'My App'),
'id' => env('NATIVEPHP_APP_ID', 'com.myapp'),
// Desktop-specific
'electron' => [
'width' => 1200,
'height' => 800,
'resizable' => true,
'min_width' => 400,
'min_height' => 300,
],
// Mobile-specific
'ios' => [
'bundle_id' => env('NATIVEPHP_IOS_BUNDLE'),
'minimum_os_version' => '18.0',
],
'android' => [
'package_name' => env('NATIVEPHP_ANDROID_PACKAGE'),
'min_sdk_version' => '26',
],
];php artisan native:build macMenghasilkan .dmg atau .app bundle. Untuk distribusi di luar Mac App Store, gunakan code signing dengan Apple Developer ID.
php artisan native:build winMenghasilkan .exe installer. Untuk distribusi, pertimbangkan code signing untuk mencegah warning SmartScreen.
php artisan native:build linuxMenghasilkan .deb, .rpm, atau .AppImage. Distribusi lewat package manager atau direct download.
Note
Build desktop hanya bisa dilakukan di OS target: build macOS di macOS, build Windows di Windows. Untuk cross-platform CI/CD, gunakan GitHub Actions dengan runner berbeda per OS.
Inti yang harus dibawa pulang:
native:build mac/win/linux.Di episode 18 selanjutnya, kita akan membahas Build & Distribusi iOS — native:build ios, signing certificates, provisioning profiles di Xcode, dan distribusi ke TestFlight untuk testing. Sampai jumpa di episode 18!