Set up a 3D scene: MeshInstance3D, Camera3D, WorldEnvironment — understand what each node's job is
Godot Docs — 3D scene introduction. Search 'your first 3D game' in the docs.
A direct companion to the technology guides. Every section uses the exact milestone order from its source guide, and every milestone has one primary exercise, two follow-up drills, and a narrow reference when the concept still is not sticking.
Set up a 3D scene: MeshInstance3D, Camera3D, WorldEnvironment — understand what each node's job is
Godot Docs — 3D scene introduction. Search 'your first 3D game' in the docs.
Attach a ShaderMaterial and write a fragment shader that colors by UV coordinates
The Book of Shaders chapter 1–2. Godot shading language docs — search 'UV'.
Understand the difference between what runs per-vertex and what runs per-fragment
Book of Shaders chapter 3. Search 'varying' in the Godot shading language docs.
Use TIME and uniforms to animate shader parameters driven from a GDScript
Godot docs — search 'ShaderMaterial set_shader_parameter'. GDScript signals docs.
Implement diffuse and specular lighting by hand in the fragment stage — no built-in lighting nodes
Book of Shaders chapter 5. Search 'Phong lighting model' on learnopengl.com — the math is identical even though it's OpenGL.
Understand the MVP matrix: what model, view, and projection each do to a vertex
learnopengl.com — 'Coordinate Systems' chapter. Direct mapping to Godot's matrix uniforms.
Deform geometry in the vertex stage — displace vertices with a noise function
Book of Shaders chapter 5 — noise. Godot docs — 'vertex() built-in variables'.
Use SubViewport as a render target — render a scene into a texture, use that texture in another shader
Godot docs — 'Using a Viewport as a texture'. Search 'ViewportTexture'.
Write a compute shader via RenderingDevice — dispatch a workgroup, write to a buffer, read it back
Godot docs — 'Using compute shaders'. Search 'RenderingDevice' in the docs.
Build a GPU particle system: particle state lives in a storage buffer, updated entirely by compute
Acerola on YouTube — search 'compute shader particles'. Godot RenderingDevice docs.
Implement a multi-pass pipeline: geometry pass → lighting pass → post-processing stack
Acerola on YouTube — search 'post processing'. Godot docs 'multiple render targets'.
Understand what Godot is abstracting from you that Vulkan would force you to manage explicitly
vulkan-tutorial.com — skim the 'Drawing a triangle' section to feel the contrast. No need to implement it yet.
Understand the stack and heap: what lives where, why it matters, and what a stack frame is
learncpp.com — 'Stack and Heap Memory'. Chapter 12.
Pointers and references: when to use each, what a dangling pointer looks like, and how to avoid one
learncpp.com — 'Introduction to Pointers' and 'Dangling Pointers'. A Tour of C++ chapter 1.
RAII: why resource acquisition in the constructor and release in the destructor is the correct model
learncpp.com — 'Introduction to RAII'. A Tour of C++ chapter 5.
Rule of 0/3/5: when the compiler-generated versions are wrong and what to write instead
learncpp.com — 'The Rule of Three/Five/Zero'. A Tour of C++ chapter 6.
Smart pointers: unique_ptr for single ownership, shared_ptr for shared ownership, weak_ptr for observation
learncpp.com — 'Smart Pointers'. A Tour of C++ chapter 13.
Move semantics: what a move actually does at the memory level and why it matters for performance
learncpp.com — 'Move Semantics'. A Tour of C++ chapter 6.
Classes, inheritance, and virtual dispatch: what the vtable is and what it costs
learncpp.com — 'Virtual Functions'. A Tour of C++ chapter 4.
Templates and the STL: vector, map, unordered_map, iterators, algorithms — use them, don't rewrite them
learncpp.com — 'Templates' and 'Standard Library Containers'. A Tour of C++ chapters 8–9.
const-correctness: what it means for a method to be const and why it matters
learncpp.com — 'Const class objects and member functions'.
Build systems: what CMake does, what a compilation unit is, how linking works
learncpp.com — 'Introduction to the compiler, linker, and libraries'. CMake docs tutorial.
Multithreading: std::thread, mutex, atomic — what a data race looks like and how to prevent one
learncpp.com — 'Introduction to threads'. A Tour of C++ chapter 18.
Undefined behavior: the three most dangerous causes and how to reason about them
learncpp.com — 'Undefined behavior'. Search 'UB and compiler optimizations' for the deeper rabbit hole.
The graphics pipeline from C++: how a draw call gets from your code to pixels — buffers, shaders, the GPU driver
learnopengl.com — 'Hello Triangle'. This is the primary resource for this milestone.
Low-level I/O: reading and writing binary data, talking to hardware at the byte level
learncpp.com — 'File I/O'. Search 'binary file I/O C++' for struct-level parsing examples.
Tables: the only data structure — understand how one table represents an array, a map, and an object simultaneously
Programming in Lua chapter 2 — Tables.
Functions as first-class values: closures, upvalues, and why functions in Lua are just values
Programming in Lua chapter 6 — Closures.
Metatables and __index: how Lua fakes OOP and inheritance without a class keyword
Programming in Lua chapter 16 — OOP. Chapter 13 — Metatables.
Coroutines: cooperative multitasking, yield and resume, when they're useful vs threads
Programming in Lua chapter 9 — Coroutines.
Multiple return values and varargs: patterns that don't exist in most languages
Programming in Lua chapter 5 — Functions.
The C API stack model: how Lua and C exchange values by pushing and popping a shared stack
Programming in Lua chapter 27 — The C API. Lua reference manual — lua_State and stack operations.
Registering a C function so Lua scripts can call into your C++ host
Programming in Lua chapter 28 — Extending Lua. Lua reference manual — luaL_newlib.
Calling a Lua function from C++: loading a script, pushing arguments, calling, reading results
Programming in Lua chapter 25 — Calling Lua functions from C. Lua reference manual — lua_pcall.
Embedding the Lua interpreter in a C++ program: luaL_newstate, opening libs, loading files
Programming in Lua chapter 24 — An Overview of the C API. Lua reference manual — luaL_newstate.
Understand what TypeScript adds over JavaScript — what the compiler catches and why that matters
TypeScript Handbook — 'The Basics'. typescriptlang.org/docs/handbook/2/basic-types.html
Core types: string, number, boolean, arrays, tuples, and the difference between type and interface
TypeScript Handbook — 'Object Types' and 'Union Types'.
Union types and type narrowing — how TypeScript knows what something is inside a conditional
TypeScript Handbook — 'Narrowing'.
Optional chaining and nullish coalescing — handling null and undefined without explosion
TypeScript Handbook — 'Everyday Types' — null and undefined section.
Generics at a working level — read and write generic functions without needing the deepest corners
TypeScript Handbook — 'Generics'.
Async/await and Promises — the event loop mental model and how async functions compose
TypeScript Handbook — 'Everyday Types' async section. MDN — 'Using Promises'.
Fetch and typed API responses — model a REST response as an interface, type the data end to end
TypeScript Handbook — 'Everyday Types'. MDN — Fetch API.
Vue single-file components — the <script setup>, <template>, and <style> structure and what each section does
Vue docs — vuejs.org/guide/components/props and vuejs.org/guide/components/slots.
ref and reactive — Vue's reactivity primitives, when to use each, and how computed() derives from them
Vue docs — vuejs.org/guide/essentials/reactivity-fundamentals and vuejs.org/guide/essentials/watchers.
watchEffect and watch — reacting to reactive state changes, the equivalent of useEffect in Vue
Vue docs — vuejs.org/guide/reusability/composables. TypeScript Handbook — discriminated unions.
Vite as a build tool — what a bundler does, what npm scripts are, how modules resolve
Vite docs — vitejs.dev/guide. TypeScript Handbook — 'Module Resolution'.
Props and emits — passing typed data down, emitting typed events up, and when prop drilling becomes a problem
Vue docs — vuejs.org/guide/components/provide-inject and vuejs.org/guide/components/events.
Structs and methods — Go's type system without classes or inheritance
Tour of Go — 'Methods'. Go docs — 'Effective Go: Methods'.
Interfaces — implicit satisfaction, how Go achieves polymorphism without explicit implements
Tour of Go — 'Interfaces'. A Tour of Go — 'Type assertions'.
Error handling — explicit error returns, the error interface, when to wrap vs return raw
Go blog — 'Error handling and Go'. Tour of Go — 'Errors'.
Goroutines — what they are, how they differ from threads, the cost model
Tour of Go — 'Goroutines'. Go blog — 'Concurrency is not parallelism'.
Channels — how goroutines communicate, buffered vs unbuffered, select statement
Tour of Go — 'Channels' and 'Select'. Go blog — 'Go Concurrency Patterns'.
The standard library net/http — writing an HTTP handler, registering routes, serving responses
Go docs — net/http package. Go blog — 'Writing Web Applications'.
JSON encoding and decoding — struct tags, marshaling to and from JSON, handling optional fields
Go docs — encoding/json package. Go blog — 'JSON and Go'.
Connecting to a database — sql.DB, prepared statements, scanning rows into structs
Go docs — database/sql package. Go wiki — 'SQLDrivers'.
Middleware — wrapping handlers for logging, auth, CORS
Go blog — 'Making a RESTful JSON API in Go'. Search 'Go middleware pattern'.
Go modules — go.mod, importing packages, versioning
Go docs — 'Using Go Modules'. go.dev/blog/using-go-modules.
Routing basics — app.get/post/etc, path params, route grouping
Hono docs — Routing and Route Grouping.
Context object — c.req, c.res, c.json(), c.html(), what's attached to it per-request
Hono docs — Context and Request.
Hono JSX — server-rendered by default, how a component returns HTML not a virtual DOM tree to hydrate
Hono docs — JSX and JSX Renderer.
Client components — the explicit opt-in mechanism, and when you actually need one vs. plain SSR
Hono docs — Client Components; progressive enhancement references.
Middleware — what it is, built-in middleware (logger, cors), writing a small custom one
Hono docs — Middleware and built-in middleware.
Environment bindings — how env.DB, env.KV, etc. get typed and passed into a handler
Hono docs — Cloudflare Workers adapter and Bindings typing.
Error handling — app.onError, throwing HTTPException, what an unhandled error does on Workers
Hono docs — Error Handling and HTTPException.
The Workers execution model — what's isolated per-request, what isn't, why you can't just hold state in a module-level variable and expect it to persist reliably
Cloudflare Workers docs — Runtime APIs and How Workers works.
waitUntil and the execution context — doing work after the response is sent without the worker being killed early
Cloudflare Workers docs — ExecutionContext.waitUntil().
Scheduled events — the scheduled() export, how cron syntax maps to trigger frequency in wrangler config
Cloudflare Workers docs — Cron Triggers and local testing.
CPU time limits — what counts against it, why an infinite loop or heavy synchronous work is dangerous here specifically
Cloudflare Workers docs — Limits and CPU time.
Subrequest limits — how many outbound fetches a single invocation can make, and why that caps your fan-out design directly
Cloudflare Workers docs — Subrequest limits.
Cold starts — what makes Workers fast to cold-start relative to a traditional server, and what still costs time
Cloudflare Workers docs — performance and startup guidance.
wrangler dev vs wrangler deploy — local dev loop, environments, secrets
Cloudflare Workers docs — Wrangler environments, bindings, and secrets.
Schema design for this project — services, incidents, status_history tables and their relationships
Cloudflare D1 docs — SQL API; SQLite foreign keys and indexes.
Migrations — wrangler d1 migrations, keeping schema changes versioned and repeatable
Cloudflare D1 docs — Migrations.
The D1 binding API — prepare(), bind(), .run(), .all(), .first(), and when to use each
Cloudflare D1 docs — Prepared statements and return methods.
Batch operations — D1's batch() for multiple statements, and why it matters for write-heavy operations like recording a poll cycle
Cloudflare D1 docs — batch statements.
Query patterns for this domain — get current status per service, get incident history for a service, get all incidents in a date range
D1/SQLite docs — window functions, joins, and query plans.
D1's consistency and transaction model — what you can and can't rely on relative to a traditional RDBMS
Cloudflare D1 docs — transactions, consistency, and limits.
The KV binding API — get(), put(), delete(), list(), and JSON serialization patterns
Workers KV docs — get, put, list, delete, and metadata.
Eventual consistency — what it means concretely for a value written by a cron job and read by a status page
Workers KV docs — consistency model.
TTLs and expiration — whether the status snapshot should expire, and what happens on read if it does
Workers KV docs — expiration and TTL.
KV vs D1 for this exact project — articulating the boundary in your own words, not just reciting the docs
Cloudflare storage docs — choosing D1 versus KV.
Read/write limit shape — why KV is built for high-read/low-write and how that matches (or doesn't) each piece of this project's data
Workers KV docs — limits and pricing model.
vitest-pool-workers setup — the config that runs your tests inside workerd, not a Node shim
Cloudflare Workers docs — Vitest integration.
Mocking or seeding D1 in tests — using a test binding, resetting state between tests
Workers Vitest D1 documentation and test isolation guidance.
Mocking or seeding KV in tests — same idea, isolated per test
Workers Vitest KV documentation.
Calling scheduled() directly in a test — constructing a fake ScheduledEvent and asserting on side effects
Cloudflare Vitest docs — scheduled events and execution contexts.
Testing failure paths — a service that times out, a D1 write that fails, a KV read that returns null
Vitest docs — mocking, fake timers, and Workers testing guidance.