Monday, July 28, 2014

4 Git tips beyond the basics

What is common between Google, Facebook, Microsoft, Twitter and Linked in? If you are looking for the answer its Git the Distributed Version Control System (DVCS) that has simplified software revision control. Its major features are speed and performance combined with ease of use provided you know the basic git concepts.

If you are new to git you should read some getting started tutorials or if you have used SVN you should read migrating to git. For the audience of this post, I assume that you are already using git for some time and are familiar with concepts like commit, push a branch, pull changes from remote repository, merging a branch to "master" and similar daily things that git users normally do.

Git is a lot more popular than SVN or Mercurial. If you take check Google trends in the past 5 years (July 2009 - July 2014) in Internet and Telecom category, git it twice or move as popular as the other two:

More on Git

I started using git in early 2009, then I has little experience with SubVersion (SVN) and git was a refreshing change to slow and difficult SVN. At that time, we did not do much branching or follow the git flow branching model.

I rediscover the power of Git in 2012 when I joined Namshi where we were a bigger team than I used to work with and Git made total sense. We were also using a revised git flow with lots of branching, merging, rebasing and tagging for releases.

Recently I watched a video "Git happens" by @Jessitron and I refreshed the git concepts. This video is great not only that she is talking about git, also because it's not a presentation she uses a whiteboard, markers and some sticky notes to make all the most important git concepts very clear to you. If you are using git I really recommend watching this:

And remember when using Git, its about telling the story of your project, how you and your team decide it will help maintain and informative history of your project. 

The Tips

Some Git tips beyond the basics (commit, pull, push) are as follows:

Diff (what changed?)

So you are working on a new feature on your branch my-feature, before you commit, you do a git status to list your files, then you need to know what changed in the files you should do git diff on your working directory. It will see all the changes you have made.

ᐅ git diff 

diff --git a/Dockerfile b/Dockerfile
index 392e7c0..a0a7c9f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -48,6 +48,13 @@ ADD build/sites-enabled/dashboard       /etc/nginx/sites-enabled/dashboard
 ADD build/sites-enabled/test.local    /etc/nginx/sites-available/test.local
 ADD build/sites-enabled/test.local    /etc/nginx/sites-enabled/test.local
+ADD build/sites-enabled/drupal7.local    /etc/nginx/sites-available/drupal7.local
+ADD build/sites-enabled/drupal7.local    /etc/nginx/sites-enabled/drupal7.local
+ADD build/sites-enabled/drupal8.local    /etc/nginx/sites-available/drupal8.local
+ADD build/sites-enabled/drupal8.local    /etc/nginx/sites-enabled/drupal8.local
 ADD build/sites-enabled/phpmyadmin    /etc/nginx/sites-available/phpmyadmin
 ADD build/sites-enabled/phpmyadmin    /etc/nginx/sites-enabled/phpmyadmin
diff --git a/ b/
index 7ddea6c..4188d66 100644
--- a/
+++ b/
@@ -1,6 +1,6 @@
 # Docker: Ubuntu, Nginx and PHP Stack
