<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>We’re product people with ideas.
Beautiful code. Simple design.
Making things happen.</description><title>CodeArtists</title><generator>Tumblr (3.0; @codeartists)</generator><link>http://codeartists.com/</link><item><title>How to start with Backbone.js: A simple skeleton app</title><description>&lt;div id="aside"&gt;
&lt;nav id="outline"&gt;&lt;h3&gt;Outline&lt;/h3&gt;
  &lt;ol&gt;&lt;li&gt;&lt;a href="#philosophy"&gt;Philosophy&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="#backstory"&gt;Backstory&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="#tools"&gt;Tools&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="#usage"&gt;Using the skeleton&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="#resources"&gt;Useful resources&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;&lt;/nav&gt;&lt;div id="tldr"&gt;
&lt;h3&gt;TL;DR&lt;/h3&gt;

&lt;p&gt;It took me some time to get an optimal code/directory layout for Backbone.js apps.&lt;/p&gt;
&lt;p&gt;Because I think this is a major pain for beginners, I prepared a well commented &lt;a href="https://github.com/mihar/backbone-skeleton"&gt;sample skeleton app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Get it from Github while it&amp;#8217;s hot, pull requests/feedback are welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;Prerequisites&lt;/h2&gt;

&lt;p&gt;You need a solid knowledge of JavaScript, familiarity with Backbone, Ruby, HAML, SASS and CoffeeScript to find this writeup useful.&lt;/p&gt;

&lt;p&gt;Also, I&amp;#8217;m developing on a Mac and have not tested this on other platforms. Although, I do not see any reason why it shouldn&amp;#8217;t work.&lt;/p&gt;

&lt;p&gt;&lt;a name="philosophy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;1. Philosophy&lt;/h2&gt;

&lt;p&gt;Part of the success of &lt;a href="http://rubyonrails.com"&gt;Rails&lt;/a&gt; was the conventions and its predefined directory tree. While looking overwhelming and
maybe annoying to a beginner at first, it soon becomes liberating. With experience things fall into place, and soon you feel
feel like every tiny bit of code has it&amp;#8217;s dedicated home.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://backbonejs.org"&gt;Backbone&lt;/a&gt;, being the nimble, does not prescribe any particular code or directory structure. Until I read enough material 
and settled on this particular layout, I was feeling very confused and disoriented.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mihar/backbone-skeleton"&gt;This skeleton app&lt;/a&gt; was extracted from a production app and then extensively annotated, to explain certain decisions and choices.&lt;/p&gt;

&lt;p&gt;&lt;a name="backstory"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;2. Backstory&lt;/h2&gt;

&lt;p&gt;When I first started to play with Backbone I was already heavily entrenched in the Ruby and Rails world. 
So naturally I thought, yeah, MVC, I know that. It turned out to be a bit farther from the truth than I 
wanted or cared to admit.&lt;/p&gt;

&lt;p&gt;Disclaimer: &lt;em&gt;I rarely developed pure client-side software, though I was using JavaScript extensively to make 
things faster and more responsive.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thing is that MVC on the server-side is quite a bit different from MVC on the client. It has something to
do with wiping the state clean each time you reload the page. Statelessness.&lt;/p&gt;

&lt;p&gt;The client on the other hand is stateful and thus keeps all your bad practices in memory until they start
to slow things down and eventually stop working.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dubjoy.com?utm_source=blog"&gt;&lt;img src="http://media.tumblr.com/tumblr_me7lakk15j1rwn17m.png" style="float: right; background: none;"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was the biggest client-side project for me so far, building out the &lt;a href="http://dubjoy.com"&gt;Dubjoy&lt;/a&gt; editor for dubbing online video.&lt;/p&gt;

&lt;p&gt;The hardest part of learning to develop MVC on the client and using Backbone was seeing the big picture.
Seeing where all the little parts fit in and how this all works together in the grand scale.&lt;/p&gt;

&lt;p&gt;So for the most part, my journey with Backbone consisted of finding out best practices for file and code 
organization, setting up the environment and directory structures.&lt;/p&gt;

&lt;p&gt;Using backbone.js as a library was &amp;#8220;easy&amp;#8221;. &lt;em&gt;(Not really, but this isn&amp;#8217;t what this article&amp;#8217;s about.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One of the biggest mistakes I was making when starting out was &lt;strong&gt;trying to use Backbone constructs for everything&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Backbone is intentionally kept simple, because it&amp;#8217;s supposed to be a complement to your own JavaScript. So just create your
own &lt;code&gt;App&lt;/code&gt; class, and populate it with the stuff and initialization your app really needs.&lt;/p&gt;

&lt;p&gt;&lt;a name="tools"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;3. Tools&lt;/h2&gt;

&lt;p&gt;So a good workflow needs good tools. Here I&amp;#8217;ll describe the tools that I found indispensable when developing in Backbone.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_meu8mprgfy1qahol6.png" style="float: right; padding: 0 0 20px 20px; background: none;"/&gt;&lt;/p&gt;

&lt;h3&gt;CoffeeScript, HAML and SASS&lt;/h3&gt;

&lt;p&gt;Because I resent cruft and redundancy, I&amp;#8217;m a big fan of abstraction languages. Whenever I can, I opt for &lt;strong&gt;&lt;a href="http://haml.info"&gt;HAML&lt;/a&gt;&lt;/strong&gt;, 
&lt;strong&gt;&lt;a href="http://sass-lang.com"&gt;SASS&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="http://coffeescript.org"&gt;CoffeeScript&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The brevity they bring is paramount to me.&lt;/p&gt;

&lt;h3&gt;HAML Coffee&lt;/h3&gt;

&lt;p&gt;In Backbone, you usually need a template engine. Templates provide the markup for views. There&amp;#8217;s a lot of
solutions for this, but because I like to be consistent, the best choice was to use HAML.&lt;/p&gt;

&lt;p&gt;Fortunately, there&amp;#8217;s a library for this: &lt;a href="https://github.com/netzpirat/haml-coffee"&gt;haml-coffee&lt;/a&gt;, which enables you
to use HAML intertwined with snippets of CoffeeScript.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_meu8c0jkq71qahol6.png" style="float: right; padding: 0 0 20px 20px; background: none;"/&gt;&lt;/p&gt;

&lt;h3&gt;Guard&lt;/h3&gt;

&lt;p&gt;To be able to use these languages seamlessly, you need some sort of a on-demand compiler.
Turns out a Ruby gem called &lt;a href="https://github.com/guard/guard"&gt;Guard&lt;/a&gt; does exactly this.&lt;/p&gt;

&lt;p&gt;Guard is extremely flexible. It watches for file system changes and then doing something to files that changed.&lt;/p&gt;

&lt;h3&gt;Jammit&lt;/h3&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_meu8cvNwwk1qahol6.png" style="float: right; padding: 0 0 20px 20px; background: none;"/&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://documentcloud.github.com/jammit/"&gt;Jammit&lt;/a&gt; is an asset packaging library. It concatenates
and compresses CSS and Javascript. It&amp;#8217;s easy to use, but needs a &lt;a href="http://documentcloud.github.com/jammit/#configuration"&gt;configuration file&lt;/a&gt;, that defines which files to work on.&lt;/p&gt;

&lt;h3&gt;Sinatra with Isolate&lt;/h3&gt;

&lt;p&gt;Backbone apps are static files and you can run them directly off your hard drive. But to do proper paths and even maybe
some API, we need a server.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_meu8eq6m0U1qahol6.png" style="float: right; padding: 0 0 20px 20px; background: none;"/&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.sinatrarb.com"&gt;Sinatra&lt;/a&gt;, a mini Ruby web framework, forms the base of the server. This enables some quick server-side magic as well as making an API for persistence.&lt;/p&gt;

