Posts: 6

Switching CMS's Killed My Inbound Links!

It's no secret that I've switched CMS's so many times that it makes my head and my reader's heads spin.  Take a look at my CMS tag and you'll see my struggles with Wordpress, Expression Engine, Text Pattern, and Blot.

I made a big migration to Jekyll and loved the static type of CMS's ever since. Fast forward to today and I've pretty much settled on Pelican. Why? It's a static CMS and its python powered. It does a great job of streamlining the YAML front end of a post and it's fast to regenerate. The best part? I use rsync to upload new posts to my server and I use the S3 upload to make a backup of my site on Amazon. 

Yet, there's ONE big problem that I've noticed. 100's of my inbound links are all now dead and that messes with my SEO ranking. 

The solution is to create RewriteRules in my .htaccess file and here's some friendly tips on how to do it.

Moving away from Wordpress

The biggest inbound link killer on my Wordpress site was when I switched my permalink slug.  I went from a classic format of  '/year/month/day/my-post' to the simpler one '/my-post.'  Wordpress handles this change if you do it in Wordpress. If you migrate out of Wordpress, well all hell will break loose.

The simple fix is to add following regular expression to your .htaccess file:

RewriteRule /[0-9]+/[0-9]+/[0-9]+/(.*) /$1 [L,R=301] 

What this does is select any /year/month/day/my-post formated URL and returns /my-post!  Awesome, but what about those pesky /wp-content/uploads directory?  There are tons of images I put into my blog posts and now all those inserts don't work. 

The solution for me was to download the /wp-content folder and rename the folder as /_wp-content. I did this because I was using Blot.Im at the time and if I didn't add the _, it would generate 100's of images as blog posts.

RewriteRule /wp-content/uploads/(.*) /_wp-content/uploads/$1 [L,R=301] 

Of course, you don't have to do this. You can move the /wp-content folder to its final destination and have all the links resolve. 

Moving away from Expression Engine 

Oh Expression Engine (EE) how I love and loathe thee. EE is a serious CMS. You can do a lot with it if you spend the time to architect it out. It's powerful but complex. It's too powerful for running a small blog like mine, but I liked it when I used it. 

The thing with EE is that it creates /blog/entry/my-post permalinks. the /blog/ part is the name of the channel and it could be anything you like. It could be /radio/entry/my-post or /store/entry/my-post. For the extended time my blog ran EE, several inbound links went to /blog/entry/my-post.

To solve this problem I created the following rule:

RewriteRule /blog/entry/(.*) /$1 [L,R=301] 

Now EE also had a URL for each category and that created havoc too. Wordpress uses this method too and since I use Pelican now, the categories have become tags, or rather 'tag.'

The solution was this:

RewriteRule /category/(.*) /tag/$1.html [L,R=301] 

Moving away from Blot.Im

Blot.Im is a favorite of mine. It's simple to use and it's making improvements with every update. Still, it's not as feature rich enough for my taste. I'm sure one day it will be. 

Blot uses 'tagged' instead of 'tags' and to solution to that is doing"

RewriteRule /tagged/(.*) /tag/$1.html [L,R=301] 

End Notes

The one thing that I haven't done yet is rewriting changed permalinks. I'm editting my permalinks to remove any stopwords and I would need to update the .htacess file with 100's of them.  The Yoast plugin for Wordpress does this for you if you changed the permalink. That's a wonderful thing and the solution for my problem lies in writing a python script. 

While I ponder how to do that I will say that the simple changes above have already made an impact.


Content Creation and Management

Bless me Father for I have sinned. Please forgive me for my content creation and management sins. Yes, I admit I’ve have mismanaged good content for the sake of expediency. Often I’ve have ignored how my readers consume my evergreen content. For that I beg for your absolution. I promise, on my CMS’s grave, not to stray from the path of good content creation and management again. Amen.


It’s been almost 10 years since I started this blog and its gone through many evolutions. Everytime I switch to a new CMS it was to try something better and newer. I was chasing fades, looking for SEO shortcuts, and working to streamline CMS bloat.

