Welcome to AshterNext
We’re obsessed with creating exceptional customer and user experiences, supercharged by AI.
Projects
Apps, websites, SaaS platforms and design systems, built customer-first so they're easy to use and good to look at.
12cards

12Cards is a real-time card game for betting-shop kiosks, played for points. Every two minutes a three-ring wheel draws one of the 12 court cards and a multiplier on every screen at once, and a winning card pays 10 × stake × multiplier. One Node.js server on PostgreSQL runs the rounds, the wallets and an admin console that holds the game to a target return to player.
Tech
- React
- TypeScript
- Node.Js
- PostgreSQL
- Caddy
- GitLab
12Cards is a real-time card game built for betting-shop kiosks and played for points. Every two minutes a three-ring wheel draws one of the 12 court cards and a multiplier, live on every screen at once. Players stake chips on cards, suits or ranks, and a winning card pays 10 × stake × multiplier.
This is the second version, rewritten in 2026. The original ran on Django, Hasura, RabbitMQ, Dramatiq and Redis; the rewrite does the same job with one Node.js process and PostgreSQL, and a redesigned client tuned for low-end kiosk PCs.
Features
🎡 Three-Ring Wheel
The core of the game is a custom three-ring wheel: the rank (J, Q, K) on the outer ring, the suit in the middle and the multiplier (1× to 10×) at the centre. At the draw the rings spin in alternating directions for five seconds, like a shuffle, while a lucky-draw reel flips through cards beside them. The drawn card then lifts out over the wheel with the player's winnings, and a win sets off confetti.

🃏 Betting Board
The 12 cards sit in a grid with the suits across the top and the ranks down the side. Players pick a chip and tap a card, or tap a suit or rank header to cover the whole column or row at once. A right-click or long press takes a chip back off, Undo steps back, Double doubles the whole slip and Repeat brings back the last slip placed. Nothing leaves the balance until Place bet, which stakes the slip in a single database transaction.
⏰ Real-time Rounds
The round schedule is a pure function of the clock: rounds draw on every multiple of two minutes, so every kiosk counts down to the same second and nothing drifts. Betting closes 15 seconds before the draw, and the database clock rejects any bet that arrives after that. Results, trends and balances reach every screen over WebSockets, with no refresh.
🧑💻 In-house Draw Algorithm
Each draw first picks a multiplier by its weight, so multipliers keep their natural odds. It then works out what the house has to pay this round to sit exactly on the target return to player (RTP), counting every stake and payout since the RTP window started, and picks the card whose payout comes closest. The target, the multiplier weights and the chips are all set in the admin console and apply from the next draw.

📊 Admin Console
Admins get a live dashboard of house profit, RTP against the target, top-ups and player balances, with today, 7 days, 30 days, 12 months and all time side by side. Draw statistics compare how often each multiplier and card came up with their expected odds, and player activity shows who is staking and winning. The console also creates players, tops up and withdraws balances, and lists every round with its stakes, payouts and result.


🖨️ Printed Receipts via WebUSB
Kiosks print a ticket for every bet and claim on an ESC/POS receipt printer straight from the browser using the WebUSB API, with no driver or print dialog. Each ticket carries a barcode of the bet number, so a winning ticket is claimed by scanning it. Players can also claim on screen or switch on auto-claim, and their bet history can be filtered by status and date.

⚡ Built for Low-End Kiosks
The client is built to hold 60 fps on kiosk PCs with 4 GB of RAM and integrated graphics. Every visual effect belongs to a graphics tier: High adds glows, sparkles and confetti, Medium keeps the same motion without filters or blurs, and Low barely animates. Auto starts from the hardware and drops a tier if frames run late during a draw. Only transform and opacity ever animate, and the court-card art was minified from 1.4 MB to 177 KB gzipped. 12Cards also installs as a PWA, opens instantly from cache and reconnects by itself when the network comes back.

🧱 One Process Instead of Five
One Node.js process serves the API (Hono), the realtime socket (ws) and the round engine, on PostgreSQL through Drizzle. Balances only change through an append-only ledger, and a guarded update makes an overdraft impossible even under concurrent bets. Realtime events are published with Postgres NOTIFY inside the transaction that caused them, so they only go out if it commits. Any instance can run the round engine: an advisory lock elects one leader, a standby takes over within a heartbeat, and settlement is idempotent, so a retry can never pay twice. The client is React 19 with Vite, Zustand and CSS Modules, and Caddy serves it with automatic HTTPS.
💻 Demo Video
A full round from sign-in to claim, then the admin console. Recorded on a local build with eight simulated players betting alongside the demo account.
Tech
For the technically inclined—though perhaps technical expertise matters a little differently in this day and age. We make thoughtful product and technology choices, grounded in a deep understanding of your users, to ultimately deliver the best solution for your business.
React
NextJs
TypeScript
Flutter
CSS
Remix
NodeJS
Python
Django
GraphQL
PostgreSQL
AWS
Kubernetes
Terraform
- CI/CD
Testimonials
Don't just take our word for it. We asked clients and colleagues to spill the beans, and they were kind enough to be nice about it.
"Malik was a driven developer with a good amount of know-how.
He naturally adapted to Agile working methods. He showed genuine care for the users. It was an absolute pleasure collaborating with Malik"
"Best fit tech guy for any company working in latest technologies. Hard working dev with excellent problem solving skills and team management skills. Always delivers on time with quality and standard code. It was great working with him."
"Malik is a software developer with lot of potential and also posses knowledge of multiple technologies. He writes really well-managed and highly understandable code as well. Moreover, he is supportive towards the team which helps everyone to grow together which depicts he is also a team player. I strongly recommend him."
"There is no better colleague than Malik. He is one of the most dedicated professionals I’ve worked with and is willing to put that extra help whenever you need it. His expertise as a developer is considerable, and it helped our team develop more efficient solutions on a project and codebase. His contribution is valuable to the side, and I highly recommend Malik and would love to work with him again."
"I have worked with Malik for more than ten months, and I can tell his competence and sheer focus on doing things can make him reach heights. He always looks at the bigger picture no matter how sooner or later the delivery is. He has a really good grasp on techs, not only for the sake of development but for the core knowledge. He led our frontend team, and everybody had learned the confidence to solve problems with a broader mindset."
"I worked with Malik sir as a fellow staff member, and as my senior on the project, he is highly adaptable, encouraging, and supportive, and an effective leader. I learned a lot from Malik sir as a person, as an engineer and He has expertise and knowledge in the field, and the way he handles the team is genuinely remarkable. He has earned everybody’s respect through his skills and value. I'm so lucky I worked with malik sir."
Ping us and we'll get you started.



