Command Line Blogging in 2 Commands Skip to main content
samwho logo, a small keyboard arranged in a 3x2 grid, with 'sam' at the top, and 'who' at the bottom. A cable runs from the top of the keyboard to off the top of the screen.

Command Line Blogging in 2 Commands

It's exam season for me at the moment and I really hate revising. Because of that, I'm doing what I call "useful procrastination". I work on something useful that isn't to do with exams for the sake of avoiding having to revise.

During the most recent round of useful procrastination, I created something I'm calling "echochamber", which gives me the ability to write and deploy a blog post in two simple commands.

Prerequisite knowledge: Some command line fu and perseverance if you want to get this working for yourself.

Before we start, I want to say that this is very DIY. I made echochamber specifically for myself. There's nothing stopping you taking my code and adapting it to your own purposes but it really isn't designed for that and there will be work involved in getting it working on your system. It's better to understand how I've done it rather than trying to take my code and retrofit it to your environment. In future, I might work on making echochamber something that can be distributed as a gem.

# Writing a Post

So, here's how a typical new blog post is started with echochamber:

$ echochamber "This is a post title"

That will open up whatever my editor is, defined by the EDITOR environment variable, with some "front matter" at the top. The term "front matter" will be explained later.

# Deployment

Done writing?

$ echochamber deploy

Done.

# Wait, how does that work?

This is the part where it becomes evident why this project is specific to my setup.

# Deployment

The actual website I publish to, echo.samwho.co.uk is hosted on Heroku. This is what the deploy command does in the background:

$ cd /path/to/echochamber/project
$ jekyll
$ git add -A
$ git commit
$ git push heroku master

In this process, I get prompted for a commit message thanks to "git commit" not receiving a -m argument. The jekyll command regenerates the website using Tom Preston-Werner's awesome jekyll project. If you haven't already, I recommend you check it out.

# Post creation

As the previous section noted, echochamber uses the Jekyll project at its core. Jekyll is a static site generator that allows you to quickly create a website structure and get a blog off the ground. It's well worth looking up how it works if you want to mess around with the code in echochamber.

Jekyll uses a very specific format for naming posts. Posts must be named YYYY-MM-DD-title.format, where format can be markdown, textile or a few other things. The echochamber command looks for your editor in the EDITOR environment variable or defaults to vim if it doesn't find anything.

Currently it's a bit hacky. If it finds vim, it sends some specific commands for populating the post and moving the cursor to a convenient location ready for typing. This is convenient to me and if you use a different editor, the post will initially have nothing in it. Jekyll allows you to have front matter, which is YAML data that you can attach to your post. Stuff things is post title, published date and layout (to find out more about layouts, click here).

If you aren't using vim, you will need to include the front matter manually or send me a pull request with code specific to your favourite editor.

# Previewing posts

Echochamber comes with the ability to preview posts before you post them:

$ echochamber preview

This is essentially just a delegation to the following command:

$ jekyll --server --auto

Which runs the Jekyll server on port 4000 and automatically regenerates the site if files change. Nifty to have running while you write your post.

# Continuing where you left off

Because it's not very often a blog post is written in one sitting, echochamber has a command that lets you reopen the latest post you were working on:

$ echochamber latest

This will literally just open up the last edited post, based on file change times, in your editor (again, based on the EDITOR environment variable).

# Setting up on your machine

The process is very cumbersome at the moment. Here's what you would have to do.

# Add the bin/ directory to your PATH

Using whatever method you prefer, you would need to add the bin/ directory under echochamber to your PATH. Personally I have this line in my .bashrc:

PATH=$PATH:/path/to/echochamber/bin

Alternately, you could add an alias:

alias echochamber='/path/to/echochamber/bin/echochamber'

# Adding your Heroku remote

This will definitely need to change in a future iteration. What if you don't want to deploy to Heroku, for example? But for now, you would kind of have to unless you wanted to edit the code, which I would be totally cool about.

You would need to create a new application on Heroku and add that remote to the echochamber git repository on your system (you would, of course, not to clone the repository to do any of this).

Heroku have a great getting started guide. I recommend you read over it to get a feel for how Heroku works and learn how to setup Heroku and create an application. You will need to create an application in the echochamber directory for echochamber deploy to work.

# Moving forward

Yes, this is still rough around the edges. I just wanted to show off the mechanism I had created for making blogging easy :) In future I think I will probably be making a lot of changes to how echochamber works so that it's much, much more usable for others. Until then, if you really are compelled to use it and aren't having any luck getting it working, drop my an email! You can find it in my contact page up at the top.