content: rename articles to reinforce convention of short URLs

The Go blog started out on Blogger
(http://web.archive.org/web/20100325005843/http://blog.golang.org/).
Later, we moved to the current self-hosted blog server
with extra Go-specific functionality like playground snippets.

The old Blogger posts have very long URLs that Blogger chose
for us, such as "go-programming-language-turns-two" or
"two-go-talks-lexical-scanning-in-go-and", predating
the convention of giving posts shorter, more share-friendly,
typeable names.

The conversion of the old Blogger posts also predated
the convention of putting supporting files in a subdirectory.

The result is that although we've established new conventions,
you wouldn't know by listing the directory - the old Blogger
content presents a conflicting picture.

This commit renames the posts with very long names
to have shorter, more share-friendly names, and it moves
all supporting files to subdirectories. It also adds a README
documenting the conventions.

For example, blog.golang.org/go-programming-language-turns-two
is now blog.golang.org/2years, matching our more recent birthday
post URLs, and its supporting files are moved to the new 2years/ directory.

The old URLs redirect to the new ones.

Change-Id: I9f46a790c2c8fab8459aeda73d4e3d2efc86d88f
Reviewed-on: https://go-review.googlesource.com/c/blog/+/223599
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Andrew Bonventre <andybons@golang.org>
diff --git a/content/go-one-year-ago-today.article b/content/1year.article
similarity index 99%
rename from content/go-one-year-ago-today.article
rename to content/1year.article
index 13fac86..cad82c6 100644
--- a/content/go-one-year-ago-today.article
+++ b/content/1year.article
@@ -2,6 +2,7 @@
 10 Nov 2010
 Tags: birthday
 Summary: Happy 1st birthday, Go!
+OldURL: /go-one-year-ago-today
 
 Andrew Gerrand
 
diff --git a/content/go-programming-language-turns-two.article b/content/2years.article
similarity index 96%
rename from content/go-programming-language-turns-two.article
rename to content/2years.article
index 622942e..6dd1852 100644
--- a/content/go-programming-language-turns-two.article
+++ b/content/2years.article
@@ -2,6 +2,7 @@
 10 Nov 2011
 Tags: appengine, community, gopher
 Summary: Happy 2nd birthday, Go!
+OldURL: /go-programming-language-turns-two
 
 Andrew Gerrand
 
@@ -66,10 +67,10 @@
 I/O and other Go talks) and in vinyl form (received by every attendee at
 OSCON and now available at the [Google Store](http://www.googlestore.com/Fun/Go+Gopher+Figurine.axd)).
 
-.image go-programming-language-turns-two_gophers.jpg
+.image 2years/2years-gophers.jpg
 
 And, most surprisingly, at Halloween he made an appearance with his gopher girlfriend!
 
-.image go-programming-language-turns-two_costume.jpg
+.image 2years/2years-costume.jpg
 
 Photograph by [Chris Nokleberg](https://plus.google.com/106640494112897458359/posts).
diff --git a/content/go-programming-language-turns-two_costume.jpg b/content/2years/2years-costume.jpg
similarity index 100%
rename from content/go-programming-language-turns-two_costume.jpg
rename to content/2years/2years-costume.jpg
Binary files differ
diff --git a/content/go-programming-language-turns-two_gophers.jpg b/content/2years/2years-gophers.jpg
similarity index 100%
rename from content/go-programming-language-turns-two_gophers.jpg
rename to content/2years/2years-gophers.jpg
Binary files differ
diff --git a/content/go-turns-three.article b/content/3years.article
similarity index 99%
rename from content/go-turns-three.article
rename to content/3years.article
index 9e17300..6183691 100644
--- a/content/go-turns-three.article
+++ b/content/3years.article
@@ -2,6 +2,7 @@
 10 Nov 2012
 Tags: community, birthday
 Summary: Happy 3rd birthday, Go!
+OldURL: /go-turns-three
 
 Russ Cox
 
diff --git a/content/4years.article b/content/4years.article
index d16e29d..711714d 100644
--- a/content/4years.article
+++ b/content/4years.article
@@ -9,7 +9,7 @@
 
 Today marks the fourth anniversary of Go as an open source project.
 
-.image 4years-gopher.png
+.image 4years/4years-gopher.png
 
 Rather than talk about our technical progress (there'll be much to talk about
 when we release Go 1.2 in a couple of weeks) we thought we would instead take
@@ -17,7 +17,7 @@
 
 Let's start with a chart:
 
-.image 4years-graph.png
+.image 4years/4years-graph.png
 
 This chart shows the growth of Google searches for the term
 "[golang](http://www.google.com/trends/explore?hl=en-US#q=golang&date=10/2009+50m&cmpt=q)"
diff --git a/content/4years-gopher.png b/content/4years/4years-gopher.png
similarity index 100%
rename from content/4years-gopher.png
rename to content/4years/4years-gopher.png
Binary files differ
diff --git a/content/4years-graph.png b/content/4years/4years-graph.png
similarity index 100%
rename from content/4years-graph.png
rename to content/4years/4years-graph.png
Binary files differ
diff --git a/content/6years.article b/content/6years.article
index 408b5ac..fa70b8e 100644
--- a/content/6years.article
+++ b/content/6years.article
@@ -15,7 +15,7 @@
 [the](https://blog.golang.org/gouk15)
 [world](https://blog.golang.org/gopherchina) with regularity.
 
-.image 6years-gopher.png
+.image 6years/6years-gopher.png
 
 In August we [released Go 1.5](https://blog.golang.org/go1.5), the most
 significant release since Go 1. It features a completely
diff --git a/content/6years-gopher.png b/content/6years/6years-gopher.png
similarity index 100%
rename from content/6years-gopher.png
rename to content/6years/6years-gopher.png
Binary files differ
diff --git a/content/7years.article b/content/7years.article
index d329770..e46cc37 100644
--- a/content/7years.article
+++ b/content/7years.article
@@ -7,7 +7,7 @@
 
 ##
 
-.html gopherbelly.html
+.html 7years/gopherbelly.html
 
 Today marks seven years since we open-sourced our preliminary sketch of Go.
 With the help of the open source community, including more than a thousand
diff --git a/content/7years/gopherbelly.html b/content/7years/gopherbelly.html
new file mode 100644
index 0000000..021d550
--- /dev/null
+++ b/content/7years/gopherbelly.html
@@ -0,0 +1 @@
+ <img src="7years/gopherbelly300.jpg" align="right">
diff --git a/content/gopherbelly300.jpg b/content/7years/gopherbelly300.jpg
similarity index 100%
rename from content/gopherbelly300.jpg
rename to content/7years/gopherbelly300.jpg
Binary files differ
diff --git a/content/9years.article b/content/9years.article
index 5795c0d..71b3137 100644
--- a/content/9years.article
+++ b/content/9years.article
@@ -57,7 +57,7 @@
 The Go community is truly global.
 At GopherCon Europe in Iceland this past summer, gophers literally spanned the gap between the continents.
 
-.image 9years-iceland.jpg _ 800
+.image 9years/9years-iceland.jpg _ 800
 
 _(Photo by Winter Francia.)_
 
@@ -85,7 +85,7 @@
 The project hit a major milestone in mid-2018 when, for the first time,
 we had more contributions coming from the community than the Go team.
 
-.image 9years-graph.png _ 600
+.image 9years/9years-graph.png _ 600
 
 ## Thank You
 
diff --git a/content/9years-graph.png b/content/9years/9years-graph.png
similarity index 100%
rename from content/9years-graph.png
rename to content/9years/9years-graph.png
Binary files differ
diff --git a/content/9years-iceland.jpg b/content/9years/9years-iceland.jpg
similarity index 100%
rename from content/9years-iceland.jpg
rename to content/9years/9years-iceland.jpg
Binary files differ
diff --git a/content/README b/content/README
new file mode 100644
index 0000000..30e149c
--- /dev/null
+++ b/content/README
@@ -0,0 +1,27 @@
+This directory holds Go blog articles, in *.article.
+See https://pkg.go.dev/golang.org/x/tools/present?tab=doc
+for documentation of the file format or look at any of the
+articles for examples.
+
+Article file names should be short, amenable to being typed by hand in URLs.
+Typically article file names are up to three words, separated by dashes.
+A trailing year in the name typically does not have a dash before it.
+
+All supporting files for an article, even if there's only one, should be
+placed in a directory named for the article (minus the .article suffix).
+
+If your article has code that is meant to be a working program, please use
+.code, or ideally .play, to load the lines from a supporting .go file.
+That way you can easily check that the .go file, and therefore the code
+in your article, still works.
+
+Please use .image and .video to embed images and videos,
+instead of using raw HTML tags. The .image and .video commands
+provide a way to adjust the implementation of those embeddings
+all in one place.
+
+Please use .html when it is necessary to add large blocks of HTML,
+keeping article text in the main .article file. Another important use of
+.html is to factor out an HTML snippet that appears multiple times.
+Short HTML sequences, like <div><center> or </div></center>,
+are fine to put directly in the article files.
diff --git a/content/go-app-engine-sdk-155-released.article b/content/appengine-155.article
similarity index 97%
rename from content/go-app-engine-sdk-155-released.article
rename to content/appengine-155.article
index 8523232..37cf290 100644
--- a/content/go-app-engine-sdk-155-released.article
+++ b/content/appengine-155.article
@@ -2,6 +2,7 @@
 11 Oct 2011
 Tags: appengine, gofix, release
 Summary: Go App Engine SDK 1.5.5 includes Go release.r60.2.
+OldURL: /go-app-engine-sdk-155-released
 
 Andrew Gerrand
 
diff --git a/content/go-updates-in-app-engine-171.article b/content/appengine-171.article
similarity index 98%
rename from content/go-updates-in-app-engine-171.article
rename to content/appengine-171.article
index a25c7dd..57c047d 100644
--- a/content/go-updates-in-app-engine-171.article
+++ b/content/appengine-171.article
@@ -2,6 +2,7 @@
 22 Aug 2012
 Tags: appengine, release
 Summary: App Engine SDK 1.7.1 adds memcache and other functionality for Go.
+OldURL: /go-updates-in-app-engine-171
 
 Andrew Gerrand
 
diff --git a/content/go-for-app-engine-is-now-generally.article b/content/appengine-ga.article
similarity index 97%
rename from content/go-for-app-engine-is-now-generally.article
rename to content/appengine-ga.article
index de68b11..964efc1 100644
--- a/content/go-for-app-engine-is-now-generally.article
+++ b/content/appengine-ga.article
@@ -2,6 +2,7 @@
 21 Jul 2011
 Tags: appengine, release
 Summary: You can use Go on App Engine now!
+OldURL: /go-for-app-engine-is-now-generally
 
 Andrew Gerrand
 
diff --git a/content/the-app-engine-sdk-and-workspaces-gopath.article b/content/appengine-gopath.article
similarity index 98%
rename from content/the-app-engine-sdk-and-workspaces-gopath.article
rename to content/appengine-gopath.article
index 846ae0b..d9f995b 100644
--- a/content/the-app-engine-sdk-and-workspaces-gopath.article
+++ b/content/appengine-gopath.article
@@ -2,6 +2,7 @@
 9 Jan 2013
 Tags: appengine, tools, gopath
 Summary: App Engine SDK 1.7.4 adds support for GOPATH-style workspaces.
+OldURL: /the-app-engine-sdk-and-workspaces-gopath
 
 Andrew Gerrand
 
diff --git a/content/writing-scalable-app-engine.article b/content/appengine-scalable.article
similarity index 97%
rename from content/writing-scalable-app-engine.article
rename to content/appengine-scalable.article
index 231305c..4a91040 100644
--- a/content/writing-scalable-app-engine.article
+++ b/content/appengine-scalable.article
@@ -2,6 +2,7 @@
 1 Nov 2011
 Tags: appengine, optimization
 Summary: How to build scalable web applications using Go with Google App Engine.
+OldURL: /writing-scalable-app-engine
 
 David Symonds
 
diff --git a/content/go-and-google-app-engine.article b/content/appengine.article
similarity index 98%
rename from content/go-and-google-app-engine.article
rename to content/appengine.article
index f88b17d..89b8244 100644
--- a/content/go-and-google-app-engine.article
+++ b/content/appengine.article
@@ -2,6 +2,7 @@
 10 May 2011
 Tags: appengine, release
 Summary: Announcing support for Go in Google App Engine.
+OldURL: /go-and-google-app-engine
 
 David Symonds
 
diff --git a/content/go-wins-2010-bossie-award.article b/content/bossie.article
similarity index 97%
rename from content/go-wins-2010-bossie-award.article
rename to content/bossie.article
index fea692e..bff5a23 100644
--- a/content/go-wins-2010-bossie-award.article
+++ b/content/bossie.article
@@ -1,6 +1,7 @@
 # Go Wins 2010 Bossie Award
 6 Sep 2010
 Summary: Go wins a 2010 Bossie Award for “best open source application development software.” 
+OldURL: /go-wins-2010-bossie-award
 
 Andrew Gerrand
 
diff --git a/content/c-go-cgo.article b/content/cgo.article
similarity index 99%
rename from content/c-go-cgo.article
rename to content/cgo.article
index b344def..0697395 100644
--- a/content/c-go-cgo.article
+++ b/content/cgo.article
@@ -2,6 +2,7 @@
 17 Mar 2011
 Tags: cgo, technical
 Summary: How to use cgo to let Go packages call C code.
+OldURL: /c-go-cgo
 
 Andrew Gerrand
 
diff --git a/content/share-memory-by-communicating.article b/content/codelab-share.article
similarity index 98%
rename from content/share-memory-by-communicating.article
rename to content/codelab-share.article
index c254ea0..03fbab6 100644
--- a/content/share-memory-by-communicating.article
+++ b/content/codelab-share.article
@@ -2,6 +2,7 @@
 13 Jul 2010
 Tags: concurrency, technical
 Summary: A preview of the new Go codelab, Share Memory by Communicating.
+OldURL: /share-memory-by-communicating
 
 Andrew Gerrand
 
diff --git a/content/go-concurrency-patterns-timing-out-and.article b/content/concurrency-timeouts.article
similarity index 98%
rename from content/go-concurrency-patterns-timing-out-and.article
rename to content/concurrency-timeouts.article
index 9bdc565..8237e7d 100644
--- a/content/go-concurrency-patterns-timing-out-and.article
+++ b/content/concurrency-timeouts.article
@@ -2,6 +2,7 @@
 23 Sep 2010
 Tags: concurrency, technical
 Summary: How to implement timeouts using Go's concurrency support.
+OldURL: /go-concurrency-patterns-timing-out-and
 
 Andrew Gerrand
 
diff --git a/content/community-outreach-working-group.article b/content/cwg.article
similarity index 96%
rename from content/community-outreach-working-group.article
rename to content/cwg.article
index 72ae0c4..d38dbf4 100644
--- a/content/community-outreach-working-group.article
+++ b/content/cwg.article
@@ -2,6 +2,7 @@
 5 Sep 2017
 Tags: community
 Summary: Annoucing the Go Community Outreach Working Group (CWG).
+OldURL: /community-outreach-working-group
 
 Steve Francia & Cassandra Salisbury
 spf@golang.org
@@ -48,7 +49,7 @@
 primary initiatives. Each project has a variety of [issues](https://github.com/golang/cwg/issues) tied to them
 with assignees from our Leadership team and [our members](https://github.com/golang/cwg/issues/15).
 
-.image community-outreach-working-group/project.png
+.image cwg/project.png
 
 If you’d like to get involved, we encourage you to comment on the issue
 that interests you or [submit an issue](https://github.com/golang/cwg/issues/new) yourself!
diff --git a/content/community-outreach-working-group/project.png b/content/cwg/project.png
similarity index 100%
rename from content/community-outreach-working-group/project.png
rename to content/cwg/project.png
Binary files differ
diff --git a/content/debugging-go-programs-with-gnu-debugger.article b/content/debug-gdb.article
similarity index 93%
rename from content/debugging-go-programs-with-gnu-debugger.article
rename to content/debug-gdb.article
index e6cfbda..ff24c4f 100644
--- a/content/debugging-go-programs-with-gnu-debugger.article
+++ b/content/debug-gdb.article
@@ -2,6 +2,7 @@
 30 Oct 2011
 Tags: debug, gdb, technical
 Summary: Announcing a new article about debugging Go programs with GDB.
+OldURL: /debugging-go-programs-with-gnu-debugger
 
 Andrew Gerrand
 
diff --git a/content/debugging-what-you-deploy.article b/content/debug-opt.article
similarity index 98%
rename from content/debugging-what-you-deploy.article
rename to content/debug-opt.article
index 29274cb..002181b 100644
--- a/content/debugging-what-you-deploy.article
+++ b/content/debug-opt.article
@@ -2,6 +2,7 @@
 21 Mar 2019
 Tags: debug, technical
 Summary: Go 1.12 improves support for debugging optimized binaries.
+OldURL: /debugging-what-you-deploy
 
 David Chase
 
@@ -65,7 +66,7 @@
 This shows an example of stepping through a simple function in a debugger in 1.10,
 with flaws (skipped and repeated lines) highlighted by red arrows.
 
-.image debugging-what-you-deploy.svg _ 450
+.image debug-opt/stepping.svg _ 450
 
 Flaws like this make it easy to lose track of where you are when stepping
 through a program and interfere with hitting breakpoints.
diff --git a/content/debugging-what-you-deploy.graffle b/content/debug-opt/stepping.graffle
similarity index 100%
rename from content/debugging-what-you-deploy.graffle
rename to content/debug-opt/stepping.graffle
Binary files differ
diff --git a/content/debugging-what-you-deploy.svg b/content/debug-opt/stepping.svg
similarity index 100%
rename from content/debugging-what-you-deploy.svg
rename to content/debug-opt/stepping.svg
diff --git a/content/debugging-go-code-status-report.article b/content/debug-status.article
similarity index 98%
rename from content/debugging-go-code-status-report.article
rename to content/debug-status.article
index 7881bc5..1f5416b 100644
--- a/content/debugging-go-code-status-report.article
+++ b/content/debug-status.article
@@ -2,6 +2,7 @@
 2 Nov 2010
 Tags: debug, gdb
 Summary: What works and what doesn't when debugging Go programs with GDB.
+OldURL: /debugging-go-code-status-report
 
 Luuk van Dijk
 
diff --git a/content/gos-declaration-syntax.article b/content/declaration-syntax.article
similarity index 99%
rename from content/gos-declaration-syntax.article
rename to content/declaration-syntax.article
index f0eab83..f1d0574 100644
--- a/content/gos-declaration-syntax.article
+++ b/content/declaration-syntax.article
@@ -2,6 +2,7 @@
 7 Jul 2010
 Tags: c, syntax, ethos
 Summary: Why Go's declaration syntax doesn't look like, and is much simpler than, C's.
+OldURL: /gos-declaration-syntax
 
 Rob Pike
 
diff --git a/content/docker.article b/content/docker.article
index 973b547..d0be85c 100644
--- a/content/docker.article
+++ b/content/docker.article
@@ -93,7 +93,7 @@
 With the container running, open `http://localhost:6060/` in a web browser and
 you should see something like this:
 
-.image docker-outyet.png
+.image docker/outyet.png
 
 (If your docker daemon is running on another machine (or in a virtual machine),
 you should replace `localhost` with the address of that machine. If you're
diff --git a/content/docker-outyet.png b/content/docker/outyet.png
similarity index 100%
rename from content/docker-outyet.png
rename to content/docker/outyet.png
Binary files differ
diff --git a/content/spotlight-on-external-go-libraries.article b/content/external-libraries.article
similarity index 98%
rename from content/spotlight-on-external-go-libraries.article
rename to content/external-libraries.article
index 6485d3b..fc21c8e 100644
--- a/content/spotlight-on-external-go-libraries.article
+++ b/content/external-libraries.article
@@ -2,6 +2,7 @@
 3 Jun 2011
 Tags: community, libraries
 Summary: Some popular Go libraries and how to use them.
+OldURL: /spotlight-on-external-go-libraries
 
 Andrew Gerrand
 
diff --git a/content/first-class-functions-in-go-and-new-go.article b/content/functions-codewalk.article
similarity index 88%
rename from content/first-class-functions-in-go-and-new-go.article
rename to content/functions-codewalk.article
index 16f9be1..1ae0b84 100644
--- a/content/first-class-functions-in-go-and-new-go.article
+++ b/content/functions-codewalk.article
@@ -1,7 +1,8 @@
-# "First Class Functions in Go"
+# First Class Functions in Go
 30 Jun 2011
 Tags: codewalk, function, technical
 Summary: Announcing a new Go codewalk, exploring first class functions.
+OldURL: /first-class-functions-in-go-and-new-go
 
 Andrew Gerrand
 
diff --git a/content/gif-decoder-exercise-in-go-interfaces.article b/content/gif-decoder.article
similarity index 97%
rename from content/gif-decoder-exercise-in-go-interfaces.article
rename to content/gif-decoder.article
index 003d3ed..d848210 100644
--- a/content/gif-decoder-exercise-in-go-interfaces.article
+++ b/content/gif-decoder.article
@@ -2,6 +2,7 @@
 25 May 2011
 Tags: gif, gopher, image, interface, lagomorph, lzw, moustache, rodent, technical
 Summary: How Go's interfaces work nicely in the Go GIF decoder.
+OldURL: /gif-decoder-exercise-in-go-interfaces
 
 Rob Pike
 
@@ -16,11 +17,11 @@
 In that vein, we demonstrated a program called [Moustachio](http://moustach-io.appspot.com/)
 that makes it easy to improve a picture such as this one:
 
-.image gif-decoder-exercise-in-go-interfaces_image00.jpg
+.image gif-decoder/image00.jpg
 
 by adding a moustache and sharing the result:
 
-.image gif-decoder-exercise-in-go-interfaces_image02.jpg
+.image gif-decoder/image02.jpg
 
 All the graphical processing, including rendering the antialiased moustache,
 is done by a Go program running on App Engine.
@@ -60,7 +61,7 @@
 The compressed data is then broken into length-delimited blocks with a one-byte
 count (0-255) followed by that many bytes:
 
-.image gif-decoder-exercise-in-go-interfaces_image03.gif
+.image gif-decoder/image03.gif
 
 ## Deblocking the pixel data
 
@@ -208,6 +209,6 @@
 
 That deserves another picture, a GIF this time:
 
-.image gif-decoder-exercise-in-go-interfaces_image01.gif
+.image gif-decoder/image01.gif
 
 The GIF format is defined at [http://www.w3.org/Graphics/GIF/spec-gif89a.txt](http://www.w3.org/Graphics/GIF/spec-gif89a.txt).
diff --git a/content/gif-decoder-exercise-in-go-interfaces_image00.jpg b/content/gif-decoder/image00.jpg
similarity index 100%
rename from content/gif-decoder-exercise-in-go-interfaces_image00.jpg
rename to content/gif-decoder/image00.jpg
Binary files differ
diff --git a/content/gif-decoder-exercise-in-go-interfaces_image01.gif b/content/gif-decoder/image01.gif
similarity index 100%
rename from content/gif-decoder-exercise-in-go-interfaces_image01.gif
rename to content/gif-decoder/image01.gif
Binary files differ
diff --git a/content/gif-decoder-exercise-in-go-interfaces_image02.jpg b/content/gif-decoder/image02.jpg
similarity index 100%
rename from content/gif-decoder-exercise-in-go-interfaces_image02.jpg
rename to content/gif-decoder/image02.jpg
Binary files differ
diff --git a/content/gif-decoder-exercise-in-go-interfaces_image03.gif b/content/gif-decoder/image03.gif
similarity index 100%
rename from content/gif-decoder-exercise-in-go-interfaces_image03.gif
rename to content/gif-decoder/image03.gif
Binary files differ
diff --git a/content/gcdk-whats-new-in-march-2019.article b/content/go-cloud2019.article
similarity index 98%
rename from content/gcdk-whats-new-in-march-2019.article
rename to content/go-cloud2019.article
index 29496a6..7c22a33 100644
--- a/content/gcdk-whats-new-in-march-2019.article
+++ b/content/go-cloud2019.article
@@ -1,6 +1,7 @@
 # What's new in the Go Cloud Development Kit
 4 Mar 2019
 Summary: Recent changes to the Go Cloud Development Kit (Go CDK).
+OldURL: /gcdk-whats-new-in-march-2019
 
 The Go Cloud Development Kit team at Google
 
diff --git a/content/the-path-to-go-1.article b/content/go1-path.article
similarity index 97%
rename from content/the-path-to-go-1.article
rename to content/go1-path.article
index 072de3b..ce867ea 100644
--- a/content/the-path-to-go-1.article
+++ b/content/go1-path.article
@@ -2,6 +2,7 @@
 14 Mar 2013
 Tags: talk, video, go1
 Summary: Watch Rob Pike and Andrew Gerrand's talk, The Path to Go 1.
+OldURL: /the-path-to-go-1
 
 Andrew Gerrand
 
diff --git a/content/preview-of-go-version-1.article b/content/go1-preview.article
similarity index 98%
rename from content/preview-of-go-version-1.article
rename to content/go1-preview.article
index 4cb514d..6e3f474 100644
--- a/content/preview-of-go-version-1.article
+++ b/content/go1-preview.article
@@ -2,6 +2,7 @@
 5 Oct 2011
 Tags: go1, release
 Summary: What the Go team is planning for Go version 1.
+OldURL: /preview-of-go-version-1
 
 Russ Cox
 
diff --git a/content/go-11-is-released.article b/content/go1.1.article
similarity index 97%
rename from content/go-11-is-released.article
rename to content/go1.1.article
index 9b641b6..f2f26c6 100644
--- a/content/go-11-is-released.article
+++ b/content/go1.1.article
@@ -2,6 +2,7 @@
 13 May 2013
 Tags: release
 Summary: Go 1.1 is faster, less picky about return statements, and adds method expressions.
+OldURL: /go-11-is-released
 
 Andrew Gerrand
 
@@ -9,7 +10,7 @@
 
 It is our great pleasure to announce the release of Go 1.1.
 
-.image go-11-is-released_gopherbiplane5.jpg
+.image go1.1/gopherbiplane5.jpg
 
 In March last year we released Go 1.0, and since then we have released three
 minor "point releases".
diff --git a/content/go-11-is-released_gopherbiplane5.jpg b/content/go1.1/gopherbiplane5.jpg
similarity index 100%
rename from content/go-11-is-released_gopherbiplane5.jpg
rename to content/go1.1/gopherbiplane5.jpg
Binary files differ
diff --git a/content/go1.7-binary-size.article b/content/go1.7-binary-size.article
index 596c000..0b99a8d 100644
--- a/content/go1.7-binary-size.article
+++ b/content/go1.7-binary-size.article
@@ -82,7 +82,7 @@
 When compiled without debugging information the statically
 linked binary is now under a megabyte.
 
-.image go1.7-binary-size.png
+.image go1.7-binary-size/graph.png
 
 A large production program used for testing this cycle, `jujud`, went from 94MB
 to 67MB.
diff --git a/content/go1.7-binary-size.png b/content/go1.7-binary-size/graph.png
similarity index 100%
rename from content/go1.7-binary-size.png
rename to content/go1.7-binary-size/graph.png
Binary files differ
diff --git a/content/go-version-1-is-released.article b/content/go1.article
similarity index 98%
rename from content/go-version-1-is-released.article
rename to content/go1.article
index 89a63b1..be06ceb 100644
--- a/content/go-version-1-is-released.article
+++ b/content/go1.article
@@ -7,7 +7,7 @@
 
 ##
 
-.image go-version-1-is-released_gophermega.jpg
+.image go1/gophermega.jpg
 
 Today marks a major milestone in the development of the Go programming language.
 We're announcing Go version 1, or Go 1 for short,
diff --git a/content/go-version-1-is-released_gophermega.jpg b/content/go1/gophermega.jpg
similarity index 100%
rename from content/go-version-1-is-released_gophermega.jpg
rename to content/go1/gophermega.jpg
Binary files differ
diff --git a/content/gobs-of-data.article b/content/gob.article
similarity index 99%
rename from content/gobs-of-data.article
rename to content/gob.article
index b361ca6..3b5c405 100644
--- a/content/gobs-of-data.article
+++ b/content/gob.article
@@ -2,6 +2,7 @@
 24 Mar 2011
 Tags: gob, json, protobuf, xml, technical
 Summary: Introducing gob, a high-speed Go-to-Go wire encoding format.
+OldURL: /gobs-of-data
 
 Rob Pike
 
diff --git a/content/godoc-documenting-go-code.article b/content/godoc.article
similarity index 99%
rename from content/godoc-documenting-go-code.article
rename to content/godoc.article
index 26ff00a..d2a5c82 100644
--- a/content/godoc-documenting-go-code.article
+++ b/content/godoc.article
@@ -2,6 +2,7 @@
 31 Mar 2011
 Tags: godoc, technical
 Summary: How and why to document your Go packages.
+OldURL: /godoc-documenting-go-code
 
 Andrew Gerrand
 
diff --git a/content/go-fmt-your-code.article b/content/gofmt.article
similarity index 99%
rename from content/go-fmt-your-code.article
rename to content/gofmt.article
index 7f3a350..7aa3428 100644
--- a/content/go-fmt-your-code.article
+++ b/content/gofmt.article
@@ -2,6 +2,7 @@
 23 Jan 2013
 Tags: gofix, gofmt, technical
 Summary: How and why to format your Go code using gofmt.
+OldURL: /go-fmt-your-code
 
 Andrew Gerrand
 
diff --git a/content/gopherbelly.html b/content/gopherbelly.html
deleted file mode 100644
index a9a4feb..0000000
--- a/content/gopherbelly.html
+++ /dev/null
@@ -1,2 +0,0 @@
- <img src="gopherbelly300.jpg" align="right">
- 
\ No newline at end of file
diff --git a/content/gophercon2015.article b/content/gophercon2015.article
index 9c06786..526859c 100644
--- a/content/gophercon2015.article
+++ b/content/gophercon2015.article
@@ -12,8 +12,8 @@
 more than 1,250 attendees—nearly double last year's number—and featured 22
 talks presented by Go community members.
 
-.image gophercon2015.jpg _ 550
-.html gophercon2015.caption
+.image gophercon2015/cowboy.jpg _ 550
+.html gophercon2015/cowboy.caption
 
 Today the organizers have posted the videos online so you can now enjoy the
 conference from afar:
diff --git a/content/gophercon2015.caption b/content/gophercon2015/cowboy.caption
similarity index 100%
rename from content/gophercon2015.caption
rename to content/gophercon2015/cowboy.caption
diff --git a/content/gophercon2015.jpg b/content/gophercon2015/cowboy.jpg
similarity index 100%
rename from content/gophercon2015.jpg
rename to content/gophercon2015/cowboy.jpg
Binary files differ
diff --git a/content/go-whats-new-in-march-2010.article b/content/hello-world.article
similarity index 98%
rename from content/go-whats-new-in-march-2010.article
rename to content/hello-world.article
index a046f7d..c0438ee 100644
--- a/content/go-whats-new-in-march-2010.article
+++ b/content/hello-world.article
@@ -1,6 +1,7 @@
 # Go: What's New in March 2010
 18 Mar 2010
 Summary: First post!
+OldURL: /go-whats-new-in-march-2010
 
 Andrew Gerrand
 
diff --git a/content/go-at-heroku.article b/content/heroku.article
similarity index 99%
rename from content/go-at-heroku.article
rename to content/heroku.article
index 7fe67ef..2aa75c2 100644
--- a/content/go-at-heroku.article
+++ b/content/heroku.article
@@ -2,6 +2,7 @@
 21 Apr 2011
 Tags: guest
 Summary: _This week’s blog post is written by_ [_Keith Rarick_](http://xph.us/) _and_ [_Blake Mizerany_](http://itsbonus.heroku.com/), _systems engineers at_ [Heroku](http://www.heroku.com/). _In their own words, they "eat, drink, and sleep distributed systems." Here they discuss their experiences using Go._
+OldURL: /go-at-heroku
 
 Keith Rarick
 
diff --git a/content/go-imagedraw-package.article b/content/image-draw.article
similarity index 96%
rename from content/go-imagedraw-package.article
rename to content/image-draw.article
index f3a1bc8..aa2f77a 100644
--- a/content/go-imagedraw-package.article
+++ b/content/image-draw.article
@@ -2,6 +2,7 @@
 29 Sep 2011
 Tags: draw, image, libraries, technical
 Summary: An introduction to image compositing in Go using the image/draw package.
+OldURL: /go-imagedraw-package
 
 Nigel Tao
 
@@ -58,7 +59,7 @@
 The effective rectangle is also clipped to each image's bounds in their
 respective co-ordinate space.
 
-.image go-imagedraw-package_20.png
+.image image-draw/20.png
 
 The [`DrawMask`](https://golang.org/pkg/image/draw/#DrawMask) function
 takes seven arguments,
@@ -102,7 +103,7 @@
 
 	draw.Draw(m, m.Bounds(), image.Transparent, image.ZP, draw.Src)
 
-.image go-imagedraw-package_2a.png
+.image image-draw/2a.png
 
 ## Copying an Image
 
@@ -120,7 +121,7 @@
 
 To copy the entire source image, use `sr = src.Bounds()`.
 
-.image go-imagedraw-package_2b.png
+.image image-draw/2b.png
 
 ## Scrolling an Image
 
@@ -137,7 +138,7 @@
 	draw.Draw(m, b, m, b.Min.Add(p), draw.Src)
 	dirtyRect := b.Intersect(image.Rect(b.Min.X, b.Max.Y-20, b.Max.X, b.Max.Y))
 
-.image go-imagedraw-package_2c.png
+.image image-draw/2c.png
 
 ## Converting an Image to RGBA
 
@@ -151,7 +152,7 @@
 	m := image.NewRGBA(image.Rect(0, 0, b.Dx(), b.Dy()))
 	draw.Draw(m, m.Bounds(), src, b.Min, draw.Src)
 
-.image go-imagedraw-package_2d.png
+.image image-draw/2d.png
 
 ## Drawing Through a Mask
 
@@ -180,7 +181,7 @@
 
 	    draw.DrawMask(dst, dst.Bounds(), src, image.ZP, &circle{p, r}, image.ZP, draw.Over)
 
-.image go-imagedraw-package_2e.png
+.image image-draw/2e.png
 
 ## Drawing Font Glyphs
 
@@ -194,7 +195,7 @@
 	mr := theBoundsFor(glyphIndex)
 	draw.DrawMask(dst, mr.Sub(mr.Min).Add(p), src, image.ZP, mask, mr.Min, draw.Over)
 
-.image go-imagedraw-package_2f.png
+.image image-draw/2f.png
 
 ## Performance
 
diff --git a/content/go-imagedraw-package_20.png b/content/image-draw/20.png
similarity index 100%
rename from content/go-imagedraw-package_20.png
rename to content/image-draw/20.png
Binary files differ
diff --git a/content/go-imagedraw-package_2a.png b/content/image-draw/2a.png
similarity index 100%
rename from content/go-imagedraw-package_2a.png
rename to content/image-draw/2a.png
Binary files differ
diff --git a/content/go-imagedraw-package_2b.png b/content/image-draw/2b.png
similarity index 100%
rename from content/go-imagedraw-package_2b.png
rename to content/image-draw/2b.png
Binary files differ
diff --git a/content/go-imagedraw-package_2c.png b/content/image-draw/2c.png
similarity index 100%
rename from content/go-imagedraw-package_2c.png
rename to content/image-draw/2c.png
Binary files differ
diff --git a/content/go-imagedraw-package_2d.png b/content/image-draw/2d.png
similarity index 100%
rename from content/go-imagedraw-package_2d.png
rename to content/image-draw/2d.png
Binary files differ
diff --git a/content/go-imagedraw-package_2e.png b/content/image-draw/2e.png
similarity index 100%
rename from content/go-imagedraw-package_2e.png
rename to content/image-draw/2e.png
Binary files differ
diff --git a/content/go-imagedraw-package_2f.png b/content/image-draw/2f.png
similarity index 100%
rename from content/go-imagedraw-package_2f.png
rename to content/image-draw/2f.png
Binary files differ
diff --git a/content/go-image-package.article b/content/image.article
similarity index 97%
rename from content/go-image-package.article
rename to content/image.article
index 2501b7b..875d117 100644
--- a/content/go-image-package.article
+++ b/content/image.article
@@ -2,6 +2,7 @@
 21 Sep 2011
 Tags: image, libraries, technical
 Summary: An introduction to 2-D image processing with the Go image package.
+OldURL: /go-image-package
 
 Nigel Tao
 
@@ -96,7 +97,7 @@
 	    X, Y int
 	}
 
-.image go-image-package_image-package-01.png
+.image image/image-package-01.png
 
 	p := image.Point{2, 1}
 
@@ -121,7 +122,7 @@
 and exclusive at the high end.
 (Unlike arrays and slices, a `Rectangle` often has a non-zero origin.)
 
-.image go-image-package_image-package-02.png
+.image image/image-package-02.png
 
 	r := image.Rect(2, 1, 5, 5)
 	// Dx and Dy return a rectangle's width and height.
@@ -130,14 +131,14 @@
 Adding a `Point` to a `Rectangle` translates the `Rectangle`.
 Points and Rectangles are not restricted to be in the bottom-right quadrant.
 
-.image go-image-package_image-package-03.png
+.image image/image-package-03.png
 
 	r := image.Rect(2, 1, 5, 5).Add(image.Pt(-4, -2))
 	fmt.Println(r.Dx(), r.Dy(), image.Pt(0, 0).In(r)) // prints 3 4 true
 
 Intersecting two Rectangles yields another Rectangle, which may be empty.
 
-.image go-image-package_image-package-04.png
+.image image/image-package-04.png
 
 	r := image.Rect(0, 0, 4, 3).Intersect(image.Rect(2, 2, 5, 5))
 	// Size returns a rectangle's width and height, as a Point.
@@ -219,7 +220,7 @@
 analogous to how modifying the contents of a sub-slice `s[i0:i1]` will affect
 the contents of the original slice `s`.
 
-.image go-image-package_image-package-05.png
+.image image/image-package-05.png
 
 	m0 := image.NewRGBA(image.Rect(0, 0, 8, 5))
 	m1 := m0.SubImage(image.Rect(1, 2, 5, 5)).(*image.RGBA)
diff --git a/content/go-image-package_image-package-01.png b/content/image/image-package-01.png
similarity index 100%
rename from content/go-image-package_image-package-01.png
rename to content/image/image-package-01.png
Binary files differ
diff --git a/content/go-image-package_image-package-02.png b/content/image/image-package-02.png
similarity index 100%
rename from content/go-image-package_image-package-02.png
rename to content/image/image-package-02.png
Binary files differ
diff --git a/content/go-image-package_image-package-03.png b/content/image/image-package-03.png
similarity index 100%
rename from content/go-image-package_image-package-03.png
rename to content/image/image-package-03.png
Binary files differ
diff --git a/content/go-image-package_image-package-04.png b/content/image/image-package-04.png
similarity index 100%
rename from content/go-image-package_image-package-04.png
rename to content/image/image-package-04.png
Binary files differ
diff --git a/content/go-image-package_image-package-05.png b/content/image/image-package-05.png
similarity index 100%
rename from content/go-image-package_image-package-05.png
rename to content/image/image-package-05.png
Binary files differ
diff --git a/content/go-at-io-frequently-asked-questions.article b/content/io2010-faq.article
similarity index 98%
rename from content/go-at-io-frequently-asked-questions.article
rename to content/io2010-faq.article
index 70d3542..e305fcc 100644
--- a/content/go-at-io-frequently-asked-questions.article
+++ b/content/io2010-faq.article
@@ -2,6 +2,7 @@
 27 May 2010
 Tags: appengine
 Summary: Q&A about Go from Google I/O 2010.
+OldURL: /go-at-io-frequently-asked-questions
 
 Andrew Gerrand
 
diff --git a/content/upcoming-google-io-go-events.article b/content/io2010-preview.article
similarity index 96%
rename from content/upcoming-google-io-go-events.article
rename to content/io2010-preview.article
index 2a1d21a..1ea1300 100644
--- a/content/upcoming-google-io-go-events.article
+++ b/content/io2010-preview.article
@@ -1,6 +1,7 @@
 # Upcoming Google I/O Go Events
 12 May 2010
 Summary: If you will be at Google I/O 2010, be sure to catch up with the Go team at these events.
+OldURL: /upcoming-google-io-go-events
 
 Andrew Gerrand
 
diff --git a/content/go-programming-session-video-from.article b/content/io2010.article
similarity index 87%
rename from content/go-programming-session-video-from.article
rename to content/io2010.article
index f5a438f..7fb9484 100644
--- a/content/go-programming-session-video-from.article
+++ b/content/io2010.article
@@ -2,6 +2,7 @@
 6 Jun 2010
 Tags: video, talk
 Summary: A talk by Rob Pike and Russ Cox about Go, from Google I/O 2010.
+OldURL: /go-programming-session-video-from
 
 Andrew Gerrand
 
diff --git a/content/go-at-google-io-2011-videos.article b/content/io2011.article
similarity index 97%
rename from content/go-at-google-io-2011-videos.article
rename to content/io2011.article
index 3eae57d..a6a356a 100644
--- a/content/go-at-google-io-2011-videos.article
+++ b/content/io2011.article
@@ -2,6 +2,7 @@
 23 May 2011
 Tags: appengine, gopher, talk, video
 Summary: Two talks about Go from Google I/O 2011.
+OldURL: /go-at-google-io-2011-videos
 
 Andrew Gerrand
 
@@ -31,7 +32,7 @@
 
 Most important, this talk features the debut of the plush gopher.
 
-.image go-at-google-io-2011-videos_gopher.jpg
+.image io2011/gopher.jpg
 
 For those that didn’t get one at the conference, we hope to make him available for purchase online soon.
 
diff --git a/content/go-at-google-io-2011-videos_gopher.jpg b/content/io2011/gopher.jpg
similarity index 100%
rename from content/go-at-google-io-2011-videos_gopher.jpg
rename to content/io2011/gopher.jpg
Binary files differ
diff --git a/content/go-videos-from-google-io-2012.article b/content/io2012-videos.article
similarity index 97%
rename from content/go-videos-from-google-io-2012.article
rename to content/io2012-videos.article
index 600b000..4183c06 100644
--- a/content/go-videos-from-google-io-2012.article
+++ b/content/io2012-videos.article
@@ -2,6 +2,7 @@
 2 Jul 2012
 Tags: talk, video, concurrency, appengine, ethos
 Summary: Talks about Go from Google I/O 2012.
+OldURL: /go-videos-from-google-io-2012
 
 Andrew Gerrand
 
diff --git a/content/a-conversation-with-the-go-team.article b/content/io2013-chat.article
similarity index 99%
rename from content/a-conversation-with-the-go-team.article
rename to content/io2013-chat.article
index 76c0a40..9b031da 100644
--- a/content/a-conversation-with-the-go-team.article
+++ b/content/io2013-chat.article
@@ -1,6 +1,7 @@
 # A conversation with the Go team
 6 Jun 2013
 Summary: At Google I/O 2013, several members of the Go team hosted a "Fireside chat."
+OldURL: /a-conversation-with-the-go-team
 
 ##
 
diff --git a/content/advanced-go-concurrency-patterns.article b/content/io2013-talk-concurrency.article
similarity index 96%
rename from content/advanced-go-concurrency-patterns.article
rename to content/io2013-talk-concurrency.article
index db7b659..9815c93 100644
--- a/content/advanced-go-concurrency-patterns.article
+++ b/content/io2013-talk-concurrency.article
@@ -2,6 +2,7 @@
 23 May 2013
 Tags: talk, video, concurrency
 Summary: Watch Sameer Ajmani's talk, “Advanced Go Concurrency Patterns,” from Google I/O 2013.
+OldURL: /advanced-go-concurrency-patterns
 
 Andrew Gerrand
 
diff --git a/content/go-and-google-cloud-platform.article b/content/io2013-talks-cloud.article
similarity index 97%
rename from content/go-and-google-cloud-platform.article
rename to content/io2013-talks-cloud.article
index caa69a2..f214ba8 100644
--- a/content/go-and-google-cloud-platform.article
+++ b/content/io2013-talks-cloud.article
@@ -1,6 +1,7 @@
 # Go and the Google Cloud Platform
 12 Jun 2013
 Summary: Two talks about using Go with the Google Cloud Platform, from Google I/O 2013.
+OldURL: /go-and-google-cloud-platform
 
 Andrew Gerrand
 
diff --git a/content/json-rpc-tale-of-interfaces.article b/content/json-rpc.article
similarity index 98%
rename from content/json-rpc-tale-of-interfaces.article
rename to content/json-rpc.article
index 6afdc8c..fc0541f 100644
--- a/content/json-rpc-tale-of-interfaces.article
+++ b/content/json-rpc.article
@@ -2,6 +2,7 @@
 27 Apr 2010
 Tags: json, rpc, technical
 Summary: How to use the net/rpc package's interfaces to create a JSON-RPC system.
+OldURL: /json-rpc-tale-of-interfaces
 
 Andrew Gerrand
 
diff --git a/content/json-and-go.article b/content/json.article
similarity index 99%
rename from content/json-and-go.article
rename to content/json.article
index 61cee1e..bedeba6 100644
--- a/content/json-and-go.article
+++ b/content/json.article
@@ -2,6 +2,7 @@
 25 Jan 2011
 Tags: json, technical
 Summary: How to generate and consume JSON-formatted data in Go.
+OldURL: /json-and-go
 
 Andrew Gerrand
 
diff --git a/content/go-maps-in-action.article b/content/maps.article
similarity index 97%
rename from content/go-maps-in-action.article
rename to content/maps.article
index 8bcda9e..e7b054e 100644
--- a/content/go-maps-in-action.article
+++ b/content/maps.article
@@ -2,6 +2,7 @@
 6 Feb 2013
 Tags: map, technical
 Summary: How and when to use Go maps.
+OldURL: /go-maps-in-action
 
 Andrew Gerrand
 
@@ -109,7 +110,7 @@
 This example traverses a linked list of `Nodes` and prints their values.
 It uses a map of `Node` pointers to detect cycles in the list.
 
-.code go-maps-in-action/list.go /START/,/END/
+.code maps/list.go /START/,/END/
 
 The expression `visited[n]` is `true` if `n` has been visited,
 or `false` if `n` is not present.
@@ -124,15 +125,15 @@
 Each `Person` has a `Name` and a slice of Likes.
 The example creates a map to associate each like with a slice of people that like it.
 
-.code go-maps-in-action/people.go /START1/,/END1/
+.code maps/people.go /START1/,/END1/
 
 To print a list of people who like cheese:
 
-.code go-maps-in-action/people.go /START2/,/END2/
+.code maps/people.go /START2/,/END2/
 
 To print the number of people who like bacon:
 
-.code go-maps-in-action/people.go /bacon/
+.code maps/people.go /bacon/
 
 Note that since both range and len treat a nil slice as a zero-length slice,
 these last two examples will work even if nobody likes cheese or bacon (however
diff --git a/content/go-maps-in-action/list.go b/content/maps/list.go
similarity index 100%
rename from content/go-maps-in-action/list.go
rename to content/maps/list.go
diff --git a/content/go-maps-in-action/people.go b/content/maps/people.go
similarity index 100%
rename from content/go-maps-in-action/people.go
rename to content/maps/people.go
diff --git a/content/getthee-to-go-meetup.article b/content/meetups.article
similarity index 97%
rename from content/getthee-to-go-meetup.article
rename to content/meetups.article
index e2a5e49..ba1e0e8 100644
--- a/content/getthee-to-go-meetup.article
+++ b/content/meetups.article
@@ -2,6 +2,7 @@
 27 Feb 2013
 Tags: community, talk
 Summary: How to find or start a local group of gophers.
+OldURL: /getthee-to-go-meetup
 
 Andrew Gerrand
 
diff --git a/content/introducing-go-playground.article b/content/playground-intro.article
similarity index 95%
rename from content/introducing-go-playground.article
rename to content/playground-intro.article
index bcc6d34..2b3cf1c 100644
--- a/content/introducing-go-playground.article
+++ b/content/playground-intro.article
@@ -2,6 +2,7 @@
 15 Sep 2010
 Tags: playground
 Summary: Announcing the Go Playground, https://play.golang.org/.
+OldURL: /introducing-go-playground
 
 Andrew Gerrand
 
@@ -14,7 +15,7 @@
 the Go documentation tool.
 But the real news is a prominent new feature: the [Go Playground](https://golang.org/).
 
-.image introducing-go-playground_Untitled.png
+.image playground-intro/screenshot.png
 
 The Playground allows anyone with a web browser to write Go code that we
 immediately compile,
diff --git a/content/introducing-go-playground_Untitled.png b/content/playground-intro/screenshot.png
similarity index 100%
rename from content/introducing-go-playground_Untitled.png
rename to content/playground-intro/screenshot.png
Binary files differ
diff --git a/content/profiling-go-programs.article b/content/pprof.article
similarity index 98%
rename from content/profiling-go-programs.article
rename to content/pprof.article
index 2485d05..ef79de1 100644
--- a/content/profiling-go-programs.article
+++ b/content/pprof.article
@@ -2,6 +2,7 @@
 24 Jun 2011
 Tags: benchmark, pprof, profiling, technical
 Summary: How to use Go's built-in profiler to understand and optimize your programs.
+OldURL: /profiling-go-programs
 
 Russ Cox, July 2011; updated by Shenghou Ma, May 2013
 
@@ -188,7 +189,7 @@
 A small fragment of
 [the full graph](https://rawgit.com/rsc/benchgraffiti/master/havlak/havlak1.svg) looks like:
 
-.image profiling-go-programs_havlak1a-75.png
+.image pprof/havlak1a-75.png
 
 Each box in the graph corresponds to a single function, and the boxes are sized
 according to the number of samples in which the function was running.
@@ -205,7 +206,7 @@
 
 	(pprof) web mapaccess1
 
-.image profiling-go-programs_havlak1-hash_lookup-75.png
+.image pprof/havlak1-hash_lookup-75.png
 
 If we squint, we can see that the calls to `runtime.mapaccess1_fast64` are being
 made by `main.FindLoops` and `main.DFS`.
@@ -458,7 +459,7 @@
 
 	(pprof) web mallocgc
 
-.image profiling-go-programs_havlak4a-mallocgc.png
+.image pprof/havlak4a-mallocgc.png
 
 It's hard to tell what's going on in that graph, because there are many nodes with
 small sample numbers obscuring the big ones.
@@ -469,7 +470,7 @@
 	Welcome to pprof!  For help, type 'help'.
 	(pprof) web mallocgc
 
-.image profiling-go-programs_havlak4a-mallocgc-trim.png
+.image pprof/havlak4a-mallocgc-trim.png
 
 We can follow the thick arrows easily now, to see that `FindLoops` is triggering
 most of the garbage collection.
diff --git a/content/profiling-go-programs_havlak1-hash_lookup-75.png b/content/pprof/havlak1-hash_lookup-75.png
similarity index 100%
rename from content/profiling-go-programs_havlak1-hash_lookup-75.png
rename to content/pprof/havlak1-hash_lookup-75.png
Binary files differ
diff --git a/content/profiling-go-programs_havlak1a-75.png b/content/pprof/havlak1a-75.png
similarity index 100%
rename from content/profiling-go-programs_havlak1a-75.png
rename to content/pprof/havlak1a-75.png
Binary files differ
diff --git a/content/profiling-go-programs_havlak4a-mallocgc-trim.png b/content/pprof/havlak4a-mallocgc-trim.png
similarity index 100%
rename from content/profiling-go-programs_havlak4a-mallocgc-trim.png
rename to content/pprof/havlak4a-mallocgc-trim.png
Binary files differ
diff --git a/content/profiling-go-programs_havlak4a-mallocgc.png b/content/pprof/havlak4a-mallocgc.png
similarity index 100%
rename from content/profiling-go-programs_havlak4a-mallocgc.png
rename to content/pprof/havlak4a-mallocgc.png
Binary files differ
diff --git a/content/a-new-go-api-for-protocol-buffers.article b/content/protobuf-apiv2.article
similarity index 98%
rename from content/a-new-go-api-for-protocol-buffers.article
rename to content/protobuf-apiv2.article
index 5c1b1ec..952d73c 100644
--- a/content/a-new-go-api-for-protocol-buffers.article
+++ b/content/protobuf-apiv2.article
@@ -2,8 +2,13 @@
 2 Mar 2020
 Tags: protobuf, technical
 Summary: Announcing a major revision of the Go API for protocol buffers.
+OldURL: /a-new-go-api-for-protocol-buffers
 
-Joe Tsai, Damien Neil, and Herbie Ong
+Joe Tsai
+
+Damien Neil
+
+Herbie Ong
 
 ## Introduction
 
diff --git a/content/third-party-libraries-goprotobuf-and.article b/content/protobuf.article
similarity index 97%
rename from content/third-party-libraries-goprotobuf-and.article
rename to content/protobuf.article
index bbc83e2..c1726ea 100644
--- a/content/third-party-libraries-goprotobuf-and.article
+++ b/content/protobuf.article
@@ -2,6 +2,7 @@
 20 Apr 2010
 Tags: protobuf, community
 Summary: Announcing Go support for Protocol Buffers, Google's data interchange format.
+OldURL: /third-party-libraries-goprotobuf-and
 
 Andrew Gerrand
 
diff --git a/content/go-slices-usage-and-internals.article b/content/slices-intro.article
similarity index 97%
rename from content/go-slices-usage-and-internals.article
rename to content/slices-intro.article
index 2f8c74e..7567c43 100644
--- a/content/go-slices-usage-and-internals.article
+++ b/content/slices-intro.article
@@ -2,6 +2,7 @@
 5 Jan 2011
 Tags: slice, technical
 Summary: How to use Go slices, and how they work.
+OldURL: /go-slices-usage-and-internals
 
 Andrew Gerrand
 
@@ -37,7 +38,7 @@
 
 The in-memory representation of `[4]int` is just four integer values laid out sequentially:
 
-.image go-slices-usage-and-internals_slice-array.png
+.image slices-intro/slice-array.png
 
 Go's arrays are values. An array variable denotes the entire array;
 it is not a pointer to the first array element (as would be the case in C).
@@ -124,11 +125,11 @@
 It consists of a pointer to the array, the length of the segment,
 and its capacity (the maximum length of the segment).
 
-.image go-slices-usage-and-internals_slice-struct.png
+.image slices-intro/slice-struct.png
 
 Our variable `s`, created earlier by `make([]byte, 5)`, is structured like this:
 
-.image go-slices-usage-and-internals_slice-1.png
+.image slices-intro/slice-1.png
 
 The length is the number of elements referred to by the slice.
 The capacity is the number of elements in the underlying array (beginning
@@ -140,7 +141,7 @@
 
 	s = s[2:4]
 
-.image go-slices-usage-and-internals_slice-2.png
+.image slices-intro/slice-2.png
 
 Slicing does not copy the slice's data. It creates a new slice value that
 points to the original array.
@@ -159,7 +160,7 @@
 
 	s = s[:cap(s)]
 
-.image go-slices-usage-and-internals_slice-3.png
+.image slices-intro/slice-3.png
 
 A slice cannot be grown beyond its capacity.
 Attempting to do so will cause a runtime panic,
diff --git a/content/go-slices-usage-and-internals_slice-1.png b/content/slices-intro/slice-1.png
similarity index 100%
rename from content/go-slices-usage-and-internals_slice-1.png
rename to content/slices-intro/slice-1.png
Binary files differ
diff --git a/content/go-slices-usage-and-internals_slice-2.png b/content/slices-intro/slice-2.png
similarity index 100%
rename from content/go-slices-usage-and-internals_slice-2.png
rename to content/slices-intro/slice-2.png
Binary files differ
diff --git a/content/go-slices-usage-and-internals_slice-3.png b/content/slices-intro/slice-3.png
similarity index 100%
rename from content/go-slices-usage-and-internals_slice-3.png
rename to content/slices-intro/slice-3.png
Binary files differ
diff --git a/content/go-slices-usage-and-internals_slice-array.png b/content/slices-intro/slice-array.png
similarity index 100%
rename from content/go-slices-usage-and-internals_slice-array.png
rename to content/slices-intro/slice-array.png
Binary files differ
diff --git a/content/go-slices-usage-and-internals_slice-struct.png b/content/slices-intro/slice-struct.png
similarity index 100%
rename from content/go-slices-usage-and-internals_slice-struct.png
rename to content/slices-intro/slice-struct.png
Binary files differ
diff --git a/content/real-go-projects-smarttwitter-and-webgo.article b/content/smarttwitter.article
similarity index 98%
rename from content/real-go-projects-smarttwitter-and-webgo.article
rename to content/smarttwitter.article
index 7bf7c1d..9bff1c9 100644
--- a/content/real-go-projects-smarttwitter-and-webgo.article
+++ b/content/smarttwitter.article
@@ -2,6 +2,7 @@
 19 Oct 2010
 Tags: guest
 Summary: How Michael Hoisie used Go to build SmartTwitter and web.go.
+OldURL: /real-go-projects-smarttwitter-and-webgo
 
 Michael Hoisie
 
diff --git a/content/go-becomes-more-stable.article b/content/stable-releases.article
similarity index 98%
rename from content/go-becomes-more-stable.article
rename to content/stable-releases.article
index 74d778f..a7a568c 100644
--- a/content/go-becomes-more-stable.article
+++ b/content/stable-releases.article
@@ -2,6 +2,7 @@
 16 Mar 2011
 Tags: release
 Summary: Moving from weekly unstable Go releases toward less frequent, more stable ones.
+OldURL: /go-becomes-more-stable
 
 Andrew Gerrand
 
diff --git a/content/building-stathat-with-go.article b/content/stathat.article
similarity index 98%
rename from content/building-stathat-with-go.article
rename to content/stathat.article
index f329582..6d82328 100644
--- a/content/building-stathat-with-go.article
+++ b/content/stathat.article
@@ -2,6 +2,7 @@
 19 Dec 2011
 Tags: guest
 Summary: How StatHat uses Go, and why they chose it.
+OldURL: /building-stathat-with-go
 
 Patrick Crosby
 
@@ -28,7 +29,7 @@
 
 Here's an example of a StatHat graph of the temperature in NYC, Chicago, and San Francisco:
 
-.image building-stathat-with-go_weather.png
+.image stathat/weather.png
 
 ## Architecture Overview
 
@@ -41,7 +42,7 @@
 different optimization strategies for the API service than a web application
 interacting with humans.
 
-.image building-stathat-with-go_stathat_architecture.png
+.image stathat/architecture.png
 
 The web application service is multi-tiered.
 The web server processes all requests and sends them to an interactor layer.
diff --git a/content/building-stathat-with-go_stathat_architecture.png b/content/stathat/architecture.png
similarity index 100%
rename from content/building-stathat-with-go_stathat_architecture.png
rename to content/stathat/architecture.png
Binary files differ
diff --git a/content/building-stathat-with-go_weather.png b/content/stathat/weather.png
similarity index 100%
rename from content/building-stathat-with-go_weather.png
rename to content/stathat/weather.png
Binary files differ
diff --git a/content/getting-to-know-go-community.article b/content/survey2011.article
similarity index 95%
rename from content/getting-to-know-go-community.article
rename to content/survey2011.article
index e7e48f4..ce28b10 100644
--- a/content/getting-to-know-go-community.article
+++ b/content/survey2011.article
@@ -2,6 +2,7 @@
 21 Dec 2011
 Tags: community
 Summary: Please take a Gopher Survey. We want to hear from you!
+OldURL: /getting-to-know-go-community
 
 Andrew Gerrand
 
diff --git a/content/company-questionnaire2018.article b/content/survey2018-company.article
similarity index 97%
rename from content/company-questionnaire2018.article
rename to content/survey2018-company.article
index 0ae3118..aa9acbe 100644
--- a/content/company-questionnaire2018.article
+++ b/content/survey2018-company.article
@@ -2,6 +2,7 @@
 4 Oct 2018
 Tags: survey, community
 Summary: Please take the 2018 Go Company Questionnaire.
+OldURL: /company-questionnaire2018
 
 Ran Tao, Steve Francia
 spf@golang.org
diff --git a/content/two-go-talks-lexical-scanning-in-go-and.article b/content/sydney-gtug.article
similarity index 96%
rename from content/two-go-talks-lexical-scanning-in-go-and.article
rename to content/sydney-gtug.article
index 5e5b731..486c5e6 100644
--- a/content/two-go-talks-lexical-scanning-in-go-and.article
+++ b/content/sydney-gtug.article
@@ -2,6 +2,7 @@
 1 Sep 2011
 Tags: appengine, lexer, talk, video
 Summary: Two talks about Go from the Sydney GTUG: Rob Pike explains lexical scanning, and Andrew Gerrand builds a simple real-time chat using App Engine. 
+OldURL: /two-go-talks-lexical-scanning-in-go-and
 
 Andrew Gerrand
 
diff --git a/content/learn-go-from-your-browser.article b/content/tour.article
similarity index 95%
rename from content/learn-go-from-your-browser.article
rename to content/tour.article
index 1d1576f..a57725e 100644
--- a/content/learn-go-from-your-browser.article
+++ b/content/tour.article
@@ -2,6 +2,7 @@
 4 Oct 2011
 Tags: playground, tour
 Summary: Announcing the Go tour, https://tour.golang.org/.
+OldURL: /learn-go-from-your-browser
 
 Andrew Gerrand
 
diff --git a/content/from-zero-to-go-launching-on-google.article b/content/turkey-doodle.article
similarity index 97%
rename from content/from-zero-to-go-launching-on-google.article
rename to content/turkey-doodle.article
index 4db4444..8649279 100644
--- a/content/from-zero-to-go-launching-on-google.article
+++ b/content/turkey-doodle.article
@@ -2,6 +2,7 @@
 13 Dec 2011
 Tags: appengine, google, guest
 Summary: How Go helped launch the Google Doodle for Thanksgiving 2011.
+OldURL: /from-zero-to-go-launching-on-google
 
 Reinaldo Aguiar
 
@@ -18,7 +19,7 @@
 This interactivity is implemented in the browser by a combination of JavaScript,
 CSS and of course HTML, creating turkeys on the fly.
 
-.image from-zero-to-go-launching-on-google_image00.png
+.image turkey-doodle/image00.png
 
 Once the user has created a personalized turkey it can be shared with friends
 and family by posting to Google+.
@@ -62,7 +63,7 @@
 
 The base for every doodle is the background:
 
-.image from-zero-to-go-launching-on-google_image01.jpg
+.image turkey-doodle/image01.jpg
 
 A valid request URL might look like this:
 `http://google-turkey.appspot.com/thumb/20332620][http://google-turkey.appspot.com/thumb/20332620`
@@ -71,7 +72,7 @@
 which choice to draw for each layout element,
 as illustrated by this image:
 
-.image from-zero-to-go-launching-on-google_image03.png
+.image turkey-doodle/image03.png
 
 The program's request handler parses the URL to determine which element
 is selected for each component,
@@ -232,7 +233,7 @@
 
 ## Performance
 
-.image from-zero-to-go-launching-on-google_image02.png
+.image turkey-doodle/image02.png
 
 This chart - taken directly from the App Engine dashboard - shows average
 request latency during launch.
diff --git a/content/from-zero-to-go-launching-on-google_image00.png b/content/turkey-doodle/image00.png
similarity index 100%
rename from content/from-zero-to-go-launching-on-google_image00.png
rename to content/turkey-doodle/image00.png
Binary files differ
diff --git a/content/from-zero-to-go-launching-on-google_image01.jpg b/content/turkey-doodle/image01.jpg
similarity index 100%
rename from content/from-zero-to-go-launching-on-google_image01.jpg
rename to content/turkey-doodle/image01.jpg
Binary files differ
diff --git a/content/from-zero-to-go-launching-on-google_image02.png b/content/turkey-doodle/image02.png
similarity index 100%
rename from content/from-zero-to-go-launching-on-google_image02.png
rename to content/turkey-doodle/image02.png
Binary files differ
diff --git a/content/from-zero-to-go-launching-on-google_image03.png b/content/turkey-doodle/image03.png
similarity index 100%
rename from content/from-zero-to-go-launching-on-google_image03.png
rename to content/turkey-doodle/image03.png
Binary files differ
diff --git a/content/concurrency-is-not-parallelism.article b/content/waza-talk.article
similarity index 96%
rename from content/concurrency-is-not-parallelism.article
rename to content/waza-talk.article
index 38bb9e7..5bf1895 100644
--- a/content/concurrency-is-not-parallelism.article
+++ b/content/waza-talk.article
@@ -2,6 +2,7 @@
 16 Jan 2013
 Tags: concurrency, talk, video
 Summary: Watch Rob Pike's talk, _Concurrency is not parallelism._
+OldURL: /concurrency-is-not-parallelism
 
 Andrew Gerrand