All Learning Pathways
40 pathways across AI, Blockchain, and Robotics. Filter by category or level to find your next one.
BeginnerMeet the machines that sense, think, and move through the real world.
BeginnerThe internet of money, explained the fun and simple way.
BeginnerProtect your funds. Spot scams before they cost you.
BeginnerUnderstand how blockchains actually work, from blocks to consensus.
block.hash = sha256(prevHash + data + nonce)
while (!block.hash.startsWith('0000')) nonce++
BeginnerUnderstand how modern AI actually works, no hype required.
prompt = "Explain gas fees like I'm 12" response = model.generate(prompt) print(response)
BeginnerToken standards, marketplaces, and real utility beyond the hype.
function mint(address to, uint id) external {
_safeMint(to, id);
emit Minted(to, id);
}
IntermediateWrite, deploy, and secure the programs that run on-chain.
function withdraw() external {
uint amount = balances[msg.sender];
balances[msg.sender] = 0;
payable(msg.sender).transfer(amount);
}
IntermediateUnderstand rollups, the tech quietly carrying most of Ethereum's traffic.
l1.postBatch(rollup.compress(1000_txs)) // 1000 transactions, 1 L1 fee
IntermediateAMMs, lending, stablecoins, and the money legos of open finance.
function swap(uint amountIn) external {
uint out = (amountIn * reserveOut) / (reserveIn + amountIn);
reserveIn += amountIn; reserveOut -= out;
}
IntermediateRead charts, understand order books, and manage risk like a professional.
rsi = compute_rsi(prices, period=14) if rsi < 30: signal = "oversold" elif rsi > 70: signal = "overbought"
AdvancedWhere autonomous agents meet programmable money.
function payAgent(address agent, uint task) external {
require(oracle.verify(task), "unverified work");
token.transfer(agent, bounty[task]);
}
AdvancedDesign token economies and take a Web3 idea from concept to launch.
BeginnerPlay-to-earn, on-chain items, and why gamers actually care about this.
function equipSword(uint tokenId) external {
require(ownerOf(tokenId) == msg.sender);
player.equipped = tokenId;
}
BeginnerWhy they exist, why they move so fast, and how to not get rekt.
AdvancedHow you can prove something is true without revealing why.
proof = zk.prove(secret, statement) assert zk.verify(proof, statement) // true, secret never revealed
AdvancedThe invisible tax on every transaction, and how to defend against it.
function trade() external {
require(block.timestamp <= deadline);
require(amountOut >= minAmountOut, "slippage");
}
BeginnerLearn to talk to AI so it actually does what you mean.
SYSTEM: You are a senior copyeditor. Be concise and direct. USER: Rewrite this sentence for clarity. Text: "The utilization of the aforementioned methodology..." Think step by step, then give only the final rewrite.
BeginnerUnderstand how machines actually learn from data, not just what buzzwords mean.
X_train, X_val, X_test = split(data, ratios=[0.7, 0.15, 0.15]) model.fit(X_train, y_train) val_score = model.evaluate(X_val, y_val) # Only after tuning is done, touch the test set once test_score = model.evaluate(X_test, y_test)
IntermediateOpen the black box and see how deep learning actually works under the hood.
output = activation(sum(weight_i * input_i for i, input_i in enumerate(inputs)) + bias) loss = loss_function(output, target) gradients = backpropagate(loss, network) weights -= learning_rate * gradients
IntermediateGo beyond chatbots and build AI that plans, acts, and gets things done.
while not task_complete:
observation = get_current_state()
thought, action = model.decide(observation, goal, history)
result = execute_tool(action, sandbox=True)
history.append((thought, action, result))
task_complete = check_goal_reached(result, goal)
IntermediateGive your language model a memory it can actually trust.
query_vector = embed("What's our refund policy?")
top_chunks = vector_db.search(query_vector, k=4)
context = "\n\n".join(chunk.text for chunk in top_chunks)
prompt = f"Answer using only this context:\n{context}\n\nQuestion: {query}"
answer = llm.generate(prompt)
IntermediateSee how machines turn pixels into understanding.
image = load_image("stop_sign.jpg") # shape: (224, 224, 3)
edges = conv2d(image, filter=vertical_edge_kernel)
features = cnn.extract_features(image)
prediction = classifier(features)
print(prediction) # {"stop_sign": 0.97, "yield_sign": 0.02}
AdvancedGetting AI to want what we actually want is harder than it sounds.
BeginnerGive a robot eyes, ears, and a sense of touch, then watch it make sense of the world.
distance_cm = ultrasonic.read()
if distance_cm < 15:
robot.stop()
else:
robot.move_forward()
IntermediateLearn the wiring layer that lets robot software components actually talk to each other.
def image_callback(msg):
detections = detect_objects(msg)
detection_pub.publish(detections)
rospy.Subscriber('/camera/image', Image, image_callback)
detection_pub = rospy.Publisher('/detections', Detections, queue_size=10)
IntermediateFigure out where a robot's joints need to go, and how to get them there smoothly.
joint_angles = inverse_kinematics(target_xyz=(0.4, 0.1, 0.3))
for angle, limit in zip(joint_angles, joint_limits):
if abs(angle) > limit:
raise MotionError('Target unreachable within joint limits')
arm.move_to(joint_angles)
AdvancedSolve the chicken-and-egg problem of building a map while figuring out where you are on it.
belief = init_particle_filter(n_particles=500)
while robot.running():
belief = predict(belief, robot.odometry())
belief = update(belief, robot.sensor_scan(), occupancy_map)
pose_estimate = belief.weighted_mean()
occupancy_map = integrate_scan(occupancy_map, robot.sensor_scan(), pose_estimate)
IntermediateThe hardest form factor in robotics, built to move through a world made for us.
IntermediateFour spinning rotors, a thousand corrections a second, and a machine that refuses to fall.
AdvancedWhere automation actually pays off, and where the hype still outruns the economics.
IntermediateLearn how machines dream up pixels from noise.
A moody cyberpunk alley at night, neon signs reflecting on wet asphalt, a lone figure in a translucent raincoat walking away from camera, volumetric fog, cinematic lighting, shot on 35mm film, shallow depth of field --ar 16:9 --style raw
AdvancedRobots that learn from data instead of being programmed one behavior at a time.
# Simplified VLA inference loop running on a humanoid robot
while task_active:
image = camera.capture() # current visual observation
state = robot.proprioception() # joint angles, velocities, torques
# single forward pass: perception + language + action in one model
action_chunk = vla_model.predict(
image=image,
instruction="pick up the red mug and place it on the shelf",
proprio=state,
)
for action in action_chunk: # execute a short horizon of actions
robot.apply_joint_targets(action)
if safety_monitor.violation_detected():
robot.freeze()
break
BeginnerUnderstand the money protocol that started it all, from first principles.
Transaction inputs: 1.2 BTC (from a previous payment you received) Transaction outputs: 0.5 BTC -> recipient's address 0.68 BTC -> change, back to you (minus a small fee) The 1.2 BTC input is fully "spent" and can never be reused. It splits into two new outputs, one of which becomes a new spendable unit (a UTXO) sitting in your wallet until you spend it again.
IntermediateGo past 'what is Bitcoin' and into how it actually works under load.
# A standard Pay-to-Pubkey-Hash (P2PKH) locking script OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG # To spend it, the unlocking script supplies: <signature> <publicKey> # The two scripts run together on Bitcoin's stack machine: # 1. Push signature and public key onto the stack # 2. Duplicate the public key, hash it, compare to pubKeyHash # 3. If it matches, verify the signature against the public key # No loops, no external calls, just a fixed sequence of stack ops.
AdvancedStop reading about Bitcoin's protocol and start writing the software that runs it.
use bitcoin::{Amount, Transaction, TxIn, TxOut, Sequence, Witness, ScriptBuf};
use bitcoin::transaction::Version;
use bitcoin::locktime::absolute::LockTime;
use bitcoin::{OutPoint, Txid};
use std::str::FromStr;
fn build_transaction() -> Transaction {
let prev_txid =
Txid::from_str("f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16")
.expect("valid txid");
let input = TxIn {
previous_output: OutPoint::new(prev_txid, 0),
script_sig: ScriptBuf::new(),
sequence: Sequence::ENABLE_RBF_NO_LOCKTIME,
witness: Witness::new(),
};
let recipient_script = ScriptBuf::new_p2wpkh(&"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"
.parse()
.expect("valid pubkey hash"));
let output = TxOut {
value: Amount::from_sat(50_000),
script_pubkey: recipient_script,
};
Transaction {
version: Version::TWO,
lock_time: LockTime::ZERO,
input: vec![input],
output: vec![output],
}
}
fn main() {
let tx = build_transaction();
println!("txid: {}", tx.compute_txid());
println!("weight: {} wu", tx.weight());
}
BeginnerBitcoin tracks who owns what. Ethereum runs programs nobody can stop.
// A minimal smart contract: stores a number, anyone can read it,
// only the owner who deployed it can change it.
contract SimpleStorage {
uint256 public storedNumber;
address public owner;
constructor() {
owner = msg.sender;
}
function setNumber(uint256 newNumber) public {
require(msg.sender == owner, "Not the owner");
storedNumber = newNumber;
}
}
IntermediateStop reading about smart contracts and start writing ones that hold real value safely.
// Vulnerable withdraw pattern vs. the checks-effects-interactions fix
contract VaultVulnerable {
mapping(address => uint256) public balances;
function deposit() external payable {
balances[msg.sender] += msg.value;
}
// BAD: sends funds before updating the balance, opens a reentrancy hole
function withdraw(uint256 amount) external {
require(balances[msg.sender] >= amount, "insufficient balance");
(bool sent, ) = msg.sender.call{value: amount}("");
require(sent, "transfer failed");
balances[msg.sender] -= amount; // too late, attacker already re-entered
}
}
contract VaultFixed {
mapping(address => uint256) public balances;
function deposit() external payable {
balances[msg.sender] += msg.value;
}
// GOOD: checks-effects-interactions, state is updated before the external call
function withdraw(uint256 amount) external {
require(balances[msg.sender] >= amount, "insufficient balance");
balances[msg.sender] -= amount;
(bool sent, ) = msg.sender.call{value: amount}("");
require(sent, "transfer failed");
}
}
AdvancedHow Ethereum scales, who profits from your transaction order, and why your wallet is about to get a lot smarter.
struct UserOperation {
address sender; // the smart contract wallet
uint256 nonce;
bytes initCode; // deploys wallet if it doesn't exist yet
bytes callData; // what the wallet should do
uint256 callGasLimit;
uint256 verificationGasLimit;
uint256 preVerificationGas;
uint256 maxFeePerGas;
uint256 maxPriorityFeePerGas;
bytes paymasterAndData; // who pays, and how
bytes signature;
}
// A bundler collects UserOperations and calls this on the EntryPoint contract
function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;
IntermediateWhen better instructions aren't enough, change the model itself.
{
"messages": [
{ "role": "system", "content": "You are a support agent for Acme Cloud. Always answer in three short bullet points." },
{ "role": "user", "content": "My deploy failed with error E-402, what do I do?" },
{ "role": "assistant", "content": "- E-402 means your build exceeded the memory limit\n- Increase the memory allocation in acme.yaml under 'build.resources'\n- Redeploy, and check the build logs if it fails again" }
]
}
IntermediateThe hardest part of robotics isn't moving an arm, it's getting it to actually hold something.
PERCEPTION-TO-GRASP PIPELINE
camera / depth sensor
|
v
segmentation -> isolate target object from clutter
|
v
pose estimation -> where is it, which way is it facing
|
v
grasp candidate generation -> many possible grip points
|
v
grasp scoring -> rank by force closure, stability, reachability
|
v
execute + verify -> did we actually get it, retry if not