AIAIO: Our Blog

AIAIO: Our Blog

The pulse and reviews of Alexander Interactive

Come see us at IR Focus Design+Mobile!

What’s the most exciting thing to do in Orlando? Duh! Visiting Ai’s booth at the IR Focus Design + Mobile Conference!

We are at booth #300 — stop by, say hi, and talk about all things digital, Disney, or whatever else is on your mind.


While you’re at it, check out our founders Josh Levine and Alex Schmelkin and attend their talks on Monday. Josh gives you the rundown on the good, the bad, and the ugly in Ecommerce design and Alex teams up with Sharon Rodriguez, VP, Strategy at MetLife, to discuss the central role mobile plays in the now and future of MetLife’s consumer offerings.

Have fun, be safe, and always use the buddy system.


Ai Gives the Gift of Warmth

In November 2013, after reading that New York Cares has received more than 100,000 requests for coats this winter, Ai registered to become a coat drive collection team.

For the past few months, Ai employees and their family and friends have donated over 35 coats to those in need!

Ai Coat Drive

All coats were delivered to the New York Cares Coat Drive Warehouse this morning.  For the next week, New York Cares is still accepting coats at various drop-off locations throughout all five boroughs.

For more information, you can visit the New York Cares Coat Drive website.


Ai’s Year-in-Review

2013 is coming to a close and it’s time for “Ai’s Year-in-Review”. We here at Ai take great pride in our inherent geekiness, and with that in mind, let’s take a look at the numbers:

40: Total number of launches this year.

3: Site launches in ONE DAY –we are BEASTS!

$2 billion: Yes, we said billion. The sites we’ve designed have generated $2 Billion in sales.

2: Babies born to Ai’ers. Congrats Judy and Kelly!

4000: Number of lights hanging around the office for the holidays.

210,106: Miles Ai’ers traveled to and from Tokyo and Dubai on business.

2: New VPs David Ow and Phil Cotty, our Fearless Leaders!

1: New Creative Director. Welcome Julia!

30: Number of visits to Mayor Jack, VP, Integrity & Security generated by the phrase “Integrity Interactive Corporation”

6: Awards we won this year. Ünst Ünst.

5th: Our ranking on Google when you search “Post Mortem” meeting

18,664: The longest trip in miles made by Anna Perez, Ai’s account director, jet setting around the world: NYC > Moscow > Dubai > Tokyo and back to NYC.

1:  Engagement. Congrats Sammy!!

2013 was the year we grew bigger– but more importantly– better. We continued to establish ourselves as people our clients and colleagues look to solve their biggest challenges and to do so with the strategic thinking and beautiful, effective work they have come to expect from us.

Most important of all, we continue to do this work with the passion, grace and integrity that all Morgan Freemans embody.

As we head into 2014, we are looking forward to continuing this trend and pushing the bounds of our technical and creative offerings. 2014 is going to be all about “more”—more innovation, more growth, and more awesomeness.


User Experience as Customer Service

Intuit’s QuickBooks has been held up as an example of data standardization and a robust developer platform.  And Quickbooks is most certainly THE de facto standard for small business accounting software.  But, in recent years, newer entrants like Freshbooks and Kashoo (among others) have been stealing market share, feature by feature, with a better user experience.  Accounting is no fun, but it’s actually a pleasure to send invoices and process payroll with these new platforms.

The mighty Intuit appears interested to buck this trend with its latest product update, the new QuickBooks Online.  They are not bringing the update to market with a traditional playbook touting how many reports the product has or how many banks it can connect to.  Instead, they are focused on Why Design Matters, and how the new look of the app will “create a harmonious user experience,” implying that users should care more about the design than about QuickBooks’ storied permissions levels and sales receipt processing.  It may indeed be marketing fluff, but they’re putting their design money where their UX mouth is in a follow-up post on their blog.

To hush a user that posted something along the lines of  “but I want this feature because it’s best for me,” customer services reps are replying with data.  It’s a UX researcher’s dream:

statistically the recurring page is 34th in the list of most used pages, COA is 15th

Blammo.  Stop complaining.  We did our research and built our product around real user usage and needs.

In that initial reply to the customer, the responding customer service agent (who is so fluent in UX language as to make you think he’s actually a product owner) also mentions that the new QuickBooks finally supports tabbed browsing.  The original inquirer pushes back again, “I assume that if you open some links/functions in a new tab/window, that other open windows will not be updated with a transaction performed in a different tab/window without a manual refresh. Is that so?”

Ever-focused on the user, the agent replies:

We actually worked hard to implement that feature, so it is there. Where it applies is mainly on Customers, Vendors, and other transaction list pages.

And still the user was not satisfied, demanding perfect refreshes of every function: “So if I keep the home page [open]….I should see the bank balance shown on the home page change automatically?”

Ever cool, the UX master replies:

I will pass that use case on to our banking team though and see if we can get that working.

Use case!?  They’re talking to a customer here!  The CSR didn’t take it quite as far as saying he would force rank that user story in their backlog and make sure it’s tracked in GreenHopper, but they sure are training their users that direct feedback is important and will be incorporated into future versions of the software.

Smart move, Intuit.  Every time a customer service agent says use case twin unicorns is born in the forest.


Ai’s Annual Halloween Costume Exchange

One of Ai’s most well-known times of year comes in October when we hold our annual Halloween costume exchange.  The workday will be as typical as any Friday, but with a holiday twist…

Candy everywhere? Check.
Office Decorations?  Check.
All things black and orange?  Check.
Costumes?  Check.  But, not your own – your “victim’s”!

Here’s how things go down leading up to October 31st at the Ai office:

Early October:

  • Everyone’s name goes into a bowl
  • Each person picks a name from the bowl
  • The name you pick is your secret victim

Mid October:

  • You ponder ideas of what you can come up with for a costume for your victim (the costume must be in good taste and keep your victim’s personality in mind)
  • You try not to slip and tell anyone who you chose, but we all know the word gets out to a few
  • You choose a costume for your victim (hand made or store bought)

Early during the week of Halloween:

  • We gather as a company at the Sofaplex to exchange costumes
  • One person starts us off and reveals who their victim is, the costume that has been chosen for said victim, and the rationale behind the costume choice
  • The victim then continues the process by sharing who they chose, and so on…

The day of Halloween:

Ai Halloween Collage

  • The day usually starts out with people walking into the office in costume and therefore tons of laughs and photo-ops
  • Scheduled meetings and calls happen as planned, but there’s never a giggle too distant
  • At lunch time we have a pizza party
  • Once we’ve digested we finish off the afternoon with a parade in Madison Square Park to share our costumes with the rest of the Flatiron District
  • An hour before the work day comes to a close, we end the day with a Halloween-themed office happy hour
  • Finally, once we power down our machines and call it a day, we stay in costume and head out for a night on the town in costume

To get a feel for what Halloween has been like for someone who has participated in this Ai tradition over the past seven years, check out the images below.

2006: ANGEL








Pink Lady


Richard Simmons


Morticia Addams

Why do we all find this so fun?  Because I absolutely never would have been any of the characters above for Halloween unless someone else picked out the costumes for me.  Richard Simmons?  I mean, come on.


Continuous Integration Overload: Dealing with many projects in Jenkins.

Running an amazing CI tool like Jenkins is a great for productivity, especially when you’re testing throughout multiples stages of development.  But what happens when you need to test multiple stages of development, with multiple features and for more than a few projects?

You may find yourself cutting and pasting some Jenkins Execution shell commands from a master template, or rewriting them by hand for each and every instance.


You have to manually set up each project with each environment, and then remember which template you’re using which is frustrating and, more importantly, time consuming work.


In comes Fabric to save the day. 

Fabric is a python based superhero that can deploy, update, sudo or pretty much anything you can do with a bash script, but over multiple ssh sessions!  This means that you can design one master fabric script and have it create or maintain many instances or build environments.

Integrating Fabric with Jenkins.

Using the same helpful Execution shell, we can call a fabric script and pass it parameters with Jenkins’ parameterization.


And then the Execution Shell.


Now Save and Build!  And the next time you push a new feature, just specify the parameters for Jenkins and you’ll never have to worry about individual instance configurations.

Here’s a quick and dirty FAB file that we can use to control many of our deployments.

from __future__ import with_statement
from fabric.api import run, sudo, cd, env

def setup(setup_type):
    if setup_type == 'stage':
        env.hosts = setup_type.stagingServer
    elif name == 'QA':
        env.hosts = setup_type.qaServer
        raise ValueError('Invalid Setup Type')

#Run commands through sudo - username

def update(user, environment, local_branch, remote_branch):
    run('sudo su - %s -c \'cd ~/%s/ && git checkout  %s\'' %
        (user, environment, local_branch, ))
    run('sudo su - %s -c \'cd ~/%s/ && git pull %s\'' %
        (user, env, remote_branch,))

def clone(user, path, gitpath):
    env.user = user
    with cd(path):
        run('git init')
        run('git clone %s' % gitpath)

def updatewithuser(user, directory, branch):
    run('sudo su - %s -c \'cd ~/%s && git pull\'' %
        (user, directory,))

def status(user,location):
    run('sudo su - %s -c \'cd ~/%s && git status\'' %
        (user, location))

def clone_with_user(user, location, gitpath):
    run('sudo su - %s -c \'mkdir -p %s\'' % location)
    run('sudo su - %s -c \'cd %s && git init && git clone %s\'' %

def branch(user, location):
    run('sudo su - %s -c \'cd %s && git branch\'' %
        (user, location))