ForgePulse is a powerful, production-ready Laravel package for building dynamic workflows with a drag-and-drop interface, conditional branching, and real-time execution tracking.
Note: This project was formerly known as FlowForge. It has been renamed to ForgePulse.
Explore Full Features & Screenshots β
Install the package via Composer:
composer require alizharb/forgepulse
Publish the configuration file:
php artisan vendor:publish --tag=forgepulse-config
Publish and run the migrations:
php artisan vendor:publish --tag=forgepulse-migrations
php artisan migrate
Optionally, publish the views and assets:
php artisan vendor:publish --tag=forgepulse-views
php artisan vendor:publish --tag=forgepulse-assets
php artisan vendor:publish --tag=forgepulse-lang
To ensure the ForgePulse UI renders correctly, you must include the package's CSS file in your application's layout (usually resources/views/layouts/app.blade.php):
<link href="{{ asset('vendor/forgepulse/css/forgepulse.css') }}" rel="stylesheet">
use AlizHarb\ForgePulse\Models\Workflow;
use AlizHarb\ForgePulse\Enums\WorkflowStatus;
$workflow = Workflow::create([
'name' => 'User Onboarding',
'description' => 'Automated user onboarding process',
'status' => WorkflowStatus::ACTIVE,
]);
use AlizHarb\ForgePulse\Enums\StepType;
// Send welcome email
$workflow->steps()->create([
'name' => 'Send Welcome Email',
'type' => StepType::NOTIFICATION,
'position' => 1,
'configuration' => [
'notification_class' => \App\Notifications\WelcomeEmail::class,
'recipients' => ['{{user_id}}'],
],
]);
// Wait 1 day
$workflow->steps()->create([
'name' => 'Wait 24 Hours',
'type' => StepType::DELAY,
'position' => 2,
'configuration' => [
'seconds' => 86400,
],
]);
// Execute asynchronously (queued)
$execution = $workflow->execute([
'user_id' => $user->id,
'email' => $user->email,
]);
// Execute synchronously
$execution = $workflow->execute(['user_id' => $user->id], async: false);
Include the Livewire component in your Blade view:
<livewire:forgepulse::workflow-builder :workflow="$workflow" />

