Changelog
All notable changes to ResellerHub are recorded here.
The format follows Keep a Changelog, and the project uses Semantic Versioning.
The version shown in the app comes from config/version.php — read it with
app_version(). Never hardcode a version string anywhere else.
2.0.0 — 2026-08-16
A full interface redesign, a rebuilt real-time chat, a real documentation pipeline, and the groundwork for selling the platform white-labelled.
Added
- Apple-grade design system. Self-hosted Inter Variable, Apple system colours, optical letter-spacing, the 8pt grid, continuous-corner radii, a Liquid Glass material layer and one spring curve throughout. Documented in Docs/DESIGN-SYSTEM.md.
- Dark mode that works. The app already shipped a toggle that followed the OS, but not one of the 168 views supported it.
- 21 live data tables across all four portals — debounced search, sortable columns, URL-persisted filters, distinct empty states, no page reloads.
- Real-time chat on Laravel Reverb: typing indicators as client-side
whispers, presence, attachments, voice notes, threaded replies, emoji
reactions, per-person read receipts, staff-only internal notes and canned
/shortcuts. - Command palette (⌘K) with keyboard navigation, shared across portals.
- Documentation portal: instant ⌘K search, scroll-spy table of contents, copy buttons on code blocks, video embeds, captioned images, prev/next.
- White-label branding via
config/brand.phpandBRAND_*variables, resolving system settings → environment → config, so a tenant can rebrand from the admin UI without a deploy. - Centralised version in
config/version.php, surfaced byapp_version()and rendered at/changelog. - Redesigned Terms and Privacy with a sticky table of contents and brand substitution.
- Favicons — an SVG icon that follows the colour scheme, apple-touch-icon, mask icon and theme colour. No layout had declared any of these.
LICENSE— the software is proprietary, © Ochieng Brandon.
Changed
- Tailwind 3 → 4. Both were installed, with v3 doing the work and v4 unwired.
- Five near-identical portal layouts collapsed into one shell driven by
config/portals.php, cutting roughly 900 lines. - Chat reduced from 8 routes to 3; inbox and thread now share one screen.
- Admin and reseller dashboards lead with what needs a decision, not with totals.
- Documentation markdown renders once on save into
content_html.
Fixed
- Broadcast authorisation never existed.
routes/channels.phpwas absent, so every private channel subscription was rejected and/broadcasting/authwas never mounted — the reason chat never updated without a reload. php artisan view:cachehad never succeeded, because six Blade components referenced by the scaffolding did not exist. Production view caching was silently broken.- The notification bell always showed zero. It queried a model that does
not exist, on a column the table does not have, inside a
catchthat hid both errors. - The marketing "my resellers" list was always empty.
registered_bywas missing fromResellerProfile::$fillable, so mass-assignment protection dropped it and the column stayed null. - Lead conversion always failed validation — the button posted no
converted_user_id, which the controller requires. - Admin "top resellers" figures were meaningless — the subquery correlated
users.idagainstreseller_profiles.id. - Pending commission always read zero — it filtered on a status value that is not in the schema.
- The "Issue license" button was hidden from everyone, gated on a permission that does not exist.
- Documentation rendered unstyled.
@tailwindcss/typographywas never installed, so ~25prose-*classes were inert. - Docs sidebar section dots were invisible — the colour was interpolated into a class name at runtime, which Tailwind cannot see.
- The Open Graph image 404'd, so every shared link had a blank card.
- The leads table rendered two columns that are not on the model.
rnact()was a global function declared in two nav partials with the same name and different return values.- Removed the admin login link from the public footer.
Security
- Cleared all 48 dependency advisories across 14 packages. Three were high severity and each mapped onto code this app runs: a CRLF injection in Laravel's default email rule, a CommonMark denial of service via colliding heading slugs, and a Guzzle host-check bypass.
Removed
ChatService,ChatRepository,ChatRepositoryInterfaceandChatMessageSent, superseded byConversationService.- Flatpickr, previously fetched from a CDN at runtime on every form page.
- Google Fonts CDN requests; fonts are self-hosted.
- Per-row
ui-avatars.comrequests; initials render locally.
[1.2.0] — 2026-07
Added
- Monthly reseller report, dispatched on a schedule.
Changed
- Queued job tuning and scheduler adjustments.
[1.1.0] — 2026-06
Added
- Email verification flow and an overhaul of transactional email.
- Database backups via
spatie/laravel-backup. - Kenyan county reference data across client and reseller records.
Fixed
- Admin task management, mirrored into the reseller portal.
- Admin users index, reseller creation and marketing-organisation creation.
- Session configuration for subdomain-based portals.
- Source-code release naming.
[1.0.0] — 2026-04
Initial release.
Added
- Multi-portal architecture over one codebase: public, admin, reseller, client, marketing, docs and map, separated by subdomain.
- Multi-guard authentication with Spatie roles and permissions, Jetstream two-factor, and OTP onboarding over SMS and email.
- Licensing: issue, renew, transfer, suspend, hardware fingerprinting and expiry reminders.
- Commission engine with rules, monthly statements and approval before payout.
- Reseller wallet with credits, debits and transaction history.
- Client portal with license status, payments and support tickets.
- Task management, support tickets and activity logging.
- Geospatial map with client pins, route planning and field visits.
- Marketing organisation portal with leads, royalties and materials.
- Source-code releases behind signed, expiring download URLs.
- Integrations: M-Pesa Daraja, Onfon Media SMS, Leaflet with OpenStreetMap.
- Documentation portal backed by editable database pages.