&lt;p&gt;To make this part as easy as possible to use, I packaged the server with &lt;a href="https://github.com/jbarnette/isolate"&gt;Isolate&lt;/a&gt;, a small Ruby library for sand-boxing, which is like a mini-&lt;a href="http://gembundler.com"&gt;Bundler&lt;/a&gt;. When launching the server with &lt;code&gt;rake server&lt;/code&gt; for the first time, it will check and auto-install it&amp;#8217;s dependencies. &lt;em&gt;It just works.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="usage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;4. Using the skeleton&lt;/h2&gt;

&lt;p&gt;Getting started with a new app using my skeleton is trivial. It uses Ruby in several critical places, so be sure you have a working installation of Ruby, preferably of the 1.9 kind.&lt;/p&gt;

&lt;p&gt;All of the files, directories and their meaning is described with more detail in the &lt;a href="https://github.com/mihar/backbone-skeleton#readme"&gt;README&lt;/a&gt; file of the skeleton.&lt;/p&gt;

&lt;p&gt;A &lt;a href="http://examples.breakthebit.org/backbone-skeleton/"&gt;working example&lt;/a&gt; of this app is available online. This way you can check if the console output is the same on your local setup and here.&lt;/p&gt;

&lt;p&gt;Start by cloning my &lt;a href="https://github.com/mihar/backbone-skeleton"&gt;backbone-skeleton repo&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git clone &lt;a href="https://github.com/mihar/backbone-skeleton.git"&gt;https://github.com/mihar/backbone-skeleton.git&lt;/a&gt; my-new-backbone-app
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then use the &lt;code&gt;bundle&lt;/code&gt; command that comes with &lt;a href="http://gembundler.com/v1.2/index.html"&gt;Ruby Bundler&lt;/a&gt; to install the necessary dependencies for guard. Guard will compile our HAML, SASS and CoffeeScript to their native counterparts.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd my-new-backbone-app
$ bundle
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once Bundler completes the installation, we can try starting Guard, to immediately start watching files for changes.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ bundle exec guard
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;While leaving guard running, go to another terminal and let&amp;#8217;s fire up a simple, bundled Ruby web server, that we&amp;#8217;ll use for development. The server will install all of it&amp;#8217;s dependencies by itself.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rake server

[1/1] Isolating sinatra (&amp;gt;= 0).
Fetching: rack-1.4.1.gem (100%)
Fetching: rack-protection-1.2.0.gem (100%)
Fetching: tilt-1.3.3.gem (100%)
Fetching: sinatra-1.3.3.gem (100%)
[2012-12-05 18:17:05] INFO  WEBrick 1.3.1
[2012-12-05 18:17:05] INFO  ruby 1.9.3 (2012-02-16) [x86_64-darwin11.3.0]
[2012-12-05 18:17:05] INFO  WEBrick::HTTPServer#start: pid=39675 port=9292
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now our server is listening on &lt;a href="http://localhost:9292"&gt;http://localhost:9292&lt;/a&gt;, so go ahead, and open that.&lt;/p&gt;

&lt;p&gt;If you see &amp;#8220;Skeleton closet&amp;#8221;, everything is go.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_meu8pymBnq1qahol6.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Go check out the JavaScript console for more information.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_meu8kjjYVI1qahol6.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;&lt;a name="resources"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;5. Resources&lt;/h2&gt;

&lt;h3&gt;&lt;a href="http://cdnjs.com"&gt;The missing CDN&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;They host &lt;em&gt;all&lt;/em&gt; the libraries, including Backbone and underscore.&lt;/p&gt;

&lt;h3&gt;&lt;a href="https://peepcode.com/products/backbone-js"&gt;Backbone Peepcode tutorials&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Peepcode has been my friend since my Ruby and Rails days. They produce high-quality screencasts on a variety of topics.&lt;/p&gt;

&lt;p&gt;They have a series of 3 videos on Backbone, going from the basics to some pretty advanced stuff.&lt;/p&gt;

&lt;p&gt;Be prepared to shell out $12 per video, though.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://lostechies.com/derickbailey/category/backbone/"&gt;Derick Bailey backbone posts&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;ve learned so much about the correct ways to do things on Derick&amp;#8217;s blog. He&amp;#8217;s a seasoned Backbone developer
that has overcome many problems and written up on the progress. Wealth of resources.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://pragprog.com/screencasts/v-dback/hands-on-backbone-js"&gt;Derick Bailey&amp;#8217;s 4 part screencast&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Haven&amp;#8217;t seen this one yet, but if I&amp;#8217;m judging by his blog, this should be very worth the money. 4 videos, $12 a pop.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://ricostacruz.com/backbone-patterns/"&gt;Backbone Patterns&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Documented patterns extracted from building many Backbone apps.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://weblog.bocoup.com/organizing-your-backbone-js-application-with-modules/"&gt;Organizing Backbone apps with modules&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Article exploring similar problems of code/directory structure and organizations.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://weblog.bocoup.com/introducing-the-backbone-boilerplate/"&gt;Backbone Boilerplate&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;A much bigger project with a similar goal as mine.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://adrianmejia.com/blog/2012/09/11/backbone-dot-js-for-absolute-beginners-getting-started/"&gt;Backbone for absolute beginners&lt;/a&gt;&lt;/h3&gt;</description><link>http://codeartists.com/post/38153430040</link><guid>http://codeartists.com/post/38153430040</guid><pubDate>Mon, 17 Dec 2012 11:58:18 -0500</pubDate><category>javascript</category><category>backbone</category><category>backbonejs</category><category>coffeescript</category><category>client</category><category>skeleton</category><category>sample</category><dc:creator>breakbit</dc:creator></item><item><title>How to directly upload files to Amazon S3 from your client side web app</title><description>&lt;h2&gt;Why you need this?&lt;/h2&gt;

&lt;p&gt;You don&amp;#8217;t want your heavy-weight data to travel 2 legs from Client to Server to S3, incurring the cost of IO 
and clogging the pipe 2 times.&lt;/p&gt;

&lt;p&gt;Instead, you want to ask your server to give your client one-time permission to upload your data
directly to S3. The process is still 2 legged, but heawy-weight data travels only on 1 leg.&lt;/p&gt;

&lt;p&gt;On Amazon S3 this is implemented with CORS (Cross Origin Resource Sharing)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dubjoy.com"&gt;&lt;img src="http://media.tumblr.com/tumblr_me7lakk15j1rwn17m.png" style="padding-left: 10px; padding-bottom: 10px; float: right;"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We use this at Dubjoy, where customers upload their huge video files to S3 for translation and 
voice-over, and we don&amp;#8217;t want our Heroku server to have anything to do with heavy-weight video files.&lt;/p&gt;

&lt;h2&gt;Steps to implement this&lt;/h2&gt;

&lt;ol&gt;&lt;li&gt;Set up Amazon S3 bucket CORS configuration&lt;/li&gt;
&lt;li&gt;Implement client-side JavaScript (CoffeScript, JavaScript)&lt;/li&gt;
&lt;li&gt;Implement server-side upload request signing (Ruby/Sinatra, trivial to do in any other language)&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;1. Amazon S3 bucket CORS configuration&lt;/h3&gt;

&lt;p&gt;Set this in AWS S3 management console. Right-click on the desired bucket and select Properties. 
Below, on the permissions tab, click Edit CORS configuration, paste the XML below and click Save.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"&amp;gt;
    &amp;lt;CORSRule&amp;gt;
        &amp;lt;AllowedOrigin&amp;gt;*&amp;lt;/AllowedOrigin&amp;gt;
        &amp;lt;AllowedMethod&amp;gt;GET&amp;lt;/AllowedMethod&amp;gt;
        &amp;lt;MaxAgeSeconds&amp;gt;3000&amp;lt;/MaxAgeSeconds&amp;gt;
        &amp;lt;AllowedHeader&amp;gt;Authorization&amp;lt;/AllowedHeader&amp;gt;
    &amp;lt;/CORSRule&amp;gt;
    &amp;lt;CORSRule&amp;gt;
        &amp;lt;AllowedOrigin&amp;gt;*&amp;lt;/AllowedOrigin&amp;gt;
        &amp;lt;AllowedMethod&amp;gt;PUT&amp;lt;/AllowedMethod&amp;gt;
        &amp;lt;MaxAgeSeconds&amp;gt;3000&amp;lt;/MaxAgeSeconds&amp;gt;
        &amp;lt;AllowedHeader&amp;gt;Content-Type&amp;lt;/AllowedHeader&amp;gt;
        &amp;lt;AllowedHeader&amp;gt;x-amz-acl&amp;lt;/AllowedHeader&amp;gt;
        &amp;lt;AllowedHeader&amp;gt;origin&amp;lt;/AllowedHeader&amp;gt;
    &amp;lt;/CORSRule&amp;gt;
