Building a state-of-the-art Computational Imaging platform from scratch.
Tech stack:
Laravel 13
PostgreSQL
Livewire
Filament
Tailwind CSS 4
GSAP
Three.js
Redis
I'm documenting every major decision, mistake, and lesson along the way.
Follow if you're into Laravel, AI, product engineering, or building real software.
I thought unified search would mostly be a ranking problem.
The harder part was deciding what could enter the result set. Each query applies its public or user-specific access scope before PostgreSQL ranks the union.
Search should never become a second access path.
I added Laravel's scheduler, but the key decision was what not to schedule.
Access grants and news visibility are enforced from timestamps at request time. Cron handles reminders, cleanup, and state transitions.
If it stops, maintenance pauses. Authorization does not.
Two weeks of details behind the Tourways build.
The project history includes pricing, forms, mobile fixes, branding repairs and an admin handover guide. The saved test run records 38 passes and 149 assertions.
These are the parts behind the homepage reveal.
This Tourways enquiry has a campaign label attached to it.
I added attribution fields so source context can stay with the record staff follow up on. The screenshot shows a demo campaign and device type, not evidence of real campaign performance.
These Tourways property filters update the results without a full page reload.
The pages still use Blade. The server returns the updated results markup, and a small fetch request replaces that section.
Here's the interaction on the local site.
I moved a queue to Redis and found a bug outside the jobs.
The admin widget still counted the old database table, so Redis could hold work while the dashboard showed zero.
It now reads Laravel's queue contract and reports outages as Unavailable, never as an imaginary zero.
I followed the Tourways newsletter flow past the Subscribe button.
It includes unsubscribe, subscriber status and an admin CSV export. Staff can also manage the site's special offers from the CMS.
The clip shows the newsletter flow using local test data.
I queued email but kept the in-app confirmation immediate.
A worker can fail after the database transaction succeeds. That should delay email, not make a valid registration look lost.
The dashboard is the receipt. Email is a retried side effect.
Not every Tourways listing has a fixed public price.
The editor supports a starting price, a promotional price or contact-for-price wording, plus fee lines and a note explaining the total.
That is more useful than forcing a number.
Local demo editor.
I expected scheduled publishing to need a worker.
Here, a Published post is public only when `published_at <= now()`. The timestamp is the source of truth across lists, details, filters, and metadata.
Future content stays private without a second status to sync.
The Tourways inspection form saves the request, returns a booking reference and gives the visitor a WhatsApp follow-up route.
The business still confirms the visit. Submitting the form doesn't mean a slot is confirmed.
This recording uses a local test booking.
I almost treated a collaboration timeline as a simple activity log.
Applicants need status updates. Reviewers need private reasoning. Every entry now declares who may see it, and separate queries enforce that choice.
A tiny field became a real privacy boundary.
The Tourways mobile menu needed another pass. So did the homepage's horizontal overflow.
Here's the menu opening and closing after the fixes. A tiny clip, but these are the details people feel every time they use a site on their phone.
A training registration looked like one table until I added capacity.
I split the applicant workflow from enrolment. Pending reviews keep their history; only approved, active enrolments consume a place.
That distinction made the rule much easier to trust.
This is the small Three.js visual on Tourways.
It loads as the section approaches the viewport, skips mobile and reduced-motion settings, and caps the pixel ratio.
A decorative estate visual, not a surveyed site plan. The property content works without it.
A short scroll through the Tourways homepage.
The inspection fee appears in the first screen, alongside routes to the listings and WhatsApp. I wanted visitors to understand the next step early, even if they were still just looking.
Local site recording.
For the Tourways homepage, I kept the red and navy from the brand and gave the property imagery more room.
The first screen has three clear routes: book an inspection, browse properties or ask a question on WhatsApp.
Here's the desktop version.
A signed URL is not the final security check for a protected download.
It proves the app created the link and no one altered it. I still re-check access when the file is requested, so a revoked or expired grant takes effect immediately.
Different checks, same boundary.
One handover detail on Tourways: the logo and favicon are editable from the admin panel.
A branding update shouldn't mean finding the developer to replace a file in the codebase.
Small feature, useful control to give the business.
Local demo screenshot.
An admin role should not be a master key. In this Laravel build, panel access, content management and private resource access are separate decisions. The test I cared about most proves a Super Administrator still cannot open a private resource through the public route.