You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
BitPilot's pitch is "learn Bitcoin by doing". Right now, 91 of 106 missions end at a multiple-choice quiz and a button that says "You got it". No artifact, no API call, nothing the learner made.
Where the gap is
Every mission has a do step, but kind: 'knowledge' means the button just credits you. Counting the missions with a real hands-on step:
Flight path
Hands-on
Total
Money Basics
0
8
Bitcoin
0
12
Privacy
0
12
Full Independence
1
15
eCash
2
10
Lightning
2
12
Self-custody
2
15
Open Source
3
6
Nostr
5
16
Total
15
106
The three paths at the top matter most. Money Basics and Bitcoin are the two Beginner paths — they are the first thing every learner touches, and right now the first eight missions of the product are read, answer, click, repeat. Privacy is twelve consecutive missions of the same.
What "hands-on" means here
It does not have to be an API call. A step counts if the learner produces something they didn't have before. The existing kinds show the range:
derive-address — derive a real BIP84 address from that mnemonic
onchain-signet — broadcast a real transaction, backend verifies it against a block explorer
github-pr — backend asks GitHub whether your PR is really merged and really yours
paste-value — a reflection input: "paste the docs sentence you'd fix"
A conversion drill, a classification exercise, or a calculation checked against live chain data all qualify. The bar is: the learner does something, and we check it.
How to add one
frontend/src/lib/types.ts documents the four steps at the DoKind union:
Add the kind to DoKind in frontend/src/lib/types.ts
Add the handler branch in LearnerView's handleDo() (frontend/src/views/LearnerView.tsx)
Add the verifier branch in verify_proof() (backend/src/routes/missions.rs)
Add any new ledger table in a migration
The backend DoKind enum lives in backend/src/models/mission.rs and is the source of truth for which mission gets which kind. A new variant there is a compile error in verify_proof() until you handle it — that's deliberate.
Many good steps need no new kind at all: if the learner types an answer you can check, paste-value may already fit, and a purely client-side drill can reuse the existing plumbing.
Per-path issues
Pick one and go. Each has concrete proposals, but they're starting points, not a spec — a better idea for a mission is welcome, and you don't need to do a whole path. One mission is a perfectly good PR.
Content changes are also welcome without code: if a lesson is wrong, unclear, or out of date, open an issue or a PR against frontend/src/lib/types.ts.
BitPilot's pitch is "learn Bitcoin by doing". Right now, 91 of 106 missions end at a multiple-choice quiz and a button that says "You got it". No artifact, no API call, nothing the learner made.
Where the gap is
Every mission has a
dostep, butkind: 'knowledge'means the button just credits you. Counting the missions with a real hands-on step:The three paths at the top matter most. Money Basics and Bitcoin are the two Beginner paths — they are the first thing every learner touches, and right now the first eight missions of the product are read, answer, click, repeat. Privacy is twelve consecutive missions of the same.
What "hands-on" means here
It does not have to be an API call. A step counts if the learner produces something they didn't have before. The existing kinds show the range:
seed-words— generate a BIP39 mnemonic in the browser, then get quizzed on word Bump rand from 0.8.6 to 0.9.4 in /backend #7derive-address— derive a real BIP84 address from that mnemoniconchain-signet— broadcast a real transaction, backend verifies it against a block explorergithub-pr— backend asks GitHub whether your PR is really merged and really yourspaste-value— a reflection input: "paste the docs sentence you'd fix"A conversion drill, a classification exercise, or a calculation checked against live chain data all qualify. The bar is: the learner does something, and we check it.
How to add one
frontend/src/lib/types.tsdocuments the four steps at theDoKindunion:DoKindinfrontend/src/lib/types.tsLearnerView'shandleDo()(frontend/src/views/LearnerView.tsx)verify_proof()(backend/src/routes/missions.rs)The backend
DoKindenum lives inbackend/src/models/mission.rsand is the source of truth for which mission gets which kind. A new variant there is a compile error inverify_proof()until you handle it — that's deliberate.Many good steps need no new kind at all: if the learner types an answer you can check,
paste-valuemay already fit, and a purely client-side drill can reuse the existing plumbing.Per-path issues
Pick one and go. Each has concrete proposals, but they're starting points, not a spec — a better idea for a mission is welcome, and you don't need to do a whole path. One mission is a perfectly good PR.
Content changes are also welcome without code: if a lesson is wrong, unclear, or out of date, open an issue or a PR against
frontend/src/lib/types.ts.