Krzysztof Żuraw blog

On moving blog to Gatsby.js

November 04, 2017

Sometimes it is time to change and I decided to move from Pelican to Gatsby.js.


I got a problem with Pelican. If I wanted to add custom behavior to my blog (like linking articles to each other) I cannot do it in the fast and easy way. The same was with custom styling - Pelican generates html with always the same styling - it means that I have to write a lot of CSS to have my webpage done right.

What I liked in Gatsby is that I can connect any data source to GraphQl and have my blog running! Also, I see some educational aspect - I can learn more about JavaScript ecosystem.

Moving blog

Based on that I made the decision to migrate my blog to gatsby. But I got a problem - my blog posts are written in rst format. To convert them from rst to markdown I used pandoc:

import argparse
import os
import pypandoc
import markdown

def convert_rst_to_md(input_path, output_path):
    rst_files = os.listdir(input_path)
    for rst_file in rst_files:
        output = pypandoc.convert_file(
            os.path.join(input_path, rst_file), 'md', extra_args=['--standalone']
        md = markdown.Markdown(extensions=['markdown.extensions.meta'])
        date_in_str = md.Meta.get('date', 'Not valid date')[0][1:-7]
        file_name = rst_file[:-4].replace('_', '-')
        dir_name = os.path.join(output_path, f'{date_in_str}-{file_name}')
        with open(os.path.join(output_path, dir_name, ''), 'w') as markdown_file:

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--input', help='input folder')
    parser.add_argument('--output', help='output folder')
    args = parser.parse_args()
    convert_rst_to_md(args.input, args.output)

This script takes every rst file from given --input folder then generates markdown with yaml syntax at the top and put this new file as a inside {timestamp}-{title} folder. You need to install following packages to get this script working:


I thought - ok this migration shouldn’t take a long time. What I learned is that wasn’t the case. I have my specific for pelican rst syntax which I had to migrate by hand. It took me about 2 weeks to do this kind of migration. Also, I got legacy rst syntax flying around.

What is new

I decided to remove header covers from my webpage. I removed Disqus comments - based on this article. What I did instead - if you have any comment you can write to me using either Keybase or new email address - krzysztofzuraw(at)


I’m back writing! I moved stuff around and I learned that migration can take a long time.

Want to get blog posts via email?

Powered by Buttondown.

Krzysztof Żuraw

Written by Krzysztof Żuraw who lives and works in Wrocław. You can find more on about page and subscribe to rss feed.