<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abdulsalam Abdulrahman (Amtech Digital)</title>
    <description>The latest articles on DEV Community by Abdulsalam Abdulrahman (Amtech Digital) (@abdulsalamamtech).</description>
    <link>https://dev.to/abdulsalamamtech</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1448685%2F188fc6b7-07e2-427e-9dda-9ab00d22761d.jpeg</url>
      <title>DEV Community: Abdulsalam Abdulrahman (Amtech Digital)</title>
      <link>https://dev.to/abdulsalamamtech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdulsalamamtech"/>
    <language>en</language>
    <item>
      <title>best architectural patterns approach for senior Laravel developers</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Mon, 04 May 2026 14:28:31 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/best-architectural-patterns-approach-for-senior-laravel-developers-8m4</link>
      <guid>https://dev.to/abdulsalamamtech/best-architectural-patterns-approach-for-senior-laravel-developers-8m4</guid>
      <description>&lt;p&gt;For senior Laravel developers, the best architecture focuses on modularity, testability, and separation of concerns, moving beyond basic MVC to Domain-Driven Design (DDD) or Action-based Architectures. &lt;/p&gt;

&lt;p&gt;Key patterns include using Repositories to abstract Eloquent, Services/Actions for complex business logic, and DTOs (Data Transfer Objects) for data integrity.&lt;/p&gt;

&lt;p&gt;Key Architectural Patterns for Senior Laravel Developers:Domain-Driven Design (DDD) / Modular Monolith: Structures code around business domains (Users, Orders) rather than technical layers (Controllers, Models), improving maintainability in large applications.&lt;/p&gt;

&lt;p&gt;Action/Service Pattern: Encapsulates business logic into single-purpose classes (e.g., CreateOrderAction), reducing Controller bloat and promoting reusability.&lt;/p&gt;

&lt;p&gt;Repository Pattern: Abstracts data access logic from the model. This allows swapping database implementations or caching layers without affecting business logic.&lt;/p&gt;

&lt;p&gt;Data Transfer Objects (DTOs): Used to pass structured data between application layers, ensuring type safety and reducing reliance on associative arrays.&lt;/p&gt;

&lt;p&gt;Event-Driven Architecture (Observer Pattern): Uses Laravel Events and Listeners to decouple side effects (e.g., sending emails, updating search indexes) from the main application flow.&lt;/p&gt;

&lt;p&gt;Strategy Pattern: Ideal for handling varying behaviors, such as multiple payment gateways (Stripe vs. PayPal), by selecting algorithms at runtime.&lt;/p&gt;

&lt;p&gt;Best Practices for Senior Implementation:Dependency Inversion Principle: Depend on abstractions (Interfaces) rather than concrete Eloquent models in service classes.&lt;/p&gt;

&lt;p&gt;Leverage Laravel Service Providers: Register bindings for repositories and services in the Service Container to manage dependencies cleanly.&lt;/p&gt;

&lt;p&gt;Avoid Over-Engineering: Start with solid Service/Action classes and adopt stricter DDD patterns as complexity grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain-Driven Design (DDD) / Modular Monolith in Laravel
&lt;/h2&gt;

&lt;p&gt;Domain-Driven Design (DDD) and Modular Monoliths in Laravel shift focus from technical layers (Controllers, Models) to business capabilities. This approach is ideal for complex enterprise systems like CRMs or financial platforms where intricate business rules can easily overwhelm standard MVC structures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Architectural Layers
&lt;/h2&gt;

&lt;p&gt;A common way to implement DDD in &lt;a href="https://laravel.com/" rel="noopener noreferrer"&gt;Laravel&lt;/a&gt; is to organize the app/ directory into three primary layers: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domain Layer: The heart of the application containing pure business logic.&lt;/li&gt;
&lt;li&gt;Entities: Objects with a distinct, stable identity (e.g., a User or Order).

&lt;ul&gt;
&lt;li&gt;Value Objects: Immutable objects defined by their attributes (e.g., EmailAddress, MoneyAmount).&lt;/li&gt;
&lt;li&gt;Aggregates: Clusters of related objects treated as a single unit, managed by an "Aggregate Root" to ensure consistency.&lt;/li&gt;
&lt;li&gt;Domain Events: Indicators that something significant happened in the business (e.g., OrderPlaced).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Application Layer: Orchestrates domain objects to perform specific tasks (Use Cases). It often uses DTOs (Data Transfer Objects) to move data without exposing internal models.&lt;/li&gt;

&lt;li&gt;Infrastructure Layer: Handles technical implementation details like database persistence (Eloquent), external APIs, and mail services. &lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementing a Modular Monolith
&lt;/h2&gt;

&lt;p&gt;While DDD focuses on the "what," a Modular Monolith defines the "where." It keeps everything in one codebase but enforces strict boundaries between different business areas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structure: Modules are often housed in a top-level src/Modules/ or app/Modules/ directory. Each module contains its own routes, controllers, models, and tests.&lt;/li&gt;
&lt;li&gt;Encapsulation: Modules should only interact through defined interfaces or events to avoid "spaghetti" coupling.&lt;/li&gt;
&lt;li&gt;Communication: Inter-module communication is best handled via &lt;a href="https://laravel.com/docs/13.x/events" rel="noopener noreferrer"&gt;Laravel Events&lt;/a&gt; and Listeners. For example, the Orders module emits an event that the Inventory module listens to for stock updates.&lt;/li&gt;
&lt;li&gt;Tooling: Packages like &lt;a href="https://github.com/nWidart/laravel-modules" rel="noopener noreferrer"&gt;nwidart/laravel-modules&lt;/a&gt; or &lt;a href="https://github.com/InterNACHI/modular" rel="noopener noreferrer"&gt;InterNACHI/Modular&lt;/a&gt; are popular for scaffolding this structure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Choose This Path?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Long-term Maintainability: Clear boundaries prevent a "god-class controller graveyard" where business rules are scattered everywhere.&lt;/li&gt;
&lt;li&gt;Scalability: If a specific module grows too large or requires unique resources, it can be extracted into a separate microservice more easily because it is already isolated.&lt;/li&gt;
&lt;li&gt;Business Alignment: Developers and stakeholders use a "Ubiquitous Language," ensuring the code structure directly reflects real-world business processes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consideration for Senior Devs: DDD has a steep learning curve and introduces significant boilerplate. For simple CRUD applications, Laravel's default MVC is usually more efficient.&lt;br&gt;
Would you like to see a folder structure example or a code snippet for a Laravel Domain Action?&lt;/p&gt;

