<?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: Hamada Habib</title>
    <description>The latest articles on DEV Community by Hamada Habib (@ihfbib).</description>
    <link>https://dev.to/ihfbib</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3603048%2F304cfffe-562b-4bed-a92f-6d72d9b14151.png</url>
      <title>DEV Community: Hamada Habib</title>
      <link>https://dev.to/ihfbib</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ihfbib"/>
    <language>en</language>
    <item>
      <title>Building Better Scheduling Forms in Filament with Date &amp; Time Slots</title>
      <dc:creator>Hamada Habib</dc:creator>
      <pubDate>Mon, 07 Sep 2026 04:09:01 +0000</pubDate>
      <link>https://dev.to/ihfbib/building-better-scheduling-forms-in-filament-with-date-time-slots-304p</link>
      <guid>https://dev.to/ihfbib/building-better-scheduling-forms-in-filament-with-date-time-slots-304p</guid>
      <description>&lt;p&gt;Scheduling looks simple until you actually have to build it.&lt;/p&gt;

&lt;p&gt;At first, the requirement usually sounds straightforward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Let the user choose a date and time.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A standard date-time picker handles that perfectly.&lt;/p&gt;

&lt;p&gt;But real scheduling workflows rarely stop there.&lt;/p&gt;

&lt;p&gt;What if users should only book during working hours?&lt;/p&gt;

&lt;p&gt;What if appointments are available every 30 minutes?&lt;/p&gt;

&lt;p&gt;What if some slots are already booked?&lt;/p&gt;

&lt;p&gt;What if a reservation must be made at least two hours in advance?&lt;/p&gt;

&lt;p&gt;What if availability comes dynamically from your database or an external API?&lt;/p&gt;

&lt;p&gt;And what happens when your users and your application operate in different timezones?&lt;/p&gt;

&lt;p&gt;At that point, choosing a date and time is no longer just a date-picker problem. It becomes a &lt;strong&gt;time-slot scheduling problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is the problem I wanted to solve with &lt;strong&gt;Filament Date Time Slots&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A scheduling field, not another booking system
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/wooserv/filament-date-time-slots" rel="noopener noreferrer"&gt;Filament Date Time Slots&lt;/a&gt; is an open-source form field for Filament designed specifically around date and time-slot selection.&lt;/p&gt;

&lt;p&gt;The goal is intentionally simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provide the scheduling UI and rules without forcing a booking architecture on your application.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The package doesn't require an appointments table, a reservation model, or a specific database schema.&lt;/p&gt;

&lt;p&gt;At the end of the interaction, your Filament form still receives a normal datetime value.&lt;/p&gt;

&lt;p&gt;That makes the field useful in many different workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Appointments&lt;/li&gt;
&lt;li&gt;Reservations&lt;/li&gt;
&lt;li&gt;Meetings&lt;/li&gt;
&lt;li&gt;Tasks&lt;/li&gt;
&lt;li&gt;CRM follow-ups&lt;/li&gt;
&lt;li&gt;Consultations&lt;/li&gt;
&lt;li&gt;Service bookings&lt;/li&gt;
&lt;li&gt;Delivery windows&lt;/li&gt;
&lt;li&gt;Any workflow where users need to choose an available time&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Install the package through Composer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require wooserv/filament-date-time-slots
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then use the field in your Filament schema:&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="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;WooServ\FilamentDateTimeSlots\Forms\Components\DateTimeSlotPicker&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;DateTimeSlotPicker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'scheduled_at'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's enough to get started.&lt;/p&gt;

&lt;p&gt;The package ships with its compiled frontend assets, so applications using it don't need to install its JavaScript dependencies or run a separate frontend build process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defining working hours
&lt;/h2&gt;

&lt;p&gt;One of the most common scheduling requirements is limiting availability to specific hours.&lt;/p&gt;

&lt;p&gt;Instead of letting users choose arbitrary times, you can define the working schedule and let the field generate the available slots.&lt;/p&gt;

