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.

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

Comments