We came, we saw, we hacked…along with an office full of excited hackers at  DowncityJS in Providence, RI this past weekend. Huge thanks to Betaspring for hosting, Chris Meiklejohn of Basho and all the other sponsors.

A great crowd came out on a chilly weekend to see what hackers from as far as DC could conjure up in a mere 24-hour JavaScript Hackathon. One of the standout projects, David Trejo put together a simple and easy to use color identifier with some surprisingly useful features called Colorslice. Our own Art Gibson created, Grillin Mah Bus, a real time feed which tracks social media interactions of people on a public transit bus.

We provided our API for the event and some prizes for best use of our API as a solo participant and as a group, we were pleased with the outcome!

The winners?

Best use of our API: Cheer Me Üp, a service which allows you to send a friendly and uplifting message to someone having a tough time. They’ll receive it with cat gifs and all, embedded from sites like Tumblr and Reddit using the Embedly API.

Best Solo: Thom Nichols for Xirq.us, they used Embedly to embed photos and media within curated tweets by the location they’re near to let you know in one convenient spot what exactly is going on in an area.

Best Design: Aaron and Aaron created Meet, a dating app that won’t allow you to talk to your match before meeting up with them, it cuts to the chase by only providing the option to meet your match.

Best Team: Ryan Laughlin, Liz Neu, and Kyle Nichols for Thumbwar, which allows users to sync up with a friend over mobile, tablet or laptop connection to play a bundle of mini games with each other to pass the time or to unleash that competitive side if only for a few seconds.

The bottom line is, we had a blast! The four of us, Art, Andy, Kawan and myself enjoyed an engaging and often silly weekend with some new friends and replenished our creativity tanks.Shout out to Gabe, Giles, Samuel, Graham and Vinh 
of Cheer Me Üp and Aaron and Aaron for Meet. We’re looking forward to seeing the real thing and will definitely be sending some pleasant messages to some unsuspecting mopes.


Posted 1 year ago by embedly-team
Embed This

Hackers, makers, and designers in Providence, we’re pumped about DowncityJS this weekend.  DowncityJS is a 24-hour hackathon in Providence starting on Saturday and going into Sunday. 

We love using javascript in our applications. In particular, we use NodeEmberjs, and D3, and build it all with Yeoman.  What else do we love about JS? Everything is async.  Also, you can close the gap in the creative process- you change something and immediately see the results. 

Andy, Art, Nina, and I will be coming from the Embedly team.  We’re happy to help out if you want to play with the API, from throwing around ideas to pro-tips.  

Embedly does all the parsing for you, pulling relevant information for embeds given any url.  You can get started by taking a look at some of our endpoints, in particular the power that is objectify. One of my favorite features is the Article Extractor, which parses an article or blog post given a url.   This is great for getting tons of articles ready for some heavy NLP.  Play with the article and media links in your Twitter stream. The best part is that everything supports JSONP, so you can easily build beautiful JS client heavy apps. 

Oh yeah, one more thing.  There will be several special features you can use that we will talk about at the hackathon, so swing by and get a sneak peek.

Update: I’m bringing a Kinect and Andy will be bringing a helicopter. 

Posted 1 year ago by embedly-team
Embed This

I had the best conversation this morning while getting off the train. During off-peak hours, the Embedly customer service number goes directly to my cell phone. Any time I don’t recognize a number, I put on my nice voice and answer.

This time it was a nice elderly man from PA, that we will call Gerald. After a rather awkward start, Gerald says he’s having problems with his computer. He says he’s getting annoying popups asking him to allow a video to play and Gerald doesn’t want that. He just wants to watch the video, no questions asked.

Side note: I actually thought someone was messing with me at this point. “Uncle Bill, is that you? You got me good you wanker”

Gerald, obviously frustrated, wants someone to fix this, but I have absolutely no idea what he’s talking about. Apparently this happens every time he goes to his favorite website and clicks on an embedded video. He then admits, he’s “not all that great with computers”. 

Ok, so is this favorite website using Embedly? Has he figured out how to install the Twitter plugin? Are some of the embeds we are serving showing nasty error messages to users? How did Gerald get this number? Why are we doing this to Gerald? WHY WOULD WE DO THAT TO A NICE OLD MAN WITH 8 GRANDCHILDREN THAT LOVE HIM DEARLY AND CALL HIM POP POP?

