I have released a new version 1.1 of Posts Stats plug-in today. It adds the support to display a chart for the posts by year, displays categories as a cloud and introduces a new stat to show the longest post published. I am pleased with this version - demo here. 😊

I have released a new version 1.0.2 of the Paper theme today, which addresses the reported issues and suggestions since the first release yesterday. Here are the changes, in brief.

  • Added support to include replies on individual posts
  • Added the configuration of social icons as plug-in setting
  • Updated the styling to display categories along with posts
  • Updated documentation to include installation steps
  • Fixed styling of images on smaller screens

You can go to the Plug-ins section in Micro.blog and click “Upgrade” once the option is available. You will have to reconfigure (for the last time, hopefully) the social IDs in the settings of the plug-in. No need to modify the config.json, anymore. This also means the configurations will not be lost during the future upgrades.

I am thrilled with all the feedback that I have received. Paper is a beautifully designed theme, something I can take no credit for. At the same time, I am glad I could make it simpler for others to adopt it.

Paper – A Clean Theme for Micro.blog

After playing around briefly to understand how to bring a theme made for Hugo to Micro.blog, I have finally ported one that I love. Today, I am ready to share it with the Micro.blog community. The theme is called Paper and goes with a tagline “simple, clean, flexible”. You can check for yourself in the screenshot below, or see it live at my test blog.

I am a big fan of clean themes that are minimal, yet impressive. Paper is one such theme — I had used it earlier when I was hosting this blog with Hugo. Although it looks minimal, it isn’t so in the way it works. It has a simple, yet signature header, a built-in dark mode support with a beautiful toggle and a clean black & white look.

I have added the first version of this theme to the plug-ins directory so that you can install it directly as a plugin. It works with both Hugo versions that Micro.blog supports (0.54 and 0.91) [Update]: An issue was reported while using the theme with Hugo version 0.54. So, until further update, the theme supports only version 0.91 of Hugo. However, here are a few points to remember before you install the theme.

Uninstall any theme that you have installed as a plugin. Set you current theme to blank and Hugo Version to 0.91 in the design section of your blog. Make sure there are no other conflicting custom CSS configured for the previous theme. Then install the Paper theme from the plugin directory. Once the theme is successfully installed, you can configure the social icons displayed in the header by modifying the available options in config.json.

There’s already a brilliant selection of themes available for Micro.blog and I am excited to see the support grow further with every passing day. I hope you like this and a few folks benefit from it. If you do, I would love to hear from you.

I verified today that the Post Stats Micro.blog plugin works with the upgraded Hugo version (0.91). So, that’s one less issue I need to handle as part of the next upgrade. However, if you are using the plug-in (I am glad) and see an issue, please let me know.

Back to work on what I had originally planned.

Styling Newsletter Digests in Micro.blog

I recently changed the newsletter to a weekly digest instead of every long-form posts with Micro.blog. A fixed schedule is better for me than thinking about whether to include as part of the newsletter every time I post a post with a title. Until there is a better control (via categories) on what posts I can schedule for delivery, I want to avoid risking this particular setting.

That said, I didn’t really like the way the first digest looked. It was… mhmm … messy. Maybe a bit more control over the elements, like title etc. would be good. Without that, to make the digest look slightly better, here’s the custom CSS that I have added currently.

You can apply this to your digest by including this CSS block to your custom CSS (‘Design’ ⇾ ‘Edit CSS’).

