# Huzaifa Saif-ur-Rehman — Full Content > Huzaifa Saif-ur-Rehman is a staff software engineer specializing in Laravel, PHP, JavaScript, DevOps, SaaS architecture, and API integrations. ## About Huzaifa Saif-ur-Rehman Huzaifa Saif-ur-Rehman is a staff software engineer from Pakistan with 15 years of professional experience in PHP, Laravel, JavaScript, and Node.js. He has collaborated with international clients from the USA, India, Dubai, France, Australia, and Canada across industries including Traveling, Education, Logistics, and Import/Export. Certifications and Recognition: - JSNAD: OpenJS Certified Node.js Application Developer — OpenJS Foundation - LFW211: Node.js Application Development — The Linux Foundation (LiFT Scholarship recipient) - Laravel Live Pakistan 2024 Speaker — presented on Laravel Telescope Guzzle Watcher and Laravel Pulse Guzzle Recorder - Full Stack Laracasts Laravel Architect Open Source: - Laravel Telescope Guzzle Watcher: Top 9 Laravel package of 2023, 270K+ downloads - Laravel Pulse Guzzle Recorder: Monitors Guzzle HTTP calls in Laravel Pulse dashboard Contact: info@muhammadhuzaifa.pro LinkedIn: https://www.linkedin.com/in/mhuzaifacs/ GitHub: https://github.com/huzaifaarain ## Services ### Full Stack Development URL: https://muhammadhuzaifa.pro/full-stack-development LAMP Stack: Linux, Apache, MySQL, PHP TALL Stack: Tailwind CSS, Alpine.js, Laravel, Livewire VILT Stack: Vue.js, Inertia.js, Laravel, Tailwind CSS RILT Stack: React.js, Inertia.js, Laravel, Tailwind CSS ### DevOps Services URL: https://muhammadhuzaifa.pro/devops-services Linux server setup (Ubuntu, Debian, CentOS), Docker, Nginx, Apache, CI/CD (GitHub Actions, GitLab), AWS, Google Cloud, DigitalOcean. ### API & Data Integrations URL: https://muhammadhuzaifa.pro/integrations HubSpot, Salesforce, SAP Business ByDesign, SAP Business One, Oracle NetSuite, Stripe, PayPal, Braintree, GraphQL. ## Portfolio ### Marketplace SaaS Platform With Stripe Connect URL: https://muhammadhuzaifa.pro/portfolio/marketplace-saas-platform-with-stripe-connect Category: Full-Stack Tech: Laravel, PostgreSQL, Livewire, Stripe Connect, HubSpot, S3, Laravel Pennant Led development on a Laravel marketplace SaaS platform connecting service providers with customers through Stripe Connect payments, HubSpot CRM workflows, rich content, and role-based access. The platform used Laravel, PostgreSQL, Livewire, Tailwind CSS, Alpine.js, Laravel Cashier, Stripe Connect, HubSpot, S3, Spatie Media Library, Postmark, Laravel Pennant, Pulse, Telescope, and queue monitoring. Implemented modular boundaries for payments, CRM synchronization, jobs, and user management while supporting provider onboarding, platform fees, payouts, feature flags, audit trails, and production observability. ### Best Price Market Ecommerce Marketplace URL: https://muhammadhuzaifa.pro/portfolio/best-price-market-ecommerce-marketplace Client: Best Price Market Category: Full-Stack Tech: Laravel, Livewire, Ecommerce, Inertia.js, Vue 3, SEO, Payments Built a full-featured Laravel ecommerce marketplace with product variants, inventory, cart, checkout, orders, shipping carriers, discounts, multi-currency support, rich content, and SEO-focused publishing. The domain model uses polymorphic products, categories, posts, and custom fields, with typed Spatie Data DTOs, generated TypeScript types, Livewire cart and checkout components, Inertia/Vue pages, and admin dashboards. The platform integrates Zen payments, persistent carts, RSS feeds, XML sitemaps, schema.org structured data, breadcrumbs, Open Graph metadata, media handling, GeoIP, reCAPTCHA, and queue monitoring. ### GZPCHS Housing Society Management System URL: https://muhammadhuzaifa.pro/portfolio/gzpchs-housing-society-management-system Client: Gulshan-e-Zeal Pak Cooperative Housing Society Category: Full-Stack Tech: Laravel, Inertia.js, Vue 3, Tailwind CSS, MySQL, PDF, Excel Built a comprehensive property management system for Gulshan-e-Zeal Pak Cooperative Housing Society covering plots, blocks, shops, bookings, vouchers, allotment letters, announcements, reporting, and user management. The application includes automated monthly revenue voucher generation, ledger reporting, executive dashboard metrics, data entry analytics, audit trails, document management, role-based access, backups, PDF generation, and Excel exports. The current version uses Laravel, MySQL, Inertia.js, Vue 3, Tailwind CSS, ApexCharts, Vite, Spatie settings, activity logs, media library, and permissions. ### GEL Virtual Mailbox & Logistics Platform URL: https://muhammadhuzaifa.pro/portfolio/gel-virtual-mailbox-logistics-platform Client: Global Express Limited Category: Full-Stack Tech: Laravel, MySQL, PHP, Stripe, Vue.js, Logistics, DataTables Built and maintained a Laravel-based shipping and logistics platform for Global Express Limited, supporting virtual mailbox operations, packages, freight rates, agents, invoices, jobs, and customer workflows. The system serves a complex operational domain with Stripe billing, package barcode generation, role-based access, package media attachments, internal ticketing, notifications, Excel exports, and admin-heavy DataTables interfaces. The architecture uses service and repository layers, package lifecycle observers, queue jobs, Laravel Cashier, Telescope, Vue 2, Bootstrap, Sass, and MySQL. ### HubSpot & Oracle NetSuite Bidirectional Sync URL: https://muhammadhuzaifa.pro/portfolio/hubspot-oracle-netsuite-bidirectional-sync Category: Integration Tech: Laravel, HubSpot, Oracle NetSuite, SOAP API, REST API, Queues, Data Sync Built a Laravel integration synchronizing HubSpot contacts and companies with Oracle NetSuite customers, while pushing NetSuite sales orders back into HubSpot deals. Handled bidirectional sync concerns including ID mapping, field transformations, retry handling, partial failures, webhook loop prevention, and operational visibility for reprocessing failed records. The implementation used Laravel, HubSpot APIs, Oracle NetSuite REST and SuiteTalk SOAP APIs, queues, scheduled jobs, Guzzle observability, DataTables, Bootstrap, and MySQL. ### HubSpot & SAP Business One Integration URL: https://muhammadhuzaifa.pro/portfolio/hubspot-sap-business-one-integration Category: Integration Tech: Laravel, HubSpot, Data Sync, SAP Business One, ERP Integration, Modules Built a Laravel integration moving customer, contact, and order data from HubSpot into SAP Business One with clean module boundaries around source, target, and orchestration logic. Mapped nested contact structures, preserved ordering dependencies between company and contact records, and handled partial failures without blocking the wider synchronization flow. The stack included Laravel modules, HubSpot APIs, SAP Business One APIs, Telescope, outbound HTTP request monitoring, DataTables, Bootstrap, settings management, and MySQL. ### Bidirectional HubSpot/NetSuite Integration URL: https://muhammadhuzaifa.pro/portfolio/bidirectional-hubspotnetsuite-integration Client: Australian shelter industry client Category: Integration Project: https://www.upwork.com/freelancers/mhuzaifacs Tech: Laravel, HubSpot, MySQL, PHP, SOAP API, Queues, NetSuite Built a bidirectional HubSpot and NetSuite integration for Australia's shelter industry using Laravel, PHP, MySQL, queues, scheduler commands, and a service-layer architecture. The system synchronizes contacts and companies in both directions, sends NetSuite sales orders into HubSpot, and keeps marketing data current through automated queue jobs and scheduled Artisan commands. NetSuite communication used SOAP/WSDL and API-user authentication, while HubSpot communication used a private app. The admin interface used Alpine.js, Livewire, and Tailwind CSS for monitoring and control. ### Laravel HubSpot & Childcare Management Integration URL: https://muhammadhuzaifa.pro/portfolio/laravel-hubspot-childcare-management-integration Client: Australian childcare provider Category: Integration Project: https://www.upwork.com/freelancers/mhuzaifacs Tech: Laravel, Livewire, HubSpot, Tailwind CSS, Queues, API Integration, Scheduler Developed and deployed a Laravel integration between HubSpot and a custom childcare management system for an Australian client. The solution synchronizes campuses, children, parents, family trees, enrollments, and bookings into HubSpot so the client can run more accurate marketing automation. The implementation used Laravel queues, scheduled Artisan commands, service classes, HubSpot private app authentication, basic authentication for the childcare system, and a Livewire/Tailwind interface. ### Integrated Custom Payment Gateway URL: https://muhammadhuzaifa.pro/portfolio/integrated-custom-payment-gateway Client: E-commerce client Category: Integration Project: https://www.upwork.com/freelancers/mhuzaifacs Tech: Laravel, MySQL, PHP, API Integration, Payment Gateway, Laravel Nova Built a ZEN.COM payment gateway integration for a Laravel e-commerce checkout running on Laravel Nova. Created the payment service responsible for communicating with the ZEN.COM Payment API and wired it into the checkout flow so customer payments could be handled inside the existing Laravel application. ### Laravel Passport OAuth 2.0 Server & Client URL: https://muhammadhuzaifa.pro/portfolio/laravel-passport-oauth-20-server-client Category: Full-Stack Project: https://www.upwork.com/freelancers/mhuzaifacs Tech: Laravel, MySQL, OAuth 2.0, Laravel Passport, Docker, API Created a Docker-based Laravel Passport example showing both an OAuth 2.0 server and a consuming client application. The setup includes PHP-FPM containers for the server and client, MySQL, Nginx, and phpMyAdmin, giving developers a complete reference implementation for issuing and consuming OAuth tokens in Laravel. ### Tombstone Orders Laravel Application API URL: https://muhammadhuzaifa.pro/portfolio/tombstone-orders-laravel-application-api Category: Full-Stack Project: https://www.upwork.com/freelancers/mhuzaifacs Tech: Laravel, MySQL, PHP, Docker, API, Testing Built a Laravel API for managing tombstone orders and related catalog data. The implementation included migrations, models, seeders, resource controllers, and unit coverage for orders, tombstones, fonts, text colors, and icons. ### HubSpot, Ostendo & Mindbody Integration URL: https://muhammadhuzaifa.pro/portfolio/hubspot-ostendo-mindbody-integration Category: Integration Tech: Laravel, HubSpot, Queues, Ostendo, Mindbody, AWS, CSV Built a Laravel integration across HubSpot, Ostendo, and Mindbody, combining API synchronization with CSV import and export workflows for bulk data movement. Created service-layer boundaries for HubSpot and Ostendo, controller flows for operational actions, and queue-backed processing for long-running or failure-prone integration work. The implementation used Laravel, HubSpot APIs, Ostendo APIs, Mindbody data flows, AWS SDK, League CSV, Sanctum, Bootstrap, log viewing, and database queues. ### Funraisin to HubSpot Fundraising Sync URL: https://muhammadhuzaifa.pro/portfolio/funraisin-to-hubspot-fundraising-sync Category: Integration Tech: Laravel, HubSpot, DataTables, Funraisin, CRM Integration, Monitoring Built a Laravel synchronization layer that moved fundraising platform data into HubSpot contacts and deals for CRM automation and reporting. Implemented scheduled sync workflows, API client services, operational dashboards, log visibility, authentication, and HTTP request monitoring for production support. The stack included Laravel, HubSpot APIs, Funraisin data flows, Telescope, outbound request monitoring, Sanctum, DataTables, Bootstrap, jQuery, Sass, and MySQL. ### PowerPay Payment Processing Integration URL: https://muhammadhuzaifa.pro/portfolio/powerpay-payment-processing-integration Category: Integration Tech: Laravel, HubSpot, Inertia.js, Payments, PowerPay, Rollbar Built a Laravel payment-processing integration using a modern Inertia.js and Jetstream frontend with production error tracking and API-driven workflows. Integrated PowerPay flows with HubSpot-related business processes, JavaScript route generation, Sanctum authentication, and operational monitoring for failed payment or API interactions. The stack included Laravel, Inertia.js, Jetstream, HubSpot APIs, PowerPay, Rollbar, Doctrine DBAL, Ziggy, Sanctum, PHP, and MySQL. ### Paycom & Zuper Field Operations Integration URL: https://muhammadhuzaifa.pro/portfolio/paycom-zuper-field-operations-integration Category: Integration Tech: Laravel, Livewire, Tailwind CSS, Paycom, Zuper, Flux, Spatie Data Built a Laravel integration between Paycom and Zuper for synchronizing HR, payroll, and field service operations data through modular service boundaries. Used modern Laravel application structure with separate modules for each platform, typed data objects, Fortify authentication, Livewire Flux interfaces, Tailwind CSS, and Vite. The implementation focused on maintainable platform adapters, clear data transfer objects, authenticated admin workflows, and reliable synchronization between operational systems. ### Laravel Telescope Guzzle Watcher URL: https://muhammadhuzaifa.pro/portfolio/laravel-telescope-guzzle-watcher Client: Open source Category: Open Source Project: https://github.com/huzaifaarain/telescope-guzzle-watcher Tech: Laravel, API, Telescope, Guzzle, Open Source, Observability Open-source Laravel package for observing outbound HTTP requests made through guzzlehttp/guzzle inside Laravel Telescope. The package uses Guzzle's on_stats request option to capture request timing and details, giving Laravel teams better visibility into API integrations. The package has crossed 270K+ downloads according to the site settings. ### Laravel Pulse Guzzle Recorder URL: https://muhammadhuzaifa.pro/portfolio/laravel-pulse-guzzle-recorder Client: Open source Category: Open Source Project: https://github.com/huzaifaarain/laravel-pulse-guzzle-recorder Tech: Laravel, API, Guzzle, Open Source, Observability, Pulse Open-source Laravel package for recording outbound Guzzle HTTP calls in Laravel Pulse. The recorder helps teams inspect slow or high-volume API calls from the Pulse dashboard, making API-heavy Laravel applications easier to monitor in production. ## Blog Posts ### Your Hiring Pipeline Is Measuring Ghosts URL: https://muhammadhuzaifa.pro/your-hiring-pipeline-is-measuring-ghosts Published: 2026-06-24 There is a new problem showing up in engineering hiring pipelines, and it is one we built ourselves. Tom MacWright calls it "accidental anonymity." Candidates submit LLM-written resumes, link to LLM-generated portfolio sites, which point to LLM-generated GitHub projects with LLM-generated commit messages. Every artifact is polished, coherent, and completely impersonal. You learn nothing about the person behind them. The resume hits every keyword. The portfolio looks professional. The GitHub has green squares. But there is no signal -- no evidence of how this person thinks through a tradeoff, debugs something unfamiliar, or makes an architectural call when the path is unclear. The LLM filled every gap with plausible competence. Now every candidate looks the same. This is not a candidate quality problem. It is a signal problem. For years we trained hiring pipelines to scan for polished artifacts -- resumes with the right keywords, portfolios with clean projects, contribution graphs. Those were always proxies. The LLM just exposed how weak they were. The fix is not AI detection. It is designing interviews that measure what LLMs cannot fake. A live debugging session on an unfamiliar codebase. A 30-minute architecture discussion where you change the constraints three times. A judgment call on which part of a system to optimize and which to leave alone. If your top-of-funnel screening can be passed by a candidate who never touches a keyboard, your hiring pipeline is measuring the wrong thing. ### Your Model Vendor Is a Geopolitical Risk URL: https://muhammadhuzaifa.pro/your-model-vendor-is-a-geopolitical-risk Published: 2026-06-24 Last updated: 2026-06-23 The US government just shut down Anthropic's Fable 5 and Mythos models via export controls, three days after Fable 5's public release. Amazon's CEO reportedly triggered the crackdown. Anthropic cut access entirely to comply. The fallout is reshaping the model supply chain. French politicians are calling it a wake-up call for European AI sovereignty. But the real shift is toward Chinese models. Zhipu's GLM-5.2 just debuted at #4 on the global LLM leaderboard at $1.73 per million tokens -- cheaper than nearly every Western frontier model, with no export controls and no access revocations. For engineering leads, the lesson is clear: model supply chain risk is not theoretical. If your production AI features are hard-coupled to a single US provider subject to export controls, your architecture has a single point of failure that is geopolitical, not technical. Multi-provider routing and open-weight fallbacks are now infrastructure resilience, not cost optimization. The deeper irony: cybersecurity experts published an open letter arguing the shutdown makes the US less safe. Restricting access to Anthropic's models while Chinese alternatives remain freely available does not reduce attack surface. It shifts market share -- and the defenders lose access while adversaries do not. This is an architecture decision with a clock on it. ### Agent Evaluation: Why Tool Traces and Verification Matter URL: https://muhammadhuzaifa.pro/agent-evaluation-why-tool-traces-and-verification-matter Published: 2026-06-22 Last updated: 2026-06-21 Long-context agent evaluation is a different problem from judging one clean final answer. The useful framing from Agent Judge is that production agents should be evaluated on the work they did across the whole trajectory, not only the last response. A normal LLM judge can miss the parts that determine whether an agent is reliable: did it search the right places, did it verify state after taking an action, and did it adjust when feedback changed the rubric? A few takeaways I would keep in mind when building or reviewing agentic systems: 1. Search quality matters. An agent that answers confidently without looking in the right systems is not production-ready. 2. Verification should be explicit. If the agent changes state in a real system, the eval should check whether it confirmed the result. 3. Rubrics need to evolve from feedback. Static evals help, but harder scenarios need criteria that reflect real failure modes. For production workflows, evidence should be part of the evaluation contract. That feels especially relevant for teams moving from demos to agents that touch real customer data, tickets, inboxes, billing, or deployments. What do you currently trust more for agent evals: final answer quality, tool trace review, or outcome verification? ### Observability for AI Agents: Why Your Traces Need to Become an API URL: https://muhammadhuzaifa.pro/observability-for-ai-agents-why-your-traces-need-to-become-an-api Published: 2026-06-20 Last updated: 2026-06-19 The more agentic systems we build, the more I think observability needs a small shift in mindset. For years, metrics, logs, and traces were designed around a human workflow: something breaks, an engineer opens a dashboard, scans the logs, jumps through traces, and builds a mental model of what happened. That model still matters. But LLMs and agents are starting to consume the same operational data directly. In that world, traces may become less of a debugging artifact and more of an interface. A few takeaways I liked from this angle: 1. Traces are probably the most useful entry point for agents because they preserve flow, timing, causality, and context. 2. Trace schemas should be treated like APIs. If agents depend on them, they need stable names, clear meanings, versioning, and documentation. 3. Human-readable observability is not enough. Machine-readable observability needs predictable structure, not clever labels and inconsistent conventions. 4. This applies beyond infra teams. Laravel apps, queues, jobs, webhooks, payments, and third-party integrations all benefit when traces explain intent, state, and failure context clearly. If an agent is going to help debug production, the trace is part of the contract. ### judging at nasa space apps challenge in hyderabad URL: https://muhammadhuzaifa.pro/judging-at-nasa-space-apps-challenge-in-hyderabad Published: 2025-10-10 # Judging at NASA Space Apps Challenge in Hyderabad Hyderabad hosted its first NASA Space Apps Challenge, and I was formally invited as a local judge to evaluate projects from an engineering perspective. Over two intense days, student teams built prototypes, explored Machine Learning algorithms, and learned how to integrate LLMs' APIs. I was joined by respected academics, and we saw thoughtful work from universities as well as two standout college teams. I guided one AI-heavy team on balancing prompt use with strong computer science fundamentals, at the same time I also applauded their efforts. The event was organized, managed and run by an undergraduate core team from [Mehran University of Engineering and Technology](https://sw.muet.edu.pk/index.php), and [Hyderabad Institute for Technology and Management Sciences](https://hitms.edu.pk/), hosted by [Iqra University Hyderabad Campus](https://iqra.edu.pk/campus/hyderabad-campus/), and supported by different sponsors. ## College Teams Two memorable teams came from colleges rather than universities, which is rare in a second tier city here. Students from two different colleges studied hard and finished their challenges. One team leaned heavily on AI and solved most tasks through prompt engineering while not knowing what prompt engineering is. When I asked them to explain their solution for the given challenge, they struggled, so I guided them on why strong computer science basics should come first and how AI can be used responsibly. The room also had undergrads from several universities and a few early stage AI founders. The overall spirit was practical and focused. ## What is [NASA International Space Apps Challenge](https://spaceappschallenge.org) NASA International Space Apps Challenge is a worldwide hackathon where people use open data from NASA and partner agencies to make ideas that help life on Earth and in space. Local events happen in many cities and connect to a global community that learns, builds, and shares together. The challenge themes usually cover Earth observation, climate and weather, remote sensing, data visualization, and education tools. The learning outcomes are valuable for any student or early professional: teamwork, data literacy, reading documentation, rapid prototyping, and clear storytelling. People also learn to clean and interpret datasets and explain technical choices in simple language. ## Project highlights and tech stacks We had more than 100 participants across around 20 teams. All of the solutions were web based, frontends used HTML, CSS, JavaScript, and React, and TailwindCSS. backends were in Node.js or Python. Some teams tried Machine Learning and Deep Learning algorithms. A few integrated large language models through API integrations. The range of solutions showed careful research, fast prototyping, and sensible trade offs for a weekend sprint. ## My judging experience and the panel I was invited to judge the engineering side of projects. I enjoyed the company of [Dr Amjad Ali Syed](https://www.linkedin.com/in/dr-amjad-ali-syed-3482b032/), Associate Professor at [MUET](https://site.muet.edu.pk/departments/biomedical-engineering), along with [Dr Mehwish Jawaid](https://www.linkedin.com/in/mehwish-jaweed-0664bb206/) from [SZABIST](https://hyd.szabist.edu.pk/), and [Noorulain Mushtaq](https://www.linkedin.com/in/noorulain-mushtaq-004036185/), also from MUET with a background in Data Science. It was a pleasure to learn from their academic perspective while sharing my industry view. I felt honored to be among such talented and experienced people. ## Shoutout to the organizing team The event was planned by an undergraduate core team from [Mehran University of Engineering and Technology](https://sw.muet.edu.pk/index.php), and [Hyderabad Institute for Technology and Management Sciences](https://hitms.edu.pk/). They handled real pressure and still delivered a smooth experience for participants and judges. Special thanks to: * [Haziq ul Khair](https://www.linkedin.com/in/muhammad-haziqul-khair/) (Local Lead - MUET), * [Abdullah Ali](https://www.linkedin.com/in/abdullah-ali-2k4/) (Co Lead External Affairs - MUET), * Esha Salam (Co Lead External Affairs - MUET), * [Ibad Hussain](https://www.linkedin.com/in/ibad-hussain-5b9608356/) (Co Lead Internal Affairs- HITMS), * [Bushra Laraib](https://www.linkedin.com/in/bushra-laraib-2795982aa/) (Co Lead Internal Affairs - MUET), and * [Muhammad Faisal](https://www.linkedin.com/in/muhammad-faisal-70482427a/) (Operations Lead - MUET). Thank you for the invitation and for trusting me as a judge. ## Appreciation for sponsors and hosts I also appreciate the support from [Iqra University Hyderabad Campus](https://iqra.edu.pk/campus/hyderabad-campus/) for the venue and on ground help and all the sponsors. Your support made this first edition possible. ## A note to the local software industry One thing made me a bit sad. I did not see sponsors or attendees from the local software industry. These events are ideal places for academia and industry to meet, mentor, and build a talent pipeline. After speaking with the core team, I learned they did not formally reach out to many companies, which is understandable for a first time effort. For the next edition, I suggest early, formal invitations to leading Hyderabad tech firms. I also invite companies to show up, sponsor, and mentor. The impact will multiply when both sides participate. Hyderabad’s first NASA Space Apps showed what students can do with open data, mentorship, and a shared mission. I plan to support future editions, help connect local companies, and keep mentoring teams so our city grows its presence on the global Space Apps map. If you are a student, join next year. If you are in industry or academia, get involved. Let us build this together. ### pakistan software export board (pseb): a practical guide for pakistan’s tech community URL: https://muhammadhuzaifa.pro/pakistan-software-export-board-pseb-a-practical-guide-for-pakistans-tech-community Published: 2025-09-04 Last updated: 2025-09-03 # Pakistan Software Export Board (PSEB): A Practical Guide For Pakistan’s Tech Community ## The problem we face If you build software in Pakistan, you quickly find the same roadblocks. Getting international clients is hard, credibility takes time, taxes and compliance feel confusing, and the cost of good office space and reliable connectivity can drain your budget. Many founders, freelancers, and even mid-size firms have the talent, yet struggle with visibility, certifications, and access to global events and buyers. ## The solution PSEB offers The Pakistan Software Export Board exists to reduce these barriers. In simple words, PSEB helps you look bigger than you are by backing you with government recognition, training, export facilitation, and introductions to international markets. It supports the full life cycle of an IT business in Pakistan, from the first step of registration to showcasing your work on global stages. ## How PSEB came into being and how it is governed PSEB was set up in the mid-1990s when the government saw the need for a dedicated body to grow software and IT-enabled services. It is a government-owned company that works under the Ministry of Information Technology and Telecommunication (MoITT). PSEB is guided by a board that brings the public and private sectors together, which keeps programs practical and aligned with industry needs. The goal is straightforward. Help Pakistani IT talent compete globally, increase exports, and create skilled jobs at home. ## What PSEB actually does Think of PSEB as a one-stop partner for the IT industry in Pakistan. * Builds and manages Software Technology Parks with IT-enabled office space * Runs training and internship programs to improve skills and create a hiring pipeline * Helps companies get quality certifications and compliance support * Markets Pakistani IT companies abroad and supports trade show participation * Maintains directories and does buyer matchmaking to connect you with clients * Provides facilitation on policies, registrations, and regulatory matters * Supports call centers and other IT-enabled services with required compliances ## Who should join * Software houses and product companies * IT service providers and consultancies * Startups and scaleups in software or IT-enabled services * Freelancers and small teams exporting IT services * Call centers and BPOs If you build, sell, or export IT products or services from Pakistan, membership is relevant. ## How to become a PSEB member You can apply online. The process is simple and usually quick if your documents are ready. ### Step-by-step 1. **Confirm eligibility** You are an IT or IT-enabled services company, startup, or freelancer operating in Pakistan. 2. **Prepare documents** * For companies: NTN, incorporation certificate, basic company profile, directors’ CNICs, business bank account details * For freelancers: CNIC, bank account details, basic service profile or portfolio 3. **Create an account on the PSEB portal** Choose the correct category, fill in your details, and verify your email. 4. **Complete the application** Provide accurate company or freelancer information, upload documents, and review. 5. **Pay the applicable fee** The portal explains payment methods. Keep the receipt or upload the proof as required. 6. **Approval and certificate** After verification, you receive your PSEB registration certificate. You can then access member benefits. ### Common tips * Keep your company description clear and simple * Make sure names and numbers match your official documents * If you export, maintain basic records of export proceeds for future benefits ## What you get in return Below is a quick snapshot. Details and availability can vary with programs, but this covers the core value. | Benefit | What it means in practice | Who gains most | | -------------------------- | ------------------------------------------------------------------------------ | ----------------------------------------- | | Government recognition | A formal certificate that builds trust with clients and partners | Startups, SMEs, freelancers | | Marketing and visibility | Listing in directories, support for global events and delegations | Firms seeking international clients | | Matchmaking and leads | Introductions to buyers, investors, and partners | Product and service companies | | Training and internships | Subsidized upskilling and a pipeline of interns who often convert to full-time | Growing teams that need talent | | Certifications support | Help with quality standards and audits to win enterprise clients | Companies selling to regulated industries | | Tech parks and facilities | IT-enabled office space with reliable connectivity and services | Teams that want to scale professionally | | Policy and compliance help | Guidance on registrations, exports, and special cases like call centers | New and expanding businesses | In my view, this combination of credibility, exposure, and enablement is the key reason membership pays back quickly for serious IT businesses. ## Real examples and use cases * **Startup to first export client** A three-person web agency registered with PSEB, used the member listing to showcase credibility, and secured its first export contract after being discovered by a Middle East buyer who was specifically searching for Pakistani partners. * **Product company entering trade shows** A SaaS startup qualified for subsidized participation in a regional tech expo. That single event produced pilot deals with two distributors and a reseller agreement, which would have been costly to achieve alone. * **Hiring pipeline through internships** A mid-size services firm hosted PSEB-supported interns in data engineering and QA. Three interns converted to full-time roles after six months, lowering hiring risk and onboarding time. * **Quality certifications to unlock enterprise sales** A software house needed formal quality credentials to bid for a telecom project. With PSEB’s support and guidance, the team completed the certification path and closed the deal. These are the typical outcomes I see. The pattern is consistent. Recognition brings trust, trust opens doors, and doors bring revenue. ## Frequently asked questions **Is PSEB only for big companies** No. Freelancers, small teams, and early startups can all register. Many benefits are designed for early-stage growth. **Do I need to be export-ready before joining** Joining early helps. The recognition and training can prepare you for exports and make your first deal easier. **What if I work remotely for foreign clients as a solo freelancer** Registering still helps with credibility, simple compliance, and smoother banking for export proceeds. **Is membership useful if I already have clients** Yes. International marketing, certification support, and matchmaking can help you move up the value chain. ## Final thoughts Pakistan has the talent. What we often need is structure, trust, and global reach. PSEB gives you that support. If you are building a serious IT career or business in Pakistan, I strongly recommend registering. It is a practical way to reduce friction, improve credibility, and grow faster with support that is aligned with how our industry actually works. ### dijkstra vs the new deterministic sssp algorithm: easy guide, php examples, and visuals URL: https://muhammadhuzaifa.pro/dijkstra-vs-the-new-deterministic-sssp-algorithm-easy-guide-php-examples-and-visuals Published: 2025-08-18 ## TL;DR * Dijkstra’s algorithm is the classic way to compute shortest paths with non-negative weights, running in about O(m + n log n). * A 2025 result gives a **deterministic** SSSP for **directed** graphs that runs in **O(m · (log n)^(2/3))** in the comparison-addition model. It beats the long-standing n log n “sorting barrier” on sparse graphs. * Big idea in plain words: instead of strictly sorting by distance at every step like Dijkstra, the new method processes nodes in smart **batches** using bounded multi-source relaxations and a reduced **frontier** of pivots. --- # The problem in one minute Single-Source Shortest Path (SSSP) asks: given a source node, what is the minimum distance to every other node in a weighted graph. Classic answer: **Dijkstra’s algorithm** for non-negative weights. It repeatedly picks the closest unfinished node, then relaxes its outgoing edges. That “pick the closest” step creates a sorting-like cost of about log n per operation, which is why the total time has the n log n behavior. Researchers showed a new **deterministic** way that reduces the dependency on sorting by exploring nodes in **layers** and shrinking the active **frontier** so heavy work applies only to a small subset. This changes the asymptotic behavior to **O(m · (log n)^(2/3))**. --- # Visuals to anchor the intuition ### 1) Growth trend: n·log n vs n·(log n)^(2/3) ![Asymptotic growth comparison](https://muhammadhuzaifa.pro/storage/photos/1/sssp_growth.webp) What you see: both grow with n, but n·(log n)^(2/3) grows a bit slower than n·log n. For huge graphs, that gap matters. ### 2) What changes operationally Left: Dijkstra picks exactly the closest next node each step. Right: the new mindset processes a **batch frontier** and runs a few **k-hop relaxations**, then moves the frontier forward. ![Frontier schematic](https://muhammadhuzaifa.pro/storage/photos/1/frontier_schematic.webp) ### 3) Tiny graph we will use in code ![Sample directed graph](https://muhammadhuzaifa.pro/storage/photos/1/sample_graph.webp) Edges: A→B(2), A→C(2), B→C(1), B→D(3), C→D(2), C→E(3), D→E(1) Expected distances from A: A 0, B 2, C 2, D 4, E 5 --- # Practical example 1: Dijkstra in PHP This is a clean, didactic version. It uses a simple linear scan for the minimum to keep it readable. For production, use a binary heap or Fibonacci heap. ```php // Dijkstra's Algorithm — simple, highly commented version $graph = [ 'A' => ['B' => 2, 'C' => 2], 'B' => ['C' => 1, 'D' => 3], 'C' => ['D' => 2, 'E' => 3], 'D' => ['E' => 1], 'E' => [] ]; $source = 'A'; $INF = 1_000_000; // 1) Distance init $dist = []; foreach ($graph as $node => $_) $dist[$node] = $INF; $dist[$source] = 0; // 2) Finalized set $visited = []; // 3) Repeatedly extract the closest unvisited node and relax edges while (count($visited) < count($graph)) { // extract-min $minNode = null; $minDist = $INF; foreach ($dist as $node => $d) { if (!isset($visited[$node]) && $d < $minDist) { $minDist = $d; $minNode = $node; } } if ($minNode === null) break; // no more reachable nodes // finalize $visited[$minNode] = true; // relax neighbors foreach ($graph[$minNode] as $nbr => $w) { if (!isset($visited[$nbr])) { $alt = $dist[$minNode] + $w; if ($alt < $dist[$nbr]) $dist[$nbr] = $alt; } } } // 4) Print echo "Dijkstra distances from $source:\n"; foreach ($dist as $node => $d) echo "$node: $d\n"; ``` **What to notice** * The algorithm always orders the frontier to pick the absolute smallest. * That global ordering is where the log n overhead comes from. --- # Practical example 2: Batch-style deterministic idea in PHP The full research algorithm is involved. The script below captures the **core flavor**: limited-depth relaxations from a **frontier** as a batch, then move the frontier forward. It avoids a global extract-min. It is meant for learning and mirrors the high-level design decisions. ```php // Batch-style multi-source relaxations — educational approximation $graph = [ 'A' => ['B' => 2, 'C' => 2], 'B' => ['C' => 1, 'D' => 3], 'C' => ['D' => 2, 'E' => 3], 'D' => ['E' => 1], 'E' => [] ]; $source = 'A'; $INF = 1_000_000; // Distances $dist = []; foreach ($graph as $node => $_) $dist[$node] = $INF; $dist[$source] = 0; // Limit per batch — think "k-hop" relaxations $k = 2; // Start from the source frontier $frontier = [$source]; $changed = true; while ($changed) { $changed = false; // If frontier is empty but improvements may exist, restart from all nodes if (empty($frontier)) $frontier = array_keys($graph); // Track nodes improved in this batch $touched = []; // Up to k layers from current frontier $wave = $frontier; for ($round = 1; $round $w) { $alt = $dist[$u] + $w; if ($alt < $dist[$v]) { $dist[$v] = $alt; $touched[$v] = true; $nextWave[] = $v; $changed = true; } } } if (empty($nextWave)) break; $wave = $nextWave; } // New frontier only where progress happened $nextFrontier = []; foreach (array_keys($touched) as $u) { foreach ($graph[$u] as $v => $_w) $nextFrontier[$v] = true; } $frontier = array_keys($nextFrontier); } // Print echo "Batch-style distances from $source:\n"; foreach ($dist as $node => $d) echo "$node: $d\n"; ``` **What to notice** * No priority queue. * Work happens in short waves from a reduced frontier, not by a global strict order every step. * This matches the paper’s idea of bounded multi-source relaxations and frontier reduction, without reproducing all the complexity. --- # Why the new idea helps Dijkstra pays a log n cost in selecting the next node because it maintains a full order of candidate distances. The new method avoids that by: 1. grouping work into batches, 2. limiting relaxations to k layers per batch, 3. shrinking the frontier to a small set of pivots before recursing. This breaks the sorting bottleneck and yields **O(m · (log n)^(2/3))** time. --- # Complexity comparison | Algorithm | Works on | Idea in one line | Time complexity | | ---------------------- | ------------------------------ | ------------------------------------------------------------------- | -------------------------------------------- | | Dijkstra | Non-negative weights | Always extract the closest unfinished node, then relax | O(m + n log n) in comparison-addition model | | New deterministic SSSP | Directed, non-negative weights | Batch relaxations from a reduced frontier with recursion and pivots | O(m · (log n)^(2/3)) | **Rule of thumb** * Small or medium graphs: Dijkstra is simple and often fast enough. * Very large directed graphs: the new approach has better asymptotic behavior and is theoretically faster. --- # FAQ **Does the new algorithm replace Dijkstra in everyday code** Not necessarily. Dijkstra is simple and widely available. The new method is deeper and shines at scale. **Can the new idea handle negative weights** The result is for non-negative weights in the comparison-addition model. Negative weights are a different problem with separate lines of research. --- # Final takeaways * Dijkstra remains a practical baseline for non-negative weights. * The 2025 deterministic SSSP shows we can beat the classic n log n barrier by changing how we explore the frontier. It uses bounded multi-source relaxations, a shrunken frontier, and recursion to avoid repeated global sorting. --- If you need an engineer who can translate advanced algorithmic ideas into production-ready systems with clean PHP and JavaScript, integrate complex SaaS APIs like HubSpot or Salesforce, design scalable architectures, and lead teams with DevOps discipline, I would love to help. I have 13+ years of experience across PHP, Laravel, Node.js, MySQL, PostgreSQL, and modern frontend stacks, plus deep integration work with NetSuite, SAP, and Shopify. I build maintainable code, robust pipelines, and clear documentation. **Let us discuss your project**. You can reach me through [my Upwork profile](https://www.upwork.com/freelancers/~01dcc2f82551b47dee). --- ### hacked the laravel artisan route command to enforce route naming conventions URL: https://muhammadhuzaifa.pro/hacked-the-laravel-artisan-route-command-to-enforce-route-naming-conventions Published: 2025-08-06 Last updated: 2025-08-05 Have you ever tried using a piece of functionality from the Laravel framework in a way it’s not supposed to be used? Well, I did. Actually, I tried, and I succeeded. Not long ago, I wrote an article on [architectural testing](https://muhammadhuzaifa.pro/enforcing-clean-controller-design-in-laravel-with-pestphp-architectural-testing) using [PestPHP](https://pestphp.com) and its benefits within the Laravel ecosystem. That article was mostly focused on enforcing clean controller design using architectural testing. This time, I had a different idea. I wanted to validate that every **named route** must follow the **resourceful naming convention**. --- ### What is a Laravel Resource Controller? A **Laravel resource controller** is a convenient way to group typical "CRUD" (Create, Read, Update, Delete) routes behind a single controller class. Laravel automatically assigns standard routes for actions like listing records, showing a single record, storing new entries, updating, and deleting. You don’t need to define each one manually. According to the [Laravel documentation](https://laravel.com/docs/12.x/controllers#resource-controllers), a resource controller maps the following actions: | Verb | URI | Action | Route Name | |------------|---------------------------|---------|------------------| | GET | /photos | index | photos.index | | GET | /photos/create | create | photos.create | | POST | /photos | store | photos.store | | GET | /photos/{photo} | show | photos.show | | GET | /photos/{photo}/edit | edit | photos.edit | | PUT/PATCH | /photos/{photo} | update | photos.update | | DELETE | /photos/{photo} | destroy | photos.destroy | As you can see, the route names end in either `index`, `create`, `store`, `show`, `edit`, `update`, or `destroy`. I wanted to ensure this convention was followed throughout the project. So, I started writing a custom expectation. At first, I used `Illuminate\Support\Facades\Route`, which provides the static method `getRoutes`. ```php // vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php /** * @method static \Illuminate\Routing\RouteCollectionInterface getRoutes() **/ ``` This method returns an instance that implements `RouteCollectionInterface`, which in turn offers another `getRoutes` method: ```php // vendor/laravel/framework/src/Illuminate/Routing/RouteCollectionInterface.php /** * Get all of the routes in the collection. * * @return \Illuminate\Routing\Route[] */ public function getRoutes(); ``` That method returns an array of `\Illuminate\Routing\Route[]`. Once I had that, the rest was simple: traverse the routes, check their names, and if any didn't follow the convention, fail the expectation. It worked like a charm and gave the expected output. I joined all the invalid route names into a string and displayed it to the output stream. However, I wasn't happy, or you could say, I wasn't fully satisfied. I thought: would it be possible to fetch the routes through the Artisan `route:list` command instead? The Artisan command already comes with built-in functionality, which would make my work easier and cleaner. Plus, unlike my initial approach, I wouldn't need to add custom logic for excluding vendor-specific routes or formatting the display output. --- ### Exploring the Artisan Route Command Internals So I started digging into the internals of the `route:list` command and discovered some functions that could help me with my goal: ```php // vendor/laravel/framework/src/Illuminate/Foundation/Console/RouteListCommand.php /** * Determine if the route has been defined outside of the application. * * @param \Illuminate\Routing\Route $route * @return bool */ protected function isVendorRoute(Route $route) { if ($route->action['uses'] instanceof Closure) { $path = (new ReflectionFunction($route->action['uses'])) ->getFileName(); } elseif (is_string($route->action['uses']) && str_contains($route->action['uses'], 'SerializableClosure')) { return false; } elseif (is_string($route->action['uses'])) { if ($this->isFrameworkController($route)) { return false; } $path = (new ReflectionClass($route->getControllerClass())) ->getFileName(); } else { return false; } return str_starts_with($path, base_path('vendor')); } /** * Convert the given routes to regular CLI output. * * @param \Illuminate\Support\Collection $routes * @return array */ protected function forCli($routes) { $routes = $routes->map( fn ($route) => array_merge($route, [ 'action' => $this->formatActionForCli($route), 'method' => $route['method'] == 'GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS' ? 'ANY' : $route['method'], 'uri' => $route['domain'] ? ($route['domain'].'/'.ltrim($route['uri'], '/')) : $route['uri'], ]), ); $maxMethod = mb_strlen($routes->max('method')); $terminalWidth = $this->getTerminalWidth(); $routeCount = $this->determineRouteCountOutput($routes, $terminalWidth); return $routes->map(function ($route) use ($maxMethod, $terminalWidth) { [ 'action' => $action, 'domain' => $domain, 'method' => $method, 'middleware' => $middleware, 'uri' => $uri, ] = $route; $middleware = (new Stringable($middleware))->explode("\n")->filter()->whenNotEmpty( fn ($collection) => $collection->map( fn ($middleware) => sprintf(' %s⇂ %s', str_repeat(' ', $maxMethod), $middleware) ) )->implode("\n"); $spaces = str_repeat(' ', max($maxMethod + 6 - mb_strlen($method), 0)); $dots = str_repeat('.', max( $terminalWidth - mb_strlen($method.$spaces.$uri.$action) - 6 - ($action ? 1 : 0), 0 )); $dots = empty($dots) ? $dots : " $dots"; if ($action && ! $this->output->isVerbose() && mb_strlen($method.$spaces.$uri.$action.$dots) > ($terminalWidth - 6)) { $action = substr($action, 0, $terminalWidth - 7 - mb_strlen($method.$spaces.$uri.$dots)).'…'; } $method = (new Stringable($method))->explode('|')->map( fn ($method) => sprintf('%s', $this->verbColors[$method] ?? 'default', $method), )->implode('|'); return [sprintf( ' %s %s%s%s %s', $method, $spaces, preg_replace('#({[^}]+})#', '$1', $uri), $dots, str_replace(' ', ' › ', $action ?? ''), ), $this->output->isVerbose() && ! empty($middleware) ? "$middleware" : null]; }) ->flatten() ->filter() ->prepend('') ->push('')->push($routeCount)->push('') ->toArray(); } ``` * `isVendorRoute()` excludes vendor-specific routes. * `forCLI()` gives a nicely formatted output, ready for the terminal. Perfect, right? Almost. The problem was, both of these functions are marked as `protected`. --- ### What is `protected` in PHP? The `protected` access modifier in PHP means that the property or method can only be accessed within the class itself or in child classes (subclasses). It’s not accessible from outside the class directly. Here’s a quick example: ```php class Example { protected function greet() { return "Hello from inside!"; } } $ex = new Example(); // This will throw an error echo $ex->greet(); // Fatal error: Uncaught Error ``` As you can see, calling the `greet()` method directly from outside the class won't work. --- As you know, I can’t access anything marked as `protected` directly, and I can’t override the core Artisan command either. But luckily, PHP offers something powerful called `ReflectionClass`. --- ### What is `ReflectionClass` in PHP? `ReflectionClass` is a part of PHP’s Reflection API, which lets you inspect classes, methods, properties, and even invoke methods that are otherwise inaccessible (like protected or private ones). It’s commonly used in testing, debugging, and advanced use cases like this one. Here’s a basic example: ```php class Secret { protected function reveal() { return "Top secret!"; } } $refClass = new ReflectionClass(Secret::class); $method = $refClass->getMethod('reveal'); $method->setAccessible(true); $instance = new Secret(); echo $method->invoke($instance); // Outputs: Top secret! ``` Using this, I was able to tap into the protected methods of the route command and do exactly what I needed, without rewriting or duplicating logic. So by now, you probably get the idea that came to my mind. I used `ReflectionClass`, changed the access modifiers for both of the functions, and used them. And guess what? It worked exactly as I hoped. --- Here’s the final expectation: ```php expect()->extend('toFollowLaravelNamingConvention', function () { /** * @var RouteListCommand $routeListCommand */ $routeListCommandClass = app()->make(RouteListCommand::class); $reflection = new ReflectionClass($routeListCommandClass); $getRoutes = $reflection->getMethod('getRoutes'); $getRoutes->setAccessible(true); $isVendorRoute = $reflection->getMethod('isVendorRoute'); $isVendorRoute->setAccessible(true); $forCLI = $reflection->getMethod('forCLI'); $forCLI->setAccessible(true); $reflection->getProperty('laravel')->setValue($routeListCommandClass, app()); $output = new ConsoleOutput(OutputInterface::VERBOSITY_NORMAL, true); $reflection->getProperty('output')->setValue($routeListCommandClass, $output); $routes = collect(Route::getRoutes()->getRoutes()) // Exclude nameless routes ->filter(fn($route) => $route->getName()) // Exclude vendor specific routes ->filter( fn($route) => !$isVendorRoute ->invoke( $routeListCommandClass, $route ) ) // ensure name ends with allowed suffixes ->filter( function ($route) { $parts = explode('.', $route->getName()); $suffix = end($parts); return !in_array( $suffix, [ 'index', 'create', 'store', 'show', 'edit', 'update', 'destroy', ] ); } ) // transform route object to RouteListCommand compatible array ->map(fn($route) => [ 'domain' => $route->domain(), 'method' => implode('|', $route->methods()), 'uri' => $route->uri(), 'name' => $route->getName(), 'action' => ltrim($route->getActionName(), '\\'), 'middleware' => "", 'vendor' => false, ]); /** * If routes array is not empty, there're some routes not following convention, * fail expectation with developer friendly message. */ if (!$routes->isEmpty()) { test()->fail(implode("\n", array_merge( ["Following routes are not following Laravel resourceful naming conventions"], $forCLI->invoke($routeListCommandClass, $routes) ))); } return true; }); ``` And here’s the assertion output from the expectation. Isn't it marvelous? ![image](https://muhammadhuzaifa.pro/storage/photos/1/hacked-the-laravel-artisan-route-command-to-enforce-route-naming-conventions-assertion-output.webp) --- This approach not only saved me from writing redundant logic but also allowed me to take full advantage of Laravel's built-in features. Sure, it's a bit of a hacky trick, but sometimes bending the rules a little gives you cleaner, more maintainable code. If you found this approach insightful or learned something new about bending Laravel to your will, I’d love to hear your thoughts. This is just one example of how curiosity and a bit of unconventional thinking can help you get the most out of your tools without bloating your codebase. I'm always experimenting with better ways to write clean, maintainable software that fits real-world needs. If you're looking for someone who can bring that kind of mindset to your projects, feel free to check out my [Upwork profile](https://www.upwork.com/freelancers/~01dcc2f82551b47dee) and let’s work together. ### laravel utm tracking: built-in simplicity beats third-party complexity URL: https://muhammadhuzaifa.pro/laravel-utm-tracking-built-in-simplicity-beats-third-party-complexity Published: 2025-08-02 In the open-source world, it's not just a common practice anymore. It's more like a built-in habit. Whenever we need to implement some functionality, we first look around to see if there’s already a tool available. If there is, we review it, and if it meets our needs, we go ahead and use it. This is how things work — whether it’s WordPress with plugins, Drupal with modules, or Laravel with packages. But every now and then, there are tasks that are small and easy to handle on your own. They also give you a chance to stay hands-on. A good example is something I recently did on my personal website: [https://muhammadhuzaifa.pro](https://muhammadhuzaifa.pro). I wanted to forward UTM query string parameters. When a visitor lands on the site with UTM tags, I wanted to track which links they visit during their session, maybe even do more with that data later. Like always, I first looked for an existing package. I found one by Spatie that seemed related. But then I thought, this is such a small task. Why bring in a whole package for it? The package wasn't under active development and didn’t seem fully stable either. That means I’d need to test it thoroughly before using it. Since it was just for my own site, not for a client, I decided it wasn’t worth the effort. I didn’t want to overcomplicate a simple need. I had a few options in mind: 1. I could pass the UTM parameters manually by using the second argument of Laravel’s `route()` helper and fetch them from the request. But doing that for every route? Not practical. 2. I could `bind` a `custom router class` in a `service provider` and override the `route` generation using a `macro`. Definitely possible, but not something I wanted to dive deep into just for this. 3. The simplest solution was to write a `laravel middleware`. It checks for UTM parameters in the query string. If found, it `stores them in the session`. If the URL doesn’t have them but the session does, the middleware rewrites the query and continues. That’s all. No bloat. Works perfectly. The analytics data is clean and useful. ![Laravel Utm Tracking: Built-in Simplicity Beats Third-party Complexity](https://muhammadhuzaifa.pro/storage/photos/1/laravel-utm-tracking-built-in-simplicity-beats-third-party-complexity.webp) Before I wrap up, I want to share a quick note for computer science students. Using ChatGPT is fine. It’s a great help. But if you depend on it for every little thing, you're limiting your growth. Just like how child psychologists say kids should face challenges to learn problem-solving, students need to struggle a bit too. That’s how you build real skill. Try to understand the problem first and attempt a solution before asking GPT. Once you gain some experience, you’ll know when it makes sense to get help and when it’s better to go solo. If you found this post helpful, you might also enjoy two of my write-ups where I dive deeper into Laravel and SEO: [Technical SEO Configurator for Laravel by Honeystone](https://muhammadhuzaifa.pro/technical-seo-configurator-for-laravel-by-honeystone) and [Improve Your Laravel Ecommerce Store Technical SEO Using Butschster\LaravelMetaTags](https://muhammadhuzaifa.pro/improve-your-laravel-ecommerce-store-technical-seo-using-butschsterlaravelmetatags). I share hands-on insights and practical examples in both. And if you're looking for an experienced Laravel developer with a proven Upwork track record, feel free to [check out my Upwork profile](https://www.upwork.com/freelancers/~01dcc2f82551b47dee) and get in touch. Thanks for sticking around till the end. Stay happy, stay blessed. ### my first open source ai contribution: fixing laravel prismphp’s ollama stream bug URL: https://muhammadhuzaifa.pro/my-first-open-source-ai-contribution-fixing-laravel-prismphps-ollama-stream-bug Published: 2025-07-25 Another day, another achievement. I won’t hype it too much, but let’s be real—there’s something incredibly satisfying about seeing your small code contribution go live in a tool used by thousands, if not millions. I don’t usually rely on paid AI services. Instead, I prefer running local LLMs like DeepSeek and LLaMA using [Ollama](https://ollama.com/)—they’re free, fast, and my Dell G-series machine with 6GB GPU + 12-core CPU handles them just fine. Not long ago, I built a Laravel tool for myself using Laravel’s native HTTP client that talks directly with Ollama. While testing, I stumbled across a bug in the [prismphp.com](https://prismphp.com) package—specifically in `Stream.php`. The `system` param was being passed to the `/api/chat` endpoint, which the Ollama spec clearly doesn’t support. What next? My developer instinct kicked in—I jumped into the package source, fixed the issue, updated the tests, forked the repo, submitted the PR... and today I got the confirmation that **my PR has been merged into the official repo**. 🎉 Here's the diff in case if you want to review: ```diff From d2789d809490380590fc586bed0569a986456b78 Mon Sep 17 00:00:00 2001 From: Muhammad Huzaifa Date: Wed, 9 Jul 2025 18:28:13 +0500 Subject: [PATCH] fix(ollama-provider): remove unsupported 'system' param from `api/chat` endpoint and allow multiple system prompts Replace the incorrect use of the `system` body param with the correct `{ role, content }` message structure, as per Ollama's API spec. Now system prompts are prepended to the messages array to maintain compatibility with the chat format expected by `api/chat`. `system` body param is only available for `api/generate` endpoint. Since we are now prepending the system prompts, multiple system prompts are allowed by default, remove the restriction on multiple system prompts and remove the relevant tests as well. --- src/Providers/Ollama/Handlers/Stream.php | 10 +++---- src/Providers/Ollama/Handlers/Structured.php | 17 +++++------ src/Providers/Ollama/Handlers/Text.php | 10 +++---- tests/Providers/Ollama/StructuredTest.php | 30 -------------------- tests/Providers/Ollama/TextTest.php | 14 --------- 5 files changed, 15 insertions(+), 66 deletions(-) diff --git a/src/Providers/Ollama/Handlers/Stream.php b/src/Providers/Ollama/Handlers/Stream.php index bb8ae38..5b27815 100644 --- a/src/Providers/Ollama/Handlers/Stream.php +++ b/src/Providers/Ollama/Handlers/Stream.php @@ -174,17 +174,15 @@ class Stream protected function sendRequest(Request $request): Response { - if (count($request->systemPrompts()) > 1) { - throw new PrismException('Ollama does not support multiple system prompts using withSystemPrompt / withSystemPrompts. However, you can provide additional system prompts by including SystemMessages in with withMessages.'); - } - return $this ->client ->withOptions(['stream' => true]) ->post('api/chat', [ 'model' => $request->model(), - 'system' => data_get($request->systemPrompts(), '0.content', ''), - 'messages' => (new MessageMap($request->messages()))->map(), + 'messages' => (new MessageMap(array_merge( + $request->systemPrompts(), + $request->messages() + )))->map(), 'tools' => ToolMap::map($request->tools()), 'stream' => true, 'options' => Arr::whereNotNull(array_merge([ diff --git a/src/Providers/Ollama/Handlers/Structured.php b/src/Providers/Ollama/Handlers/Structured.php index 0b95cf7..e7bae61 100644 --- a/src/Providers/Ollama/Handlers/Structured.php +++ b/src/Providers/Ollama/Handlers/Structured.php @@ -6,7 +6,6 @@ namespace Prism\Prism\Providers\Ollama\Handlers; use Illuminate\Http\Client\PendingRequest; use Illuminate\Support\Arr; -use Prism\Prism\Exceptions\PrismException; use Prism\Prism\Providers\Ollama\Concerns\MapsFinishReason; use Prism\Prism\Providers\Ollama\Concerns\ValidatesResponse; use Prism\Prism\Providers\Ollama\Maps\MessageMap; @@ -76,20 +75,18 @@ class Structured */ protected function sendRequest(Request $request): array { - if (count($request->systemPrompts()) > 1) { - throw new PrismException('Ollama does not support multiple system prompts using withSystemPrompt / withSystemPrompts. However, you can provide additional system prompts by including SystemMessages in with withMessages.'); - } - $response = $this->client->post('api/chat', [ 'model' => $request->model(), - 'system' => data_get($request->systemPrompts(), '0.content', ''), - 'messages' => (new MessageMap($request->messages()))->map(), + 'messages' => (new MessageMap(array_merge( + $request->systemPrompts(), + $request->messages() + )))->map(), 'format' => $request->schema()->toArray(), 'stream' => false, 'options' => Arr::whereNotNull(array_merge([ - 'temperature' => $request->temperature(), - 'num_predict' => $request->maxTokens() ?? 2048, - 'top_p' => $request->topP(), + 'temperature' => $request->temperature(), + 'num_predict' => $request->maxTokens() ?? 2048, + 'top_p' => $request->topP(), ], $request->providerOptions())), ]); diff --git a/src/Providers/Ollama/Handlers/Text.php b/src/Providers/Ollama/Handlers/Text.php index f4777a2..b167da6 100644 --- a/src/Providers/Ollama/Handlers/Text.php +++ b/src/Providers/Ollama/Handlers/Text.php @@ -68,16 +68,14 @@ class Text */ protected function sendRequest(Request $request): array { - if (count($request->systemPrompts()) > 1) { - throw new PrismException('Ollama does not support multiple system prompts using withSystemPrompt / withSystemPrompts. However, you can provide additional system prompts by including SystemMessages in with withMessages.'); - } - $response = $this ->client ->post('api/chat', [ 'model' => $request->model(), - 'system' => data_get($request->systemPrompts(), '0.content', ''), - 'messages' => (new MessageMap($request->messages()))->map(), + 'messages' => (new MessageMap(array_merge( + $request->systemPrompts(), + $request->messages() + )))->map(), 'tools' => ToolMap::map($request->tools()), 'stream' => false, 'options' => Arr::whereNotNull(array_merge([ diff --git a/tests/Providers/Ollama/StructuredTest.php b/tests/Providers/Ollama/StructuredTest.php index 2630a8f..afb0ced 100644 --- a/tests/Providers/Ollama/StructuredTest.php +++ b/tests/Providers/Ollama/StructuredTest.php @@ -53,33 +53,3 @@ it('returns structured output', function (): void { expect($response->structured['open_source'])->toBeArray(); }); - -it('throws an exception with multiple system prompts', function (): void { - Http::preventStrayRequests(); - - $schema = new ObjectSchema( - 'output', - 'the output object', - [ - new StringSchema('name', 'The users name'), - new ArraySchema('hobbies', 'a list of the users hobbies', - new StringSchema('name', 'the name of the hobby'), - ), - new ArraySchema('open_source', 'The users open source contributions', - new StringSchema('name', 'the name of the project'), - ), - ], - ['name', 'hobbies', 'open_source'] - ); - - $response = Prism::structured() - ->using('ollama', 'qwen2.5:14b') - ->withSchema($schema) - ->withSystemPrompts([ - new SystemMessage('MODEL ADOPTS ROLE of [PERSONA: Nyx the Cthulhu]!'), - new SystemMessage('But my friends call my Nyx.'), - ]) - ->withPrompt('Who are you?') - ->asStructured(); - -})->throws(PrismException::class, 'Ollama does not support multiple system prompts using withSystemPrompt / withSystemPrompts. However, you can provide additional system prompts by including SystemMessages in with withMessages.'); diff --git a/tests/Providers/Ollama/TextTest.php b/tests/Providers/Ollama/TextTest.php index 505bf39..2a4d4f4 100644 --- a/tests/Providers/Ollama/TextTest.php +++ b/tests/Providers/Ollama/TextTest.php @@ -167,17 +167,3 @@ describe('Image support', function (): void { }); }); }); - -it('throws an exception with multiple system prompts', function (): void { - Http::preventStrayRequests(); - - $response = Prism::text() - ->using('ollama', 'qwen2.5:14b') - ->withSystemPrompts([ - new SystemMessage('MODEL ADOPTS ROLE of [PERSONA: Nyx the Cthulhu]!'), - new SystemMessage('But my friends call my Nyx.'), - ]) - ->withPrompt('Who are you?') - ->asText(); - -})->throws(PrismException::class, 'Ollama does not support multiple system prompts using withSystemPrompt / withSystemPrompts. However, you can provide additional system prompts by including SystemMessages in with withMessages.'); -- 2.34.1 ``` ![image](https://muhammadhuzaifa.pro/storage/photos/1/fix-prismphp-ollama-stream-bug.webp) ## 🚀 Why This Matters This wasn’t just a bugfix. It was a reminder that real-world contributions come from curiosity and the will to improve what you use. Whether it’s Laravel, Ollama, or a lesser-known AI package, fixing one small piece can help the whole community. ## 🔗 Let’s Build Something Together If you’re looking for someone who not only builds robust systems but also dives deep into debugging, fixing, and contributing back to the community—I’m your guy. 👉 **[Visit my Upwork Profile](https://www.upwork.com/freelancers/~01dcc2f82551b47dee)** to see what I’ve done, what I can do, and how we can work together. Let's build tools that don’t just work—they *improve others’ work too*. ### why you should touch the code that’s “working just fine” URL: https://muhammadhuzaifa.pro/why-you-should-touch-the-code-thats-working-just-fine Published: 2025-07-25 Last updated: 2025-07-24 You’ve probably heard the saying (or seen the meme): > *“If it works, don’t touch it.”* Sounds funny, and sure, it gets a laugh. But if you’ve been in software development for a while—or even just care about writing code that others can read and build on—you know that mindset won’t get you far. Refactoring is *not* about fixing bugs. It’s about keeping your codebase clean, scalable, and up to standard. Think of it like cleaning your house—not because it’s falling apart, but because a tidy space helps you live better. #### My Recent Example The image below shows a cumulative Git commit. It’s a rebased commit made by squashing several refactor commits into one, then rebasing that into the `main` branch. ![Why You Should Touch the Code That’s “Working Just Fine”](https://muhammadhuzaifa.pro/storage/photos/1/refactor-laravel-code.webp) What’s special? It shows that I refactored the `Modules/Job` module by 73.5%. This didn’t just happen randomly. It started when I introduced **architectural tests**—and they failed. That failure gave me exactly what I needed: signals that the current structure had drifted. As the Chief Architect, I knew if I didn’t refactor now, the upcoming bi-weekly sprints would only stack on top of a shaky foundation. So I dove in. ### What Did the Refactor Involve? * ✅ Restructuring controllers to follow **Laravel’s resourceful conventions**, including single-action controllers * ✅ Aligning the codebase with **PSR standards** * ✅ Applying **SOLID principles** wherever possible * ✅ Creating a temporary `route.php` file with permanent redirects from old to new route structure (yes, even redirects deserve structure!) ### Why Refactor Anyway? Because every time you avoid it, tech debt grows. You don’t have to refactor daily. But weekly or bi-weekly, especially when code smells start showing? That’s the time. And if you’re interested in learning more about *how* to refactor well, I’d recommend following [Martin Fowler](https://martinfowler.com/), whose books and posts are a goldmine for understanding refactoring patterns. ### Want Your Code Refactored? If you’ve got a Laravel codebase that could use a cleanup—or even just want a second pair of eyes on it—I’m available for freelance consulting. You can reach out to me on [Upwork](https://www.upwork.com/freelancers/~01dcc2f82551b47dee), and I’d be happy to take a look. ### enforcing clean controller design in laravel with pestphp architectural testing URL: https://muhammadhuzaifa.pro/enforcing-clean-controller-design-in-laravel-with-pestphp-architectural-testing Published: 2025-07-20 As someone who’s always trying to bring structure and discipline to Laravel applications, I’ve been diving into **architectural testing using [PestPHP](https://pestphp.com)** lately. Pest has some excellent presets, especially when it comes to enforcing clean and maintainable code through expectations. One area I was particularly interested in was **controller method restrictions**. We already had a basic architectural test to ensure that Laravel controllers do not expose any unnecessary public methods—just the conventional ones like `index`, `show`, `store`, etc. But I wanted to take it a step further. > If a controller is invokable (i.e., has the `__invoke` method), then it should not have any other public methods except `__construct` and `__invoke`. Simple rule, but enforcing it across your growing codebase is a different story. ### PestPHP Limitation & Custom Test I initially tried to achieve this using PestPHP’s native `expect(...)->toHavePublicMethodsOnly([...])`, but there wasn’t a straightforward way to **conditionally skip** classes that aren't invokable. So I ended up writing a **custom architectural test** that walks through each controller file, determines if the class defines `__invoke`, and applies the rule accordingly. Here’s the snippet I came up with: ```php test('invokable controllers only have __construct and __invoke as public methods', function () { foreach (glob(module_path('User', 'app/Http/Controllers/**/*.php')) as $file) { $class = Str::of($file) ->after('/User') ->replace( ['/app', '.php'], '' )->toString(); $classNamespace = app() ->getProvider(UserServiceProvider::class) ->module_namespace('User', $class); if (method_exists($classNamespace, '__invoke')) { expect($classNamespace) ->not ->toHavePublicMethodsBesides(['__construct', '__invoke']); } } }); ``` ![pestphp-architectural-testing-output](https://muhammadhuzaifa.pro/storage/photos/1/pestphp-architectural-testing-output.webp) ### Why This Matters In a large codebase, small things like this matter more than we think. Enforcing clean, intention-driven controller design means fewer surprises, better maintainability, and ultimately a more robust system. Architectural testing is one of those underrated practices that can significantly improve your team’s consistency without becoming a bottleneck. And PestPHP makes it surprisingly elegant. If you're using **Laravel + Pest**, I highly recommend investing time in writing these small, meaningful assertions. It pays off. 💬 Have ideas on how this can be improved or made even cleaner? I’d love to hear your thoughts. If you're exploring similar architectural patterns in your Laravel apps, or if you have a project where you'd like robust architectural or feature tests written, feel free to reach, check out my work and connect with me on [Upwork](https://www.upwork.com/freelancers/~01dcc2f82551b47dee). ### 14 years in tech – a journey of curiosity, craft, and commitment URL: https://muhammadhuzaifa.pro/14-years-in-tech-a-journey-of-curiosity-craft-and-commitment Published: 2025-07-12 ## 14 Years In Tech – A Journey of Curiosity, Craft, and Commitment This July marks **14 years** since I wrote my first line of production code professionally — for a WordPress project. But the spark started long before that. Somewhere between 2002 and 2004, curiosity took root. It became something deeper in 2011, when I wrote my first “Hello World” in C. That simple line opened the doors to a journey that’s been nothing short of transformative — full of challenges, constant learning, and the chance to build, lead, and contribute meaningfully to the tech community. Over the years, I’ve worn many hats — from an ordinary student to a Chief Architect. I’ve worked with global teams, solved real business problems, mentored developers, and explored technologies that weren’t even on the radar when I first started. Whether it was integrating SAP with HubSpot, architecting multi-tenant SaaS platforms, contributing to open-source tools like **Laravel Telescope Guzzle Watcher**, or experimenting with **LLMs like Ollama**, my approach has remained simple: **build with purpose, stay grounded, and grow with people**. But this milestone isn’t just about the number of years. It’s about the journey — the systems I’ve helped shape, the incredible people I’ve worked with, the late nights chasing obscure bugs, and the quiet moments of pride when something just *clicks* and works. If there’s one piece of advice I could give to someone starting out: **learn to learn**. Stay humble, and focus on understanding problems deeply before rushing into solutions. One thing I’ve noticed lately — and I say this with some concern — is how easily we get caught up in tech trends. “This language is dying,” “That tool is obsolete,” “AI is replacing X.” When I chose PHP as my primary domain, I saw those headlines too. Then came Node.js, and the same culture followed. Here’s what I’ve learned: **tools change, but fundamentals don’t**. Strengthen your foundation in computer science. Learn how programs are built and run. Writing a C program teaches you things that apply to everything else. Master the basics, read the docs, build things yourself, and practice until it becomes muscle memory. I see many students today proudly build things using AI, but miss the essence of doing it themselves. Cognitive intelligence comes from your own knowledge and experience. AI — while powerful — is like a calculator. It should support your thinking, not replace it. I use LLMs myself, mostly for language and exploring ideas, but I still **implement and build things manually** — and that’s where real growth happens. To everyone who’s been part of this journey — mentors, teammates, clients, friends, and even the tough critics — thank you. You've shaped who I am today. ### enhancing laravel's apache solr integration with php-fig psr standards compliance URL: https://muhammadhuzaifa.pro/enhancing-laravels-apache-solr-integration-with-php-fig-psr-standards-compliance Published: 2024-11-08 # Enhancing Laravel's Apache Solr Integration with PHP-FIG PSR Standards Compliance Open source projects are the foundation of countless innovations, enabling developers to share knowledge and improve each other’s work. Recently, I had the chance to contribute to a valuable Laravel package designed for integrating Apache Solr—a powerful search engine known for scalability and speed—into Laravel projects. This package simplifies Solr core management and provides a fluent interface for managing Solr operations, making it a useful tool for developers who rely on Solr’s capabilities. ## Why Contribution Standards Matter: Ensuring Compliance with PHP PSR-0 While reviewing this package, I noticed a fundamental misalignment with the PHP PSR-0 standards, specifically regarding namespace conventions. PSR-0 specifies that namespaces should be in StudlyCaps, a convention that makes code more readable and maintains consistency across PHP projects. However, this package had used lowercase namespaces throughout its codebase, which directly violated the PSR-0 standard. Adhering to such standards isn’t just about aesthetics; it’s about setting up code for scalability and maintainability. Consistent use of standards makes it easier for developers to navigate and contribute to projects, as the code structure remains predictable. ## Contribution Highlights: Refactoring for Standards Compliance To align the package with PSR-0, I refactored all namespaces to StudlyCaps and updated references accordingly. This simple but essential change brought the package into compliance, making it easier for other engineers to understand and contribute without encountering namespace issues or the need for custom workarounds. ```diff -php artisan vendor:publish --provider="haiderjabbar\laravelsolr\LaravelSolrServiceProvider" +php artisan vendor:publish --provider="HaiderJabbar\LaravelSolr\LaravelSolrServiceProvider" ``` ### The Impact of Standards on Collaboration By aligning the package with PHP-FIG PSR standards, the code now follows widely accepted conventions, ensuring that future developers working on this project will face fewer barriers to entry. This change reflects a best practice that’s integral to quality software—following standards that make collaboration easier and codebases more maintainable. ## Have a Project You’d Like Reviewed? If you have an open-source project and would like a fresh set of eyes on it, feel free to reach out. I’m always open to collaborating and helping projects meet industry standards. ## Useful Links * [haiderjabbar/laravelsolr](https://github.com/haiderjabbar/laravelsolr) * [Pull Request](https://github.com/haiderjabbar/laravelsolr/pull/2) * [Apache Solr](https://solr.apache.org/) * [PHP FIG](https://www.php-fig.org/) ### fixing a hash mismatch bug in zen php sdk: ensuring accurate payment data validation URL: https://muhammadhuzaifa.pro/fixing-a-hash-mismatch-bug-in-zen-php-sdk-ensuring-accurate-payment-data-validation Published: 2024-11-06 Last updated: 2024-11-05 # Fixing a Hash Mismatch Bug in Zen PHP SDK: Ensuring Accurate Payment Data Validation PR Link : [https://github.com/obanach/zen-php-sdk/pull/2](https://github.com/obanach/zen-php-sdk/pull/2) Recently, I encountered a bug in the Zen PHP SDK, a package designed for seamless integration with Zen.com, a prominent payment gateway service provider. The issue stemmed from a discrepancy in the Instant Payment Notification (IPN) data, specifically with how the package handled numerical values in the hash generation process. The IPN data I received included an amount of 2.70, but during hash generation, this value was interpreted as 2.7, leading to a mismatch. This seemingly minor difference was enough to disrupt the accuracy of the hash, which is critical for validating secure transactions. After a detailed investigation, I traced the problem to the `HashGenerator::generate` function, where the `$amount` parameter was defined as a `float`. PHP's internal type juggling may interpret float values in unpredictable ways, resulting in 2.7 instead of 2.70. This small discrepancy in decimal precision can cause significant issues in payment validation systems, where even minor differences can trigger security protocols or prevent successful verification. To resolve this, I modified the generate function by changing the `$amount` parameter type from `float` to `string`. This adjustment ensures that the exact data, including decimal precision, is passed to the SDK. By treating the amount as a string, we eliminate the risk of PHP adjusting the decimal precision, enabling reliable hash generation and validation. Although a minor contribution, I am proud to have improved the accuracy of the Zen PHP SDK. This fix underscores the importance of precision in open-source software and highlights the value of community-driven contributions to enhancing functionality and security in payment gateway integrations. Long live open-source systems! ### refactoring shopify's laravel web app template: improving best practices and code efficiency URL: https://muhammadhuzaifa.pro/refactoring-shopify-laravel-web-app-template-improving-best-practices-and-code-efficiency Published: 2024-10-31 Last updated: 2024-10-30 Hello everyone, I hope you're all having a great day! While building a Shopify web application using Laravel for the first time, I encountered several areas where the code deviated from Laravel's best practices. The implementation included common pitfalls, such as: - **Fat Web Routes File**: Business logic and route handling cluttering up `web.php`. - **Direct Business Logic in Routes**: Essential logic embedded directly in routes, leading to an unstructured and hard-to-maintain codebase. - **ENV Variables Accessed Without Configuration Resolver**: Sensitive configuration data accessed improperly, lacking the necessary security and abstraction layers. - **Service Logic in App Service Provider**: Core service logic written directly into the `AppServiceProvider`, which is designed to handle application-wide settings, not heavy business logic. These issues sparked my motivation to contribute to improving the Shopify app's Laravel template. I made several optimizations and submitted a pull request (PR) to Shopify. The PR introduces enhancements aligned with Laravel best practices, making the template more maintainable, secure, and in line with standard development practices. Whether or not Shopify decides to merge the PR, I believe these updates are essential for anyone embarking on a new Shopify app project in Laravel. If you're planning to develop a Shopify app with Laravel, I'd recommend checking out the PR. Here's the link: [PR #524: Shopify Laravel Web App Improvements](https://github.com/Shopify/shopify-app-template-php/pull/524) You can also apply these changes directly by cherry-picking the diff: ```sh curl https://patch-diff.githubusercontent.com/raw/Shopify/shopify-app-template-php/pull/524.patch | git apply ``` Feel free to explore these updates, as they can streamline development and significantly improve the maintainability of your Shopify-Laravel integration. ```diff From 36ef3ff908b23d77fc1171b90702eae08f8a6579 Mon Sep 17 00:00:00 2001 From: Muhammad Huzaifa Date: Tue, 8 Oct 2024 22:49:07 +0500 Subject: [PATCH 1/2] refactor: update the code as the laravel best practices --- web/app/Providers/AppServiceProvider.php | 53 +------------- web/app/Providers/ShopifyServiceProvider.php | 74 ++++++++++++++++++++ web/config/app.php | 1 + web/config/shopify.php | 71 +++++++++++++++++-- 4 files changed, 141 insertions(+), 58 deletions(-) create mode 100644 web/app/Providers/ShopifyServiceProvider.php diff --git a/web/app/Providers/AppServiceProvider.php b/web/app/Providers/AppServiceProvider.php index 5f5288fa4..857898dcc 100644 --- a/web/app/Providers/AppServiceProvider.php +++ b/web/app/Providers/AppServiceProvider.php @@ -2,17 +2,7 @@ namespace App\Providers; -use App\Lib\DbSessionStorage; -use App\Lib\Handlers\AppUninstalled; -use App\Lib\Handlers\Privacy\CustomersDataRequest; -use App\Lib\Handlers\Privacy\CustomersRedact; -use App\Lib\Handlers\Privacy\ShopRedact; use Illuminate\Support\ServiceProvider; -use Illuminate\Support\Facades\URL; -use Shopify\Context; -use Shopify\ApiVersion; -use Shopify\Webhooks\Registry; -use Shopify\Webhooks\Topics; class AppServiceProvider extends ServiceProvider { @@ -26,49 +16,8 @@ public function register() // } - /** - * Bootstrap any application services. - * - * @return void - * @throws \Shopify\Exception\MissingArgumentException - */ public function boot() { - $host = str_replace('https://', '', env('HOST', 'not_defined')); - - $customDomain = env('SHOP_CUSTOM_DOMAIN', null); - Context::initialize( - env('SHOPIFY_API_KEY', 'not_defined'), - env('SHOPIFY_API_SECRET', 'not_defined'), - env('SCOPES', 'not_defined'), - $host, - new DbSessionStorage(), - ApiVersion::LATEST, - true, - false, - null, - '', - null, - (array)$customDomain, - ); - - URL::forceRootUrl("https://$host"); - URL::forceScheme('https'); - - Registry::addHandler(Topics::APP_UNINSTALLED, new AppUninstalled()); - - /* - * This sets up the mandatory privacy webhooks. You’ll need to fill in the endpoint to be used by your app in - * the “Privacy webhooks” section in the “App setup” tab, and customize the code when you store customer data - * in the handlers being registered below. - * - * More details can be found on shopify.dev: - * https://shopify.dev/docs/apps/webhooks/configuration/mandatory-webhooks - * - * Note that you'll only receive these webhooks if your app has the relevant scopes as detailed in the docs. - */ - Registry::addHandler('CUSTOMERS_DATA_REQUEST', new CustomersDataRequest()); - Registry::addHandler('CUSTOMERS_REDACT', new CustomersRedact()); - Registry::addHandler('SHOP_REDACT', new ShopRedact()); + // } } diff --git a/web/app/Providers/ShopifyServiceProvider.php b/web/app/Providers/ShopifyServiceProvider.php new file mode 100644 index 000000000..4a35d82a4 --- /dev/null +++ b/web/app/Providers/ShopifyServiceProvider.php @@ -0,0 +1,74 @@ + ### enhanced laravel telescope guzzle watcher with multipart request support URL: https://muhammadhuzaifa.pro/enhanced-laravel-telescope-guzzle-watcher-with-multipart-request-support Published: 2024-10-26 # Enhanced Laravel Telescope Guzzle Watcher With Multipart Request Support A key advancement in this project is the addition of multipart request support. Recognizing the need for robust tracking capabilities, especially when handling multipart payloads, I implemented functionality that now allows Laravel Telescope Guzzle Watcher to record multipart requests effectively. In instances where a payload includes files, the solution smartly excludes file content while preserving essential metadata and remaining data for streamlined monitoring and enhanced performance. ```php use GuzzleHttp\Psr7; $client->request('POST', '/post', [ 'multipart' => [ [ 'name' => 'foo', 'contents' => 'data', 'headers' => ['X-Baz' => 'bar'] ], [ 'name' => 'baz', 'contents' => Psr7\Utils::tryFopen(base_path('composer.json'), 'r') ], ] ]); ``` The above request will be displayed like the one below after being recorded in the request. ![image](https://muhammadhuzaifa.pro/storage/photos/1/laravel-telescope-guzzle-watcher-3.2.0-1.png) The package is a perfect fit for applications that rely on complex integrations requiring nuanced monitoring, and it provides developers with deep insights into API interactions through Guzzle requests within Laravel applications. This package has now become a trusted component in the Laravel ecosystem for developers looking to elevate their project’s monitoring and debugging capabilities. ### why should you learn design patterns? URL: https://muhammadhuzaifa.pro/why-should-you-learn-design-patterns Published: 2024-10-23 Last updated: 2024-10-22 # Why Should You Learn Design Patterns? Design patterns are essential in software development because they provide proven solutions to common problems. By understanding and applying these patterns, you can write more maintainable, scalable, and flexible code. One great example of this is how the **Adapter Pattern** can simplify and streamline code when working with external libraries or APIs. Take a look at this article by [Stefan Zweifel](https://stefanzweifel.dev/posts/2022/05/29/use-laravels-http-client-with-facebooks-business-sdk/), where he uses the **Adapter Pattern** to integrate Laravel’s HTTP client with Facebook’s Business SDK. This design pattern made it easy for him to extend and implement custom business logic to handle HTTP requests more efficiently. By employing the **Adapter Pattern**, he was able to: - Leverage Laravel's **HTTP facade**, including the fake feature for testing without modifying the SDK itself. - Monitor HTTP requests easily using **Laravel's Pulse** and **[Telescope](https://muhammadhuzaifa.pro/laravel-telescope-first-party-laravel-package-for-debugging)** tools, giving full visibility into each request and response during development. But what exactly does the Adapter Pattern do? Simply put, it allows two incompatible interfaces to work together. In this case, Stefan wanted to use Laravel’s clean and robust HTTP client while still interacting with Facebook’s SDK, which had its own implementation for handling HTTP requests. The Adapter Pattern provided a seamless way to bridge these two worlds, encapsulating the differences and allowing him to use Laravel's native tools without changing the SDK’s core functionality. ## Benefits of the Adapter Pattern: 1. **Flexibility**: It allows you to integrate third-party libraries or legacy systems with your codebase without modifying the original source. 2. **Extensibility**: You can implement custom business logic as needed without affecting the core systems. 3. **Maintainability**: By keeping the implementation separate from the client code, any future changes in the third-party API can be handled within the adapter, leaving the rest of your application unaffected. This is just one example of why learning design patterns like the Adapter Pattern can elevate your coding skills. They are key to writing clean, reusable, and scalable code. ### technical seo configurator for laravel by honeystone URL: https://muhammadhuzaifa.pro/technical-seo-configurator-for-laravel-by-honeystone Published: 2024-09-17 Last updated: 2024-09-19 # Technical SEO Configurator for Laravel by honeystone > [Improve Your Laravel Ecommerce Store Technical Seo Using butschster/laravelmetatags](https://muhammadhuzaifa.pro/improve-your-laravel-ecommerce-store-technical-seo-using-butschsterlaravelmetatags) could be a good alternative for managing Technical SEO in your Laravel project. The Honeystone SEO package makes configuring SEO metadata from anywhere within your Laravel application a breeze. Included are metadata generators for general metadata, X (Formally Twitter) Cards, Open Graph, JSON-LD Schema, and Favicons (generated using [RealFaviconGenerator](https://realfavicongenerator.net)). This package was designed with extensibility in mind, so your own custom metadata generators can also be added with ease. ## Installation ```shell composer require honeystone/laravel-seo ``` Publish the configuration file with: ```shell php artisan vendor:publish --tag=honeystone-seo-config ``` ## Usage The package provides a helper function, `seo()`, and some Blade directives, `@metadata` and `@openGraphPrefix`. You can also typehint the `Honeystone\Seo\MetadataDirector` if you prefer to use dependency injection. Setting metadata is a simple as chaining methods: ```php seo() ->title('A fantastic blog post', 'My Awesome Website!') ->description('Theres really a lot of great stuff in here...') ->images( 'https://mywebsite.com/images/blog-1/cover-image.webp', 'https://mywebsite.com/images/blog-1/another-image.webp', ); ``` Once you've set your metadata, you can render it using: ```php seo()->generate(); ``` Alternatively, you can also use the `@metadata` Blade directive. The rendered result will look something like this: ```html A fantastic blog post - My Awesome Website! { "@context": "https://schema.org", "@type": "WebPage", "name": "A fantastic blog post", "description": "Theres really a lot of great stuff in here...", "image": [ "https://mywebsite.com/images/blog-1/cover-image.webp", "https://mywebsite.com/images/blog-1/another-image.webp" ], "url": "https://mywebsite.com" } ``` ### Default methods Values provided to default methods will automatically propagate to all configured metadata generators. The following default methods are available: ```php seo() ->locale('en_GB') ->title('A fantastic blog post', template: '🔥🔥 {title} 🔥🔥') ->description('Theres really a lot of great stuff in here...') ->keywords('foo', 'bar', 'baz') ->url('https://mywebsite.com/blog/a-fantastic-blog-post') //defaults to the current url ->canonical('https://mywebsite.com/blog/a-fantastic-blog-post') //by default url and canonical are in sync, see config ->canonicalEnabled(true) //enabled by default, see config ->images( 'https://mywebsite.com/images/blog-1/cover-image.webp', 'https://mywebsite.com/images/blog-1/another-image.webp', ) ->robots('🤖', '🤖', '🤖'); ``` The full baseline looks like this: ```html 🔥🔥 A fantastic blog post 🔥🔥 { "@context": "https://schema.org", "@type": "WebPage", "name": "A fantastic blog post", "description": "Theres really a lot of great stuff in here...", "image": [ "https://mywebsite.com/images/blog-1/cover-image.webp", "https://mywebsite.com/images/blog-1/another-image.webp" ], "url": "https://mywebsite.com/blog/a-fantastic-blog-post" } ``` For your homepage you'll probably want to disable the title template: ```php seo()->title('My Awesome Website!', template: false); ``` ### Meta methods The meta methods are provided by the `Honeystone\Seo\Generators\MetaGenerator` class. Here's the full list: ```php seo() ->metaTitle('A fantastic blog post') ->metaTitleTemplate('🔥🔥 {title} 🔥🔥') ->metaDescription('Theres really a lot of great stuff in here...') ->metaKeywords('foo', 'bar', 'baz') ->metaCanonical('https://mywebsite.com/blog/a-fantastic-blog-post') ->metaCanonicalEnabled(true) ->metaRobots('🤖', '🤖', '🤖'); ``` All of these are provided by the default methods and propagate through to the meta generator. If you only want to render the meta generator, use `seo()->generate('meta')` or `@metadata('meta')` ### Twitter methods The meta methods are provided by the `Honeystone\Seo\Generators\TwitterGenerator` class. Here's the full list: ```php seo() ->twitterEnabled(true) //enabled by default, see config ->twitterSite('@MyWebsite') ->twitterCreator('@MyTwitter') ->twitterTitle('A fantastic blog post') //defaults to title() ->twitterDescription('Theres really a lot of great stuff in here...') //defaults to description() ->twitterImage('https://mywebsite.com/images/blog-1/cover-image.webp'); //defaults to the first in images() ``` You can learn more about this package, get full installation instructions, and view the [source code](https://github.com/Honeystone/laravel-seo) on GitHub ### laravel telescope: first party laravel package for debugging URL: https://muhammadhuzaifa.pro/laravel-telescope-first-party-laravel-package-for-debugging Published: 2024-09-10 # Laravel Telescope: First Party Laravel Package for Debugging > Laravel Telescope makes a wonderful companion to your local Laravel development environment. Telescope provides insight into the requests coming into your application, exceptions, log entries, database queries, queued jobs, mail, notifications, cache operations, scheduled tasks, variable dumps, and more. > > -- [Laravel Telescope Documentation](https://laravel.com/docs/11.x/telescope#introduction) Laravel Telescope is a first party package, means it is developed by the same team who develop Laravel core and other first party packages. Laravel Telescope intercepts all of your interactions with its core API such as exceptions, log entries, database queries and much more. Laravel Telescope provides the following features or watchers, lets briefly discussed each one of them. ## Client Watcher (Incoming HTTP Requests) `Laravel\Telescope\Watchers\ClientRequestWatcher` is responsible for watching HTTP requests and it listens for the `Illuminate\Http\Client\Events\ConnectionFailed` or `Illuminate\Http\Client\Events\ResponseReceived` events and record the request under the Requests section. ## Command Watcher `Laravel\Telescope\Watchers\CommandWatcher` is responsible for watching commands and it listens for the `Illuminate\Console\Events\CommandFinished` events and record the command under the Commands section. Following commands are ignored by default and won't be recorded by the watcher. ```php /** * Determine if the event should be ignored. * * @param mixed $event * @return bool */ private function shouldIgnore($event) { return in_array($event->command, array_merge($this->options['ignore'] ?? [], [ 'schedule:run', 'schedule:finish', 'package:discover', ])); } ``` ## Schedule Watcher `Laravel\Telescope\Watchers\ScheduleWatcher` is responsible for watching scheduler and it listens for the `Illuminate\Console\Events\CommandStarting` at first and then each event from the `Schedule::class` and record them under the Schedule section. ```php /** * Record a scheduled command was executed. * * @param \Illuminate\Console\Events\CommandStarting $event * @return void */ public function recordCommand(CommandStarting $event) { if (! Telescope::isRecording() || $event->command !== 'schedule:run' && $event->command !== 'schedule:finish') { return; } collect(app(Schedule::class)->events())->each(function ($event) { $event->then(function () use ($event) { Telescope::recordScheduledCommand(IncomingEntry::make([ 'command' => $event instanceof CallbackEvent ? 'Closure' : $event->command, 'description' => $event->description, 'expression' => $event->expression, 'timezone' => $event->timezone, 'user' => $event->user, 'output' => $this->getEventOutput($event), ])); }); }); } ``` ## Batch Watcher `Laravel\Telescope\Watchers\BatchWatcher` is responsible for watching dispatched batches and it listens for the `Illuminate\Bus\Events\BatchDispatched` event and record it under the Batch section. ## Cache Watcher `Laravel\Telescope\Watchers\CacheWatcher` is responsible for watching cache data and it listens for the following events - `Illuminate\Cache\Events\CacheHit` - `Illuminate\Cache\Events\CacheMissed` - `Illuminate\Cache\Events\KeyWritten` - `Illuminate\Cache\Events\KeyForgotten` ```php /** * Register the watcher. * * @param \Illuminate\Contracts\Foundation\Application $app * @return void */ public function register($app) { $app['events']->listen(CacheHit::class, [$this, 'recordCacheHit']); $app['events']->listen(CacheMissed::class, [$this, 'recordCacheMissed']); $app['events']->listen(KeyWritten::class, [$this, 'recordKeyWritten']); $app['events']->listen(KeyForgotten::class, [$this, 'recordKeyForgotten']); } ``` ## Dump Watcher `Laravel\Telescope\Watchers\DumpWatcher` is responsible for recording any dumps you might be using. It does listens for any events, the watcher uses the following `Symfony` components and just record the dump as it is. - `Symfony\Component\VarDumper\Cloner\VarCloner` - `Symfony\Component\VarDumper\Dumper\HtmlDumper` - `Symfony\Component\VarDumper\VarDumper` ## Event Watcher `Laravel\Telescope\Watchers\EventWatcher` is a global watcher and it listens for almost every event and record it under the Events section, however there are couple of events which are ignored by the Laravel Telescope and are fired internally by the Laravel framework. ```php /** * Determine if the event was fired internally by Laravel. * * @param string $eventName * @return bool */ protected function eventIsFiredByTheFramework($eventName) { return Str::is( [ 'Illuminate\*', 'Laravel\Octane\*', 'Laravel\Scout\Events\ModelsImported', 'eloquent*', 'bootstrapped*', 'bootstrapping*', 'creating*', 'composing*', ], $eventName ); } ``` We will look into the further watchers in the next article. ### birthday wishes from team computan URL: https://muhammadhuzaifa.pro/birthday-wishes-from-team-computan Published: 2024-09-10 > Your dedication and enthusiasm make a real difference, and it’s great to have you on board. Here’s to celebrating you today and wishing you a year full of success and happiness. Thank you team [Computan](https://computan.com) for the well wishes. ### improve your laravel ecommerce store technical seo using butschster/laravelmetatags URL: https://muhammadhuzaifa.pro/improve-your-laravel-ecommerce-store-technical-seo-using-butschsterlaravelmetatags Published: 2024-09-09 Last updated: 2024-09-17 # The most powerful and extendable tools for managing SEO Meta Tags in your Laravel project > [Technical Seo Configurator For Laravel By Honeystone](https://muhammadhuzaifa.pro/technical-seo-configurator-for-laravel-by-honeystone) could be a good alternative for managing Technical SEO in your Laravel project. Laravel SEO Meta Tags offers a sophisticated solution for Laravel applications, allowing developers to seamlessly manage header meta tags, CSS, JavaScript, and other relevant tags. Its primary objective is to simplify the process of managing search engine optimization (SEO) tags within your application. **Moreover, its versatile API makes it compatible with frameworks like [Inertiajs](https://inertiajs.com/), [VueJS](https://nuxtjs.org/docs/2.x/features/meta-tags-seo) and other JavaScript frameworks.** ## Features - **Meta Management:** Effortlessly set titles, charset, pagination links, and more. - **Styles & Scripts:** Organize and place styles and scripts anywhere in your HTML. - **Custom Tags:** Make your own tags to suit specific needs. - **Rich Media Integration:** Supports both Open Graph & Twitter Cards. - **Analytics Ready:** Comes with Google Analytics and Yandex Metrika tracking code support, including a code builder for the latter. - **Site Verification:** Supports webmaster tools site verifier tags. - **Package System:** Group tags, styles, and scripts into named packages for easy inclusion anywhere. - **Robust Documentation:** Clear instructions and guidelines for a seamless setup. - **Thoroughly Tested:** Built to ensure reliability and stability. ### Requirements - Laravel version: 9.x to 10.x - PHP version: 8.0 or higher ## Installation and Configuration 1. **Install the package:** Use the following command to install the Meta Tags package in your awesome application. ```shell composer require butschster/meta-tags ``` 2. **Register the Service Provider:** After installing the package, you must register its service provider. You can do it using the following artisan command: ```shell php artisan meta-tags:install ``` This command will activate the `App\Providers\MetaTagsServiceProvider` and publish the configuration at `config/meta_tags.php`. Within this configuration file, you can set default titles, keywords, descriptions, and other meta tags which will be automatically inserted into your HTML. 3. **Verification:** Ensure that `App\Providers\MetaTagsServiceProvider` has been added to the providers array in your `config/app.php` configuration file. If it hasn't, you'll need to add it manually. Remember, if your application isn't using the `App` namespace, update the provider class name accordingly. And that's all! Your Laravel project is now equipped to handle SEO meta tags with ease. ## Usage ### Controller You can use either Facade `\Butschster\Head\Facades\Meta` or `\Butschster\Head\Contracts\MetaTags\MetaInterface` in your controller ```php use Butschster\Head\MetaTags\MetaInterface; class HomeController extends Controller { public function __contruct( protected MetaInterface $meta ) { } public function index() { $news = News::paginate(); // Prepend title part to the default title $this->meta // Will render "Home page - Default Title" ->prependTitle('Home page') // Will include next, prev, canonical links ->setPaginationLinks($news) // Will change default favicon ->setFavicon('/favicon-index.ico') } } // Or you can use the facade use Butschster\Head\Facades\Meta; class HomeController extends Controller { public function index() { $news = News::paginate(); Meta::prependTitle('Home page') ->setPaginationLinks($news) ->setFavicon('favicon-index.ico'); } } ``` #### View To integrate meta tags into your HTML, simply insert `{!! Meta::toHtml() !!}` wherever required. > **Note** > You have two options to insert meta tags: `{!! Meta::toHtml() !!}` or the Blade directive `@meta_tags`. Here's an example of how you can use it in your view: ```html {!! Meta::toHtml() !!} ... ``` ### Placements The package provides flexibility to insert meta tags beyond the header. You can define specific placements in your templates. - To place meta tags in the footer, use: `Meta::footer()->toHtml()` - For custom placements, use: `Meta::placement('placement_name')->toHtml()` - Alternatively, the Blade directive can also be used: `@meta_tags('placement_name')` ```html ... {!! Meta::placement('middle_of_the_page')->toHtml() !!} ... {!! Meta::footer()->toHtml() !!} ``` You can learn more about this package, get full installation instructions, and view the [source code](https://github.com/butschster/LaravelMetaTags) on GitHub ### laravel cloud trailor by taylor URL: https://muhammadhuzaifa.pro/laravel-cloud-trailor-by-taylor Published: 2024-09-06 Laravel Cloud is your new fully managed infrastructure platform for Laravel. Go from Hello World to Hello Web in one minute or less. ### laravel raises a $57 million series a from accel URL: https://muhammadhuzaifa.pro/laravel-raises-a-57-million-series-a-from-accel Published: 2024-09-06 Taylor tweeted: "I'm excited to announce that Laravel has raised a $57M Series A in partnership with Accel." "I believe that Laravel is the most productive way to build full-stack web applications, and Laravel Cloud will be the platform for shipping those applications that this community deserves." Partnering with Accel has allowed Laravel to start building a world-class engineering and leadership team that has resulted in Laravel Cloud and also another product that will be announced at Laracon AU in November. He also follows up with some important takeaways from the announcement. First, I’m not going anywhere. I’m still leading Laravel as CEO, and I’m working closely with all of our teams to ensure we’re building the best products possible for our community. Second, we remain committed to open source. Since partnering with Accel, we’ve hired additional engineering support dedicated to open source development. I also remain the primary curator of all features in the Laravel framework. Inertia 2.0 and our first-party VS Code extension are a direct result of our increased open source engineering capacity. Accel deeply understands open source and developer focused tooling, with previous investments in Sentry, Vercel, and Linear. ### just earned laravel architect badge on laracasts URL: https://muhammadhuzaifa.pro/just-earned-laravel-architect-badge-on-laracasts Published: 2024-09-04 Last updated: 2024-09-06 Just completed the recommended pathway through Laracasts and earned a new Path-specific achievement badge named Laravel Architect. The pathway conists of multiple levels, each level having multiple series, and then each series have its own episodes. It's an honor to learn from Jeffrey Way, James Brooks, Stephen Rees-Carter, Jonathan Reinink, Kevin McKee, Mohamed Said, and Jeremy McPeak. ### unveiling laravel telescope guzzle watcher & laravel pulse guzzle recorder: a journey into efficient api monitoring at laravel live pakistan 2024 URL: https://muhammadhuzaifa.pro/unveiling-laravel-telescope-guzzle-watcher-laravel-pulse-guzzle-recorder-a-journey-into-efficient-api-monitoring-at-laravel-live-pakistan-2024 Published: 2024-02-26 Last updated: 2024-08-20 As the vibrant tech community of Pakistan gears up for yet another exhilarating event, Laravel Live Pakistan 2024 promises to be a melting pot of innovation, collaboration, and groundbreaking revelations. Among the distinguished speakers, I am thrilled to announce my participation in this esteemed gathering, where I will be unveiling two groundbreaking packages: Laravel Telescope Guzzle Watcher and Laravel Pulse Guzzle Recorder. For developers immersed in the Laravel ecosystem, the significance of efficient API monitoring cannot be overstated. With the increasing complexity of modern web applications, seamless integration with external services and APIs has become the norm. However, ensuring the reliability and performance of these integrations poses a considerable challenge. This is precisely where Laravel Telescope Guzzle Watcher and Laravel Pulse Guzzle Recorder step in to revolutionize the landscape of API monitoring. Laravel Telescope Guzzle Watcher: Elevating Debugging to New Heights Imagine having a comprehensive tool at your disposal that offers unparalleled insights into the intricacies of HTTP requests within your Laravel application. Laravel Telescope Guzzle Watcher does exactly that and more. By seamlessly integrating with Laravel Telescope, this package provides developers with real-time visibility into Guzzle HTTP client requests, empowering them to diagnose and troubleshoot issues with unprecedented precision. With Laravel Telescope Guzzle Watcher, gone are the days of tedious manual debugging. Say hello to a streamlined workflow where every HTTP request is meticulously monitored, allowing developers to identify bottlenecks, track performance metrics, and optimize their applications for peak efficiency. Whether you're building a RESTful API or consuming third-party services, this indispensable tool will revolutionize your development experience. Laravel Pulse Guzzle Recorder: Capturing the Essence of API Interactions In the dynamic realm of web development, capturing and analyzing API interactions is crucial for ensuring the seamless functioning of your applications. Laravel Pulse Guzzle Recorder emerges as the ultimate solution for recording and replaying Guzzle HTTP client requests with unparalleled ease and precision. By seamlessly integrating with Laravel Pulse, this package empowers developers to capture the essence of API interactions, facilitating thorough testing, debugging, and performance optimization. With Laravel Pulse Guzzle Recorder, developers gain the ability to record HTTP requests and responses, simulate various scenarios, and analyze the behavior of their applications under different conditions. Whether you're testing edge cases, replicating production issues, or fine-tuning your API integrations, this versatile tool will prove indispensable in your arsenal. Join Me at Laravel Live Pakistan 2024 As I prepare to take the stage at Laravel Live Pakistan 2024, I am filled with excitement and anticipation to share these groundbreaking packages with fellow developers, enthusiasts, and industry leaders. Together, let us embark on a journey into the realm of efficient API monitoring, where innovation knows no bounds and collaboration fuels progress. I invite you to join me at this momentous event as we explore the limitless possibilities offered by Laravel Telescope Guzzle Watcher and Laravel Pulse Guzzle Recorder. Together, let us empower the Laravel community to elevate their development workflows, unlock new insights, and embrace the future of web application monitoring. See you at Laravel Live Pakistan 2024, where the journey begins anew! ### 🎉 exciting announcement: laravel live pakistan is coming to lahore on saturday, 2nd march 2024! URL: https://muhammadhuzaifa.pro/exciting-announcement-laravel-live-pakistan-is-coming-to-lahore-on-saturday-2nd-march-2024 Published: 2024-02-15 Last updated: 2024-08-20 🎉 Exciting Announcement: Laravel Live Pakistan is coming to Lahore on Saturday, 2nd March 2024! 🎉 Join us for an immersive experience that goes beyond code, into the very heart of the Laravel ecosystem. This event represents the pinnacle of innovation and communal learning in the tech world. 📍 Venue: Lahore, Pakistan - a city that blends rich heritage with a vibrant tech scene. 📅 Date: 2nd March 2024 🌟 Experience: Engaging talks on Laravel's latest trends, delicious lunch, and unparalleled networking opportunities. This is not just another tech event; it's a gateway to mastering the art of Laravel, shared by enthusiasts and experts alike. And we're making it as inclusive as possible: ✅ Free registration 🔍 Registration requires approval for a curated experience 🍲 Complimentary lunch provided 🔗 Register now to secure your spot: https://lnkd.in/dPuyjTkQ Whether you're looking to brush up on your skills, learn about the newest Laravel features, or just meet others who share your passion for development, #LaravelLivePakistan2024 is where you need to be. ### 🚀 laravel telescope guzzle watcher: a top 9 package of 2023 with 80k+ downloads! URL: https://muhammadhuzaifa.pro/laravel-telescope-guzzle-watcher-a-top-9-package-of-2023-with-80k-downloads Published: 2024-01-08 Last updated: 2024-08-20 In the dynamic realm of Laravel packages, one gem has soared to the 9th spot, capturing the spotlight with an impressive 80,000+ downloads. 🌟 Introducing the Laravel Telescope Guzzle Watcher, a powerful open-source tool that has left its mark on the Laravel community. 🔍 What is Laravel Telescope Guzzle Watcher? Designed to seamlessly integrate with Laravel Telescope, this package adds a new layer of visibility to your HTTP requests. Now, you can effortlessly monitor Guzzle HTTP client requests right from the Telescope dashboard. 🕵️‍♂️ 🚨 Why it Stands Out: Simplicity at its Core: With a user-friendly setup, the Guzzle Watcher ensures a hassle-free experience for developers. Real-time Monitoring: Dive deep into your application's HTTP interactions in real-time, aiding in swift issue identification and resolution. Telescope Integration: Harness the power of Laravel Telescope to visualize Guzzle HTTP client requests with ease. 📈 Impressive Stats: Top 9 Ranking: Securing the 9th position in the list of top packages released in 2023 is no small feat. 80,000+ Downloads: The community has spoken, and the Guzzle Watcher has been embraced by thousands of developers globally. 🛠️ Installation and Setup: Getting started is a breeze! Follow the straightforward installation guide provided in the GitHub repository, and you'll be up and running in no time. 👏 Community Love: The Laravel Telescope Guzzle Watcher owes its success to the vibrant Laravel community. Your feedback, contributions, and support have propelled this package to new heights. 🌐 Where to Find It: Explore the package on GitHub: Telescope Guzzle Watcher In Conclusion: Laravel Telescope Guzzle Watcher has proven itself as an invaluable addition to Laravel developers' toolkits, earning its place among the top releases of 2023. With its growing popularity and commitment to simplicity, it's a must-have for anyone looking to enhance their HTTP request monitoring capabilities. 🎉 Join the Guzzle Watcher community and elevate your Laravel development experience today! ### embracing laravel and vue.js with inertia.js: my journey from wordpress to a modern monolith architecture URL: https://muhammadhuzaifa.pro/embracing-laravel-and-vuejs-with-inertiajs-my-journey-from-wordpress-to-a-modern-monolith-architecture Published: 2024-01-05 Last updated: 2024-08-20 In the pursuit of a seamless and efficient blogging experience, I embarked on a journey to create my own blog. Initially opting for the convenience of WordPress, I found myself entangled in the limitations and the time-consuming aspects of customization. Fueled by the desire to streamline my blogging process amidst a hectic schedule of work and academics, I decided to explore a more modern approach. This article marks a significant milestone as the first post on my blog, now built using Laravel and Vue.js with Inertia.js, embracing the power of a modern monolith architecture. The WordPress Challenge: While WordPress undoubtedly offers a user-friendly environment for blogging, I soon realized that the constraints of pre-designed themes and plugins were hindering my ability to create a truly unique and personalized platform. The constant need for updates and security checks added an extra layer of complexity, diverting my focus from content creation to maintenance. The Laravel and Vue.js Paradigm Shift: Seeking a more robust and customizable solution, I turned to Laravel, a PHP web application framework known for its elegant syntax and developer-friendly features. Coupled with Vue.js, a progressive JavaScript framework for building user interfaces, I found the perfect combination to bring my vision to life. Inertia.js: The Glue Between Laravel and Vue.js: Inertia.js emerged as a game-changer in my development journey, providing a modern monolith architecture that seamlessly connects Laravel and Vue.js. With Inertia.js, I could build dynamic, single-page applications without sacrificing the simplicity and elegance of server-driven page loads. This eliminated the need for constant API calls and improved the overall performance of my blog. Advantages of the Modern Monolith Architecture:  Efficiency: Inertia.js reduced the complexity of managing separate frontend and backend codebases, enabling me to write less code and achieve more functionality. Seamless Integration: The tight integration between Laravel and Vue.js allowed for a smooth development process, promoting code reusability and maintainability. Improved Performance: With Inertia.js handling the communication between the server and client, my blog now boasts faster page loads and a more responsive user experience. Enhanced Customization: Laravel's Blade templating engine and Vue.js components empowered me to design and customize every aspect of my blog to align with my personal style. Conclusion: Transitioning from WordPress to a modern monolith architecture built on Laravel, Vue.js, and Inertia.js has been a transformative experience. This migration has not only freed up my time from routine maintenance but also allowed me to fully express my creativity in crafting a unique and personalized blogging platform. As I embark on this new chapter, I look forward to sharing more insights and content through my blog, now powered by the dynamic synergy of Laravel and Vue.js.