Build1 distinct publisher3 min readUpdated
One developer's onboarding diary puts a number on template friction: a README that disagrees with the .nvmrc, three correct auth patterns, and a deep link that cost eight hours.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
A developer writing on dev.to onboarded two junior devs onto a React Native app last week, both from the same Expo starter template, both with web React experience and no mobile, and kept a diary of every friction point [1]. The tally was roughly 15 hours of avoidable loss per developer, which the author attributes to documentation gaps and one missing shell script rather than to anything the app does [2]. Environment setup was estimated at 2 hours and took about 5 per dev [3]. The first cause is the one worth framing: the README said "Node 18+" while the `.nvmrc` pinned 18.17, one dev arrived with Node 20 and one with 16, and nothing in the toolchain surfaced the mismatch, so things failed oddly downstream [4]. Note what that means in practice. A developer running Node 20 satisfies the README and violates the pin at the same time, and no check in the repo has an opinion about which document wins [1]. The other three followed the same shape: missing Xcode command line tools stayed silent until `expo run:ios` errored with a message naming `xcrun` and not the thing to install [5], a CocoaPods version mismatch stayed silent until `pod install` failed four layers into a trace [6], and a wrong Android SDK path hit both devs as `expo run:android` failing to find `adb`, fixed by setting `ANDROID_HOME` in the shell profile [7]. The author's diagnosis is that in all four cases the failure surfaced far from its cause, and that this is the property that turns a five-minute fix into a two-hour one [8]. A preflight script checking those four things and failing loudly would, on the author's estimate, have saved three hours each [9]. Both devs added a screen without trouble and then got stuck getting a build onto a phone [10]. Neither knew the difference between Expo Go, a development build, and an EAS build, and the README documented only `expo start` [11]. One shipped a build that installed and crashed on launch because the required environment variables were not set in EAS secrets [12]. The author prices the missing page at five minutes to write and three hours to skip [13]. The auth section is the cleanest example of correct code producing wrong outcomes. Route protection existed in the root layout, in individual screens, and in a custom hook, with nothing marking which was canonical [14], so both devs implemented a protected route slightly wrong in different ways, and both readings were defensible [15]. Token refresh ran invisibly through middleware and was undocumented, so one dev spent two hours building a mechanism that was already working [16]. The RLS policies governing the protected data lived in a separate repository neither dev knew about, so a correctly authenticated request returned an empty array with no error anywhere [17]. The proposed fix is one auth architecture page: token flow diagram, one worked example, a pointer to the policies, fifteen minutes to write once [18]. The magic-link deep link cost 6 hours for one dev and 8 for the other against the author's own 90-minute estimate [19], which is 40 to 53 percent of the whole 15-hour loss in a single ticket [2]. Imperative routing required a manual linking config that was not documented [20], dev and production builds carried different bundle identifiers so a link opened one and not the other [21], and testing needed `xcrun simctl openurl` and `adb shell am start`, neither of which either dev had run [22]. This is the one item the author attributes to an architectural choice rather than a documentation gap: file-based routing would have made deep linking work automatically for any route file [23]. Two developers on one template is an anecdote, not a study [1].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
Total avoidable loss was roughly 15 hours per developer, which the author says was all fixable with docs and one shell script; the first week was dominated by problems the template could have prevented rather than by the problem the app solves.
The author describes the missing build-system page as five minutes to write and three hours to skip.
The author's proposed fix is one auth architecture page with a diagram of token flow, one worked example of protecting a route and a pointer to where RLS policies live: fifteen minutes to write once.
The author onboarded two junior devs onto a React Native app last week using the same Expo starter template; both had shipped web React apps, neither had touched mobile, and the author kept a diary of every friction point.
Environment setup was estimated at 2 hours and took about 5 hours per dev.
One dev had Node 20 and one had Node 16; the README said "Node 18+" while .nvmrc pinned 18.17. Nothing surfaced the mismatch; things just failed oddly downstream.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One self-reported diary, no artifacts
All findings come from a single practitioner post. The failure descriptions are unusually specific and internally consistent (named commands, named config files, named symptoms), which lifts them above pure assertion, but every quantity is a recollected estimate over a sample of two developers, the template is never identified, no logs, repos, scripts, or documentation pages are published, and the strongest structural claims are counterfactuals that nothing in the source tests.
One team, two developers
The only adoption signal is the author's own team using an Expo starter template for a two-person onboarding, disclosed retrospectively. The prescribed remedies — doctor script, build-system page, auth architecture page, ONBOARDING.md, file-based routing — are proposals; the source reports no instance of them being shipped, adopted by another team, or measured after adoption.
Quantified savings outrun the proof
Mildly overstated rather than inflated. The diagnostic half of the story is concrete and plausibly generalisable, and the author is candid that the sample is his own two hires. The overstatement sits in the arithmetic: precise per-developer losses and precise per-fix savings are presented as findings when they are recollected estimates, the deep-link conclusion is a untested architectural counterfactual, and the piece closes by recommending a specific vendor's starters as the shortcut — a promotional frame the evidence does not reach.
Practitioner post with a vendor plug
The author writes from direct experience and gives away the remedy for free, which aligns incentives with readers. Against that, the piece is self-published developer-platform content whose credibility rests on the size of the number in the headline, and it names a specific commercial source of Expo starters as the way to 'remove most of week one' without disclosing any relationship. That mix gives a moderate incentive to round the hours upward.
Coherent but unreplicated and single-sourced
Confidence is limited by structure, not by internal quality. One publisher, one author, one team, two developers, retrospective timings, no artifacts and no corroboration. The specificity of the failure modes and their consistency with each other justify moderate trust in the diagnosis; the numeric and counterfactual claims warrant materially less.
build
A GAN beauty filter is a device budget allocation, not a feature toggle1 distinct publisher
build
Every viewer hits your HLS key endpoint in the same second, and almost nobody tests it1 distinct publisher
build
The optional EntityManager is the bug: moving the transaction boundary into AsyncLocalStorage1 distinct publisher
build
A Timed-Out Reset SMS Is Not A Failed One, And Your Retry Code Probably Disagrees1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 19, 2026