August 22, 2026

Stackr โ€” Focus & To-do App.

Frontend ยท Backend
Laravel PHP React TypeScript Vite Tailwind CSS SQLite Electron

A focused, OmniFocus-style task manager that is self-hosted, offline-capable, and packageable as a native macOS app.

#task-manager #productivity #laravel #react #pwa #electron #self-hosted
Stackr โ€” Focus & To-do App

Description

Stackr is a focused, OmniFocus-style task manager that is self-hosted, offline-capable, and packageable as a native macOS app. It is a single Laravel application that serves a React + TypeScript SPA over a same-origin REST API, with Sanctum cookie authentication and SQLite storage.

It ships in three forms from one codebase: a web app, an installable PWA, and a standalone macOS .app that bundles PHP and SQLite so it needs no server.

Background

I wanted a serious, keyboard-driven task manager in the OmniFocus mold, but self-hosted and fully owned by the user. Rather than build separate web and desktop products, the goal was a single application that could be delivered as a web app, a PWA, and a native desktop app without duplicating the business logic.

Goal

Build a self-hosted, offline-capable task manager with a rich OmniFocus-style feature set (projects, perspectives, review, forecast) delivered from one Laravel + React codebase, and package it as a standalone macOS app that runs with no external server or PHP installation.

Features

  • Inbox, projects, and tasks with nested subtasks and drag-and-drop reordering.
  • Tags with colors, Perspectives (saved custom filters), and a Review mode.
  • Defer and due dates, flags, priorities, per-task colors, and recurring tasks.
  • Today, Forecast, Calendar, Flagged, and Completed views.
  • Full Markdown notes and comments.
  • Natural-language quick add (for example, Pay rent !high #home tomorrow).
  • Multi-select bulk actions, swipe gestures, and a mobile bottom sheet.
  • Dark mode, keyboard shortcuts , and timezone-aware dates.
  • Real-time sync across tabs via SSE and web push due reminders.
  • Export / import of JSON backups and a first-run setup wizard.
  • A standalone macOS app built with Electron and a bundled static PHP binary.

Technologies

  • Laravel and PHP for the backend and same-origin REST API
  • React 19 + TypeScript + Vite for the SPA, with TanStack Query, Zustand, and dnd-kit
  • Tailwind CSS for styling
  • SQLite for storage and Laravel Sanctum for cookie authentication
  • Electron plus static-php-cli for the standalone macOS build

How to Run

Install dependencies with composer install and npm install && npm run build, then run php artisan key:generate. Opening the app triggers a first-run setup wizard that creates the database and your account and optionally imports a backup. It runs well under DDEV (ddev start, then npm run build). For the desktop app, the desktop/ directory builds a double-clickable .app/.dmg via npm run dist, which stages a production copy of the Laravel app and packages it with electron-builder against a bundled static PHP binary.

Technical Decisions

Stackr is deliberately one Laravel app serving a same-origin SPA, which keeps authentication simple with Sanctum cookies and avoids CORS complexity. For the desktop build I chose to bundle a custom Electron shell with a static PHP binary rather than use NativePHP, because NativePHP’s current release targets Laravel 12 while Stackr runs on Laravel 13. The desktop variant adapts at runtime: SSE realtime is disabled since a single desktop PHP process should not hold a long-lived connection, web push is hidden, and writable state (the SQLite database and storage/) is relocated to the OS per-user data directory so the app bundle stays read-only.

What I Learned

Delivering one codebase as web, PWA, and native desktop taught me how much of “cross-platform” is really about runtime configuration rather than separate builds, from setting Sanctum stateful domains and APP_URL at launch to relocating writable state outside a read-only bundle. Bundling a static PHP binary inside Electron also gave me a much deeper understanding of PHP’s runtime requirements, extension needs, and the constraints of its single-process built-in server.

Notes

The repository is public and released under the MIT license. A screenshot or live preview may be added here later. A couple of real caveats: the desktop app’s PHP built-in server is single-process (mitigated with PHP_CLI_SERVER_WORKERS), auto-update is not yet wired up, and distributing the macOS app to other users requires code signing and notarization to satisfy Gatekeeper.

Read the story behind this project: Proyek-Proyek Kegabutan (in Indonesian).

Hey! I’m Fanny, the software engineer tending to this digital garden. You can read more about me, or subscribe by email.

Comments