Hardeep Asrani

WordPress Developer, Kanpur

Installing YOURLS on Nginx

I recently started using Nginx (2 days ago, honestly). As always, it was for a WordPress site that I needed to build, with its own URL shortner using YOURLS.

I’ve installed YOURLS on Apache a million times(not counting) without any issues. It’s easy to install on Apache. You really don’t have to do anything apart from configuring the config.php file. But with Nginx, YOURLS wasn’t working properly.

WordPress was installed in the root of my domain (let’s call it domain.com), while YOURLS was supposed to be in domain.com/go/ folder.

Visiting /go/ directly led to a 404 error page, while domain.com/go/admin/ was working properly. However, the short URLs weren’t working at all. Anyway, let’s start from the beginning.

Note: You need SSH access to your server in order to follow this tutorial.

First you need to make sure that you’ve Git installed on your server. If it’s not installed, you can run:

sudo apt-get install git

Once Git is installed, you need to run clone YOURLS file to your server. Since we wanted to run YOURLS under /go/ directly in our root, we need to run the following code in our root folder:

git clone --branch master https://github.com/YOURLS/YOURLS.git go

That will clone the Git repo to your server. If you want to remove the git tracking then you can delete the .git folder by running the following command from your /go/ directory:

It’s not required but worth doing it. Now you need to edit your /admin/config.php file. Run the following command from your /go/ directory:

cd admin
mv config-sample.php config.php

Then you need to configure your config.php file as described here with your database info: http://yourls.org/#Config

So yea, that’s it for the installation. That’s where it gets little tricky. Everything is done but it doesn’t work properly.

Now you need to edit your /etc/nginx/sites-available/default file. Run the following command:

sudo nano /etc/nginx/sites-available/default

Now you need to add the following to your default file:

