Creating an API Service with YQL

I spent a few days last week in New York City at Yahoo’s Open Hack All-stars event. At this hack day, I was mentoring a team of 3 students from the University of Texas who set out to create a hack that allows you to control a media experience on your TV by using your iPad.

For this hack, they needed to talk to search APIs from 4 different services (Youtube, Justin.tv, Flickr, Netflix), parse the results, and display a thumbnail for each item with a link to play/view it. Traditionally, this would be a rather bulky iPad application where you’d have to include all the code and logic to communicate with the various JSON, XML, & ATOM service APIs, parse the results, combine them, and finally render the content. Likely, the HTTP calls would be synchronous, which would certainly present some issues as you get to 5+ APIs and you have to wait for one response to return before making the next.

Alternatively, you could create an API service that will do all of this for you. When that option was presented, I immediately realized YQL would be perfect for this task. Why?

  • It can communicate with any HTTP-based APIs, asyncronously, so your response time is always as fast as the slowest API you have to talk to
  • Use custom JavaScript to parse the results and form the return set
  • Reduces the number of requests your client makes to a single HTTP request

So, I strapped on the headphones and began coding. A few hours later, here’s the result. It’s YQL datatable that heavily uses the <execute> feature, which allows you to run arbitrary JavaScript. Within <execute>, you get a simple library that allows you to do things like parse JSON, make HTTP calls, and create XML structures with E4X. The datatable code is pretty straight-forward really. Here’s the service to talk to, the URLs to send the search query to, and the callback to parse each result set. Now go!

The beauty of this YQL datatable is that you have now created a fully-functional high-performance API server without the need for a server of your own to run it on.

Here’s a JSFiddle of the script in action. Click the play button to see the combined search results.

You can also toy around with the query in the YQL console here.

If you are interested in learning more fun stuff you can do with YQL, here’s another post, How-to: Secure OAuth in JavaScript

Learning JavaScript

So you want to learn JavaScript huh? I can’t blame you, it’s a pretty rad programming language. Well lucky for you, it’s a really easy language to pick up and learn. You can get started with the language without spending a penny on a compiler, an IDE, or any instructional material. Heck, you already have a computer capable of running JavaScript. I know that because every modern web browser has one, and that’s how you are viewing this blog post.

I’m approaching this post as an introduction to JavaScript for someone who is already a programmer (novice or advanced, doesn’t matter). An introduction to programming would be an entirely different post.

Without further adieu…

Tip #1: Start by Reading the Wikipedia Entry

Yeah, we’re really swinging for the fences now, this is a tough one. You’ll find that entry here. Read it, thoroughly. It’s really helpful to get some background information on the language, the history, and various implementations of it. It’s helpful to understand that JavaScript is a standardized language, with many “engines” available to execute your code. There’s no single company behind the language. Also, forget that JavaScript has anything to do with Java. It doesn’t. It was just a horrible name for a language that wasn’t supposed to be very useful. Well, it turns out it was, and we all accept that it’s a horrible name and have moved on. C’est la vie.

Tip #2: Learn it Outside of a Browser!!!

I’m going to assume you have some experience with another programming language. Odds are likely it is PHP, Ruby, or Python. Those are all scripting languages, which means it isn’t compiled prior to runtime, instead it is read by an interpreter and executed on the fly. Well, JavaScript works the same way, there’s no compilation step you have to do prior to running a program. So, download Node.js and start writing some basic scripts. At this moment, Node.js only runs on OSX and Linux, so if you are running Windows, then ok… You can either visit jsbin.com or use the JavaScript console that comes built in to Chrome. Windows support for Node.js is coming soon though (late-summer 2011).

The reason I say learn it outside of a web browser is because you should approach JavaScript just like you would any other programming language. Only focus on its standard library to start. If you start toying with it in a web browser, you all of a sudden have access to the DOM and the BOM APIs, and then you’ll be distracted by learning HTML, CSS, which will likely be frustrating and lead you to a library like jQuery or YUI. Just don’t do it. Once you get comfortable with the syntax, scoping, and prototypal nature of the language, then proceed to use it inside of a web application.

Tip #3: Read Some Books

I highly recommend Eloquent JavaScript to start, because it’s a great book, and it’s free! After that, check out a few other of my favorites; The Good Parts, High Performance JavaScript, and Pro JavaScript Techniques. You can buy them all used off of Amazon for under $15 each.

