Every business we work with eventually asks the same question about a system they rely on daily: how do you modernise something that can't afford to break? We had our own answer to give, because we had our own system to modernise.
Our in-house ticketing and helpdesk platform has run our support operation for years. It's built on arcode, an in-house PHP framework we've maintained since long before Laravel existed. It works, and our team depends on it every day, but the tooling around it - and the pace at which we could add to it - was showing its age.
We needed to bring the helpdesk onto a modern stack, but a full rewrite carries real risk: a big-bang cutover means a long stretch where nothing can be verified against real usage, and any regression shows up all at once, in production, on a system the whole business is actively using to do its job.
We didn't want to freeze feature work for months to get there, and we didn't want a weekend cutover that either worked perfectly or didn't.
We used a strangler-fig migration: Laravel and Filament were stood up alongside the existing arcode application, sharing the same database. We ported the permission model first - the rules governing who can see and act on which support queues - onto Laravel's Gates and Policies, so both systems could enforce access control identically.
From there, screens were converted one at a time: queue views, the ticket view and reply flow, search, invoices, user management, and the ticket actions (merge, rename, create child, manage relations). Both systems stayed live throughout, so at every point we could compare old and new side by side against real data, and roll back a single page if something wasn't right - without touching anything else.
Once every screen had a Laravel equivalent, we moved the front controller so all traffic went to Laravel, and retired the old arcode request path entirely.
A handful of screens show the change clearly. Client and ticket content in these screenshots has been redacted or replaced with placeholder data. Click any screenshot to view it larger.
The queue overview - the page every member of staff lands on - keeps the same at-a-glance ticket counts by priority, now rendered with a modern component library instead of hand-rolled tables.
The core ticket screen - status, priority, queue, and the message thread - is functionally identical, but the page itself is now a Filament page backed by Eloquent instead of an arcode template.
The rich-text reply editor carried across largely unchanged in look and feel - the goal here was never to retrain staff, just to modernise what sits underneath.
Queue views gained filtering by client and a live search box, on top of the same open/closed ticket data.
The old page of separate search forms - full text, quick code lookup, advanced fields - carried across as the new Search page's Advanced Search tab, with the same structured filters (queue, priority, status, tag, client, and who created, replied to, owns, or is working each ticket) plus ranked full-text search. Sitting alongside it is something arcode didn't have: an instant-search box in the header, on every page, for the common case of just wanting a specific ticket by code or keyword.
The invoice list now leads with summary totals and sortable columns, built on the same VAT and PDF generation logic as before, just moved into a dedicated service class.
The same approach we recommend to clients rescuing or replacing a legacy system - stand the new system up alongside the old one, migrate piece by piece, and only retire the old path once every piece has been proven - is the approach we used on our own critical infrastructure.
If your systems are slowing down growth, creating manual work, or becoming difficult to support, we can help you identify what needs fixing and what comes next.
Please provide your details below and we will do our best to get back to you.
Prefer to talk? Call us on 0114 299 8033, 9am–5pm Monday–Friday.
Artumi Systems Ltd. Company Number 8557359
VAT Reg 889031788
Phone number: 0114 299 8033
Opening hours: 9am–5pm, Monday–Friday