PHPackages                             interwal-net/filament-visual-cron-builder - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. interwal-net/filament-visual-cron-builder

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

interwal-net/filament-visual-cron-builder
=========================================

A reusable Filament v4/v5 form field that builds cron expressions visually with native selects - no JS bundle.

v1.2.0(3d ago)02MITPHP ^8.2

Since Jun 22Compare

[ Source](https://github.com/interwal-net/filament-visual-cron-builder)[ Packagist](https://packagist.org/packages/interwal-net/filament-visual-cron-builder)[ Docs](https://github.com/interwal-net/filament-visual-cron-builder)[ RSS](/packages/interwal-net-filament-visual-cron-builder/feed)WikiDiscussions Synced today

READMEChangelog (1)Dependencies (10)Versions (5)Used By (0)

Filament Visual Cron Builder
============================

[](#filament-visual-cron-builder)

A reusable [Filament v4/v5](https://filamentphp.com) form field that builds cron expressions visually with native selects. No cron syntax knowledge required, no JS bundle - the compose/parse logic lives in PHP.

`CronBuilder::make('schedule')` is a drop-in replacement for a `TextInput` bound to a cron column: its saved state is a standard 5-field cron string.

```
*/15 4,12,20 * * 1-5   ->   "Every 15 minutes At 04:00... on Monday-Friday"

```

Features
--------

[](#features)

- 5 positions - minute, hour, day-of-month, month, day-of-week.
- Each position has a mode: **Every** (`*`), **Specific** (`1,15,30` - toggle chips, no Ctrl-click), **Range** (`1-5,10-12` - multiple ranges, a new row appears as you fill the last one), **Step** (`*/15`).
- Two layouts: side-by-side **grid** (default) or compact **tabs** - per field or via config.
- Live human-readable preview + raw expression + optional next-run date.
- Round-trips: editing a record parses the existing string back into the columns.
- All compose/parse/validation logic is plain, unit-tested PHP.
- Styles ship as a small plain-CSS file through `FilamentAsset` - no Tailwind build or theme configuration required.

Compatibility
-------------

[](#compatibility)

PackageFilamentLivewireLaravelPHP1.1+4.x / 5.x3.x (F4) / 4.x (F5)12, 138.2+ (Laravel 13 needs 8.3+)1.04.x3.x11, 128.2+Livewire is not a direct dependency - the correct major is pulled in by the Filament version you install.

Installation
------------

[](#installation)

```
composer require interwal-net/filament-visual-cron-builder
```

The service provider is auto-discovered. Optionally publish config and views:

```
php artisan vendor:publish --tag=cron-builder-config
php artisan vendor:publish --tag=cron-builder-views
```

Usage
-----

[](#usage)

```
use InterwalNet\CronBuilder\CronBuilder;

CronBuilder::make('schedule')
    ->showNextRun()      // toggle the next-run preview (default: from config)
    ->layout('tabs')     // 'grid' (default) or 'tabs'; default from config
    ->showTabTokens()    // tabs only: show each position's cron token in its tab
    ->required();
```

The field is `live()` by default so the preview recomputes on every change. `->live()`, `->afterStateUpdated()` and the other state binding modifiers work like on any Filament field:

```
CronBuilder::make('schedule')
    ->live(debounce: 500)   // or ->live(onBlur: true), ->live(condition: false)
    ->afterStateUpdated(function (CronBuilder $component) {
        // While editing, the state is the 5-column array; use the helper to
        // get the composed cron string:
        $cron = $component->getComposedExpression();
    });
```

Validate the saved string anywhere with the bundled rule:

```
use InterwalNet\CronBuilder\Rules\ValidCronExpression;

$request->validate([
    'schedule' => ['required', new ValidCronExpression],
]);
```

The core helper
---------------

[](#the-core-helper)

`InterwalNet\CronBuilder\Support\CronExpressionBuilder` is standalone and testable:

```
use InterwalNet\CronBuilder\Support\CronExpressionBuilder as Cron;

Cron::parse('*/15 4,12,20 * * 1-5');        // -> 5 column states
Cron::compose($columns);                     // -> '*/15 4,12,20 * * 1-5'
Cron::humanReadable('30 4 * * 1-5');         // -> 'At 04:30 on Monday-Friday'
Cron::isValid('30 4 * * 1-5');               // -> true
```

Demo
----

[](#demo)

A bootable Filament panel lives in `workbench/` (via Testbench). It exposes a `ScheduleResource` using `CronBuilder`, seeded with sample expressions.

```
composer serve
```

Then open  and log in with:

- email: `demo@example.com`
- password: `password`

Edit the "Every 15 min, business hours" record (`*/15 4,12,20 * * 1-5`) to see the columns parse back from an existing string.

Testing
-------

[](#testing)

```
composer test     # vendor/bin/pest
composer format   # vendor/bin/pint
```

Changelog
---------

[](#changelog)

See [CHANGELOG.md](CHANGELOG.md) for release notes.

License
-------

[](#license)

MIT. See [LICENSE](LICENSE).

###  Health Score

41

—

FairBetter than 87% of packages

Maintenance99

Actively maintained with recent releases

Popularity3

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~5 days

Total

4

Last Release

3d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/655a8a920e6591ee8282a426db1ba6a0841a4beab04d9606c0605051bff5f7f4?d=identicon)[walaskir](/maintainers/walaskir)

---

Tags

schedulerlaravelcronfilamentfilamentphpform-field

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/interwal-net-filament-visual-cron-builder/health.svg)

```
[![Health](https://phpackages.com/badges/interwal-net-filament-visual-cron-builder/health.svg)](https://phpackages.com/packages/interwal-net-filament-visual-cron-builder)
```

###  Alternatives

[codewithdennis/filament-select-tree

The multi-level select field enables you to make single selections from a predefined list of options that are organized into multiple levels or depths.

329530.5k29](/packages/codewithdennis-filament-select-tree)[rawilk/profile-filament-plugin

Profile &amp; MFA starter kit for filament.

3914.8k](/packages/rawilk-profile-filament-plugin)[danihidayatx/image-optimizer

Optimize your Filament images before they reach your database. Forked from joshembling/image-optimizer for Filament v4 &amp; v5 support.

3218.1k](/packages/danihidayatx-image-optimizer)[rawilk/filament-password-input

Enhanced password input component for filament.

52263.4k14](/packages/rawilk-filament-password-input)[dotswan/filament-map-picker

Easily pick and retrieve geo-coordinates using a map-based interface in your Filament applications.

128192.3k3](/packages/dotswan-filament-map-picker)[awcodes/richer-editor

A collection of extensions and tools to enhance the Filament Rich Editor field.

3913.8k9](/packages/awcodes-richer-editor)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
