diff --git a/blog/content/wire.article b/blog/content/wire.article
new file mode 100644
index 0000000..c024620
--- /dev/null
+++ b/blog/content/wire.article
@@ -0,0 +1,110 @@
+Compile-time Dependency Injection With Go Cloud's Wire
+9 Oct 2018
+
+Robert van Gent
+
+* Overview
+
+The Go team recently [[https://blog.golang.org/go-cloud][announced]] the open source project [[https://github.com/google/go-cloud][Go Cloud]], with portable Cloud APIs and tools for [[https://cloud.google.com/open-cloud/][open cloud]] development. This post goes into more detail about Wire, a dependency injection tool provided with Go Cloud.
+
+* What problem does Wire solve?
+
+[[https://en.wikipedia.org/wiki/Dependency_injection][Dependency injection]] is a standard technique for producing flexible and loosely coupled code, by explicitly providing components with all of the dependencies they need to work. In Go, this often takes the form of passing dependencies to constructors:
+
+    // NewUserStore returns a UserStore that uses cfg and db as dependencies.
+    func NewUserStore(cfg *Config, db *mysql.DB) (*UserStore, error) {...}
+
+This technique works great at small scale, but larger applications can have a complex graph of dependencies, resulting in a big block of initialization code that's order-dependent but otherwise not very interesting. It's often hard to break up this code cleanly, especially because some dependencies are used multiple times. Replacing one implementation of a service with another can be painful because it involves modifying the dependency graph by adding a whole new set of dependencies (and their dependencies...), and removing unused old ones. In practice, making changes to initialization code in applications with large dependency graphs is tedious and slow.
+
+Dependency injection tools like Wire aim to simplify the management of initialization code. You describe your services and their dependencies, either as code or as configuration, then Wire processes the resulting graph to figure out ordering and how to pass each service what it needs. Make changes to an application's dependencies by changing a function signature or adding or removing an initializer, and then let Wire do the tedious work of generating initialization code for the entire dependency graph.
+
+* Why is this part of Go Cloud?
+
+Go Cloud's goal is to make it easier to write portable Cloud applications by providing idiomatic Go APIs for useful Cloud services. For example, [[https://godoc.org/github.com/google/go-cloud/blob][blob.Bucket]] provides a storage API with implementations for Amazon's S3 and Google Cloud Storage (GCS); applications written using `blob.Bucket` can swap implementations without changing their application logic. However, the initialization code is inherently provider-specific, and each provider has a different set of dependencies.
+
+For example, [[https://godoc.org/github.com/google/go-cloud/blob/gcsblob#OpenBucket][constructing a GCS `blob.Bucket`]] requires a `gcp.HTTPClient`, which eventually requires `google.Credentials`, while [[https://godoc.org/github.com/google/go-cloud/blob/s3blob][constructing one for S3]] requires an `aws.Config`, which eventually requires AWS credentials. Thus, updating an application to use a different `blob.Bucket` implementation involves exactly the kind of tedious update to the dependency graph that we described above. The driving use case for Wire is to make it easy to swap implementations of Go Cloud portable APIs, but it's also a general-purpose tool for dependency injection.
+
+* Hasn't this been done already?
+
+There are a number of dependency injection frameworks out there. For Go, [[https://github.com/uber-go/dig][Uber's dig]] and [[https://github.com/facebookgo/inject][Facebook's inject]] both use reflection to do runtime dependency injection. Wire was primarily inspired by Java's [[https://google.github.io/dagger/][Dagger 2]], and uses code generation rather than reflection or [[https://en.wikipedia.org/wiki/Service_locator_pattern][service locators]].
+
+We think this approach has several advantages:
+
+- Runtime dependency injection can be hard to follow and debug when the dependency graph gets complex. Using code generation means that the initialization code that's executed at runtime is regular, idiomatic Go code that's easy to understand and debug. Nothing is obfuscated by an intervening framework doing "magic". In particular, problems like forgetting a dependency become compile-time errors, not run-time errors.
+- Unlike [[https://en.wikipedia.org/wiki/Service_locator_pattern][service locators]], there's no need to make up arbitrary names or keys to register services. Wire uses Go types to connect components with their dependencies.
+- It's easier to avoid dependency bloat. Wire's generated code will only import the dependencies you need, so your binary won't have unused imports. Runtime dependency injectors can't identify unused dependencies until runtime.
+- Wire's dependency graph is knowable statically, which provides opportunities for tooling and visualization.
+
+* How does it work?
+
+Wire has two basic concepts: providers and injectors.
+
+_Providers_ are ordinary Go functions that "provide" values given their dependencies, which are described simply as parameters to the function. Here's some sample code that defines three providers:
+
+    // NewUserStore is the same function we saw above; it is a provider for UserStore,
+    // with dependencies on *Config and *mysql.DB.
+    func NewUserStore(cfg *Config, db *mysql.DB) (*UserStore, error) {...}
+
+    // NewDefaultConfig is a provider for *Config, with no dependencies.
+    func NewDefaultConfig() *Config {...}
+
+    // NewDB is a provider for *mysql.DB based on some connection info.
+    func NewDB(info *ConnectionInfo) (*mysql.DB, error) {...}
+
+Providers that are commonly used together can be grouped into `ProviderSets`. For example, it's common to use a default `*Config` when creating a `*UserStore`, so we can group `NewUserStore` and `NewDefaultConfig` in a `ProviderSet`:
+
+    var UserStoreSet = wire.ProviderSet(NewUserStore, NewDefaultConfig)
+
+Injectors are generated functions that call providers in dependency order. You write the injector's signature, including any needed inputs as arguments, and insert a call to wire.Build with the list of providers or provider sets that are needed to construct the end result:
+
+    func initUserStore() (*UserStore, error) {
+    	// We're going to get an error, because NewDB requires a *ConnectionInfo
+    	// and we didn't provide one.
+    	wire.Build(UserStoreSet, NewDB)
+    	return nil, nil  // These return values are ignored.
+    }
+
+Now we run go generate to execute wire:
+
+    $ go generate
+    wire.go:2:10: inject initUserStore: no provider found for ConnectionInfo (required by provider of *mysql.DB)
+    wire: generate failed
+
+Oops! We didn't include a `ConnectionInfo` or tell Wire how to build one. Wire helpfully tells us the line number and types involved. We can either add a provider for it to `wire.Build`, or add it as an argument:
+
+    func initUserStore(info ConnectionInfo) (*UserStore, error) {
+    	wire.Build(UserStoreSet, NewDB)
+    	return nil, nil  // These return values are ignored.
+    }
+
+Now `go generate` will create a new file with the generated code:
+
+    // File: wire_gen.go
+    // Code generated by Wire. DO NOT EDIT.
+    //go:generate wire
+    //+build !wireinject
+
+    func initUserStore(info ConnectionInfo) (*UserStore, error) {
+    	defaultConfig := NewDefaultConfig()
+    	db, err := NewDB(info)
+    	if err != nil {
+    		return nil, err
+    	}
+    	userStore, err := NewUserStore(defaultConfig, db)
+    	if err != nil {
+    		return nil, err
+    	}
+    	return userStore, nil
+    }
+
+Any non-injector declarations are copied into the generated file. There is no dependency on Wire at runtime: all of the written code is just normal Go code.
+
+As you can see, the output is very close to what a developer would write themselves. This was a trivial example with just three components, so writing the initializer by hand wouldn't be too painful, but Wire saves a lot of manual toil for components and applications with more complex dependency graphs.
+
+* How can I get involved and learn more?
+
+The [[https://github.com/google/go-cloud/blob/master/wire/README.md][Wire README]] goes into more detail about how to use Wire and its more advanced features. There's also a [[https://github.com/google/go-cloud/tree/master/samples/tutorial][tutorial]] that walks through using Wire in a simple application.
+
+We appreciate any input you have about your experience with Wire! [[https://github.com/google/go-cloud][Go Cloud's]] development is conducted on GitHub, so you can [[https://github.com/google/go-cloud/issues/new][file an issue]] to tell us what could be better. For updates and discussion about the project, join [[https://groups.google.com/forum/#!forum/go-cloud][the project’s mailing list]].
+
+Thank you for taking the time to learn about Go Cloud's Wire. We’re excited to work with you to make Go the language of choice for developers building portable cloud applications.
