PHP,
on the desktop.
Ship your Laravel app as a real Windows, macOS, or Linux desktop application. Same code, same team, native window and OS integrations — without rewriting anything in Electron.
3
Platforms from one codebase
~120 MB
Typical installed size
2 wk
Kick-off to first build
0
New languages to learn
The stack
Tools we ship with.
Laravel 11
Framework
PHP 8.3
Runtime
NativePHP
Desktop shell
Livewire
Reactive UI
Inertia
SPA adapter
Alpine.js
Lightweight JS
Tailwind
Styling
Vue 3
Frontend
React
Frontend
SQLite
Local DB
Redis
Cache / queue
Composer
Package manager
Native APIs
What you can do from PHP.
Every one of these is a first-class PHP API. No JavaScript bridge, no IPC plumbing — just method calls in your Laravel code.
Windows
Open, close, resize, remember state, multiple windows
App menu
Native application menus, per-platform layout
Notifications
Title, message, actions, sound, click handlers
File dialogs
Open, save, file type filters, multi-select
Clipboard
Read, write, image paste, system-wide
Shell
Open URLs, reveal in Finder/Explorer
Screen
Display dimensions, cursor position, multi-monitor
System
OS info, version, paths, environment
Power monitor
Battery, AC, suspend and resume events
Global shortcuts
System-wide hotkeys with modifier combos
Audio & media
Play sounds, media keys, notifications
Auto-updater
Check, download, install, delta updates
The three questions
What it is. Why it matters. How we use it.
01
PHP, running as a native desktop app.
NativePHP lets you ship a Laravel or plain PHP application as a real Windows, macOS, or Linux desktop app. The same controllers, the same Eloquent models, the same Blade views — wrapped in a native window with access to the operating system.
- Same PHP code you already write — no new language
- Ships as a signed .exe, .dmg, or AppImage
- Full access to filesystem, tray, notifications
- Auto-updates via signed releases
Invoice #4821
Amara Okafor
Architecture
One codebase. Two entry points.
The web app and desktop app share the same business logic through a Composer package. Write it once, consume it in both.
namespace Acme\InvoiceCore\Services;
class InvoiceService
{
public function totalFor(Client $client): Money
{
return $client->invoices()
->where('status', 'pending')
->sum('amount');
}
}
// --- In web/routes/web.php ---
Route::get('/invoices', function (InvoiceService $svc) {
return view('invoices', [
'total' => $svc->totalFor(auth()->user()),
]);
});
// --- In desktop/NativeShell.php ---
Window::open()
->route('invoices')
->width(1280)
->rememberState();Real-world use
What teams actually build.
Internal tools
Admin dashboards that run locally. No server per user, no browser tab to lose.
Field agents
Offline-first data capture with local SQLite. Syncs to the Laravel API when connected.
POS terminals
Retail point-of-sale on a local machine. Cash drawer, receipt printer, scanner integration.
Kiosk software
Self-service terminals in lobbies, showrooms, and events. Locked-down, full-screen.
Desktop companions
A desktop app to an existing SaaS product. Shared codebase, one deployment.
Data processing
Batch jobs, ETL, image processing at the edge — without a server round-trip.
Honest comparison
NativePHP vs Electron vs Tauri.
We build with all three. The right choice depends on your team, your stack, and what you're optimizing for.
NativePHP
Best fitPHP backend · Laravel-native
Bundle
~120 MB
Backend
PHP (Laravel)
Learning
Zero — if you know Laravel
- Existing Laravel app to leverage
- Team writes PHP, not JS/Rust
- Bundle size is not the primary constraint
- Desktop companion to a web product
- Want to stay in one language and stack
Electron
Node backend · JS-first
Bundle
~120 MB
Backend
Node.js
Learning
Zero — if you know JS
- Team is JavaScript/TypeScript-first
- Large existing Node.js codebase
- Broadest ecosystem of native modules
- No PHP investment to leverage
- Mass-market consumer apps
Tauri
Rust backend · smallest bundle
Bundle
~10 MB
Backend
Rust
Learning
Steep — Rust required
- Bundle size is critical
- Performance is the top concern
- Team comfortable with Rust
- Modern security posture matters most
- You want maximum native integration
Bundle size
What the installer actually weighs.
NativePHP bundles a PHP runtime and Chromium — same footprint class as Electron. If bundle size is your top priority, Tauri is the answer. If code reuse and team velocity are, NativePHP wins.
System requirements
What users need to run it.
Windows
Windows 10 (1809+)
Windows 11
WebView2 runtime required
macOS
macOS 11 Big Sur
macOS 14 Sonoma
Apple Silicon native
Linux
glibc 2.28+ (Ubuntu 20.04)
Ubuntu 22.04+
AppImage / deb / rpm / Flatpak
Distribution & signing
Signed on all three platforms.
Unsigned installers get blocked by users. Every app we ship is properly signed, notarized, and distributed with an auto-update feed.
Windows
- 01Authenticode certificate from a CA
- 02Sign the .exe and MSI installer
- 03Build SmartScreen reputation over time
- 04Ship as NSIS installer or MSI package
macOS
- 01Apple Developer ID certificate
- 02Notarize the .app with Apple
- 03Staple the notarization ticket
- 04Distribute as signed .dmg
Linux
- 01Build AppImage for portable distribution
- 02Package as .deb and .rpm for repos
- 03Optional Flatpak for sandboxed installs
- 04Sign releases with GPG
Auto-update flow
Release to installed in five steps.
Release
New version published to signed release feed.
Check
Installed apps poll the feed on schedule.
Download
Delta download where possible — smaller payload.
Verify
Signature verified before install. Rejects tampering.
Install
Runs on next launch, or forced if critical.
Kiosk mode
Locked-down. Full-screen. Self-service.
NativePHP handles kiosk-style deployments well — terminals, showrooms, event booths, and anywhere a locked-down app needs to just run.
Full-screen, no chrome
No window borders, no menu bar, no browser UI. Just the app.
Disable keyboard shortcuts
Block Ctrl+Alt+Del escape routes, disable Alt+Tab, disable Cmd+Tab.
Auto-restart on crash
Watchdog process restarts the app if it exits unexpectedly.
Managed via MDM / GPO
Deploy and configure across fleets with macOS MDM or Windows Group Policy.
In the box
What ships with the app.
PHP runtime
Bundled PHP binary — user installs nothing separately.
SQLite
Local database ships with the app for offline data.
Chromium engine
Rendering engine bundled — no separate browser needed.
Your Laravel app
All controllers, models, services, and routes included.
NativePHP runtime
The PHP-to-native bridge and shell.
Auto-updater
Signed release feed with delta downloads.
Common confusions
What NativePHP is not.
There are several related-but-different tools in the PHP ecosystem. Here's how they differ.
Not Laravel Octane
Octane accelerates web requests. NativePHP wraps an app for the desktop.
Not FrankenPHP
FrankenPHP is a modern PHP server. NativePHP is a desktop shell.
Not a web server
NativePHP ships your app — it doesn't host one for other users.
Not a mobile framework
Desktop only. For mobile, use React Native, Flutter, or native.
The process
Five phases. Every engagement.
Discovery
Which flows move to desktop, which stay web. Shared package boundaries defined before any code.
Deliverables
Feature matrix · Shared-code plan · Fixed-price quote
Shared package
Extract business logic into a Composer package consumed by both the web and desktop entry points.
Deliverables
Composer package · Web refactor · Tests pass on both
Desktop shell
Native windows, tray, notifications, file dialogs, menus, and OS-specific integrations.
Deliverables
Working desktop app · Weekly builds · Documentation
Signing & distribution
Code signing per platform, installer packaging, auto-update pipeline wired up end to end.
Deliverables
Signed installers · Update feed · Install test report
Support
OS compatibility updates, PHP and Laravel upgrades, feature iteration, quarterly reviews.
Deliverables
Monthly retainer · SLA response · Roadmap
Timelines
How long a NativePHP build takes.
Simple
3–4 wk
- Web app + desktop shell
- Standard windows and menus
- Local file access
- One-platform launch
Shared logic
6–8 wk
- Composer package extracted
- Dual entry points (web + desktop)
- Offline SQLite sync
- Signed + notarized installers
Complex
10–14 wk
- Deep native API integration
- Kiosk or POS hardware
- Multi-platform with auto-update
- MDM / Group Policy deployment
Honest advice
When NativePHP fits.
When it doesn't.
Choose NativePHP when
- You already have a Laravel app to leverage
- Your team writes PHP and doesn't want to learn JS or Rust
- Bundle size isn't the top constraint
- You need a desktop companion to a web product
- Faster time-to-market beats smallest footprint
Consider alternatives when
- Bundle size is critical (Tauri is 10× smaller)
- Your team is JavaScript or Rust-first
- You need mobile from the same codebase
- Deep GPU / Metal / Vulkan access matters
- Mass-market consumer app on the App Store
Credentials
Why teams trust us with NativePHP.
Built on NativePHP
First-party integration with the official NativePHP runtime from Beyond Code
Laravel expertise
Deep Laravel work across dozens of production applications
PHP native
PHP 8.3+ across every build — modern language features only
Desktop shipping
Signed, notarized, and distributed apps on three platforms
Selected work
NativePHP in production.
Admin dashboard companion
A Laravel SaaS needed a desktop admin app for ops teams working on private networks. Shipped in 5 weeks with shared Eloquent models and services.
Outcome
5-week build
Field agent data capture
Offline-first field app for a logistics company. Local SQLite, syncs to Laravel API. Runs on 200 field machines across Windows and macOS.
Outcome
200 deployments
POS terminal for a retail chain
Point-of-sale running on local terminals across 12 stores. Receipt printer, barcode scanner, cash drawer integrations from PHP.
Outcome
12 stores live
Client feedback
What our clients
actually say.
“The move to SikaNet CBS was a bigger shift than I expected — but the right one. Before, our Susu collectors were on paper and every BOG report took us days to assemble. Now collections appear in the office before a collector even finishes their route, and the reports are just there. The team understood our business from day one.”
David Awuni
Founder, Adwumapa Microfinance
“We were cautious about moving patient records online. The on-prem approach changed that — everything stays inside the health center, nothing goes to a foreign cloud. Our clinicians now retrieve a file in seconds instead of ten minutes, and every entry has an audit trail behind it.”
Medical Director
Sekyedumase Health Center
“The patient management system they developed has streamlined our ophthalmology department. Appointment scheduling, patient records, and referral tracking are now seamless — saving us hours of administrative work every day.”
Isaac Adu
Ophthalmologist, Ghana Health Service
Get in touch
Building a desktop
companion to Laravel?
We can help. Two weeks from kick-off to your first signed build.
