Project Description

CityGuru: A personalized concierge service


UX design and front-end development

Project Type

24-hour hackathon - AngelHack Montreal 2016


Amir, Alexey, Jessica, Hermosa

Introducing CityGuru

We have all been there: you are craving a really good curry, hanging out in a new part of the city which you really want to explore, so you pull up Yelp to see what your options are. To your simultaneous delight and horror, it looks like there are a good number of options in your area. So do you go to Star of India, Ganges, Taj Mahal, or Thali Bombay? You could spend some time pouring over the reviews, evaluating your various options. But let’s be honest, you are exhausted from all of the decisions you have been making all day long and you just want a sure-thing. If only you could immediately connect with someone who knows food and knows the neighborhood you are in. In response to this dilemma, we created CityGuru.

CityGuru is a personalized concierge service, an application that aims to simplify the decision-making process for travellers.

While there are numerous services available on the Internet that will give you all of the options for what to do next or what to eat next, CityGuru personalizes this process by connecting you in real-time with an expert you can trust.

The Team Behind CityGuru

The City Guru team - Amir Bawab, Alexey Borisenko, Jessica Dan, and Hermosa Farca - were all strangers before meeting at AngelHack Montreal 2016. So we had a short amount of time to come up with an idea, figure out what each other’s skills were, divide up the work, and ultimately execute a working demo. The idea behind CityGuru was a mash-up of two similar ideas for a travel concierge service, along with the integration of HPE Haven OnDemand’s voice recognition API. Using Haven OnDemand’s API worked perfectly with the philosophy of the project, which set out to simplify and personalize the process as much as possible for the user.


Back-End Development


Back-End Development


UX Design & Front-End



Use Case

So let’s run through how someone would use CityGuru. Bob is new to Montreal. He’s at Quartier des Spectacles and he wants indian food. Now. There are so many options, there are so many review sites. Even going on something like TripAdvisor, you see reviews, but you don’t know the people behind them - what are their interests? The user starts from that main screen which lists the available commands, like Siri. The right of the screen includes a sample of the “City Gurus” available for requests. The middle of the screen shows a graphic of a microphone - this is the Push To Talk (PTT) button - which once clicked, will listen to the user’s command.

CityGuru Landing Page

Voice Recognition Using Haven onDemand

Haven OnDemand API is used at the beginning of the application when the user presses the PTT button and says a command. When the PTT button is pressed, the server will run a ‘record’ process on the machine to listen and save to a file the user’s voice command. After saying the command, the user then presses the PTT button again to stop recording. The next step is converting the speech to text using Haven OnDemand API. This was a simple ‘curl -X POST’ command:

// Create job
var createJob = ‘curl -X POST --form “file=@’ + filePath + ‘” --form “apikey=’ + apiKey + ‘”’;

The above curl command will create a job on Haven OnDemand server and return its ID. Another curl command is used to fetch the JSON result of the job.

// Get job result
var getJob = ‘curl’ + jobId + ‘?apikey=’ + apiKey;

Now that we have the JSON text stored in a variable, all we have to do is extract the generated sentence from it.

var sentence = JSON.parse(text).actions[0].result.document[0].content;

After this step, other APIs are used to analyze the sentence and fetch data depending on the command meaning.

Understanding the user’s request

Once the text of the speech has been received, we must figure out the context and meaning behind it. The next step in the application is to dissect the command into nouns and verbs. The TextRazor API is used for this. The API allows us to understand which parts of the sentence are verbs or nouns.The following lines of code are after we received the response from the TextRazor API.

var noun = json[“response”][“sentences”][“0”][“words”].filter(function(v) {
return v[“partOfSpeech”] == “NN”;
var adjective = json[“response”][“sentences”][“0”][“words”].filter(function(v) {
return v[“partOfSpeech”] == “JJ”;

Retrieving data based on the request

Based on the dissected nouns and verbs we can understand the context and the type of request. For the scope of the hackathon, we focused on two applications: “restaurants” and “things-to-do”. We then query the Yelp API for restaurants and the Expedia API for things-to-do. The resulting output is determined by these queries: listing either a table of things-to-do showing their prices, or a map of close by restaurants. This is also where the “City Gurus”, or the site’s internal database of available travel concierges, comes into play. The user is presented with a list of city gurus that are nearby - their locations are shown on the map along with the nearby indian restaurants, for instance. The city gurus that are selected from a database also have areas of expertise that match the request.

CityGuru Results Page

The user now has the option of selecting the thing-to-do or restaurant close-by, or contacting a city guru that has the relevant interests/expertise to recommend something. The question might arise, why listen to this unknown person? Each city guru has a profile describing themselves, so users have the chance to go to the profile and read about them and see who matches their own interests and personality. User reviews will also be incorporated in a star rating system from one to five to see how accurate the guru was in terms of providing their expertise for a particular experience.

Revenue model

The service is free for users to ask for simple recommendations, but a premium monthly fee is paid if the user or group of users decides to meet the guru in person and have a onetoone personalized experience. What is the incentive for the gurus? They are getting paid when the client requests their help. The fee for them varies depending on the service provided: a lengthy conversation (more than two minutes) will cost one amount, a handpicked itinerary will cost a bit more, while meeting the person and getting a personalized travel guide, is another fee.

Where do we go from here?

For future improvements, machine learning would be incorporated to better learn from what the users have booked in the past and provide more accurate results based on the the user's preferences in terms of food and activities. For example, if the user often picks italian restaurants, those results will automatically show up first the next time he or she travels and asks for food.

Final Thoughts

It’s amazing what can be achieved in 24 hours when people of different backgrounds and skillsets are gathered together. We set out and accomplished an idea that sparked in our minds on Saturday morning, and by Sunday morning it was a working prototype. We had a lot of fun working on the project and learned a lot during it.

The above text was written by all of the CityGuru team members collectively.