2007: I "single-paged" subsections of my application, with different PHP scripts on the backend.
2008: Consolidated the backend into a single API.
2009: Switched the backend to Rails for ORM functionality, and finished upgrading the client interface to a single page application.
2009: Switched the backend to Javascript (Rhino) to enable sharing of model validations and other code (even native object extensions) with the client.
2009: Got my application working completely offline using a local SQL database and replication manager, together with ApplicationCache. At first I used LocalStorage but soon hit storage and performance limits.
2009: Switched from Rhino to NodeJS. Much faster, cleaner APIs. Huge performance gains from V8 and non-blocking IO.
2010: Results of the above up at: https://szpil.com
Along the way I built up a framework for managing concatenation, client-side navigation, sessions, views, controllers, email etc. One significant advantage of building client-side only apps that replicate with the server is that they work offline by definition. Managing state on the client opens up incredible opportunities.