Making a guess I ask if he’s running Windows and Internet Explorer. He knows he’s running Windows 7, but he’s not quite sure about this Internet Explorer thing. Well Gerald, it’s probably in your Internet Explorer privacy settings to always allow these types of videos to run, but I have no working knowledge on the matter. I still don’t know if that’s the right answer by the way.

Gerald: “Am I even calling the right person?”

Sean: “No, I’m just general tech support at this point.”

Gerald apologizes, thanks me for my time, we say our goodbyes and the conversation ends.

Why did Gerald and I have a five minute conversation this morning? 

Gerald, so fed up with his problem, starts Binging around and finds Embedly. He then spends time digging through the site to find a phone number, which is not an easy feat because ours is buried. A man “not so good with computers”, but so determined to fix his pain proves he isn’t exactly bad either. 

Gerald, you are a good man.

When you are so close to a problem one can sometimes forget people like Gerald exist. Just a man trying to watch a video on his favorite site. Gerald, I hear you buddy and I want to make your life better.


Posted 1 year ago by embedly-team
Embed This

Low and behold Twitter has officially joined the world of video and we’re happy to say we’re right behind them as we add Vine to our list of providers. The video service allows users to create and share a short looping video (no longer than 6 seconds) on their twitter feed. Pretty nifty huh?

Vine co-founder and general manager Dom Hofmann explains on USA Today

"Posts on Vine are about abbreviation — the shortened form of something larger. They’re little windows into the people, settings, ideas and objects that make up your life. They’re quirky, and we think that’s part of what makes them so special.

Now go enjoy this Peanuts Vine embed!

Posted 1 year ago by embedly-team
Embed This

We’re about a month into the new year and changes are already rolling out of the Embedly office. Embedly jQuery got a much needed refresh over the holiday season. Long story short, we had a bunch of legacy code in there and it was a pain to deal with all the query params, so we tweaked it.

With the new version we dropped support for everything below jQuery 1.5 to take advantage of jQuery’s deffered objects. I’ll give two quick examples here and and you can check it out for yourself on the fancy new docs at: http://embedly.github.com/embedly-jquery/

The selectors work much the same, but we have modified the input to take in a query hash. This allows the library to be more future proof as we add query arguments.

// Key
$.embedly.defaults.key = 'Your Embedly Key'
// Replace a tags with embeds.
$('#content a').embedly({query: {maxwidth:500, autoplay:true}});

You can also use the API directly and this is where the Deffered object comes in.

// Key
$.embedly.defaults.key = 'Your Embedly Key'

$.embedly.preview(['http://embed.ly', 'http://twilio.com/'])
    // Called once per URL after Emebdly has returned data.
    // Called once with a list of all the data returned.
    $.each(results, function(i, obj){console.log(obj.title)})

That’s our quick little update to Embedly services, now go checkout the code and demo. Let us know what you think:

Code: https://github.com/embedly/embedly-jquery

Demo: http://embedly.github.com/embedly-jquery/inline.html


Posted 1 year ago by embedly-team
Embed This

Earn engagement, don’t force it.

Instagram removed Twitter Cards from their site, the internet freaks out. My god, they are turning their back on the social network that helped them become a billion dollar company.

Every content network was built on the back of a social network. YouTube grew on MySpace. SoundCloud grew on Facebook. Instagram grew on Twitter. The only difference here is that Instagram is leaving. 

Instagram’s problem isn’t Twitter, it’s the medium in which they operate. YouTube and SoundCloud have very rich embeds that users can interact with and be drawn back to thier web properties. Images however, are very static. They take about a second to view and then the user moves on. There is no way to monetize images embedded on other sites; once they go out, not one comes home. They’re kids from Northern Maine.

So, Instagram’s fix for this is to just remove the images, forcing users back to its own properties. If you look at their profile pages, they are optimized to engage users. Heart, Comment, Sign In, DOWNLOAD THE DAMN APP. Discovery is also built right in. Clicking on an avatar brings up more photos and allows me to follow them. Down the rabbit hole we go.


This is a “Growth Hacker’s” dream.

