CINXE.COM
Google Wave Developer Blog
<!DOCTYPE html> <html dir='ltr' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'> <head> <link href='https://www.blogger.com/static/v1/widgets/55013136-widget_css_bundle.css' rel='stylesheet' type='text/css'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='blogger' name='generator'/> <link href='http://googlewavedev.blogspot.com/favicon.ico' rel='icon' type='image/x-icon'/> <link href='http://googlewavedev.blogspot.com/' rel='canonical'/> <link rel="alternate" type="application/atom+xml" title="Google Wave Developer Blog - Atom" href="http://googlewavedev.blogspot.com/feeds/posts/default" /> <link rel="alternate" type="application/rss+xml" title="Google Wave Developer Blog - RSS" href="http://googlewavedev.blogspot.com/feeds/posts/default?alt=rss" /> <link rel="service.post" type="application/atom+xml" title="Google Wave Developer Blog - Atom" href="https://www.blogger.com/feeds/7938035922388048219/posts/default" /> <!--Can't find substitution for tag [blog.ieCssRetrofitLinks]--> <meta content='http://googlewavedev.blogspot.com/' property='og:url'/> <meta content='Google Wave Developer Blog' property='og:title'/> <meta content='' property='og:description'/> <title>Google Wave Developer Blog</title> <link href='http://www.google.com/css/gooey.css' rel='stylesheet' type='text/css'/> <link href='http://www.google.com/googleblogs/css/template_styles.css' rel='stylesheet' type='text/css'/> <style id='page-skin-1' type='text/css'><!-- /* custom header */ .template_white #header-graphic .content, .template_white #header-graphic .bottom { background-image:url(http://google.com/googleblogs/images/headers/wave_header_right.png);} .template_white #header-graphic h1.title{color:#4A82B5;} .template_white h2, .template_white .post h3 a {color:#4A82B5;} /* /* --></style> <script type='text/javascript'> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-8569477-5']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> <link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=7938035922388048219&zx=6befe207-b5b2-4bd6-b3ad-9c210d3ad695' media='none' onload='if(media!='all')media='all'' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=7938035922388048219&zx=6befe207-b5b2-4bd6-b3ad-9c210d3ad695' rel='stylesheet'/></noscript> <meta name='google-adsense-platform-account' content='ca-host-pub-1556223355139109'/> <meta name='google-adsense-platform-domain' content='blogspot.com'/> </head> <body> <div class='navbar section' id='navbar'><div class='widget Navbar' data-version='1' id='Navbar1'><script type="text/javascript"> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener('load', function(){ object[attribute] = val; }, false); } else { window.attachEvent('onload', function(){ object[attribute] = val; }); } } </script> <div id="navbar-iframe-container"></div> <script type="text/javascript" src="https://apis.google.com/js/platform.js"></script> <script type="text/javascript"> gapi.load("gapi.iframes:gapi.iframes.style.bubble", function() { if (gapi.iframes && gapi.iframes.getContext) { gapi.iframes.getContext().openChild({ url: 'https://www.blogger.com/navbar/7938035922388048219?origin\x3dhttp://googlewavedev.blogspot.com', where: document.getElementById("navbar-iframe-container"), id: "navbar-iframe" }); } }); </script><script type="text/javascript"> (function() { var script = document.createElement('script'); script.type = 'text/javascript'; script.src = '//pagead2.googlesyndication.com/pagead/js/google_top_exp.js'; var head = document.getElementsByTagName('head')[0]; if (head) { head.appendChild(script); }})(); </script> </div></div> <div class='template_white' id='template_fixed'> <div id='main-wrapper'> <!-- skip links for text browsers --> <span id='skiplinks' style='display:none;'> <a href='#main'>skip to main </a> | <a href='#sidebar'>skip to sidebar</a> </span> <div id='header-graphic' style='width:100%;'> <a href='http://googlewavedev.blogspot.com/' style='text-decoration:none;'> <div class='content'> <div class='section' id='header_titles'><div class='widget HTML' data-version='1' id='HTML3'> <div class='widget-content'> <h1 class='title'>Google Wave Developer Blog</h1> </div> </div><div class='widget HTML' data-version='1' id='HTML4'> <div class='widget-content'> <h1 class='subheader'>Technical news & updates related to the APIs and protocol</h1> </div> </div></div> </div> <div class='bottom'><div></div></div> </a> </div> <br style='clear:both;'/> <div id='content-wrapper'> <div id='sidebar'> <div class='sidebar section' id='sidebar'><div class='widget HTML' data-version='1' id='HTML1'> <div class='widget-content'> <a href="http://googlewavedev.blogspot.com/atom.xml"><img alt="Site Feed" src="http://www.google.com/images/feed-icon.gif"/></a> <a href="http://googlewavedev.blogspot.com/atom.xml">Site Feed</a><br/> <a href="http://fusion.google.com/add?feedurl=http%3A//googlewavedev.blogspot.com/atom.xml"><img border="0" alt="Add to Google" style="padding-top:5px;" width="104" src="http://buttons.googlesyndication.com/fusion/add.gif" height="17"/></a> <br/> <p><a href="http://feeds2.feedburner.com/GoogleWaveDeveloperBlog"><img width="88" style="border:0" alt="" src="http://feeds2.feedburner.com/~fc/GoogleWaveDeveloperBlog?bg=99CCFF&fg=444444&anim=1" height="26"/></a></p> <br/> <a href="http://www.twitter.com/googlewavedev">Follow us on Twitter</a> </div> <div class='clear'></div> </div><div class='widget BlogSearch' data-version='1' id='BlogSearch1'> <h2 class='title'>Search This Blog</h2> <div class='widget-content'> <div id='BlogSearch1_form'> <form action='http://googlewavedev.blogspot.com/search' class='gsc-search-box' target='_top'> <table cellpadding='0' cellspacing='0' class='gsc-search-box'> <tbody> <tr> <td class='gsc-input'> <input autocomplete='off' class='gsc-input' name='q' size='10' title='search' type='text' value=''/> </td> <td class='gsc-search-button'> <input class='gsc-search-button' title='search' type='submit' value='Search'/> </td> </tr> </tbody> </table> </form> </div> </div> <div class='clear'></div> </div><div class='widget BlogArchive' data-version='1' id='BlogArchive1'> <h2 class='small'>Archive</h2> <div class='widget-content'> <div id='ArchiveList'> <div id='BlogArchive1_ArchiveList'> <select id='BlogArchive1_ArchiveMenu'> <option value='http://googlewavedev.blogspot.com/2010/'>2010 (30)</option> <option value='http://googlewavedev.blogspot.com/2009/'>2009 (30)</option> </select> </div> </div> <div class='clear'></div> </div> </div><div class='widget HTML' data-version='1' id='HTML2'> <h2 class='title'>More Blogs from Google</h2> <div class='widget-content'> Visit our <a href="http://www.google.com/press/blogs/directory.html#tab0"> directory</a> for more information about Google blogs. </div> <div class='clear'></div> </div><div class='widget HTML' data-version='1' id='HTML23'> <div class='widget-content'> <a href='http://www.blogger.com'><img alt='Powered By Blogger' src='http://www.blogger.com/buttons/blogger-powerby-blue.gif'/></a> </div> </div></div> </div> <div id='main-content'> <div class='main section' id='main'><div class='widget Blog' data-version='1' id='Blog1'> <div id='post-wrapper'> <div class='blog-posts hfeed'> <!--Can't find substitution for tag [adStart]--> <div class='post'> <a name='5311697211198060903'></a> <h3> <a href='http://googlewavedev.blogspot.com/2010/12/introducing-apache-wave.html'>Introducing Apache Wave</a> </h3> <p class='post-subhead'> Monday, December 6, 2010 | 4:03 PM </p> <p class='post-subhead'> Labels: <a href='http://googlewavedev.blogspot.com/search/label/Wave%20Developer%20Blog' rel='tag'>Wave Developer Blog</a> </p> <div class='post-body'> <p>One of the best outcomes from November's <a href="http://googlewavedev.blogspot.com/2010/11/this-weeks-wave-protocol-summit-updates.html">Wave Protocol Summit</a> was a <a href="http://wiki.apache.org/incubator/WaveProposal">proposal</a> for Wave to enter the <a href="http://apache.org/">Apache</a> Software Foundation's <a href="http://incubator.apache.org/">incubator</a> program. Apache has a fantastic reputation for fostering healthy open source communities that create great software. Last week, that proposal was accepted, and we're spinning up the project infrastructure so that the community can continue to grow in the Apache way. <br><br> During the summit, it became quite clear that there is a healthy community of startups, independent developers, and industry partners enthusiastic to continue development of the Wave Federation protocols and Wave in a Box product. We've posted <a href="http://www.waveprotocol.org/wave-protocol-summit/wave-summit-talks">videos</a> of the technical talks and demos presented throughout the summit so that those who couldn't make it to San Francisco needn't miss out.<br><br> The final days of the summit were dedicated to technical design and coding. Progress since then includes significant improvements to the wave panel, visual enhancements to the login pages, gadgets hooked up and working, improved development set-up and documentation, and a <a href="http://www.waveprotocol.org/protocol/design-proposals/http-based-federation-protocol">draft</a> HTTP transport for wave federation.<br><br> In recognition of this work, we're proud to announce that the open source project leadership is expanding to include a number of new committers from outside Google: Tad Glines, Michael McFadden (Solute), James Purser, Ian Roughley (Novell), Anthony Watkins (SESI), and Torben Weis (University Duisburg-Essen). They are joining graduated Google interns Joseph Gentle and Lennard de Rijk as trusted contributors who have demonstrated high quality code and valuable design insight.<br><br> The creation of Apache Wave will serve to accelerate the growth of the existing community with strong open source processes. If you'd like to get involved, please join the Apache Wave mailing list (send an email to wave-dev-subscribe@incubator.apache.org). We're looking forward to working with you.<br><br> <span class="post-author">Posted by Alex North, Software Engineer, Google Wave team </span> </p> </div> <div class='post-footer'> <p> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> </p> </div> </div> <div class='post'> <a name='2121884782119103805'></a> <h3> <a href='http://googlewavedev.blogspot.com/2010/11/this-weeks-wave-protocol-summit-updates.html'>This Week's Wave Protocol Summit: Updates</a> </h3> <p class='post-subhead'> Wednesday, November 10, 2010 | 6:10 PM </p> <p class='post-subhead'> Labels: <a href='http://googlewavedev.blogspot.com/search/label/Wave%20Developer%20Blog' rel='tag'>Wave Developer Blog</a> </p> <div class='post-body'> <p><p>We've just wrapped up day 3 of this week's <a href="http://www.waveprotocol.org/wave-protocol-summit">Wave Protocol Summit</a> in San Francisco. Developers and industry partners have gathered from all over the world to discuss the architecture of Wave, opportunities for use in enterprise, government, and consumer technology, and the future of the open source project. The last few days have included a great mix of architecture presentations, technical discussions, and interesting demos using Wave technology (<a href="http://wavelook.com/">WaveLook</a>, <a href="http://www.youtube.com/watch?v=KFaUrDFjERM&feature=player_embedded">Novell Vibe</a>, <a href="http://wave-vs.net/">Wave-vs.net</a>, and others).</p> <p>Since the <a href="http://googlewavedev.blogspot.com/2010/09/wave-open-source-next-steps-wave-in-box.html">Wave in a Box announcement</a> in September, progress has been rapid. We've recently added: </p><ul><li>a new <a href="http://www.waveprotocol.org/protocol/design-proposals/new-wave-panel-undercurrent">wave panel</a>, which is much prettier and a lot faster,</li><li>improvements to <a href="http://www.waveprotocol.org/protocol/design-proposals/authentication">login and authentication</a>,</li><li><a href="http://google-opensource.blogspot.com/2010/11/adding-robots-to-wave-in-box.html">robot and data API support</a>,</li><li>support for <a href="http://code.google.com/apis/wave/extensions/gadgets/guide.html">Wave Gadgets</a>,</li><li><a href="http://www.waveprotocol.org/code">new setup, installation guides and tutorials</a>,</li><li>support for browers without websocket support (via <a href="http://code.google.com/p/socketio-java/">socket.io</a>),</li><li>designs for a <a href="http://www.waveprotocol.org/protocol/design-proposals/wave-store-design-for-wave-in-a-box">file-based wave store</a>, and</li><li>support for federation between instances of Wave in a Box (and <a href="http://wavesandbox.com/">wavesandbox.com</a>).</li></ul><p></p> <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM0jV5Lhp0sOtb3FzE_4uElquV1zOLIo2fC5jq-wXnEHuWF-QiER_YfXY2yTjRAZDDDHsXXVRGtSggpOg2yzosfh8ZXfEDPHesmzYb4JmW9FJiibLwnFtOZVsbUlAbtPW2fmiZWXmV_CA/s1600/wiab.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5538105311091967730" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM0jV5Lhp0sOtb3FzE_4uElquV1zOLIo2fC5jq-wXnEHuWF-QiER_YfXY2yTjRAZDDDHsXXVRGtSggpOg2yzosfh8ZXfEDPHesmzYb4JmW9FJiibLwnFtOZVsbUlAbtPW2fmiZWXmV_CA/s320/wiab.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 183px;" /></a><div style="text-align: center;"><span class="Apple-style-span" style=" ;font-size:12px;">Wave in a Box "out of the box"</span></div> <p>You can keep up to date by following the <a href="https://wave.google.com/wave/#restored:wave:googlewave.com/w+tYBKatJxA">Progress Reports wave</a>.</p> <p>For the rest of this week we'll be hacking on Wave in a Box, helping new contributors tackle some <a href="http://www.waveprotocol.org/code/starter-projects">starter projects</a>, resolving <a href="http://code.google.com/p/wave-protocol/issues/list">open issues</a>, and adding even more functionality.</p> <p>As a reminder, we'll continue running <a href="http://wave.google.com/">wave.google.com</a> at least through the end of the year. We've also recently introduced a <a href="http://googlewave.blogspot.com/2010/11/exporting-your-waves.html">wave export feature</a>. In addition, we're working on ways for you to access waves through Google Docs and we hope to share more on our progress soon.</p> <p>If you're following along from home, we'll be sharing videos following the event -- but please join us in the <a href="http://groups.google.com/group/wave-protocol/">Wave Protocol group</a>.</p><br> <span class="post-author">Posted by Dan Peterson, Product Manager</span> </p> </div> <div class='post-footer'> <p> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> </p> </div> </div> <div class='post'> <a name='2365508760148787115'></a> <h3> <a href='http://googlewavedev.blogspot.com/2010/10/wave-protocol-summit-november-8-12th.html'>Join us at the Wave Protocol Summit</a> </h3> <p class='post-subhead'> Monday, October 4, 2010 | 3:39 PM </p> <p class='post-subhead'> Labels: <a href='http://googlewavedev.blogspot.com/search/label/Wave%20Developer%20Blog' rel='tag'>Wave Developer Blog</a> </p> <div class='post-body'> <p><p>The <a href='http://googlewavedev.blogspot.com/2010/09/wave-open-source-next-steps-wave-in-box.html'>Wave in a Box</a> project is shaping up well and we're now posting regular progress reports to the group forum (the most recent is <a href='https://groups.google.com/group/wave-protocol/browse_thread/thread/6bde65dd8d4ee1d8/6ffde83a0f624a55'>here</a>). We've also created a list of <a href='http://www.waveprotocol.org/code/starter-projects'>starter projects</a>, easy tasks for developers to get started contributing to the codebase. You can chat with some of the Wave engineers at the upcoming online office hours (in Google Wave). The next one is on Monday (Tuesday down under) - details are <a href='http://groups.google.com/group/wave-protocol/browse_thread/thread/5763f3033d447120'>in the forum</a>.</p> <p>To bring the developer community together we are hosting a Wave Protocol Summit in San Francisco, November 2010. Through the summit we aim to grow the Wave developer community, share technical knowledge, and discuss the future of Wave technology and its community. The summit will be targeted towards technical people interested in using, contributing to, or building on Wave technology. Content will include: <ul> <li>technical talks on specific aspects of Wave technology, <li>problem solving around open technical issues, <li>discussions about project organisation and governance, and <li>group coding sessions (fun!). </ul> </p> <p>The summit will be three days of talks and discussion (November 8 - 10) followed by two days of coding (November 11 - 12) on Wave in a Box and federation. We're still working out the detailed schedule, so stay tuned to the forums for further details (and give your feedback).</p> <p>If you would like to join us, you can <a href='https://spreadsheets.google.com/viewform?formkey=dGFwZDBFMlpfRWhyWVk4LTZQRXJNM2c6MA'>request a seat</a> (due to capacity constraints, we'll confirm your seat in the coming weeks). To help improve the summit, please also suggest or request session content of particular interest to you.</p> <p>In the meantime, see you on the forums!</p> <br> <span class="post-author">Posted by Alex North, Google Wave team.</span> </p> </div> <div class='post-footer'> <p> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> </p> </div> </div> <div class='post'> <a name='5465656544619947203'></a> <h3> <a href='http://googlewavedev.blogspot.com/2010/09/wave-open-source-next-steps-wave-in-box.html'>Wave open source next steps: "Wave in a Box"</a> </h3> <p class='post-subhead'> Thursday, September 2, 2010 | 5:48 PM </p> <p class='post-subhead'> Labels: <a href='http://googlewavedev.blogspot.com/search/label/Wave%20Developer%20Blog' rel='tag'>Wave Developer Blog</a> </p> <div class='post-body'> <p>Since the <a href="http://googleblog.blogspot.com/2010/08/update-on-google-wave.html">announcement that we will discontinue development</a> of Google Wave as a standalone product, many people have asked us about the future of the open source code and Wave federation protocol. After spending some time on <a href="http://googlewave.blogspot.com/2010/08/quick-note-on-next-steps-for-google.html">figuring out our next steps</a>, we'd like to share the plan for our contributions over the coming months.<div><p> We will expand upon the 200K lines of code we've already open sourced (detailed at <a href="http://waveprotocol.org/">waveprotocol.org</a>) to flesh out the existing example Wave server and web client into a more complete application or "Wave in a Box." <p> This project will include: <ul><li>an application bundle including a server and web client supporting real-time collaboration using the same structured conversations as the Google Wave system</li><li>a fast and fully-featured wave panel in the web client with complete support for threaded conversations</li><li>a persistent wave store and search implementation for the server (building on contributed patches to implement a MongoDB store)</li><li>refinements to the client-server protocols</li><li>gadget, robot and data API support </li><li>support for importing wave data from <a href="http://wave.google.com/">wave.google.com</a></li><li>the ability to federate across other Wave in a Box instances, with some additional configuration</li></ul>This project will not have the full functionality of Google Wave as you know it today. However, we intend to give developers and enterprising users an opportunity to run wave servers and host waves on their own hardware. <p> Since the beginning, it has been our vision that the Google Wave protocols could support a new generation of communication and collaboration tools. The response from the developer community to date has been amazing and rewarding. Even more so now, we believe that developers and <a href="http://googlewavedev.blogspot.com/2010/06/wave-federation-keeps-growing-rich-text.html">other projects</a> are a critical part of this story. <p> While Wave in a Box will be a functional application, the future of Wave will be defined by your contributions. We hope this project will help the Wave developer community continue to grow and evolve. We'll discuss more technical details of our plan on the <a href="https://groups.google.com/group/wave-protocol?pli=1">Wave Protocol Forum</a>, which is the best place to keep up with the latest progress on the open source project and learn how you can contribute. <p> Wave on <p> <div> <span class="post-author">Posted by Alex North, Software Engineer, Google Wave team </span></div></div> </p> </div> <div class='post-footer'> <p> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> </p> </div> </div> <div class='post'> <a name='3717859526834668410'></a> <h3> <a href='http://googlewavedev.blogspot.com/2010/08/upcoming-wave-api-talks-michigan.html'>Upcoming Wave Talks: Michigan & Washington, DC</a> </h3> <p class='post-subhead'> Monday, August 2, 2010 | 8:44 PM </p> <p class='post-subhead'> Labels: <a href='http://googlewavedev.blogspot.com/search/label/Wave%20Developer%20Blog' rel='tag'>Wave Developer Blog</a> </p> <div class='post-body'> <p><p>Every so often, I leave this beautiful city of Sydney, Australia and depart for foreign lands to meet developers from around the world. This time, I'm heading to the states and dropping by two <a href='http://gtugs.org/'>GTUGs</a> (Google Technology User Groups) to talk about Google Wave and the APIs:</p> <ul> <li><p><a href='https://sites.google.com/site/dcgtug/home'>DC GTUG</a><br />Washington, DC<br />August 10, 6pm</p></li> <li><p><a href='http://migtug.eventbrite.com/'>Michigan GTUG</a><br />Southfield, MI<br />August 12, 6:30pm</p> </li> </ul> <p>After the GTUG talks, I'll also be swinging by the <a href='http://gtug-campout-2010.eventbrite.com/'>HTML5 GTUG campout</a> in San Francisco, setting up waves for the teams to document their progress and ask questions.</p> <p>If you're in the area, I hope to see you there!</p> <p>Update: In light of the recent <a href="http://googleblog.blogspot.com/2010/08/update-on-google-wave.html">update on Wave</a>, the talks have changed topic and will now be on Google APIs: A-Z.</p> <br> <span class="post-author">Posted by Pamela Fox, Developer Relations</span> </p> </div> <div class='post-footer'> <p> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> </p> </div> </div> <div class='post'> <a name='8599130216816050091'></a> <h3> <a href='http://googlewavedev.blogspot.com/2010/07/wave-visualizer-turning-trees-into.html'>Wave Visualizer: Turning Threads into Trees</a> </h3> <p class='post-subhead'> Friday, July 30, 2010 | 4:45 PM </p> <p class='post-subhead'> Labels: <a href='http://googlewavedev.blogspot.com/search/label/Wave%20Developer%20Blog' rel='tag'>Wave Developer Blog</a> </p> <div class='post-body'> <p><p>Two years ago, I discovered the <a href='http://thejit.org/'>JavaScript InfoVis Toolkit</a>, a really cool library for doing visualizations in Javascript, like force-directed graphs, hypertree, treemaps, sunbursts, and more. Since then, I've been looking for an excuse to use the library in conjunction with a Google API, and after our latest API release, I found the perfect use.</p> <p>A few weeks ago, we released a new feature in the data and robot APIs: threads. This feature means that developers can render threaded waves in alternative clients and export waves to other formats while retaining their true structure. It also means that I can finally use the InfoVis Toolkit, in order to visualize the threads in a wave as a structured tree.</p> <p>To create the visualization, I started with the code for the <a href="http://wave-samples-gallery.appspot.com/about_app?app_id=266001">Inbox Checker</a> sample, a Python App Engine app that asks a user to authenticate (via OAuth), and then shows them their inbox and any wave they click on. I modified that app to output JSON instead of HTML for each wave, and I piped that JSON into the <a href='http://thejit.org/static/v20/Docs/files/Visualizations/Spacetree-js.html'>SpaceTree</a> class from the toolkit.</p> <p>Here's an side-by-side example of how a wave might look like in the client, and what it looks like as a SpaceTree:</p> <br> <img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgJX-MLjsDOXJF_Eyd61MwOlhqV4czTQFb4i8lpwjrZAqRZYf8pj3P7PMSyPtEb11rzo-eUieAaydvAeVTRpBm7SgutLCTHohunHZsox46sFzUoT1gffOT3sLZaJQRlxVOk-jy88JljQ/" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand; width:500px" /> <br> <p>You can try the app out for yourself here: <a href='http://wave-visualizer.appspot.com/'>Wave Visualizer</a>. After granting access to the app, you can click each of the waves in your inbox and browse the tree for it. As you mouse over each blip, you'll see a snippet of the content of the blip in the tooltip. When you click on a blip, you'll be taken to that exact blip in the Wave client, utilizing our other new feature: <a href='http://wave-api-faq.appspot.com/#bliplinking'>blip linking</a>.<br />(You can also try out the "Timeline" view, which shows the sequence of blips over time, using the <a href="http://code.google.com/apis/visualization/documentation/gallery/annotatedtimeline.html">Google Visualization API</a>).</p> <p>This app shows off one of my favorite features of Wave - flexibly structured conversations. Some waves are very flat long trees, and others are wide and deeply nested, and they are all made possible by the <a href='http://www.youtube.com/watch?v=ydsSFMB4SFI'>Wave conversation model</a>. And now, thanks to the new <a href="http://code.google.com/apis/wave/wavedata/">Wave data APIs</a>, apps like this are possible.</p> <p>Enjoy playing around with the visualizer, and if you have any questions about building apps like it, stop by <a href='http://code.google.com/apis/wave/forum.html'>the Wave API forum</a> and let us know!</p> <br> <span class="post-author">Posted by Pamela Fox, Developer Relations</span> </p> </div> <div class='post-footer'> <p> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> </p> </div> </div> <div class='post'> <a name='4134202163792708643'></a> <h3> <a href='http://googlewavedev.blogspot.com/2010/07/wave-ui-making-your-gadgets-look-feel.html'>Wave UI: Making your gadgets look & feel Wave-y</a> </h3> <p class='post-subhead'> Thursday, July 29, 2010 | 6:16 PM </p> <p class='post-subhead'> Labels: <a href='http://googlewavedev.blogspot.com/search/label/Wave%20Developer%20Blog' rel='tag'>Wave Developer Blog</a> </p> <div class='post-body'> <p><p>As part of my Google I/O talk on "<a href='http://www.youtube.com/watch?v=tXKidPYCEzQ'>Anatomy of a Great Extension</a>", I talked about the optimal look & feel for Wave gadgets. On one hand, if your Wave gadget is based off an existing website, like the 6Rounds gadget, then we recommend mimicing the UI of your website inside the gadget, so that your existing users feel like they're using an extension of your website into Wave. On the other hand, if your Wave gadget is independent and designed purely for Wave, like many extensions in the gallery, then we suggest mimicing the UI of the Google Wave client itself, so that users feel like the gadgets fit inside their environment, and so that waves with multiple independent gadgets look cohesive. To make that easier for developers, we've introduced a new feature to the Wave Gadgets API, the <a href='http://code.google.com/apis/wave/extensions/gadgets/guide.html#waveui'>wave.ui library</a>, which makes it easy to turn your gadget elements into wave-styled elements.</p> <p>For example, you might start with an anchor with some javascript onclick behavior:<br /> <pre class="code"> <a id="button" href="javascript:void(0)" onclick="doIt()">Do Cool Stuff!</a> </pre> <span style=''></p> <p>You can then call makeButton and pass in the anchor element:<br /></span> <pre class="code"> <script> wave.ui.makeButton(document.getElementById("button")); </script> </pre> <span style=''> <br />And, presto, your button will be wave-styled like this:</p> <p> <img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiKFT6ZuSgcn0-aywSjUztA29cQZqGCeXGea58UBanaNMumDPEc70uge4DYdAqLW1lvDorFPGof-qUBFNwBzkjRqpjsQSTVJrdkaOcawr8Zn9PjyXbNasYQsyDhaemdUifHOM2k5lTrQ/s400/waveuimakebutton.png" style="margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 95px; height: 29px;"/> </p> <p>The wave.ui library also offers the </span><span style='font-family:monospace;'>loadCss</span><span style=''>, </span><span style='font-family:monospace;'>makeDialog</span><span style=''>, and </span><span style='font-family:monospace;'>makeFrame</span><span style=''> methods, and will expand to include additional methods as needed by developers.</p> <p>For examples of gadgets using the new wave.ui library, check out the <a href='https://wave.google.com/wave/waveref/googlewave.com/w+sYRTy7ZkCT3'>Flammard bible bot</a>, which uses </span><span style='font-family:monospace;'>makeFrame </span><span style=''>for a multi-tabbed interface, or the <a href='https://wave.google.com/wave/waveref/googlewave.com/w+R8RbkhA9C'>Google Maps gadget</a>, which uses </span><span style='font-family:monospace;'>makeDialog </span><span style=''>for a welcome screen and </span><span style='font-family:monospace;'>makeButton </span>for the info window buttons.</p> <p>As usual, please let us know in <a href='http://code.google.com/apis/wave/forum.html'>the forum</a> how you're using this feature and if you have any questions.</p> <p>Enjoy wave-styling!</p> <br> <span class="post-author">Posted by Pamela Fox, Developer Relations</span> </p> </div> <div class='post-footer'> <p> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> <span class='post-footer-link'> </span> </p> </div> </div> <!--Can't find substitution for tag [adEnd]--> </div> <div class='blog-pager' id='blog-pager'><p> <a class='blog-pager-older-link' href='http://googlewavedev.blogspot.com/search?updated-max=2010-07-29T18:16:00-07:00&max-results=7' id='Blog1_blog-pager-older-link' title='Older Posts'>Older Posts</a> </p> </div> <div class='clear'></div> <div class='blog-feeds'> <div class='feed-links'> Subscribe to: <a class='feed-link' href='http://googlewavedev.blogspot.com/feeds/posts/default' target='_blank' type='application/atom+xml'>Posts (Atom)</a> </div> </div> </div> </div></div> </div> </div> <!-- end content-wrapper --> </div> <!-- end outer-wrapper --> <div id='footer-graphic'> <div class='footer section' id='footer'><div class='widget HTML' data-version='1' id='HTML25'> <p class='widget-content'> ©2009 Google - <a href='http://google.com/intl/en/privacy.html'>Privacy Policy</a> - <a href='http://www.google.com/accounts/TOS?hl=en'>Terms of Service</a> </p> </div></div> </div></div> <script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/1455187647-widgets.js"></script> <script type='text/javascript'> window['__wavt'] = 'AOuZoY4N6zcKOWUG2GVgXJwZEbxnj9VUEQ:1743624402003';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d7938035922388048219','//googlewavedev.blogspot.com/','7938035922388048219'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '7938035922388048219', 'title': 'Google Wave Developer Blog', 'url': 'http://googlewavedev.blogspot.com/', 'canonicalUrl': 'http://googlewavedev.blogspot.com/', 'homepageUrl': 'http://googlewavedev.blogspot.com/', 'searchUrl': 'http://googlewavedev.blogspot.com/search', 'canonicalHomepageUrl': 'http://googlewavedev.blogspot.com/', 'blogspotFaviconUrl': 'http://googlewavedev.blogspot.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': false, 'httpsEnabled': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': '', 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': true, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Google Wave Developer Blog - Atom\x22 href\x3d\x22http://googlewavedev.blogspot.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Google Wave Developer Blog - RSS\x22 href\x3d\x22http://googlewavedev.blogspot.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Google Wave Developer Blog - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/7938035922388048219/posts/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/c4ef6ff9ae7c94eb', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Share to X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'index', 'pageName': '', 'pageTitle': 'Google Wave Developer Blog'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Google Wave Developer Blog', 'description': '', 'url': 'http://googlewavedev.blogspot.com/', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': true, 'isArchive': false, 'isLabelSearch': false}}]); _WidgetManager._RegisterWidget('_NavbarView', new _WidgetInfo('Navbar1', 'navbar', document.getElementById('Navbar1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML3', 'header_titles', document.getElementById('HTML3'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML4', 'header_titles', document.getElementById('HTML4'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML1', 'sidebar', document.getElementById('HTML1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogSearchView', new _WidgetInfo('BlogSearch1', 'sidebar', document.getElementById('BlogSearch1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML2', 'sidebar', document.getElementById('HTML2'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML23', 'sidebar', document.getElementById('HTML23'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/1425802369-lbx.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/1964470060-lightbox_bundle.css'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML25', 'footer', document.getElementById('HTML25'), {}, 'displayModeFull')); </script> </body> </html>