Projects › BizBuddy: A Self-Contained Desktop Business App Built on the Web Stack

BizBuddy: A Self-Contained Desktop Business App Built on the Web Stack

BizBuddy is a desktop business manager for small operations: contacts, invoicing, inventory and printed documents in one app. It is written entirely in the standard web stack (PHP, HTML, CSS and vanilla JavaScript), yet it runs as a…

BizBuddy: A Self-Contained Desktop Business App Built on the Web Stack
In progress Personal project October 2026

What BizBuddy is

BizBuddy is a desktop business manager for small operations: contacts, invoicing, inventory and printed documents in one app. It is written entirely in the standard web stack (PHP, HTML, CSS and vanilla JavaScript), yet it runs as a native, self-contained desktop program. There is no browser tab, no web server to set up and no PHP to install.

The idea is simple. Web technologies are the fastest way to build a polished business UI, but small-business owners want a program they double-click, not a website they host. BizBuddy keeps the web stack for building and wraps it in a lightweight native shell for running.

How it works

BizBuddy has two halves: a small Rust engine and a bundled PHP runtime. On launch, the engine starts PHP's built-in web server on a private loopback port, opens a native window, and points an embedded webview at it. When the window closes, the server stops with it.

A Rust shell runs a bundled PHP server and shows its pages natively Rust engine Native window (tao) Size, position and pop-outs saved Webview (wry) WebKitGTK, WebView2 or WKWebView Renders HTML, CSS, vanilla JS Bundled PHP runtime php -S on 127.0.0.1 Port picked at launch, loopback only App code + Dompdf Pages, JSON APIs, templates PDF invoices and documents SQLite business file Per-user data folder MySQL / MariaDB Optional, shared spawns at launch serves the UI PDO PDO
BizBuddy architecture: engine, PHP runtime, data
  • Engine: Rust with tao for windows and events and wry for the operating system's own webview (WebKitGTK on Linux, WebView2 on Windows, WKWebView on macOS).
  • Backend: PHP 8, shipped as a static binary built with static-php-cli, so users never install PHP.
  • Frontend: plain HTML, CSS and vanilla JavaScript; no framework and no build step.
  • Database: SQLite through PDO, with an optional MySQL/MariaDB connector. Business files live in the user's own data folder, so app updates never touch them.
  • PDF: Dompdf, pure PHP, for invoices, letters and labels.

Features

Home dashboard

  • At-a-glance tiles: Contacts, Open invoices, Overdue (30+ days, with the 90+ day share), Paid this month, Low stock and Out of stock
  • Tiles adapt to the modules installed, and each one opens the matching filtered list
  • First-run choices: open an existing business file, create a new one, or connect to a database server

Contacts

  • Searchable list (name, company, phone, email) with type filter pills and a quick summary panel
  • Full detail page with billing and shipping addresses
  • Separate mail and email promotional opt-ins
  • Merge duplicate contacts
  • CSV import with field mapping
  • Per-contact file attachments (receipts, signed agreements and so on)
  • One click to that contact's invoices

Invoicing

  • Customer picker, date entry and a Job location field that suggests sites used on earlier invoices
  • Search across invoice number, customer, job location and every line description
  • Free-form line items or lines pulled from inventory by name or SKU
  • Made-to-size items (doors, windows) priced by linear, square or cubic size
  • Add, duplicate and remove lines, with keyboard-first entry
  • Payments and credits recorded as their own lines, so Paid and Amount due work themselves out
  • Automatic tax calculation from per-item or default rates, with optional tax on shipping
  • PDF printing through customizable templates, including repeating headers and footers on multi-page invoices
  • CSV import of existing invoices and line items

Inventory

  • Four item types: hourly service, flat-rate service, simple stocked item, and complex made-to-size item
  • Stock count, low-stock threshold, weight, cost and category
  • Per-item SAE or Metric units, with automatic conversion of weights, dimensions and rates
  • Per-item tax rate, active/inactive switch and one-click duplicate
  • Unique, required SKUs

Documents and templates

  • HTML template editor with Design and Code modes and a live PDF preview
  • Placeholders and conditional blocks for contact, company and invoice data
  • Single-sheet letters, multi-contact batches and 2×2 postcard and address-label sheets
  • Promo batch printing for every active, opted-in contact
  • Image library for logos and artwork
  • Optional editing in an external app of your choice

Data, security and administration

  • Each business file is its own SQLite database, stored in the user's data folder, not beside the program
  • Optional MySQL/MariaDB server for shared, multi-workstation use
  • Users and sign-in kept inside each business file, with Manager, Supervisor, Estimator and Sales roles
  • Activity log of changes
  • Backup and restore, with optional gzip compression and AES-256 password protection
  • CSV export of any or all tables
  • Option lists, shipping and tax rates, company profile and business time zone in Settings
  • Shared attachments storage across workstations
  • Built-in help for every module

Desktop experience

  • Native window with saved size and position
  • Pop-out windows: any module can open in its own window, and open windows come back on next launch
  • Native Save-As dialogs for downloads and PDFs
  • Modular editions: Contacts, Billing, Business and Complete, so each customer gets only the modules they need

How it's built day to day

The same code runs in two places without changes. During development, a one-line script serves the app with php -S in an ordinary browser, which gives instant reloads and full developer tools. The Rust engine then runs the identical code in its native window for real-world testing.

A few lessons from the build so far:

  • WebKitGTK has its own quirks. On Linux, position: sticky and focus-driven scrolling proved unreliable, so layouts use plain flex containers and scroll positions are restored explicitly.
  • The engine and the page talk through custom URLs. Pages signal events such as "session ready" or "pop this module out" by navigating to a bizbuddy:// address that the engine intercepts.
  • Track window geometry as it changes. Reading a window's size at close time returns stale values; listening to resize and move events does not.
  • Additive schema only. Database field names are frozen; new versions only add columns, so older business files open and upgrade cleanly.
  • Engine first, features second. Each feature is proven at the engine level before the PHP and JavaScript layers are built on top.

Where it stands and what's next

BizBuddy is feature-complete for its first three modules and is heading to a small group of beta testers. Linux is the first target platform, with Windows to follow.

On the roadmap:

  • A plug-in system, so every module (including contacts, invoicing and inventory) can be added or left out to suit each business
  • A first plug-in, "Graphs and Reports", starting with promotion effort compared against the income it generates
  • Proposals, job cost tracking and a point-of-sale module, matching the Estimator and Sales roles already in place
  • Fully bundled installers with the static PHP runtime included

Tech stack

php mysql sqlite javascript rust
All projects