-This is the basis for LEMP stack (minus MySQL). This is based on [phusion/baseimage-docker]( base Ubuntu image, which takes care of system issues which Docker's base Ubuntu image does not take care of, such as watching processes, logrotate, ssh server, cron and syslog-ng.
+This is the basis for LEMP stack (without MySQL). This is based on [phusion/baseimage-docker]( base Ubuntu image, which takes care of system issues which Docker's base Ubuntu image does not take care of, such as watching processes, logrotate, ssh server, cron and syslog-ng.

You can also use git diff if you have already added the files to the staging area with git add, you will need to use git diff --cached. Diff can be used to compare branches and commits for example:

✹✭ ᐅ 
git diff

diff --git a/Dockerfile b/Dockerfile
index 9f9cd77..392e7c0 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,34 +6,115 @@ RUN /etc/my_init.d/
 CMD ["/sbin/my_init"]
+# install certificates
+ADD build/certificates/server.crt /etc/nginx/certificates/
+ADD build/certificates/server.key /etc/nginx/certificates/
 # Nginx-PHP Installation
 RUN apt-get update
 RUN apt-get install -y vim curl wget build-essential python-software-properties
 RUN add-apt-repository -y ppa:ondrej/php5
 RUN add-apt-repository -y ppa:nginx/stable
 RUN apt-get update
+RUN apt-get install -y python-software-properties python python-setuptools ruby rubygems

It can be used on github as well, with a URL like: - so this is comparing master with the more-info branch. The same can be done with commit hashes.

Global Git Ignore

If you use an IDE and it creates folders like .settings or .idea and you want to ignore it globally on all git repositories you can do it with global git ignore rather than adding it to each .gitignore file in each repository. You can create a file say global_gitignore on your home directory and list the folders and files you want to be ignored in all git repositories like:
#global git ignore


Then run the following command you will have the above git ignore rules applied to all the git repositories:
git config --global core.excludesfile ~/.gitignore_global

There are a lot of other git configurations you can try and tune git to meet your needs, if you want to look at the current configs applied to your git globally do cat .gitconfig on your home directory.

Stash your work

You are working on feature-a, an urgent bug say bug-x is discovered and you need to leave what you were doing for feature-a and fix bug-x. What do you do with the changed files in branch feature-a that you were working on, you don't wan't to commit or push it as its a work in progress. Here comes git stash to your rescue, you can just stash what you were doing on branch feature-a and finish work of bug-x then come back to feature-a branch and pop or apply your stash. How?

✹ ᐅ cd my-project
✹ ᐅ git checkout -b feature-a

# working on feature-a, some files changed say 3 of them
# bug-x discovered, need to fix it urgently so let's stash changes
# (save them for later)
✹ ᐅ git stash save feature-a

# lets go to master and create a new branch to fix bug-x
✹ ᐅ git checkout master
✹ ᐅ git checkout -b bug-x

# work to fix bug x for 1 hr, its fixed now.
✹ ᐅ git add .
✹ ᐅ git commit -m 'bug-x fixed with change in config files'
✹ ᐅ git push origin bug-x

# then open a pull request on github for bug-x,
# and come back to working on feature-a

✹ ᐅ git checkout feature-a
✹ ᐅ git stash pop
# all your changed files are back and you are at the stage
# where you left it before fixing bug-x

Stash pop will remove the last stash, you can do  git stash list to check all your stashes, stashes can be saved without name and can be applied with the hash. Check the stashing docs for more information, generally I follow the above flow for staging and prefer not having any stashes in the list.

Squash your commits

You did this big feature taking 4 days work and as a good git user you did commits when the code was stable. So now you have 10 commits in total for the feature-b you worked in for 4 days. Do you really want to send a Pull Request with 10 commits, may be along the way you wrote some commits messages that are not so relevant now. So how do you get the 4 commits to become 1, its easy you squash your commits using git reabse -i, how?

Now you have 4 commits (shown using gitk ) on top of master:

you need to execute the following command:

✹ ᐅ git rebase -i HEAD~4 #the last number, here 4 is the no. of commits you want to squash.

# you will get a screen like this :

pick 8dd81e6 feature-b changes to the config files
pick 7ea892d Feature-a fixed class A b and C
pick a465749 Feature-b fixed tests
pick cd6f406 Feature-b fixed tests

# change all picks except of the first one to s. 
# s is short for squash like below:
pick 8dd81e6 feature-b changes to the config files
s 7ea892d Feature-a fixed class A b and C
s a465749 Feature-b fixed tests
s cd6f406 Feature-b fixed tests

# now exit your editor, if you are using vim :wq
# then as you are squashing commits you can select which commit messages to pick
# from a screen like:
# This is a combination of 4 commits.
# The first commit's message is:
feature-b changes to the config files

# This is the 2nd commit message:

Feature-a fixed class A b and C

- [x] Works for A and B

# This is the 3rd commit message:

Feature-b fixed tests

* fixed most test

# This is the 4th commit message:

Feature-b fixed tests

- [x] fixed all tests

# Pick the ones that you need or delete, for this example I will not delete anything
# and quit the editor

# 4 of your commits are squashed into 1.

If your commit squash was successful, you will see only 1 commit in place of the 4 on gitk with all commit messages intact, like:


This is just scratching the surface of git there are lots of other things that can be done with git, like cherry pick commits, list git branches sorted by created date, bisect for debugging, you have to know how to fix conflicts with tools like meld etc.

Then you have git hooks which open up a new world of its own like having pre-commit hooks to do checks of code and run tests. Git has also been used to version control text related projects like books not only code. So the possibilities are endless and if you are not using Git you are missing on a lot of things.
Read More

Friday, July 18, 2014

3 Bundles to get started with REST in Symfony 2 and some tips

"I found out that you guys just build an amazing mobile app for your e-commerce venture, I heard you are using Symfony 2 for your back-end APIs. How did you make it that fast?" This is not very different that what I was asked some months back. The answer is we use a Service Oriented Architecture (SOA) where all back-end service follow the REST architecture to communicate with all the clients. The client can be built in any language as longs a they can do HTTP calls. Lets look at what Symfony 2 bundles you can use to build a similar scalable, fast and cacheable REST APIs.

I assume that you have some experience with Symfony 2 including how to use composer to download dependent libraries/bundles.

What is REST

REST, short form for Representational state transfer is a resource based client and server communication protocol which is stateless and cacheable. It is an abstraction over HTTP communication where emphasis is given on uniform interface to make the communication structured and consistent. This video describes the constraints of REST and explains what it is or read a simpler one.

REST is a lightweight substitute to older ways of doing web services like Remote Procedure Call (RPC) and Simple Object Access Protocol (SOAP). Basically communication in REST happens in light weight format like JSON which makes it fast.

Describing REST involves having knowledge if the HTTP methods (verbs) like GET, POST, PUT, DELETE. Before proceeding further knowing what are they used for will be essential. There is also lots of fuss about how to name resources (and corresponding URIs) but rather than doing things by the book making it logical and practical can be the best solution.

RESTing With Symfony 2

Symfony is a very loosely coupled framework which has lots of useful components structured in easily plug-able bundles. Here are 3 useful public Symfony 2 bundles for your next project using REST with Symfony.


The FOSRestBundle provides a solid foundation to start building RESTful services in Symfony 2. It can provide with automated routing for resources (probably doctrine entity if you use doctrine). It provides a very good base for a format (JSON/HTML/XML) independent view layer. 

If you want to be able to encode or decode multiple format FOSRestBundle recommends using JMSSerializerBundle. The serializer bundle is like glove on the hand with FOSRestBundle to give out response in JSON/HTML/XML. Please go through the documentation very well and for custom routing you can use Symfony routing and not the one provide by FOSRestBundle. It is one of the most popular bundles in KNPBundles and has been downloaded more than 784K times.


NelmioApiDocBundle is a boon when developing REST web services on Symfony2. The bundle enables clean documentation of all API end points by just using some structured annotation. There are at least 2 amazing benefits using this bundle, first you can give the link to the docs (generally /api/doc) to anyone who wants to implement the REST API you have created. Second while developing you can test your API with the sandbox feature provided by this useful bundle, if you use the annotations correctly linking the involved forms.

Restricting sandbox with user access might be a good feature to add on on this bundle. Reading the full documentation is highly encouraged. It is also a very popular bundle with 473K downloads till date.


As discussed REST is stateless, so for authentication you have to opt for some mechanism that can be communicate with each request. You can go for something like Oauth or use JSON Web Signature (JWS). There is already a public bundle the LexikJWTAuthenticationBundle using the JOSE library built at Namshi. It is recommended that you read about JWS and JSON Web Token (JWT) before using this bundle. It can be used by putting the token as a cookie for each request.

It will enable role based access to your API end points, lets say you want normal users to create users and only admin users to update/delete users that will be easily possible using this bundle than trying to generate a time limited key or some other type of authentication. Yes, reading the documentation of the bundle will help you achieve the desired output.

I hope these modules will come in handy when you start your REST Api with symfony. For more features and to leverage REST to the fullest you can take a look at BazingaHateoasBundle and TemplatedUriBundle.

Other Tips

Some other things you can consider when building a REST based API with Symfony 2 are:
  1. Use the validation groups in Symfony 2 and keep all the validation conditions as annotation in the Entity itself than at multiple places.
  2. Keep the handing of forms central, though you will not show any HTML forms for the purpose of validation use the Symfony forms on top of the entities and link them to controllers which expose the end points.
  3. Use the HTTP status code wisely like when a resource is created its not 200 OK its 201 Created, when you are paging results 206 will make for sense and if the user sent bad data 400 Bad Request is better.
  4.  Think how will you version your API early when you develop your API if today you use /api/V1 how will you use api/V2 and what will be its consequences.
  5. Last but not he least be liberal on what you accept and strict on what you give out.
All in all Symfony is a great framework and doing REST in Symfony though not a piece of cake but is challenging yet rewarding. 
Read More

Saturday, July 12, 2014

A big thanks to all the programmers, you make the world go round

Call them programmers or developers or software engineers, in this technology centered world, your life is a easier also because of them. If you notice you are addicted to technology in all aspects of your life now a days, you wake up when the alarm app rings on your phone, all day at work you are constantly checking email, after work you connect with your friends on facebook, before sleeping you browse through the news. All these activities are possible because one or more programmers wrote some working code and released the application that you are using on your desktop, laptop, mobile etc.

It is structured words like the one you see below that is changing how we live in the current times.

How do programmers make the world go round?

You just beeped your smart card at the metro/train station entrance, it showed you the current balance n the card on the small screen, how? Someone coded the software for the embedded system to detect the NFC chip and saved your valuable time and effort. There are other countless examples on every nook and corner you go today. You are able to catch up to the fast paced life because someone thought of a software solution to a problem and other people spent hours coding the right solution for it.

When I worked for a Travel reporting system for UNICEF in Kathmandu, Nepal, it was a pleasure to know that after implementing the new system the reimbursement of travel expenses was 40% faster. I think each programmer/developer/software engineer whose project has gone live has one or more similar experiences.

Due respect to other professionals

Surely it is only only about programmers, like doctors save lives, engineers help build houses, pilots fly the plane. If you look at any profession software has changed how things are done now and how it was done some years back. Think of a banker who had to record all data on paper registers, now can simply enter the data to this awesome system and it is reported till the balance sheet. 

I would also like to convey my due respect to all other tech related jobs including systems analysts, project managers, data architects, system administrators they are all very important parts of the puzzle.   

We need more programmers a.k.a super hero world changers :)

I watched the video below some times back and I think people should know that their live is a bit more easy because great ideas were successfully executed by talented programmers.

Computers are everywhere in all fields, so we will be needing more rock stars (programmers) who can transform from ideas on papers to real life applications that can be used by many people.

Programmers are addicted to code

Starting to code is not easy and taking it as a profession does require lots of passion, determination and devotion. It takes lots of learning with hours and hours of thinking and making things work. After you pass the initial phase of how do I make it work then you start getting addicted to coding. It is an amazing feeling that you can build something and you dive deeper into it. It requires lots of problem solving and creativity to get things done and get it done right. I recently read "How I hacked my husband's code addiction" which explains how programmers behave at times.

All in all it is this passion and addition to code which keeps programmers glued to their machines hours on hours to come up with something productive and useful. That mobile app you think is helping you a lot was build by some programmers who had to go through lots of hard work to get the thing working. So respect the devotion, time and effort put in by programmers and other tech professionals.

Programmers deserve a big thank you

Regardless of the language used, the product platform or the audience scope, all programmers deserve a big thank you. Thanks for all the free apps I got to use, for the endless long hours programmers have put to get things work, ripping your hair off to make that test pass and seeing the tests turn green at midnight,  for all the free and open source code that helped all other programmers. Hats off to your hard work. Keep up the good work and making the world a better place.
Read More

Saturday, July 5, 2014

Getting started with PHP (LEMP) on Vagrant, the easiest way

A software engineer tells to a colleague in his team "Man, it is working on your machine, but why is it not working on mine?", then they both find out that one has Ubuntu 12.04 LTS with PHP 5.3 and the other software engineer on which the code is working is Ubuntu 14.04 with PHP 5.5 after some investigation. If you have ever faced this or similar problem its high time to switch to a portable and a reproducible virtual development environment shared among all team members. This is a context where Vagrant comes into play.

If you have stack that involves many applications like PHP, Nginx, PHP-Fpm, Mysql, Rabbit Mq, Redis etc then making sure your team (even a small one with 3-4 members) have the same version for all above software will surely be a pain you don't want to take care of.
This post is going to be developer's perspective on using Vagrant as a virtualized development environment with minimal mention and coverage of the devOps and system side of Vagrant.

What is Vagrant

Vagrant is a container software that helps in creating virtual, lightweight, portable and reproducible development environment. Vagrant is a wrapper that can create a virtual machine using a provider like virtual box and a provisioner like puppet to create a server with exact requirements. It basically starts from a simple text file named Vagrantfile.

Why Vagrant

There are many reasons to use a virtual development machine, some of them are:

  1. The Vagrant virtual box is reproducible and portable so all the team members share it and have the same development environment with all the software in desired versions.
  2. Vagrant is OS agnostic, it runs on Linux, Mac and Windows. The main thing is the virtual machine which is generally a Linux distro. So your software engineers can even use windows but have the same virtual box shared.
  3. Vagrant saves time, earlier it used to take at least more than one day to setup a development machine and all the applications. Now as the machine is already setup its the time it takes to download and build the machine. If you can build an automated installer for the application a new software engineer can get up and running in matter of hours and not day(s).
  4. Updating existing software is easy, if any software in the development stack changes lets say the team decides to use PHP 5.5 from PHP 5.4, the vagrant config is changed all users reload their vagrant machine and all team members have PHP 5.5.
  5. Installing new software is easy, lets say the team decides to use RabbitMq for messaging. RabbitMq can be added to the vagrant box in the vagrant config and all software engineers reload/reprovision their vagrant machines and all of them get RabbitMq.
  6. Shared services, configs and file paths, when you use vagrant the code base is in the host machine which is shared with the virtual box. The paths for all the application, application executable, services like nginx, mysql, configuration of the applications like error reporting in php.ini and even passwords like mysql root password are shared and consistent.

Vagrant lingo

To know Vagrant better you need to wrap your head around the Vagrant jargon. Here are some basic and important ones:


A box is a package containing a representation of a virtual machine running a specific operating system, for a specific Provider. You can find a list of boxes and start playing with them.


Providers are software responsible for creating and managing the virtual machines used by Vagrant. VirtualBox and Vmware are popular ones. For this example we will use VirtualBox.


Provisioners are used to set up the virtual server, installing all necessary software and executing different commands in sequence. The most used provisioners are Puppet, Chef and Ansible. Shell Script is also a very common option. We will use Puppet for this example and a survey says its used the most.


Vagrantfile is the main entry point file to build the vagrant virtual box, it is used to define the base box and other config like the memory to allocate to the virtual machine etc. Other configs like host, forwared port, synced folder etc on this file.

More on Vagrant

Vagrant is very useful software to have a standard and consistent development environment shared among the team of software engineers. It capsules the software stack and its config with users in a virtual box which is portable and easily reproducible. If you want to know more about refer to the official docs and this series by Erika Heidi in part 1, part 2 and part 3 is also great to know more about Vagrant.

Vagrant also has alternatives, while many may argue that comparing Vagrant and Docker is comparing apples and oranges. In case of having a virtual machine for dev only they can be the two alternatives. Some early problems I faced with docker is, because it is a Linux container data persistence is an issue. Also for the development environment I don't think that linking 4 containers to get PHP, MySql, RabbitMq, Redis working is really practical.

If you look at the current popularity in Google they are performing head to head.

As for now for my local development environment I am happy with Vagrant over Docker.

PHP (LEMP) on vagrant, the easiest way

In context of this post I will build and run a vagrant virtual box with LEMP - Linux Nginx Mysql and PHP with a GUI vagrant box builder It is the easiest way as you just need to select what you need from the GUI get the file, then run vagrant up and you are done.

This recipe is based on Network File System (NFS) to share the project files from a Linux host machine which does not work in Windows. For this tutorial you will need to download and install the following prerequisites.

How you install the above two will depend on your OS and if the OS is 32 bit or 64 bit. TO get NFS on your Ubuntu run : sudo apt-get install nfs-server.

After you have VirtualBox, Vagrant and NFS server installed on your host machine (main system preferably Ubuntu), then you can go to

Follow the steps on the left one after the other, check "Locally" in "Where do you want your virtual machine?" part of the "Deploy Target" step. All other things are quite obvious, be sure to select "NFS" on the "Shared Folder Type" part. Please select '../' in Box Sync Folder Source part so that the vagrant and other projects can be placed on the same folder.

In the next section Server Packages, I added vim, git-core, htop and curl. You can add the packages you need.

You can skip the firewall section, in the WebServers section select Nginx, and define if you need more virtual hosts. is already added for you, if you need SSL that can also be checked.
In the Language section you can select PHP with version 5.5, do add the PHP module you need like gd, mysql etc. I highly recommend you to check 'XDebug' to use it with an IDE like PHPStorm or NetBeans.

In the databases section you should select MySQL and add new databases if you need it, be sure of the root password. I would recommend downloading and installing PhpMyAdmin later with a different virtual host added to the config.yaml file later. If you need Redis, click Redis and check 'Install Redis' as well.

If you need RabbitMq you can install it in the next "Work Queues" section. Click "Work Queues" then "RabbitMQ" after than check "Install RabbitMQ":

In the next section you can install "Elastic Search" if you need it as below:
Then you can download your Vagrant configuration as a zip file as below:
After you get the '' named zip file unzip it, to get a randomly named folder like 'NGX2Rz', which will have the Vagrantfile and puphpet folder which has all the config for all the software stack selected in the GUI like below:
I recommend creating a 'projects' folder in you home so it will be /home//projects and rename the NGX2Rz folder to vagrant then move /home//projects folder. So you wll have /home//projects/vagrant and your projects lets say my-project at /home//projects/my-project.

Then go to /home//projects/vagrant which will have the Vagrantfile and puphpet folder, then run vagrant up to build your machine. You should get an output like this gist it will take some time to download the box depending on your internet speed and some more time to build the machine.

While the machine is being download and built, you can add the new hosts to your /etc/hosts. Add

Then after the machine is up you can access provided the folders are placed correctly and the nginx virtual host is fine. If you have installed Rabbit MQ you can access the management plugin at .

If you want to check the virtual machine or execute commands in the new virtual box managed by Vagrant you can do a vagrant ssh and login to the virtual box with SSH. You will see a bash like below:

You can try htop command to check what is running on the machine. To get started with Vagrant Scotch and Brian also have good blog posts.


Vagrant is an amazing tool that enables producing portable, reproducible and consistent virtual development environment that can be shared with a team of software engineers. It saves you from installing the right version of PHP, MySQL and other needed software in the stack. You should really give it a try and move all your projects to Vagrant.

PS: This is my 200th blog post and it has been more than 7 years I started blogging.
Read More

Friday, June 20, 2014

5 free apps to bootstrap your budding tech startup

Bootstrapping a tech start up with limited financial resources is always a difficult task in hand. You have to find the right balance between the cost and the benefit of the money spent. As a new entrepreneur if you could get some great software for the price of 0 that would really expedite the tech related company bootstrapping process.


In this context lets discuss about some free software that will really help you get some amazing benefits. I would like to keep this post as programming language agnostic as possible. Subsequently, I believe though you don't need to pay for the software a good web host will be necessary that provides shell and software installation access (like Amazon AWS or Linode) to install the software mentioned later in this post.

This post is going to cover software/SAAS for Project Management , group chat and notification, source code collaboration with version control (git), deployment automation and error/log monitoring of the deployed application.

The Apps

Redmine for Project Management

Redmine is a flexible project management tool that can be self hosted on your own server. It helps you keep track of all the ideas, features and bugs that pertain to your application. It is very flexible and configurable to the flow you want to choose for your project management. If you follow an agile, scrum type approach with Kanban it can easily support that flow. If you are looking for free hosted project management tools you can have a look at Trello or Asana

Hipchat for Group Chat and Notification

Hipchat is an amazing chat application that support one to one and group chats, it is great to search your previous chats online and integrates very well with other applications. A real world use case is our deployments are notified on Hipchat. They have a paid plan as well but the free plan is enough to start with. Interestingly they have apps for all relevant platforms. If you still want to go old school you can opt for Skype or good old Google chat. 

GitLab for private git hosting

Git is a distributed version control system which is flexible, configurable, popular and very useful to put your source code under version control. If you follow a good git flow and branching model it can be very productive for your team. As a startup if you don't want to pay for private git hosting at GitHub , GitLab community edition is a very good self hosted alternative or hosted at Gitlab has great features where you can manage repositories and user permissions, open pull request and collaborate by comments etc. If you are looking for a hosted alternative BitBucket gives a free 5 user unlimited private repository free plan. for Continuous Deployment

The more things you can automate the better it is from a cost point of view. is a hosted continuous deployment service that can deploy your code from Github or other git repo to Heroku, AWS and even your own server with SSH access or FTP and SFTP. It is easy to link the repository from sources like github and deploy it to the destination server. It makes the deployment quite easy and seamless which needs some initial configuration. For the free plan it allows one repository linked with unlimited destination servers and unlimited deployments.

NewRelic for Application Monitoring

NewRelic is a handy application monitoring and exception/error notification tool which is useful for real time reporting of running applications. NewRelic is our go to app after each deployment to check if anything has gone wrong where it shows all the related errors and exceptions. NewRelic also provides information about application response times, deployment notification and other important information about servers as well. New Relic now also supports mobile apps monitoring which is a great new feature. The free plan gives 24 hours data retention. Graylog2 is an amazing log analyzing alternative but may need to be self hosted and Loggr looks quite promising as well.

When you choose apps, you should also think of a smooth migration plan or an upgraded plan. It will help easy migration to a better vendor when needed.


Even for a start-up you will always need a good process and system in place. If you can automate your flows it would greatly help for the sustainability of the business. If the best practices for coding, testing and continuous integration can be followed by the development team with great software architecture and design it will make rolling out new features easy. Above application will help in achievement of these goals.  
Read More