Tip #4: Watch some videos

The YUI Theater is an excellent resource for anything front-end related. Some of it is focused on YUI, but there are quite a few videos that are just about JavaScript in general. The Crockford on JavaScript lecture series is amazing. Must watch!

Another video I came across recently was Alex Russell’s talk at Google.io 2011, “Learning to Love JavaScript“. It is probably the best introduction presentation to the language I’ve seen.

Tip #5: Get Involved in the Community

JavaScript meetup groups are popping up in every major city around the world, and there are many major JS-related conferences/events every year. Go to Meetup.com and search for “JavaScript” in your area. Attend a meetup, meet some fellow nerds, and ask them about their learning experiences with JavaScript. Don’t see one in your area? Create one! I did, twice.

If you really get into it, attend JSConf.us or JSConf.eu. They are the best JS-related conferences out there.

If you are anti-social and don’t want to get out and meet people, don’t worry, there’s a large community on-line as well. You can find us in #javascript on Freenode IRC. I usually hang out there (user: dgathright), as well as #yui, #jquery, #node.js, #html5, and many others. If you see me on there, ping me and let me know you saw this post and I’ll give you an internet high-five. Also, join the JSMentors mailing list. Its whole purpose is to help newbies like you learn the language we love.

Tip #6: Ignore W3Schools!

There is a plethora of ancient JavaScript tip sites that haven’t been updated in 10+ years. They often contain horrible, and sometimes incorrect, examples of JavaScript code. Instead, visit the Mozilla Developer Network’s JavaScript documentation. W3Schools is so bad, it even spurred W3Fools.com.

Tip #7: Be Curious

There are more discussions about JavaScript and code posted per day than time you have to actually read it. That means there is an unlimited supply of information out there about the language, seek it out.

Well, those are the tips that immediately come to mind. There’s quite a few more ideas, blog posts, tools, resources, services, etc… that I’d love to recommend, but you have more than enough to get started. Now go get coding!

The Best Career Advice You’ll Ever Get

The Huffington Post just posted an interview with Marissa Mayer (“Google Exec Marissa Mayer Explains Why There Aren’t More Girl Geeks”) in which she explained why she chose Google over 13 other companies she had job offers from out of college.

“Work with the smartest people you can find, do something you’re not ready to do, find an environment in which you’re very comfortable so you can find your voice, and work for someone who believes in you — because when they believe in you, they’ll invest in you.”

I couldn’t agree more. For some people, that’s Google or Facebook. For others, that is a startup. For me, that encompasses every reason why I’m at Yahoo.

iPod Killer Found, pt 3

Back in 2006, it was becoming very clear that the iPod had so little competition, that it could continue to grow, and grow, and grow, until… what? What would finally displace the iPod? Something had to come along at some point, right? So 5 years ago I wrote a post called “iPod Killer Found” where I hypothesized what this mythical device would be. Here’s a small list of the feature-set.

  • Media player
  • Good quality video camera
  • Large amount of storage space
  • Doubles as a cell-phone
  • Easy access to a store to get new media (free and purchase)
  • Always-on broadband internet access
  • Allows access to media sharing services like Flickr and YouTube
  • Exchange integration with “Push” email
  • Access to GMail, Hotmail, and Yahoo accounts
  • Has to be “cool” and easy to use

No one at that time thought that Apple would eventually be the company that killed the iPod. In 2008, I acknowledged this fact when the iPhone SDK was released (“iPod Killer Found, pt 2“). At the time, the iPod was still seeing growth, but it was clear what would eventually happen as more and more people bought iPhones and ditched their iPods. I joined this club a few weeks ago as I retired my iPod Touch and replaced it with an iPhone 4S. Millions of other people share a similar story.

Here’s a sales chart that shows what so many have predicted for a while, the iPod is dying.

Apple hasn’t officially killed it yet. I’d imagine they will in 2013, but won’t be surprised if it happens in 2012. It sure was a fun ride. Hell, without the iPod, I’d be willing to say there would be no Apple today.

In 1999 Apple was 90 days away from bankruptcy. The iPod was released in 2001, and it’s undeniable that the iTunes platform, and all the revenue it generated for the company, has propelled it to where Apple is today. It transformed Apple from just a computer company, to a media/technology company. For so many people, the iPod was a gateway drug. It was a cheap introduction to Apple products. My first Apple product was a 1st gen iPod Touch. Once you feel the sense of design and simplicity, you become curious, and accepting that maybe Apple products are the right choice for you. A few months later I bought my first Macbook Pro.