&lt;p&gt;[1] &lt;a href="https://medium.com/@harryespant/implementing-domain-driven-architecture-in-laravel-setup-advantages-and-practical-use-cases-5eac6dfeffaa" rel="noopener noreferrer"&gt;https://medium.com&lt;/a&gt;&lt;br&gt;
[2] &lt;a href="https://medium.com/@harryespant/implementing-domain-driven-architecture-in-laravel-setup-advantages-and-practical-use-cases-5eac6dfeffaa" rel="noopener noreferrer"&gt;https://medium.com&lt;/a&gt;&lt;br&gt;
[3] &lt;a href="https://ilyaskazi.medium.com/domain-driven-design-ddd-in-laravel-a-practical-guide-with-real-world-examples-7ef4b7f75896" rel="noopener noreferrer"&gt;https://ilyaskazi.medium.com&lt;/a&gt;&lt;br&gt;
[4] &lt;a href="https://www.youtube.com/watch?v=92uaRrY_1qw&amp;amp;t=23" rel="noopener noreferrer"&gt;https://www.youtube.com&lt;/a&gt;&lt;br&gt;
[5] &lt;a href="https://www.youtube.com/watch?v=29W8bvtii_g&amp;amp;t=17" rel="noopener noreferrer"&gt;https://www.youtube.com&lt;/a&gt;&lt;br&gt;
[6] &lt;a href="https://spartner.software/kennisbank/domain-driven-design-ddd" rel="noopener noreferrer"&gt;https://spartner.software&lt;/a&gt;&lt;br&gt;
[7] &lt;a href="https://laracasts.com/discuss/channels/general-discussion/need-guidance-on-choosing-the-right-architecture-for-a-laravel-application" rel="noopener noreferrer"&gt;https://laracasts.com&lt;/a&gt;&lt;br&gt;
[8] &lt;a href="https://dev.to/oskhar/domain-driven-laravel-build-great-systems-that-are-scalable-and-powerful-4458"&gt;https://dev.to&lt;/a&gt;&lt;br&gt;
[9] &lt;a href="https://medium.com/@harryespant/exploring-modular-monolithic-architecture-a-laravel-developers-guide-with-an-e-commerce-example-0548668ec222" rel="noopener noreferrer"&gt;https://medium.com&lt;/a&gt;&lt;br&gt;
[10] &lt;a href="https://www.youtube.com/watch?v=Sjw3IXUcfPQ" rel="noopener noreferrer"&gt;https://www.youtube.com&lt;/a&gt;&lt;br&gt;
[11] &lt;a href="https://medium.com/@harryespant/implementing-domain-driven-architecture-in-laravel-setup-advantages-and-practical-use-cases-5eac6dfeffaa" rel="noopener noreferrer"&gt;https://medium.com&lt;/a&gt;&lt;br&gt;
[12] &lt;a href="https://sevalla.com/blog/building-modular-systems-laravel/" rel="noopener noreferrer"&gt;https://sevalla.com&lt;/a&gt;&lt;br&gt;
[13] &lt;a href="https://www.iflair.com/laravel-modular-monolith-the-powerful-architecture-you-need/" rel="noopener noreferrer"&gt;https://www.iflair.com&lt;/a&gt;&lt;br&gt;
[14] &lt;a href="https://filamentphp.com/docs/5.x/advanced/modular-architecture" rel="noopener noreferrer"&gt;https://filamentphp.com&lt;/a&gt;&lt;br&gt;
[15] &lt;a href="https://ilyaskazi.medium.com/domain-driven-design-ddd-in-laravel-a-practical-guide-with-real-world-examples-7ef4b7f75896" rel="noopener noreferrer"&gt;https://ilyaskazi.medium.com&lt;/a&gt;&lt;br&gt;
[16] &lt;a href="https://www.youtube.com/watch?v=83mskSQnkWI&amp;amp;t=2" rel="noopener noreferrer"&gt;https://www.youtube.com&lt;/a&gt;&lt;br&gt;
[17] &lt;a href="https://dev.to/xwero/laravel-modular-folder-structure-4a94"&gt;https://dev.to&lt;/a&gt;&lt;br&gt;
[18] &lt;a href="https://medium.com/@ogitog/understanding-domain-driven-design-with-laravel-and-php-9fab206ff2fb" rel="noopener noreferrer"&gt;https://medium.com&lt;/a&gt;&lt;br&gt;
[19] &lt;a href="https://www.port.io/glossary/domain-driven-design" rel="noopener noreferrer"&gt;https://www.port.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn more about Laravel Architecture &amp;amp; Design Patterns:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://medium.com/@paulofelipemartins/laravel-best-practices-solid-clean-architecture-design-patterns-c0fab56fe40c" rel="noopener noreferrer"&gt;Laravel Best Practices: SOLID, Clean Architecture &amp;amp; Design Patterns&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@harryespant/implementing-domain-driven-architecture-in-laravel-setup-advantages-and-practical-use-cases-5eac6dfeffaa" rel="noopener noreferrer"&gt;Implementing Domain-Driven Architecture in Laravel: Setup, Advantages, and Practical Use Cases&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to scale a Laravel PHP app like Facebook or Twitter (X)</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Sat, 02 May 2026 13:29:15 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/how-to-scale-a-laravel-php-app-like-facebook-or-twitter-x-2d88</link>
      <guid>https://dev.to/abdulsalamamtech/how-to-scale-a-laravel-php-app-like-facebook-or-twitter-x-2d88</guid>
      <description>&lt;p&gt;Scaling a Laravel application to handle high traffic like Facebook or Twitter requires a shift from a single-server setup to a horizontally scaled, stateless architecture. Key strategies include using Load Balancers (AWS/DigitalOcean), Redis for caching/sessions, database read/write splitting, queueing heavy tasks, and implementing Laravel Octane for performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Scaling Strategies:
&lt;/h2&gt;

&lt;p&gt;Horizontal Scaling (Load Balancing): Distribute traffic across multiple application servers using a load balancer. Ensure the application is stateless (e.g., storing sessions in Redis/database rather than locally).&lt;/p&gt;

&lt;h3&gt;
  
  
  Database Optimization:
&lt;/h3&gt;

&lt;p&gt;Read/Write Splitting: Use a primary database for writes and multiple replicas for reads.&lt;/p&gt;

&lt;p&gt;You must have actual database replication (Master-Slave) set up at the server level (e.g., via AWS RDS , DigitalOcean, or manual MySQL configuration). Laravel does not perform the data synchronization itself; it only directs the traffic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="s1"&gt;'mysql'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'driver'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'mysql'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'read'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'host'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'192.168.1.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Replica 1&lt;/span&gt;
            &lt;span class="s1"&gt;'192.168.1.2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Replica 2&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'write'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'host'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'192.168.1.3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Primary&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'sticky'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Essential for data consistency&lt;/span&gt;
    &lt;span class="s1"&gt;'driver'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'mysql'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'database'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_DATABASE'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'forge'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'username'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_USERNAME'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'forge'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'password'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_PASSWORD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="c1"&gt;// ... other options&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://laravel.com/docs/13.x/database#read-and-write-connections" rel="noopener noreferrer"&gt;Laravel read and write docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=3CCwxLS8cB8" rel="noopener noreferrer"&gt;How to scale Laravel: beyond the basics (Advanced Laravel Scaling)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://webmobtech.com/blog/how-to-build-high-performance-scalable-laravel-app-best-practices" rel="noopener noreferrer"&gt;How to Build a High-Performance, Scalable Laravel App&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Considerations&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sticky Connections: Setting 'sticky' =&amp;gt; true ensures that once a write operation occurs during a request, all subsequent read operations for that same request use the write connection. This prevents issues where a user saves data but cannot immediately see it due to replication lag on the read replicas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Load Balancing: Laravel will automatically choose a random host from the read array for each request, effectively load balancing your database traffic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replication Setup: Laravel manages the application-level routing of queries, but you must independently configure your database servers (like MySQL  or PostgreSQL) for Master-Slave replication so that data from the primary node is synced to the replicas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model Specificity: If you need a specific Eloquent model to always use a particular connection (other than the default), you can define the $connection property directly in the model class.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transaction Handling: Database transactions in Laravel automatically use the write connection to ensure atomicity and consistency.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Indexing &amp;amp; Query Optimization: Add indexes for common queries, avoid table scans, and use eager loading (e.g., with()) to prevent N+1 query issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Caching Strategy:
&lt;/h3&gt;

&lt;p&gt;Redis: Use Redis for caching, session management, and queue management to reduce database load.&lt;/p&gt;

&lt;p&gt;Cache Data: Cache expensive queries, API responses, and frequently accessed data.&lt;/p&gt;

&lt;p&gt;Laravel Caching: Use &lt;code&gt;php artisan config:cache&lt;/code&gt; and &lt;code&gt;php artisan route:cache&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Queues and Asynchronous Processing:
&lt;/h3&gt;

&lt;p&gt;Offload slow tasks (e.g., sending emails, processing images) to queues using Redis or Amazon SQS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Content and Asset Management:
&lt;/h3&gt;

&lt;p&gt;CDN: Use a Content Delivery Network (e.g., Cloudflare, CloudFront) to serve images, CSS, and JavaScript.&lt;/p&gt;

&lt;p&gt;Cloud Storage: Use Amazon S3 or similar services for storing user-uploaded media instead of local storage.&lt;/p&gt;

&lt;h3&gt;
  
  
  High Performance Engine:
&lt;/h3&gt;

&lt;p&gt;Laravel Octane: Utilize Octane with Swoole or RoadRunner to keep the application in memory, significantly increasing request throughput.&lt;/p&gt;

&lt;h3&gt;
  
  
  Infrastructure Requirements:
&lt;/h3&gt;

&lt;p&gt;Stateless Apps: Ensure FILESYSTEM_DRIVER is set to s3 or similar.Database Scaling: For massive scale, look beyond master-slave replication into partitioning or adopting NoSQL for specific use cases.&lt;/p&gt;

&lt;p&gt;Monitoring: Implement tools like Laravel Telescope or third-party solutions to monitor performance.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Resolving GitHub conflict: merge, rebase and fast-forward only</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Wed, 19 Nov 2025 14:02:47 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/resolving-github-conflict-merge-rebase-and-fast-forward-only-50fj</link>
      <guid>https://dev.to/abdulsalamamtech/resolving-github-conflict-merge-rebase-and-fast-forward-only-50fj</guid>
      <description>&lt;p&gt;Difference between:&lt;/p&gt;

&lt;p&gt;hint: git config pull.rebase false # merge&lt;br&gt;
hint: git config pull.rebase true # rebase&lt;br&gt;
hint: git config pull.ff only #&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklkjdvzcjmy9bx0k03q8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklkjdvzcjmy9bx0k03q8.png" alt=" " width="800" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll explain the three git pull strategies and help you choose the best one for your situation:&lt;/p&gt;

&lt;p&gt;Updated todo list&lt;/p&gt;

&lt;p&gt;Three Git Pull Strategies Explained&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;pull.rebase false (Merge Strategy) 🔀&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;git config pull.rebase false&lt;br&gt;
What it does:&lt;/p&gt;

&lt;p&gt;Creates a merge commit when pulling changes&lt;br&gt;
Combines your local commits with remote commits&lt;br&gt;
Preserves full history of both branches&lt;br&gt;
Visual:&lt;/p&gt;

&lt;p&gt;Before pull:  Local:  A — B — C  Remote: A — X — YAfter pull:  A — B — C — M (merge commit)       \   /        X — Y&lt;br&gt;
Pros:&lt;br&gt;
✅ Full history preserved&lt;br&gt;
✅ Easy to see when integrations happened&lt;br&gt;
✅ Safe for collaborative work&lt;/p&gt;

&lt;p&gt;Cons:&lt;br&gt;
❌ Messy commit graph with many merge commits&lt;br&gt;
❌ Harder to read git log&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;pull.rebase true (Rebase Strategy) 📚&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;git config pull.rebase true&lt;br&gt;
What it does:&lt;/p&gt;

&lt;p&gt;Replays your local commits on top of remote changes&lt;br&gt;
Creates a linear history (no merge commits)&lt;br&gt;
Rewrites commit history&lt;br&gt;
Visual:&lt;/p&gt;

&lt;p&gt;Before pull:  Local:  A — B — C  Remote: A — X — YAfter pull:  A — X — Y — B' — C'&lt;br&gt;
Pros:&lt;br&gt;
✅ Clean, linear history&lt;br&gt;
✅ Easier to read and understand flow&lt;br&gt;
✅ No merge commit clutter&lt;/p&gt;

&lt;p&gt;Cons:&lt;br&gt;
❌ Rewrites history (changes commit hashes)&lt;br&gt;
❌ Can cause issues if commits are already pushed&lt;br&gt;
⚠️ Slightly risky if you don't understand rebase&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;pull.ff only (Fast-Forward Only) ⚡&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;git config pull.ff only&lt;br&gt;
What it does:&lt;/p&gt;

&lt;p&gt;Only allows fast-forward merges (linear history without new commits)&lt;br&gt;
Rejects any pull that would require a merge or rebase&lt;br&gt;
Forces you to manually resolve conflicts&lt;br&gt;
Visual:&lt;/p&gt;

&lt;p&gt;✅ ALLOWED (fast-forward):  &lt;/p&gt;

&lt;p&gt;Local:  A — B — C  &lt;br&gt;
Remote: A — B — C — X — Y  &lt;br&gt;
Result: A — B — C — X — Y❌ &lt;/p&gt;

&lt;p&gt;REJECTED (non-fast-forward):  &lt;br&gt;
Local:  A — B — C  &lt;br&gt;
Remote: A — X — Y  → Pull fails! You must rebase or merge manually&lt;/p&gt;

&lt;p&gt;Pros:&lt;br&gt;
✅ Guarantees clean, linear history&lt;br&gt;
✅ Forces intentional conflict resolution&lt;br&gt;
✅ No accidental messy merges&lt;/p&gt;

&lt;p&gt;Cons:&lt;br&gt;
❌ Very strict; many pulls will fail&lt;br&gt;
❌ Requires extra manual steps&lt;br&gt;
❌ Not ideal for team collaboration&lt;/p&gt;

&lt;p&gt;📊 Comparison Table&lt;br&gt;
Feature merge   rebase  ff only&lt;br&gt;
History shape   Non-linear (branchy)    Linear  Linear&lt;br&gt;
Merge commits&lt;br&gt;&lt;br&gt;
✅ Created &lt;br&gt;
❌ None&lt;br&gt;&lt;br&gt;
❌ None&lt;/p&gt;

&lt;p&gt;Rewrites commits&lt;br&gt;&lt;br&gt;
❌ No&lt;br&gt;&lt;br&gt;
✅ Yes Depends&lt;/p&gt;

&lt;p&gt;Easy to read git log&lt;br&gt;&lt;br&gt;
❌ No&lt;br&gt;&lt;br&gt;
✅ Yes &lt;br&gt;
✅ Yes&lt;/p&gt;

&lt;p&gt;Safe for shared branches&lt;br&gt;&lt;br&gt;
✅ Yes &lt;br&gt;
❌ No&lt;br&gt;&lt;br&gt;
✅ Yes&lt;/p&gt;

&lt;p&gt;Risk of conflicts   Low Medium  High&lt;br&gt;
Best for teams&lt;br&gt;&lt;br&gt;
✅ Yes &lt;br&gt;
❌ Not really&lt;br&gt;&lt;br&gt;
✅ Sometimes&lt;/p&gt;

&lt;p&gt;🎯 Recommendation for Your Situation&lt;br&gt;
For resolving your current merge conflict in api-docs.json:&lt;/p&gt;