&lt;p&gt;For example:&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="nc"&gt;DateTimeSlotPicker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'scheduled_at'&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;workingHours&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'monday'&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;'09:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'17:00'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s1"&gt;'tuesday'&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;'09:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'17:00'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s1"&gt;'wednesday'&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;'09:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'17:00'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s1"&gt;'thursday'&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;'09:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'17:00'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s1"&gt;'friday'&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;'09:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'17:00'&lt;/span&gt;&lt;span class="p"&gt;],&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;slotInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the UI can present 30-minute slots within the configured working hours instead of exposing every possible time.&lt;/p&gt;

&lt;p&gt;This is much closer to how scheduling works in real applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  When availability comes from your application
&lt;/h2&gt;

&lt;p&gt;Generating slots from working hours is useful, but sometimes your backend already knows exactly which slots are available.&lt;/p&gt;

&lt;p&gt;Maybe availability depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A doctor's calendar&lt;/li&gt;
&lt;li&gt;An employee's schedule&lt;/li&gt;
&lt;li&gt;Existing reservations&lt;/li&gt;
&lt;li&gt;A resource or room&lt;/li&gt;
&lt;li&gt;Business rules&lt;/li&gt;
&lt;li&gt;An external scheduling service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In those cases, you can provide available slots directly:&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="nc"&gt;DateTimeSlotPicker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'scheduled_at'&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;availableSlots&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'2026-09-08'&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;'09:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'09:30'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'11:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'14:30'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s1"&gt;'2026-09-09'&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;'10:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'10:30'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'13:00'&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;p&gt;More importantly, scheduling data doesn't have to be static.&lt;/p&gt;

&lt;p&gt;The package supports dynamic configuration, allowing availability to be calculated from your application's own data and logic.&lt;/p&gt;

&lt;p&gt;That was an important design decision for me.&lt;/p&gt;

&lt;p&gt;A scheduling component shouldn't try to own your availability logic. Your application should.&lt;/p&gt;

&lt;p&gt;The field should simply provide a clean way to represent that availability to the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling booked or unavailable slots
&lt;/h2&gt;

&lt;p&gt;Available times are only half of the problem.&lt;/p&gt;

&lt;p&gt;Real systems also need to represent times that can no longer be selected.&lt;/p&gt;

&lt;p&gt;For that, the field supports blocked slots:&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="nc"&gt;DateTimeSlotPicker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'scheduled_at'&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;blockedSlots&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'2026-09-08'&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;'10:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'10:30'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'15:00'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s1"&gt;'2026-09-09'&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;'11:30'&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;p&gt;This can be useful when existing bookings already occupy part of the schedule.&lt;/p&gt;

&lt;p&gt;Depending on the experience you want, blocked slots can either disappear from the available choices or remain visible as disabled slots.&lt;/p&gt;

&lt;p&gt;Keeping them visible can be especially useful in appointment systems because users can understand that a time exists but is no longer available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Booking constraints
&lt;/h2&gt;

&lt;p&gt;Scheduling usually includes rules beyond availability.&lt;/p&gt;

&lt;p&gt;For example, imagine a consultation that cannot be booked less than two hours before it starts.&lt;/p&gt;

&lt;p&gt;The field supports a minimum lead time:&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="nc"&gt;DateTimeSlotPicker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'scheduled_at'&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;minimumLeadTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also control the allowed date range and disable specific dates.&lt;/p&gt;

&lt;p&gt;These constraints let the form communicate the same rules that your scheduling workflow expects instead of relying on users to choose a valid datetime manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preventing past dates and times
&lt;/h2&gt;

&lt;p&gt;A surprisingly common issue with generic date-time fields is dealing with the current day.&lt;/p&gt;

&lt;p&gt;Disabling yesterday is easy.&lt;/p&gt;

&lt;p&gt;But if today is selectable, the application also needs to make sure that time slots that have already passed are no longer available.&lt;/p&gt;