The iPhone has done the exact same thing, except at an accelerated pace. Since 2007, in 4 years Apple has sold 100 million+ iPhones, and that number grows faster with every iPhone launch. In 10 years, the iPhone has only sold 300 million and will likely not see 400. I say “only” as if it is an underachievement. It’s a remarkable achievement, but compared to the iPhone? If the iPhone 4S doesn’t break the record sales in 1 quarter by the iPod (Q1’09), the iPhone 5 will, with no slowdown in site.

Well, I guess it’s time to start thinking about how Apple will inevitably kill the iPhone. Oh, that won’t happen? People said the same thing about the iPod in 2005.

Splitt

Growing up in Kansas City, I spent quite a few summer afternoons at Royals games. My grandparents had season tickets, front row, just next to the home dugout. Amazing seats. It pretty much felt like you were on the field. As much as I love some of my other teams, there’s a certain connection you have with your baseball team. I suspect that is largely due to the fact that they play just about every night, 162 games per season. If you are a fan, you are in it for the long-haul. It takes commitment.

Royals fans are a great bunch. I’ll always view Kansas City as a baseball town, no matter how good the Chiefs are any given season. That’s especially remarkable considering the fact that we’ve only had a single winning season since we won the World Series. FYI, that championship happened 25 years ago, if you didn’t know. Us Royals fans know. It’s always in the back of our minds as we hover around the .500 mark anytime after April. “This is the year, we’re gonna do it!” is what we think. Most fans say that about winning the division. Not us. We just want 82 wins in one year, a winning season. Just once, and then we’ll build from there. Baby steps. Progress.

Over the stretch of a 162 game season, most baseball fans will watch or listen to dozens and dozens of games. There’s a connection you feel with the guys in the booth, a one-way bond that is developed over hundreds of hours of listening to their narrative. I can literally hear the Royals announcers in my head as I write this and make their voices say anything I want. I know them that well. Their catch phrases. Their quirks. Their jokes. I feel like I’ve known them my whole life, yet never met them once. I’m not even sure I’d recognize them if seen in person, but I could recognize their voice from across a crowded room.

Tuesday night, one of our announcers lost a battle with cancer. When the news came out last week that Paul “Splitt” Splitorff was ill, the rumors swirled that he had less than a week to live. It was a shock. We all suspected he wasn’t in great health, but no one thought it was something this bad. Less than a month ago he was calling a game. Two weeks ago he was doing the Royals postgame show. People don’t just… go like that. Do they?

Unfortunately, yes.

As I watched the Royals vs Baltimore game the day of his passing, the Royals TV broadcast observed an inning of silence for a man who gave 2/3s of his life to the organization. He was one of the first players drafted by the new expansion Royals in 1968, and pitched wearing royal blue all 16 years until his retirement. After his retirement, he began an even longer 24-year career as a broadcaster with the team.

He wasn’t the greatest pitcher the team ever had, but he still holds the record for most won games. He wasn’t the greatest announcer the game has seen, but he was ours. He was mine. He was a constant. Every night you know you can turn on the ball game and listen to the same guys call a game.

Broadcasters are special. So much has changed in your life, but they’re still doing the exact same thing they were decades before. The day you graduated high school, they were calling a Royals game. The day you got married, they were calling a game. The day you had your first child, they called a game. The day your kids graduated high school, those same guys are calling yet another game from the exact same booth for the exact same team.

Inevitably though, change must occur, and the next generation is given their chance. Sad that this time it happened sooner than it should have.

We’ll miss you Splitt.

Planting Seeds

6 years and 6 months ago I was a recent college grad, unemployed, and recently fired from my computer sales job. I was horrible at sales. Not because I’m not social and can’t communicate, but because I always viewed myself as being on the side of the customer, not the employer. “No, you don’t need that, it’s twice as expensive as this model, and you won’t use most of the features. Here, this one is a better fit for you. Actually, you probably don’t even need this at all.

Needless to say, sales managers don’t really like that attitude.

So as a 24 year old (f)unemployed person, how do you spend your time? Trying to sell a professional sports team, of course.