&lt;p&gt;Use pull.rebase false (Merge) ← RECOMMENDED&lt;/p&gt;

&lt;p&gt;git config pull.rebase false&lt;br&gt;
Why?&lt;/p&gt;

&lt;p&gt;✅ You're working in a team repo (hngprojects/HNG-Portal-BE)&lt;br&gt;
✅ Your commits are likely already shared/pushed&lt;br&gt;
✅ Safe - doesn't rewrite history&lt;br&gt;
✅ Preserves the full narrative of changes&lt;br&gt;
✅ Standard practice for collaborative projects&lt;/p&gt;

&lt;p&gt;Your next steps:&lt;/p&gt;

&lt;p&gt;1. Resolve the conflict manually in api-docs.json (You need to combine the auth endpoints + job-types endpoints)&lt;/p&gt;

&lt;p&gt;2. Stage the resolved filegit add storage/api-docs/api-docs.json&lt;/p&gt;

&lt;p&gt;3. Complete the mergegit commit -m "Merge: resolve conflicts in api-docs.json - combine auth and job-types endpoints"# 4. Push to remotegit push origin feature/add-job-types&lt;/p&gt;

&lt;p&gt;Would you like me to:&lt;/p&gt;

&lt;p&gt;✅ Help you resolve the conflicts in the file manually?&lt;br&gt;
📝 Generate a merged version of api-docs.json with both sets of endpoints?&lt;br&gt;
🔍 Review what content exists in each branch first?&lt;br&gt;
Let me know which you prefer!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://share.google/aimode/Tg8IfStKYvxoySTxN" rel="noopener noreferrer"&gt;Learn more about git rebase&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>softwaredevelopment</category>
      <category>development</category>
      <category>abdulsalamamtech</category>
    </item>
    <item>
      <title>Building a medical emergency AI agent boot using A2A protocol for HNG backend stage.</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Mon, 03 Nov 2025 23:32:30 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/building-a-medical-emergency-ai-agent-boot-using-a2a-protocol-for-hng-backend-stage-2l99</link>
      <guid>https://dev.to/abdulsalamamtech/building-a-medical-emergency-ai-agent-boot-using-a2a-protocol-for-hng-backend-stage-2l99</guid>
      <description>&lt;p&gt;Building a medical emergency AI agent boot using A2A protocol for HNG backend stage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Motivation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building Emergent AI and AI Agent that answers medical emergency related questions and give tips on what to do based on described emergency.&lt;/p&gt;

&lt;p&gt;It is a difficult thing to exactly know what to do in different emergency situation, the data is already out their is just to have the exact information of what to do on different situation before help arise can save lives and property.&lt;/p&gt;

&lt;p&gt;I wanted to be able to have an AI agent that can easily guide someone through this situation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech stack:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PHP/Laravel&lt;br&gt;
Laragent library&lt;br&gt;
Railway&lt;/p&gt;

&lt;p&gt;In short Emergent is a chat bot that answers #medical #emergency related questions &amp;amp; help with tips!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System design:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;User Message &lt;span class="o"&gt;(&lt;/span&gt;Telex&lt;span class="o"&gt;)&lt;/span&gt;
    ↓
JSON-RPC 2.0 Request
    ↓
Railway App Service &lt;span class="o"&gt;(&lt;/span&gt;NGINX Server&lt;span class="o"&gt;)&lt;/span&gt;
    ↓
Laravel Framework &amp;amp; API
    ↓
Gemini AI Agent
    ↓
Format &amp;amp; Return
    ↓
A2A Response
    ↓
Telex.im Display
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;💻 Building the Agent:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I set up Laravel&lt;br&gt;
Install Laragent&lt;br&gt;
Register my API KEY on Gemini&lt;br&gt;
Add the API_KEY to my .env file&lt;br&gt;
I test the agent ability&lt;br&gt;
I Implement the A2A Protocol&lt;br&gt;
I test it again&lt;br&gt;
I push to GitHub and deployed to Railway&lt;br&gt;
Result&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The challenges:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  I wasn't able to understand how a2a works.
&lt;em&gt;I go through the documentation and articles multiple times.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  I wast not getting the right message.
&lt;em&gt;I went on to test and debug the codebase again.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  Other AI model I used wasn't working.
&lt;em&gt;I tried multiple LLM before finally using Gemini.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  Formatting the response and error.
&lt;em&gt;I created different methods to format the responses for error and success.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  I have production error while deploying to Railway.
&lt;em&gt;I changed the PHP version from 8.2 to 8.3.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  I wasn't able to integrate it with telex.
&lt;em&gt;An article and step by step guide was later sent to the slack group that is want I used to be able to setup my Agent.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Response agent api time &amp;lt;500ms&lt;br&gt;
Total response time ~2-3s&lt;br&gt;
Uptime 99.9%&lt;br&gt;
Success rate 99%&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building Emergent AI Agent allow people to be able to seek emergency tips before help arrive and I was able to work on something extra-ordinary using AI and combining it with a technology new to me Telex A2A protocol.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect with me:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/abdulsalamamtech/hng-stage-3" rel="noopener noreferrer"&gt;https://github.com/abdulsalamamtech/hng-stage-3&lt;/a&gt;&lt;br&gt;
X (Twitter): &lt;a href="https://x.com/abdulsalamtech" rel="noopener noreferrer"&gt;https://x.com/abdulsalamtech&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://linkedin.com/in/abdulsalamamtech" rel="noopener noreferrer"&gt;https://linkedin.com/in/abdulsalamamtech&lt;/a&gt;&lt;br&gt;
Facebook: &lt;a href="https://facebook.com/abdulsalamamtech" rel="noopener noreferrer"&gt;https://facebook.com/abdulsalamamtech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>showdev</category>
      <category>ai</category>
      <category>laravel</category>
    </item>
    <item>
      <title>Different type of action to take on delete in Laravel database migration</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Wed, 29 Oct 2025 11:01:36 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/different-type-of-action-to-take-on-delete-in-laravel-database-migration-348o</link>
      <guid>https://dev.to/abdulsalamamtech/different-type-of-action-to-take-on-delete-in-laravel-database-migration-348o</guid>
      <description>&lt;p&gt;Different type of action to take on delete in Laravel database migration.&lt;/p&gt;

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

&lt;p&gt;When defining a foreign key in a Laravel migration, the &lt;strong&gt;onDelete&lt;/strong&gt; method determines what happens to the child records when the parent record is deleted. This allows you to manage data integrity at the database level. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here are the different types of onDelete actions you can use:&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  cascade
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;CASCADE&lt;/strong&gt; action will automatically delete all child records when their parent record is deleted. This is useful for "has many" relationships &lt;em&gt;where the child records are meaningless&lt;/em&gt; without the parent. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example: If a user is deleted, all of their posts are also deleted. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Migration code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreignId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;constrained&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;cascadeOnDelete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Migration code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;references&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cascade'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  set null
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;SET NULL&lt;/strong&gt; action will set the foreign key on all child records to null when the parent record is deleted. This is useful for optional relationships &lt;em&gt;where the child record can still exist without the parent&lt;/em&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example: When a user is deleted, the user_id on their posts is set to null, allowing the posts to remain without an author.
&lt;strong&gt;Note:&lt;/strong&gt; Requirement: The foreign key column must be set as nullable() in the migration. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Migration code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreignId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;constrained&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullOnDelete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Migration code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unsignedBigInteger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;references&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'set null'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  restrict
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;RESTRICT&lt;/strong&gt; action &lt;em&gt;prevents the parent record from being deleted as long as there are still child records referencing it&lt;/em&gt;. This is the default behavior if no onDelete action is specified. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example: If a category has associated products, you cannot delete the category until all products have been re-assigned or deleted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Migration code: No onDelete method is called.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreignId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;constrained&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;# OR&lt;/span&gt;

