Member Since 3 Years Ago

Experience Points

3,590 experience to go until the next level!

In case you were wondering, you earn Laracasts experience when you:

  • Complete a lesson — 100pts
  • Create a forum thread — 50pts
  • Reply to a thread — 10pts
  • Leave a reply that is liked — 50pts
  • Receive a "Best Reply" award — 500pts
Lessons Completed
Best Reply Awards
Best Reply
  • start your engines Created with Sketch.

    Start Your Engines

    Earned once you have completed your first Laracasts lesson.

  • first-thousand Created with Sketch.

    First Thousand

    Earned once you have earned your first 1000 experience points.

  • 1-year Created with Sketch.

    One Year Member

    Earned when you have been with Laracasts for 1 year.

  • 2-years Created with Sketch.

    Two Year Member

    Earned when you have been with Laracasts for 2 years.

  • 3-years Created with Sketch.

    Three Year Member

    Earned when you have been with Laracasts for 3 years.

  • 4-years Created with Sketch.

    Four Year Member

    Earned when you have been with Laracasts for 4 years.

  • 5-years Created with Sketch.

    Five Year Member

    Earned when you have been with Laracasts for 5 years.

  • school-in-session Created with Sketch.

    School In Session

    Earned when at least one Laracasts series has been fully completed.

  • welcome-newcomer Created with Sketch.

    Welcome To The Community

    Earned after your first post on the Laracasts forum.

  • full-time-student Created with Sketch.

    Full Time Learner

    Earned once 100 Laracasts lessons have been completed.

  • pay-it-forward Created with Sketch.

    Pay It Forward

    Earned once you receive your first "Best Reply" award on the Laracasts forum.

  • subscriber Created with Sketch.


    Earned if you are a paying Laracasts subscriber.

  • lifer Created with Sketch.


    Earned if you have a lifetime subscription to Laracasts.

  • evangelist Created with Sketch.

    Laracasts Evangelist

    Earned if you share a link to Laracasts on social media. Please email [email protected] with your username and post URL to be awarded this badge.

  • chatty-cathy Created with Sketch.

    Chatty Cathy

    Earned once you have achieved 500 forum replies.

  • lara-veteran Created with Sketch.

    Laracasts Veteran

    Earned once your experience points passes 100,000.

  • 10k-strong Created with Sketch.

    Ten Thousand Strong

    Earned once your experience points hits 10,000.

  • lara-master Created with Sketch.

    Laracasts Master

    Earned once 1000 Laracasts lessons have been completed.

  • laracasts-tutor Created with Sketch.

    Laracasts Tutor

    Earned once your "Best Reply" award count is 100 or more.

  • laracasts-sensei Created with Sketch.

    Laracasts Sensei

    Earned once your experience points passes 1 million.

  • top-50 Created with Sketch.

    Top 50

    Earned once your experience points ranks in the top 50 of all Laracasts users.

Level 1
1,410 XP
1 month ago
Activity icon

Replied to Laravel 7 Vs Laravel 8 Dilemma

For me, the only problem I had with Laravel 8 was TailwindCSS plus I really wanted to use the Jetstream for my new projects which I think is similar to your dilemma, everything else I understood in a day. Livewire was mostly like VueJs but in PHP, AlpineJS had reasonably small documentation so in less than an hour, I was getting the hang of it. But tailwind tho it was a nice piece of work and all but I've always leaned towards frameworks that gave me some form of opinion, I mean if that wasn't the case I'd still be with Symfony.

So to solve my problem I decided to create a package that replaces only the tailwind aspect of Jetstream called Jetstrap. Check it out to see if it can make the same compromise.

1 month ago
Activity icon

Replied to Unable To Swap Jetstream Default TailwindCSS Modal For Bootstrap Modal And Still Achieve The Expected Or Same Result As Its Was With TailwindCSS

The objective is not to create a version of Laravel UI that runs on Laravel 8. The goal is to change the entire view of Jetstream from Tailwind to Bootstrap with little or no difference when viewed on the browser. You suggested won't come with Two-factor auth, Teams, and User profile that comes with jetstream, which is a major setback.

But I think it's complete so you can try it: Jetstrap

1 month ago
Activity icon

Started a new Conversation Unable To Swap Jetstream Default TailwindCSS Modal For Bootstrap Modal And Still Achieve The Expected Or Same Result As Its Was With TailwindCSS

Am working on a Laravel 8 package that swaps the #TALL stack for what I call the #BALL stack, and its basically a Bootstrap, AlpineJs Laravel, Livewire stack. Bootstrap 5 is leaning towards utility classes and no longer makes use of JQuery which gives room for AlpineJs so I really don't see a lot of upsides with Tailwind, not to mention I've gotten really comfortable with Bootstrap which should be all that matters at the end right?

