An open-source, self-hostable alternative to Buy Me a Coffee and Ko-fi, built for live performers — bands, street musicians, and service crews. Your audience scans a QR code, picks an amount, and the money lands directly in your Stripe account. No platform fee, no middleman.
🌐 Project page · 🐛 Report an issue · 📄 MIT License
live.tips lets teams create a public tip page where anyone can send them tips via mobile payment. Each team gets a unique handle-style URL like /@bandname that can be shared via QR codes — printed on a sign or projected on stage.
- Teams sign up, create their profile, and connect a Stripe account (or add a MobilePay/Revolut payment link)
- Tippers scan a QR code or visit the URL, select an amount, and pay
- Tips are recorded and visible in the team's dashboard — and on the live on-stage screen, in real time
- Public tip pages with
@style URLs and QR code generation - Live mode for on-stage performances — live sessions with a public real-time tip activity screen
- Stripe Connect (Express) payments — card payments with SCA support, webhook-driven, straight into the team's own Stripe account
- MobilePay / Revolut payment links as alternatives
- Multi-tenant team system with roles (Owner, Admin, Member) and fine-grained access rights
- Email-based invitation system and transactional emails
- Full admin panel built with Filament
- Multi-language: English, Finnish, Lithuanian
- Mobile-first responsive design
- Comprehensive test suite (unit, feature, and real-browser tests)
The platform is feature-complete and working — everything above runs today. There is no hosted version yet: running a public service costs money, so for now live.tips is self-host only. A hosted version at live.tips is planned once there's enough interest.
The project is actively maintained:
- 🐛 Found a bug? Open an issue — it will get fixed.
- 🔀 Pull requests are welcome and get reviewed and merged.
- 🆓 MIT-licensed — use it for your band, your venue, your fundraiser, or your own product.
- Backend: Laravel 12, PHP 8.4+
- Admin Panel: Filament
- Frontend: Livewire, Alpine.js, Tailwind CSS v4
- Payments: Stripe Connect (Express)
- Database: SQLite (development), PostgreSQL (production)
- Testing: Pest v4 (incl. Playwright-driven browser tests)
composer setupThis installs dependencies, prepares the database, builds assets, and enables the mandatory git hook described below.
Every contributor must enable the project git hook. A version-controlled
pre-push hook (in .githooks/) runs the full quality gate and aborts the push
if anything fails, so unformatted code or failing tests never reach the remote.
Enable it once per clone (this is required — composer setup does it for you):
git config core.hooksPath .githooks
# equivalently:
composer setup:hooksOn every git push the hook runs, in order, and blocks the push on the first failure:
- Code style —
vendor/bin/pint --test - Unit & feature tests —
php artisan test - Browser tests —
php artisan test tests/Browser
The browser tests drive a real Chromium through Playwright. One-time setup:
npx playwright install chromiumRequires Playwright ≥ 1.60 (already pinned in
package.json). Earlier versions hang during the browser install on Node 24.16+/26.
They also need the front-end assets to be available — either keep the dev server
running (composer run dev) or build once (npm run build).
The
tests/Browser/Turnstile*tests are currently skipped: they were written against a removedpest-plugin-browserAPI and depend on a live Cloudflare sitekey. Re-enable them after a rewrite.
vendor/bin/pint # fix code style
php artisan test # unit + feature tests
php artisan test tests/Browser # browser testsRun the app with a queue worker (composer run dev includes one), then forward webhooks:
stripe listen --forward-to localhost:8000/stripe/webhooks --forward-connect-to localhost:8000/stripe/webhooksPut the printed whsec_… into STRIPE_WEBHOOK_SECRET in .env and run php artisan config:clear.
Then donate on a Stripe-connected team page and pay with a test card:
4242 4242 4242 4242— succeeds4000 0025 0000 3155— triggers the 3D Secure (SCA) challenge
Any future expiry, any CVC. The tip flips to paid only once the payment_intent.succeeded webhook is processed.
docs/ARCHITECTURE.md- System architecture and design decisionsdocs/roadmap/- Feature roadmap and task breakdowndocs/roadmap/history/STATE.md- Current implementation statussite/- Static landing page deployed to GitHub Pages
Released under the MIT License.