Skip to content
This repository has been archived by the owner. It is now read-only.


Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Read the TPP

This project is licensed into the public domain and free to use for any purpose. Read this doc for instructions on contributing. Please also submit an Issue or Pull Request if you notice something wrong in the TPP text. Errors or ugliness may have popped up during the process of turning the entire TPP into Markdown.

Help us add annotations!

The site is still very much a work in progress and everyone is welcome to contribute. To add an annotation, simply select a block of text in one of the chapters and click on the annotate icon that pops up. This functionality is powered by Genius.


Frameworks and libraries

Installing & running the server

  • Install/switch to Ruby 2.2.2 (i recommend rbenv)
  • gem install bundler if it’s not already installed
  • npm install to install packages,
  • npm start to run grunt (compiles assets, then watches for changes and compiles those too.)


This site is automatically deployed using a shell script and travis-ci. To set up a fork, follow these steps:

  • Edit CNAME to reflect your domain and TLD.
  • Enable Travis-CI for your github repo
  • In Travis settings, create an env var called GH_REF with a value of
  • Create a Personal Access Token at
  • In Travis settings, create an env var called GH_TOKEN and paste in your token, taking care that "Display value in build log" is set to off.

(note: if you do not yet have a CNAME, remove cp ../CNAME ./CNAME from

Code structure

The TPP chapters and site content

All of the TPP chapters and site content are stored as Markdown files in site!


site/_js/main.js contains the main page logic. This all compiles down to dist/js/core.js via grunt, which also uglifies it. If you’re adding a javascript file, make sure to add its path to the files array around L169 of Gruntfile.js

CSS / Less:

├── base
│   ├── common.less
│   └── variables.less
├── components
│   ├── CTA.less
│   ├── animation.less
│   ├── histogram.less
│   └── typography.less
├── core.less
├── lib
│   └── reset.less
└── partials
    ├── content.less
    ├── footer.less
    ├── header.less
    ├── nav.less
    └── share.less
  • All Less files compiled and minified to dist/css/core.css
  • When in doubt, make a new Less file and import it in core.less—there’s no real performance hit as a result of good organization
  • Don’t worry about browser prefixes. Grunt handles that too.