DEV Community

Quinn Wang
Quinn Wang

Posted on

The First Fifteen Minutes: One Preflight, One Fix

The thing that decides whether a new AI coding setup survives contact with a real repo is almost never the model — it is whether the first fifteen minutes end in something you can verify. I have been tearing down first-run experiences for a while now, and the pattern keeps repeating: people lose the quarter hour to a handful of small uncertainties, then blame the tool for being slow. So instead of reviewing features, let me show you the stopwatch I use, the friction log it produces, and the single fix that actually moved the needle for me.

The premise is boring on purpose. You cannot improve a setup you have not timed, and most of us never time anything; we just remember that it "felt slow" and carry that feeling into the next tool we try. A clock turns a vague feeling into a row in a file, and a row in a file turns into an argument you can act on. Isn't that a better basis for a decision than vibes?

Clock every step before you judge anything

I start by sourcing a tiny timing helper into the shell session, so every step I take gets a timestamp without me thinking about it. The script is deliberately dumb: it records elapsed seconds and a note, and it never tries to be clever about what a "step" is. You decide that, and you decide it before you start, which is the whole point.

#!/usr/bin/env bash
# clock.sh — source me, then call mark after every step
set -uo pipefail

LOG="${CLOCK_LOG:-friction.tsv}"
[ -f "$LOG" ] || printf 'step\tseconds\tnote\n' > "$LOG"
CLOCK_T0=$(date +%s)

mark() {
  local now; now=$(date +%s)
  printf '%s\t%s\t%s\n' "$1" "$((now - CLOCK_T0))" "${2:-}" >> "$LOG"
  printf '[%3ss] %s %s\n' "$((now - CLOCK_T0))" "$1" "${2:-}"
}
Enter fullscreen mode Exit fullscreen mode

Then a first run looks like this, with the setup command replaced by whatever the project's README currently tells you to run — I am not going to paste an install line I cannot verify against today's docs.

source ./clock.sh
mark "account"     "signed in, key copied to clipboard"
mark "install"     "ran the documented setup command"
mark "server"      "free server option selected"
mark "first-prompt" "opened editor, sent a trivial question"
mark "first-diff"  "got a change I could actually apply"
column -t -s $'\t' "$LOG"
Enter fullscreen mode Exit fullscreen mode

The last row is the only one I really care about, because everything before it is preparation and everything after it is work. If first-diff lands at two minutes or at nineteen, that number describes the tool's design more honestly than any feature list. What would your own log say about the last three tools you tried?

Here is the shape of my log from a recent run through an AI coding setup that offers free model access plus a free server option. These rows are illustrative of the format, not measurements from a controlled benchmark — rerun the clock yourself before you quote anything.

step          seconds  note
account       42       key copied, no docs needed
install       96       two commands, one PATH fix
server        18       free server option, no card prompt
config        151      env vars invented by me, not documented
first-prompt  63       worked, but model choice unclear
first-diff    644      mostly me re-reading setup notes
Enter fullscreen mode Exit fullscreen mode

Look at the two biggest numbers and notice that neither of them is the model. Config and re-reading together account for more than half the wall clock, and both are pure friction: nothing was learned, nothing was produced, and no token was spent. That is the leak I keep finding in onboarding budgets, and it is cheap to plug.

The one fix that mattered

The fix was not a tutorial and it was not better documentation — it was a preflight script that refuses to let me start until the boring questions are already answered. Instead of discovering an unreachable endpoint inside my editor, I discover it in a two-second terminal command that prints a clear OK or FAIL per check. Failure moves to the place where failure is cheap.

I wrote the version below against a generic OpenAI-compatible shape, so treat the paths as placeholders to adjust against the project's current API reference rather than gospel. The structure is what matters: check reachability, check that your credential is accepted, and exit non-zero so a wrapper can stop you.

#!/usr/bin/env bash
# preflight.sh — proposed, adapt paths to the current API docs
set -euo pipefail

: "${MC_BASE_URL:?export MC_BASE_URL first}"
: "${MC_API_KEY:?use a shell env var, never a committed file}"

fail=0

code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 5 "$MC_BASE_URL/health" || true)
if [ "$code" = "200" ]; then echo "OK   health"; else echo "FAIL health: $code"; fail=1; fi

if curl -s --max-time 5 -H "Authorization: Bearer $MC_API_KEY" \
     "$MC_BASE_URL/v1/models" | jq -e '.data | length > 0' >/dev/null 2>&1; then
  echo "OK   credential accepted"
else
  echo "FAIL credential or endpoint moved"; fail=1
fi

exit "$fail"
Enter fullscreen mode Exit fullscreen mode

Wire it into a make target so the gate is the path of least resistance, and so skipping it requires a deliberate keypress rather than an oversight. A gate you have to think about bypassing is a gate that holds.

preflight:
    @./preflight.sh || (echo "stop here: fix the failing line before opening the editor"; exit 1)

first-run: preflight
    @echo "you have 15 minutes; make them count"
Enter fullscreen mode Exit fullscreen mode

Does this feel like overhead? It is eleven lines and roughly two seconds, and in exchange the expensive part of your session starts with a known-good connection instead of an unknown one. That trade is the whole article.

Where the free server option earns its place

I run the preflight against the free server option because a remote endpoint fails in ways that are visible from curl, while a local misconfiguration tends to fail inside an editor where the error message is a shrug. Free model access is genuinely useful during the first fifteen minutes, when you are sending small, disposable prompts to learn the interface rather than doing serious work. The caveat is that free capacity is exactly the kind of thing that changes without notice, so check the project's current page for today's limits instead of trusting a number someone quoted last month. Want the details straight from the source? The MonkeyCode project page is the only place worth trusting for current availability.

Disclosure: This article was prepared as part of MonkeyCode's product outreach.

Your situation Preflight against free server Preflight locally Skip preflight entirely
Evaluating an unfamiliar tool Yes — fastest signal No No
Repo contains secrets or customer data No Yes No
Reproducible CI check Unreliable; no SLA Yes No
One-off throwaway script Yes Overkill Acceptable
Latency-sensitive workflow Measure first, then decide Yes No

Limits, and who should walk away

This workflow measures setup friction, and it says nothing useful about code quality, model reasoning, or cost per task — do not let a clean preflight talk you into trusting output you have not reviewed. Free tiers change, endpoints move, and a health check that passed at nine in the morning proves nothing at five in the afternoon, so the script is a gate, not a guarantee. If you handle regulated data, need an SLA, or cannot tolerate a third-party endpoint seeing your prompts, this whole approach is the wrong shape for you and a local-only setup is the honest answer.

Who should try it? Anyone who has ever said "this tool feels slow" without a number behind the claim, and anyone onboarding a teammate who will ask the same five questions next Monday. Run the clock once, keep the log in the repo next to the Makefile, and let the friction show itself. Fifteen minutes of measurement buys you a much better argument than fifteen minutes of opinion — and honestly, what else were you going to do with that quarter hour?

Top comments (0)