Couch Potato works by preparing itself -- at configuration-time to do -- at run-time -- the work of registering components.
In a normal AngularJS application, when run-time starts (which is typically when module.run happens or when the application is bootstrapped), all providers become "uninjectable." As such, you lose the ability to configure components.
By storing references to the key registration "vehicles", Couch Potato can perform registrations during run-time. The components Couch Potato maintains references to are:
Lazy-registration would be of little use if you couldn't lazily load script.
This is where AMD (Asynchronous Module Definition) comes in. Couch Potato uses RequireJS. If you are unfamiliar with RequireJS, you'll want to read up a little. The general idea is that an AMD module definition states a list of dependencies and then specifies its definition.
When a module is requested ("required" in AMD terms), all of it dependencies are fetched (or retrieved from the cache if they've already been required), and then passed to the module as function parameters. Continue by reading about Couch Potato Components.
This guide is about to get heavy. If you haven't already done so, it's highly recommended that you stop and look at the samples before you proceed.