&amp;lt;/CORSConfiguration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;2. Your web app&lt;/h3&gt;

&lt;p&gt;Head to &lt;a href="https://github.com/tadruj/s3upload-coffee-javascript"&gt;GitHub&lt;/a&gt; repo with CoffeScript and JavaScript Class files to include.
In your app, do the following:&lt;/p&gt;

&lt;h4&gt;HAML&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;%input#file{ :type =&amp;gt; 'file', :name =&amp;gt; 'files[]'}
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;or HTML for the chevron-lovers&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;input type='file' name='files[]' /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;CoffeScript&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;s3upload = s3upload ? new S3Upload
    file_dom_selector: '#files'
  s3_sign_put_url: '/signS3put'
    onProgress: (percent, message) -&amp;gt;
        console.log 'Upload progress: ', percent, message # Use this for live upload progress bars
    onFinishS3Put: (public_url) -&amp;gt;
        console.log 'Upload finished: ', public_url # Get the URL of the uploaded file
  onError: (status) -&amp;gt;
    console.log 'Upload error: ', status
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;or JavaScript for the brace-lovers&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;var s3upload = s3upload != null ? s3upload : new S3Upload({
  file_dom_selector: '#files',
  s3_sign_put_url: '/signS3put',
  onProgress: function(percent, message) { // Use this for live upload progress bars
    console.log('Upload progress: ', percent, message);
  },
  onFinishS3Put: function(public_url) { // Get the URL of the uploaded file
    console.log('Upload finished: ', public_url);
  },
  onError: function(status) {
    console.log('Upload error: ', status);
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Be sure to set the right DOM selector name &lt;code&gt;file_dom_selector&lt;/code&gt; for file input tag, #files in our case. 
&lt;code&gt;s3_sign_put_url&lt;/code&gt; is an end-point on your server where you will be signing S3 PUT requests.&lt;/p&gt;

&lt;h3&gt;3. Server-side request signing&lt;/h3&gt;

&lt;p&gt;Be sure to set &lt;code&gt;S3_BUCKET_NAME&lt;/code&gt;,&lt;code&gt;S3_SECRET_KEY&lt;/code&gt;,&lt;code&gt;S3_ACCESS_KEY&lt;/code&gt;. 
Create a bucket and get the keys under Security Credentials menu in AWS management console.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;S3_BUCKET_NAME = 'CREATE_A_BUCKET_AND_SET_THE_NAME_HERE'
S3_SECRET_KEY = 'GET_THIS_IN_AWS_CONSOLE'
S3_ACCESS_KEY = 'GET_THIS_IN_AWS_CONSOLE'

get '/signS3put' do
  objectName = params[:s3_object_name]
  mimeType = params['s3_object_type']
  expires = Time.now.to_i + 100 # PUT request to S3 must start within 100 seconds

  amzHeaders = "x-amz-acl:public-read" # set the public read permission on the uploaded file
  stringToSign = "PUT\n\n#{mimeType}\n#{expires}\n#{amzHeaders}\n/#{S3_BUCKET_NAME}/#{objectName}";
  sig = CGI::escape(Base64.strict_encode64(OpenSSL::HMAC.digest('sha1', S3_SECRET_KEY, stringToSign)))

  {
    signed_request: CGI::escape("#{S3_URL}#{S3_BUCKET_NAME}/#{objectName}?AWSAccessKeyId=#{S3_ACCESS_KEY}&amp;amp;Expires=#{expires}&amp;amp;Signature=#{sig}"),
    url: "http://s3.amazonaws.com/#{S3_BUCKET_NAME}/#{objectName}"
  }.to_json
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Resources&lt;/h2&gt;

&lt;p&gt;The code is a based on these resources, but has been put in to an easy to use CoffeeScript/JavaScript Class&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://docs.amazonwebservices.com/AmazonS3/latest/dev/cors.html#how-do-i-enable-cors"&gt;http://docs.amazonwebservices.com/AmazonS3/latest/dev/cors.html#how-do-i-enable-cors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ioncannon.net/programming/1539/direct-browser-uploading-amazon-s3-cors-fileapi-xhr2-and-signed-puts/"&gt;http://www.ioncannon.net/programming/1539/direct-browser-uploading-amazon-s3-cors-fileapi-xhr2-and-signed-puts/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/carsonmcdonald/direct-browser-s3-upload-example"&gt;https://github.com/carsonmcdonald/direct-browser-s3-upload-example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;You can learn more about CORS here&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.html5rocks.com/en/tutorials/cors/"&gt;http://www.html5rocks.com/en/tutorials/cors/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://remysharp.com/2011/04/21/getting-cors-working/"&gt;http://remysharp.com/2011/04/21/getting-cors-working/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html"&gt;http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Rok Krulec / &lt;a href="http://twitter.com/tantadruj"&gt;@tantadruj&lt;/a&gt;&lt;/p&gt;</description><link>http://codeartists.com/post/36892733572</link><guid>http://codeartists.com/post/36892733572</guid><pubDate>Fri, 30 Nov 2012 14:26:00 -0500</pubDate><category>cors</category><category>amazon</category><category>s3</category><category>coffeescript</category><category>javascript</category><category>dubjoy</category><category>uplaod</category><dc:creator>tadruj</dc:creator></item><item><title>How to record audio in Chrome with native HTML5 APIs</title><description>&lt;p&gt;Two weeks ago a &lt;a href="http://googlechromereleases.blogspot.com/2012/11/stable-channel-release-and-beta-channel.html"&gt;new version&lt;/a&gt; of Chrome was released. Google switched from the default Adobe&amp;#8217;s Flash Player to an in-house developed version called &amp;#8220;&lt;a href="http://blog.chromium.org/2012/08/the-road-to-safer-more-stable-and.html"&gt;Pepper Flash&lt;/a&gt;&amp;#8221;. Unfortunately Pepper Flash has a &lt;a href="http://code.google.com/p/chromium/issues/detail?id=157613"&gt;problem with audio recording&lt;/a&gt;, resulting in &lt;a href="https://www.youtube.com/watch?v=3ugdk89ojxU"&gt;distorted audio&lt;/a&gt; on almost all Macs.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dubjoy.com"&gt;&lt;img src="http://media.tumblr.com/tumblr_me7lakk15j1rwn17m.png" style="padding-left: 10px; padding-bottom: 10px; float: right;"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This happened right in the middle of our efforts to build the &lt;a href="http://dubjoy.com"&gt;Dubjoy&lt;/a&gt; Editor, a browser-based, easy to use tool for translating (dubbing) online videos. Relying on Flash for audio recording was our first choice, but when confronted with this devastating issue, we started looking into other options. Using native HTML5 APIs seemed like a viable solution.&lt;/p&gt;

&lt;p&gt;We started researching the space and checked a lot of sample code out there, but had limited success.&lt;/p&gt;

&lt;p&gt;From what you can find on &lt;a href="http://html5rocks.com"&gt;html5rocks&lt;/a&gt;, capturing audio seems to be well supported. We started with the &lt;a href="http://html5rocks.com/en/tutorials/getusermedia/intro"&gt;sample code for capturing video&lt;/a&gt; and modified it for our audio recording test:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;audio controls autoplay&amp;gt;&amp;lt;/audio&amp;gt;

    &amp;lt;input onclick="startRecording()" type="button" value="start recording" /&amp;gt;
    &amp;lt;input onclick="stopRecording()" type="button" value="stop recording and play" /&amp;gt;

    &amp;lt;script&amp;gt;
      var onFail = function(e) {
        console.log('Rejected!', e);
      };

      var onSuccess = function(s) {
        stream = s;
      }

      window.URL = window.URL || window.webkitURL;
      navigator.getUserMedia  = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;

      var stream;
      var audio = document.querySelector('audio');

      function startRecording() {
        if (navigator.getUserMedia) {
          navigator.getUserMedia({audio: true}, onSuccess, onFail);
        } else {
          console.log('navigator.getUserMedia not present');
        }
      }

      function stopRecording() {
        audio.src = window.URL.createObjectURL(stream);
      }
    &amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Everything seems easy and pretty straightforward, right? &lt;em&gt;Wrong!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When clicking the &amp;#8220;start recording&amp;#8221; button, a permission request to use the microphone appears. After allowing access the recording should start, but clicking on the &amp;#8220;stop recording and play&amp;#8221; button does absolutely nothing.&lt;/p&gt;

&lt;p&gt;Looks like the problem lies in assigning the recorded stream to the native audio source as it&amp;#8217;s done in the &lt;a href="http://html5rocks.com/en/tutorials/getusermedia/intro"&gt;video sample on html5rocks&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;audio.src = window.URL.createObjectURL(stream);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After playing around and searching the web for hours, we found countless posts of people asking on forums why it isn&amp;#8217;t working. The answer is that the current implementation of Chrome returns raw audio samples. These are not playable by the native &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; control.&lt;/p&gt;

&lt;p&gt;What you need to do is to create an &lt;em&gt;audio context&lt;/em&gt; and a &lt;em&gt;media stream source&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var context = new webkitAudioContext();
var mediaStreamSource = context.createMediaStreamSource(s);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These can be used for creating an audio loop that enables you to hear your own voice:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mediaStreamSource.connect(context.destination);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To implement the recording functionality you need to buffer the returned raw audio samples until the recording is done. If you want to play it back, you need to convert the buffered samples to a format that can be played natively by the &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; control. This can be quite cumbersome and not something you want to spend your time with.&lt;/p&gt;

&lt;p&gt;Luckily there are libraries available that handle this for you. &lt;a href="https://github.com/mattdiamond/Recorderjs"&gt;Recorderjs&lt;/a&gt; is the one we used and did the trick.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;media stream source&lt;/em&gt; created above, can be passed as a parameter to the recorder object for buffering raw audio samples:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;recorder = new Recorder(mediaStreamSource);
recorder.record();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When done, the recorder object can promptly convert the buffered audio to a natively playable WAV file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;recorder.stop();
recorder.exportWAV(function(s) {
  audio.src = window.URL.createObjectURL(s);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Which is exactly what we were looking for.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the full version of the HTML5 native audio recorder complete with playback functionality:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;audio controls autoplay&amp;gt;&amp;lt;/audio&amp;gt;
    &amp;lt;script type="text/javascript" src="recorder.js"&amp;gt; &amp;lt;/script&amp;gt;

    &amp;lt;input onclick="startRecording()" type="button" value="start recording" /&amp;gt;
    &amp;lt;input onclick="stopRecording()" type="button" value="stop recording and play" /&amp;gt;

    &amp;lt;script&amp;gt;
      var onFail = function(e) {
        console.log('Rejected!', e);
      };

      var onSuccess = function(s) {
        var context = new webkitAudioContext();
        var mediaStreamSource = context.createMediaStreamSource(s);
        recorder = new Recorder(mediaStreamSource);
        recorder.record();

        // audio loopback
        // mediaStreamSource.connect(context.destination);
      }

      window.URL = window.URL || window.webkitURL;
      navigator.getUserMedia  = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;

      var recorder;
      var audio = document.querySelector('audio');

      function startRecording() {
        if (navigator.getUserMedia) {
          navigator.getUserMedia({audio: true}, onSuccess, onFail);
        } else {
          console.log('navigator.getUserMedia not present');
        }
      }

      function stopRecording() {
        recorder.stop();
        recorder.exportWAV(function(s) {
          audio.src = window.URL.createObjectURL(s);
        });
      }
    &amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Unfortunately there’s a caveat. In the current stable version of Chrome, the support for native HTML5 audio playback is &lt;strong&gt;not enabled by default&lt;/strong&gt;. For the code above to work you need to enable &amp;#8220;Web Audio Input&amp;#8221; in &lt;em&gt;chrome://flags&lt;/em&gt;, which is a huge deal breaker for us.&lt;/p&gt;

&lt;p&gt;Before starting the development of the &lt;a href="http://dubjoy.com"&gt;Dubjoy&lt;/a&gt; Editor, we decided to support Chrome as our only browser, because of its wide adoption on both Macs and Windows, auto-updates and the built-in Flash Player.&lt;/p&gt;

&lt;p&gt;After trying hard to find a workaround, we’re still waiting for the Chrome team to fix the &amp;#8220;&lt;a href="http://code.google.com/p/chromium/issues/detail?id=157613"&gt;Pepper Flash Bug&lt;/a&gt;&amp;#8221; (that in the meantime has spread to millions of users around the world) or to enable &amp;#8220;Web Audio Input&amp;#8221; by default in their stable version of Chrome.&lt;/p&gt;

&lt;p&gt;HTML5 is very promising and when browsers will support it widely, a lot of the problems we face today will disappear. But we’re not quite there yet.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://github.com/rokgregoric/html5record/archive/master.zip"&gt;download sample code&lt;/a&gt; from Github.&lt;/p&gt;</description><link>http://codeartists.com/post/36746402258</link><guid>http://codeartists.com/post/36746402258</guid><pubDate>Wed, 28 Nov 2012 12:50:00 -0500</pubDate><category>API</category><category>audio</category><category>chrome</category><category>dubbing</category><category>dubjoy</category><category>flash</category><category>google</category><category>html5</category><category>javascript</category><category>recording</category><category>github</category><dc:creator>rokgregoric</dc:creator></item><item><title>Dubjoy</title><description>&lt;p&gt;&lt;img align="right" src="http://media.tumblr.com/tumblr_me3y5fETg81qahol6.png"/&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve just launched the first public preview of our video dubbing tool. &lt;a href="http://dubjoy.com"&gt;Dubjoy&lt;/a&gt; makes it really simple for anyone to translate the voice of any video - and right in the browser.&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ll be hearing a lot more about Dubjoy in the coming weeks, but for now we invite you to &lt;a href="http://dubjoy.com" title="Dubjoy"&gt;test out the tool&lt;/a&gt; and let us know your thoughts.&lt;/p&gt;</description><link>http://codeartists.com/post/36602180361</link><guid>http://codeartists.com/post/36602180361</guid><pubDate>Sun, 25 Nov 2012 10:34:00 -0500</pubDate><category>dubjoy</category><category>video</category><category>dubbing</category><dc:creator>breakbit</dc:creator></item><item><title>Stairway: Message based, time-shifted virtual meetings</title><description>&lt;p&gt;&lt;img align="right" src="http://codeartists-com.s3.amazonaws.com/logo144.png"/&gt;&lt;/p&gt;
&lt;p&gt;So we&amp;#8217;re finally releasing &lt;strong&gt;Stairway&lt;/strong&gt; out into the wild. It&amp;#8217;s part of our vision on how to conduct meetings more efficiently.&lt;/p&gt;
&lt;p&gt;Or as we like to say: &lt;strong&gt;Don&amp;#8217;t design your work around meetings. Design meetings around your work.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you have a team, company or any kind of group that needs to make decisions, please try it out and give us your feedback.&lt;/p&gt;
&lt;p&gt;Here it is: &lt;a href="http://bit.ly/KKdmeK"&gt;StairwayApp.com&lt;/a&gt;&lt;/p&gt;</description><link>http://codeartists.com/post/24610766482</link><guid>http://codeartists.com/post/24610766482</guid><pubDate>Thu, 07 Jun 2012 10:59:00 -0400</pubDate><category>stairway</category><category>stairwayapp</category><category>meetings</category><category>decisions</category><category>minutes</category><dc:creator>breakbit</dc:creator></item><item><title>Publishers warm towards DoubleRecall's paywall buster</title><description>&lt;a href="http://paidcontent.org/2012/05/21/publishers-warm-to-doublerecalls-paywall-buster/"&gt;Publishers warm towards DoubleRecall's paywall buster&lt;/a&gt;</description><link>http://codeartists.com/post/23515700480</link><guid>http://codeartists.com/post/23515700480</guid><pubDate>Mon, 21 May 2012 21:10:46 -0400</pubDate><category>paywalls</category><category>paywall</category><category>doublerecall</category><category>publishers</category><category>monetization</category><category>content</category><category>engagement</category><category>advertising</category><dc:creator>breakbit</dc:creator></item><item><title>The CodeArtists Code of Conduct

Be bold
  Be passionate
 ...</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_m47201fZbw1rs144zo1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;h2&gt;The CodeArtists Code of Conduct&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;Be bold&lt;/li&gt;
  &lt;li&gt;Be passionate&lt;/li&gt;
  &lt;li&gt;Challenge yourself&lt;/li&gt;
  &lt;li&gt;Have fun&lt;/li&gt;
  &lt;li&gt;Dream big&lt;/li&gt;
  &lt;li&gt;Make something people want&lt;/li&gt;
  &lt;li&gt;Execute&lt;/li&gt;
  &lt;li style="margin-top: 10px;"&gt;&lt;strong&gt;Amazing.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</description><link>http://codeartists.com/post/23263500073</link><guid>http://codeartists.com/post/23263500073</guid><pubDate>Thu, 17 May 2012 21:12:01 -0400</pubDate><dc:creator>breakbit</dc:creator></item><item><title>Can haz identity!</title><description>&lt;p&gt;Finally our design guy &lt;a href="http://miha.rebernik.info"&gt;Miha&lt;/a&gt; took some time to finish up our identity. You can see it in all it&amp;#8217;s glory on this site. Below is a foursome of our new logo.&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://media.tumblr.com/tumblr_m11zsrL1HF1qahol6.png"/&gt;&lt;/p&gt;</description><link>http://codeartists.com/post/19480541305</link><guid>http://codeartists.com/post/19480541305</guid><pubDate>Sat, 17 Mar 2012 19:57:00 -0400</pubDate><category>codeartists</category><category>graphic</category><category>identity</category><category>corporate identity</category><category>visual design</category><category>graphic design</category><dc:creator>breakbit</dc:creator></item><item><title>To remind us of our guiding principle! :-)</title><description>&lt;iframe width="400" height="225" src="http://www.youtube.com/embed/lEHZJNQ5Y4A?wmode=transparent&amp;autohide=1&amp;egm=0&amp;hd=1&amp;iv_load_policy=3&amp;modestbranding=1&amp;rel=0&amp;showinfo=0&amp;showsearch=0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;To remind us of our guiding principle! :-)&lt;/p&gt;</description><link>http://codeartists.com/post/19482068752</link><guid>http://codeartists.com/post/19482068752</guid><pubDate>Thu, 01 Mar 2012 00:00:00 -0500</pubDate><category>speed</category><category>startups</category><category>philosophy</category><dc:creator>breakbit</dc:creator></item><item><title>DoubleRecall is at O'Reilly TOC 2012</title><description>&lt;p&gt;We&amp;#8217;re having a booth at the &lt;a href="http://www.toccon.com/toc2012"&gt;O&amp;#8217;Reilly TOC 2012&lt;/a&gt; conference. It&amp;#8217;s about all the things that are changing in the publishing industry which makes it a great fit for our DoubleRecall product.&lt;/p&gt;
&lt;p&gt;Check out who&amp;#8217;s in the centre of attention :-)&lt;/p&gt;
&lt;img src="http://media.tumblr.com/tumblr_m1237e6foi1qahol6.jpg"/&gt;</description><link>http://codeartists.com/post/19484432549</link><guid>http://codeartists.com/post/19484432549</guid><pubDate>Mon, 13 Feb 2012 00:00:00 -0500</pubDate><category>oreilly</category><category>conference</category><category>toc</category><category>tool of change</category><category>publishing</category><category>publishers</category><category>new york</category><dc:creator>breakbit</dc:creator></item><item><title>DoubleRecall got funded</title><description>&lt;p&gt;We had first implementations in the US and things are also running very good in Europe. There was some nice initial traction to show to our seed investors.&lt;/p&gt;

&lt;p&gt;Today we went forward with the announcement of the funding and the YC affiliation. You can &lt;a href="http://techcrunch.com/2012/02/12/doublerecall-funding/"&gt;read more about it on TechCrunch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We got funding from some prominent international venture capital firms, some of which will also be playing the role of strategic partners in the publishing and advertising industry.&lt;/p&gt;

&lt;p&gt;Our investors/partners Digital Garage of Japan, released &lt;a href="http://www.garage.co.jp/en/pr/pressreleases/120223_dg_doublerecall.html"&gt;their statement&lt;/a&gt; today on the partnership.&lt;/p&gt;

&lt;img style="width: 150px;" src="http://media.tumblr.com/tumblr_m121frq4y91qahol6.png"/&gt;</description><link>http://codeartists.com/post/19461908863</link><guid>http://codeartists.com/post/19461908863</guid><pubDate>Wed, 08 Feb 2012 00:00:00 -0500</pubDate><category>investment</category><category>funding</category><category>doublerecall</category><category>vc</category><category>seed</category><category>round</category><category>techcrunch</category><dc:creator>breakbit</dc:creator></item><item><title>New York, New York</title><description>&lt;p&gt;We&amp;#8217;ve settled in New York City. It feels great, this city really has something in it.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re now going full steam ahead, preparing a PR launch for next week&amp;#8217;s &lt;a href="http://www.toccon.com/toc2012"&gt;O&amp;#8217;Reilly Tools of Change&lt;/a&gt; conference.&lt;/p&gt;
&lt;img src="http://media.tumblr.com/tumblr_m1233uRiek1qahol6.jpg"/&gt;</description><link>http://codeartists.com/post/19484305085</link><guid>http://codeartists.com/post/19484305085</guid><pubDate>Sat, 04 Feb 2012 00:00:00 -0500</pubDate><category>new york</category><category>new york city</category><category>nyc</category><category>big apple</category><category>publishing industry</category><category>madison avenue</category><category>advertising</category><category>publishing</category><dc:creator>breakbit</dc:creator></item><item><title>Bye bye San Francisco, we'll miss you!</title><description>&lt;p&gt;We&amp;#8217;re leaving San Francisco to pursue the ambitions of DoubleRecall in the Big Apple!&lt;/p&gt;
&lt;p&gt;It was really fun here for the last month, we were staying at the &lt;a href="http://www.umww.com/"&gt;Universal McCann&lt;/a&gt; offices, where we took part of their internal start-ups program. We learned a lot about the advertising space and how an agency works. Now it&amp;#8217;s time to shift to high gear and rumble in NYC!&lt;/p&gt;
&lt;p&gt;The hardest part will be leaving behind the cool people and friends that we met during our Y Combinator batch.&lt;/p&gt;
&lt;img src="http://media.tumblr.com/tumblr_m122m9eq531qahol6.jpg"/&gt;</description><link>http://codeartists.com/post/19483777860</link><guid>http://codeartists.com/post/19483777860</guid><pubDate>Wed, 01 Feb 2012 00:00:00 -0500</pubDate><category>san francisco</category><category>bay area</category><category>universal mccan</category><category>advertising</category><category>publishing</category><dc:creator>breakbit</dc:creator></item><item><title>TimeKiwi left the building</title><description>&lt;p&gt;&lt;a href="http://timekiwi.com"&gt;TimeKiwi&lt;/a&gt; was our little side project that enabled anyone to create a beautiful timeline of his social networks in seconds.&lt;/p&gt;

&lt;p&gt;After we launched it for the second time in a totally revamped version it got lots of attention and press and finally caught the eye of the people over at &lt;a href="http://www.over-blog.com/"&gt;OverBlog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We agreed that they acquire it as we continue to focus 100% on &lt;a href="http://doublerecall.com"&gt;DoubleRecall&lt;/a&gt; which is making ripples throughout the publishing industry.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="http://techcrunch.com/2012/01/25/top-european-blogging-platform-overblog-acquires-timeline-creator-timekiwi/"&gt;read more about the acquisition&lt;/a&gt; on TechCrunch.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m11jvfos9w1qahol6.png" alt=""/&gt;&lt;/p&gt;</description><link>http://codeartists.com/post/19462294027</link><guid>http://codeartists.com/post/19462294027</guid><pubDate>Mon, 30 Jan 2012 00:00:00 -0500</pubDate><category>timekiwi</category><category>overblog</category><category>acquisition</category><category>doublerecall</category><dc:creator>breakbit</dc:creator></item><item><title>TimeKiwi creates a buzz</title><description>&lt;p&gt;We recently launched a much improved version of our weekend project &lt;a href="http://timekiwi.com"&gt;TimeKiwi&lt;/a&gt;, which enables anyone to create a beautiful timeline of his social networks in seconds.&lt;/p&gt;

&lt;p&gt;If you haven’t tried it yet, &lt;strong&gt;you should&lt;/strong&gt;. It’s dead simple and the result will impress you.&lt;/p&gt;

&lt;p&gt;There has been quite some buzz around it when we launched it the &lt;a href="http://news.ycombinator.com/item?id=3109779"&gt;first&lt;/a&gt; and &lt;a href="https://news.ycombinator.com/item?id=3371361"&gt;second&lt;/a&gt; time on Hacker News.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m11k4zbi2p1qahol6.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Tweets were also flying around and we gathered quite some coverage in the media and blogs:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://imjustcreative.co.uk/single-measures/timekiwi-%E2%80%94-create-a-beautiful-timeline/"&gt;&lt;a href="http://imjustcreative.co.uk/single-measures/timekiwi-%E2%80%94-create-a-beautiful-timeline/"&gt;http://imjustcreative.co.uk/single-measures/timekiwi-—-create-a-beautiful-timeline/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.autourdurezo.com/index.php/actus-rezo/web-20/1289-timekiwi-une-belle-timeline-pour-mixer-vos-sources-twitter-instagram-wordpress-tumblr-et-posterous"&gt;&lt;a href="http://www.autourdurezo.com/index.php/actus-rezo/web-20/1289-timekiwi-une-belle-timeline-pour-mixer-vos-sources-twitter-instagram-wordpress-tumblr-et-posterous"&gt;http://www.autourdurezo.com/index.php/actus-rezo/web-20/1289-timekiwi-une-belle-timeline-pour-mixer-vos-sources-twitter-instagram-wordpress-tumblr-et-posterous&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://technews.am/conversations/thenextweb/create_a_gorgeous_social_media_timeline_using_timekiwi"&gt;&lt;a href="http://technews.am/.../create_a_gorgeous_social_media_timeline_using_timekiwi"&gt;http://technews.am/&amp;#8230;/create_a_gorgeous_social_media_timeline_using_timekiwi&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thenextweb.com/apps/2011/10/30/create-a-gorgeous-social-media-timeline-using-timekiwi/"&gt;&lt;a href="http://thenextweb.com/apps/2011/10/30/create-a-gorgeous-social-media-timeline-using-timekiwi/"&gt;http://thenextweb.com/apps/2011/10/30/create-a-gorgeous-social-media-timeline-using-timekiwi/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.journalism.co.uk/2011/11/01/tool-of-the-week-for-journalists-timekiwi-to-create-social-media-timelines/"&gt;&lt;a href="http://blogs.journalism.co.uk/2011/11/01/tool-of-the-week-for-journalists-timekiwi-to-create-social-media-timelines/"&gt;http://blogs.journalism.co.uk/2011/11/01/tool-of-the-week-for-journalists-timekiwi-to-create-social-media-timelines/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://myspace.wihe.net/timekiwi-timeline-twitter-wordpress-instagram"&gt;&lt;a href="http://myspace.wihe.net/timekiwi-timeline-twitter-wordpress-instagram"&gt;http://myspace.wihe.net/timekiwi-timeline-twitter-wordpress-instagram&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bitelia.com/2011/10/timekiwi-la-linea-del-tiempo-de-tus-redes-sociales"&gt;&lt;a href="http://bitelia.com/2011/10/timekiwi-la-linea-del-tiempo-de-tus-redes-sociales"&gt;http://bitelia.com/2011/10/timekiwi-la-linea-del-tiempo-de-tus-redes-sociales&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://descary.com/timekiwi-transformez-votre-compte-twitter-et-votre-blogue-en-une-frise-chronologique/"&gt;&lt;a href="http://descary.com/timekiwi-transformez-votre-compte-twitter-et-votre-blogue-en-une-frise-chronologique/"&gt;http://descary.com/timekiwi-transformez-votre-compte-twitter-et-votre-blogue-en-une-frise-chronologique/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://checkapps.blogspot.com/2011/10/timekiwi-te-permite-crear-el-timeline.html"&gt;&lt;a href="http://checkapps.blogspot.com/2011/10/timekiwi-te-permite-crear-el-timeline.html"&gt;http://checkapps.blogspot.com/2011/10/timekiwi-te-permite-crear-el-timeline.html&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://oloblogger.blogspot.com/2011/10/crea-un-timeline-de-tu-blog-con.html"&gt;&lt;a href="http://oloblogger.blogspot.com/2011/10/crea-un-timeline-de-tu-blog-con.html"&gt;http://oloblogger.blogspot.com/2011/10/crea-un-timeline-de-tu-blog-con.html&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://joelrojo.com/post/11578395022/timekiwi-create-beautiful-timelines"&gt;&lt;a href="http://joelrojo.com/post/11578395022/timekiwi-create-beautiful-timelines"&gt;http://joelrojo.com/post/11578395022/timekiwi-create-beautiful-timelines&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://carlispina.wordpress.com/2011/11/06/make-a-timeline-of-your-social-media-accounts-with-timekiwi/"&gt;&lt;a href="http://carlispina.wordpress.com/2011/11/06/make-a-timeline-of-your-social-media-accounts-with-timekiwi/"&gt;http://carlispina.wordpress.com/2011/11/06/make-a-timeline-of-your-social-media-accounts-with-timekiwi/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.had.si/blog/2011/11/04/timekiwi-create-beautiful-timelines/"&gt;&lt;a href="http://www.had.si/blog/2011/11/04/timekiwi-create-beautiful-timelines/"&gt;http://www.had.si/blog/2011/11/04/timekiwi-create-beautiful-timelines/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.chillgeeks.com/2011/11/comibine-your-social-photo-and-blog-feeds-with-timekiwi/"&gt;&lt;a href="http://www.chillgeeks.com/2011/11/comibine-your-social-photo-and-blog-feeds-with-timekiwi/"&gt;http://www.chillgeeks.com/2011/11/comibine-your-social-photo-and-blog-feeds-with-timekiwi/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://web.appstorm.net/how-to/personal-media/create-beautiful-timelines-with-timekiwi/"&gt;&lt;a href="http://web.appstorm.net/how-to/personal-media/create-beautiful-timelines-with-timekiwi/"&gt;http://web.appstorm.net/how-to/personal-media/create-beautiful-timelines-with-timekiwi/&lt;/a&gt;&lt;/a&gt;   &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.addictivetips.com/internet-tips/timekiwi-creates-a-beautiful-timeline-of-your-social-media-rss-feeds/"&gt;&lt;a href="http://www.addictivetips.com/internet-tips/timekiwi-creates-a-beautiful-timeline-of-your-social-media-rss-feeds/"&gt;http://www.addictivetips.com/internet-tips/timekiwi-creates-a-beautiful-timeline-of-your-social-media-rss-feeds/&lt;/a&gt;&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.brownday.me/create-a-gorgeous-social-media-timeline-using"&gt;&lt;a href="http://www.brownday.me/create-a-gorgeous-social-media-timeline-using"&gt;http://www.brownday.me/create-a-gorgeous-social-media-timeline-using&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ziipa.com/view/timekiwi"&gt;&lt;a href="http://www.ziipa.com/view/timekiwi"&gt;http://www.ziipa.com/view/timekiwi&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://socialirl.com/socialirlblog/extend-the-life-of-your-tweets-with-twylah-or-timekiwi/"&gt;&lt;a href="http://socialirl.com/socialirlblog/extend-the-life-of-your-tweets-with-twylah-or-timekiwi/"&gt;http://socialirl.com/socialirlblog/extend-the-life-of-your-tweets-with-twylah-or-timekiwi/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://agbeat.com/real-estate-technology-new-media/timekiwi-aggregates-your-social-network-updates-into-a-meaningful-stream/"&gt;&lt;a href="http://agbeat.com/real-estate-technology-new-media/timekiwi-aggregates-your-social-network-updates-into-a-meaningful-stream/"&gt;http://agbeat.com/real-estate-technology-new-media/timekiwi-aggregates-your-social-network-updates-into-a-meaningful-stream/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;There’s also a great &lt;a href="http://breakthebeat.org/kiwis-timeline-timekiwi"&gt;post about the visual identity of TimeKiwi&lt;/a&gt; over at &lt;a href="http://miha.rebernik.info"&gt;Miha&lt;/a&gt;’s blog.&lt;/p&gt;</description><link>http://codeartists.com/post/19462582330</link><guid>http://codeartists.com/post/19462582330</guid><pubDate>Tue, 20 Dec 2011 00:00:00 -0500</pubDate><category>timekiwi</category><category>launch</category><category>hackernews</category><category>timeline</category><category>news</category><category>buzz</category><category>coverage</category><dc:creator>breakbit</dc:creator></item><item><title>Hosting a start-up event in college</title><description>&lt;p&gt;Yesterday we were hosting a start-up event in &lt;a href="http://maps.google.com/maps?q=maribor+slovenia&amp;amp;client=safari&amp;amp;oe=UTF-8&amp;amp;hnear=Maribor,+Slovenia&amp;amp;t=m&amp;amp;z=11"&gt;Maribor, Slovenia&lt;/a&gt; at the &lt;a href="http://www.feri.uni-mb.si/"&gt;Faculty of Computer Science and Electrical Engineering&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m121y8jMD01qahol6.jpg"/&gt;&lt;/p&gt;

&lt;p&gt;We were presenting our path so far, the achievements we had with &lt;a href="http://doublerecall.com"&gt;DoubleRecall&lt;/a&gt; and where we&amp;#8217;re heading. We also made a bold call out to anyone who&amp;#8217;s interested in working in a fast-paced environment where things are never boring. Some people came over to talk and seemed aligned to breathe with us. We&amp;#8217;re already working part-time with some of them.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re interested in sharing our journey, check out the &lt;a href="http://codeartists.com/breathe"&gt;Breathe with us&lt;/a&gt; page and contact us.&lt;/p&gt;</description><link>http://codeartists.com/post/19483025788</link><guid>http://codeartists.com/post/19483025788</guid><pubDate>Wed, 07 Dec 2011 00:00:00 -0500</pubDate><category>college</category><category>event</category><category>startups</category><category>promotion</category><category>hiring</category><category>recruiting</category><category>evangelism</category><dc:creator>breakbit</dc:creator></item><item><title>DoubleRecall got accepted to Y Combinator S11 batch</title><description>&lt;p&gt;It&amp;#8217;s official!&lt;/p&gt;

&lt;p&gt;CodeArtists team was part of the Y Combinator Summer 2011 batch of startups. We were working hard, learning fast and honing our pitch for 3 months to culminate everything at the glorious Demo Day.&lt;/p&gt;

&lt;p&gt;Along the way we got some good press and coverage like &lt;a href="http://www.nytimes.com/external/gigaom/2011/08/23/23gigaom-doublerecall-turns-paywalls-into-advertising-dolla-4130.html"&gt;this one in the New York Times&lt;/a&gt;.&lt;/p&gt;</description><link>http://codeartists.com/post/19460136019</link><guid>http://codeartists.com/post/19460136019</guid><pubDate>Thu, 25 Aug 2011 00:00:00 -0400</pubDate><dc:creator>breakbit</dc:creator></item><item><title>DoubleRecall is in the finals of the Start:Up Slovenia competition</title><description>&lt;p&gt;&lt;a href="http://doublerecall.com"&gt;DoubleRecall&lt;/a&gt;, a project by CodeArtists, has been selected as one of the finalists in the Start:Up Slovenia competition.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;re happy to be recognized as part of the Slovenian start-up community. We are falling and getting back on our feet every day while learning the twists and turns of being young enterpreneurs.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;re tying to hack the market with some fresh approaches while getting stronger and smarter every day. If you feel the desire breathe with us, please let us know.&lt;/p&gt;

&lt;p&gt;Be sure to check out &lt;a href="http://www.startup.si/Dokumenti/Finalisti_zmagovalci/Finalisti_2011_157.aspx"&gt;Start:Up official page&lt;/a&gt; to learn more about this (in Slovene language).&lt;/p&gt;</description><link>http://codeartists.com/post/19459862195</link><guid>http://codeartists.com/post/19459862195</guid><pubDate>Tue, 12 Apr 2011 00:00:00 -0400</pubDate><category>doublerecall</category><category>competition</category><category>startup slovenia</category><category>finals</category><dc:creator>breakbit</dc:creator></item><item><title>Interpreting the results of Popify.me HN launch</title><description>&lt;p&gt;My name is R. Yesterday &lt;a href="http://codeartists.com/post/19458162426/we-let-popify-me-into-the-wild"&gt;we let popify.me loose into the wild&lt;/a&gt; and here is a follow-up on how it survived through its first night.&lt;/p&gt;

&lt;h2&gt;The Story&lt;/h2&gt;

&lt;p&gt;This gets pretty Flintstonish sometimes, so beware:&lt;/p&gt;

&lt;p&gt;Yesterday, we finished the most basic version of popify.me. We thought that HN would be a nice place to tell people about the service, so &lt;a href="http://news.ycombinator.com/item?id=2414491"&gt;we did&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Show HN: measure curiosity of your website users&lt;/h2&gt;

&lt;p&gt;First, we tried to find a headline that would stick at least an hour on new section, for some high karma people to see it and upvote it a bit.&lt;/p&gt;

&lt;p&gt;But here comes the first Flintstone, me, trying to post news with a dead HN account! I didn’t even know it’s dead and I’m a daily HN reader for about 170 days now. I was just ok with my karma of 1 and didn’t read the rules of the game, because I see myself as a pretty polite person everywhere I move. I could blame it on pg, because I remember posting a comment twice in a row one day, as HN get pretty unresponsive sometimes, but I won’t, because he’s a superhuman anyways and I should know the rules if I’m playing the game.&lt;/p&gt;

&lt;p&gt;So I asked &lt;a href="http://miha.rebernik.info"&gt;Miha&lt;/a&gt; to clone the dead post and we were back in the game. We also asked a favor from Sahil of GumRoad, Franz of Facesearch &amp;amp; Swizec of HipsterVision to upvote our post. A nice debate also fired in the discuss section. Some questions started to appear and, guess what: Miha set his noprocrast to like 4 hours, so he was locked out of HN and couldn’t respond to questions.&lt;/p&gt;

&lt;p&gt;Matevz came to rescue and Rok and Robi also poked around a bit with a large trout.&lt;/p&gt;

&lt;p&gt;So, with a nice discussion going on, we even managed to land on the first page of HN and stayed there for like 6 hours. It was a nice adrenaline rush for the whole team and we learned a lot.&lt;/p&gt;

&lt;p&gt;There were around 2000 unique visitors from HN and we got some positive Twitter coverage.&lt;/p&gt;

&lt;h3&gt;Feedback&lt;/h3&gt;

&lt;p&gt;We had these feedback tools at our hand:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://getclicky.com/"&gt;GetClicky&lt;/a&gt; for realtime tracking of the visitors (we liked the Spy World view and dots popping up in Tasmania)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://olark.com/"&gt;Olark&lt;/a&gt; for &lt;strong&gt;live&lt;/strong&gt; chat support on edit page&lt;/li&gt;
&lt;li&gt;A simple feedback box in Edit Coupon page and&lt;/li&gt;
&lt;li&gt;The invaluable HN discuss section&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Lessons&lt;/h3&gt;

&lt;ul&gt;&lt;li&gt;We definitely need a native English speaker for explainer video.&lt;/li&gt;
&lt;li&gt;We won’t use Vimeo for explainers anymore because it’s blank on iOS devices.&lt;/li&gt;
&lt;li&gt;English proofreading is necessary “less then 1M” should be “less than 1M” &amp;amp; such&lt;/li&gt;
&lt;li&gt;Nudity on a sample coupon is not accepted, cows are.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;And, the most important was that we soon realized, that &lt;strong&gt;visitors didn’t understand why&lt;/strong&gt; would they use popify.me, which analytics clearly showed.&lt;/p&gt;

&lt;h2&gt;The analytics and A/B Testing Results&lt;/h2&gt;

&lt;p&gt;Our &lt;strong&gt;goal&lt;/strong&gt; was to try to get as many people as possible to &lt;strong&gt;try out&lt;/strong&gt; our coupons and spread them on Twitter/FB and, of course, put them on their web sites. Or at least try to &lt;strong&gt;create&lt;/strong&gt; some. But we also wanted to learn if people were prepared to &lt;strong&gt;pay&lt;/strong&gt; for such a service.&lt;/p&gt;

&lt;h3&gt;We used&lt;/h3&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://google.com/analytics/"&gt;Google Analytics&lt;/a&gt; for postprocessing of results and&lt;/li&gt;
&lt;li&gt;&lt;a href="http://optimizely.com/"&gt;Optimizely&lt;/a&gt; for A/B testing&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Results&lt;/h3&gt;

&lt;p&gt;This was the first page:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m11gofe6tv1qahol6.jpg" alt=""/&gt;&lt;/p&gt;

&lt;h3&gt;Variation 1&lt;/h3&gt;

&lt;p&gt;We had a variation that tried to communicate extraordinary results we were getting in our test runs on some news publishing websites. If you are a geek of any sort, if I say you’ll get 3.5% of CTR or a 8% e-mail newsletter subscription rate, you should be standing and screaming already. We didn’t lie about the results, but it didn’t make such a big effect as we would think. Less than 2% of visitors engaged. But there was a price tag, which could you basically reduce or remove by just retweeting coupons. It didn’t matter. A price tag is a price tag.&lt;/p&gt;

&lt;h3&gt;Variation 2&lt;/h3&gt;

&lt;p&gt;This variation explained for every target group:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;business,&lt;/li&gt;
&lt;li&gt;webmaster,&lt;/li&gt;
&lt;li&gt;party animal,&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;for what they should use popify.me. But it was 1 click away and only 1% of visitors clicked on it.&lt;/p&gt;

&lt;h3&gt;Variation 3&lt;/h3&gt;

&lt;p&gt;We dumped the big sign about juicy coupons and told &lt;a href="http://codeartists.com/post/19458162426/we-let-popify-me-into-the-wild"&gt;the story behind popify.me&lt;/a&gt;. Out of the variations with a with a price tag, this one was the most successful.&lt;/p&gt;

&lt;h3&gt;Variation 4&lt;/h3&gt;

&lt;p&gt;This one was basically the same as Variation 1, but with &lt;strong&gt;no price tag&lt;/strong&gt;. It had a 6% engagement rate. The highest of all.&lt;/p&gt;

&lt;h2&gt;Conclusion &amp;amp; Your suggestions&lt;/h2&gt;

&lt;p&gt;We expected a lot more engagement from 2000 users. There were around &lt;strong&gt;50 coupons&lt;/strong&gt; created and &lt;strong&gt;5 embedded&lt;/strong&gt; on the web sites. We got a lot of LIVE support and HN discuss questions about possible use cases for popify.me, so obviously we didn’t communicate this good enough.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;price tag&lt;/strong&gt; was also a big limitation. We’ll drop that, because we don’t have any expense with the site as we are using HipHop standalone server and Redis and can serve a gazillions of coupons with a load of 0.1.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;story&lt;/strong&gt; reflected good and it seemed that if the visitors get the point they are more likely to engage more. We’ll of course have to work more on our story-telling abilities, but that’s fun stuff anyway.&lt;/p&gt;

&lt;p&gt;What would be your thoughts on how to introduce and explain popify.me for people to pick it up faster? Please leave a comment.&lt;/p&gt;

&lt;h2&gt;Plan&lt;/h2&gt;

&lt;p&gt;Since we think that telling the story is the best way to go, we’ll loose the big juicy sign and make 4-5 stories for different verticals to see which ones users like the most. We still have a constant influx of visitors from other sources than HN and I hope that this follow-up generates some more buzz. I’ll follow-up :)&lt;/p&gt;</description><link>http://codeartists.com/post/19458870391</link><guid>http://codeartists.com/post/19458870391</guid><pubDate>Thu, 07 Apr 2011 00:00:00 -0400</pubDate><category>popifyme</category><category>popify</category><category>hackernews</category><category>ycombinator</category><category>coupons</category><dc:creator>breakbit</dc:creator></item><item><title>CodeArtists invited to Y Combinator S11 interview!</title><description>&lt;p&gt;CodeArtists team was invited today, to discuss &lt;a href="http://doublerecall.com"&gt;DoubleRecall&lt;/a&gt; in an interview at Y Combinator.&lt;/p&gt;

&lt;p&gt;This is a first for the Slovenian startup community and for us all. We&amp;#8217;re extremely proud about this achievement. We know this is only a first of many steps for us. There are hundreds, if not thousands of applicants and our team was selected among few other most promising teams from all over the world.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ycombinator.com"&gt;Y Combinator&lt;/a&gt; is probably the most renowned seed-stage startup funding firm in the world. It&amp;#8217;s based in Silicon Valley.&lt;/p&gt;

&lt;p&gt;We worked really hard with DoubleRecall and we&amp;#8217;re thrilled to bring it to the global market with the help of some of the best startup people out there. We know that it will be hard work, but we are looking forward to breathe in some fresh knowledge and guidance from &lt;a href="http://paulgraham.com"&gt;Paul Graham&lt;/a&gt; and the rest of the Y Combinator team.&lt;/p&gt;

&lt;p&gt;Today was a hard working day like every other, but we&amp;#8217;re happy with that. We do all of these things, because we believe in them.&lt;/p&gt;

&lt;p&gt;Rok G and Robert also did an amazing job for DoubleRecall today in Paris, presenting the solution to a gathering of Europe&amp;#8217;s most premium financial publisers. In the meanwhile Rok K was working on PR and launch of popify.me in the Tehnopolis office, alongside &lt;a href="http://miha.rebernik.info"&gt;Miha&lt;/a&gt;, who created another DoubleRecall transformer page for a Finnish magazine.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;re a strong team and all good friends. We can&amp;#8217;t wait to show our best in the US and make DoubleRecall a huge success.&lt;/p&gt;</description><link>http://codeartists.com/post/19459696359</link><guid>http://codeartists.com/post/19459696359</guid><pubDate>Thu, 07 Apr 2011 00:00:00 -0400</pubDate><category>ycombinator</category><category>doublerecall</category><dc:creator>breakbit</dc:creator></item></channel></rss>
