news May 17, 2026 · 35 views · 3 min read

Create Real-Time Chat UI in Laravel with Livewire

Learn how to build a real-time chat interface with Laravel using Livewire and Alpine.js. This guide demonstrates the integration of server-sent events for a dynamic, word-by-word response streaming experience.

Building a Real-Time Streaming Chat UI with Laravel and Livewire

In this guide, we'll explore how to create a real-time chat interface using Laravel, Livewire, and Alpine.js. By leveraging server-sent events, we'll enable seamless, word-by-word response streaming from an AI agent, enhancing user interaction and engagement.

Why Use Livewire for Real-Time Chat?

Livewire is a powerful framework that allows you to build dynamic interfaces directly in Laravel without writing a single line of JavaScript. This makes it an excellent choice for developing real-time applications, as it simplifies the process of updating the UI in response to server events.

Key Benefits:

  • Simplicity: Write less JavaScript and focus on PHP.
  • Reactivity: Automatically updates components based on server-side changes.
  • Seamless Integration: Easily integrates with existing Laravel applications.

Setting Up the Environment

Before we dive into coding, ensure your development environment is ready:

  1. Install Laravel: Make sure you have the latest version of Laravel installed.
  2. Add Livewire: Use Composer to include Livewire in your Laravel project:
    composer require livewire/livewire
    
  3. Include Alpine.js: Add Alpine.js to your project for enhanced front-end interactivity:
    <script src="https://cdn.jsdelivr.net/npm/alpinejs" defer></script>
    

Building the Chat Component

Let's create a Livewire component for the chat interface:

php artisan make:livewire Chat

Designing the Chat UI

In the Chat component view, design a simple interface that includes:

  • Input Field: For typing messages.
  • Send Button: To submit messages.
  • Message Display: To show incoming and outgoing messages.

Example HTML:

<div>
  <div id="messages">
    <!-- Messages will appear here -->
  </div>
  <input type="text" placeholder="Type a message..." wire:model="message"/>
  <button wire:click="sendMessage">Send</button>
</div>

Implementing Real-Time Updates

To handle real-time updates, we'll use server-sent events. In your Livewire component, listen for server messages and update the UI accordingly.

Backend Logic

Modify the Chat component class:

public function sendMessage()
{
  // Logic to process and send message
  $this->emit('messageSent', $this->message);
}

Frontend Event Listening

Use Alpine.js to listen for emitted events and update the message display dynamically:

<script>
  document.addEventListener('livewire:load', function () {
    Livewire.on('messageSent', message => {
      const messagesDiv = document.getElementById('messages');
      const newMessage = document.createElement('div');
      newMessage.textContent = message;
      messagesDiv.appendChild(newMessage);
    });
  });
</script>

Streaming Responses

Integrate server-sent events to stream AI-generated responses word by word. This creates an engaging user experience as the text appears dynamically.

Setting Up Server-Sent Events

In your controller, configure server-sent events to push AI responses to the client:

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

// Simulate streaming response
foreach (explode(' ', 'Hello, how can I assist you today?') as $word) {
  echo "data: $word\n\n";
  ob_flush();
  flush();
  sleep(1);
}

Conclusion

Discussion

0 Comments

Leave a Comment

Comments are moderated and will appear after approval.