&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;references&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'categories'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'restrict'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  no action
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;NO ACTION&lt;/strong&gt; action is similar to RESTRICT. It defers the integrity check until the end of the transaction, but in practice, most database engines implement it the same way as RESTRICT. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migration code: You can explicitly add this, though RESTRICT or no action is sufficient.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;references&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'no action'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Choosing the right onDelete action&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Delete all child records&lt;/td&gt;
&lt;td&gt;cascade&lt;/td&gt;
&lt;td&gt;Deleting a user should also delete all of their comments.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keep child records and unset the foreign key&lt;/td&gt;
&lt;td&gt;set null&lt;/td&gt;
&lt;td&gt;Deleting an author should keep their articles, with the author field becoming blank.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prevent deletion until child records are removed&lt;/td&gt;
&lt;td&gt;restrict&lt;/td&gt;
&lt;td&gt;You cannot delete a product category if products are still assigned to it.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is also similar to on update.&lt;/p&gt;

&lt;p&gt;Have a nice day!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>ondelete</category>
      <category>abdulsalamamtech</category>
    </item>
    <item>
      <title>Deloy Next or React App to VPS</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Sat, 22 Mar 2025 20:55:28 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/deloy-next-or-react-app-to-vps-2ald</link>
      <guid>https://dev.to/abdulsalamamtech/deloy-next-or-react-app-to-vps-2ald</guid>
      <description>&lt;p&gt;&lt;strong&gt;Step by Step how to deploy next or react application to vps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A. &lt;strong&gt;Login to your VPS&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ssh user@hostname
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;B. &lt;strong&gt;Generate SSH public key and add it to your GitHub project&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat ~/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C. &lt;strong&gt;Clone the project to your VPS&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clone git@github.com:username/project.git
cd project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;D. &lt;strong&gt;Install all necessary packages&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
npm run build
npm install pm2 --save-dev
npx pm2 start npm --name my-project -- start -- --port=3001
npx pm2 restart my-project
npx pm2 save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sometime this work's for vite application&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx pm2 start npm --name app-name -- run dev -- --port=3001
npx pm2 save
npx pm2 status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Use this on CD like GitHub action&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx pm2 restart app-name
npx pm2 save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E. &lt;strong&gt;Visit the application on the provided port&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://hostname:3001

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Congratulations Your Website is live!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Note: There are some necessary adjustments you need to make based on the type of OS and application on the VPS.&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/abdulsalamamtech"&gt;@abdulsalamamtech&lt;/a&gt; #vps #deploy #next #react&lt;/p&gt;

</description>
      <category>abdulsalamamtech</category>
      <category>vps</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>A comprehensive guide on how to deploy laravel application to vps, using github action, ssh key, server permissions and more.</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Wed, 05 Mar 2025 23:01:14 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/a-comprehensive-guide-on-how-to-deploy-laravel-application-to-vps-using-github-action-ssh-key-15g3</link>
      <guid>https://dev.to/abdulsalamamtech/a-comprehensive-guide-on-how-to-deploy-laravel-application-to-vps-using-github-action-ssh-key-15g3</guid>
      <description>&lt;h1&gt;
  
  
  Comprehensive Laravel Deployment Guide with GitHub Actions and VPS
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Hostinger
&lt;/h2&gt;

&lt;p&gt;link to &lt;a href="https://www.hostinger.com/tutorials/how-to-deploy-laravel" rel="noopener noreferrer"&gt;hostinger blog post on how to deploy laravel on vps&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A GitHub repository with your Laravel project&lt;/li&gt;
&lt;li&gt;A VPS (Virtual Private Server) running Linux (Ubuntu recommended)&lt;/li&gt;
&lt;li&gt;SSH access to your VPS&lt;/li&gt;
&lt;li&gt;Basic understanding of Git, Laravel, and terminal commands&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Prepare Your Local Development Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 Ensure Your Laravel Project is Ready
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Make sure your project is in a GitHub repository&lt;/li&gt;
&lt;li&gt;Check your &lt;code&gt;.gitignore&lt;/code&gt; file to exclude unnecessary files:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
.env
.env.backup
.phpunit.result_cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.2 Prepare Environment Configuration
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;.env.production&lt;/code&gt; file with production-specific configurations&lt;/li&gt;
&lt;li&gt;Ensure sensitive information is not hardcoded&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2: Set Up SSH Keys for GitHub Actions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Generate SSH Keys on Your Local Machine
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate a new SSH key specifically for GitHub Actions&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"github-actions-deployment"&lt;/span&gt;

&lt;span class="c"&gt;# Save the key in a specific location, e.g., ~/.ssh/github_actions_key&lt;/span&gt;
&lt;span class="c"&gt;# Do NOT use a passphrase for automated deployment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 Set Up SSH on VPS
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Connect to your VPS via SSH
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh root@your_vps_ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create a deployment user
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a new user for deployments&lt;/span&gt;
adduser deployer

&lt;span class="c"&gt;# Give sudo privileges (use carefully)&lt;/span&gt;
usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;deployer

