A self-hostable, open-source email signature management platform built with Laravel and GrapesJS. Design professional, Gmail-compatible email signatures visually with a drag-and-drop editor, manage multiple signatures per user, and administer your team through a built-in admin panel.
Published by Mythfinity Ltd.
- Visual Drag & Drop Editor — Powered by GrapesJS with the official Newsletter Preset for email-optimized layouts
- Gmail-Compatible Export — Automatic CSS inlining and table-based layouts that render correctly in Gmail and other email clients
- One-Click Copy — Copy signatures as formatted HTML (for Gmail) or raw HTML (for other applications)
- Automatic Image Upload — Drag-and-drop images are automatically uploaded and hosted (no base64, Gmail-friendly)
- Multiple Signatures Per User — Create, rename, duplicate, and delete as many signatures as needed
- Admin Panel — Full user management with role-based access control (admin / user)
- Quick Role Management — Promote or demote users instantly via AJAX-powered dropdowns
- Login-As Support — Admins can switch into any user's session for support and troubleshooting
- Secure Previews — Sandboxed iframe previews protect against XSS
- Responsive UI — Modern interface built with Tailwind CSS and Alpine.js
- Laravel 12.x — PHP web application framework
- Laravel Breeze — Authentication scaffolding
- Spatie Laravel Honeypot — Spam protection
- PHP 8.2+
- MySQL (or any Laravel-supported database)
- GrapesJS — Visual drag-and-drop editor
- grapesjs-preset-newsletter — Email-optimized block library
- Tailwind CSS — Utility-first CSS framework
- Alpine.js — Lightweight reactive JavaScript
- Vite — Frontend build tool
- Laravel Pint — PHP code style fixer
- PHPUnit — Testing framework
- Laravel Pail — Log tailing
- Laravel Sail — Docker-based local dev environment
- PHP 8.2 or higher
- Composer 2.x
- Node.js 18+ and npm
- MySQL 8.0+ (or MariaDB / PostgreSQL / SQLite)
- A web server (Nginx or Apache) for production
git clone https://github.com/Mythfinity/email-signature-manager.git
cd email-signature-managercomposer installnpm installcp .env.example .env
php artisan key:generateEdit .env and set your database credentials and app URL:
APP_NAME="Email Signature Manager"
APP_URL=http://localhost:8000
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_passwordphp artisan migrateFor production:
npm run buildFor development (with hot reload):
npm run devphp artisan tinker$user = User::create([
'name' => 'Admin',
'email' => 'admin@example.com',
'password' => 'your-secure-password',
]);
$user->role = 'admin';
$user->save();php artisan serveVisit http://localhost:8000 and log in with your admin credentials.
- Log in and click New Signature on the dashboard
- Use the GrapesJS editor to drag and drop blocks (sections, images, text, etc.)
- Click Save when done
- On the dashboard, click Copy for Gmail on any signature
- Open Gmail Settings → Signatures, and paste into the signature editor
- Save the Gmail settings
- Navigate to
/admin/users - Create, edit, or delete users
- Change roles via the dropdown next to each user
- Use Login as to troubleshoot issues from a user's perspective
app/
├── Http/Controllers/
│ ├── SignatureController.php # Signature CRUD, Gmail formatting
│ ├── BuilderController.php # GrapesJS editor routing
│ └── Admin/UserController.php # User management
├── Models/
│ ├── User.php # User with custom password_hash field
│ └── Signature.php # Signature model
└── Support/
└── SignatureFormatter.php # Gmail HTML formatter & sanitizer
resources/
├── js/
│ └── grapesjs-editor.js # GrapesJS config with newsletter preset
└── views/
├── dashboard.blade.php # Signature listing with iframe previews
├── builder-grapesjs-clean.blade.php # Clean editor page
└── admin/users/ # Admin user management views
routes/
└── web.php # Application routes
# Clear caches
php artisan cache:clear
php artisan config:clear
php artisan view:clear
php artisan route:clear
# Run tests
php artisan test
# Check code style
./vendor/bin/pint
# Watch assets during development
npm run dev
# Build production assets
npm run build
# Create a new migration
php artisan make:migration create_example_table- Set
APP_ENV=productionandAPP_DEBUG=falsein.env - Run
composer install --optimize-autoloader --no-dev - Run
npm run build - Run
php artisan migrate --force - Cache configuration and routes:
php artisan config:cache php artisan route:cache php artisan view:cache
- Ensure
storage/andbootstrap/cache/are writable by the web server - Configure your web server (Nginx/Apache) to serve from the
public/directory
- All state-changing endpoints are CSRF-protected
- Signature previews are rendered in sandboxed iframes to prevent XSS
- Image uploads are validated by MIME type, file size (max 5MB), and magic bytes
- Admins cannot change their own role (prevents lockout)
- Policy-based authorization for all signature operations
If you discover a security vulnerability, please email the maintainers rather than opening a public issue.
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Please follow the existing code style (run ./vendor/bin/pint before committing) and include tests where applicable.
Copyright (C) 2026 Mythfinity Ltd.
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).
This means you are free to use, modify, and distribute this software, but if you run a modified version as a network service (e.g., SaaS), you must make the source code of your modifications available to your users under the same license.
See the LICENSE file for the full license text, or visit gnu.org/licenses/agpl-3.0.
- Laravel — The PHP framework powering the backend
- GrapesJS — The visual editor at the heart of the signature builder
- grapesjs-preset-newsletter — Email-optimized blocks and layouts
- Tailwind CSS — For the clean, modern UI

