<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: OrFactor</title>
    <description>The latest articles on DEV Community by OrFactor (@orfactor).</description>
    <link>https://dev.to/orfactor</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4052552%2F5c4274eb-ed37-46fa-aacf-5f7ddb397408.jpg</url>
      <title>DEV Community: OrFactor</title>
      <link>https://dev.to/orfactor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/orfactor"/>
    <language>en</language>
    <item>
      <title>Why We Chose Laravel 12 Over Node.js for Eventiq — and What the Recurring Event System Taught Us About Premature Architecture</title>
      <dc:creator>OrFactor</dc:creator>
      <pubDate>Tue, 18 Aug 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/orfactor/why-we-chose-laravel-12-over-nodejs-for-eventiq-and-what-the-recurring-event-system-taught-us-2icb</link>
      <guid>https://dev.to/orfactor/why-we-chose-laravel-12-over-nodejs-for-eventiq-and-what-the-recurring-event-system-taught-us-2icb</guid>
      <description>&lt;p&gt;We just shipped v2.0.0 of Eventiq — an event management and ticket booking platform built on Laravel 12 with two Flutter mobile apps. This post covers the stack decisions that actually mattered, the architecture problem nobody warned us about, and the recurring event system that forced us to rethink how we'd structured the entire backend.&lt;/p&gt;

&lt;p&gt;No pitch. Just the technical decisions and what we learned from them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack and Why
&lt;/h2&gt;

&lt;p&gt;Laravel 12 over Node.js&lt;/p&gt;

&lt;p&gt;We debated this. Node.js would have given us a unified JavaScript environment across frontend and backend, which sounds appealing until you actually map out what Eventiq needs to do: multi-role authentication, complex subscription logic, QR token generation and validation, payment webhook handling, KYC flows, payout management, CMS tools, SEO management, and a role/permission system with granular control.&lt;/p&gt;

&lt;p&gt;Laravel 12 gave us Eloquent for the complex relational queries this feature set demands, a mature queue system for payment webhook processing, built-in policy/gate system for the multi-role permission layer, and an ecosystem of packages for things like 2FA and social authentication that we didn't have to build from scratch.&lt;/p&gt;

&lt;p&gt;The honest reason we didn't choose Node: the team's Laravel depth meant we'd spend our complexity budget on product problems, not framework problems. Stack familiarity is an underrated architectural input.&lt;/p&gt;

&lt;p&gt;Required PHP extensions worth noting: bcmath, ctype, fileinfo, json, mbstring, openssl, pdo, tokenizer, xml. If you're packaging a Laravel app for self-hosted distribution — which Eventiq is — you learn quickly that your "standard" extension list is someone else's deployment blocker. We document this explicitly now.&lt;/p&gt;

&lt;p&gt;Using Flutter 3.41.1, managed with FVM, for both mobile applications.&lt;/p&gt;

&lt;p&gt;Eventiq ships two Flutter apps: a User App for attendees and a Volunteer App specifically for gate staff scanning QR tickets. FVM (Flutter Version Management) pins the Flutter version at the project level. This is non-negotiable for any team shipping multiple Flutter projects — version drift between developers is silent and painful.&lt;/p&gt;

&lt;p&gt;The Volunteer App had a specific constraint: it needed to work at event venues where WiFi is overloaded by hundreds of attendees simultaneously. We built local ticket cache sync so the app can validate QR codes against a locally cached list when connectivity degrades. The scan still writes back to the server when connection resumes, but the volunteer isn't blocked at the gate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fffby2nw4df3b0pacj4ob.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fffby2nw4df3b0pacj4ob.webp" alt=" " width="800" height="1831"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Multi-Role Architecture Problem
&lt;/h2&gt;

&lt;p&gt;Four distinct roles share one backend: Admin, Organizer, User, and Volunteer. Each has completely different permissions, different data access patterns, and different business logic.&lt;br&gt;
The naive implementation is a single controller layer with if ($user-&amp;gt;role === 'organizer') conditionals scattered throughout. We didn't do this, but we came close in the early organizer approval flow before we caught it.&lt;br&gt;
The approach that worked: role-scoped service layers. Each role gets its own service layer encapsulating its permissions and business logic. Controllers stay thin. When the Volunteer role was added mid-build — it wasn't in the original spec — we added a service layer rather than threading volunteer logic through existing controllers.&lt;br&gt;
The changelog entry for v2.0.0 that reads "Fix: Resolved recurring guest synchronization foreign key issue during organizer event updates" exists precisely because of a moment when organizer logic and a new recurring event feature became tangled in a way that the service-layer separation was supposed to prevent. We missed it. The FK constraint caught it in testing rather than production, which is the best-case scenario for that class of mistake.&lt;/p&gt;

&lt;h2&gt;
  
  
  QR Ticket Signing — Why We Don't Store Plain Booking IDs
&lt;/h2&gt;

