Tibbuk
Everything a medical student needs for clinical rotations, with their name engraved on it, delivered to their door. Plus a shop the owner can run entirely from a phone.
- Role
- Sole engineer
- Year
- 2026
- Web
- Laravel · Inertia · React
- Mobile
- Flutter · Riverpod · FCM
- Market
- Medical students, Jordan
- Source
- Private repository
"Order, receive, start your rotation."
Med students in Jordan buy the same kit every year: stethoscopes, scrubs, instruments. Tibbuk is one storefront built around exactly that list. There's no minimum spend, CliQ payments, delivery anywhere in Jordan, and your name engraved on the stethoscope for free.
The interesting engineering is in the products. A stethoscope can be engraved, scrubs come in sizes, cuts and colours, and any item can have embroidery. So the product model carries its own options (allows_engraving, allows_stitching, available_sizes, available_colors, gender and variants), and checkout, the admin and the app all respect them.
The admin lives in the owner's pocket.
A small shop doesn't run from a desk. So the Flutter app holds two products in one binary: the storefront for students, and a full admin console behind biometric sign-in for the owner. A dedicated Laravel admin API gives the app the same power as the web dashboard.
Edit anything after checkout
- Items, customer details, engraving, size and variants
- Delivery fee as an editable line item
- A status log for every change
From order to doorstep
- Bulk packing slips
- One-tap WhatsApp to the customer
- A public order-tracking page
Push campaigns
- FCM HTTP v1 from both web and mobile
- Send history and test sends
- Errors shown in the UI, not swallowed
Financials, not just sales
Products store a cost price next to the sale price, so the financials screen shows margin, not just revenue. Discounts are a first-class model.
Passkeys and 2FA
The web admin supports passkeys and two-factor auth. The app's admin is locked behind Face ID or a fingerprint.
Built in one monorepo and debugged in production.
The Laravel app and the Flutter app live in the same repository, and GitHub Actions builds the Android APK on every push. The commit log reads like a real launch. Firebase init became non-fatal after a white screen on launch. Clients reload themselves when a stale JS chunk appears after a deploy. Device builds were switched to the correct APNs environment. A dedicated FCM debug endpoint was added for when push goes quiet.
Later I cut the same commerce engine into a completely different store. That became Abujad.