diff --git a/Formula/geocouch.rb b/Formula/geocouch.rb
new file mode 100644
index 0000000000..a92770b399
--- /dev/null
+++ b/Formula/geocouch.rb
@@ -0,0 +1,158 @@
+require 'formula'
+
+class Geocouch < Formula
+ homepage 'https://github.com/couchbase/geocouch'
+ head 'https://github.com/couchbase/geocouch.git', :tag => 'couchdb1.2.x'
+ url 'https://github.com/couchbase/geocouch/zipball/couchdb1.2.x'
+ md5 'af82d325bdf0a93d7a98bc650fc926b9'
+
+ devel do
+ url 'https://github.com/couchbase/geocouch.git', :tag => 'master'
+ version '1.3.x'
+ end
+
+ def couchdb_share
+ HOMEBREW_PREFIX/'share/couchdb'
+ end
+ def geocouch_share
+ HOMEBREW_PREFIX/'share/geocouch'
+ end
+
+ # Leverage generic couchdb.rb formula for couchdb (and therefore geocouch)
+ # dependencies.
+ depends_on 'couchdb'
+
+ # GeoCouch currently supports couch_version(s) 1.1.x and 1.2.x (other
+ # versions at your own risk). This formula supports GeoCouch 1.2.0 on top
+ # of Apache couchdb 1.2.0.
+ def install
+ # Grab couchdb 1.2.x.
+ couchdb_dir = buildpath/'couchdb-src'
+ couchdb = Formula.factory 'couchdb'
+ couchdb.brew { couchdb_dir.install Dir[ '*'] }
+ ENV[ 'COUCH_SRC'] = couchdb_dir/"src/couchdb"
+
+ # Build geocouch.
+ system "make"
+
+ # Install geocouch build files.
+ (share/'geocouch').mkpath
+ rm_rf share/'geocouch/build/'
+ (share/'geocouch').install Dir[ 'build']
+
+ # Install geocouch.plist for launchctl support.
+ (share/'geocouch').install Dir[ couchdb_dir/'etc/launchd/org.apache.couchdb.plist.tpl.in']
+ mv share/'geocouch/org.apache.couchdb.plist.tpl.in', share/'geocouch/geocouch.plist'
+ inreplace (share/'geocouch/geocouch.plist'), 'org.apache.couchdb', \
+ 'geocouch'
+ inreplace (share/'geocouch/geocouch.plist'), 'HOME', <<-EOS.lstrip.chop
+ ERL_FLAGS
+ -pa #{geocouch_share}/build
+ HOME
+ EOS
+ inreplace (share/'geocouch/geocouch.plist'), '%bindir%/%couchdb_command_name%', \
+ HOMEBREW_PREFIX/'bin/couchdb'
+ # Turn off RunAtLoad and KeepAlive (to simplify experience for first-timers).
+ inreplace (share/'geocouch/geocouch.plist'), '', \
+ ''
+ (share/'geocouch/geocouch.plist').chmod 0644
+
+ # Install geocouch.ini into couchdb.
+ (etc/'couchdb/default.d').install Dir[ 'etc/couchdb/default.d/geocouch.ini']
+
+ # Install tests into couchdb.
+ test_files = Dir[ 'share/www/script/test/*.js']
+ # Normal recipe "should" read:
+ # (share/'couchdb/www/script/test/').install test_files
+ # which would symlink geocouch tests into the couchdb share. But couchdb
+ # seems to sandbox its web-readable files to the share/couchdb/www branch,
+ # and symlinks outside of that folder seem to violate couchdb's
+ # requirements. Consequently, we have to install geocouch tests directly
+ # inside the share/couchdb/www branch and not symlink them from the
+ # geocouch share branch (i.e., outside the couchdb sandbox). So for
+ # clarity sake, install/partition all the geocouch tests together into a
+ # tidy subfolder, and symlink them into place in the normal couchdb tests
+ # folder.
+ rm_rf (couchdb_share/'www/script/test/geocouch')
+ (couchdb_share/'www/script/test/geocouch').mkpath
+ (couchdb_share/'www/script/test/geocouch').install test_files
+ Dir[ (couchdb_share/'www/script/test/geocouch/*.js')].each \
+ { |geotest| system "cd #{couchdb_share/'www/script/test'}; ln -s geocouch/#{File.basename( geotest)} ."}
+ # Complete the install by referencing the geocouch tests in couch_tests.js
+ # (which runs the tests).
+ test_lines = test_files.map { |testline| testline.gsub(/^.*\/(.*)$/, 'loadTest("\1");' + "\n") }
+ system "(echo; echo '//REPLACE_ME') >> '#{couchdb_share}/www/script/couch_tests.js'"
+ inreplace (couchdb_share/'www/script/couch_tests.js'), /^\/\/REPLACE_ME$/, \
+ "// GeoCouch Tests...\n#{test_lines}// ...GeoCouch Tests\n"
+ end
+
+ def test
+ puts <<-EOS.undent
+ To test geocouch, start `couchdb` (with appropriate geocouch ERL_FLAGS)
+ in a terminal and then:
+
+ curl http://127.0.0.1:5984/
+
+ The reply should look like:
+
+ {"couchdb":"Welcome","version":"1.2.0"}
+
+ For more thorough testing, use your browser to visit:
+
+ http://127.0.0.1:5984/_utils/couch_tests.html?script/couch_tests.js
+
+ and press the "Run All" button.
+ EOS
+ end
+
+ def caveats; <<-EOS.undent
+ FYI: geocouch installs as an extension of couchdb, so couchdb effectively
+ becomes geocouch. However, you can use couchdb normally (using geocouch
+ extensions optionally). NB: one exception: the couchdb test suite now
+ includes several geocouch tests.
+
+ To start geocouch manually and verify any geocouch version information (-V),
+
+ ERL_FLAGS="-pa #{geocouch_share}/build" couchdb -V
+
+ For general convenience, export your ERL_FLAGS (erlang flags, above) in
+ your login shell, and then start geocouch:
+
+ export ERL_FLAGS="-pa #{geocouch_share}/build"
+ couchdb
+
+ Alternately, prepare launchctl to start/stop geocouch as follows:
+
+ /bin/cp #{geocouch_share}/geocouch.plist ~/Library/LaunchAgents
+ chmod 0644 ~/Library/LaunchAgents/geocouch.plist
+
+ launchctl load ~/Library/LaunchAgents/geocouch.plist
+
+ Then start, check status of, and stop geocouch with the following three
+ commands.
+
+ launchctl start geocouch
+ launchctl list geocouch
+ launchctl stop geocouch
+
+ Finally, access, test, and configure your new geocouch with:
+
+ http://127.0.0.1:5984
+ http://127.0.0.1:5984/_utils/couch_tests.html?script/couch_tests.js
+ http://127.0.0.1:5984/_utils
+
+ And... relax.
+
+ -=-
+
+ One last thing: to uninstall geocouch from your couchdb installation:
+
+ /bin/rm /usr/local/etc/couchdb/default.d/geocouch.ini
+ unset ERL_FLAGS
+ brew uninstall geocouch couchdb; brew install couchdb
+
+ and restart your couchdb. (To see the uninstall instructions again, just
+ run 'brew info geocouch'.)
+ EOS
+ end
+end