&lt;p&gt;A scheduling-focused field needs to understand both sides of that problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the selected date and the available time slots for that date.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is one of the reasons I preferred building a dedicated scheduling field rather than adding more configuration around a generic datetime input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Timezones matter
&lt;/h2&gt;

&lt;p&gt;Timezone handling is another area where scheduling interfaces can become complicated quickly.&lt;/p&gt;

&lt;p&gt;The package supports configuring the timezone used by the picker while allowing the application to keep its own storage timezone.&lt;/p&gt;

&lt;p&gt;For example:&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="nc"&gt;DateTimeSlotPicker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'scheduled_at'&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;timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Asia/Riyadh'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful when your application's stored datetime and the timezone shown to the person making the booking aren't necessarily the same.&lt;/p&gt;

&lt;p&gt;Timezone support is part of the field's datetime lifecycle rather than simply changing a label in the interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Localization, RTL, and time formats
&lt;/h2&gt;

&lt;p&gt;Scheduling interfaces are user-facing components, so localization matters.&lt;/p&gt;

&lt;p&gt;The picker supports locale configuration, RTL layouts, and both 12-hour and 24-hour time display.&lt;/p&gt;

&lt;p&gt;For example:&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="nc"&gt;DateTimeSlotPicker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'scheduled_at'&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;locale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ar'&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;timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Africa/Cairo'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was particularly important for applications that need to work well across both Arabic and English interfaces.&lt;/p&gt;

&lt;p&gt;Dark mode is supported as well, so the field can fit naturally into Filament panels using either theme.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why return a normal datetime?
&lt;/h2&gt;

&lt;p&gt;One of the design choices I like most about this approach is what the package &lt;strong&gt;doesn't&lt;/strong&gt; do.&lt;/p&gt;

&lt;p&gt;It doesn't introduce its own booking model.&lt;/p&gt;

&lt;p&gt;It doesn't create scheduling tables.&lt;/p&gt;

&lt;p&gt;It doesn't dictate how appointments should be stored.&lt;/p&gt;

&lt;p&gt;It doesn't try to become a calendar platform.&lt;/p&gt;

&lt;p&gt;Instead:&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="nc"&gt;DateTimeSlotPicker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'scheduled_at'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;still represents a normal field in your form.&lt;/p&gt;

&lt;p&gt;Your application remains responsible for its business model.&lt;/p&gt;

&lt;p&gt;That means the same component can be used in a CRM today and an appointment system tomorrow without changing the architecture around it.&lt;/p&gt;

&lt;p&gt;For reusable packages, I think that separation is valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compatibility
&lt;/h2&gt;

&lt;p&gt;The package is designed to work across the current Filament ecosystem, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filament 3, 4, and 5&lt;/li&gt;
&lt;li&gt;Laravel 11, 12, and 13&lt;/li&gt;
&lt;li&gt;PHP 8.2+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compatibility is continuously tested through GitHub Actions across representative supported combinations.&lt;/p&gt;

&lt;p&gt;That was important because supporting several framework generations shouldn't just mean adding broad Composer constraints.&lt;/p&gt;

&lt;p&gt;The combinations should actually be tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source
&lt;/h2&gt;

&lt;p&gt;Filament Date Time Slots is open source and released under the MIT license.&lt;/p&gt;

&lt;p&gt;You can find the source code, documentation, examples, and issue tracker on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/wooserv/filament-date-time-slots" rel="noopener noreferrer"&gt;https://github.com/wooserv/filament-date-time-slots&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://booking.wooserv.com" rel="noopener noreferrer"&gt;https://booking.wooserv.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filament Marketplace:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://filamentphp.com/plugins/wooserv-date-time-slots" rel="noopener noreferrer"&gt;https://filamentphp.com/plugins/wooserv-date-time-slots&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Packagist:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://packagist.org/packages/wooserv/filament-date-time-slots" rel="noopener noreferrer"&gt;https://packagist.org/packages/wooserv/filament-date-time-slots&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require wooserv/filament-date-time-slots
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're building scheduling workflows with Filament, I'd love to hear what kinds of availability rules you're dealing with.&lt;/p&gt;