&lt;p&gt;The QR code encodes a signed token, not a booking ID.&lt;/p&gt;

&lt;p&gt;This matters because a plain booking ID in a QR code is an integer. Anyone who can read one valid QR code can increment that integer and attempt to generate adjacent valid tickets. Depending on how validation is implemented, this can be exploited.&lt;/p&gt;

&lt;p&gt;Our tokens are signed with a server-side secret. The Volunteer App validates the signature before checking booking status. An unsigned or incorrectly signed token is rejected before it ever hits the database. The validation write is idempotent — scanning the same ticket twice returns "already used," not an error that stalls the volunteer's queue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3oyo1ywwm81e5p1wgfgv.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3oyo1ywwm81e5p1wgfgv.webp" alt=" " width="800" height="1324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Recurring Event System — Where We Got the Architecture Wrong the First Time
&lt;/h2&gt;

&lt;p&gt;v2.0.0's biggest feature: full recurring event support with daily, weekly, and monthly schedules.&lt;/p&gt;

&lt;p&gt;This sounds straightforward. It isn't.&lt;/p&gt;

&lt;p&gt;The first design we considered stored recurring events as a single event record with a recurrence rule attached — similar to how calendar applications handle it. The problem: Eventiq events have ticketing, attendee lists, volunteer assignments, payout records, and refund histories attached to them. A single parent record with generated child occurrences meant that any operation on a "recurring event" had to decide: does this apply to this occurrence, all future occurrences, or the entire series?&lt;/p&gt;

&lt;p&gt;That's the same question Google Calendar asks you when you edit a recurring meeting. It's deceptively complex when financial records and sold tickets are involved.&lt;/p&gt;

&lt;p&gt;The approach we shipped: recurring events generate actual child event records on a schedule, with a sync workflow for updating future occurrences when the series definition changes. The v2.0.0 changelog line "recurring event updates now remove only future generated occurrences when recurring is disabled, keeping past/live occurrences intact" describes a real business logic decision — you can't retroactively remove an event that already happened and sold tickets.&lt;/p&gt;

&lt;p&gt;Past occurrences are immutable once they go live. Future occurrences can be modified or removed. The data model has to enforce this, not just the application layer.&lt;/p&gt;

&lt;p&gt;If we were starting over: we'd have designed the recurring system before the ticketing system, not after. The shape of the ticketing data model constrained our options for recurring events more than we'd like.&lt;/p&gt;

&lt;h2&gt;
  
  
  The OpenAI Integration
&lt;/h2&gt;

&lt;p&gt;— and the One Thing That Actually Mattered&lt;/p&gt;

&lt;p&gt;Eventiq includes an AI content assistant powered by the OpenAI API. Organizers fill in basic event details and get a generated event description and blog content they can edit and publish.&lt;/p&gt;

&lt;p&gt;The implementation is a standard OpenAI API call with a structured prompt — nothing custom-trained, nothing exotic. We considered a few approaches and chose the simplest one that worked.&lt;/p&gt;

&lt;p&gt;What we learned: placement in the workflow matters more than the AI implementation itself. The same capability surfaced at the exact moment a user faces a blank text field gets used consistently. Buried in a settings page, it gets ignored. This is a product decision, not a technical one, and it took us longer to figure out than the actual API integration.&lt;/p&gt;

&lt;p&gt;One thing to be transparent about for buyers: OpenAI API usage is billed separately by OpenAI. We document this explicitly in the item description because we've seen too many marketplace products bury this detail. If you're running Eventiq at scale with heavy AI usage, that cost is real and worth factoring in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Addon Architecture (New in v2.0.0)
&lt;/h2&gt;

&lt;p&gt;The other significant v2.0.0 addition: an addon system that lets developers extend Eventiq with their own modules. Addons are packaged as zip files, validated against a purchase code and buyer email at upload time, and registered as service providers that can add routes and features to the core platform.&lt;/p&gt;

&lt;p&gt;This was the hardest part of v2.0.0 to get right. Laravel's service provider system is designed for packages installed via Composer — adapting it for runtime-uploaded addon packages with their own routes and navigation integration required careful sequencing of the boot process. The changelog entry "Added active addon provider boot loading so installed addons can register routes and features correctly" describes about two days of debugging provider load order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Eventiq Is Right Now
&lt;/h2&gt;

&lt;p&gt;Eventiq is live on CodeCanyon at $49. It's a self-hosted platform — buyers get full source code and deploy on their own infrastructure. We're early — four sales and one review as of this post. We're sharing this because the technical decisions above are real and might be useful to someone building something similar, not to claim battle-tested scale.&lt;/p&gt;

&lt;p&gt;If you're building a multi-role platform on Laravel and want to talk through any of the decisions above — particularly the recurring event data model or the addon service provider approach — drop it in the comments. We're genuinely interested in how others have solved the same problems.&lt;/p&gt;

