Source for
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
runme.batold Build Status

This is the source for my personal website at

It is generated using Hugo and the Hugo-Octopress Theme (made by yours truly). It's a port of Octopress.


  1. Create a new post with hugo new post/2018-11-23-post-name/index.markdown (or because I like page bundles.
  2. Edit the post and proofread with hugo serve -v. Pictures are added in the same directory to take advantage of page bundles.
  3. Push to Github.
  4. Travis CI takes over and publishes the blog.
    • See Travis CI section.
  5. s3deploy deploys the blog to AWS and invalidates the CloudFront cache for updated resources.
    • See s3deploy section.
  6. ???
  7. Profit. The website is now updated. Add CI/CD to your resume.


The website is hosted in an S3 bucket. CloudFront provides CDN and TLS.

Travis CI

My .travis.yml is very simple.

  • The theme is a submodule. It's updated first.
  • Install two debs. Hugo and s3deploy. I like to control the versions as both software are under heavy development.
  • language:minimal reduces build time by 20 seconds (compared to the default container).
  • AWS key and secret are in AWS_ACCESS_KEY and AWS_SECRET_ACCESS_KEY respectively. These are used by s3deploy.

deploy.bat does the same thing for manual deployment.


I use s3deploy to deploy the blog to AWS. The configuration is inside .s3deploy.yml. The example is suitable (with a bit of modification) for most static websites.

Static resources (fonts, images, css, etc.) are set to never expire. Everything else is set to use gzip compression. When a resource is updated, s3deploy invalidates its CloudFront cache.

Note: If you enable gzip compression for Keybase proofs (see static/keybase.txt), the proof will break.

Use the s3deploy's example IAM policy. AWS does not support addressing separate CloudFront distributions with ARNs (Amazon Resource Names) so the resulting key can list and invalidate all distributions.

Previously I used s3cmd. You can see the batch file in runme.batold.