&lt;p&gt;Issues, feedback, and contributions are welcome.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>filament</category>
      <category>php</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Turning WordPress Into an Open Knowledge Graph with OKF</title>
      <dc:creator>Hamada Habib</dc:creator>
      <pubDate>Tue, 16 Jun 2026 17:29:28 +0000</pubDate>
      <link>https://dev.to/ihfbib/turning-wordpress-into-an-open-knowledge-graph-with-okf-4j1b</link>
      <guid>https://dev.to/ihfbib/turning-wordpress-into-an-open-knowledge-graph-with-okf-4j1b</guid>
      <description>&lt;p&gt;For years, content management systems have been optimized for people and search engines.&lt;/p&gt;

&lt;p&gt;Pages, posts, taxonomies, custom post types, categories, tags, and internal links all work well for publishing content on the web.&lt;/p&gt;

&lt;p&gt;But modern AI systems need something different.&lt;/p&gt;

&lt;p&gt;They need structure.&lt;/p&gt;

&lt;p&gt;They need relationships.&lt;/p&gt;

&lt;p&gt;They need knowledge.&lt;/p&gt;

&lt;p&gt;This is where the Open Knowledge Format (OKF) becomes interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Most WordPress websites contain valuable knowledge.&lt;/p&gt;

&lt;p&gt;A real estate website may contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Projects&lt;/li&gt;
&lt;li&gt;Developers&lt;/li&gt;
&lt;li&gt;Cities&lt;/li&gt;
&lt;li&gt;Properties&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A SaaS website may contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Features&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Guides&lt;/li&gt;
&lt;li&gt;Integrations&lt;/li&gt;
&lt;li&gt;FAQs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A university website may contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Courses&lt;/li&gt;
&lt;li&gt;Departments&lt;/li&gt;
&lt;li&gt;Professors&lt;/li&gt;
&lt;li&gt;Research papers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The information exists.&lt;/p&gt;

&lt;p&gt;The relationships exist.&lt;/p&gt;

&lt;p&gt;But the knowledge is trapped inside HTML pages.&lt;/p&gt;

&lt;p&gt;For humans, that is fine.&lt;/p&gt;

&lt;p&gt;For AI systems, it is not ideal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is OKF?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing" rel="noopener noreferrer"&gt;Open Knowledge Format&lt;/a&gt; (OKF) is an open specification introduced by Google Cloud as a lightweight way to represent knowledge using Markdown files.&lt;/p&gt;

&lt;p&gt;Instead of storing knowledge in a graph database or a proprietary format, OKF uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Directories&lt;/li&gt;
&lt;li&gt;Markdown documents&lt;/li&gt;
&lt;li&gt;Metadata&lt;/li&gt;
&lt;li&gt;Links&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every document becomes a concept.&lt;/p&gt;

&lt;p&gt;Every link becomes a relationship.&lt;/p&gt;

&lt;p&gt;The result is a portable and AI-friendly knowledge graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why WordPress?
&lt;/h2&gt;

&lt;p&gt;WordPress powers a large portion of the web.&lt;/p&gt;

&lt;p&gt;Yet most WordPress content is still distributed as HTML.&lt;/p&gt;

&lt;p&gt;If we can transform WordPress content into OKF documents, we gain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structured knowledge representation&lt;/li&gt;
&lt;li&gt;Better AI ingestion&lt;/li&gt;
&lt;li&gt;Portable knowledge graphs&lt;/li&gt;
&lt;li&gt;Vendor independence&lt;/li&gt;
&lt;li&gt;Human-readable storage&lt;/li&gt;
&lt;li&gt;Git-friendly versioning&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building Knowledge Layer
&lt;/h2&gt;

