The Exchange


Code, Writing




Oct 16, 2015

Before we moved, high school aquantaince and college fringe friend Will Chertoff said we would "explode creatively." Chertoff had recently escaped Kansas and moved into my one-bedroom. After two claustrophobic months, we signed on a new house with near-stranger Max Ono.

Chertoff's prophecy came true. Within 30 days, without any of us having prior, genuine native app building experience, we started The Exchange, an audio adventure tour of Portland.

The idea was simple in concept—locations must be visited in order to advance the story, told exclusively through audio. Instead of watching a scene, the user would physically be in the world.

  "tracks" : [
  "objectives": {
    "0": {
      "type" : "audio",
      "content" : "1.0_1",
      "point" : 0,
      "nextValue" : 90
    "90" : {
      "type" : "message",
      "messageType" : "text",
      "content" : "👋",
      "sender" : "Paulie",
      "nextValue" : 100
Mission 0's JSON file

The Code

I'd heard a lot about Swift, but I had no idea where to start—every developer I knew only worked in front-end, Ruby, or PHP. The official book provided some insight, but application organization was totally over my head.

Despite an overwhelming kick-off, Swift quickly became my favorite language. It demands best practices while remaining consistent, incorporates the best parts of JavaScript, and favors clean, Ruby-esque code.

Working in web and front-end, using one language for all functions was a welcome breath of fresh air. Though the views would occaisionally become cluttered with verbose animation definitions, the fine-grain control made up for it. Subtle pops and transitions became irresistable.

Within the app, the architecture started with a singleton-heavy approach, although once multiple inheritance was discovered, the water became much less choppy. The app is powered by directions from static JSON files - no server required.

Each scene (Mission) is divided into incremental parts (Objectives). Once an objective is completed - i.e. reaching a location, the nextValue is triggered until progress reaches 100. By making the progress value of the objectives the keys, Missions could be easily queried and resumed.

For example, every message is an Objective. Once a user reads that message, it triggers the next Objective (another message in the accompanying image).

Ultimately, the codebase weighes at 6,000 lines of Swift with a handful of Cocoapods.

The Exchange

Jeff Rutherford, playing Paulie, about to drop fat lines.

The Script

The initial draft of the script was over 120 pages. It featured giant paragraphs and words that led to stumbling audio demos. The motifs were ground into the listener mercilessly.

No subtlety. No flow. No interest. It fell flat.

After a dozen editors and two complete rewrites, the 100-page script moved into production. The cast read off Google Docs (no printed versions of the script exist) since lines were frequently rewritten in the home studio.

With Max's impressive recording skills and patient co-directing, the script absorbed more comedy and concision. Themes became implied rather than explained.

The purely-audio aspect was both a blessing (very low production costs) and a curse: protomatter and direct explanations were frequently employed.

By the same blessing/curse, emotion couldn't be visually expressed. However, our actors handled the responsibility with ease and conveyed exactly what was necessary for each scene.

TOURIST: An Exchange. We turn the Stenos off. And then we have a conversation word-for-word like real, honest-to-God humans. Everybody leaves with the same amount of words they had in the first place.

PAULIE: I know what an Exchange is, numnuts. No hablo Exchange. We’ve been speakin’ Clapper, so let’s just stick with that.

Mission 0

I know you're new here, but let me tell you something. For long as I can remember it's always been the Poets with the information. Always been the Poets calling the shots. A little pocket of word hoarders that run the whole city. I don't have a voice. Paulie doesn't have a voice. Only you, with your news corner, have a voice. You may not understand it, but When you speak a language that carries no value like we do, no one wants to hear your words.

Gallup, Mission 12

I like you a lot, Tourist, but you have to believe me. The stories of my generation were told in our voice. Now, for better or worse, we hear everything from someone else's lips.

Al, Mission 8

And since the story relies on "The Exchange" as a means of an equal, one-for-one conversation, the word count between characters is often a direct match. It was a detail that usually slowed revisions, but the world had to be believable.

The Design

From the get-go, the goal was to create a wordless interface. There are enough hallmarks of modern UI design to assume the user knows what to expect when they click a floppy disk or see paired tabs.

However, a lack of words can only get you so far. We eventually conceded and included onboarding screens (shout-out to John Resman for those designs). We also enlisted household friend North Bryan to help with some of the branding: he created a logo and a family of icons. With his design language, the screens quickly fell together.






By the end of the project, from conception in late April to App Store approval in mid-September, it was a grinding, humbling process. We learned the hard way how long the Apple takes to accept approvals and changes. We learned a script is a living document. But, the three of us agreed, we'd gladly do it again.

The Exchange

Rowan, Max, and Will

More Projects