Kargah is a self-hosted Laravel application that combines email, project boards, accounting and a data vault behind one login, aimed at solo freelancers and small studios.
Kargah (Persian: کارگاه, workshop) puts four tools that freelancers normally run as separate subscriptions — a mail client, a Trello-style board, invoicing and a password/file store — into a single Laravel application with one database and one session.
It is built to run on ordinary PHP shared hosting rather than on a VPS with Redis and Supervisor. Background work goes through a database-backed queue driven by a plain cron entry.
- PHP 8.3+ with
bcmath,curl,fileinfo,gd,intl,mbstring,openssl,pdo,zip - MySQL 8.0+ / MariaDB 10.6+ (or SQLite)
- Composer 2
- Cron access (one entry, once a minute)
- No shell daemon, no Redis, no Node.js on the server
git clone https://github.com/morpheusadam/kargah.git
cd kargah
composer install --no-dev --optimize-autoloader
cp .env.example .env
php artisan key:generate
# configure DB credentials in .env, then:
php artisan migrate --seed
php artisan storage:linkPoint your web root at public/ and add one cron entry:
* * * * * cd /path/to/kargah && php artisan schedule:run >> /dev/null 2>&1
Kargah ships without a bundled admin theme. The UI is written against a Tailwind admin template
which you supply yourself — drop its compiled assets into public/assets/. See
docs/theme.md for the expected structure and a list of MIT-licensed
alternatives if you do not own a commercial template.
Independent boards you create and name yourself, with custom lists, drag-and-drop cards, labels, checklists, due dates, attachments and comments.
- Unified inbox over IMAP, synced into the local store by a background job so pages do not block on a network round-trip.
- Bulk campaigns routed across multiple delivery providers (Brevo, Resend, Amazon SES, Mailgun, SMTP2GO and others) with per-provider daily quotas, health scoring and automatic failover.
- Shared suppression list — a hard bounce on one provider blocks that address on all of them.
- Campaign replies thread back to the right contact via signed
Reply-Totokens.
Invoices with estimates and recurring billing, categorised expenses, a client book, and monthly profit and loss reports.
Files, an encrypted credential vault, saved links and Telegram bots, GitHub repositories pulled through the API, and scheduled backups stored outside the web root.
Notifications from every connected network in a single stream, and a composer that publishes one post to several networks at once with per-network character limits enforced live.
A WordPress site driven over its own REST API with an application password: posts and pages edited where they are stored rather than where they are rendered, a comment queue that opens on what is waiting, the media library with the alternative text most of it is missing, categories and tags ordered by what the site actually uses, an SEO audit that names the missing field and the page it belongs to, cache purging, role changes, plugin switches and the site's own settings.
Nothing is mirrored into Kargah's database — a website has other editors, and a stale copy shown confidently is worse than being honestly slower. Two features need a few lines added to the site because WordPress exposes neither over REST to anybody: Rank Math's SEO fields, and cache purging. Both pages detect the situation and hand over the mu-plugin rather than offering a control that silently does nothing.
Each area is a self-contained nwidart/laravel-modules
package with its own routes, views, migrations and Livewire components:
Modules/
├── Project/ boards, lists, cards
├── Accounting/ invoices, expenses, clients, reports
├── Mailbox/ IMAP inbox, campaigns, contacts, providers
├── Data/ files, vault, links, repos, backups
├── Social/ notifications, publishing, accounts
└── Site/ a WordPress website: content, media, terms, SEO, cache
Deleting a module directory removes that feature. Adding one requires no change to the app shell beyond a single navigation entry.
| Layer | Choice | Why |
|---|---|---|
| Framework | Laravel 13 | Scheduler, queues and Eloquent out of the box |
| UI | Livewire 4 (single-file components) | Reactive pages without a SPA build step |
| Modules | nwidart/laravel-modules | Real isolation, not folders |
| Mail receive | webklex/php-imap |
Pure PHP — no ext-imap needed on shared hosting |
| Mail send | Provider APIs over HTTPS | Never the host's own mail server |
| Database | MySQL 8 / MariaDB (SQLite for dev) | Whatever your host gives you |
| Queue | Database driver + cron | No daemon, no Redis, no Supervisor |
- Modular application shell, auth, navigation
- Front-end for all five modules
- Board persistence and card detail drawer
- IMAP sync job and message store
- Campaign queue, provider router and suppression list
- Invoice PDF generation
- Encrypted vault with per-item reveal auditing
- GitHub and Telegram integrations
- Lead crawler
Issues and pull requests are welcome. Please open an issue before starting significant work so the design can be agreed first.
MIT © Kargah contributors.
The admin theme assets referenced under public/assets/ are not part of this repository and are
not covered by this license. You must hold your own license for whichever template you use.