For comprehensive documentation, visit our interactive documentation site or check the docs/ directory.
ForgePulse supports 7 step types out of the box:
Execute custom action classes:
use AlizHarb\ForgePulse\Enums\StepType;
$step = $workflow->steps()->create([
'type' => StepType::ACTION,
'configuration' => [
'action_class' => \App\Actions\ProcessUserData::class,
'parameters' => ['user_id' => '{{user_id}}'],
],
]);
Send Laravel notifications:
$step = $workflow->steps()->create([
'type' => StepType::NOTIFICATION,
'configuration' => [
'notification_class' => \App\Notifications\OrderConfirmation::class,
'recipients' => ['{{user_id}}'],
],
]);
Make HTTP requests to external services:
$step = $workflow->steps()->create([
'type' => StepType::WEBHOOK,
'configuration' => [
'url' => 'https://api.example.com/webhook',
'method' => 'POST',
'headers' => ['Authorization' => 'Bearer token'],
'payload' => ['data' => '{{context}}'],
],
]);
See full documentation for all step types β
Add conditions to steps for dynamic workflow paths:
use AlizHarb\ForgePulse\Enums\StepType;
$step->update([
'conditions' => [
'operator' => 'and',
'rules' => [
['field' => 'user.role', 'operator' => '==', 'value' => 'premium'],
['field' => 'order.total', 'operator' => '>', 'value' => 100],
],
],
]);
Basic Operators:
==, ===, !=, !==>, >=, <, <=in, not_incontains, starts_with, ends_withis_null, is_not_null, is_empty, is_not_emptyAdvanced Operators (v1.2.0):
regex, not_regexbetween, not_betweenin_array, not_in_array, contains_all, contains_anylength_eq, length_gt, length_lt// Example: Regex pattern matching
$step->update([
'conditions' => [
'operator' => 'and',
'rules' => [
['field' => 'email', 'operator' => 'regex', 'value' => '/^[a-z]+@company\.com$/'],
['field' => 'age', 'operator' => 'between', 'value' => [18, 65]],
['field' => 'permissions', 'operator' => 'contains_all', 'value' => ['read', 'write']],
],
],
]);
Save workflows as reusable templates:
// Save as template
$template = $workflow->saveAsTemplate('User Onboarding Template');
// Create workflow from template
$newWorkflow = $template->instantiateFromTemplate('New Onboarding');
// Export template to file
$templateManager = app(\AlizHarb\ForgePulse\Services\TemplateManager::class);
$path = $templateManager->export($template);
// Import template from file
$workflow = $templateManager->import($path, 'Imported Workflow');
Monitor workflow execution in real-time:
<livewire:forgepulse::workflow-execution-tracker :execution="$execution" />
The tracker automatically polls for updates and displays:
Configure timeouts for individual steps to prevent long-running operations:
$step->update([
'timeout' => 30, // seconds
]);
If a step exceeds its timeout, it will be automatically terminated and marked as failed. Requires the pcntl PHP extension. Gracefully degrades if not available.
Pause and resume workflow executions:
// Pause execution
$execution->pause('Waiting for manual approval');
// Resume execution
$execution->resume();
// Check if paused
if ($execution->isPaused()) {
echo "Paused: " . $execution->pause_reason;
}
Execute multiple steps concurrently for improved performance:
// Configure steps to run in parallel
$step1->update([
'execution_mode' => 'parallel',
'parallel_group' => 'email-notifications',
]);
$step2->update([
'execution_mode' => 'parallel',
'parallel_group' => 'email-notifications',
]);
// Both steps will execute concurrently
Schedule workflows for future execution:
$execution = $workflow->execute([
'scheduled_at' => now()->addHours(2),
'context' => ['user_id' => 123],
]);
ForgePulse provides a full REST API for mobile monitoring and integrations:
# List workflows
GET /api/forgepulse/workflows
# Get workflow details
GET /api/forgepulse/workflows/{id}
# List executions
GET /api/forgepulse/executions
# Get execution details
GET /api/forgepulse/executions/{id}
# Pause execution
POST /api/forgepulse/executions/{id}/pause
# Resume execution
POST /api/forgepulse/executions/{id}/resume
Configure API settings in config/forgepulse.php:
'api' => [
'enabled' => true,
'middleware' => ['api', 'auth:sanctum'],
],
ForgePulse automatically tracks workflow versions, enabling you to view history and rollback changes:
// Automatic versioning on save (enabled by default)
$workflow->save(); // Creates version automatically
// Manual version creation
$version = $workflow->createVersion('Before major changes');
// View version history
$versions = $workflow->versions;
// Rollback to a previous version
$workflow->restoreVersion($versionId);
// Compare versions
$latestVersion = $workflow->latestVersion();
$diff = $latestVersion->compare($previousVersion);
Configure versioning in config/forgepulse.php:
'versioning' => [
'enabled' => true,
'max_versions' => 50,
'auto_version_on_save' => true,
'retention_days' => 90,
],
ForgePulse dispatches the following events:
WorkflowStarted - When workflow execution beginsWorkflowCompleted - When workflow completes successfullyWorkflowFailed - When workflow execution failsStepExecuted - After each step executionListen to these events in your EventServiceProvider:
use AlizHarb\ForgePulse\Events\WorkflowCompleted;
use App\Listeners\SendWorkflowCompletionNotification;
protected $listen = [
WorkflowCompleted::class => [
SendWorkflowCompletionNotification::class,
],
];
ForgePulse includes built-in translations for:
Set your application locale:
app()->setLocale('es'); // Spanish
app()->setLocale('fr'); // French
app()->setLocale('de'); // German
app()->setLocale('ar'); // Arabic
The configuration file (config/forgepulse.php) allows you to customize:
ForgePulse supports optional team integration. To enable it:
Enable teams in config/forgepulse.php:
'teams' => [
'enabled' => true,
'model' => \App\Models\Team::class,
],
Ensure your teams table exists before running migrations. If enabled, ForgePulse will add a team_id foreign key to the workflows table.
By default, ForgePulse enforces Role-Based Access Control (RBAC). To disable all permission checks (e.g., for local testing or demos), update your configuration:
'permissions' => [
'enabled' => false,
// ...
],
Run the test suite:
composer test
Run tests with coverage:
composer test:coverage
Run static analysis:
composer analyse
Format code:
composer format
If you discover any security-related issues, please email harbzali@gmail.com instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.
Please see CONTRIBUTING for details.
Please see CHANGELOG for more information on what has changed recently.
If you find this package helpful, please consider:
Made with β€οΈ by Ali Harb
Release Date: November 27, 2025 | Version: 1.2.0
How can I help you explore Laravel packages today?