/* Set the font display */
.microblog_email {
    font-family: "Avenir Next", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
	font-size: 16px;
	line-height: 1.7em;
	max-width: 600px;
	margin: auto;

/* Move the header to the center */
.microblog_email p:nth-of-type(1) {
	display: none;
	text-align: center;
    font-size: 40px;

/* Assign area and display for the blockquote */
.microblog_email .blockquote {
	display: block;
    margin: 0;
    margin-bottom: 14px;
    padding: 0 20px;
    border-color: #E0E4E8;
    border-left: 2px solid #E0E4E8;
    color: #7A889A;
    line-height: inherit;

/* Assign area and display for the images */
.microblog_email img {
	display: block;
	max-width: 100%;	
	height: auto;
	margin: 0 auto 0.5rem;
  	vertical-align: middle;
  	border-radius: 5px;  	

/* Style links */
.microblog_email a {
	color: #4F8BCA;

/* Hide the profile image and footer */
.microblog_email p:first-child img {
	display: none;

/* Styling for the separator */
.microblog_email hr {  
  margin: 12px 0;
  border: 0;
  text-align: center;

.microblog_email hr:before {
	content: "\2022 \2022 \2022 \2022";
    font-size: 20px;
    color: #4F8BCA;

/* Styling the links */
.microblog_email .microblog_permalink {
    color: #4F8BCA;

I would like to avoid these :nth-of-type and :first-child blocks. But until the elements across the body are assigned classes, I will have to stay with this. Anyway, hope this helps. Or if there’s a better, simpler way to achieve this, I would love to hear.

A minor styling suggestion while using Posts Stats plugin with Marfa theme in dark mode. Add this snippet to custom CSS (‘Design’ -> ‘Edit CSS’) to fix background of alternate rows in tables.

@media(prefers-color-scheme: dark) {
	tr:nth-child(odd)>td {
	  background: initial;

Thanks to Andrew for bringing this to my notice.

I like to remind myself about the number of words that I’ve written on my blog. Well, now I do, through my Archive page. It’s auto-generated, refreshed every time I publish. And if you host with Micro.blog, you can achieve the same with this plugin. It’s basic, but works.

Getting Post URL in Drummer

I enjoy writing posts in Drummer. One of the many reasons for that is I can see all my posts in the same editing space. It is so easy to scroll through all your posts and find reference to just that one old post.

One thing that missing, though, was there was no easy way to get the url for that post right in Drummer. So, I got scripting. I have created a script which does just that. Select any node, run the script, and it will present the URL for that post in a dialog box. Here’s how you enable it.

  • Copy the below Drummer script and paste it in your special opml file for Scripts menu (File ⇾ Special files ⇾ Scripts menu…)
  • You will see a new entry in Scripts menu
  • Select any node, even the headline (a titled post), and select the newly added script menu item

You will get the URL for the selected node.

Get Post URL
	var created = op.attributes.getOne("created");
	var baseurl = opml.getHeaders().urlBlogWebsite;
	if(typeof(baseurl) == "undefined"){
		baseurl = "http://oldschool.scripting.com/" + opml.getHeaders().ownerTwitterScreenName + "/";
	var dt = new Date(created)
	var day = (dt.getUTCDate() < 10 ? '0' : '') + dt.getUTCDate();
	var month = ((dt.getUTCMonth() +1) < 10 ? '0' : '') + (dt.getUTCMonth() + 1);
	var year = dt.getUTCFullYear();
	var hour = (dt.getUTCHours() < 10 ? '0' : '') + dt.getUTCHours(); 
	var minutes = (dt.getUTCMinutes() < 10 ? '0' : '') + dt.getUTCMinutes()
	var seconds = (dt.getUTCSeconds() < 10 ? '0' : '') + dt.getUTCSeconds()
	var post = opml.parse(op.getCursorOpml());
	var isTitledPost = typeof(post.opml.body.subs[0].subs) != "undefined";
	var postUrl = "";
	if(isTitledPost) {
		postUrl = baseurl + year + "/" + month + "/" + day + "/" +  hour + minutes + seconds + ".html";
		postUrl = postUrl + "?title=" + op.getLineText();
	} else 
		postUrl = baseurl + year + "/" + month + "/" + day + ".html#a" +  hour + minutes + seconds;
	dialog.ask("This is the URL for the selected post:",  postUrl);

Getting Started Blogging with Drummer

I recently started blogging with Drummer, a new Outliner made public by Dave Winer. It has been a wonderful experience. I don’t know what it is about a single outline as a base for your blog, but it feels natural. I have been enjoying writing and playing around with my Drummer blog. However, it is not easy to fathom the simplicity of the whole system just through words — only trying it out will make you appreciate the ease. I wanted to capture what it is and how to quickly get started with it for myself and others to follow.

Drummer documentation captures most of this information. But for someone, like me, who’s new to the concept of outliner, the whole stuff can be pretty overwhelming. So, here I capture what I learned and liked so that it helps other newbies like me.

What’s an Outliner?

An outliner is basically an editor that can edit an outline. What is an outline, you ask? Well, outline is text items represented in a hierarchy, with each item having a parent (typically a title) or multiple sub-items (typically related points). There’s a lot more to know, but I am more focused on drawing a parallel with regular blogging terminologies.

You can think of a first parent item as a title of your post. Each sub-item that follows is like a new paragraph. You can further divide the items into sub-items, that’s grouping related points into a subtitle for example. The only difference is instead of it being represented as a header and list of paragraphs, it is a tree-structure of points, closely related and unrelated.

If a post doesn’t have any child, it’s a titleless post, a micro-post — something like a tweet.

Dave Winer is the strongest proponent of using the outlines as the base for the blogs, he uses them for his blog, Scripting News. The basic hierarchical structure of an outline, makes using outliner for blogging powerful. Both the types of posts, long-form and micro, sit well together. After all, it’s just one long list of text items one after another. Whether they have a sub-item or not define how they get represented. Or that’s how Dave likes them represented.

Drummer is one such outliner that benefits from the years of Dave’s experience. He has understood all the nitty-gritty of blogging through this form. So, once you overcome the initial struggle of unknown, the experience is pretty smooth.

Is it a Blogging CMS?

Not really, Drummer is just a web application that can edit outlines. These outlines are typically represented as an OPML file. Basically, all you do with Drummer is edit OPML files of different forms. It wraps a few special OPML files — mainly blog.opml — to give them specific meaning while using them as base for blogging.

But, all we do is edit these OPML files then, what builds the blog?

Well, the software that runs Dave’s blog does that job. It is called Old School (because Dave believes this is the old school way of blogging) and is hosted by Dave. In a way, Old School is the blogging CMS and not Drummer.

So, from my understanding, the way the thing connect is as below.

  1. You sign in with your Twitter account and that creates the necessary backend — basically a S3 store for your OPML files — based on your Twitter username.
  2. You create, view, edit the OPML files using Drummer. The special files like blog.opml and about.opml hold special meaning for Old School. (Update: In fact, about.opml is just used for representation. You can name it anything.) So, you update them and through a command in Drummer (Build my blog), you communicate to Old School server to refresh your blog.
  3. Old School receives the communication and based on provided inputs, it identifies the files to use for building the blog. It reads the OPML files from the backend store for the files and converts them to static files that get served as your blog.
  4. Old School also serves you blog at the http://oldschool.scripting.com/<your-user-name> URL. So in a way, you don’t need to host any additional software.

In a way, then, Drummer and Old School together act as your blogging engine. Drummer is your editor where you write your posts. Old School acts as a CMS to build and serve your blog.

How do I get started?

Dave has a got a handy documentation in place that you can follow. I will point to the relevant parts in the documentation so that you can follow along and get started.

  1. Main blog: Follow the getting started guide to get a blog up and running with Drummer. In short, create a blog.opml outline file. Make the outline public. And finally, build the blog using Tools > Build my blog.... This should open a new tab with your blog rendered with Old School. You can customise your title and description of your blog and a few head-level attributes.
  2. Title and Description: Modify/add the head-level attributes title and description and rebuild your blog.
  3. Header Image: Add a head-level attribute urlHeaderImage pointing to the header image of your choice and rebuild your blog.
  4. Copyright: Add a head-level attribute copyright with the text you want to appear in the footer and rebuild your blog.
  5. About Page: If you want to create a new tab in your blog for your About page, create a new about.opml outline file using Drummer, make the outline public, add a head-level attribute urlAboutOpml pointing to this public outline and build your blog again. (Update: In fact, about.opml is just used for representation. You can name it anything, as long as you configure the value for urlAboutOpml accordingly.)
  6. Link Blog: If the concept of linkblog excites you, you can use another software by Dave, Radio3. Just add a new head-level attribute urlLinkblogJson pointing to your linkblog JSON file, which would look something like http://radio3.io/users/<your-user-name>/linkblog.json.
  7. TimeZone: To make sure the dates are rendered correctly on your blog, add a head-level attribute timeZoneOffset for the place where you would be blogging from. The value should be the offset from UTC — for example, +5:30 for India or -4 for New York.
  8. Creating Post: Head over to your blog.opml file in Drummer and click on the + icon (for New Note), write what you want to write and rebuild your blog. Your post should be up.
  9. Adding Links: Select the text to which you want to add a link, click on the “Link” icon (the second icon from top in the icon bar that sits on the left of the editing area) and insert the URL.
  10. Adding Images: This one’s slightly tricky. First, have your image hosted on some place where it would be accessible publicly. Get the URL to your image. While on the item you want to associate the image with, click on the “Edit attributes” icon (the third icon from top in the icon bar that sits on the left of the editing area). Now you can either create an inline image (with attribute inlineImage), right-margin image (with attribute image), title image (with attribute metaImage). I wish this work was simpler.

At this point, you should have a well-configured blog up and running. Keep Drummer interface open in tab and keep adding entries. This method of updating your blog will soon grow on you.

What else can I customise?

Even though you have all the basics covered till now, there is still a lot that you can and should do. But I would recommend get comfortable working Drummer and check for yourself if the workflow fits your routine and liking. If it doesn’t, these additional configurations are just a distraction.

Anyway, if you find out that you are enjoying this system of blogging, here are links to a few additional configurations that you can perform.

A Few Additional Notes

  1. There’s a Mac app (electron based) called Electric Drummer that can act as an outliner. However, you should avoid using it for blogging if you intend to blog from multiple systems. Changes made through the app can overwrite ones as done on the web Drummer. So thread carefully.
  2. Drummer is evolving. Dave is working hard to make sure all serious reported issues are resolved. Early adopters are trying out a hundred things independently. If that sounds fun, the Drummer support issues page is the place to go.
  3. You can stay-to-date with all things Drummer by following this official blog.
  4. How does Drummer cost zero? Dave answers.
  5. Why is Drummer, and other software from Dave, so tightly coupled with Twitter? Dave answers.

I intend to use Drummer as a place where I form my thoughts over the time. The ease of the updating process makes posting unformed thoughts a breeze. So, in a way, this space represents the most raw me. You can follow this me as he experiments with my Drummer blog. And of course, there’s an RSS feed.

Finally, I have completed a pretty tricky exercise that I had started about a couple of weeks back. It wasn’t tricky because I wanted to move my website to a different platform. It was tricky because I wanted to do it cleanly. I wanted to retain as many things that worked well for me as I could. I didn’t want to break much that was core.

So, after days of experiments and trial runs, and notes and list of reviewed to-dos, I’ve managed to switch to WordPress. I will note down why someday - one short, but big reason though is editing. I am tired of working custom solutions with Blot – it’s a great service, no doubt. But you need to love your files a lot. I am currently not in that phase.

Anyway, as intended, the core is retained. The links are (hopefully 🤞) not broken. #IndieWeb support was a must, have stitched that in. The option to switch to a dark theme was a must. A simple reading experience was a must. I’ve managed to get good writing experience too. So, times now to sit back and relax.

Do let me know if see anything that’s not working well. I won’t mind if you also let me know if everything’s working fine.

I have been working with David Merfield on a little side project. The idea started simple - what if there was a simple posting interface for Blot? In extension, something that one can use to write and publish a post to Dropbox. Blot is simple as-is for writing and posting (it’s all files). But there are times when I do want to quickly post from my web browser. And for such times, I still need a simple writing interface.

That thought was enough to interest both me and David. We got to work. The project got neglected in between. And then was picked up again. And I think, it is in a state now where it can really be useful to a few. I can attest to that because I, myself, have been using it for few days now.

Here’s Wall — a web-accessible text-editor over Dropbox, works nicely with Blot.

I believe this would be useful for many. It is clean. It is light, pure-client side application. It supports local drafts. It can export markdown. It can publish to Blot. Perfect for all those text posts.

I have my own fork of the project where I want to use the editor and support publishing to multiple places. To start with, I have extended it to post it anywhere in Dropbox.

I have hosted it here as Scribe. I plan to extend it next to be used as a micropub client. Still in works, though.

Of course, this is not perfect yet. For one, it does not work well on smaller screens. But it is a good enough. Do give it try.

Over the last week, I’ve added some features to Blotpub that were long in works - support for syndicating longer posts, support for updating posts. I’ve also automated sending of webmentions to the target sites for reply and like posts types. It’s been some productive week this.

I am having fun getting back into Indieweb stuff — working on adding support for updates to Blotpub. This has been in works for so long, I had to get to it. I also recently added support for syndicating longer posts to Twitter and Mastodon. Always makes me relaxed.

A quick question for the IndieWeb community here, how do you send the webmentions? Is it automated on posting? Is it part of the micropub or an independent script? Are there ready resources, scripts or tools available? I couldn’t find much on indieweb.org.

I have completed the consolidation exercise that I had planned to carry out this weekend. All the posts exist on the home page of the root domain now and is hosted by Blot. There are no sub-domains for separate posts. There is no landing page. It’s all words.

Of course, I had butterflies in my stomach before I began the whole exercise. I had posts spread across different categories. I had very specific styling done for some rarely used components of the blog posts. And I had pages.

Then I had some complex pages and posts. It was the thought of migrating this varied content that made me a bit edgy. Posts like this guide on moving to Hugo. Or this one about displaying webmentions along with posts. I had to manually migrate such posts along with the necessary styles.

I am happy overall with what I have achieved. Things are simpler now. If I have to post something, I know where it would be. Doesn’t matter what the nature of the post is. This space now supports all types. Along with the /now page reseted to begin from now.

What this also means that I have to bear with few things. I have lost webmentions to the blog sub-domain posts. I have to reset my indieweb presence, clear all caches with indieauth sites. Thankfully, not much was broken that couldn’t be fixed simple re-logins and re-configurations. I (and you) have to bear with the configured redirects to propagate through the Internet and reach all. So the old links will stay unreachable till that happens.

I have kept the Hugo site alive. It hosts the archive, something I did not want to carry along. I just restyled it to make it resemble a timeline leading back into the time. I do not wish to ever post to it again. Simplicity of maintaining and updating my website with Blot has won me over.

When you have a mind not too clogged with some insignificant thoughts, one can get things done. I managed to add support for syndicating posts to Twitter from Blotpub. A minor update, sure. But an update nonetheless after a long time. Good to have the focus back.

I realized today that it was on this day a year back that I had opened Micro.threads to all. It was the first project built ground up that I had made available for every one to use. The earlier projects were either customized or personal. It has been a wonderful learning experience.

It was also an opportunity for myself to gain confidence. It kick-started my journey to more hobby projects, inspired me to even write more. Funny how few small beginnings can turn into significant projects.

Recently David documented the steps to expose a JSON feed on a @Blot site. I’ve been running a JSON feed for my blog for some time now, which also drives the On This Day page on my blog. I shared my approach so that others with a site running on Blot can create such a page.

Adding On This Day feature to Blot

Recently David Merfield, the developer behind Blot, documented the steps to expose a JSON feed on a Blot site. I have been running a JSON feed for my blog for quite some time now, with some valuable help from David of course. It is this feed that drives the On This Day page on this blog. I thought I will share my approach so that others with a blog running on Blot can create such a page.

To begin with, follow the guide to get a working JSON feed for your blog. Validate you have a properly formed and accessible feed being served using the JSON feed validator.

One key thing to understand here is how to create a view in Blot. It would be important to be aware of this step to proceed further. A view can be created in Blot by accessing the editing template section (Settings > Template) in Blot dashboard. Click on Edit against your currently installed theme and search for an option Create new view.

Once the JSON feed is available, create a view in Blot for a javascript file. Copy the complete content of the javascript available as a gist* and add them to this new view. Modify the json_feed_url and tz variables appropriately to reflect the URL for the JSON feed and the timezone for your blog, you can refer to the formats in TZ database time zones. This script does the following.

  1. Fetches all the posts as JSON objects from the JSON feed
  2. Identifies the posts that share the same date and month as the current date (but not the year to avoid loading today’s posts)
  3. Renders the posts (or no posts message) in the predefined section detailed below. This also includes some styling via the .className definition, you can remove/modify that as per your liking in fuction renderPost.

Make sure the above created view is accessible at a URL. If not, define a route in the Settings section of the view.

Next, create another view for a page to display these posts; a reference html page is available as a gist. Modify the src in <script src="/flashback.js"></script> to reflects the URL for the javascript created above. The script adds and renders the posts made on this day in earlier years in the div element with id on-this-day.

Do give this a try, it is fascinating to see your thoughts change, or at times stay exactly the same, over the year. Reach out to me if you face any issues or find any step missing.

TL;DR: Expose a JSON feed on your site. Create two views in Blot using the gist flashback.js and on-this-day.html. You should have two additional pages, you can use the same file names. If you do, you can access your On This Day page at /on-this-day.

* This javascript is inspired by and based on the wonderful project Micro Memories by Jonathan LaCour for the micro.blog hosted blogs. I have customized and simplified it as per my needs.

On this day, a year ago

Around a year ago, I got enthralled by the IndieWeb principles and started experimenting with them on my website. Exactly a year ago today, I had started contributing on the Micro.blog platform. And it has been a very productive year writing-wise since then.

I have expressed myself a lot more in the past year. I have thought a lot clearer, a lot better as a result. It is all thanks to the wonderful interactions on the platform.

What it also means is that I have a year worth of posts to look back upon. And I thought what better way to do so than getting the On This Day page added to my blog. I have done that. It presents how the journey started - if nothing else I myself can follow the thoughts along as they evolved.

Will it stick in this same form? May be not. I may experiment a bit on how I see this feature. But I have got the base working now for my blot-based blog.

PS: This feature is based on the wonderful project Micro Memories by Jonathan LaCour for the micro.blog hosted blogs. I have just customized and simplified it as per my needs.

Humble brag alert - Micro.threads used up my free dyno hours on Heroku, for the 1st time. Plus few people successfully setup and used Blotpub. It’s gratifying to see something you build being of some help to others. May sound like minor wins - but for me, no win is ever minor 😁

Stop Making Software Complex

We, as an industry, need to find ways to simplify the process of building software, without ignoring the legitimate complexities of businesses. We need to admit that not every application out there needs the same level of interface sophistication and operational scalability as Gmail. There is a whole world of apps out there that need well thought-out interfaces, complicated logic, solid architectures, smooth workflows, etc…. but don’t need microservices or AI or chatbots or NoSQL or Redux or Kafka or Containers or whatever the tool dujour is.

A lot of developers right now seem to be so obsessed with the technical wizardry of it all that they can’t step back and ask themselves if any of this is really needed.

I can’t agree more with the whole premise of this article. The quest for adopting new, trending technology is making the overall design of the software we are building extremely complex. I can’t recount the number of times we are made to select the technology first to solve the problem at hand. It should never be so.

Software will always be simple and reliable if it is built to the address the problem it aims at with whatever technology - platforms/frameworks/solutions - that suit best. More often than not, simpler solutions are the most efficient ones to build and maintain software with.

Chris Lattner kind of sums it perfectly.

Moving from Squarespace to Hugo

This is my personal place, a destination where one can find every thought I ever post on the web, anywhere. At times it originates, and so just exists, here. There are also times when it’s published at some other places first, but is also made available here. It has been in existence since 2008 and just like every year, this time too I wanted another fresh start for this place.

I have already documented all the history behind and the context for the existence of this site and this page. Here, I intend to document all there’s to know about this site.

Before I get to the details, this is what I set to achieve when I began.

  1. A website designed, in and out, to my liking, with every knob controlled by me.
  2. A landing page with a brief about me and the site. One that clearly links to the key content.
  3. Clean and simple experience, while reading a post or navigating the site.
  4. Consistent writing experience, preferably offline, across mobile and desktop.
  5. Source control for the whole place. No fallouts from brain freezes.

I do not believe what I sought out was that complex. So I was confident I could get this working.

Here’s the TL;DR version of what I have achieved.
1. This My old site was built with Hugo — it is extremely simple, highly customisable, well documented and has an active community. It’s difficult to beat all of that.
2. The look and layout of this site is themed by an extremely personalised port of the original ghostwriter’ theme. I intend to open-source the same soon.
3. The source for the complete website along with all the posts, as markdown files, resides in GitHub. Every change to this setup is driven as it would be in a standard git project.
4. Contents from Squarespace were exported into a Wordpress package first. They were converted into markdown files using ExitWP. Followed by cleanup. And deploy.
5. This site is deployed by Netlify. With continuous deployment and one-click SSL for custom domains possible with minimum configuration, the choice was pretty simple.

Core Engine - Hugo

I had always wanted to attempt a site creation from scratch, but I failed miserably every single time. Given I had ample time before my Squarespace subscription expired, I attempted it again this time. I believe I did not fail. This is a static site, built with Hugo. It was the ease with which I could get a site running on my dev environment via Hugo that convinced me about the viability of this whole project. If you do not believe, just head over to the Hugo docs for a quick start and begin. You will have a site running by step two. It is that easy.

You would have also realised how well document the whole framework is from your visit to the quick start guide. There is nothing that you want to achieve that isn’t documented. In addition, given that Hugo is written in GoLang, it gave me an opportunity to learn a new language. Post that, every need of mine to get the things just right was just a code snippet away.

For example, find below a snippet for fetching a list of random five articles. Yes, it is easy. And a lot powerful.

{{ $pag := where .Data.Pages “type” “post” } } {{ range (shuffle $pag | first 5) } } {{ ….custom…. } } {{ end } }

And if it does turn out that there is some tricky edge case that you just can’t get your head around (or you are being plain, simple lazy), there is a thriving community of fellow users which is extremely active and a lot helpful.

TL;DR: Hugo is simple, highly customisable, well documented and has an active community. It’s difficult to beat that.

Personalising the look & layout

Once I had the core finalised, I shifted my attention to personalising the site. And again Hugo comes with a lot of good looking themes — extremely minimalistic to fully loaded. You will always find the one for your liking there.

If you, like me, do not find one that ticks all the boxes for you, you can select any that is closest and get to personalising. All the themes come with the source code. So if it suits you, let the developer in you go wild.

I began with a theme Ghostwriter. It was simple and I could see how it can be extended to enable every aspect that I wanted to achieve. So I began working. After a week of customisation, I could finally see the site shaping up just the way I imagined.

I intend to soon open source the changes I have made to the original theme. I am working on cleaning up the source and committing. All the enhancements and personalisations added to the theme are available at Github. If you like the theme that you see and if you are using Hugo for building your Static website, you can download and use the theme from here.

TL;DR: The look and layout of this site is themed with an extremely personalised and open-sourced port of the original ghostwriter’ theme. I intend to open-source the same soon.

Cushioning against brain freeze

Yes. Commits and port. I am not letting another of my brain freeze moments to spoil all the efforts the put in over the years. Refer the history section I mentioned in my introduction above.

So whole website is a git project. It is currently maintained as a private repository at GitHub. Every change, major or minor is committed. Every milestone is tagged as release. And every major enhancement is pull request. No, I am not taking any risk with myself this time. Here is a snapshot for the effort that has gone in to bring the v1 of this site.

Do I intend to make the source of this website public? Well, initially I wanted to do just that. However, I do want to keep my messy drafts, be it to the posts or the website, just to myself. I could not find a public way to achieve that. So as of now, the source stays private.

TL;DR: The source for the complete website along with all the posts, as markdown files, resides in GitHub. Every change to this setup is driven as it would be in a standard git project.

Migrating the content

Talking about the posts, I had to bring the old entries along from Squarespace. After all, this is also a place for my writings. I would not want to loose any of my old ones1.

This time, though, I did not have the luxury of the out-of-box imports. I had to do it on my own. Well, I did have a couple of points playing on my side.

  • I have been writing all my posts in markdown format and exporting them as required.
  • Current setup with Hugo is all markdown driven, where every content exists as a .md file.

So, all I had to do was find a way to export the content from Squarespace as markdown files. I wish it was that simple; it wasn’t. The only option that Squarespace supports for export is as a Wordpress package. However, anyone who has been blogging for even a slightest of time would know Wordpress package should be fine. Because there is nothing to be done with a Wordpress package that no one else has already tried. Just getting markdown files out of that must be a cakewalk. Markdown, after all, is a geek’s solution.

And as I thought, it already is handled. ExitWP is a great tool to migrate a Wordpress blog to a static site. It is introduced as a tool to convert to the jekyll blog engine. But that should be fine. Both Jekyll and Hugo use markdown files as content.

After going through the steps as documented at the git repo for ExitWP, I had all the content available as markdown files2. It did need the below minor cleanup.

  • Images had to be handled separately. All references were to the Squarespace domain. Thankfully, I maintain a credit link with every image to the original one. So I just had to re-download, compress and deploy them.
  • Front matter needed porting to the Hugo standard. I did weigh in the option to write a script to do that. But then ended up siding on doing it manually.
  • Post content did need some minor fixing. ExitWP has some issue handling and regenerating the emphasis, especially around symbols (for example, quotation marks, dashes etc).

Deploy the post, test each one from the post link on dev and I had all my content back. Thanks to this effort, I believe I never have to worry about porting out my content ever. Every published copy of a post stays as a raw file with me.

TL;DR: Export contents from Squarespace to Wordpress package. Use ExitWP to convert it into markdown files. Cleanup. Deploy.

Deploying with Netlify

Once I had a site running on dev and tested multiple times to bring it to my liking, I had to start thinking on a place to deploy it. And of course, Hugo has all the possible options well documented.

As my code was in GitHub, the first option I tried was to deploy it on GitHub Pages. I configured Hugo to generate the static pages in a defined directory (configured as submodule for the GitHub pages repository). I built my site, pushed the changes and deployed, and it all looked fine. However, there was just one problem — the deployment workflow was a bit messy. In addition there were few more niggles3.

  • There is no provision for SSL with custom domains. So they cannot yet be delivered over secure http.
  • Auto-triggering for build and deploy had to be configured as web hooks.
  • Given the deployment workflow, publishing from mobile was just out of question.

On reading some more, I found a far simpler option in Netlify. Again I will let the official document explain itself.

Netlify builds, deploys and hosts your front end. It provides continuous deployment services, global CDN, ultra-fast DNS, atomic deploys, instant cache invalidation, one-click SSL, a browser-based interface, a CLI, and many other features for managing your Hugo website.

One might say jargon, but there are key needs I had which GitHub pages just didn’t handle — a couple being continuous deployment and one-click SSL. So I did another deployment with Netlify and again fell for the simplicity of the things involved. No configuration head-ache. No custom workflow to handle the built site separately.

Write Frontend Code. Push it. We handle the rest.

Yes it, indeed, is that easy. It doesn’t matter then where you push to the repository from, mobile or desktop.

There is one issue with the Hugo documentation though. One does not need to trigger a build command with Hugo version number appended in it. Just configure a parameter in the build for the version of your Hugo environment.

Once the Netlify account was created and the continuous deployment for the site setup, I just followed the documentation for using custom domain and setting up SSL. The site was live.

TL;DR: The deployment of this site is handled by Netlify. With continuous deployment and one-click SSL for custom domains possible with minimum configuration, the choice was pretty simple.

Change log

So to summarise, I have first releasable version of this website ready. Built with Hugo. Themed with Ghostwriter. Run with Netlify. And of course, it is just v1.

Musings Et Al. v1: First version of the website with all the clogs designed and working as planned. It hosts below custom features.

  • Support for write-up section on homepage driven by config.toml
  • Support for headshot on the homepage
  • Support for displaying the latest featured post on homepage
  • Support for link posts (via refs param in front matter)
  • Support for related post along below the content of a post
  • Link to the image credit (via imgsrc param in front matter)

  1. As a side note, all my old posts still exist on Wordpress. You can read them here.

  2. I did face some difficulties while installing the dependencies. In case you hit them too, just download them from the official sites and have them available in the classpath. It doesn’t matter the approach is crude, it should get the work done.

  3. In case you do want to go a
    head with GitHub Pages, I would suggest you go ahead with the option of deploying from the master branch itself. Hugo documents this as the last option. But I feel this is simpler and a viable option.

Own your blog: With Ghost and Digital Ocean

Image Credit: Dave

Ever since I decided to own and host my site, i.e. basically ever since this place has existed, I was planning to write down my reasons and choices for the engines that run this site. Couple of feedbacks finally made me jot down the thoughts.

One thing I was sure about was I did not want to not control any of the knobs of my blog. So I had to go all in.

  • Own the domain first
  • Run and customise the blogging engine
  • Host the engine


Deciding on domain name was simpler part; that is once I had given up on all the crazy pseudo-names I wished my blog would have. So I went ahead with my real name. Simple.

To register a domain, there were a lot of options out there. Some were way cheaper but were sucky and known to follow shady-practises. Then there few that were comparatively costly, but simple.

I had heard so much about one such simple, no-nonsense domain registration service, Hover. Few visits to Hover and I decided Hover was the one that fit my high-horse attitude the most. I usually tend to support the service providers with principles. And it always comes at a cost.

So I registered my domain via Hover. The experience was simple and positively uncluttered. I recommend the service. Give it a go. You will be impressed.

Blogging engine

I have been blogging for quite some time now and have owned the free blogs at Wordpress.com, blogger, tumblr and even posterous. I even hosted a blog with Wordpress.org. Each had their own benefits and shortcomings.

  • Posterous was simple. But it was way too simple.
  • Blogger allows heavy customisation, and even monetization via Google AdWords. But it is way too childish. It does not have a professional, or a ‘mature’ look to it.
  • Tumblr has nice social sharing features. But that is what it is. It is more of a social network for bloggers rather than a blogging engine. Plus majority of the themes are not good for text heavy posts, which mine always are. It’s perfect for images, especially gifs.
  • Wordpress.com/.org is the biggie in the space. It has everything possible under the sun. Customisation, extensibility, theming. But it is way too heavy. And far too common. I never like common.

So I was on a look-out for an option that is simple, lite & powerful and gives me a lot of control with what I can do. Enter Ghost.

Ghost is a simple open source blogging platform that you can completely own. It provides simple writing tools. I have already detailed what I like about Ghost in the first post here. Even the community has accepted it, so there are a lot of customisation options available too.

Plus if you like coding even a bit, there is nothing better. I had my Ghost blog running on my local machine and I was satisfied, only after some customisation i.e. I adopted and adapted the Vapor theme from Seth Lilly.

All that remained was to make it available on the internet.


Final call I had to make was about how to host the blog I had running on my local machine. One thing I did not want to do was go with a PaaS solution; basically the solutions that provide you just the platform where you can upload the blog and you are up.

In a way, Ghost made my decision to go against PaaS easier. There are hardly such services that support node.js, javascript based platform, on which Ghost is built.

I had decided to either go all in, i.e. get a virtual server (VPS) or simply not worry about hosting myself.

Ghost allows you both the options. You can either go pro with Ghost and let the team handle the hosting for you, like wordpress.com. Second options is to go free and host it yourself. I knew I wanted to go with the second option. And I did.

For getting VPS, I just had two options shortlisted, Linode or Digital Ocean. Linode was costlier. A more pro-dev friendly. Not something I was ready to sign up for with such simple requirements as mine.

On the other hand I had earlier experience, mostly positive, with Digital Ocean. Plus it had Ghost application pre-built.

So it was really as simple as creating a droplet and I had my blog up. Finally, I also wanted to secure up the Linux node, and an amazing article from Feross Aboukhadijeh got me rolling. It is written for a Linode node; but it can very well work for any Linux server out there. Do not forget to follow these steps. They are must if you are to keep the node running even for short time.

So a day in and I had a secure Linux VPS node running my blog which was completely customised by me, as per my needs. And it was satisfactory experience and a fruitful journey.

Here's to another start!

This site is a result of in-numerous attempts at pushing myself to own my blog, again.

My last attempt was significant for me because it allowed me to fully host and own a wordpress blog. It had a good run through my bachelor life, got neglected later and finally shuttered, post marriage. Posts still reside, though, at a wordpress.com blog, which, deep inside I knew, was nothing but a placeholder.

So my wait continued for the inspiration that would push me to create and own, again, a simpler place for my thoughts. And that inspiration came from Camel, the blogging engine from Casey Liss of atp fame.

The inspiration, though, was not because I liked Camel, which even now I haven’t made my mind about. But it was because I wanted to have something as simple as what Casey had, and get that done in an equally simpler way. At the same time, I also wanted to learn and try something new.

I knew my requirements were not complex, neither did I expect my audience to be huge. So I needed something simpler than a full fledged, php-rich, wordpress blog hosted on a dedicated host, which I also realised is too costly for my needs. Enter Ghost!

New Beginning

So this is where my quest led me to, a simple Ghost based blog to jot my thoughts down. The reasons, I had my own.

Simple I had heard so much about Markdown before. I felt everybody, almost everyone who writes for himself, was using Markdown. And every one of them had all the nice things to say about it. Even I tried learning it numerous times. But, I realised now that it is only when you use it that you appreciate the simplicity of it. It really makes writing, just about writing. Something I really needed.

New I wanted to change everything, the way I write my posts, the way it looks, the way it works and the way I would host. I was bored of all that wordpress or even tumblr, something I played with for sometime, provided. It all felt the same. For some time, I even thought about just using Camel. But then I would have had to work even on the engine along with writing, which I didn’t want to sign up for just yet.

Not costly For hosting, I wanted to meet the above 2 points first, at the same time consider the cost factor. A free option existed with Heroko as suggested by Casey and Greg Bergé. However, I either wanted to go all in, with hosting on VPS or just stick to the simplest option from the creators of Ghost. Anything I chose, would have turned out to be a lot cheaper than what I paid for hosting the unnecessarily complex wordpress blog.

What I, thus, have is a simple, minimalist place for me to just write. I own, again, a self-built, self-hosted blog. Here’s to another start!

[Postscript] There would a temporary phase when I focus more on the place than on writing. However, I intend to cross that phase pretty soon. Whatever that results in, I feel, should, more or less, look pretty similar to this.

[Postscript 2] I have writen a followup post that explains the whys and how-tos of this complete process.