Now the problem is this, I've been able to make changes to a lot of the JetStream blade files and if you've installed and made use of Jetstream then your familiar with this image:

enter image description here

(Yes!!!! Its the exact same thing but with Bootstrap!)

but one particular component has kept me up for days and its the Bootstrap Modal.

  1. Whenever I call the Bootstrap modal Livewire requests seem to make the Modal itself disappear leaving just the backdrop, forcing a page request before anything else can be clicked.

  2. The final request is never completed

  3. I have no way to hold the modal until a confirmation request is loaded and then programmatically disable the modal when finished.

The exact place I have this problem is in the views/api/api-token-manager.blade which is added by Jetstream when you install the livewire stack. My files looks like so:

My views/api/api-token-manager.blade

<!-- API Token List -->
// Inside a x-jet-action-section component
<x-slot name="content">
    <div class="space-y-6">
    @foreach ($this->user->tokens->sortBy('name') as $token)
        <div class="d-flex justify-content-between">
                {{ $token->name }}

            <div class="d-flex">
            @if ($token->last_used_at)
                <div class="text-sm text-muted">
                    Last used {{ $token->last_used_at->diffForHumans() }}

            @if (Laravel\Jetstream\Jetstream::hasPermissions())
                <button class="btn btn-link text-secondary" data-toggle="modal"
                                                wire:click="manageApiTokenPermissions({{ $token->id }})"
                                                data-target="#managingApiTokenPermissions-{{ $token->id }}">

            <button class="btn btn-link text-danger text-decoration-none"
                                            data-target="#confirmApiTokenDeletion-{{ $token->id }}">

                            <!-- API Token Permissions Modal -->
                            <x-jet-dialog-modal id="managingApiTokenPermissions-{{ $token->id }}">
                                <x-slot name="title">
                                    API Token Permissions

                                <x-slot name="content">
                                    <div class="mt-2 row">
                                        @foreach (Laravel\Jetstream\Jetstream::$permissions as $permission)
                                            <div class="col-6">
                                                <div class="form-check">
                                                    <input class="form-check-input" type="checkbox" value="{{ $permission }}" wire:model.defer="updateApiTokenForm.permissions">
                                                    <label class="form-check-label">
                                                        {{ $permission }}

                                <x-slot name="footer">
                                    <x-jet-secondary-button data-dismiss="modal">
                                        {{ __('Nevermind') }}

                                    <x-jet-button class="ml-2" wire:click="updateApiToken"
                                                  wire:click="$emit('updateApiToken', {{ $token->id }})"
                                        {{ __('Save') }}
                                    Livewire.on('updateApiToken', id => {

                            <!-- Delete Token Confirmation Modal -->
                            <x-jet-confirmation-modal id="confirmApiTokenDeletion-{{ $token->id }}">
                                <x-slot name="title">
                                    Delete API Token

                                <x-slot name="content">
                                    Are you sure you would like to delete this API token?

                                <x-slot name="footer">
                                    <x-jet-secondary-button data-dismiss="modal">

                                    <x-jet-danger-button class="ml-2"
                                                         wire:click="$emit('deleteApiToken', {{ $token->id }})"
                                    Livewire.on('deleteApiToken', id => {

My x-jet-dialog-modal component

@props(['id' => null, 'maxWidth' => null])

<x-jet-modal :id="$id" :maxWidth="$maxWidth" {{ $attributes }}>
    <div class="modal-content">
        <div class="modal-header">
            <h5 class="modal-title">{{ $title }}</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                <span aria-hidden="true">&times;</span>
        <div class="modal-body">
            {{ $content }}
        <div class="modal-footer">
            {{ $footer }}

My x-jet-modal component

@props(['id', 'maxWidth', 'modal' => false])

$id = $id ?? md5($attributes->wire('model'));

switch ($maxWidth ?? '') {
    case 'sm':
        $maxWidth = ' modal-sm';
    case 'md':
        $maxWidth = '';
    case 'lg':
        $maxWidth = ' modal-lg';
    case 'xl':
        $maxWidth = ' modal-xl';
    case '2xl':
        $maxWidth = '';

<!-- Modal -->
<div class="modal fade" tabindex="-1" id="{{ $id }}" aria-labelledby="{{ $id }}" aria-hidden="true">
    <div class="modal-dialog{{ $maxWidth }}">
        {{ $slot }}

I really don't want to make the change to Tailwind regardless of the hype so I would love any assistance the community can render.

To make a direct contribution to the project click here.