I’m sure that Instagram is going to be better off in the short term with this change. Page views, Downloads and Follows via the web are all going to be up and to the right. Maybe even the old hockey stick, but they should feel dirty. Like walking out of a strip club at 4am dirty.

SoundCloud has taken the exact opposite approach. Their embed contains much, if not all, of what’s found on the site. They earn every click to their property by getting the user interested in the product. Hell, you can even comment directly within the embed. They earn their success the hard way, but I bet they sleep better at night.

So Instagram, let’s talk about these embeds. How about making them an iframe or script tag embed like Twitter? Here, I made you this.

Default View:


When a user hovers over the embed:


And it looks nice inside Twitter:


I didn’t do anything special here, I literally just put your photo page in Pixelmator and started cropping. Seems like you guys could do this and start earning those clicks. You would make users and the internet happy again. No one likes it when Mom and Dad fight.



Posted 1 year ago by embedly-team
Embed This
Mid-Movember Mustache ManiaOur familes are not happy and our face is pretty itchy, but we are sticking with Movember. Before we all sit down with our extended families to reveal what we&#8217;ve been growing for the last 21 days, our team would like to send you off on your Thanksgiving holiday with a laugh.

Mid-Movember Mustache Mania

Our familes are not happy and our face is pretty itchy, but we are sticking with Movember. Before we all sit down with our extended families to reveal what we’ve been growing for the last 21 days, our team would like to send you off on your Thanksgiving holiday with a laugh.

Posted 1 year ago by embedly-team
Embed This

Lets talk about the latest hotness. Embedly has tried a lot of new tech over the years, Node, Ember, Cassandra, Membase and even had a short stint with ____ when it was the second coming. In this episode, Go has set the internet neck beards ablaze, so I decided to give it a try.

Embedly uses Google’s Safe Browsing API to check for malicious URLs and the initital implementation was written before I got here in Python and gevent. It was also poorly written, so as traffic went up, the Safebrowse service went down. 

All the service needs to do is make a few HTTP calls, persist some data and respond to incoming requests. Go seemed like a good fit, at least from what I knew at the time. The following is sort of a recap; what I liked, what I didn’t and at some point I’ll answer the question:

Was Go a good fit?

The Basics

Let’s take a look at the basics of Go: packages, types, goroutines and error handling.

> built-in packages:

Go has a pretty solid set of built-in packages. Coming from Google, it’s not a surprise that Go has a nice set of web-related packages (net/http, net/url, and net in general). http.ListenAndServe() is awesome. I had a simple server running in minutes, and I haven’t had to make any changes even as I put it in to production.

The net packages also include a straightforward HTTP client. Nothing fancy here; it just works.

For dealing with strings, Go defers to the polished wisdom of a family of C-like printf() style functions. I like the control of printf() style format strings, especially when debugging and dealing with binary data.

The strings package provides a good swiss army knife of string manipulation. Split, Join, Trim, HasSuffix, Contains, et cetera. Score 1 for python-like convenience.

So Go survives the test of string manipulation and both creating and handling HTTP requests. Good so far.

Next, we’ll need to interact with our database, Redis. Go is young, so how hard will this be? Fortunately not very; Go’s userbase is strong, and already has a few Redis drivers available.

> package imports and go get:

I was confused when I first looked up how to grab a Go redis package:

import "github.com/simonz05/godis/redis"

What about the package manager? gip, maybe? Nope. I appreciate pypi, but the easy_install versus pip issue sucks, so building package management in to the standard go toolchain is a step forward in my book.

When you run ‘go get’ in the directory of a Go project with this import, the Go toolchain will pull the repository from github, and install the package globally for all of your Go programs to use. This also works with google code, and maybe other sources as well.

How about dealing with those binary HTTP responses?

> strings, bytes, buffers, and slices, oh my!:

Go has strong types. If you want to add a uint32 to an int64, you’d better be explicit about what you want to cast, otherwise the compiler will yell at you.

This C-like behavior forces you to think about the potential overflow or other issues that can be caused by mixing types. It also makes sure you’re doing what you mean to with each individual byte.

This is super important for a language with aspirations to be a systems language. 

The strong typing has also kept me in line when stuffing data into Redis. Types need to agree everywhere. Expressions, function arguments; everywhere. None of this wishy-washy, “whatever, man” python stuff. Now I can be sure that when I pull something out of Redis, it will be what I expect.