&lt;p&gt;→ Live Demo: [(&lt;a href="https://eventiq.orfactor.com)%5DLive" rel="noopener noreferrer"&gt;https://eventiq.orfactor.com)]Live&lt;/a&gt; Demo&lt;br&gt;
→ CodeCanyon: &lt;a href="https://codecanyon.net/item/eventiq-event-management-with-ticket-booking-web-and-mobile-app/62156577" rel="noopener noreferrer"&gt;https://codecanyon.net/item/eventiq-event-management-with-ticket-booking-web-and-mobile-app/62156577&lt;/a&gt;&lt;br&gt;
→ User APK: &lt;a href="https://drive.google.com/file/d/173MyPSnz5_hqN_swcv7vR6qXSoieWK9d/view" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/173MyPSnz5_hqN_swcv7vR6qXSoieWK9d/view&lt;/a&gt;&lt;br&gt;
→ Volunteer APK: &lt;a href="https://drive.google.com/file/d/1U4OnmfMRJlC2qr7zEiFtHjqHu0MdOp1m/view" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1U4OnmfMRJlC2qr7zEiFtHjqHu0MdOp1m/view&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>flutter</category>
      <category>webdev</category>
    </item>
    <item>
      <title>OrFactor: Software Engineered to Simplify Complexity</title>
      <dc:creator>OrFactor</dc:creator>
      <pubDate>Thu, 06 Aug 2026 09:10:00 +0000</pubDate>
      <link>https://dev.to/orfactor/orfactor-software-engineered-to-simplify-complexity-31od</link>
      <guid>https://dev.to/orfactor/orfactor-software-engineered-to-simplify-complexity-31od</guid>
      <description>&lt;p&gt;Most software agencies say they build "solutions." We build software that has to actually run — for logistics companies moving freight, event organizers checking in guests, and businesses that don't have room for a platform that breaks on launch day.&lt;/p&gt;

&lt;p&gt;OrFactor has been doing this out of Dhaka since 2014, with team members now working across Bangladesh, the US, and Malaysia. We're not a 500-person consultancy, and we're not a two-person freelance shop either — we're a working engineering team of 10–49 people who take on the projects big firms consider too small and freelancers can't scale to handle.&lt;/p&gt;

&lt;p&gt;What we actually do&lt;/p&gt;

&lt;p&gt;We work across six areas, and most client projects touch more than one of them:&lt;/p&gt;

&lt;p&gt;App &amp;amp; Platform Development — the core of what we do. Web and mobile applications built from scratch: SaaS platforms, e-commerce systems, fintech tools, healthcare apps. This is where most of our documented client work lives, including a logistics management platform for Bifle Logistics and an event management build for Ke-Fas Event.&lt;/p&gt;

&lt;p&gt;Product Experience Design — UX/UI work that isn't bolted on after the fact. We design the interface alongside the system it runs on, which is part of why clients keep telling us the product actually feels usable, not just functional.&lt;/p&gt;

&lt;p&gt;AI &amp;amp; Automation — LLM integration, predictive tooling, workflow automation. This is a newer, growing part of our practice — we're upfront that it doesn't have the multi-year track record our core development work does yet.&lt;/p&gt;

&lt;p&gt;Managed Tech Services — ongoing DevOps, cloud operations, and system support for teams that need a technical partner after launch, not just at launch.&lt;/p&gt;

&lt;p&gt;Tech Strategy &amp;amp; Advisory — architecture, cloud readiness, and security consulting for teams that need a second set of senior technical eyes before they commit to a direction.&lt;/p&gt;

&lt;p&gt;Data Intelligence — data pipelines, dashboards, and analytics built into the platforms we ship, for teams that want their software to tell them something, not just run.&lt;/p&gt;

&lt;p&gt;Beyond custom builds&lt;/p&gt;

&lt;p&gt;We also maintain a small catalog of ready-made software products — things like EventIQ (event check-in and ticketing), Stoqio (inventory management), and Inflio (a template for influencer/creator platforms) — sold directly rather than built bespoke. For teams that don't need a fully custom build, these get you running in days instead of months. And if you outgrow the template, that's usually where a custom engagement with us starts.&lt;/p&gt;

&lt;p&gt;Why this matters more than a client logo wall&lt;/p&gt;

&lt;p&gt;Software agencies are easy to find and hard to trust — everyone claims quality, speed, and communication. What we'd rather you judge us on: a 5.0 rating across our completed engagements, and a habit of clients coming back for the next project. That's a smaller claim than "we're the best," but it's one you can actually verify.&lt;/p&gt;

&lt;p&gt;If you're evaluating a technical partner for a build that has to work under real usage — not a demo, not a pitch deck — that's the kind of work we take on.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftsjxl6inl67o3rjjn9c4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftsjxl6inl67o3rjjn9c4.png" alt=" " width="800" height="351"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0nbqzd6edic11ucongq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0nbqzd6edic11ucongq.png" alt=" " width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>devops</category>
      <category>softwaredevelopment</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