location /go/ {
    location = /go/ {
        try_files $uri $uri /go/admin/;
    try_files $uri $uri/ /go/yourls-loader.php?$args;

You can add it before the closing } tag of server {...}. And that should make it work. Don’t forget to restart Nginx before trying witht the following:

sudo systemctl restart nginx

That should do it. Now you can visit domain.com/go/ and it should work properly, so will your short URLs. Hope it helps.

Writing Quality Blog Posts

If you search or read your favorite article about how to get your blog famous, and search top on Google then the one thing that everyone will tell you is to produce quality blog posts. But only having a great idea won’t turn your blog post to a quality post. To produce a post which looks good to the eye and suits the mind, you will have to focus on some elements of writing, few of them which I have covered in this blog post.

A solid first impression

What’s the first thing someone notices about your post? It’s the title of your post. It’s one of the most important parts of your post. Make sure to give your content a suitable title. And having a grammatically correct title is recommended.

Which came first, the chicken or the egg?

It’s important that you have a solid structure for your blog post. You just can’t put anything anywhere and then expect your readers to get you. Because you know what you have in your mind when you write your post but they don’t have the same mind.

We will divide a post to three parts:

  • Introduction: That’s the part where you tell your readers what your post is about. It starts with the title of your posts, and then some info about the topic.
  • Supportive content: Now after the introduction to the subject, you will break down every piece of information, sentence by sentence, to your reader. Every sentence should add value to the content.
  • Call to action: Now what do you want your users to do after reading your post? Do you want them to buy a project, relevant to your post? Do you want them to leave a comment below, or share your post on social media? This is the part where you start the user interaction.

Feel free to add more things to your content because this is just a basic structure.

You’re a human, writing to another human

You’re not giving an exam, or writing for search engines. Computers are trying to be more like humans, so why are you trying to be like a computer? After all the search engine indexing, social media sharing and all the promotions, it all comes down to your readers to which you’re targeting. They should be your focus, not search engines.

Appeal to them, like you’re telling something to a friend of your friend, or a relative that you’ve met after a long time. After reading your content, a reader should feel something. It could a feeling of joy, sorrow, success, inspiration or anything. If they’re not feeling anything then your job is not done.

Sure, it’s a different thing when you post tutorials or sports news. But what about review sites? Shouldn’t your readers get a bit influenced by your reviews, because your goal is to help them pick the best?

Be beautiful, not boring

Your blog posts don’t have to look boring. Add some visualization, fonts, images, videos or whatever helps you to make your content beautiful. I’m not talking about filling it with the unnecessary, but fill with what’s necessary.

Always include at least one image with your blog post. It helps you with SEO, helps with sharing on social media, and looks good to your reader. Don’t put anything random but something that goes with the content.

Use beautiful fonts. Something which compliments your design, and is easy to read in the devices. And please, for the love of our eyes, don’t use Comic Sans!! They’re not funny and nobody likes them. And you don’t need to use too much bold, italic, or underline when it’s not necessary. Yes, it’s good to highlight content when needed with these, but don’t use it randomly.

Take your time, seriously

Unless you’re writing a blog post for your school assignment, you are not running out of time. You don’t have to complete your blog post within a couple of hours, and start working on your next post. Take your time. Don’t rush.

Take a day or two to complete your blog post. Do some research, get your facts right, read about it, and discuss to get as much information about your topic as you could. You will explore different ideas, thoughts and a lot of internet spam (skip that please).

Apart from spending some time in research work, you also need to give your mind some break. A tired mind won’t produce great ideas. Minimize your browser, open iTunes and listen to some music for sometime, and then get back to your work.

Grammar matters!

Most of us, especially teenagers, have been the “cool internet kid” who wrtz lyk dis, but the mah lyf mah rlz philosophy doesn’t work when it comes to grammar. Do you realize a lot of people can’t read your cool internet kid lingo? It’s fine to use it in your own circle but if you want to write something for a bigger demography then grammar matters.

We all are not great at grammar but we all should try our best. I’m certainly not. So what’s the solution? Don’t publish your posts without doing a spell check. And also read your post twice. And if you need more help then ask a friend to proofread.

It’s not like you won’t mistakes. We all make a lot of stupid and small mistakes all the time. But when you notice these mistakes then don’t hesitate to update the post with the correction. Language, if used properly, is beautiful, don’t hide from it.

After you’ve followed all the above points, just read your post once again to see if it looks alright, and hit the Publish button!

Not every rule is for everyone but this is the basic structure that you will find everywhere. Feel free to experiment and mix things a little to see what works for you. Let us know how you produce quality blog posts.

Transparency Report For The Month Of July 2016

Another month, and another missed report. So I’ve been really busy recently with my work, so had no time to publish July’s transparency report in time. July was the lowest month for Latte. I will keep this report short, and try to add more useful content in August’s transparency report.

Month of July

As noted before, July had the lowest sale for Latte, even lower than it’s debut month. In July, Latte Pro sold 6 copies for a grand total of $245, while DocPress/Kichu footer extension collected $20 in total. So this led to me a question, is the $49 pricing worth it? I will answer that in the next report.

Apart from business, I will be attending WordCamp Nashik this month, so feel free to say hi! I’m volunteering at Happiness Bar, so if you have any questions just let me know. 🙂

Radio Buttonset Control For WordPress Customizer

Here’s another control from O2 – WordPress Customizer library. It’s a radio buttonset control, built using WordPress’ admin UI.

You can find it in O2 library here. It’s a part of the library so you will have to download the entire library. Feel free to delete other controls if you’re not using them.

Place /o2/ folder in your theme, and include it by adding the following code:

define( 'O2_DIRECTORY', get_template_directory() . '/inc/o2/' );
define( 'O2_DIRECTORY_URI', get_template_directory_uri() . '/inc/o2/' );
require get_template_directory() . '/inc/o2/controls/radio-buttonset/radio-buttonset-control.php';

First you need to define directory and directory URI of the /o2/ folder after that you need to include radio-buttonset-control.php file.

And that’s all you need to do.

You can add it to your customizer like this:

$wp_customize->add_setting( 'o2_radio_buttons', array(
    'default' => 'left',
    'capability' => 'edit_theme_options'

$wp_customize->add_control(new O2_Customizer_Radio_Buttonset_Control($wp_customize, 'o2_radio_buttons', array(
    'label' => __('Image Alignment', 'textdomain'),
    'description' => __('Choose the alignment for your blog images.', 'textdomain'),
    'section' => 'your_section',
    'priority' => 5,
    'settings' => 'o2_radio_buttons',
    'choices' => array(
        'left' => __('Left', 'textdomain'),
        'center' => __('Center', 'textdomain'),
        'right' => __('Right', 'textdomain'),
        'none' => __('None', 'textdomain'),

That will do the work. It can be used as a layout selector. It was built a couple of months ago but I never got time to share it. I’ll try to add more controls to the O2 library and share them here as soon as they are done, so let’s hope it works out.

Feel free to leave a comment if you have any questions or suggestions.

Transparency Report For The Month Of June 2016

I had a lot of people asking me why there was no transparency report for the month of June. So here’s the reason: I took a some time off and went on a short vacation, so there was a lot of work to be when I came back and things got mixed up… and here I’m, writing this report a month late.

So let’s cut to the chase and dive in straight to the business. In this report, we will be discussing how I’m promoting Latte theme, and how the theme did in the month of June.

How to promote a premium WordPress theme

There are no more than a couple of methods that I used to promote my premium theme, and they has worked well. These methods are cheaper than wasting money in banner advertising, and gets your product more eyeballs.

Having a free version on WordPress.org

Having a free version of Latte on WordPress.org’s theme directory was no-brainer. In the first month, all the sales were generated by the traffic from WordPress.org.

Latte on WordPress

The idea is not to have a sell-out version of your premium theme filled with advertising but a premium-like free version which can be a theme on its own. This has led to great reviews and more people sharing the theme on their websites.

Latte has only two up-sell links (one in the about page of the theme & one in the theme customizer) with no limitations or annoying warning messages.

But  how to get most out of your free users?

Making free users join your email list

Free version of your theme can (and will) have way more users than your premium version. But with having your free theme at WordPress.org, you can’t get their user info (such as email/name), so you’re missing out on a lot of potential subscribers. So how to get them to join your email list?

To get the most out of your users, you can reward them with a free theme add-on, which will be delivered to them upon signing up to your email list. And that’s exactly what I did. Latte Pro has some exclusive sections which aren’t available to free users, so I made a plugin add-on which allowed the users to add one of the Pro sections to their site.

Latte Contact PromotionIt’s a small plugin which adds contact section (which users Contact Form 7) to the free theme. It’s small and users can get it by signing up to my email list. So far the theme has about 2,000 active downloads, in which over 110 users have signed up for the free add-on. Not so bad, is it?

Sponsored posts/theme lists

Instead of wasting money in advert which user tend to avoid, why not have something which user come searching for? Reach out to blog sites doing a theme list post where they themes for various purposes (Google ‘free portfolio WordPress themes’) and ask them to list your theme. It will most probably be a premium listing but it will be money well spent.

I’ve been promoting the free version instead of the premium version, for obvious reasons.

Month of June

June was no different from the last two months. The biggest thing to note was that I changed Latte Pro’s price to $49, and there will be no further changes.

In July, Latte Pro sold 21 copies for a grand total of $729, while DocPress/Kichu footer extension collected $45 in total. It was same as last two months, so no major change in sales. The one good thing was to see the sales number not going down even after almost doubling the theme price.

Apart from that I wanted to note that August is my birthday month so if you wanna wish me, 22nd is the date. Also, I’ll try to post the transparency report for July later this month too. And as always, thanks for reading the report. You can always let me know about your thoughts, in the comments below, or wherever you can find me.

P.S. I’ll be attending WordCamp Bhopal next month, so feel free to say Hi, there.

Syntax Highlighter Control For WordPress Customizer

This is the second control of O2 – WordPress Customizer library. In case you’re wondering about the first control, you can check this blog post. Spoiler alert: it was a Font Awesome icon picker, which also supports Genericons and Dashicons.

Second control is a syntax highlighter It allows you to add a syntax highlighter to your WordPress Customizer, which supports all famous languages, such as JavaScript, CSS & HTML. This control uses CodeMirror, so do check that out if you ever need a syntax highlighter.

You can find it in O2 library here. It’s a part of the library so you will have to download the entire library. Feel free to delete other controls if you’re not using them.

Place /o2/ folder in your theme, and include it by adding the following code:

define( 'O2_DIRECTORY', get_template_directory() . '/inc/o2/' );
define( 'O2_DIRECTORY_URI', get_template_directory_uri() . '/inc/o2/' );
require get_template_directory() . '/inc/o2/controls/code/code-control.php';

First you need to define directory and directory URI of the /o2/ folder after that you need to include code-control.php file.

And that’s all you need to do.

You can add it to your customizer like this:

$wp_customize->add_setting( 'o2_code', array(
    'capability' => 'edit_theme_options'

$wp_customize->add_control(new O2_Customizer_Code_Control($wp_customize, 'o2_code', array(
    'label' => __('CSS', 'textdomain'),
    'description' => __('Your custom CSS.', 'textdomain'),
    'section' => 'your_section',
    'priority' => 5,
    'settings' => 'o2_code',
    'choices' => array(
        'language' => 'css',
        'theme' => 'icecoder',

That will do the work. You can put any language you want, if supported by CodeMirror, in the language option. And here are all the themes you can choose from.

Feel free to leave a comment if you have any questions or suggestions.

Transparency Report For The Month Of May 2016

One of the reasons behind publishing a transparency report every month is to share all my experiences with the readers. So, to begin with, I tried a shot at marketing by doing some experiments. And in the last report, I mentioned that I wasn’t good at it. So this report, will tell you how these new experiments have turned out to be.

Apart from that, I also wanted to share how I’m handling product support, and to introduce you to the latest addition to my theme collect.

Product Support

Selling a product is just half the battle, the other half is to turn the customers into satisfied users where product support plays a very important role.
I’ve been providing support for free to users via WordPress forum, and paid users via email and since the number of requests is not very high, the average response time is less than 12 hours, and in most cases, from 5 minutes to an hour. I’m also thinking of moving the support requests to a help desk software, like HelpScout, if the numbers grow. So far, the response from the users has been great which is evident in the great ratings and testimonials for the theme.

Coming to minute details, right now, I’ve included documentation inside the theme’s zip file so a lot of users don’t realize that there is a documentation altogether with the theme, which needs to be easy to find.

Introducing Photos

Photos Responsive

Photos is the newest addition to my theme collection, with over 7,000 downloads in its debut month. It’s available for free at WordPress.org, with no up-sell at this moment.

I’d love to turn this theme into a theme for photographers and stock-image sites.

Month of May

Last month, I raised Latte’s price to $29 from $25, as the theme is already under-priced. I was expecting the sales to drop because of the raise, but the final revenue ended up being good.

In the month of May, Latte Pro generated 24 sales with $684 in revenue, which looks less than last month’s 31 sales with $720 in revenue but isn’t. As I noted in last report, those numbers were April + last few days of March, so the theme actually did better than the last month. Apart from Latte, other footer extensions generated 6 sales for $30.

I also experimented in marketing by putting two banner ads on DesignWoop and BestWPTheme just to see if banner ads are of any profit. And the answer is NO, at least for me.

One of the hardest part, as I’ve learned, is hiring people. Last month I hired a designer from Upworks to start work on my next theme. I was really happy with his designing skills, and I hope it will turn out to be a great. And instead of expense, I’d call it an investment.

Helping Hands

Let me take some time to thank people who have been really helpful:

  • Deeksha Raj for helping with writing, proofreading, shopping & a billion other things. If you find any mistake in this report, she’s the one to blame.
  • Ionut Neagu for helping with a lot of things. Also for the idea of a transparency report.
  • Marius Ghitulescu for helping with marketing.
  • Suyogya Shukla for helping with designing and rejecting most of my bad ideas.
  • Laika for nothing. She’s too cute to ignore, just look at her.

That’s pretty much it. And fortunately, I’ve some great details to share for the next report. If it all goes right, I’ll be sharing some great tips for promoting on WordPress themes. See you next month!

Font Awesome Icon Picker For WordPress Customizer

WordPress’ Customizer is one of my favorite parts of WordPress. You will usually see me products taking full advantage of Customizer. Right now I’m working on a library for Customizer, which will consist of some custom WordPress controls written by me.

The very first is a Font Awesome picker customizer control. Font Awesome fonts are used by a lot of themes and they are really amazing. Sadly, I couldn’t find any icon picker for Font Awesome.

You can find it in O2 library here. It’s a part of the library so you will have to download the entire library. Feel free to delete other controls if you’re not using them.

Place /o2/ folder in your theme, and include it by adding the following code:

define( 'O2_DIRECTORY', get_template_directory() . '/inc/o2/' );
define( 'O2_DIRECTORY_URI', get_template_directory_uri() . '/inc/o2/' );
require get_template_directory() . '/inc/o2/controls/icon-picker/icon-picker-control.php';

First you need to define directory and directory URI of the /o2/ folder after that you need to include icon-picker-control.php file.

And that’s all you need to do.

You can add it to your customizer like this:

$wp_customize->add_setting( 'o2_fa_icon_picker', array(
    'default' => 'fa-facebook',
    'capability' => 'edit_theme_options'

$wp_customize->add_control(new O2_Customizer_Icon_Picker_Control($wp_customize, 'o2_fa_icon_picker', array(
    'label' => __('Icons', 'textdomain'),
    'description' => __('Choose an icon', 'textdomain'),
    'iconset' => 'fa',
    'section' => 'your_section',
    'priority' => 5,
    'settings' => 'o2_fa_icon_picker'

It will a list of all the icons. If only want to list few icons then you can do it like this:

$wp_customize->add_control(new O2_Customizer_Icon_Picker_Control($wp_customize, 'o2_fa_icon_picker', array(
    'label' => __('Icons', 'textdomain'),
    'description' => __('Choose an icon', 'textdomain'),
    'iconset' => 'fa',
    'section' => 'your_section',
    'priority' => 5,
    'settings' => 'o2_fa_icon_picker',
    'choices' => array(
        'fa-facebook' => __('Facebook', 'textdomain'),
        'fa-twitter' => __('Twitter', 'textdomain'),
        'fa-dribbble' => __('Dribbble', 'textdomain'),
        'fa-wordpress' => __('WordPress', 'textdomain'),
        'fa-github' => __('Github', 'textdomain'),

That will do. If you face any issues then comment below, or feel free to send a pull request.

It’s just the first control, so you can expect few more posts like this in near future.

Update: Icon picker now also supports Genericons and Dashicons, so you can now change the value of iconset to use these two as well.

Also, if you’re using it then please leave a comment telling me your thoughts and the new controls you’d like to see.

Love this control?

If you love this control of O2 library then consider donating from here to support this product.

Transparency Report For The Month Of April 2016

Intros are hard. Last month my first commercial theme made its intro to WordPress marketplace and I want to share my experience with all of my readers in the form of an informal report. It will contain what I learned, things I tried, my sales and a lot more.

Little bit about me

I’ve been an active member of WordPress community and making my living using WordPress for more than a couple of years. I’ve been writing free themes and plugins for sometime as well. Recently, I decided to develop a commercial WordPress theme. It took few months to design and develop, plus a lot of work. Then I submitted the theme to WordPress.org, where it took 4 months, and Latte was finally made live in late March.

Apart from Latte theme, I also have two more commercial products. I’ve a $5 footer credits extension for DocPress & Kichu themes. Let’s get to the numbers now.

Month of April

Honestly, I wasn’t expecting to sell a single copy of Latte for at least first couple of months, but I was surprised by how quickly I sold many copies with little to no promotion at all.

Before I lay down the numbers, here are some things you should know:

  • Latte went live in the late March, so I’m adding those numbers to this report as well. It also makes a lot of sense, you will see, in a moment.
  • Numbers will look little inconsistent.

In the beginning I was using Fiverr to sell the theme, which was taking 20% commission and took 14 days for withdrawal. And yes, all the sales I made in March using Fiverr, was deposited to my account in April. The first point makes more sense now, doesn’t it?

So let’s start with the numbers:

In the month of April, Latte Pro generated 31 sales with $720 in revenue. As of now, Latte’s free version has over 15,000 downloads, with 1000+ active users.

Latte Responsive

Latte Pro is available for just $29, which is really really low compared to similar pro themes. If you love stats then we can say it generated a sale every 500 downloads or 33 active users. Latte was picked up by WPTavern.com just after few days of its release and received a great review from them.

Latte offers a welcome alternative to clunky, confusing page builders or drag-and-drop editors. With everything in the customizer, the user doesn’t have to hunt around for how to edit its many sections. If you want a simple one-page theme to showcase your profile and services, you’d be hard pressed to find one more customizable than Latte.

Apart from WPTavern, it was later featured in a lot of blog posts, and some of them are listed here:

Apart from Latte, footer extension plugins for DocPress and Kichu generated 10 sales for $43.

“What about all the expenses?” – you must be wondering. In this month, I spent $28 on my products. Apart from the money, the time I spent on designing, developing & polishing the theme was stretched out between few months so it will be really hard to calculate, but it wasn’t short.

The only paid promotion the theme had this month was being featured on Built With Bootstrap, which generated over 400+ views.

What about the future?

It’s going to be great! New Star Wars movie is coming in December, I’m SO EXCITED!!! Wait, isn’t Star Wars a story from a long time ago in a galaxy far, far away?

Let’s talk about near-future. I need a website. An online store where I can put all my products. And it’s something that I’m working on but I’ve no idea how much time it will take. Hopefully, we will also have some images to report, instead of just numbers, by then.

If you have any suggestions then feel free to write it in the comment section below. This report was inspired by CodeInWP and PippinsPlugins. Thank you for reading this. See you next time!