A powerful platform for managing your business built with the TALL stack
🎮 Interactive Demo
·
🐛 Report Bug
·
✨ Request Feature
⚠️ This app is in active development
⚠️ THIS REPOSITORY SHOULD BE USED ON A BRAND-NEW PROJECT
WittyWorkflow is a TALL stack (Tailwind CSS, Alpine.js, Laravel, Livewire) foundation designed for building niche marketplaces and small business management tools. Whether you’re crafting an e-commerce shop, managing appointments, or creating custom workflows, this modular platform—powered by Filament PHP—offers a robust starting point. It’s built to be forked, extended, and deployed fast, with features like role-based dashboards, Stripe payments, and customizable UI out of the box.
Originally a demo app, WittyWorkflow has evolved into a versatile base for real-world projects. A prime example? It’s being adapted into the Artisanal Food Production Manager—a marketplace example connecting artisanal producers to customers, complete with product listings, orders, and secure payments. Developers can use it as-is for small business needs or tailor it to specialized industries like handmade goods, local services, or boutique retail.
Watch a guided tour of Witty Workflow’s key features and intuitive interface.
🌟 Dynamic Hero: Capture attention with a visually stunning, admin-customizable hero section—fully editable via Filament for a seamless experience.
🔐 Role-Based Access: Leverage Filament PHP for flexible, role-based dashboards—admins control all, team members and customers (e.g., producers/retailers) get tailored views, powered by Shield.
⚡ SPA-Like Navigation: Enjoy smooth transitions with Livewire’s wire:navigate
—enhances UX across panels and public pages.
📝 Customizable Contact & Footer: Boost engagement with a public email form and admin-editable footer for terms, help, or business details.
🛒 E-commerce Module: A TALL stack shop with Stripe integration, product management, and admin control—perfect for niches like artisanal food.
📅 Appointment Management: Schedule and manage appointments with email notifications—optional for service-based apps.
🔒 Security Suite: Protect accounts with 2-Factor Authentication (2FA) and One-Time Passwords (OTP)—toggleable for your needs.
🎨 Theme Customization: Tailor the app’s look with admin-controlled themes and section visibility—swap styles without code.
🔄 Section Positioning: Control the order of public page sections through an intuitive admin interface—customize the user experience without touching code.
📊 Application Health: Monitor performance and server status with Spatie Laravel Health—actionable insights from the dashboard.
⚙️ Business Settings: Manage announcements, visibility, and niche-specific data—adaptable for any small business or marketplace.
🧰 Developer Tools: Demo seeds, and modular structure—fork and extend with ease.
This section lists all major frameworks/libraries used to bootstrap this project.
Fork it, tweak it—build your vision fast.
Get WittyWorkflow running in minutes—perfect for prototyping or building your next niche app.
Before you begin, ensure your development environment meets these requirements:
git clone https://github.com/kristi11/ww-filament.git
cd ww-filament
npm install
composer install
cp .env.example .env
php artisan key:generate
Note: If using Laravel Forge, there’s no need to generate a key since Forge handles key generation when creating the server.
Create an empty database for your application. We recommend using TablePlus, but you can use any database management tool you prefer.
In the .env
file, add database information to allow Laravel to connect to the database. The default database name is ww_filament
. If you are using a different name, you’ll need to edit the DB_DATABASE
variable in the .env
file with your database name.
php artisan migrate:fresh --seed
php artisan shield:setup --fresh
php artisan shield:generate --all --panel=admin
Then define the super admin of the system:
php artisan shield:super-admin --user="1"
--user=1
is the id
of the user that will be the super admin
. You can change it to whatever user you want to be the super admin
.
php artisan storage:link
php artisan serve
http://localhost:8000
npm run dev
For quick reference, here’s the complete list of commands to set up WittyWorkflow:
git clone https://github.com/kristi11/ww-filament.git .
npm install
composer install
cp .env.example .env
php artisan key:generate
php artisan migrate:fresh --seed
php artisan shield:setup --fresh
php artisan shield:generate --all --panel=admin
php artisan shield:super-admin --user="1"
php artisan storage:link
npm run dev
php artisan serve
If you encounter issues during installation, here are solutions to common problems:
Issue | Solution |
---|---|
Class not found errors | Run composer dump-autoload |
Node.js errors | Ensure you’re using Node.js 16+ with node -v |
Database connection errors | Verify credentials in .env file |
Permission issues | Check directory permissions, especially for storage and bootstrap/cache |
Blank page after installation | Check PHP error logs and ensure all requirements are met |
Missing images/assets | Run php artisan storage:link again |
Shield errors | Run php artisan optimize:clear then retry Shield commands |
For more complex issues, check the Laravel documentation or open an issue on our GitHub repository.
[!NOTE] Don’t forget to update your Mail settings to reflect your production server’s needs
For local email testing, we recommend Mailtrap. To use Mailtrap:
.env
file:MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=your_email
MAIL_FROM_NAME="${APP_NAME}"
If you are using Laravel Forge, you can add the credentials to the server environment variables.
WittyWorkflow includes a fully-featured e-commerce system built with the TALL stack and integrated with Stripe for payment processing. This section will guide you through setting up and using the shop functionality.
The shop system consists of several key components:
First, add your Stripe credentials to your .env
file:
STRIPE_KEY=your-stripe-key
STRIPE_SECRET=your-stripe-secret
STRIPE_WEBHOOK_SECRET=your-stripe-webhook-secret
For local testing:
stripe login
to authenticate with your Stripe accountstripe listen --forward-to {your-local-url}/stripe/webhook --format JSON
.env
file as STRIPE_WEBHOOK_SECRET
For production:
php artisan cashier:webhook
on your server to register the webhook with Stripe.env
file as STRIPE_WEBHOOK_SECRET
checkout.session.completed
event is enabled:
checkout.session.completed
The shop system uses several database tables:
products
: Stores product informationproduct_variants
: Stores variant information for productscarts
: Manages user shopping cartscart_items
: Stores items in cartsorders
: Tracks completed ordersorder_items
: Stores items in ordersThese tables are created automatically when you run migrations.
Products are managed through the Filament admin panel:
The cart system allows users to:
The cart is implemented using the Cart
and CartItems
models, with the AddProductVariantToCart
action handling the addition of products.
The checkout process is handled by:
CreateStripeCheckoutSession
: Creates a Stripe checkout session from the cartHandleCheckoutSessionCompleted
: Processes the completed checkout, creates an order, and clears the cartAfter checkout, orders are:
To test purchases in your development environment:
4242 4242 4242 4242
03/30
)123
)To switch to production mode:
.env
fileThe shop system is designed to be customizable:
app/Enums/
and update the ProductVariant
modelCreateStripeCheckoutSession
class to customize checkout optionsHandleCheckoutSessionCompleted
class to add custom logic after purchaseSee the Adding Variants section for detailed instructions on customizing product variants.
[!IMPORTANT]
Switch the
canEdit()
function inCRUDSettingsResource.php
totrue
osefalse
to enable or disable choosing whether the admin should be able to edit content or not.
canCreate()
, canEdit()
or canDelete()
functions return anything other than a true
or false
value is best not to mess with that value because that value is supposed to be that way.WittyWorkflow uses filament-breezy to
manage user profiles. Change the following value to shouldRegisterUserMenu: true/false
depending on your app’s needs,
to enable/disable
profile editing on AdminPanelProvider.php
and TeamPanelProvider.php
for the Admin
and Team member
roles
->myProfile(
shouldRegisterUserMenu: false, // Sets the 'account' link in the panel User Menu (default = false)
shouldRegisterNavigation: false, // Adds a main navigation item for the My Profile page (default = false)
navigationGroup: 'Settings', // Sets the navigation group for the My Profile page (default = null)
hasAvatars: false, // Enables the avatar upload form component (default = false)
slug: 'profile' // Sets the slug for the profile page (default = 'my-profile')
)
->enableTwoFactorAuthentication(
force: false, // force the user to enable 2FA before they can use the application (default = false)
)
WittyWorkflow used the Shield
package to manage roles as stated above. In order to give permissions to manage appointments go on the Roles
section of the dashboard, inside the Settings
sidebar menu group and for both team_user
and panel_user
choose select all
on
the Appointment
model permissions and to give the panel_user
view permissions on the gallery choose view
and view any
under the Gallery
model permissions. Also give the panel_user
all permissions on the Order
model permissions.
super_admin
= The super admin of the systemteam_user
= The team members of the system assigned by the Super Adminpanel_user
= The panel for the customers[!NOTE]
In order to properly switch user panels for different roles the admin of the system must be assigned all the available roles (
super_admin
,team_user
andpanel_user
) in the user resource. That way the admin will not be prompted with a403
code when trying to access a panel that he doesn’t have access to.
There are quite a few steps you need to take to add/edit/delete variants, and I’ll walk you through all of them:
add/edit/delete
database variants.ProductVariant.php
factory if needed. As of now only the size
and color
variants are assigned on the initial database seed just to keep things simple.Enum
for the newly created variant in App/Enums
. To keep things simple, the enum can be named the same name as the database column, but you can name it whatever you want.getForm()
function in ProductVariant.php
model, add/edit/delete the desired variants.$table
function in ProductVariantResource.php
, add/edit/delete the desired variants.$table
function in VariationsRelationManager.php
, add/edit/delete the desired variants.config/enums.php
.ProductVariant.php
modelIf the above steps have been implemented, your newly created variant is ready for use throughout the app.
[!NOTE]
The App comes preloaded with some general variants and some tech variants. You should add the variant types that fit the type of store you’re building.
[!Important]
OTP is now available for an extra added layer of security. To enable OTP just go to your desired panels and uncomment
//FilamentOtpLoginPlugin::make(),
. The available panels areAdminPanelProvider.php
,CustomerPanelProvider.php
andTeamPanelProvider.php
. If you’re going to enable OTP is advisable to enable it on all panels but that depends on your app’s needs.
WittyWorkflow includes a comprehensive appointment scheduling system that integrates with email notifications and calendar systems.
The appointment system consists of several key components:
Appointment
and Service
models manage the data structureAppointments can be managed through the Filament admin panel:
The appointment system can be customized in several ways:
app/Models/Appointment.php
resources/views/emails/appointments/
resources/views/livewire/appointment-form.blade.php
WittyWorkflow comes with a comprehensive test suite covering models, features, and integrations.
# Run all tests
php artisan test
# Run specific test suite
php artisan test --testsuite=Feature
# Run specific test
php artisan test --filter=HeroTest
The test files are organized in the following directories:
tests/Unit/
: Unit tests for individual classes and methodstests/Feature/
: Feature tests for complete functionalitytests/Feature/Models/
: Tests for model functionalityWhen adding new features, create corresponding tests in the appropriate directory:
tests/Feature/Models/
tests/Feature/
tests/Browser/
(if using Dusk)Example of a basic model test:
/** @test */
public function it_can_create_a_model()
{
$model = YourModel::factory()->create();
$this->assertInstanceOf(YourModel::class, $model);
$this->assertDatabaseHas('your_models', ['id' => $model->id]);
}
WittyWorkflow is designed to be highly customizable without modifying core files.
tailwind.config.js
resources/css/app.css
resources/views/layouts/
app/Filament/Resources/
app/Filament/Widgets/
app/Forms/Components/
git clone https://github.com/kristi11/ww-filament.git /path/to/your/site
composer install --no-dev --optimize-autoloader
npm install && npm run build
.env.example
to .env
php artisan key:generate
php artisan migrate
php artisan config:cache
php artisan route:cache
php artisan view:cache
WittyWorkflow implements multiple security features to protect your application and data.
.env
: CACHE_DRIVER=redis
npm run build
To access the `super-admin dashboard, go to the Super-admin dashboard and enter the following credentials::
Email: admin@example.com
Password: password
To access the team dashboard
go to the Team dashboard and enter the following
credentials:
Email: team@example.com
Password: password
To access the customer dashboard
go to the Customer dashboard and create
an account
[!NOTE]
Known issues
The following are the known issues that need addressing and I hope that the community will step in and work on them:
- Cart items don’t get sent from
session id
touser_id
if the user was logged out when placing the order but after filling out the cart logs in/registers for an account to continue with the order.
Love open source? Help shape WittyWorkflow:
git clone https://github.com/YOUR-USERNAME/ww-filament.git
git checkout -b feature/your-idea
php artisan test
git commit -m "Add cool thing"
Use descriptive commit messages that explain what changes were made and why.
git push origin feature/your-idea
Check Issues for tasks (e.g., cart bug)—email tanellari@gmail.com with questions.
This project is distributed under the MIT License, one of the most permissive and widely used open source licenses.
Copyright (c) 2024 Kristi Tanellari
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Project Link: https://github.com/kristi11/ww-filament/
I’ve included a few of my favorite links to kick things off!