Combining Google WSK and Tinypress

11 Jan 2016


Welcome to my new page - a website-blog combo. Let's see how it's made.

Keng is really lazy; he wants to code as little as possible for this project.

We have two aims here:

Let's get started. The source code is hosted on my repo.

We will host the site with Github Pages. Follow their instructions.

For the website we use Google Web Starter Kit (WSK). It is styled with Google MDL. You can also see it as a static-site generator. WSK houses a lot of optimization tools written by the Google team, and it uses familiar build tools such as minify and gulp for streamlined building.

For blogging we use Tinypress, which is really minimal - just write your post on the site in Markdown, then hit post. Tinypress will then push your material to your github pages.

But, it's not really that easy, is it? We wish to house the blog under a section of the website. The problem is - Tinypress or Jekyll needs to control and setup the root index.html, i.e. it needs an empty repo to create a full site with its own resources. So, if you start with Tinypress, you can't really customize it much to be a website; instead you'll just get a bare blog.

So, Keng spent some time cracking Tinypress, and hacked it to merge under the Google WSK website.

Build System

Suppose you have set up your Github Pages together with the CNAME. Note that Github Pages needs an index.html at the root; this is a must.

Next, clone the Google WSK elsewhere and copy the content (except its .git!) into your Github Pages repo. We need to hack its gulp to tweak the default build.

Suppose you know how to run gulp; otherwise it's really simple. Just install it, and run the commands from the terminal at project root.

This is how WSK organizes their folders and builds:

Now, recall that Github Pages requires the root folder to be the deployment build folder, since it needs index.html at root. Keng has modified the gulpfile so that the deployment build writes to the root. Use the same gulp commands as before.


Now that the build system is set up, you can design the site. The original WSK provides a good starting boilerplate. Refer to Google MDL for usage. Or, you can look at the my app/ folder. The page you're currently viewing has multiple tabs for different sections.

For Tinypress to be able to inject under the blog section, we add the template string snippet in app/index.html, like so:

<div class="wrap">
  <div class="container content ">
    <div class="posts">
       ...<!-- template string here -->

Put your custom .css files under app/styles/, and link them in index.html under the build:css clause.

<!-- Your styles -->
<!-- build:css styles/main.min.css -->
<link rel="stylesheet" href="styles/yourstyle.css">
<!-- endbuild -->

Put your custom .js files under app/scripts/, and link them in index.html under the build:js clause.

<!-- build:js scripts/main.min.js -->
<script src="scripts/main.js"></script>
<script src="scripts/github.js"></script>
<!-- endbuild -->

The gulp build system will pick up the resources, minify and optimize them, then relink the new resources for you.


Next, we wish to house the Tinypress a section, without changing how we post from it. Recall also, now that we have occupied the root folder, Tinypress cannot setup its resources normally. We need to hack.

Tinypress uses template strings. You will see the folders _includes/, _layouts/ and _posts. Just so that Tinypress still gets access to the root index.html, we add tinypress_index.html.

The deployment build will finish building the resources, move the completed build index.html into layout_preview.html for live preview, then copy tinypress_index.html into index.html for Tinypress to use.

With the template string we injected earlier into app/index.html, now Tinypress gets a handle on the repo to inject the Markdown blog contents.


You're basically done. With the build system set up, and a small hack for Tinypress, you can update and customize the website however you like, and can write blog posts very easily from Tinypress. The best of both worlds!