&lt;span class="c"&gt;# Switch to deployer user&lt;/span&gt;
su - deployer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Set up SSH directory for the deployer user
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.ssh
&lt;span class="nb"&gt;chmod &lt;/span&gt;700 ~/.ssh
&lt;span class="nb"&gt;touch&lt;/span&gt; ~/.ssh/authorized_keys
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.3 Configure GitHub Repository Secrets
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to your GitHub repository&lt;/li&gt;
&lt;li&gt;Navigate to Settings &amp;gt; Secrets and variables &amp;gt; Actions&lt;/li&gt;
&lt;li&gt;Add the following secrets:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;VPS_HOST&lt;/code&gt;: Your VPS IP address&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VPS_PORT&lt;/code&gt;: SSH port (default 22)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VPS_USER&lt;/code&gt;: deployer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SSH_PRIVATE_KEY&lt;/code&gt;: Content of the private key generated in step 2.1&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SERVER_DESTINATION&lt;/code&gt;: Path on server (e.g., &lt;code&gt;/home/deployer/your-app&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DEPLOYMENT_ENV_FILE&lt;/code&gt;: Base64 encoded production &lt;code&gt;.env&lt;/code&gt; file contents&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 3: Prepare VPS for Laravel Deployment *[Skip to step 4 if you are using any VPS panel]
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Install Required Software
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Update system&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# Install PHP and extensions&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; php8.2-fpm php8.2-cli php8.2-common php8.2-mysql php8.2-zip php8.2-gd php8.2-mbstring php8.2-curl php8.2-xml php8.2-bcmath

&lt;span class="c"&gt;# Install Composer&lt;/span&gt;
curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://getcomposer.org/installer | php
&lt;span class="nb"&gt;sudo mv &lt;/span&gt;composer.phar /usr/local/bin/composer

&lt;span class="c"&gt;# Install Nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nginx

&lt;span class="c"&gt;# Install MySQL (if not already installed)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; mysql-server

&lt;span class="c"&gt;# Install Node.js and NPM&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://deb.nodesource.com/setup_lts.x | &lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; bash -
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 Configure Nginx
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create Nginx configuration
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;your-domain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/home/deployer/your-app/public&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.php&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;charset&lt;/span&gt; &lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="n"&gt;/index.php?&lt;/span&gt;&lt;span class="nv"&gt;$query_string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;/favicon.ico&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;log_not_found&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;/robots.txt&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;log_not_found&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;error_page&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="n"&gt;/index.php&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;\.php$&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;fastcgi_pass&lt;/span&gt; &lt;span class="s"&gt;unix:/var/run/php/php8.2-fpm.sock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;fastcgi_index&lt;/span&gt; &lt;span class="s"&gt;index.php&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;fastcgi_param&lt;/span&gt; &lt;span class="s"&gt;SCRIPT_FILENAME&lt;/span&gt; &lt;span class="nv"&gt;$realpath_root$fastcgi_script_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="s"&gt;fastcgi_params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;/\.(?!well-known).*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Enable configuration
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/your-app /etc/nginx/sites-enabled/
&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Create GitHub Actions Workflow *[Continue from here if you are using VPS panel on your server]
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Create Workflow File
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.github/workflows/laravel-deploy.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Laravel Deployment&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup PHP&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shivammathur/setup-php@v2&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;php-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;8.2'&lt;/span&gt;
        &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mbstring, bcmath, zip&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Composer Dependencies&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install NPM Dependencies&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build Frontend&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run build&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prepare Environment File&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;echo "${{ secrets.DEPLOYMENT_ENV_FILE }}" | base64 --decode &amp;gt; .env&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to VPS&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/ssh-action@master&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.VPS_HOST }}&lt;/span&gt;
        &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.VPS_USER }}&lt;/span&gt;
        &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_PRIVATE_KEY }}&lt;/span&gt;
        &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;cd ${{ secrets.SERVER_DESTINATION }}&lt;/span&gt;
          &lt;span class="s"&gt;git pull origin main&lt;/span&gt;
          &lt;span class="s"&gt;composer install --no-interaction&lt;/span&gt;
          &lt;span class="s"&gt;php artisan migrate --force&lt;/span&gt;
          &lt;span class="s"&gt;php artisan config:clear&lt;/span&gt;
          &lt;span class="s"&gt;php artisan cache:clear&lt;/span&gt;
          &lt;span class="s"&gt;npm install&lt;/span&gt;
          &lt;span class="s"&gt;npm run build&lt;/span&gt;
          &lt;span class="s"&gt;sudo systemctl restart nginx&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5: Final VPS Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Set Up Git on VPS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /home/deployer/your-app
git init
git remote add origin https://github.com/your-username/your-repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.2 Set Permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; deployer:deployer /home/deployer/your-app
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /home/deployer/your-app
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 775 /home/deployer/your-app/storage
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 775 /home/deployer/your-app/bootstrap/cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Database Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create MySQL database&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;mysql
CREATE DATABASE your_database_name&lt;span class="p"&gt;;&lt;/span&gt;
CREATE USER &lt;span class="s1"&gt;'your_username'&lt;/span&gt;@&lt;span class="s1"&gt;'localhost'&lt;/span&gt; IDENTIFIED BY &lt;span class="s1"&gt;'your_password'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
GRANT ALL PRIVILEGES ON your_database_name.&lt;span class="k"&gt;*&lt;/span&gt; TO &lt;span class="s1"&gt;'your_username'&lt;/span&gt;@&lt;span class="s1"&gt;'localhost'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
FLUSH PRIVILEGES&lt;span class="p"&gt;;&lt;/span&gt;
EXIT&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Check GitHub Actions logs for specific errors&lt;/li&gt;
&lt;li&gt;Verify SSH key permissions&lt;/li&gt;
&lt;li&gt;Ensure all secrets are correctly set&lt;/li&gt;
&lt;li&gt;Check Nginx and PHP-FPM logs for deployment issues&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security Recommendations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use strong, unique passwords&lt;/li&gt;
&lt;li&gt;Keep your system and dependencies updated&lt;/li&gt;
&lt;li&gt;Configure firewall (UFW)&lt;/li&gt;
&lt;li&gt;Use SSH key authentication&lt;/li&gt;
&lt;li&gt;Limit sudo access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;if you need more elaboration on any specific part of this comprehensive deployment guide, paste on the comment section.&lt;/p&gt;

</description>
      <category>abdulsalamamtech</category>
      <category>laravel</category>
      <category>githubactions</category>
      <category>vps</category>
    </item>
    <item>
      <title>Level Up Your AI Knowledge: Tools, Tips, and Influencers to Watch</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Tue, 01 Oct 2024 23:00:00 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/level-up-your-ai-knowledge-tools-tips-and-influencers-to-watch-3p32</link>
      <guid>https://dev.to/abdulsalamamtech/level-up-your-ai-knowledge-tools-tips-and-influencers-to-watch-3p32</guid>
      <description>&lt;h3&gt;
  
  
  The Rapid Pace of AI Development
&lt;/h3&gt;

&lt;p&gt;The field of AI is advancing at an unprecedented pace. New tools, techniques, and applications are constantly emerging, making it a challenge to stay current. However, keeping up with these developments is crucial for anyone involved in AI. The most powerful AI model to date, &lt;a href="https://openai.com/index/gpt-4o-and-more-tools-to-chatgpt-free/" rel="noopener noreferrer"&gt;GPT-4o&lt;/a&gt;, was released for free. GPTs are now publicly available, and video generation has evolved leaps and bounds (see &lt;a href="https://kling.kuaishou.com/" rel="noopener noreferrer"&gt;Kling&lt;/a&gt; and &lt;a href="https://deepmind.google/technologies/veo/" rel="noopener noreferrer"&gt;VEO&lt;/a&gt;). &lt;a href="https://www.udio.com/announcements" rel="noopener noreferrer"&gt;Udio&lt;/a&gt; added features like editing lyrics after you have created a song and allowing you to use your own audio clip to make music.&lt;/p&gt;

&lt;h3&gt;
  
  
  Staying Informed
&lt;/h3&gt;

&lt;p&gt;To stay current with the latest trends and news in AI, here are some valuable resources – some of which are technical for those who like that kind of thing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.technologyreview.com/topic/artificial-intelligence/" rel="noopener noreferrer"&gt;MIT Technology Review - AI&lt;/a&gt;:&lt;/strong&gt; In-depth articles and analysis on the latest AI advancements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://towardsdatascience.com/" rel="noopener noreferrer"&gt;Towards Data Science&lt;/a&gt;:&lt;/strong&gt; A platform for sharing concepts, ideas, and codes in AI and data science.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://arxiv.org/list/cs.AI/recent" rel="noopener noreferrer"&gt;arXiv&lt;/a&gt;:&lt;/strong&gt; Access to the latest research papers and technical reports in AI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stay Connected with Leading AI Content Creators
&lt;/h3&gt;

&lt;p&gt;To stay updated with the latest trends and insights in AI, follow these influential content creators:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://twitter.com/mattfarmerai" rel="noopener noreferrer"&gt;Matt Farmer&lt;/a&gt;:&lt;/strong&gt; Shares his expertise on AI tools and marketing across various platforms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://twitter.com/techfren" rel="noopener noreferrer"&gt;Techfren&lt;/a&gt;:&lt;/strong&gt; Offers cutting-edge coding and AI reviews and tutorials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://twitter.com/thebrandnat" rel="noopener noreferrer"&gt;Brand Nat&lt;/a&gt;:&lt;/strong&gt; Brings insightful AI discussions related to AI productivity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://twitter.com/rajivshah" rel="noopener noreferrer"&gt;Rajiv Shah&lt;/a&gt;:&lt;/strong&gt; Provides deep dives into AI research and more fun AI content on TikTok.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://twitter.com/rachel_l_woods" rel="noopener noreferrer"&gt;Rachel Woods&lt;/a&gt;:&lt;/strong&gt; Regularly discusses AI business automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI for Good
&lt;/h3&gt;