In the end I’ve come back to two CMS’s that I thought were terrible: WordPress and Expression Engine.

Why? Because of what my stats and Adsense revenue say.

It’s no secret that I started blogging with WordPress. I tried out Expression Engine, Jekyll, Blot, and even TextPattern. Code injections and the plugin bloat of WordPress just turned me off. I completely misunderstood how to use Expression Engine and Jekyll wasn’t ready for primetime.

For me, TextPattern was like waking up next to a stranger after a night of drinking. Blot has an interesting proposition and it holds a dear place in my heart.

I know there are a few more big ones out there, like Drupal and Blogger, but I have little to no experience with them, so I won’t comment on them. Regardless, it feels like all these CMS’s or Blogging platforms are like various religions. Each one claims they’re the best and the only way to success!

The Good, The Bad, and the Ugly

All Blogging platforms are easy to use. You can post and share photos, tweets, and content as fast as you can write and hit “post.” Usually you sign up for an account and create your own subdomain like greatblog.blogger.com. The top 5 off my head are:

  1. Tumblr
  2. Blogger
  3. Medium
  4. WordPress.com
  5. Blot

Some of them masquerade as a Content Management System (CMS) but in the end they try to keep things simple for you. You don’t need to think about template structures, permalinks, caching, updates, etc. There is no software to maintain and no databases to backup. All you need to do is login, write, and post.

The differences between a Blogging Platform and a CMS is like night and day. One is simple with some flexibility, while the other is complex and very powerful – if you know how to unleash it.

My take on WordPress

WordPress masquerades as a full CMS if you install it on your own domain and server. It’s a quite capable CMS and it’s the most popular one out there. It has a nice user interface and making site wide changes is a breeze. I can install themes (aka templates) with one click and extend it with 1,000’s of plugins.

Since I switched back to WordPress, I’ve seen an increase in Adsense revenue and a bump in traffic. While these are all good qualities, I still feel it was cobbled together. WordPress feels like it started as a blogging platform that evolved into a CMS over time. Wordpress has worked hard to make its CMS fast and powerful but the plugins make it feel bloated. Especially if you need to install 10 to 20 of them to get it to do what you want it to do! WordPress feels like it was never built from ground up as a CMS.

My take on Expression Engine

Expression Engine isn’t as popular as WordPress. It occupies a small niche area for designers, developers and content creators. It’s comprehensive and flexible. You can create many content “containers” and spend your time building the UX for your site. It comes with many add-ons right out of the box where with WordPress would need you to install plugins. There is a plugin marketplace for Expression Engine but it’s just not as a large as WordPress. Expression Engine’s biggest strength is also its weakness, it’s too damn flexible. There are 99 ways to do something and 99 ways to mess things up.

This is where I failed with Expression Engine, I was like a deer caught in the content headlights. I had all these options to do things and I just couldn’t decide. It’s hard to choose when you have so many choices.

Still, both CMS’s are capable for managing your content. They’re both capable for helping your readers consume your content. The ugly choice is which one makes the most sense to grow your site and keep your content viable for your readers?

My Evergreen Content

I couldn’t fathom where my life would lead when I started this blog almost 10 years ago. My RapidMiner tutorials remain the biggest traffic draw from both organic search and referrals. I get some traffic from social media but most if it comes straight from Google and some friend’s sites.

When I analyze my Profit Index I see that visitors do two main things. They land on my home page and then navigate to my Tutorial page, or they go straight there. Almost all my traffic does one or the other but lately some visitors have been coming for my other content.

Regardless of what the content is, my tutorials are “Evergreen Content.” This is content that is useful and relevant even if it’s 10 years old, readers extract value for it. All other content outside my Tutorials are suspect. It’s hard to tell if they’ll stand the test of time, but I’m working hard to make them so.

Content and User Experience

As I switched from one CMS to another like a hamster on meth, I began to learn a thing or two. I learned about SEO, permalinks, and page speed. I read up on tweaking backend performance and the pros and cons of working with a database. I’ve come to prefer writing in markdown and love static html posts. I loathe regenerating those static posts every damn time. Simplicity is my ultimate goal but I covet complex well thought out websites.

