Software stack
The stack behind the two products.
Phoenix is a Laravel 12 ERP with a Vue staff interface and a MariaDB ledger. Receipts is a Flutter app. The till connects to Receipts with a Bearer key. Custom data services use a separate toolkit, listed on the services page.
Phoenix
Product page| Application | PHP 8.3 and Laravel 12, split into modules |
|---|---|
| Modules | nwidart/laravel-modules, one package per area of the business |
| Staff interface | Inertia.js 2, Vue 3, Tailwind CSS 3, Vite 6 |
| Database | MariaDB. Money is stored as decimals and calculated with bcmath |
| Staff sign-in | Email and password, Microsoft Entra ID, Google, or LDAP |
| API access | Laravel Sanctum for staff tokens, and a separate shop token for customers |
| Permissions | Spatie permissions, scoped to each company |
| Shop | White-label storefront, Payfast and EFT, installable PWA, Capacitor 6 app |
| Reporting | Apache Superset, embedded in the staff interface |
| Documents | PDF output for the documents the ledger produces |
| Tests | Pest 4 |
One installation can host several companies. Each company has its own data, users, roles, branding, and web address.
Receipts
Product page| App | Flutter and Dart 3.12, Material 3 |
|---|---|
| Phones and desktop | Android, iOS, and Windows |
| Navigation | go_router |
| State | Provider |
| Sign-in | The receipts server address from the retailer, token kept in secure storage |
| Alerts | Firebase Cloud Messaging and local notifications |
| Loyalty cards | One card per shop, added to Apple Wallet or Google Wallet |
| Till connection | HTTPS JSON API. The till sends a Bearer key and looks up a card, email, or phone |
| Paper fallback | A photo of a paper receipt stays on the phone |
The phone app and Phoenix do not share a customer database. The till key selects the retailer.
