I've been thinking of what to do with Eventframe, which has been in stasis for a few months, and whether we should adopt something like Docpad as a foundation. Here is the conundrum:
Websites are collaborative effort. Pretty much every website we build has two or more people working on it. But how do the collaborators collaborate?
Let's look at what typically gets used in our workflow:
1. Dropbox (and equivalent tools like Box, Google Drive, Skydrive). Dropbox is a great place to share files and get everyone an updated copy instantly. Dropbox works well for code repositories too -- I use it to work on the same code across multiple machines.
But Dropbox has the granularity of a single file. Two people cannot work on the same file at the same time or they will clobber each other's changes. This is typically not a problem with source code when people are handling different files at one time, but it's a disaster for something like a spreadsheet which is one large file containing everything. This is why we use Google Docs.
2. Google Docs. Great for documents and spreadsheets that multiple people can edit at once, but it can't handle all kinds of files. We can't store HTML templates or source code in it. Etherpad is similar and open source, allowing for a custom installation, but only supports editing text.
3. Git (and GitHub). Great workflow for ensuring the integrity of your commit, but terrible for showing work-in-progress or collaborating on an edit. Two people can't edit a document together. If you want feedback from someone, you have to commit and push. Git's learning curve is steep. This is true for other version control systems too -- Mercurial, Bazaar, and even the simpler Subversion.
As you can see, every one of them works for some situations but not for the others. With Eventframe, I attempted to use two different systems, picking up the strengths of each:
1. All HTML and CSS is stored in a Git repo and committed to GitHub.
2. All content is stored in Eventframe's database, which supports multiple node types and isn't limited to a choice of two (like Google Docs with documents and spreadsheets). Content documents are versioned so multiple people can edit them.
The problem with this approach is that #1 and #2 clash. The templates in #1 need to know about the content in #2 to include it in the page, but the content in #2 needs to specify a template from #1 to render with (this is the "template" field when you edit a node).
Because #1 and #2 are inter-dependent, you have to update both at the same time for your copy to work. But #1 is updated by pulling from a Git repo, while #2 is updated by sharing JSON files, which are currently emailed between the collaborators or exported from a central installation.
A good tech architecture is layered, with each layer being aware of the layer that's below it, but having no expectations of the layer above it.
Your computer hardware shouldn't care what operating system you use, while your OS can be particular about what hardware it has drivers for. OSes in turn shouldn't make assumptions about what applications you want to use, while apps can be very OS-dependent.
Similarly in this case, we ideally have a three-layer architecture: Eventframe itself at the foundation, templates next, and content on top.
I've been trying to get templates and content unentangled, so that templates can be edited with no dependence on content, making this similar to how Wordpress themes work -- the person who made the theme does not know anything about your blog or what you will write in it, but they can make and distribute a theme anyway. However, as it turns out, our development cycle requires a close connection between templates and content. We have so far been unable to develop templates ahead of content, and our design partners have even insisted that their layer is on top, asking for content to be produced first.
So I've been considering two compromises, both of which sound wrong to me:
1. Templates move into the database and are managed alongside content in Eventframe, or
2. Content moves into the filesystem and is managed with Git or a traditional workflow (the Docpad approach).
The #2 approach here has become very popular of late thanks to static site generators and the like, but I find it discomforting. Imagine if you had a blog where, to make a new post, instead of logging into the website, you first had to install a lot of complicated software, write a file, save it to the correct place, run some generator, run a server to confirm you did it correctly, commit everything to Git, then SSH to the server and checkout?
Sounds complicated? Now imagine if this is how it worked when a user interacted with the website, to do something like posting a comment or RSVPing for an event, if behind the scenes all this had to be written to the filesystem. Filesystems are great, but databases exist for a good reason.
I don't have a good answer for how to take this forward, which is why I'd like your inputs on this.
Kiran