&lt;p&gt;To explore this idea, I built Knowledge Layer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wooserv/wp-knowledge-layer" rel="noopener noreferrer"&gt;https://github.com/wooserv/wp-knowledge-layer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Knowledge Layer is a WordPress plugin that synchronizes WordPress content into Open Knowledge Format documents.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;p&gt;Transform WordPress content into a persistent Markdown-based knowledge graph.&lt;/p&gt;

&lt;p&gt;The plugin supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pages&lt;/li&gt;
&lt;li&gt;Posts&lt;/li&gt;
&lt;li&gt;Custom Post Types&lt;/li&gt;
&lt;li&gt;Taxonomies&lt;/li&gt;
&lt;li&gt;Internal links&lt;/li&gt;
&lt;li&gt;Incremental synchronization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of rebuilding everything repeatedly, content is synchronized as it changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;When content is published:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;WordPress content is discovered.&lt;/li&gt;
&lt;li&gt;HTML is converted into Markdown.&lt;/li&gt;
&lt;li&gt;Metadata is extracted.&lt;/li&gt;
&lt;li&gt;Internal links are rewritten.&lt;/li&gt;
&lt;li&gt;OKF documents are generated.&lt;/li&gt;
&lt;li&gt;The knowledge graph is updated.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The resulting files remain readable by both humans and AI systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Markdown?
&lt;/h2&gt;

&lt;p&gt;Markdown provides several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Human-readable&lt;/li&gt;
&lt;li&gt;Version controllable&lt;/li&gt;
&lt;li&gt;Portable&lt;/li&gt;
&lt;li&gt;AI-friendly&lt;/li&gt;
&lt;li&gt;Easy to inspect&lt;/li&gt;
&lt;li&gt;Easy to archive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly, Markdown does not require specialized infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future
&lt;/h2&gt;

&lt;p&gt;As AI systems increasingly consume structured knowledge, websites need more than pages and posts.&lt;/p&gt;

&lt;p&gt;They need a way to expose their knowledge in an open and portable format.&lt;/p&gt;

&lt;p&gt;OKF provides a promising foundation.&lt;/p&gt;

&lt;p&gt;WordPress already contains the knowledge.&lt;/p&gt;

&lt;p&gt;The next step is making that knowledge accessible.&lt;/p&gt;

&lt;p&gt;Knowledge Layer is one attempt to bridge that gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;Google Cloud:&lt;br&gt;
&lt;a href="https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing" rel="noopener noreferrer"&gt;https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open Knowledge Format Specification:&lt;br&gt;
&lt;a href="https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md" rel="noopener noreferrer"&gt;https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Community Resources:&lt;br&gt;
&lt;a href="https://suganthan.com/blog/open-knowledge-format/" rel="noopener noreferrer"&gt;https://suganthan.com/blog/open-knowledge-format/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub:&lt;br&gt;
&lt;a href="https://github.com/wooserv/wp-knowledge-layer" rel="noopener noreferrer"&gt;https://github.com/wooserv/wp-knowledge-layer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>wordpress</category>
      <category>okf</category>
    </item>
    <item>
      <title>🚀 Introducing Laravel ObjectId — The Fastest MongoDB-Style Identifier for Laravel Models</title>
      <dc:creator>Hamada Habib</dc:creator>
      <pubDate>Sun, 09 Nov 2025 08:41:16 +0000</pubDate>
      <link>https://dev.to/ihfbib/introducing-laravel-objectid-the-fastest-mongodb-style-identifier-for-laravel-models-337j</link>
      <guid>https://dev.to/ihfbib/introducing-laravel-objectid-the-fastest-mongodb-style-identifier-for-laravel-models-337j</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Works seamlessly with &lt;strong&gt;MySQL&lt;/strong&gt;, &lt;strong&gt;MariaDB&lt;/strong&gt;, and &lt;strong&gt;PostgreSQL&lt;/strong&gt; — no MongoDB required.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every Laravel developer has been there — you start a new project, define your migrations, and by default, your models use auto-incrementing IDs. It works fine... until your app grows, you need distributed systems, API integrations, or microservices. Suddenly, those integer IDs start to look like a limitation.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;Laravel ObjectId&lt;/strong&gt; comes in — a drop-in, ultra-fast, globally unique identifier system inspired by MongoDB’s ObjectIds, designed for &lt;strong&gt;MySQL&lt;/strong&gt;, &lt;strong&gt;MariaDB&lt;/strong&gt;, and &lt;strong&gt;PostgreSQL&lt;/strong&gt; — no MongoDB required.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Why ObjectId?