Alright, that statement deserves a little explanation. If you know me, you know I’m a huge soccer fan. I’d been attending Kansas City Wizards games since Major League Soccer’s inception (1996) and was very involved in the KC team’s supporters group. Well, a few days after I was given a pink slip, on Dec 9th, 2004 the Wizards ownership group announced they had pretty much given up hope on the team and were putting it up for sale. That was pretty devastating for us fans. We knew there was little chance someone was going to come in and buy an MLS team in Kansas City. If they did, they were buying it to move to another city. There wasn’t much hope in keeping our team, but we weren’t going to lose it without a fight.

Being without a job, I had more than enough time to take the initiative and get the ball rolling. I registered our name (Heart of America Soccer Foundation), wrote forum posts, sent out emails, made phone calls, hosted a wiki for us to organize, etc… It was a busy time for a lot of us. Within a few weeks, we were having meetings, internally, with politicians, and with potential ownership groups. Our goal was to make the city and fanbase as attractive as possible to anyone interested in making a significant investment in the team. We of course weren’t the ones selling the team, but we could make a pretty convincing argument that Kansas City was the right home for whoever was buying it. It was a collective voice that needed to be heard.

While we organized & communicated mostly online, early-on we were without a website, so that needed to change. WordPress of today would have been perfect for the task, but this was 2004, so it was pretty unknown at the time and certainly wasn’t as robust as it is now. I had built a few web sites before, dabbled in PHP, HTML, and CSS, but had never built anything too special and certainly nothing professional appearing. However, that didn’t discourage me, and I was excited for the challenge of learning how to build the site from scratch. Luckily, we had a talented designer in the group, so all I had to do was the coding. Off I went.

Because of how much fun I was having building the HASF website, I started to have the confidence that maybe I could turn my long-time programming hobby into a career. Within a few weeks, I had my first interview for a web developer position at a local startup. During that interview, I was asked all the typical questions, some technical, and some non-technical. I was doing ok. Well, maybe. My lack of professional experience was pretty evident, cause I had none. Towards the end I was asked, “Do you have a website you’ve built that you could show us?

Luckily…

Sure, I just built one a few weeks ago“, and we pulled up hoasoccer.org on the projector.

I was pretty proud of it, and they could tell as I enthusiastically talked about all the things I wanted to eventually do with it.

Later that night, I got a phone call, and a job offer. Accepted!

As I ventured into a new career, my involvement with HASF had to take a backseat. Oh, I was still involved, but I just didn’t have enough time to spend the majority of each day as the COO of a grassroots organization. At that point, more qualified individuals took leadership roles and did an amazing job. It was a long process, but on August 31st, 2006, the team was finally sold to a local ownership group for $20 million. Mission accomplished!

Well, mission accomplished as far as HASF was concerned. There was still a massive uphill battle for the new owners to get a stadium built for the team, ensuring its long-term home is Kansas City. Luckily for them, some of those heavily involved with HASF joined the new ownership group filling a variety of roles. It’s a very talented, passionate group of individuals. While I worked on building my career, they continued on the journey to build a world-class soccer stadium right in the heartland, in Kansas City. I was rooting for them every step of the way.

At the same time, in 2007 I was working as a developer at an advertising agency, and not having very much fun there. Jeff, a friend from HASF, emailed me one day about a meeting with a family friend of his who was working on a startup. We heard the pitch, and the challenge was exciting. I was in the process of buying my first home, so leaving a steady job and going month-to-month contract at a web startup was a pretty dumb idea. My mom disliked it, can’t blame her. But, I took it, and had an extremely satisfying 2.5 years there. It even directly led to the next chapter in my career.

Fast forward to today, a journey that started on Dec 9th, 2004 is going to conclude on June 9th, 2011 with that first game at LIVESTRONG Sporting Park, home of Sporting Kansas City (formerly Kansas City Wizards). That’s 2,374 days of hard work one group of people have done to accomplish something uniquely special. I now live in Los Angeles, but am making the trip back for the first game in the new stadium this week. For myself, it’s going to be pretty amazing walking into that stadium for the first time. There’s a personal connection. But I can’t even imagine what it will be like for those people who have been involved with every step of the process.

