DEV3 Mendfolk – Handyman Tasks Laravel Script with Prepaid Time Blocks, Offers, Timers & Escrow (Flutter Apps)

A self-hosted handyman marketplace on Laravel 12 and Filament 4 with customer and fixer Flutter apps: pick a fixer or compare offers, prepay a block of time, a server-side timer, top-ups, refunds of unused minutes and disputes. Admin panel. Installer and demo data included.

by DEV3 TechnologiesVerified Author(0) 0 sales 0 viewsUpdated 05 Nov 2026

Video tour. Pick a section below to browse 112 screenshots in 21 sections.

App & phone tours

Tap play to watch each app. Nothing downloads until you do.

  • Customer app1:14
  • Fixer app0:52

Mendfolk is a handyman tasks marketplace that you host yourself, built by DEV3 Technologies on Laravel 12 and Filament 4, with two Flutter apps: one for customers and one for fixers. A customer writes down what needs fixing, then either books a named fixer at that fixer's hourly rate or posts the job and compares offers. The money for the estimated time is taken up front as a prepaid block and held. The fixer runs a timer on site, anything beyond the block needs the customer's approval, and the unused part is refunded. The demo business is a fictional harbour town, Brackenhythe, with 1,600 customers, 120 fixers and about six months of task history, priced in New Zealand dollars with 15% GST included.

No live demo: 112 grouped screenshots and a desktop video tour show the marketing site (a photo hero and flat layouts), the public fixer pages, the customer account, the admin panel and both apps. Install it with the demo data to try every role on your own server.

Customers

  • A public site with a photo hero, a short explainer of how the prepaid block works, a fixer browse page with category chips and sort buttons, trade cards with rates per skill, tools, portfolio and reviews, a booking wizard, and an account area with the live task, offers, top-ups and the bill.
  • A customer app with a Fix List (jobs on ruled paper with an estimate on each line, a photo, a bundle of several jobs booked together), a brief, a fixer list with filters, fixer profiles and portfolios, and a time picker that shows only the hours a fixer is free.
  • Two ways to book: pick a person, or post for offers and compare up to five offers side by side (hourly or fixed price, start time and block total) before accepting one.
  • A paid block with a labour, fee and GST breakdown, a hold countdown, a start code to give the fixer, a live task with a timer against the block bar, a top-up approval with a reason, a photo and a countdown, and a chat with photos.
  • A bill with minutes, labour, receipts and the refund of the unused block, a dispute, a rating and tip, a Mend Promise claim within 14 days, free or fee-bearing cancellation with the exact fee shown first, and a wallet.

Fixers

  • A fixer app whose home is a spike of paper tickets, with open tasks that fit the fixer's skills (and how many of the five offer places are taken), a send-offer form with an hourly or fixed price, instant requests with a countdown ring, and a calendar with working hours, time off and a floor-and-ceiling rate per skill.
  • Documents (ID, licence, insurance), a portfolio upload, a route to the job that shows the address only after booking, a start code pad with a try limit, and a timer with an 80% warning and unbilled minutes shown plainly.
  • Top-up requests for more time or materials, receipts counted against a materials allowance, before-and-after photos, a bill submit step, a no-show wait timer, earnings by week, tier progress with strikes, and a cash-out request.

Admin panel

  • A dashboard with six live counters and a flat Work on the bench widget showing timers running now and tasks today for each trade, refreshed every ten seconds.
  • A task board by status, timers running now with minutes against the block, open tasks with no offers, task detail (brief, offers, timer events, top-ups, receipts, bill and split, chat transcript), and tabs by status with CSV export.
  • Fixer applications, a documents queue for licences and insurance ending within 14 days, portfolio moderation, categories with rate bounds, disputes with a decision dialog, Mend Promise claims, flags (arrival far from the address, runaway timers, receipts without a photo), escrow balance, settlements, payouts and reports.

Time, money and fairness

  • The prepaid block is the estimated minutes at the fixer's rate, plus the service fee, plus a materials allowance. Billed minutes round up to the next 15 and are capped at the paid block. A worked example is in the buyer guide.
  • A top-up grows the block only after its payment succeeds, and a top-up that the customer does not answer expires. A bill that the customer does not confirm confirms itself after a set time. Defaults for all of these are settings.
  • Fixers have tiers (apprentice, journeyman, master) with a commission by tier. Staff can read the chat, decide disputes and refund up to the bill.
  • Every deadline is enforced when a record is read, so nothing waits for the scheduler. Card refunds are written in the same transaction as the money, sent after commit and retried. Money is stored as integer cents, and a reconciliation command (mendfolk:check) checks the escrow balance against the open tasks.