&lt;/h2&gt;

&lt;p&gt;Unlike UUIDs or ULIDs, ObjectIds are compact 12-byte identifiers that encode timestamp, randomness, and a counter — making them &lt;strong&gt;sortable, lightweight, and unique across systems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In numeric terms, they’re up to &lt;strong&gt;3× faster&lt;/strong&gt; to generate and &lt;strong&gt;smaller in size&lt;/strong&gt;, which directly improves database performance and indexing.&lt;/p&gt;

&lt;p&gt;✅ Works natively with MySQL, MariaDB, and PostgreSQL&lt;br&gt;
🚫 No MongoDB driver or extension required&lt;/p&gt;




&lt;h2&gt;
  
  
  🧬 How ObjectId Works Internally
&lt;/h2&gt;

&lt;p&gt;ObjectIds are 12-byte (96-bit) identifiers consisting of four key parts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Segment&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Timestamp&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 bytes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;UNIX epoch seconds — makes IDs sortable by creation time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Machine Identifier&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5 bytes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Randomly generated, unique per host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process ID&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2 bytes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uniquely identifies the generating process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3 bytes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Incrementing counter initialized randomly per process&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;➡️ Total = &lt;code&gt;4 + 5 + 2 + 3 = 12 bytes = 24 hex characters&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This design ensures &lt;strong&gt;uniqueness&lt;/strong&gt; without any central generator and preserves &lt;strong&gt;chronological order&lt;/strong&gt;, making it ideal for distributed systems.&lt;/p&gt;

&lt;p&gt;For more details, check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/method/ObjectId/" rel="noopener noreferrer"&gt;MongoDB’s ObjectId Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.percona.com/blog/2010/04/20/mongodb-objectid/" rel="noopener noreferrer"&gt;Percona’s Deep Dive into ObjectIds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/a/26176946" rel="noopener noreferrer"&gt;Stack Overflow breakdown of ObjectId structure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 The Ecosystem
&lt;/h2&gt;

