{
  "attachments": [],
  "comments_archived": true,
  "date": "2010-07-05T23:00:56.000Z",
  "layout": "post",
  "tags": [
    "webdev",
    "firefox",
    "google",
    "python",
    "entries",
    "mozilla",
    "sync",
    "appengine"
  ],
  "title": "Firefox Sync server on Google App Engine",
  "wordpress_id": 1937,
  "wordpress_slug": "firefox-sync-server-on-google-app-engine",
  "wordpress_url": "http://decafbad.com/blog/?p=1937",
  "year": "2010",
  "month": "07",
  "day": "05",
  "isDir": true,
  "slug": "firefox-sync-server-on-google-app-engine",
  "type": "entry",
  "postName": "2010-07-05-firefox-sync-server-on-google-app-engine",
  "html": "<p><em><strong>TL;DR:</strong> <a href=\"http://github.com/lmorchard/firefox-sync-appengine\">I built an implementation</a> of the <a href=\"https://wiki.mozilla.org/Labs/Weave/Sync/1.0/API\">Firefox Sync server API</a> for <a href=\"http://appengine.google.com/\">Google App Engine</a>.</em></p>\n<p><a href=\"http://www.mozilla.com/en-US/firefox/sync/\" style=\"float: right; padding: 0 0 0em 0em; display: block; text-decoration: none; border: none\"><img src=\"http://mozcom-cdn.mozilla.net/img/firefox/sync/sync-background.png\" style=\"border: none\" width=\"\" height=\"\"></a></p>\n<p>To celebrate <a href=\"http://en.wikipedia.org/wiki/Independence_Day_%28United_States%29\">Independence Day</a>, I figured I might take a shot at liberating <a href=\"http://www.mozilla.com/en-US/firefox/sync/\">Firefox Sync</a> from the tyranny of <a href=\"https://services.mozilla.com/\">Mozilla's servers</a>. </p>\n<p>Thus, over the past few days, I've <a href=\"http://github.com/lmorchard/firefox-sync-appengine\">built a sync server</a> using the <a href=\"https://wiki.mozilla.org/Labs/Weave/Sync/1.0/API\">1.0 Sync API</a>, hosted on <a href=\"http://appengine.google.com/\">Google App Engine</a>.</p>\n<p>I lied about the <em>tyranny</em> thing, though—I just wanted to say something clever about the holiday. In reality, with respect to <a href=\"http://www.mozilla.com/en-US/firefox/sync/\">Firefox Sync</a>, Mozilla has done all of the following:</p>\n<ol>\n<li>Published <a href=\"https://wiki.mozilla.org/Labs/Weave/Sync/1.0/API\">the Sync API spec</a>;</li>\n<li>Released <a href=\"http://hg.mozilla.org/services/sync-server/\">the source code for the server used in-house</a>;</li>\n<li>Explicitly included the option to use a custom server when setting up sync in the browser.</li>\n</ol>\n<p>This means that, although Mozilla offers servers to go along with <a href=\"http://www.mozilla.com/en-US/firefox/sync/\">Firefox Sync</a>, you're totally free to take your data elsewhere. Since your sync data is encrypted and practically opaque to the server, there's no direct profit for Mozilla in offering free sync hosting—not even through any clandestine data mining for devious purposes. It's just that sync makes Firefox a better browser, and <em>somebody</em> has to run some servers to make it work.</p>\n<p>So, there's every incentive to make it easy for you to switch sync providers and <em>stop freeloading</em> on Mozilla's servers. Building a server on <a href=\"http://appengine.google.com/\">Google App Engine</a> means I can freeload on <em>Google's</em> servers!</p>\n<p>I kid, of course. No one's really complaining about freeloaders, and App Engine has quotas in place to head off any serious mooching—which is why I'm not telling you where to find <em>my</em> sync server deployed on Google App Engine, by the way. </p>\n<p>No, I did this because:</p>\n<ul>\n<li>Firefox Sync and Google App Engine are interesting and important technologies;</li>\n<li>I've already done a bit of work on the PHP-based Firefox Sync server at Mozilla;</li>\n<li>I really wanted to take a break from PHP and spend some time with my old friend Python.</li>\n</ul>\n<p>There are, of course, a number of bugs in this server. But, it seems to be working between a number of machines and browser profiles I have at home. Things are really in need of optimization, it suffers from my inexperience with App Engine, and I keep running into those aforementioned App Engine resource limits—especially when updating or deleting large numbers of items (ie. 1000's to 10000's of items).</p>\n<p><a href=\"http://github.com/lmorchard/firefox-sync-appengine\"><em>Pull requests and issue reports on GitHub are welcome!</em></a></p>\n<p>A next step I'd like to take with this thing is to revisit another old friend, the <a href=\"http://www.decafbad.com/twiki/bin/view/Main/DesktopWebAppServer\">desktop web app server</a>. (Also known as the <a href=\"http://www.scripting.com/davenet/2001/01/04/desktopWebsites.html#4\">desktop website</a>.) It seems to me that it would be interesting to scale this server down to a household appliance—say, just for use by my wife and I.</p>\n<p>I'd be especially happy if the work I'm doing for a Google-hosted app could be self-hosted at home. Seeing as the development environment for App Engine runs on my laptop, I'm willing to bet I can hack the whole shebang into a simple, special-purpose app to download and double-click on a home desktop PC for use as your sync hub.</p>\n<p>Anyway, <a href=\"http://github.com/lmorchard/firefox-sync-appengine\">check it out</a> and let me know what you think.</p>\n<div id=\"comments\" class=\"comments archived-comments\"><h3>Archived Comments</h3>\n<ul class=\"comments\">\n<li class=\"comment\" id=\"comment-221088097\">\n<div class=\"meta\">\n<div class=\"author\">\n<a class=\"avatar image\" rel=\"nofollow\" href=\"http://coffeeonthekeyboard.com/\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=8371744716a9335eb3dcae228fd9d996&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\" width=\"\" height=\"\"></a>\n<a class=\"avatar name\" rel=\"nofollow\" href=\"http://coffeeonthekeyboard.com/\">James Socol</a>\n</div>\n\n\n<p><a href=\"#comment-221088097\" class=\"permalink\"><time datetime=\"2010-07-06T01:28:02\">2010-07-06T01:28:02</time></a></p>\n</div>\n\n\n<div class=\"content\"><p>Assuming you already had a network and a Mac Mini or something at home, it would be pretty interesting to run your own small Sync server just to keep your home computers together. Maybe even use localtunnel for when you're away.</p></div>\n\n\n</li>\n<li class=\"comment\" id=\"comment-221088102\">\n<div class=\"meta\">\n<div class=\"author\">\n<a class=\"avatar image\" rel=\"nofollow\" href=\"http://morgamic.com/\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=65b020128dafcdb4ef1e5e53c00ed37a&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\" width=\"\" height=\"\"></a>\n<a class=\"avatar name\" rel=\"nofollow\" href=\"http://morgamic.com/\">Mike</a>\n</div>\n\n\n<p><a href=\"#comment-221088102\" class=\"permalink\"><time datetime=\"2010-07-06T01:36:37\">2010-07-06T01:36:37</time></a></p>\n</div>\n\n\n<div class=\"content\"><p>You are a real-life hero!</p></div>\n\n\n</li>\n<li class=\"comment\" id=\"comment-221088105\">\n<div class=\"meta\">\n<div class=\"author\">\n<a class=\"avatar image\" rel=\"nofollow\" href=\"http://www.decafbad.com\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\" width=\"\" height=\"\"></a>\n<a class=\"avatar name\" rel=\"nofollow\" href=\"http://www.decafbad.com\">l.m.orchard</a>\n</div>\n\n\n<p><a href=\"#comment-221088105\" class=\"permalink\"><time datetime=\"2010-07-06T01:52:00\">2010-07-06T01:52:00</time></a></p>\n</div>\n\n\n<div class=\"content\"><p>@James: Yup, exactly that. Maybe even roll in some SSL and UPnP port forwarding for easier setup behind a home router. And, if there were a Windows version, it could run on that cruddy desktop back in the spare room.</p>\n<p>@Mike: Naw... this guy is the real hero, <a href=\"http://twitter.com/johnolilly/status/17765272082\" rel=\"nofollow\">even John Lilly agrees</a>!</p>\n<p><a href=\"http://blogs.denverpost.com/celebritybull/2008/09/09/greatest-american-hero-coming-to-the-big-screen/\" rel=\"nofollow\"><img src=\"http://blogs.denverpost.com/celebritybull/files/2008/09/gah.jpg\" alt=\"Greatest American Hero\" title=\"\" width=\"\" height=\"\"></a></p></div>\n\n\n</li>\n<li class=\"comment\" id=\"comment-221088106\">\n<div class=\"meta\">\n<div class=\"author\">\n<a class=\"avatar image\" rel=\"nofollow\" href=\"\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=1d18681d9fa9b5d50b209a2a926dfe7d&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\" width=\"\" height=\"\"></a>\n<a class=\"avatar name\" rel=\"nofollow\" href=\"\">Crash</a>\n</div>\n\n\n<p><a href=\"#comment-221088106\" class=\"permalink\"><time datetime=\"2010-07-06T09:20:54\">2010-07-06T09:20:54</time></a></p>\n</div>\n\n\n<div class=\"content\"><p>Is there already a App Id for this tool?</p></div>\n\n\n</li>\n<li class=\"comment\" id=\"comment-221088107\">\n<div class=\"meta\">\n<div class=\"author\">\n<a class=\"avatar image\" rel=\"nofollow\" href=\"http://www.decafbad.com\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\" width=\"\" height=\"\"></a>\n<a class=\"avatar name\" rel=\"nofollow\" href=\"http://www.decafbad.com\">l.m.orchard</a>\n</div>\n\n\n<p><a href=\"#comment-221088107\" class=\"permalink\"><time datetime=\"2010-07-06T10:18:57\">2010-07-06T10:18:57</time></a></p>\n</div>\n\n\n<div class=\"content\"><p>@Crash: Sure, there's an app ID for <em>my</em> instance of this sync server. But, as I said in the blog post, I'm not sharing it. At least, not until or unless I get the quota usage down to a point that I wouldn't exhaust the free hosting limits.</p>\n<p>It's pretty easy to deploy your own sync server on AppEngine with the source, though.</p></div>\n\n\n</li>\n<li class=\"comment\" id=\"comment-221088108\">\n<div class=\"meta\">\n<div class=\"author\">\n<a class=\"avatar image\" rel=\"nofollow\" href=\"\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=85283c3d40ca2b1a70a0f877a570107c&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\" width=\"\" height=\"\"></a>\n<a class=\"avatar name\" rel=\"nofollow\" href=\"\">Peter Petrov</a>\n</div>\n\n\n<p><a href=\"#comment-221088108\" class=\"permalink\"><time datetime=\"2010-07-06T13:18:11\">2010-07-06T13:18:11</time></a></p>\n</div>\n\n\n<div class=\"content\"><p>@Leslie: The app ID of your instance is visible in app.yaml, so you've shared it anyway :)</p></div>\n\n\n</li>\n<li class=\"comment\" id=\"comment-221088113\">\n<div class=\"meta\">\n<div class=\"author\">\n<a class=\"avatar image\" rel=\"nofollow\" href=\"http://www.decafbad.com\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\" width=\"\" height=\"\"></a>\n<a class=\"avatar name\" rel=\"nofollow\" href=\"http://www.decafbad.com\">l.m.orchard</a>\n</div>\n\n\n<p><a href=\"#comment-221088113\" class=\"permalink\"><time datetime=\"2010-07-06T17:18:47\">2010-07-06T17:18:47</time></a></p>\n</div>\n\n\n<div class=\"content\"><p>@Peter hah! Right you are! But, at least you had to look at the source of the app first to figure that out :) That is mostly the point of this blog entry after all. Anyone who does that and then uses my installation anyway will probably be sad when I regularly blow away data and eventually make it invite only</p></div>\n\n\n</li>\n<li class=\"comment\" id=\"comment-221088115\">\n<div class=\"meta\">\n<div class=\"author\">\n<a class=\"avatar image\" rel=\"nofollow\" href=\"\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=4fd1acfa0c7bd0767a90a30fbba73bfb&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\" width=\"\" height=\"\"></a>\n<a class=\"avatar name\" rel=\"nofollow\" href=\"\">Tobias</a>\n</div>\n\n\n<p><a href=\"#comment-221088115\" class=\"permalink\"><time datetime=\"2010-07-07T00:24:41\">2010-07-07T00:24:41</time></a></p>\n</div>\n\n\n<div class=\"content\"><p>Neat! TyphoonAE http://typhoonae.googlecode.com might help you to build your household appliance.</p></div>\n\n\n</li>\n<li class=\"comment\" id=\"comment-221088117\">\n<div class=\"meta\">\n<div class=\"author\">\n<a class=\"avatar image\" rel=\"nofollow\" href=\"\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=3e7e975f0fa432f4ae6604f72c132309&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\" width=\"\" height=\"\"></a>\n<a class=\"avatar name\" rel=\"nofollow\" href=\"\">Kumar McMillan</a>\n</div>\n\n\n<p><a href=\"#comment-221088117\" class=\"permalink\"><time datetime=\"2010-07-07T20:59:25\">2010-07-07T20:59:25</time></a></p>\n</div>\n\n\n<div class=\"content\"><p>Hey Les, this is super cool!  Google App Engine's Datastore API is still very shaky though.  In fact, it's been so bad lately that I've been considering porting one of my heavily used apps over to something else.  Thankfully, this post suggests that fixing the Datastore is their top priority: http://googleappengine.blogspot.com/2010/06/datastore-performance-growing-pains.html</p></div>\n\n\n</li>\n<li class=\"comment\" id=\"comment-221088119\">\n<div class=\"meta\">\n<div class=\"author\">\n<a class=\"avatar image\" rel=\"nofollow\" href=\"http://home.kairo.at/blog/\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=59d914ad47e5c3fcd4c89668adcd43a2&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\" width=\"\" height=\"\"></a>\n<a class=\"avatar name\" rel=\"nofollow\" href=\"http://home.kairo.at/blog/\">Robert Kaiser</a>\n</div>\n\n\n<p><a href=\"#comment-221088119\" class=\"permalink\"><time datetime=\"2010-07-07T21:21:51\">2010-07-07T21:21:51</time></a></p>\n</div>\n\n\n<div class=\"content\"><p>Well, I actually feel more comfortable with my data being on Mozilla servers than on Google servers - even with the decreased trust I have in the Mozilla organization, I'd trust it more than Google any day! ;-)</p></div>\n\n\n</li>\n<li class=\"comment\" id=\"comment-221088120\">\n<div class=\"meta\">\n<div class=\"author\">\n<a class=\"avatar image\" rel=\"nofollow\" href=\"http://blog.chrisarndt.de\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=02653ae22d36044e6870c17cf3d5a005&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\" width=\"\" height=\"\"></a>\n<a class=\"avatar name\" rel=\"nofollow\" href=\"http://blog.chrisarndt.de\">Chris Arndt</a>\n</div>\n\n\n<p><a href=\"#comment-221088120\" class=\"permalink\"><time datetime=\"2010-09-28T11:06:55\">2010-09-28T11:06:55</time></a></p>\n</div>\n\n\n<div class=\"content\"><p>Instead of porting GAE to your desktop, why don't you just port your app to plain Django? Django should run off your desktop with no problems.</p></div>\n\n\n</li>\n</ul>\n\n\n</div>\n\n\n",
  "body": "<em><strong>TL;DR:</strong> [I built an implementation][impl] of the [Firefox Sync server API][api10] for [Google App Engine][appengine].</em>\r\n\r\n[impl]: http://github.com/lmorchard/firefox-sync-appengine\r\n[api10]: https://wiki.mozilla.org/Labs/Weave/Sync/1.0/API\r\n[appengine]: http://appengine.google.com/\r\n\r\n<a href=\"http://www.mozilla.com/en-US/firefox/sync/\" style=\"float: right; padding: 0 0 0em 0em; display: block; text-decoration: none; border: none\"><img src=\"http://mozcom-cdn.mozilla.net/img/firefox/sync/sync-background.png\" style=\"border: none\" /></a>\r\n\r\nTo celebrate [Independence Day][july4], I figured I might take a shot at liberating [Firefox Sync][sync] from the tyranny of [Mozilla's servers][servers]. \r\n\r\nThus, over the past few days, I've [built a sync server][impl] using the [1.0 Sync API][api10], hosted on [Google App Engine][appengine].\r\n\r\nI lied about the *tyranny* thing, though—I just wanted to say something clever about the holiday. In reality, with respect to [Firefox Sync][sync], Mozilla has done all of the following:\r\n\r\n1. Published [the Sync API spec][api10];\r\n2. Released [the source code for the server used in-house][sync-server];\r\n3. Explicitly included the option to use a custom server when setting up sync in the browser.\r\n\r\nThis means that, although Mozilla offers servers to go along with [Firefox Sync][sync], you're totally free to take your data elsewhere. Since your sync data is encrypted and practically opaque to the server, there's no direct profit for Mozilla in offering free sync hosting—not even through any clandestine data mining for devious purposes. It's just that sync makes Firefox a better browser, and *somebody* has to run some servers to make it work.\r\n\r\nSo, there's every incentive to make it easy for you to switch sync providers and *stop freeloading* on Mozilla's servers. Building a server on [Google App Engine][appengine] means I can freeload on *Google's* servers!\r\n\r\nI kid, of course. No one's really complaining about freeloaders, and App Engine has quotas in place to head off any serious mooching—which is why I'm not telling you where to find *my* sync server deployed on Google App Engine, by the way. \r\n\r\nNo, I did this because:\r\n\r\n* Firefox Sync and Google App Engine are interesting and important technologies;\r\n* I've already done a bit of work on the PHP-based Firefox Sync server at Mozilla;\r\n* I really wanted to take a break from PHP and spend some time with my old friend Python.\r\n\r\nThere are, of course, a number of bugs in this server. But, it seems to be working between a number of machines and browser profiles I have at home. Things are really in need of optimization, it suffers from my inexperience with App Engine, and I keep running into those aforementioned App Engine resource limits—especially when updating or deleting large numbers of items (ie. 1000's to 10000's of items).\r\n\r\n[*Pull requests and issue reports on GitHub are welcome!*][impl]\r\n\r\nA next step I'd like to take with this thing is to revisit another old friend, the [desktop web app server][desktopserver]. (Also known as the [desktop website][dw].) It seems to me that it would be interesting to scale this server down to a household appliance—say, just for use by my wife and I.\r\n\r\nI'd be especially happy if the work I'm doing for a Google-hosted app could be self-hosted at home. Seeing as the development environment for App Engine runs on my laptop, I'm willing to bet I can hack the whole shebang into a simple, special-purpose app to download and double-click on a home desktop PC for use as your sync hub.\r\n\r\nAnyway, [check it out][impl] and let me know what you think.\r\n\r\n[dw]: http://www.scripting.com/davenet/2001/01/04/desktopWebsites.html#4\r\n[dave]: http://www.scripting.com/davenet/1997/09/14/FractionalHorsepowerHTTPSe.html\r\n[desktopserver]: http://www.decafbad.com/twiki/bin/view/Main/DesktopWebAppServer\r\n[sync-server]: http://hg.mozilla.org/services/sync-server/\r\n[july4]: http://en.wikipedia.org/wiki/Independence_Day_%28United_States%29\r\n[sync]: http://www.mozilla.com/en-US/firefox/sync/\r\n[servers]: https://services.mozilla.com/\r\n\r\n<div id=\"comments\" class=\"comments archived-comments\">\r\n            <h3>Archived Comments</h3>\r\n            \r\n        <ul class=\"comments\">\r\n            \r\n        <li class=\"comment\" id=\"comment-221088097\">\r\n            <div class=\"meta\">\r\n                <div class=\"author\">\r\n                    <a class=\"avatar image\" rel=\"nofollow\" \r\n                       href=\"http://coffeeonthekeyboard.com/\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=8371744716a9335eb3dcae228fd9d996&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\"/></a>\r\n                    <a class=\"avatar name\" rel=\"nofollow\" \r\n                       href=\"http://coffeeonthekeyboard.com/\">James Socol</a>\r\n                </div>\r\n                <a href=\"#comment-221088097\" class=\"permalink\"><time datetime=\"2010-07-06T01:28:02\">2010-07-06T01:28:02</time></a>\r\n            </div>\r\n            <div class=\"content\"><p>Assuming you already had a network and a Mac Mini or something at home, it would be pretty interesting to run your own small Sync server just to keep your home computers together. Maybe even use localtunnel for when you're away.</p></div>\r\n            \r\n        </li>\r\n    \r\n        <li class=\"comment\" id=\"comment-221088102\">\r\n            <div class=\"meta\">\r\n                <div class=\"author\">\r\n                    <a class=\"avatar image\" rel=\"nofollow\" \r\n                       href=\"http://morgamic.com/\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=65b020128dafcdb4ef1e5e53c00ed37a&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\"/></a>\r\n                    <a class=\"avatar name\" rel=\"nofollow\" \r\n                       href=\"http://morgamic.com/\">Mike</a>\r\n                </div>\r\n                <a href=\"#comment-221088102\" class=\"permalink\"><time datetime=\"2010-07-06T01:36:37\">2010-07-06T01:36:37</time></a>\r\n            </div>\r\n            <div class=\"content\"><p>You are a real-life hero!</p></div>\r\n            \r\n        </li>\r\n    \r\n        <li class=\"comment\" id=\"comment-221088105\">\r\n            <div class=\"meta\">\r\n                <div class=\"author\">\r\n                    <a class=\"avatar image\" rel=\"nofollow\" \r\n                       href=\"http://www.decafbad.com\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\"/></a>\r\n                    <a class=\"avatar name\" rel=\"nofollow\" \r\n                       href=\"http://www.decafbad.com\">l.m.orchard</a>\r\n                </div>\r\n                <a href=\"#comment-221088105\" class=\"permalink\"><time datetime=\"2010-07-06T01:52:00\">2010-07-06T01:52:00</time></a>\r\n            </div>\r\n            <div class=\"content\"><p>@James: Yup, exactly that. Maybe even roll in some SSL and UPnP port forwarding for easier setup behind a home router. And, if there were a Windows version, it could run on that cruddy desktop back in the spare room.</p>\r\n\r\n<p>@Mike: Naw... this guy is the real hero, <a href=\"http://twitter.com/johnolilly/status/17765272082\" rel=\"nofollow\">even John Lilly agrees</a>!</p>\r\n\r\n<p><a href=\"http://blogs.denverpost.com/celebritybull/2008/09/09/greatest-american-hero-coming-to-the-big-screen/\" rel=\"nofollow\"><img src=\"http://blogs.denverpost.com/celebritybull/files/2008/09/gah.jpg\" alt=\"Greatest American Hero\" title=\"\" /></a></p></div>\r\n            \r\n        </li>\r\n    \r\n        <li class=\"comment\" id=\"comment-221088106\">\r\n            <div class=\"meta\">\r\n                <div class=\"author\">\r\n                    <a class=\"avatar image\" rel=\"nofollow\" \r\n                       href=\"\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=1d18681d9fa9b5d50b209a2a926dfe7d&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\"/></a>\r\n                    <a class=\"avatar name\" rel=\"nofollow\" \r\n                       href=\"\">Crash</a>\r\n                </div>\r\n                <a href=\"#comment-221088106\" class=\"permalink\"><time datetime=\"2010-07-06T09:20:54\">2010-07-06T09:20:54</time></a>\r\n            </div>\r\n            <div class=\"content\"><p>Is there already a App Id for this tool?</p></div>\r\n            \r\n        </li>\r\n    \r\n        <li class=\"comment\" id=\"comment-221088107\">\r\n            <div class=\"meta\">\r\n                <div class=\"author\">\r\n                    <a class=\"avatar image\" rel=\"nofollow\" \r\n                       href=\"http://www.decafbad.com\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\"/></a>\r\n                    <a class=\"avatar name\" rel=\"nofollow\" \r\n                       href=\"http://www.decafbad.com\">l.m.orchard</a>\r\n                </div>\r\n                <a href=\"#comment-221088107\" class=\"permalink\"><time datetime=\"2010-07-06T10:18:57\">2010-07-06T10:18:57</time></a>\r\n            </div>\r\n            <div class=\"content\"><p>@Crash: Sure, there's an app ID for <em>my</em> instance of this sync server. But, as I said in the blog post, I'm not sharing it. At least, not until or unless I get the quota usage down to a point that I wouldn't exhaust the free hosting limits.</p>\r\n\r\n<p>It's pretty easy to deploy your own sync server on AppEngine with the source, though.</p></div>\r\n            \r\n        </li>\r\n    \r\n        <li class=\"comment\" id=\"comment-221088108\">\r\n            <div class=\"meta\">\r\n                <div class=\"author\">\r\n                    <a class=\"avatar image\" rel=\"nofollow\" \r\n                       href=\"\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=85283c3d40ca2b1a70a0f877a570107c&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\"/></a>\r\n                    <a class=\"avatar name\" rel=\"nofollow\" \r\n                       href=\"\">Peter Petrov</a>\r\n                </div>\r\n                <a href=\"#comment-221088108\" class=\"permalink\"><time datetime=\"2010-07-06T13:18:11\">2010-07-06T13:18:11</time></a>\r\n            </div>\r\n            <div class=\"content\"><p>@Leslie: The app ID of your instance is visible in app.yaml, so you've shared it anyway :)</p></div>\r\n            \r\n        </li>\r\n    \r\n        <li class=\"comment\" id=\"comment-221088113\">\r\n            <div class=\"meta\">\r\n                <div class=\"author\">\r\n                    <a class=\"avatar image\" rel=\"nofollow\" \r\n                       href=\"http://www.decafbad.com\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\"/></a>\r\n                    <a class=\"avatar name\" rel=\"nofollow\" \r\n                       href=\"http://www.decafbad.com\">l.m.orchard</a>\r\n                </div>\r\n                <a href=\"#comment-221088113\" class=\"permalink\"><time datetime=\"2010-07-06T17:18:47\">2010-07-06T17:18:47</time></a>\r\n            </div>\r\n            <div class=\"content\"><p>@Peter hah! Right you are! But, at least you had to look at the source of the app first to figure that out :) That is mostly the point of this blog entry after all. Anyone who does that and then uses my installation anyway will probably be sad when I regularly blow away data and eventually make it invite only</p></div>\r\n            \r\n        </li>\r\n    \r\n        <li class=\"comment\" id=\"comment-221088115\">\r\n            <div class=\"meta\">\r\n                <div class=\"author\">\r\n                    <a class=\"avatar image\" rel=\"nofollow\" \r\n                       href=\"\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=4fd1acfa0c7bd0767a90a30fbba73bfb&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\"/></a>\r\n                    <a class=\"avatar name\" rel=\"nofollow\" \r\n                       href=\"\">Tobias</a>\r\n                </div>\r\n                <a href=\"#comment-221088115\" class=\"permalink\"><time datetime=\"2010-07-07T00:24:41\">2010-07-07T00:24:41</time></a>\r\n            </div>\r\n            <div class=\"content\"><p>Neat! TyphoonAE http://typhoonae.googlecode.com might help you to build your household appliance.</p></div>\r\n            \r\n        </li>\r\n    \r\n        <li class=\"comment\" id=\"comment-221088117\">\r\n            <div class=\"meta\">\r\n                <div class=\"author\">\r\n                    <a class=\"avatar image\" rel=\"nofollow\" \r\n                       href=\"\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=3e7e975f0fa432f4ae6604f72c132309&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\"/></a>\r\n                    <a class=\"avatar name\" rel=\"nofollow\" \r\n                       href=\"\">Kumar McMillan</a>\r\n                </div>\r\n                <a href=\"#comment-221088117\" class=\"permalink\"><time datetime=\"2010-07-07T20:59:25\">2010-07-07T20:59:25</time></a>\r\n            </div>\r\n            <div class=\"content\"><p>Hey Les, this is super cool!  Google App Engine's Datastore API is still very shaky though.  In fact, it's been so bad lately that I've been considering porting one of my heavily used apps over to something else.  Thankfully, this post suggests that fixing the Datastore is their top priority: http://googleappengine.blogspot.com/2010/06/datastore-performance-growing-pains.html</p></div>\r\n            \r\n        </li>\r\n    \r\n        <li class=\"comment\" id=\"comment-221088119\">\r\n            <div class=\"meta\">\r\n                <div class=\"author\">\r\n                    <a class=\"avatar image\" rel=\"nofollow\" \r\n                       href=\"http://home.kairo.at/blog/\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=59d914ad47e5c3fcd4c89668adcd43a2&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\"/></a>\r\n                    <a class=\"avatar name\" rel=\"nofollow\" \r\n                       href=\"http://home.kairo.at/blog/\">Robert Kaiser</a>\r\n                </div>\r\n                <a href=\"#comment-221088119\" class=\"permalink\"><time datetime=\"2010-07-07T21:21:51\">2010-07-07T21:21:51</time></a>\r\n            </div>\r\n            <div class=\"content\"><p>Well, I actually feel more comfortable with my data being on Mozilla servers than on Google servers - even with the decreased trust I have in the Mozilla organization, I'd trust it more than Google any day! ;-)</p></div>\r\n            \r\n        </li>\r\n    \r\n        <li class=\"comment\" id=\"comment-221088120\">\r\n            <div class=\"meta\">\r\n                <div class=\"author\">\r\n                    <a class=\"avatar image\" rel=\"nofollow\" \r\n                       href=\"http://blog.chrisarndt.de\"><img src=\"http://www.gravatar.com/avatar.php?gravatar_id=02653ae22d36044e6870c17cf3d5a005&amp;size=32&amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png\"/></a>\r\n                    <a class=\"avatar name\" rel=\"nofollow\" \r\n                       href=\"http://blog.chrisarndt.de\">Chris Arndt</a>\r\n                </div>\r\n                <a href=\"#comment-221088120\" class=\"permalink\"><time datetime=\"2010-09-28T11:06:55\">2010-09-28T11:06:55</time></a>\r\n            </div>\r\n            <div class=\"content\"><p>Instead of porting GAE to your desktop, why don't you just port your app to plain Django? Django should run off your desktop with no problems.</p></div>\r\n            \r\n        </li>\r\n    \r\n        </ul>\r\n    \r\n        </div>\r\n    ",
  "parentPath": "./content/posts/archives/2010/2010-07-05-firefox-sync-server-on-google-app-engine",
  "path": "2010/07/05/firefox-sync-server-on-google-app-engine",
  "thumbnail": "http://mozcom-cdn.mozilla.net/img/firefox/sync/sync-background.png",
  "needsBuild": true,
  "prevPostPath": "2010/06/22/case-study-building-a-bookmark-management-ui-for-mozillas-byob",
  "prevPostTitle": "Case Study: Building a Bookmark Management UI for Mozilla's BYOB",
  "nextPostPath": "2010/09/27/so-simultaneously-extraordinary-and-mundane",
  "nextPostTitle": "so simultaneously extraordinary and mundane"
}