What is included

  • The Laravel application with Composer packages and compiled assets inside (no Node.js or Composer on the server), both Flutter projects in apps/, the shared DEV3 Flutter package, a web installer and an HTML buyer guide.
  • Demo data for the fictional harbour town: 120 fixers, 1,600 customers and thousands of tasks with offers, timers, bills, disputes and claims.

Good to know

  • Payments and push are simulated by default. The simulated gateway works out of the box, so booking and paying need no keys. Stripe, Razorpay and PayPal drivers are included but were not run against real accounts. Push notifications are logged, not sent, until you add FCM or APNs keys.
  • Nothing is charged without the customer. Block payments and top-ups need the customer to tap and pay; there is no charge to a stored card. Billable time stops at the paid block and anything beyond it is shown as unbilled.
  • Stripe refunds have no idempotency key yet. A gateway timeout after Stripe accepted a refund can be retried, so check your Stripe dashboard for duplicates and add a key in the driver before you take real card payments.
  • The apps were not tested on physical devices. They build as debug Android packages and run on the iOS simulator. The arrival location check was compiled and run on simulators only, and it flags a far-away start for support but never blocks a job. The fixer sign-up screen was tested only against the app's built-in demo server.
  • Updates are polled, not pushed. Chat and job status refresh about every 5 seconds. There is no offline queue for the timer, no customer signature and no barcode scanning.
  • Some race paths are not covered by the parallel tests. A payment against a hold expiring, an accept against an offer expiring in the same second, two parallel starts and parallel dispute refunds are not in the MySQL race checks. The order in which rows are locked is covered by a test, but that test proves the order, not MySQL blocking.
  • A failed extension has two rough edges. An overlap after a failed extension is flagged on the same task rather than on the next job, and a second top-up after a failed extension does not retry the cells that were missing.
  • Rejecting a fixer application suspends the account. There is no separate rejected status. In demo mode some thumbnails (brief photos, Fix List items and receipts) are generated tiles.
  • Photos. The website uses two stock photos and the apps' demo mode uses seven more, all taken from Pexels. DEV3 could not open the Pexels pages to confirm the photographer or the licence line of each photo, so check each photo's page, or replace the files in public/images/photos and apps/*/assets/photos, before you launch publicly.
  • Use MySQL or MariaDB on a live site. The Pest tests run on SQLite, where row locks do nothing; the concurrency checks that prove the locking run on MySQL 8.
  • Demo data takes time to load. About 8,000 tasks take roughly 40 seconds on MySQL and longer on a slow host. If the installer stops part way, raise the request time limit and install again on an empty database, or choose an empty install.
  • Name: Mendfolk is a working name checked by a web search only, not a trademark clearance. Check it before you launch under it.
  • No hosted demo. Every customer, fixer and record in the screenshots is fictional. Install it with the demo data to try every role on your own server.

Quality checks

Mendfolk 1.0.0 passed the seven release gates of the DEV3 Laravel suite on the final code: static analysis (Larastan level 6, 0 errors), 147 Pest tests with 2,804 assertions, a front-end size budget (8.0 KB of JavaScript and CSS gzipped), migrations and seeding on MySQL 8 and SQLite, a headless-browser pass over 45 admin and home pages including a parallel-request check on the offer limit, an installer test from the zip, and a secret scan. The customer app passed analysis and 124 tests, and the fixer app 66 tests, with debug Android and iOS simulator builds. A review of the money and locking code led to fixes, each with a regression test. Lighthouse scores were not measured.

How it's built

Architecture, stack, key decisions and the quality gates DEV3 Mendfolk passed before release.

The engineering behind Mendfolk: a prepaid block held in escrow, a server-side timer, top-ups that grow the block only after payment, a fixed lock order and card refunds written with the money and retried after commit.

The problem it solves

A handyman job is paid by the minute but booked in advance. The customer needs a price up front, the fixer needs to be paid for the time worked, and neither should be surprised. The job runs over, the customer pays for more time while the fixer is still working, offers arrive at the same moment a customer books someone else, and a refund must neither be lost nor sent twice.

Architecture and approach

Mendfolk is a Laravel 12 application with a Filament 4 admin at /admin, a public website with a customer account page and a REST API used by two Flutter apps.

One prepaid block

A task is paid as a block: the estimated minutes at the fixer's rate, the service fee and a materials allowance. The money sits in escrow. The bill is worked out from the minutes the server timed, rounded up and capped at the paid block, and the unused part is refunded.

Server time and top-ups

The timer uses the time the server received each start, pause and stop, never the phone's clock. A top-up is a separate payment, and the block grows only when that payment succeeds. Late or duplicate payments are refunded.

One lock order

Every path locks rows in the same order through one entry point: task, offer, fixer, calendar cells, promo, top-up, pending refund, then wallets. A test records the order from the query log. Deadlines are enforced when a record is read, and the scheduled command only sweeps what nobody opened.

Refunds

Card refunds are written as a row in the money transaction, sent after commit and retried by the scheduler, then credited to the wallet. Gateway calls only run outside a transaction.

Apps

The customer and fixer apps share one API contract with the server and start in a demo mode that needs no server.

Quality gates and results

Mendfolk 1.0.0 passed the seven release gates on the final code: 147 Pest tests with 2,804 assertions, 45 admin and home pages in a headless browser including an offer-limit race, the installer test from the zip and a clean secret scan. The customer and fixer apps pass analysis and 124 and 66 tests.

Limits are listed on the item page: payments and push are simulated by default, Stripe refunds have no idempotency key yet and some race paths are not in the parallel tests.

Tech stack

Area Technologies
Application Laravel 12, Filament 4, Blade, REST API
Tasks Prepaid time block, Server-side timer, Offer limit, Top-ups
Money Escrow ledger, Durable card refunds, Wallet credit fallback, Mend Promise pool
Apps Flutter customer app, Flutter fixer app, Shared dev3 Flutter package, Demo mode
Quality Pest, Static analysis, Headless browser smoke, Lock-order test

Inside the build

Dashboard dark: Tool tiles, six live counters and the charts on the workshop night theme. Dashboard dark — Tool tiles, six live counters and the charts on the workshop night theme.

Dashboard light: The same dashboard on sawdust paper with teal and pencil-yellow accents. Dashboard light — The same dashboard on sawdust paper with teal and pencil-yellow accents.

Guides & articles

Practical guides and engineering write-ups for DEV3 Mendfolk.

Handyman marketplace software: 7 things to check before you pick one

Last updated
Handyman marketplace software: 7 things to check before you pick one: DEV3 Mendfolk

Handyman work is paid by the minute but booked in advance. Here are seven things to check before you pick software, with DEV3 Mendfolk as the worked example.

Mendfolk hero: a fixer drilling into a plank, with the headline and the Start your Fix List button

1. Can the customer choose the person?

Some jobs go to a named fixer, others are posted for offers. Mendfolk supports both, and caps the offers on a task so the customer is not buried.

Offers side by side with the lowest total marked

2. What is paid up front?

Look for a prepaid block of time with the fee and materials allowance shown before payment. Mendfolk holds the block and refunds the unused part.

The block explained: tokens spent on the job and tokens sliding back to the customer

3. Who keeps time?

Check that the clock is the server's, not the phone's, and that billing stops at the paid block.

The live task with the timer against the block

4. How are extras handled?

A top-up should need the customer's yes and a payment before the block grows. Receipts should count against an allowance.

5. What happens in a dispute?

Look for a decision page that picks who was at fault and a refund limited to the bill.

Deciding a dispute in the admin panel

6. How are fixers vetted and paid?

Documents with expiry dates, tiers with a commission by tier, strikes and a cash-out request.

7. What is not finished?

Ask for the limits in writing. For Mendfolk: payments and push are simulated by default, Stripe refunds have no idempotency key yet, and the apps were run on simulators, not on physical devices.

Video tour of Mendfolk

Frequently asked questions

The complete source code (version 1.0.0) as a download from your account, with the setup and usage guides shown on this page. You can modify the code to suit your product.

Buying guides: Laravel scripts with Filament panels and a web installer · Next.js or Laravel for a SaaS script?

More from this author

View all

Related in Web Scripts & Software

View all