A couple of posts back, I announced I was going to test out some task management apps I hoped would help manage my blog. As noted, I had notes and lists of tasks scattered all over the place, and ideas were slipping through the mental and digital cracks.
Task and project management software is a very crowded space, and to be honest I was little daunted by the overwhelming choice. My original idea was go for a light-weight task manager, and one that was native to iOS and macOS. Even narrowing the field, there’s still at least a dozen apps I shortlisted to try, each with a varying degree of cost and complexity. Oh, and I wanted this problem solved a month ago, so my patience was already lower than I care to admit.
As it happens, I'm already familiar with a stupidly powerful system, Jira. Jira is enterprise-grade project management software, and at work in my day job I use it to write and generate release notes. In a rare light bulb moment, I wondered if I could use it to manage my blog.
Let's find out!
As with all my reviews, let's get the costs out of the way. Like many cloud services, Jira has a Forever Free tier, which is what I'm using. For my purposes, I can't see myself ever need needing more.
Beyond the free tier, you get more storage space, and support for a princely sum of $7 USD per user, per month. If I ever outgrow the free tier, that’s a tolerable sum, though I don’t think that eventuality will arrive.
Stories as posts
Jira works on the concept of Issues. By default, Jira gives you 4 issue types: Story, Bug, Task, and Epic — terms borrowed from the Agile method of software development. For blogging, I only really need stories, which I'll co-opt into my posts. I could in theory use an epic to group posts into a series, but since I don't write many of those, I'll leave it for now. I guess too, I could use Tasks to represent something I have to do to the site itself.
For now, I'll work on the premise that one Story equals one blog post. Out of the box, each Story comes with a number of default fields. The most important are the Summary and Description. I'll use the Summary as the post title, and the Description as article's synopsis.
Here's the issue for this post.
So far, so good... but Jira can do much more.
Stories can also have Components. I'll use these as blog categories, for example: Review, Tutorials, Journal...etc. Creating them is straight forward, and once done you can add them to individual Stories.
Here’s the list of my categories expressed as Jira components.
Naturally, you can also browse Stories by their component, which returns a handy column view of stories and their details. Jira has almost infinite flexibility in how you can sort and display data, which is one of the reasons for thinking I can wrangle it for blogging.
What about the big picture?
Even before I decided to try Jira, I knew I wanted to use a Kanban board to manage the process. Kanban is a simple but effect means of visually tracking work through its designated life cycle. Though the modern corporate adoption is credited to a Japanese manufacturing innovation, the concept of moving index cards across a lined board is pretty old, at least in the publishing industry.
Jira provides a Kanban view out of the box, using Agile terminology. I renamed the columns to match my writing and publishing process, namely Ideas, Drafting, Editing, Published. It's easy to add columns, and I may do so as I refine my process, but that will do for now.
Once set up, change the status of a story is as easy as moving it between columns.
Wait a minute, what about Trello?
Good question. Trello is a consumer friendly Kanban app, also owned by Atlassian, the Aussie company that makes Jira. While I like Trello, I personally find its free tier is too limiting for my needs, and the paid tier is $10 USD a month. It also lacks Jira's automation power which I'll get to shortly.
Taken together, I can see myself having to upgrade quicker with Trello than I would with Jira, and I’d end up paying more.
Part of the organisational mess I'm in was due to the inconsistent way I captured my ideas. Some went into Apple Notes, others went to Ulysses — and worst still, I emailed many of them to myself, often losing them within days.
Apps can solve this problem by providing a convenient mechanism to capture data, no matter where I happen to be. Atlasssian provides a pretty decent Jira app for iPhone. Now, whenever I’m out and about, I can quickly create a jira for an idea I get, save it directly to my board.
On the iPad (where I often work), the app expands rather nicely, giving me a view that’s large enough to manage my workflow with a little more elbow room.
At work, I've bent Jira to my will, using its API as the backbone of a technical publishing system glued together with Python. I'd be daft not to leverage that capability for my blog. My first idea was to rip the guts of the Story, and use it to generate my blog post's metadata.
Jira’s API works by exposing data as XML.
If you choose to export your jira as XML, it will display in your browser. Thanks to a consistent URL structure, it’s really easy to rip the data using Curl, and pass it with whatever XML library you happen to like. Since my weapon of choice is Python, I have almost everything I need in the standard library, even on the default Python that ships with macOS. The only thing I had to install was the pycurl library via Pip.
Note that to connect with your Jira cloud account, you need to create an API token and use that instead of your account password.
As a proof of concept, I decided to write a script that takes a jira’s Summary, Description and Components and use them to populate the YAML header my static-site generator Pelican uses to build web pages.
Most of the work is handled by two simple functions, one to connect to Jira using CURL, the other to parse the resulting XML into YAML.
Here’s my curl function…
def getJira(username,password, jira): buffer = StringIO() c = pycurl.Curl() c.setopt(c.URL, 'https://MYPROJECT.atlassian.net/si/jira.issueviews:issue-xml/%s/%s.xml' % (jira,jira)) c.setopt(c.USERPWD, "%s:%s" % (username, APIToken)); c.setopt(c.WRITEDATA, buffer) c.setopt(c.SSL_VERIFYHOST, 0) c.setopt(c.SSL_VERIFYPEER, 0) c.perform() c.close() body = buffer.getvalue() return body
…and here’s my parser function, which takes the data returned by getJira and turns it into YAML.
def parseJira(jira): root = ET.fromstring(jira) item = root.find(".//channel/item") itemKey = item.findtext(".//key") component = item.findtext(".//component") summary = item.findtext(".//summary") description = item.findtext(".//description") stringToWrite = "Title: %s\nCategory: %s\nSummary: %s" % (summary, component, remove_tags(description.encode('utf-8').strip())) return stringToWrite
Note, the remove_tags() function — that’s another function I wrote to remove HTML tags using regular expressions — you could do the same with Beautiful Soup, if you prefer that library.
Anyway, the story’s Jira ID is passed to the script as an argument on the command line. The output, a couple of lines of YAML, is shown below.
While that might look boring, it’s just a proof of concept — there’s a heck of a lot of potential to be gained by automating Jira and accessing the data programatically.
Take my proof of concept and use it with Automator, and you can bridge the command line with regular Mac apps. I did something similar when I created my poor man’s version of Text Expander, and I’ll be expanding it to work with my new script. This way, I can type the jira’s ID the top of the article’s markdown document, and transform it into YAML.
Beyond this, the sky’s the limit.
I wish I’d thought of using Jira ages ago. Though built for managing software development projects, I was able to wrangle Jira to my blogging needs with minimal effort.
Jira’s everywhere, especially in the corporate space, where I first learnt its use. The upshot is that if you learn to use Jira, even for a personal project, the skills will translate into the corporate space. Agile is the latest management trend, and Jira is at the forefront of agile project management.
There’s very good reasons for Jira’s ubiquity, and that’s because Jira is powerful, enterprise software that’s also easy to use, even for non-developers — hell, even Jessica Alba can create a Jira.
For someone with a modicum of development skills, and a little imagination, Jira’s API opens up a world of possibilities for automating your workflow and passing data between apps and even other web services.
You can use the service for free…and best of all, at least of me, Atlassian is an Australian company!
I’m undecided now whether I’ll review my original shortlist of macOS/iOS task management apps. I’ve found the tool I need, but I have still have my shortlist and I am still curious about checking out other options. So, if you do want to see other project/task management reviews, do let me know either down in the comments, email or social media.
I rant about task management, review an interesting but flawed IOS app beorg, and ask myself if Emacs and Org-mode is too deep a rabbit warren to fall into.
Apple removes Mac and iOS apps from their affiliate program, giving the finger to the blogger community who helped spread awareness through app reviews and podcasts.
I contemplate a switch to Wordpress and Ulysses for blogging after four years of using a static-site generator.