Above all, I’ve come to appreciate the reader of my content. After all, it’s all about them. You might have the best content in the world but no one will ever read it and get value from it if your UI and UX sucks.

I had this epiphany earlier this week when I came across a retweet on Twitter. It was a blog post titled a “Guide to Useful Content (Part 1).”

The article talks about building content containers. Content containers are well thought out building blocks of content. They’re built with flexibility and usability in mind. They look toward making the content reusable in many different ways, even if the UI changes. The idea is to be dynamic.

“In essence, content types are the building blocks of dynamic, future-friendly content across systems. They provide the structure used by people and computers to explicitly express meaning.”

My Application of Content

I have a Tutorial page where I share my different applications of RapidMiner. That tutorial page is simple, it just links back to a single blog post that I wrote weeks, months, or years ago. There’s the body of the post, maybe a code block or video, and sometimes a zip file download. It’s a simple way of helping my readers find my tutorial content. They just visit the page, find what they need, and click on the link.

In hindsight, this simplicity is lacking in robustness. I can’t summarize a list of all available downloads, or codeblocks, or videos. Cross referencing that summary by a particular category, like Python or D3js, is impossible. There’s no way to extract all that information into a newsletter and email it to readers. The site isn’t dynamic enough to handle this!

In hindsight I should’ve been thinking about how build my content from the ground up. It never occurred to me to think about the reader what he/she experiences when they visit my site. Hell, I never thought my little blog would get so popular!

The reality is that my readers come from all over the world. Some of them look for book references, some of them want videos, and others want XML code. My readers make heavy use of my search function – I love reading what they type in – to find what they need.

The Way Forward

I’ll continue use WordPress for the time being. I plan on learning all available features it has to fill my content management gaps. I read that they created custom fields recently. While this is a good thing, custom fields was something that Expression Engine had from day one. At work we use WordPress’s resource functions for our PDF assets but it still confuses me.

I also plan on building a test site from the ground up using Expression Engine. I plan on spending the time thinking about what Carrie shared with us in her post. If it means weeks or months, then so be it. I’m going to spend a lot of time thinking about how my readers consume my content. How they extract value from it and how to continue to build Evergreen Content.

Lessons Learned to Share

The takeway from this long post is this, always think about your reader. If you’re going to write something to make an impact you must write awesome content. Period.

Work your tail off at writing something of value. Many long hours and late nights were poured into my blog content and my reward was steady organic growth and a dream job. Do the same and your readers will thank you for it in ways you haven’t imagined.

Ask how your readers will get the most value from your content. Can they find it easily? Can they find what the want and in the format they need? Is your website inviting or clunky? What are the channels for consumption? Are you using only RSS? What about newsletters or login protected content? What about e-books? Think about all the ways your reader will want to consume your content and format it accordingly.

It’s only after those two steps, and in that order, should you hit publish button.


Hacking Meta Data with Blot.Im - Part 1

I've been looking at ways to hack the SEO and Meta Data with Blot.Im. I wanted to hack the meta data in all my posts so I can use Twitter Cards and Open Graph more effectively. Why? I get a two for one benefit right off the bat. I get better SEO and deletion of meta data duplicates that affect Google crawlers.

My changes are already having a huge effect. My bounce rate has dropped from the high 60-70% down to the 5% range. This means people aren't visiting my site and then jumping off, they're searching, finding my content to be relevant, and staying. All this because of some meta data hacking that I'm sharing below.

2016 Bounce Rate

What I'm sharing should be applicable to other CMS type of systems as well.

The Basic Markdown File

It all starts with your blog post. For me that's writing in a markdown format but it doesn't matter what format you choose. What matters is at least 4 bits of metadata.

What I'm talking about is your Title, Date, Permalink Structure, and Tags.

The Title is important because if you do your templates right, your webpage title should be the same as your article title. This is an important aspect of SEO, each webpage should have a unique title.

The Date is important from a personal organization point of view but less so from an SEO standpoint. Unless there is an important need to timestamp your articles, don't do it. Who wants to read an old (but great) article that's timestamped 5 years ago? Date the article for your personal organization but don't show it in the actual blog post.

