Inspiration

Every coding interview I've done was a conversation. You explain your idea out loud, the interviewer pokes holes in it, and you fix it as you go. But when I practised, I was always typing code into a box and waiting for tests to pass. When I got stuck, I opened the solution. I got better at writing code and never got better at explaining it.

So I built the practice partner I wanted: something that already knows the answer, refuses to tell me, and makes me talk my way there.

The catch is that every turn of that conversation costs money in AI calls. I wanted anyone to be able to try it for free, and I wanted heavier users to be able to pay for more time without me building accounts or touching their card details. That's where PayPal came in.

What it does

Dry Run is an Android app for practising coding-interview problems by voice. You read the problem, tap the mic and talk through your approach. There's no code editor and no multiple choice. You have to say it.

The tutor knows the reference solutions but won't give them away. If your idea is wrong, it asks you a question or shows you a case that breaks it. If you're really stuck, it gives you a small hint. It never tells you "correct".

For example, on a problem called Pair Sum with $n \le 10^7$, someone might suggest checking every pair with two loops. The tutor won't say "too slow". It points out that's about

$$\binom{n}{2} \approx \frac{n^2}{2} = 5 \times 10^{13}$$

pairs, and asks if there's a way to avoid checking all of them. Most people find the hash map on their own from there.

When you finish, a separate grader goes over the conversation and tells you which key ideas you reached, which ones you needed a nudge for, and what you missed. Every point it gives you comes with a quote of what you actually said. Then you get the full write-up.

The free version gives you the daily problem and a few sessions. Pro Plus is $4.99 a month through PayPal (sandbox for the hackathon). It unlocks every problem, lets you redo any of them, and gives you more sessions and voice time each day. You tap subscribe, approve in PayPal, and when you come back to the app it shows Pro Plus as active a few seconds later. Cancelling is one tap, and you keep Pro until the month you paid for runs out.

How I built it

The app is Flutter. Your transcripts and history stay on your phone.

Behind it is a small server on Cloudflare Workers. It keeps the answers to each problem (so they never reach the phone), the PayPal credentials and the AI key. Its database only stores usage limits and subscription status.

The PayPal side uses the Subscriptions API. A setup script creates the product and the monthly plan. When you tap subscribe, the server creates a subscription tied to your device and the app opens PayPal's approval page in your browser. After you approve, PayPal sends you to a page on my server, which checks the subscription and sends you back into the app.

PayPal also sends webhooks when a subscription starts, gets cancelled, fails to pay and so on. The server checks each webhook's signature, then asks PayPal directly for the subscription's status instead of believing what the webhook says. If a webhook never arrives, the app's next status check catches up anyway.

The AI runs on Nebius Token Factory. NVIDIA Nemotron plays the tutor and the grader, and Llama 3.3 fixes speech-to-text mistakes like "hash mop" instead of "hash map". Speech-to-text itself is Groq Whisper, and the phone's built-in recognizer takes over when the daily voice limit runs out.

Since paid sessions run on my AI credit, Pro has its own daily and total spending limits. If they're hit, Pro sessions quietly drop to the free setup instead of running up a bill. There's also a switch to turn Pro off completely.

Challenges

Knowing whether someone has actually paid. Webhooks can be faked, repeated or lost. I ended up treating them as a reminder to go and ask PayPal, never as the truth. That plus a check on demand made the subscription state reliable.

Getting people back from the browser. Payment happens on PayPal's site, outside the app. The return page on my server and a deep link back into the app fixed that, and the app keeps checking for a minute until PayPal confirms.

Keeping the AI bill under control. Every Pro conversation costs real credit, so the spending limits had to sit on the server, next to the subscription check, where nobody can get around them.

Stopping the tutor from giving the answer away. A model that knows the solution really wants to share it. It took nine versions of the tutor prompt, a filter that checks every reply for answer words before it's sent, and a rule against hint-questions like "what if you used a hash map?"

Grading fairly. Early versions of the grader gave people credit for ideas the tutor had said and they had just agreed with. Now every credit needs a quote in the learner's own words, and a second check confirms the quote is really in the transcript.

What I'm proud of

You can subscribe, come back, cancel and run out the month with no account and without me storing any of your personal or payment details. I only keep the subscription ID, which device it belongs to, its status and when it ends.

The tutor pushes back without saying "correct" and without giving the answer. And when the grader gives you credit, you can see exactly what you said to earn it.

What I learned

With subscriptions, PayPal is the source of truth. My job is to ask it, not to trust what I'm told.

If a subscription is paying for AI, the spending limits have to live on the server with the subscription, not in the app.

With a tutor, what the AI must not say is as important as what it says, and the rules that matter most need to be enforced in code, because a prompt alone doesn't hold.

What's next

Switching from the PayPal sandbox to real billing, adding more problems, and an interview mode with a timer, follow-up questions and a mock hire / no-hire result at the end.

Built With

Share this project:

Updates

Submission history