It boggles my mind to think what I’d be doing if I didn’t wake up one day and decide I wanted to help save a sports team. If I don’t co-found a non-profit organization that had nothing to do with technology, I likely don’t get that first programming job at a startup. If I don’t work at that startup where I learned what it takes to build the engineering side of a company, I don’t get the experience to actually lead the next startup. Well, that next one is what directly led to where I am today and the new position I’ll be starting in a few weeks.

The takeaway from this story is that you need to be driven by your passions. This stadium’s story very likely could have happened without my involvement early on. But the fun part is, it did happen with my involvment. When you are motivated by things that you love, you’ll make awesome things happen. Continually plant seeds for for the future, because eventually some of those seeds will turn into trees.

You never know, someday one of those trees might look like this…



Photo credits:
Facade: Ramsey Mohsen – Flickr
Rendering: Wikipedia
Grass: Flickr

Joining YUI

It seems like just yesterday I accepted a position with Yahoo and began a new adventure. These last 18 months have been an incredibly exciting time in my life, and am very thankful to have been given the opportunity. I can confidently say that Yahoo is -the- best place to work as a front-end engineer.

Well, the next chapter is about to begin.

Tweet: Exciting day. Accepted a position with the YUI team at Yahoo. Yes, that means I'll be moving to NoCal. Watch out San Fran! I'm comin for ya.

(Note: I’ve since learned it is actually “NorCal”, not “NoCal”. Me = California noob.)

What is YUI?

YUI (mostly pronounced “Y U I”, sometimes “Yooey”) is an abbreviation for the Yahoo User Interface library. It’s a project that began in 2005, and was open-sourced in 2006. It is primarily a JavaScript library, but also contains some CSS components as well (see: Grids, Reset). It is used extensively across just about every webpage Yahoo has, and it is popular externally as well.

Continue reading

On: The Engineer

(Most of this post was written a few months ago and for whatever reason it has been sitting in “draft” status for a while. Figured it was time to finish it up and publish)

According to Wikipedia:

“Engineering is the discipline, art and profession of acquiring and applying scientific, mathematical, economic, social, and practical knowledge to design and build structures, machines, devices, systems, materials and processes that safely realize solutions to the needs of society.”

One morning I was watching Carol Bartz’s interview at the Web 2.0 Summit. John Battelle asked her the question about acquiring engineering talent in the software/web world. When he asked that question, I stopped what I was doing and focused on the conversation because it’s important to me that our CEO understands what motivates us. If she doesn’t “get” it, then the company has a serious problem. Here was her answer:

[Engineers] want a really interesting job to do, they want to have the tools to do it, they want to work on large data sets and large problems, and [Yahoo] has that.

Exactly what I wanted to here. And it’s not just lip-service, there is really awesome stuff we’re working on at the moment, things that haven’t been done elsewhere, so it is clear she does get it.

Then, a theme began to emerge for the day. A friend that works in developer relations at HP/Palm tweeted…

Continue reading

Google shutting down the Translate API

When I have conversations with people about what excites me in technology today, I usually start with the fact that the Web is breaking down barriers in a way we’ve never experienced before. It is simply amazing that anyone is free to publish anything they want whenever they want, and is it instantly available for global consumption.

Today, 2 billion people are on the internet. That means nearly a third of the world’s population has access to Wikipedia, Google, Yahoo, Twitter, Facebook, etc… The Web has finally given us the chance to globally communicate. The only thing restricting us at this point isn’t a technical barrier, but instead is a language barrier. Linguists estimate there are between 5,000-6,000 currently spoken languages on the planet. Yet, very few of us speak more than one or two of those. More than ever we need free & accessible ways to easily translate between languages, allowing us to communicate with a global audience.

Since 2008, we’ve have that. The Google Translate API. It’s an API (application programming interface) that allows you to programmatically send text to Google, and they will translate it for you, for free. It’s an amazingly useful service that I have in one of my Twitter clients to instantly translate any tweets I can’t read.

Sadly, yesterday they posted this message on the API’s page.

Important: The Google Translate API has been officially deprecated as of May 26, 2011. Due to the substantial economic burden caused by extensive abuse, the number of requests you may make per day will be limited and the API will be shut off completely on December 1, 2011. For website translations, we encourage you to use the Google Translate Element.

In other words… “This is why we don’t have nice things”

Very disappointing, especially for a company who set out to “Organize the World’s Information” a decade ago. One would assume the goal of organizing is to make it accessible. Guess not.