The Permalink Structure (PS) is all important. This is something I learned over the past few months. I used to have a PS with the /Year/Month/Day/Title format. It was great from a personal organization standpoint but people could see how dated some of my posts were and moved on to more current ones. Do yourself a favor and just use a /Title convention for all your blog posts, it works better.

The last bit of information is Tags and their use is for internal Blog navigation. I use them quite a bit to let my visitors navigate to similar tagged articles. Take the time and think about your tagging structure. Focus on the main category tags and a few subcategory ones and don't go crazy tagging your post with 100's of tags. Tagging does NOT help your SEO.

These 4 items are something you should think about as you write your awesome blog post.

The Blot Markdown File

Because Blot operates different than Wordpress or other CMSs, I have more control in a blog post. For example, at the top of every blog post I have write in those 4 bits of metadata. It looks something like this:

Title: My Blog Article Title

Date: 2016-08-24

Tags: Blogging, CMS, Metadata

Permalink: my blog article title

What was missing from this header file are things like "Author:", "Thumbnail:", and "Description:". I wanted to add these extra bits of metadata into my blog post for several reasons. First, I wanted to show a thumbnail photo when I autopost to Facebook or Twitter. Second, I wanted to show the Author of the blog post, and third I wanted to add a description of the post.

Adding a description to the blog post is crucial in hacking the initial Blot template. The Blot template I'm using doesn't auto generate a HTML tag correctly, which is critical to good SEO. Just as it's important to have a proper webpage title for each post, you must have a good description. Google Search uses that description in it's search results. If you don't have it, your SEO will far from the top page.

So how do you take a description, turn it into metadata in your markdown file, and pass it to the HTML tag automatically?

You have to hack your Blot html templates!

You can define new metadata information easily with Blot by just adding it (i.e. Description:) to your post.

Blot Meta Data Post

For your post to properly show up, you must call that metadata somewhere in the HTML templates. For example, the metadata "Author:" is called in my entry.html page like so:

Blot Entry Author

If I want to call "Author:" anywhere else, you have to use {{{metadata.author}}}. Just leave one set of curly brackets off. Why do I have {{{#metadata.author}}}...{{{/metadata.author}}}? This is a conditional. Without this conditional many of my old posts will break IF there's no entry for Author.

We'll revisit these conditionals later.

The "Description:" metadata was a bit trickier because I didn't define a description for all my posts. I had to come up with a way to drop a summary into the description if I didn't write one. Luckily Blot autogenerates a summary via the { {summary} } tag.

This is where I stumbled at first, I couldn't get this to work with our pestering David the creator of Blot.Im.

Hacking your Page Description

Just open your head.html template and edit the fields with the following. This assumes that you have define a "Description:" metadata entry in your blog post (see above).

Blot Meta Data Description

The reason for the two lines of code is to provide a "catch all" again. I have 100's of posts that don't have "Description:" defined in the markdown post but have an opening paragraph I could use as a description. This is where the { {summary} } metadata comes into play.

At first this didn't work because I was using { {summary} }. The trick is to call it as { {entry.summary} }. Why? Because the "summary" comes from your entry, not anywhere else. You have tell blot where a specific bit of metadata comes from.

The same goes for your "description." You have to tell your blog that your description is coming from your "entry" and that you defined it yourself. This is why you must declare { {entry.metadata.description} }.

I know this was a lot to digest but it's incredibly important. Not only for Blot but for whatever CMS you are using to write in. My goal is not to spend a single dime for advertising but write good content and optimize the SEO. I did it before and I can do it again.

In my next post I apply these metadata methods to hacking Open Graph, Twitter Cards, and your Blot generated Sitemap.


I've Moved

I've moved Neural Market Trends to Blot.IM, a great blogging platfrom that snycs from Dropbox to make posts. Purely html, txt, and markdown format saved into a folder on Dropbox. No more S3 headaches or Ruby crap.

Please bear with me as I fix the broken links and images. Thank you!


Neural Market Trends is the online home of Thomas Ott.