So, yes, Go was a fine fit for this problem. But so would be a bunch of other languages.

Does Go add any extra secret sauce?

Of course it does! Here’s a big one:

> goroutines:

Go’s most lauded feature.

The Safebrowse implementation doesn’t require a lot of asynchronous behavior, but I managed to squeeze it in in 2 places:

  • http.ListenAndServe()
  • Periodically making an API call

The first one is obvious, and a freebie.

Every time my Go program serves a request, http.ListenAndServe() spawns a goroutine of the appropriate handler function, which can do it’s thing asynchronously. It took me literally zero extra lines of code to go from serving the most basic, single request, to hitting this code with requests from hundreds of client processes.

Next, Safebrowse requires talking to an external API on a schedule that changes with each API call.

It would have been nasty to set this up as a cron job, so instead I wrote a short runner program to run the periodic API call. It works like this:

// Create a channel for passing wait times
next_update := make(chan time.Duration)

// Create a channel for indicating whether finished
finished := make(chan bool)

for { // what an odd way to spell 'while True:'
    // Spawn a goroutine of the API caller, passing the two channels
    go PeriodicAPICall(next_update, finished)

    // Listen for the wait time
    sleep_duration := <-next_update

    // Sleep the runner for the wait time

    // On wake up, listen for the 'finished' signal
    // (For my application, it's necessary that the previous API
    // caller has finished before doing another API call)

This has worked well, and I haven’t noticed a memory leak, which is always a concern with long-running processes. I’m really happy with this. Go++ (Nobody actually make this a language, please. Yuck.).

This next one is more of a caveat, but it’s important.


With concurrency being a big feature for Go, there’s a good chance you’ll want to give your Go code the reins to your entire processor.

The current default is for a Go program to use only 1 logical CPU. You can change this using runtime.GOMAXPROCS(), or by invoking your Go program with the environment variable GOMAXPROCS set to something greater than 1. You can check how many logical CPUs a box has with runtime.NumCPU(). 

So now, you’re all like “Wow, Go sounds awesome, lets never use anything else!”.

A Rainy Day

Time to rain some reality on this parade. 

> functional programming basics:

Python has spoiled me with built-in comprehensions. A few times I found myself tossed back to the days of setting up an entire for loop for a simple one-line loop body.Map and filter would be nice.

As nice as that extra LOC padding is, these fingers only have so many characters in them. And these eyes… only so many levels of indentation.

This next one is a doozie.

> if err != nil {} (error handling):

I’ve read a bit of discussion of try/catch exceptions versus checking return values, and it feels like one of those programmer wars (e.g. tabs versus spaces).

Throughout development, I would often write

if err != nil {}

as a stub for me to search for later to deal with error conditions.

It felt a lot slower.

In running a web API, you never want some obscure condition to cause an unhandled exception and kill an entire response. I find exceptions to be easier to apply at a high level, then, if necessary, drill down to more specific levels of error handling. With Go (and C) style error handling, you’re forced to handle every individual error separately.

An example of why this bothers me:

If I’m trying to parse a string and 3 integers out of a byte slice, I really don’t want to write the error handling for each integer conversion separately. I’d rather wrap all 3 in a try/catch and deal with the more general error of -any- of them failing.

That said, you do feel a sense of robustness knowing that you’ve at least tried to handle each little error condition; just don’t get caught ignoring (by assigning to _) error return values. This feels like something a systems programming language should do.

So, Go, you win some, you lose some.

The Wrap

Overall, I’m really happy with the completeness of Go.

I didn’t have to reinvent the wheel while solving my problem, and I get good performance (I wish I could quantify this better right now, but for now my confidence in Go will have to do).

A lot of the core web functionality that Python does a good job of providing is also available in Go. This, combined with the care required with a C-like language, makes Go feel like a strong candidate for robust, high performance web programming. The kind of stuff people expect from Google.

Posted 1 year ago by embedly-team
Embed This
Movember Time!Remember remember the first of Movember.The ominous peach fuzz and stubble.I know of no reason why this face-warming seasonshould ever be forgot.
-Andrew Pellett, Embedly Poet Laureate
Movember is an annual event where participants grow moustaches in the month of November to raise awareness and funds for treating prostate cancer.  We decided, as a team, to participate in Movember.  Sure we&#8217;ll stick out, but it&#8217;ll be symbolic of efforts to alleviates men&#8217;s health issues.
Here are our photos as of today, starting out.  As you can see, a couple of us got pretty pumped and already have moustaches.  Stay tuned during the month to see our progress.

Movember Time!

Remember remember the first of Movember.
The ominous peach fuzz and stubble.
I know of no reason why this face-warming season
should ever be forgot.

-Andrew Pellett, Embedly Poet Laureate

Movember is an annual event where participants grow moustaches in the month of November to raise awareness and funds for treating prostate cancer.  We decided, as a team, to participate in Movember.  Sure we’ll stick out, but it’ll be symbolic of efforts to alleviates men’s health issues.

Here are our photos as of today, starting out.  As you can see, a couple of us got pretty pumped and already have moustaches.  Stay tuned during the month to see our progress.

Posted 1 year ago by embedly-team
Embed This

My dream has finally come true. I somehow figured out a way to spend the day writing a post on Gangnam Style. Now if only I could write a post on Mean Girls… 

We want to share Stats with you all, but first let’s look at the rise of Gangham Style and how media events and social networks can trigger massive sharing. 

I’m going to assume you have all seen the Korean gentleman PSY dancing as if on horseback, misting dancing 6 years olds, looking longingly at a scantily clad male, hiding in baths, on the toilet, screaming at yoga pants and generally being awesome. If you haven’t, get off the internet, you obviously don’t appreciate it in all its glory.

PSY posted this video on July 15th, 2012 and it has just taken off. As of writing it has ~406 Million Views and ~3.7 Million Likes. He’s been on SNL, Ellen and The Today Show showing off his finely tuned abs. As for articles, too many to count, but for an example the Wall Street Journal has no fewer than 8 articles on the man.

This sensation has created some interesting data on the rise of one of the most viral videos of all time. Below is the growth of that video over time as it relates to API calls. 


There are some pretty clear spikes here. While it’s hard to pinpoint what caused each spike, we can point out a few examples of how the internet learned about the hyena from Korea.

July 28th:

The first spike can be related to Reddit deciding the video was awesome. This in turn spun off a Gawker article

August 21st:

Katy Perry shared the video on Twitter, the next day we saw a big jump in shares. Gangnam Style was also the #1 song on iTunes for the first time.

Sept 6th:

PSY performed with The Wanted at the VMA’s pre-party show as well as appearing on the VMA with Kevin Hart.

Sept 20-21st:

Gangnam Style broke the “most liked” video on YouTube.

Sept 29th-30th:

Not too sure about this spike. PSY danced with Google’s Eric Schmidt, but that’s like getting the cover of Sports Illustrated. It’s all over from there. 

There are a few exceptions to the rule. PSY’s appearance on Ellen, SNL and The Today Show cause zero noticeable spikes. The transition from TV to the internet seems to be a fickle one.

While the number of API requests is nice, how well is it actually doing? Below is the rank of the video over time as the most popular embedded URL. The lower the better, i.e. being #1 is better than #1000.


Now rank is not just determined by the number of API calls, instead it’s based on a score. The score is calculated based on both the number of times a link is embedded and the diversity of the embed requesters. Hammering the Embedly API repeatedly with one link will have a very small effect on its score, while links that are embedded on many different sites will be voted to the top. This ensures that high-scoring links are from a wide range of sources and popular across the internets. Here is the score chart below.


As you can see Gangnam Style doesn’t show a whole lot of slowing. I would suggest battening down the hatches and riding out the storm in a purple blazer.

Embedly is starting to take a hard look at what’s interesting on the web and how we can better help developers surface relevant content to their users. Content on social networks can be sparse, but if you dig into the URLs you can often gain a deeper understanding about what users are really interested in.

Now, what I really want to tell you about. Today Embedly is launching Stats. Want to know what the most popular URLs on Embedly? You can now see them all in one convenient spot http://embed.ly/stats.

You can filter by day, see the top domains and generally explore a subset of Embedly’s data. It’s definitely data porn, but gosh darn it, it’s PRETTY.


Thanks for playing and I leave you with the these immortal words to live by.

"Dress classy and dance cheesy" - PSY



Posted 1 year ago by embedly-team
Embed This