When Google implemented the Speech Input API in Chrome, my mind instantly blew up with ideas. I loved knowing that we were so close to having an application for your mobile device that allows you to say something, and it will instantly start translating it into text of any language.

Here’s an example of how easy it could be.

<html>
    <input type="text" speech id="foo">
    <textarea id="translation"></textarea>
    <script src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">
        function translate() {
            google.load("language", "1");
            google.setOnLoadCallback(function() {
                var native_text     = document.getElementById('foo').value;
                var native_language = "en"; //english
                var target_language = "es"; //spanish
                google.language.translate(native_text, target_language, native_language, function(result) {
                    document.getElementById("translation").innerHTML = result.translation;
                });
            });
        }
        document.getElementById("foo").addListener("change", translate);
    </script>
</html>

You could solve a problem humans have had for thousands of years, in about 5 lines of JavaScript code.

Well, starting Dec 1st, 2011, you’ll have to use another service.

There’s no doubt in my mind we’ll get this type of capability in the near future, I’m just disappointed Google decided it didn’t want to be involved in solving these kinds of real, human problems.

Hopefully Google reconsiders this decision. To help, go post a comment on the Google Code blog.

Some thoughts on Twitter vs Ecosystem

So Twitter is once again in some hot water with their developer community. After a well-intentioned, but poorly executed suggestion to their developer community that they stop working on developing clients and instead work on “vertical” ideas, the feedback they’ve received has been less than ideal. You can read the original post at “consistency and ecosystem opportunities“, and some of the media coverage here, here, and here.

Some developers are understanding, others are irate, and many are still pretty confused about what exactly this all means. I guess I’d put myself in the 3rd (“confused”) group. But I guess the one thing I do know, is that it is clear these “suggestions” and TOS updates are directed at UberMedia in order to prevent them from forking their portion of the Twitter user base. But, now the rest of the community has now unfairly been dragged into the mix.

As someone who has been doing development on Twitter-related projects since 2007, I figured I’d throw my 2 cents into the mix and give Twitter an idea of where they went wrong, and how they can fix it. I figured it was worth a repost here on my blog.

Link to post.

My 2 cents…

The reason for the perceived mixed messages for some of us is because many developers don’t, and never have been interested in doing Twitter development as a business. I’ve created a dozen Twitter clients & apps over the last 5 years, some of which received enough users and press coverage that I could have attempted to turn it into a business, but I didn’t. Why? Because it doesn’t interest me. I do it for the challenge and the learning experience.

So, the things we hear Twitter saying are “Don’t build clients anymore” as well as “Client apps make bad business”. Well, first, as long as the APIs are active and it’s not against the TOS, I’m still going to build, develop, and use my own clients. Second, I don’t care that it makes “bad business”, that’s isn’t a concern to me. Third, developers can determine for themselves what seems like a smart business decision or not. Fourth, frankly, Twitter Inc has never been regarded as an expert in monetization strategies.

Plus, this is info we already knew. For the most part, building a company whose main product is a Twitter client hasn’t been a good business decision for a few years (if ever, outside of a lucky few). But on the other hand, there are still markets where it could be good business. For example, where is the official Twitter client for webOS? Messages like “Don’t build clients anymore” and no official Twitter app on webOS does nothing but hurt the ecosystem for thousands of users. If I were a developer for one of the popular webOS clients, I’d be pretty pissed right now. Heck, as a webOS user I’m not thrilled. I’m sure this is applicable to other ecosystems too.

The point is, Twitter should be more vocal about what it is going to do as opposed to coy suggestions to developers (which some perceive as threats) about what they shouldn’t do. Twitter is going to heavily focus on front-end user experiences across all platforms? Great! Leave it at that. Let developers decide for themselves what are good/bad ideas. Just arm us with the knowledge of your plans, and we’ll worry about our own.

Finally, Twitter, you should be excited to compete with your developers. Much of the innovation over the years has been a product of the developer & user community. Things like mentions & hashtags came from your users. Features like saved searches, lists, trends, and ajax driven clients were inventions of developers years before they made it into Twitter.com. Essentially, “New” Twitter is just a compilation of the best features from all the 3rd party clients. Do not be hostile. Do not attack them with your TOS. Do not suspend tokens without working with the developer first. Doing these things hurts the community, which in turn hurts you. Your users are your product. Not your platform. Not your website. Not your ads. Your users.

- @derek