&lt;p&gt;As you continue your journey in the AI world, remember AI’s potential to bring about positive change and its potential for harm. Whether improving healthcare, enhancing education, or addressing environmental challenges, AI can be a powerful force for good. Be mindful of ethical considerations and strive to use AI that is inclusive, fair, and beneficial to all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Being Community Champions
&lt;/h3&gt;

&lt;p&gt;You are now equipped to be champions of AI in your communities. Share your knowledge, mentor others, and contribute to discussions about the ethical use of AI. We can create an African AI voice by fostering a community of informed and responsible AI users in Africa.&lt;/p&gt;

&lt;p&gt;I share AI content on my &lt;a href="https://www.linkedin.com/in/abdulsalamamtech/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; other &lt;a href="https://bit.ly/abdulsalamamtech" rel="noopener noreferrer"&gt;social media&lt;/a&gt; every Wednesday. &lt;/p&gt;

&lt;p&gt;Let's use AI to make a positive impact on our world!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>how to share your project as a software developer</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Wed, 31 Jul 2024 10:02:33 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/how-to-share-your-project-as-a-software-developer-24a2</link>
      <guid>https://dev.to/abdulsalamamtech/how-to-share-your-project-as-a-software-developer-24a2</guid>
      <description>&lt;h1&gt;
  
  
  How to share your project as a software developer
&lt;/h1&gt;