&lt;p&gt;The Laravel package is built on top of our core PHP library:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔹 &lt;a href="https://github.com/wooserv/php-objectid" rel="noopener noreferrer"&gt;&lt;code&gt;wooserv/php-objectid&lt;/code&gt;&lt;/a&gt;: a pure PHP implementation of ObjectIds.&lt;/li&gt;
&lt;li&gt;🔹 &lt;a href="https://github.com/wooserv/laravel-objectid" rel="noopener noreferrer"&gt;&lt;code&gt;wooserv/laravel-objectid&lt;/code&gt;&lt;/a&gt;: Laravel integration with automatic model ID assignment and migration macros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both packages are open-source under the &lt;strong&gt;MIT license&lt;/strong&gt;, created by &lt;strong&gt;WooServ Labs&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require wooserv/laravel-objectid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧱 Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Model Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;WooServ\LaravelObjectId\Concerns\HasObjectIds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Eloquent\Model&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;HasObjectIds&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;h3&gt;
  
  
  Migration Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&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;objectId&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Creates a 24-char string primary key&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;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'title'&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;timestamps&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;h3&gt;
  
  
  Generate IDs Anywhere
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;objectid&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// e.g. 6730b6a0d8a28f890b7c9f40&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔬 Benchmark Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Laravel ObjectId Performance (10,000 iterations)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;----------------------------------------------------------
ObjectId             : 0.412 µs per ID
objectid() helper    : 0.417 µs per ID
UUID                 : 1.283 µs per ID
ULID                 : 1.147 µs per ID
----------------------------------------------------------
Fastest: ObjectId 🚀
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Database Insert Benchmark (1,000 inserts)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;----------------------------------------------------------
ObjectId   : 14.78 ms total (0.015 ms/insert)
UUID       : 15.48 ms total (0.015 ms/insert)
ULID       : 15.17 ms total (0.015 ms/insert)
----------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚔️ ObjectId vs UUID vs ULID
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;ObjectId&lt;/th&gt;
&lt;th&gt;UUID&lt;/th&gt;
&lt;th&gt;ULID&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;24 chars&lt;/td&gt;
&lt;td&gt;36 chars&lt;/td&gt;
&lt;td&gt;26 chars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bytes&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sortable&lt;/td&gt;
&lt;td&gt;✅ (timestamp prefix)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Randomness&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Readability&lt;/td&gt;
&lt;td&gt;🟢 Compact&lt;/td&gt;
&lt;td&gt;🔴 Long&lt;/td&gt;
&lt;td&gt;🟢 Fair&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;🚀 Fastest&lt;/td&gt;
&lt;td&gt;🐢 Slowest&lt;/td&gt;
&lt;td&gt;⚡ Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works with MySQL/MariaDB/PostgreSQL&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requires MongoDB&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; ObjectId is the best balance between compactness, performance, and chronological order — and it’s fully compatible with standard SQL databases.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Why Developers Love It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Automatic assignment&lt;/strong&gt; — no need to manually generate IDs.&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Migration macro&lt;/strong&gt; &lt;code&gt;$table-&amp;gt;objectId()&lt;/code&gt; — clean and intuitive.&lt;/li&gt;
&lt;li&gt;🧩 &lt;strong&gt;Framework-agnostic core&lt;/strong&gt; — works outside Laravel too.&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Compact storage&lt;/strong&gt; — saves DB space compared to UUID.&lt;/li&gt;
&lt;li&gt;🕒 &lt;strong&gt;Sortable by creation time&lt;/strong&gt; — built-in timestamp encoding.&lt;/li&gt;
&lt;li&gt;🧰 &lt;strong&gt;Database-compatible&lt;/strong&gt; — works with MySQL, MariaDB, and PostgreSQL seamlessly.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌍 Open Source Philosophy
&lt;/h2&gt;

&lt;p&gt;Both packages are released under the &lt;strong&gt;MIT License&lt;/strong&gt; and maintained by &lt;a href="https://github.com/wooserv" rel="noopener noreferrer"&gt;WooServ Labs&lt;/a&gt;, a collective of developers building open, high-performance PHP tooling for modern web apps.&lt;/p&gt;

&lt;p&gt;We believe that open-source should be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple to install.&lt;/li&gt;
&lt;li&gt;Fun to use.&lt;/li&gt;
&lt;li&gt;Fast by default.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you share that philosophy — star the repo, contribute, or just spread the word 💫&lt;/p&gt;




&lt;h2&gt;
  
  
  📎 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;a href="https://github.com/wooserv/laravel-objectid" rel="noopener noreferrer"&gt;Laravel ObjectId on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔗 &lt;a href="https://github.com/wooserv/php-objectid" rel="noopener noreferrer"&gt;PHP ObjectId on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;a href="https://packagist.org/packages/wooserv/laravel-objectid" rel="noopener noreferrer"&gt;Packagist: wooserv/laravel-objectid&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;a href="https://packagist.org/packages/wooserv/php-objectid" rel="noopener noreferrer"&gt;Packagist: wooserv/php-objectid&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://www.mongodb.com/docs/manual/reference/method/ObjectId/" rel="noopener noreferrer"&gt;MongoDB ObjectId Reference&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;⭐ If you like it — give it a &lt;strong&gt;Star&lt;/strong&gt; on GitHub and share it with your fellow Laravel devs!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>mysql</category>
      <category>mariadb</category>
    </item>
  </channel>
</rss>