&lt;p&gt;Sometimes you might what to share your software project or design to people for reviews or to encourage upcoming developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Below are some important steps to consider:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0gmsxzyy8h51se40v5f.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0gmsxzyy8h51se40v5f.jpeg" alt="Image description" width="206" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;screen shots&lt;/li&gt;
&lt;li&gt;project name&lt;/li&gt;
&lt;li&gt;brief description&lt;/li&gt;
&lt;li&gt;inspiration (add links if available)&lt;/li&gt;
&lt;li&gt;what it does&lt;/li&gt;
&lt;li&gt;how you built it&lt;/li&gt;
&lt;li&gt;challenges you ran into&lt;/li&gt;
&lt;li&gt;accomplishments that you're proud of&lt;/li&gt;
&lt;li&gt;what you learned&lt;/li&gt;
&lt;li&gt;what's next for the project&lt;/li&gt;
&lt;li&gt;tech stack (what it's built with)&lt;/li&gt;
&lt;li&gt;repo, demo or live URL links to try out&lt;/li&gt;
&lt;li&gt;appreciation to supervisor, mentor, guidance, or team members&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Below is a sample and step by step guide:
&lt;/h2&gt;

&lt;p&gt;I'm using my project as a sample for you guys.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6f0bm04rc3biyojyx7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6f0bm04rc3biyojyx7c.png" alt="Image description" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;screen shots&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;project name&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My portfolio.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;brief description&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My portfolio website contains information about me, my projects and contact form.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;inspiration (add links if available)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This project was inspired by my mentor portfolio website, Mr. Wakili Almustapha Abdullahi (&lt;a href="https://wakili.netlify.app/" rel="noopener noreferrer"&gt;https://wakili.netlify.app/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;what it does&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This project shows some of my recent projects to visitors and potential client as a proof to verify my potentials and skills.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;how you built it&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The project was built with HTML, CSS and JavaScript for its functionality, it is deployed to GitHub and hosted on Netlify.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;challenges you ran into.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I face some issues hosting this project to Netlify because it was my first time doing so. As a result, I had to do some research on how to host it on Netlify, which required additional time and effort for me to complete.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;accomplishments that you're proud of&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I am happy, I was able to host my portfolio website and share the URL to the public, friends and family to go through.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;what you learned&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I learnt a lot from this project from being able to use Git and GitHub to hosting my portfolio online for people to see.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;what's next for the project&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding some functionality with JavaScript and some useful content like, testimonial and downloadable resume.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tech stack (what it is built with)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML, CSS, JS, GIT, GITHUB, Netlify.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;repo, demo or live URL links to try out&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/abdulsalamamtech/" rel="noopener noreferrer"&gt;https://github.com/abdulsalamamtech/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live URL: &lt;a href="https://abdulsalamamtech.netlify.app/" rel="noopener noreferrer"&gt;https://abdulsalamamtech.netlify.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;YouTube Demo: &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;appreciation to supervisor, mentor, guidance, or team members&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This project was supervised by my mentor Mr. Abdulsalam and Mr. Muhammed, I truly appreciate their support and mentorship, they are the one that motivate me to move out of my comfort zone.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What else?
&lt;/h2&gt;

&lt;p&gt;You are now done with the guide on how to share your project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now follow and use the steps above:&lt;/li&gt;
&lt;li&gt;Push your project to &lt;a href="https://www.github.com" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Share your project on &lt;a href="https://www.linkedin.com" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;You can also tag me &lt;a class="mentioned-user" href="https://dev.to/abdulsalamamtech"&gt;@abdulsalamamtech&lt;/a&gt; on &lt;a href="https://www.linkedin.com/in/abdulsalamamtech" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>softwaredevelopment</category>
      <category>projectreview</category>
      <category>portfolio</category>
      <category>abdulsalamamtech</category>
    </item>
    <item>
      <title>AI for Good: Harnessing Technology for Positive Change</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Wed, 24 Jul 2024 06:00:00 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/ai-for-good-harnessing-technology-for-positive-change-fp7</link>
      <guid>https://dev.to/abdulsalamamtech/ai-for-good-harnessing-technology-for-positive-change-fp7</guid>
      <description>&lt;h1&gt;
  
  
  The AI Train is Leaving the Station (But You Can Still Catch Up!)
&lt;/h1&gt;

&lt;p&gt;The world of AI is moving faster than ever before. New tools, techniques, and mind-blowing applications are popping up all the time. It can feel like you need a jetpack just to keep up! But fear not, fellow AI enthusiasts – staying informed is crucial, and luckily, it doesn't have to be a chore.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI's Greatest Hits (So Far!)
&lt;/h2&gt;

&lt;p&gt;Let's talk about some recent breakthroughs that are changing the game. The release of GPT-4, arguably the most powerful AI model to date, is a game-changer. And guess what? GPTs are now freely available for tinkerers and creators like you! Video generation has also taken a giant leap forward (check out Kling and VEO for some mind-bending examples). But wait, there's more! Udio just upped its game with features like post-creation lyric editing and the ability to use your own audio clips to make music.&lt;/p&gt;

&lt;h2&gt;
  
  
  Staying in the AI Know
&lt;/h2&gt;

&lt;p&gt;Want to keep your finger on the pulse of AI advancements? Here are some amazing resources (don't worry, there's something for everyone, even the code enthusiasts!):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MIT Technology Review - AI: Dive deep into articles and analysis from experts on the latest AI breakthroughs.&lt;/li&gt;
&lt;li&gt;Towards Data Science: This platform is like a playground for sharing ideas, concepts, and even code related to AI and data science.&lt;/li&gt;
&lt;li&gt;arXiv: Get access to the latest research papers and technical reports – perfect for those who love the nitty-gritty details.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Meet Your AI BFFs
&lt;/h2&gt;

&lt;p&gt;Sometimes, learning is more fun when you have a guide. Here are some amazing content creators who are passionate about sharing their AI knowledge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Matt Farmer: This AI whiz shares his expertise on AI tools and marketing across various platforms.&lt;/li&gt;
&lt;li&gt;Techfren: Get your coding fix with cutting-edge AI reviews and tutorials.&lt;/li&gt;
&lt;li&gt;Brand Nat: Looking for insightful discussions on AI and productivity? Brand Nat has you covered.&lt;/li&gt;
&lt;li&gt;Rajiv Shah: Dive deep into AI research with Rajiv, who also brings the fun factor to TikTok with engaging AI content.&lt;/li&gt;
&lt;li&gt;Rachel Woods: Stay on top of AI's impact on business automation with Rachel's insights.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI for Good: The Power to Change the World
&lt;/h2&gt;

&lt;p&gt;As you explore the fascinating world of AI, remember its immense potential for positive change. AI can be a powerful force for good, from improving healthcare and education to tackling environmental challenges. But with great power comes great responsibility! Let's strive to use AI ethically, ensuring it's inclusive, fair, and beneficial to everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Become an AI Champion in Your Community!
&lt;/h2&gt;

&lt;p&gt;Now that you're armed with knowledge, it's time to share it! Mentor others, participate in discussions about responsible AI use, and spread the word. Together, we can create a strong African voice in the AI conversation, fostering a community of informed and responsible AI users across the continent.&lt;/p&gt;

&lt;p&gt;This version uses a more conversational tone, highlights specific examples, and emphasizes the positive impact of AI. It also includes a call to action to encourage readers to get involved.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvumt452qiknvire8342u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvumt452qiknvire8342u.png" alt="Image description" width="672" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aiforgood</category>
      <category>abdulsalamamtech</category>
      <category>aiwednesday</category>
    </item>
    <item>
      <title>THE DIFFERENT BETWEEN LIBRARY AND FRAMEWORK AND NOT USING BOTH WITH REAL LIFE  ILLUSTRATIONS</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Thu, 27 Jun 2024 23:00:00 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/the-different-between-library-and-framework-and-not-using-both-with-real-life-illustrations-48o4</link>
      <guid>https://dev.to/abdulsalamamtech/the-different-between-library-and-framework-and-not-using-both-with-real-life-illustrations-48o4</guid>
      <description>&lt;p&gt;THE DIFFERENT BETWEEN LIBRARY AND FRAMEWORK&lt;br&gt;
AND NOT USING BOTH WITH REAL LIFE &lt;br&gt;
ILLUSTRATIONS&lt;/p&gt;

&lt;p&gt;It's sometimes very difficult to differentiate between library and framework on this small article, we are going to explain them both with some real-life illustrations.&lt;/p&gt;

&lt;p&gt;First, what is a library?&lt;br&gt;
Libraries are basically pre-programmed modules that can be used to speed up the development process. They typically do one specific thing.&lt;/p&gt;

&lt;p&gt;While frameworks are very similar to libraries, they are also pre-programmed, but instead of doing one specific thing, they are used to archive a lot of things at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real-life illustration is about you deciding to take bread and eggs for a break.
&lt;/h2&gt;

&lt;p&gt;There are many ways to get your breakfast ready; let's illustrate them.&lt;/p&gt;

&lt;h3&gt;
  
  
  This is an example of a framework:
&lt;/h3&gt;

&lt;p&gt;You can just go and get the bread and eggs from a grocery store, fry your egg, and toss your bread, and you are ready to go, no stress; it's time-efficient and stress-free.&lt;/p&gt;

&lt;h3&gt;
  
  
  This is an example of using libraries:
&lt;/h3&gt;

&lt;p&gt;What about if you want to make the bread on yourself?&lt;br&gt;
First, you need to get flour, butter, an oven, sugar, salt, yeast, milk, and many more.&lt;br&gt;
The sugar, salt, and yeasts have been processed, but you aren't doing it yourself, nor are you making your flow or oven.&lt;/p&gt;

&lt;p&gt;But you are not yet done; how long do you think? It's going to take you to make the bread and take your breakfast?&lt;/p&gt;

&lt;h3&gt;
  
  
  This is an example of building from scratch:
&lt;/h3&gt;

&lt;p&gt;What about if you want to make the bread and egg on your own?&lt;br&gt;
First, you need to train a chicken to arch the egg, you also need to plant and process casava for the flour and make your own butter and yeast, create or manufacture your own oven, plant and process sugarcane for your sugar, process your own salt, and many more.&lt;/p&gt;

&lt;p&gt;How stressful and time-consuming do you think this is?&lt;br&gt;
How many months is it going to take? a lot, right?&lt;/p&gt;

&lt;p&gt;This is just the difference between using a framework,&lt;br&gt;
library and building from scratch, respectively.&lt;/p&gt;

&lt;p&gt;Framework: take minimal time to archive your goals, which included a lot of different other libraries.&lt;/p&gt;

&lt;p&gt;Making bread with all the important ingredients is a lot; this is like building from scratch.&lt;/p&gt;

&lt;h3&gt;
  
  
  An example of building it yourself:
&lt;/h3&gt;

&lt;p&gt;is using CSS, JavaScript, or PHP on your website.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples of libraries:
&lt;/h3&gt;

&lt;p&gt;is using Tailwind and jQuery on your website.&lt;/p&gt;

&lt;h3&gt;
  
  
  An example of a framework:
&lt;/h3&gt;

&lt;p&gt;using Bootstrap, Angular, and Laravel on your website&lt;/p&gt;

&lt;p&gt;I hope you get the real message from this article.&lt;/p&gt;

&lt;p&gt;Thanks for reading through!&lt;/p&gt;

</description>
      <category>framework</category>
      <category>library</category>
      <category>development</category>
      <category>illustration</category>
    </item>
    <item>
      <title>Understanding Libraries vs. Frameworks: Real-Life Illustrations By AbdulsalamAmtech</title>
      <dc:creator>Abdulsalam Abdulrahman (Amtech Digital)</dc:creator>
      <pubDate>Mon, 24 Jun 2024 09:16:09 +0000</pubDate>
      <link>https://dev.to/abdulsalamamtech/understanding-libraries-vs-frameworks-real-life-illustrations-by-abdulsalamamtech-52cg</link>
      <guid>https://dev.to/abdulsalamamtech/understanding-libraries-vs-frameworks-real-life-illustrations-by-abdulsalamamtech-52cg</guid>
      <description>&lt;p&gt;The difference between a library and a framework can be illustrated with real-life examples. &lt;/p&gt;

&lt;p&gt;A library is like buying bread and eggs: pre-made components that speed up development, doing one thing well. &lt;/p&gt;

&lt;p&gt;A framework is like getting a complete breakfast from the store: it simplifies many tasks at once. &lt;/p&gt;

&lt;p&gt;Building from scratch is like making bread and eggs entirely by yourself: time-consuming and complex. &lt;/p&gt;

&lt;p&gt;Libraries like jQuery and Tailwind help specific tasks, while frameworks like Laravel and Bootstrap offer comprehensive solutions.&lt;/p&gt;

</description>
      <category>cschallenge</category>
    </item>
  </channel>
</rss>
