+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vagrant/machines/default/virtualbox/action_provision b/.vagrant/machines/default/virtualbox/action_provision
new file mode 100644
index 0000000..a555ffe
--- /dev/null
+++ b/.vagrant/machines/default/virtualbox/action_provision
@@ -0,0 +1 @@
+1.5:583656cb-8aef-49b9-b771-e88088881bb9
\ No newline at end of file
diff --git a/.vagrant/machines/default/virtualbox/action_set_name b/.vagrant/machines/default/virtualbox/action_set_name
new file mode 100644
index 0000000..7b09bd6
--- /dev/null
+++ b/.vagrant/machines/default/virtualbox/action_set_name
@@ -0,0 +1 @@
+1425260887
\ No newline at end of file
diff --git a/.vagrant/machines/default/virtualbox/id b/.vagrant/machines/default/virtualbox/id
new file mode 100644
index 0000000..b482bc3
--- /dev/null
+++ b/.vagrant/machines/default/virtualbox/id
@@ -0,0 +1 @@
+583656cb-8aef-49b9-b771-e88088881bb9
\ No newline at end of file
diff --git a/.vagrant/machines/default/virtualbox/index_uuid b/.vagrant/machines/default/virtualbox/index_uuid
new file mode 100644
index 0000000..e14d46c
--- /dev/null
+++ b/.vagrant/machines/default/virtualbox/index_uuid
@@ -0,0 +1 @@
+2d61492c70164428b5b49e2da828788b
\ No newline at end of file
diff --git a/.vagrant/machines/default/virtualbox/private_key b/.vagrant/machines/default/virtualbox/private_key
new file mode 100644
index 0000000..310833d
--- /dev/null
+++ b/.vagrant/machines/default/virtualbox/private_key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEAs8CAzvQL3wyrY0/Bo0HkMGaVfvB+8wnZS9057/TV9cYLa86g
+EnEgWir9W2kooRNAg7RlcwgvFoqrgRDIHt2/UP3M57Hll7W1gtiWiY2/nQNTHCYp
+7LDpuuwCccm8LDvTgJPYUYxpzG2WtkxhtHE2mlAvvfEj0nXvY9WDNnMydMCmmbw3
+G9pmtlmDjosR3sHqpWqL6QuGCZP8s/BbqtLMx9evZuqjEDUPD6UcEnZmnxOpzt6P
+QQhgwTOvIrNzgE2EVq71WWKmQlI/qnkSBs1kaXDFMQHrPtv+F+DDcBU2wq4yTQcy
+m2Irg+4iXnV1RBHPin/zs9ymtd/2ue0a7wedlwIDAQABAoIBAApHpBYx1sv2yYZw
+dT6E8ivicgJEdr4nfgncqQeUFPhtTxHnSzhCx/rgIoUrymsL0tC1bGfbu/WqEIzd
+DNTXEa3sFd/aSKsYdTz6bgGH3cF5AzPE6vjiVTufa7ReOSi+cyYTTne7dAGA8vGS
+BLRxFRJWK6TNOaM7o2kuOMbQZ75NfZbFG7jipdeH9L8G6JhdEFPEsaffdjBlK0JF
+DdNtExY6C8B7l01ZiobIgb2my0BruL6jd49geSjXJLnLog0oe7+A4GQauJ2K5wmI
+SygdQFm+xyvo21ghWMH41i1hFx/wpuUxd2Kw25UO+nsaw/tXvEa2qNMGO7ByXoRp
+rIPtCEECgYEA6sjHcsPejHa3nSwJUVcKFRIEselJ+WQoDH/6+E/uA3CwMRYQ8tkq
+UsH4+aD825O3pCLl2+aH71boINuOVhvMpjCu/iBm9PrrS35uY0WZRAyg0hushrHH
+JOh4V9Nc451Uf7p2nPKwEchQDroXf2YiabDUIIEekKpTNFWWrqgo8A8CgYEAw/6r
+7Bi1uVBy43LsVKk1vO4I3LFEjO3d5DhO/se1E23A51RybcKYio59YSJ62PaqWsC4
+nmUnnMQpTBiso3xfeVV/BEUQrkFsptK/OpyQtrKpFzysmTay+kpY1klwtW6WKDN2
+URJpi0Ii47AHsA3EQZ508N0EqauC/pT00p9I8fkCgYAjexQpE9CeCZLV/cGquSyc
+4owzFr5HIgurV+vleq7NdkoqINuO16K9vvKRRvLve/NUqrFx+fSxBsEttgBcovba
+ZqELZnooq4LDdefYuLvgvMfQ+L2p3VPrD/afzyFKhIwwgU1LiqFxDoSKtTS33Ad3
+UXG9N8YWtqa8UfLjkiYdoQKBgBIgQmwiWOQbkZSBc2PdBlBDv2QRrOJPuV666mtb
+st5qHxYF1FNcVNkzllreYnggT972xdw4RLKV3a/g9E5mWToScx3E+Wb0PAUtpmvY
+QPX0jfjNLrU4vtKw/4hJ4HeXE6ICKGYVCtfLNQjTpdJdY5IiAnSoLB848nNy+TVl
+b8yZAoGAUvfOjRldbck8E7vfU+8GDoCsEvoB+WVfH9swFEAaBSWP48n2dkbjilRo
+R8iziFCfRpq9cK3cU8JeVbb8urGvr+evqZvShzPqQ9VyEONPtQRJ+4ZMYEpw8rMm
+YFh5o+Z5Jr/VV/SL0kWV4Ser40dO7GqMlEFwjcrTDSdTpARSMkQ=
+-----END RSA PRIVATE KEY-----
diff --git a/.vagrant/machines/default/virtualbox/synced_folders b/.vagrant/machines/default/virtualbox/synced_folders
new file mode 100644
index 0000000..4fcd2be
--- /dev/null
+++ b/.vagrant/machines/default/virtualbox/synced_folders
@@ -0,0 +1 @@
+{"virtualbox":{"/vagrant":{"guestpath":"/vagrant","hostpath":"/Volumes/Master/Users/grizax/ironyard/sandbox/stat-tracker","disabled":false}}}
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index 5e7bab7..0000000
--- a/README.md
+++ /dev/null
@@ -1,113 +0,0 @@
-# Stat Tracker
-
-## Description
-
-Build an application people can use to track any stats they want about themselves.
-
-## Objectives
-
-### Learning Objectives
-
-After completing this assignment, you should understand:
-
-* ...
-
-### Performance Objectives
-
-After completing this assignment, you should be able to:
-
-* ...
-
-## Details
-
-### Deliverables
-
-* A Git repo called stat-tracker containing at least:
- * `README.md` file explaining how to run your project
- * a `requirements.txt` file
- * a way to seed your application with data
-* An instance of your app running on Heroku
-
-### Requirements
-
-* No PEP8 or Pyflakes warnings or errors
-* Meets API specifications
-
-## Normal Mode
-
-You are going to build an application to track personal statistics. A personal statistic is a numerical record for a person in a time series by day. For example, let's say I wanted to track how many flights of stairs I walked up in a day. My last week might look like:
-
-Date | Flights
----------- | -------
-02/19/2015 | 8
-02/20/2015 | 6
-02/21/2015 | 7
-02/22/2015 | 6
-02/23/2015 | 8
-02/24/2015 | 4
-02/25/2015 | 6
-
-Users of your application can create as many different things to track as they want. They should have an easy-to-use interface to track their stats, allowing them to enter the number for the current day or any previous day.
-
-You should allow for:
-
-* User registration
-* User login
-* Creating a new stat to track
-* Recording a stat for a day
-* Editing a stat for a day
-* Showing a chart for a stat for any series of dates, defined by a start and stop date. The default should be the last 30 days.
-
-For the chart, you can use whatever you like. Matplotlib is our old friend, but can be unwieldy. [Bokeh](http://bokeh.pydata.org/en/latest/) and [Plotly](https://plot.ly/python/) are other good choices to use with HTML.
-
-You should also have an API. One of the ways people expect to use this application is via their phone, so you'll need a REST API.
-
-### API Specification
-
-For your API, I'm specifying the endpoints you'll need and what they should do. The URLs I'm using are not prefixed: yours should be.
-All the endpoints require authentication using HTTP Basic Auth.
-
-Verb | URL | Action
------- | ---- | -------
-GET | /stats | Show a list of all stats I am tracking, and links to their individual pages
-POST | /stats | Create a new stat for me to track.
-GET | /stats/{id} | Show information about one stat I am tracking, and give me the data I have recorded for that stat.
-PUT | /stats/{id} | Update one stat I am tracking, changing attributes such as name or type. Does not allow for changing tracked data.
-DELETE | /stats/{id} | Delete a stat I am tracking. This should remove tracked data for that stat as well.
-POST or PUT | /stats/{id}/data | Add tracked data for a day. The JSON sent with this should include the day tracked. You can also override the data for a day already recorded.
-DELETE | /stats/{id}/data | Remove tracked data for a day. You should send JSON that includes the date to be removed.
-
-I am not specifying what the JSON these return should look like, but you should feel free to follow one of the many competing standards. [JSON API](http://jsonapi.org/) is very comprehensive.
-
-
-## Hard Mode
-
-In addition to the requirements from **Normal Mode**:
-
-* Users should be able to record different types of stats. You can choose the types, but here are some suggestions:
- * Clicker-style stats. The UI on these should change so you have a way to increase them by one via a button click. Good for tracking things as you're doing them.
- * Time-goal stats. The stat has a beginning value, ending value, and ending date. Track as normal, but you should be able to see if you're on track to meet your goal. Examples: weight loss, building up for a long run.
- * Yes-no stats. Did I do this today? This is often called the "Seinfeld calendar" or [chain calendar](http://chaincalendar.com/about).
- * Stats on a scale instead of unbounded. Example: On a scale of 1 to 5, what's my happiness level today?
-
-* Make sure your interface [is responsive](https://developers.google.com/web/fundamentals/layouts/rwd-fundamentals/) and works well via mobile.
-
-
-## Nightmare Mode
-
-* Give users a way to invite other users to collaborate/compete on a stat with them. Users can only add/edit their own data, but the stat charts will show everyone competing.
-
-
-## Additional Resources
-
-* [JSON API](http://jsonapi.org/)
-* [Bokeh](http://bokeh.pydata.org/en/latest/)
-* [Plotly](https://plot.ly/python/)
-* [Flask-RESTful](https://flask-restful.readthedocs.org/en/0.3.1/). A Flask plugin that could help or make this much worse.
-* [RESTless](http://restless.readthedocs.org/en/latest/). Another Python library that could help or harm.
-* [Kube](http://imperavi.com/kube/). A simpler CSS framework I've been using.
-* [Peewee](https://peewee.readthedocs.org/en/latest/index.html). A less-featureful, but perhaps easier to use ORM.
-
-## Credit
-
-...
diff --git a/Vagrantfile b/Vagrantfile
new file mode 100644
index 0000000..1d1a62c
--- /dev/null
+++ b/Vagrantfile
@@ -0,0 +1,70 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+# All Vagrant configuration is done below. The "2" in Vagrant.configure
+# configures the configuration version (we support older styles for
+# backwards compatibility). Please don't change it unless you know what
+# you're doing.
+Vagrant.configure(2) do |config|
+ # The most common configuration options are documented and commented below.
+ # For a complete reference, please see the online documentation at
+ # https://docs.vagrantup.com.
+
+ # Every Vagrant development environment requires a box. You can search for
+ # boxes at https://atlas.hashicorp.com/search.
+ config.vm.box = "precise64"
+
+ # The url from where the 'config.vm.box' box will be fetched if it
+ # doesn't already exist on the user's system.
+ config.vm.box_url = "http://files.vagrantup.com/precise64.box"
+
+ # Create a forwarded port mapping which allows access to a specific port
+ # within the machine from a port on the host machine. In the example below,
+ # accessing "localhost:8080" will access port 80 on the guest machine.
+ config.vm.network "forwarded_port", guest: 80, host: 8080
+
+ # Create a private network, which allows host-only access to the machine
+ # using a specific IP.
+ # config.vm.network "private_network", ip: "192.168.33.10"
+
+ # Create a public network, which generally matched to bridged network.
+ # Bridged networks make the machine appear as another physical device on
+ # your network.
+ # config.vm.network "public_network"
+
+ # Share an additional folder to the guest VM. The first argument is
+ # the path on the host to the actual folder. The second argument is
+ # the path on the guest to mount the folder. And the optional third
+ # argument is a set of non-required options.
+ # config.vm.synced_folder "/data", "/vagrant_data"
+
+ # Provider-specific configuration so you can fine-tune various
+ # backing providers for Vagrant. These expose provider-specific options.
+ # Example for VirtualBox:
+ #
+ # config.vm.provider "virtualbox" do |vb|
+ # # Display the VirtualBox GUI when booting the machine
+ # vb.gui = true
+ #
+ # # Customize the amount of memory on the VM:
+ # vb.memory = "1024"
+ # end
+ #
+ # View the documentation for the provider you are using for more
+ # information on available options.
+
+ # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
+ # such as FTP and Heroku are also available. See the documentation at
+ # https://docs.vagrantup.com/v2/push/atlas.html for more information.
+ # config.push.define "atlas" do |push|
+ # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
+ # end
+
+ # Enable provisioning with a shell script. Additional provisioners such as
+ # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
+ # documentation for more information about their specific syntax and use.
+ # config.vm.provision "shell", inline: <<-SHELL
+ # sudo apt-get update
+ # sudo apt-get install -y apache2
+ # SHELL
+end
diff --git a/stat_track/.buildpacks b/stat_track/.buildpacks
new file mode 100644
index 0000000..8c832fe
--- /dev/null
+++ b/stat_track/.buildpacks
@@ -0,0 +1,2 @@
+https://github.com/imkevinxu/heroku-buildpack-nodejs#yoga
+https://github.com/heroku/heroku-buildpack-python
diff --git a/stat_track/.coveragerc b/stat_track/.coveragerc
new file mode 100644
index 0000000..1a5edcd
--- /dev/null
+++ b/stat_track/.coveragerc
@@ -0,0 +1,22 @@
+[run]
+source = stat_track
+omit =
+ *config*
+ *migrations*
+ *__init__.py
+ *manage.py
+
+[report]
+exclude_lines =
+ pragma: no cover
+ if __name__ == .__main__.
+ if settings.DEBUG
+ if self.debug
+ def __repr__
+ def __str__
+ def __unicode__
+show_missing = True
+
+[html]
+directory = tests/django
+title = Coverage Report
diff --git a/stat_track/.gitignore b/stat_track/.gitignore
new file mode 100644
index 0000000..08faed8
--- /dev/null
+++ b/stat_track/.gitignore
@@ -0,0 +1,74 @@
+# Project-specific #
+####################
+.env*
+.foreman
+assets
+tmp
+tests/*
+_SpecRunner.html
+
+# Python and Django #
+#####################
+staticfiles
+public
+build
+compressed
+*.py[co]
+*.egg*
+.coverage
+
+# Node.js #
+###########
+node_modules
+.grunt
+
+# Text editors #
+################
+.svn
+*~
+*.sw
+*.swp
+*.pyc
+*.tmproj
+*.sublime-project
+*.sublime-workspace
+
+# Compiled source #
+###################
+*.com
+*.class
+*.dll
+*.exe
+*.o
+*.so
+
+# Packages #
+############
+*.7z
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.zip
+
+# Logs and databases #
+######################
+*.db
+*.rdb
+*.log
+*.log.*
+*.sql
+*.sqlite
+*.sqlite3
+
+# OS generated files #
+######################
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
diff --git a/stat_track/Gruntfile.coffee b/stat_track/Gruntfile.coffee
new file mode 100644
index 0000000..b86fcba
--- /dev/null
+++ b/stat_track/Gruntfile.coffee
@@ -0,0 +1,29 @@
+module.exports = (grunt) ->
+
+ # Initial variable configuration
+ pkg = grunt.file.readJSON 'package.json'
+ name = pkg.name.toLowerCase()
+ paths =
+ templates: name + '/templates'
+ css: name + '/static/css'
+ fonts: name + '/static/fonts'
+ img: name + '/static/img'
+ js: name + '/static/js'
+ config: name + '/config'
+ tests: 'tests'
+
+ # Loads grunt config automatically via broken up tasks
+ # https://github.com/firstandthird/load-grunt-config
+ require('load-grunt-config') grunt,
+ data:
+ name: name
+ paths: paths
+ loadGruntTasks:
+ pattern: [
+ 'grunt-*'
+ '!grunt-template-jasmine-istanbul'
+ ]
+
+ # Times how long tasks take
+ # https://github.com/sindresorhus/time-grunt
+ require('time-grunt') grunt
diff --git a/stat_track/Procfile b/stat_track/Procfile
new file mode 100644
index 0000000..aaab5eb
--- /dev/null
+++ b/stat_track/Procfile
@@ -0,0 +1 @@
+web: gunicorn example.wsgi:application
\ No newline at end of file
diff --git a/stat_track/Procfile.dev b/stat_track/Procfile.dev
new file mode 100644
index 0000000..eb8b172
--- /dev/null
+++ b/stat_track/Procfile.dev
@@ -0,0 +1,4 @@
+web: django-admin.py runserver_plus
+worker: django-admin.py rqworker high default low
+grunt: grunt dev
+scheduler: rqscheduler
diff --git a/stat_track/Procfile.test b/stat_track/Procfile.test
new file mode 100644
index 0000000..0b3c27e
--- /dev/null
+++ b/stat_track/Procfile.test
@@ -0,0 +1,3 @@
+test: grunt test
+worker: django-admin.py rqworker high default low
+scheduler: rqscheduler
diff --git a/stat_track/README.md b/stat_track/README.md
new file mode 100644
index 0000000..3c5a07e
--- /dev/null
+++ b/stat_track/README.md
@@ -0,0 +1,497 @@
+django-kevin
+============
+
+
+
+[](https://requires.io/github/imkevinxu/django-kevin/requirements/?branch=master)
+[](https://david-dm.org/imkevinxu/django-kevin)
+[](http://opensource.org/licenses/MIT)
+
+A heavily personalized project template for Django 1.7.5 using Postgres for development and production. Ready to deploy on Heroku with a bunch of other goodies.
+
+Forked from the original [django-two-scoops-project](https://github.com/twoscoops/django-twoscoops-project)
+
+Notes Upgrading to Django 1.8
+=============================
+- Template configuration has been redesigned to use different settings and functions to take into account multiple engines
+- Security enhancements have been integrated from `django-secure`, do they work together?
+- `UUIDField` data type has been added naturally, how does it migrate from the same `UUIDField` from `django_extensions`?
+
+Creating Your Project
+=====================
+
+*Prerequisites: django*
+
+To create a new Django project, run the following command replacing PROJECT_NAME with your actual project name:
+
+ django-admin.py startproject --template=https://github.com/imkevinxu/django-kevin/archive/master.zip --extension=py,md,html,json,coveragerc PROJECT_NAME
+
+Afterwards please reference the actual `README.md` you just created in your new project folder, all the references to stat_track will be changed accordingly.
+
+Make virtual environments
+-------------------------
+
+*Prerequisites: virtualenv, virtualenvwrapper*
+
+ cd stat_track
+ mkvirtualenv stat_track-dev && add2virtualenv `pwd`
+ mkvirtualenv stat_track-prod && add2virtualenv `pwd`
+ mkvirtualenv stat_track-test && add2virtualenv `pwd`
+
+Install python packages
+-----------------------
+
+For development:
+
+ workon stat_track-dev
+ pip install --upgrade pip
+ pip install --upgrade setuptools
+ sudo env ARCHFLAGS="-arch i386 -arch x86_64" pip install psycopg2
+ pip install -r requirements/dev.txt
+
+For production:
+
+ workon stat_track-prod
+ pip install --upgrade pip
+ pip install --upgrade setuptools
+ sudo env ARCHFLAGS="-arch i386 -arch x86_64" pip install psycopg2
+ pip install -r requirements.txt
+
+For testing:
+
+ workon stat_track-test
+ pip install --upgrade pip
+ pip install --upgrade setuptools
+ sudo env ARCHFLAGS="-arch i386 -arch x86_64" pip install psycopg2
+ pip install -r requirements/test.txt
+
+Install node packages
+---------------------
+
+*Prerequisites: node*
+
+ sudo npm install
+
+One-time system installs
+------------------------
+
+*Prerequisites: homebrew*
+
+In order to use the grunt task runner you need to install it globally:
+
+ sudo npm install -g grunt-cli
+
+In order to be able to lint SCSS files locally you need `ruby` on your local system and a certain gem. See [https://github.com/ahmednuaman/grunt-scss-lint#scss-lint-task](https://github.com/ahmednuaman/grunt-scss-lint#scss-lint-task)
+
+ gem install scss-lint
+
+In order to use django-pipeline for post-processing, you need `yuglify` installed on your local system:
+
+ sudo npm install -g yuglify
+
+In order for grunt to notify you of warnings and when the build is finished, you need a [notification system](https://github.com/dylang/grunt-notify#notification-systems) installed. Below is the Mac OSX notification command-line tool:
+
+ brew install terminal-notifier
+
+In order to use Redis for caching and queuing, you need to download it and have it running in the background. This will also set `redis-server` to automatically run at launch:
+
+ brew install redis
+ ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
+ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
+ launchctl start ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
+
+Development Mode
+================
+
+Set .env.dev variable for dev
+-----------------------------
+
+The environment variables for development sets the appropriate `DJANGO_SETTINGS_MODULE` and `PYTHONPATH` in order to use `django-admin.py` seemlessly. Necessary for Foreman and other worker processes
+
+*`.env.dev` is not version controlled so the first person to create this project needs to create a `.env.dev` file for Foreman to read into the environment. Future collaboraters need to email the creator for it.*
+
+ echo DJANGO_SETTINGS_MODULE=config.settings.dev >> .env.dev
+ echo PYTHONPATH=stat_track >> .env.dev
+ echo PYTHONUNBUFFERED=True >> .env.dev
+ echo PYTHONWARNINGS=ignore:RemovedInDjango18Warning >> .env.dev
+ echo CACHE=dummy >> .env.dev
+
+Recommended to use foreman to use development environment variables and processes:
+
+ echo "env: .env.dev" > .foreman
+ echo "procfile: Procfile.dev" >> .foreman
+
+Create local postgres database for dev
+--------------------------------------
+
+*Prerequisites: Postgres and Heroku Toolbelt*
+
+Install Postgres for your OS [here](http://www.postgresql.org/download/). For Max OSX the easiest option is to download and run [Postgres.app](http://postgresapp.com/).
+
+ # Make sure Postgres.app is running
+ workon stat_track-dev
+ createdb stat_track-dev
+ foreman run django-admin.py migrate
+
+Run project locally in dev environment
+--------------------------------------
+
+Use the right virtual environment:
+
+ workon stat_track-dev
+
+Start the server with:
+
+ foreman start
+
+Create a local super user with:
+
+ foreman run django-admin.py createsuperuser
+
+To run one-off commands use:
+
+ foreman run django-admin.py COMMAND
+
+To enable Live Reload, download and turn on a [browser extension](http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions-).
+
+Production Mode
+===============
+
+Set .env variable for prod
+--------------------------
+
+The environment variables for production must contain a separate `SECRET_KEY` for security and the appropriate `DJANGO_SETTINGS_MODULE` and `PYTHONPATH` in order to use `django-admin.py` seemlessly. Hacky use of `date | md5` to generate a pseudo-random string.
+
+*`.env` is not version controlled so the first person to create this project needs to create a `.env` file for Foreman and Heroku to read into the environment. Future collaboraters need to email the creator for it.*
+
+ echo SECRET_KEY=`date | md5` >> .env
+ echo DJANGO_SETTINGS_MODULE=config.settings.prod >> .env
+ echo PYTHONPATH=stat_track >> .env
+ echo WEB_CONCURRENCY=3 >> .env
+ echo PYTHONUNBUFFERED=True >> .env
+ echo PYTHONWARNINGS=ignore:RemovedInDjango18Warning >> .env
+ echo BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-multi.git >> .env
+
+Deploy to Heroku
+----------------
+
+*Prerequisites: Heroku Toolbelt and heroku-config*
+
+First step is to deploy to Heroku with the `post_compile` script in `/bin` so that node functions can be installed for python to call them.
+
+ git init
+ git add .
+ git commit -m "Ready for initial Heroku deploy"
+ heroku create
+ heroku config:push
+ git push heroku master
+
+After `post_compile` is successful, uncomment the line with the variable `STATICFILES_STORAGE` in `/stat_track/config/settings/base.py` to enable django-pipeline and push again.
+
+ git commit -am "Enabled django-pipeline"
+ git push heroku master
+ heroku run django-admin.py migrate
+ heroku open
+
+To run one-off commands like `createsuperuser` use:
+
+ heroku run django-admin.py COMMAND
+
+Run project locally in prod environment
+---------------------------------------
+
+Set the `.foreman` file to use production environment variables and processes:
+
+ echo "env: .env" > .foreman
+ echo "procfile: Procfile" >> .foreman
+
+Use the right virtual environment:
+
+ workon stat_track-prod
+
+This is meant to mimic production as close as possible using both the production database and environment settings so proceed with caution.
+
+**WARNING**: If this project has SSL turned on, [localhost:5000](http://localhost:5000) won't work anymore because it will always try to redirect to [https://localhost:5000](https://localhost:5000). To fix this comment out the SECURITY CONFIGURATION section in `/stat_track/config/settings/prod.py`
+
+ heroku config:pull
+ foreman run django-admin.py collectstatic --noinput
+ foreman start
+
+The site will be located at [localhost:5000](http://localhost:5000)
+
+Testing Mode
+============
+
+Set .env.test variable for test
+------------------------------
+
+The environment variables for testing sets the appropriate `DJANGO_SETTINGS_MODULE` and `PYTHONPATH` in order to use `django-admin.py` seemlessly. Necessary for Foreman and other worker processes
+
+*`.env.test` is not version controlled so the first person to create this project needs to create a `.env.test` file for Foreman to read into the environment. Future collaboraters need to email the creator for it.*
+
+ echo DJANGO_SETTINGS_MODULE=config.settings.test >> .env.test
+ echo PYTHONPATH=stat_track >> .env.test
+ echo PYTHONUNBUFFERED=True >> .env.test
+ echo PYTHONWARNINGS=ignore:RemovedInDjango18Warning >> .env.test
+
+Run tests locally in test environment
+-------------------------------------
+
+Set the `.foreman` file to use testing environment variables and processes:
+
+ echo "env: .env.test" > .foreman
+ echo "procfile: Procfile.test" >> .foreman
+
+Use the right virtual environment:
+
+ workon stat_track-test
+
+And have static assets prepared (for coverage tests):
+
+ foreman run django-admin.py collectstatic --noinput
+
+Automatically run all tests and linters and watch files to continuously run tests:
+
+ foreman start
+
+You can view the results of the tests in HTML at [localhost:9000/tests](http://localhost:9000/tests)
+
+You can specifically view the results of Django coverage tests at [localhost:9000/tests/django](http://localhost:9000/tests/django)
+
+Jasmine JS Unit Tests
+---------------------
+
+Grunt automatically compiles Jasmine tests written in CoffeeScript at `/stat_track/static/js/tests/coffee` and runs the tests upon every save.
+
+You can specifically view the results of Jasmine JS unit tests at [localhost:9000/tests/jasmine](http://localhost:9000/tests/jasmine)
+
+You can specifically view the results of JS coverage tests at [localhost:9000/tests/jasmine/coverage.html](http://localhost:9000/tests/jasmine/coverage.html)
+
+Add-ons & Services
+==================
+
+SSL
+---
+Enable SSL via Heroku, Cloudflare, or your DNS provider and then uncomment the SECURITY CONFIGURATION section in `/stat_track/config/settings/prod.py` to enable django-secure and other security best practices for production.
+
+Invoke
+------
+Scripts can be programmed to be run on the command-line using [Invoke](https://github.com/pyinvoke/invoke) for repeated tasks like deployment, building, or cleaning. Write your tasks in `tasks.py`.
+
+Redis Cloud Caching
+-------------------
+In order to enable redis for caching and queues, add [Redis Cloud](https://devcenter.heroku.com/articles/rediscloud) to Heroku.
+
+ heroku addons:add rediscloud:25
+
+Redis Queue Worker
+------------------
+Add a [Redis Queue](https://github.com/ui/django-rq) worker process to Procfile:
+
+ echo "worker: django-admin.py rqworker high default low" >> Procfile
+
+Push the changed Procfile to Heroku:
+
+ git add Procfile
+ git commit -m "Added worker process to Procfile, pushing to Heroku"
+ git push heroku master
+
+Turn on background job worker with this one-liner:
+
+ heroku scale worker=1
+
+Redis Queue Scheduler
+---------------------
+Add a [RQ Scheduler](https://github.com/ui/rq-scheduler) process to Procfile:
+
+ echo "scheduler: rqscheduler --url \$REDISCLOUD_URL" >> Procfile
+
+Push the changed Procfile to Heroku:
+
+ git add Procfile
+ git commit -m "Added scheduler process to Procfile, pushing to Heroku"
+ git push heroku master
+
+Turn on background job scheduler with this one-liner:
+
+ heroku scale scheduler=1
+
+Amazon S3
+---------
+To use Amazon S3 as a static and media file storage, create a custom Group and User via IAM and then a custom static bucket and media bucket with public read policies.
+
+Add the following config variables to Heroku:
+
+ heroku config:set AWS_ACCESS_KEY_ID=INSERT_ACCESS_KEY_ID
+ heroku config:set AWS_SECRET_ACCESS_KEY=INSERT_SECRET_ACCESS_KEY
+ heroku config:set AWS_STATIC_STORAGE_BUCKET_NAME=stat_track-static
+ heroku config:set AWS_MEDIA_STORAGE_BUCKET_NAME=stat_track-media
+
+PG Backups
+----------
+[PG Backups](https://devcenter.heroku.com/articles/pgbackups) is a Heroku add-on for automatic Postgres database backups. Enable with the following one-liner:
+
+ heroku addons:add pgbackups:auto-month
+
+Monitoring
+----------
+- [Librato](https://devcenter.heroku.com/articles/librato) for Heroku performance monitoring
+- [New Relic](https://devcenter.heroku.com/articles/newrelic) for server performance monitoring (protip: set [availability monitoring](https://coderwall.com/p/u0x3nw) on to avoid Heroku idling)
+- [RedisMonitor](https://devcenter.heroku.com/articles/redismonitor) for Redis server monitoring
+- [Logentries](https://devcenter.heroku.com/articles/logentries) provides logging backups as well as search and notifications. Can also additionally backup to S3
+- [Sentry](https://devcenter.heroku.com/articles/sentry) for error tracking with [Raven](http://raven.readthedocs.org/en/latest/index.html) as the client. Make sure to use a [synchronous blocking transport](http://python-rq.org/patterns/sentry/).
+- [Ranger](https://devcenter.heroku.com/articles/ranger) to alert you when your app is down
+
+Testing
+-------
+- [Rainforest RQ](https://devcenter.heroku.com/articles/rainforest) for simple integration testing
+- [Tinfoil Security](https://devcenter.heroku.com/articles/tinfoilsecurity) for regularly scanning your app for security vulnerabilities
+- [Loader.io](https://devcenter.heroku.com/articles/loaderio) for load testing
+
+Continuous Integration
+----------------------
+Includes a fancy badge for GitHub README
+
+- [Travis CI](https://travis-ci.org/) for continuous integration testing
+- [Coveralls.io](https://coveralls.io/) for coverage testing
+- [Requires.io](https://requires.io/) for dependency management
+
+Utilities
+---------
+- [Filepicker](https://devcenter.heroku.com/articles/filepicker) for file uploading and content management
+- [Twilio](http://www.twilio.com/) for sending SMS, MMS, and Voice. Recommended to use [`django-twilio`](http://django-twilio.readthedocs.org/en/latest/)
+- [Mailgun](https://devcenter.heroku.com/articles/mailgun) or [Sendgrid](https://devcenter.heroku.com/articles/sendgrid) for email sending. Here are some useful [email templates](http://blog.mailgun.com/transactional-html-email-templates/)
+- [MailChimp](http://mailchimp.com/) for email newsletters or create your own [custom newsletter emails](http://zurb.com/playground/responsive-email-templates)
+
+Libraries
+=========
+
+Python 2.7.9
+============
+
+Currently using [Django 1.7.5](https://docs.djangoproject.com/en/1.7/) for the app framework
+
+base.txt
+--------
+- [bpython 0.14](http://docs.bpython-interpreter.org/) - Advanced python interpreter/REPL
+- [defusedxml 0.4.1](https://bitbucket.org/tiran/defusedxml) - Secure XML parser protected against XML bombs
+- [dj-static 0.0.6](https://github.com/kennethreitz/dj-static) - Serve production static files with Django
+- [django-authtools 1.1.0](http://django-authtools.readthedocs.org/en/latest/) - Custom User model classes such as `AbstractEmailUser` and `AbstractNamedUser`
+- [django-braces 1.4.0](http://django-braces.readthedocs.org/en/v1.4.0/) - Lots of custom mixins
+- [django-extensions 1.5.0](http://django-extensions.readthedocs.org/en/latest/) - Useful command line extensions (`shell_plus`, `create_command`, `export_emails`)
+- [django-floppyforms 1.3.0](http://django-floppyforms.readthedocs.org/en/latest/) - Control of output of form rendering
+- [django-model-utils 2.2](https://django-model-utils.readthedocs.org/en/latest/) - Useful model mixins and utilities such as `TimeStampedModel` and `Choices`
+- [django-pipeline 1.4.6](http://django-pipeline.readthedocs.org/en/latest/) - CSS and JS compressor and compiler. Also minifies HTML
+- [django-redis 3.8.3](https://django-redis.readthedocs.org/en/latest/) - Enables redis caching
+- [django-rq 0.7.0](https://github.com/ui/django-rq) - Django integration for RQ
+- [invoke 0.9.0](https://github.com/pyinvoke/invoke) - Python task execution in `tasks.py`
+- [logutils 0.3.3](https://pythonhosted.org/logutils/) - Nifty handlers for the Python standard library’s logging package
+- [project-runpy 0.3.1](https://github.com/crccheck/project_runpy) - Helpers for Python projects like ReadableSqlFilter
+- [psycopg2 2.6](http://pythonhosted.org/psycopg2/) - PostgreSQL adapter
+- [python-magic 0.4.6](https://github.com/ahupp/python-magic) - Library to identify uploaded files' headers
+- [pytz 2014.10](http://pytz.sourceforge.net/) - World timezone definitions
+- [requests 2.5.3](http://docs.python-requests.org/en/latest/) - HTTP request API
+- [rq-scheduler 0.5.1](https://github.com/ui/rq-scheduler) - Job scheduling capabilities to RQ
+- [six 1.9.0](http://pythonhosted.org/six/) - Python 2 and 3 compatibility utilities
+- [static 1.1.1](https://github.com/lukearno/static) - Serves static and dynamic content
+- [unicode-slugify 0.1.3](https://github.com/mozilla/unicode-slugify) - A slugifier that works in unicode
+
+dev.txt
+-------
+- [Werkzeug 0.10.1](http://werkzeug.pocoo.org/) - WSGI utility library with powerful debugger
+- [django-debug-toolbar 1.2.2](http://django-debug-toolbar.readthedocs.org/en/1.2/) - Debug information in a toolbar
+- [django-sslserver 0.14](https://github.com/teddziuba/django-sslserver) - SSL localhost server
+
+prod.txt
+--------
+- [Collectfast 0.2.1](https://github.com/antonagestam/collectfast) - Faster collectstatic
+- [boto 2.36.0](https://boto.readthedocs.org/en/latest/) - Python interface to AWS
+- [dj-database-url 0.3.0](https://github.com/kennethreitz/dj-database-url) - Allows Django to use database URLs for Heroku
+- [django-secure 1.0.1](http://django-secure.readthedocs.org/en/v0.1.2/) - Django security best practices
+- [django-storages 1.1.8](http://django-storages.readthedocs.org/en/latest/index.html) - Custom storage backends; using S3
+- [gunicorn 19.2.1](https://github.com/benoitc/gunicorn) - Production WSGI server with workers
+
+test.txt
+--------
+- [coverage 3.7.1](http://nedbatchelder.com/code/coverage/) - Measures code coverage
+- [nose-exclude 0.2.0](https://bitbucket.org/kgrandis/nose-exclude) - Easily specify directories to be excluded from testing
+- [django-nose 1.3](https://github.com/django-nose/django-nose) - Django test runner using nose
+- [factory-boy 2.4.1](https://github.com/rbarrois/factory_boy) - Test fixtures replacement for Python
+- [flake8 2.3.0](http://flake8.readthedocs.org/en/latest/) - Python style checker
+
+config/lib
+----------
+- [colorstreamhandler.py](http://stackoverflow.com/questions/384076/how-can-i-color-python-logging-output/1336640#1336640) - Colored stream handler for python logging framework
+- [tdaemon.py](https://github.com/brunobord/tdaemon) - Test daemon in Python modified to work with django-admin.py, django-nose, and coverage
+
+Node 0.10.X
+===========
+
+post_compile
+------------
+Using `post_compile` script for the Heroku python environment to recognize node packages
+
+- [yuglify 0.1.4](https://github.com/yui/yuglify) - UglifyJS and cssmin compressor
+
+package.json
+------------
+Locally using node and grunt to watch and compile frontend files
+
+- [coffee-script ^1.8.0](http://coffeescript.org/) - Cleaner JavaScript
+- [grunt ~0.4.5](http://gruntjs.com/) - Automatic Task Runner
+- [grunt-autoprefixer ^2.0.0](https://github.com/nDmitry/grunt-autoprefixer) - Parse CSS and add vendor-prefixed CSS properties
+- [grunt-coffeelint 0.0.13](https://github.com/vojtajina/grunt-coffeelint) - Lint your CoffeeScript
+- [grunt-concurrent ^1.0.0](https://github.com/sindresorhus/grunt-concurrent) - Run grunt tasks concurrently
+- [grunt-contrib-clean ^0.6.0](https://github.com/gruntjs/grunt-contrib-clean) - Clear files and folders
+- [grunt-contrib-coffee ^0.13.0](https://github.com/gruntjs/grunt-contrib-coffee) - Compile CoffeeScript files to JavaScript
+- [grunt-contrib-connect ^0.9.0](https://github.com/gruntjs/grunt-contrib-connect) - Start a static web server
+- [grunt-contrib-copy ^0.8.0](https://github.com/gruntjs/grunt-contrib-copy) - Copy files and folders
+- [grunt-contrib-imagemin ^0.9.1](https://github.com/gruntjs/grunt-contrib-imagemin) - Minify PNG, JPEG, GIF, and SVG images
+- [grunt-contrib-jasmine ^0.8.0](https://github.com/gruntjs/grunt-contrib-jasmine) - Run jasmine specs headlessly through PhantomJS
+- [grunt-contrib-watch ^0.6.1](https://github.com/gruntjs/grunt-contrib-watch) - Run tasks whenever watched files change
+- [grunt-newer ^1.0.0](https://github.com/tschaub/grunt-newer) - Configure Grunt tasks to run with changed files only
+- [grunt-notify ^0.4.1](https://github.com/dylang/grunt-notify) - Automatic desktop notifications for Grunt
+- [grunt-open ^0.2.3](https://github.com/jsoverson/grunt-open) - Open urls and files from a grunt task
+- [grunt-sass ^0.18.0](https://github.com/sindresorhus/grunt-sass) - Compile Sass to CSS
+- [grunt-scss-lint ^0.3.3](https://github.com/ahmednuaman/grunt-scss-lint) - Lint your SCSS
+- [grunt-shell ^1.1.1](https://github.com/sindresorhus/grunt-shell) - Run shell commands
+- [grunt-template-jasmine-istanbul ^0.3.0](https://github.com/maenu/grunt-template-jasmine-istanbul) - Code coverage template mix-in for grunt-contrib-jasmine, using istanbul
+- [grunt-text-replace ^0.4.0](https://github.com/yoniholmes/grunt-text-replace) - General purpose text replacement for grunt
+- [load-grunt-config ^0.16.0](https://github.com/firstandthird/load-grunt-config) - Grunt plugin that lets you break up your Gruntfile config by task
+- [time-grunt ^1.0.0](https://github.com/sindresorhus/time-grunt) - Display the elapsed execution time of grunt tasks
+
+Static Assets
+=============
+
+Fonts
+-----
+- [SS-Standard 1.005](https://symbolset.com/icons/standard) - Standard icon library as a font. Documentation located locally at `/stat_track/static/css/fonts/ss-standard/documentation.html`
+
+CSS
+---
+- [Bootstrap 3.3.0](http://getbootstrap.com) - CSS/JS starting framework
+
+JS
+--
+- [jQuery 1.11.1](https://api.jquery.com/) - Useful JS functions
+- [Bootstrap 3.3.0](http://getbootstrap.com) - CSS/JS starting framework
+- [Underscore.js 1.7.0](http://underscorejs.org) - Very useful functional programming helpers
+- [CSRF.js](https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax) - Django Cross Site Request Forgery protection via AJAX
+
+Jasmine
+-------
+- [Jasmine-Ajax 2.0.1](http://github.com/pivotal/jasmine-ajax) - Set of helpers for testing AJAX requests with Jasmine
+- [Jasmine-jQuery 2.0.5](https://github.com/velesin/jasmine-jquery) - Set of jQuery helpers for Jasmine
+
+Acknowledgements
+================
+
+
+
+This project follows best practices as espoused in [Two Scoops of Django: Best Practices for Django 1.6](http://twoscoopspress.org/products/two-scoops-of-django-1-6).
+
+Many thanks to:
+---------------
+
+- [Daniel Greenfield](https://twitter.com/pydanny) and [Audrey Roy](https://twitter.com/audreyr) for writing the book
+- All of the [contributors](https://github.com/twoscoops/django-twoscoops-project/blob/master/CONTRIBUTORS.txt) to the original fork
diff --git a/stat_track/bin/common.sh b/stat_track/bin/common.sh
new file mode 100644
index 0000000..4a9d17e
--- /dev/null
+++ b/stat_track/bin/common.sh
@@ -0,0 +1,43 @@
+error() {
+ echo " ! $*" >&2
+ exit 1
+}
+
+status() {
+ echo "-----> $*"
+}
+
+protip() {
+ echo
+ echo "PRO TIP: $*" | indent
+ echo "See https://devcenter.heroku.com/articles/nodejs-support" | indent
+ echo
+}
+
+# sed -l basically makes sed replace and buffer through stdin to stdout
+# so you get updates while the command runs and dont wait for the end
+# e.g. npm install | indent
+indent() {
+ c='s/^/ /'
+ case $(uname) in
+ Darwin) sed -l "$c";; # mac/bsd sed: -l buffers on line boundaries
+ *) sed -u "$c";; # unix/gnu sed: -u unbuffered (arbitrary) chunks of data
+ esac
+}
+
+cat_npm_debug_log() {
+ test -f $build_dir/npm-debug.log && cat $build_dir/npm-debug.log
+}
+
+export_env_dir() {
+ env_dir=$1
+ whitelist_regex=${2:-''}
+ blacklist_regex=${3:-'^(PATH|GIT_DIR|CPATH|CPPATH|LD_PRELOAD|LIBRARY_PATH)$'}
+ if [ -d "$env_dir" ]; then
+ for e in $(ls $env_dir); do
+ echo "$e" | grep -E "$whitelist_regex" | grep -qvE "$blacklist_regex" &&
+ export "$e=$(cat $env_dir/$e)"
+ :
+ done
+ fi
+}
diff --git a/stat_track/bin/install_nodejs b/stat_track/bin/install_nodejs
new file mode 100644
index 0000000..9a4790a
--- /dev/null
+++ b/stat_track/bin/install_nodejs
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+
+set -eo pipefail
+
+NODE_VERSION=$(curl --silent --get https://semver.io/node/stable)
+NODE_BASENAME=node-v${NODE_VERSION}-linux-x64
+NODE_ARCHIVE="http://nodejs.org/dist/v${NODE_VERSION}/${NODE_BASENAME}.tar.gz"
+
+echo "Downloading and installing node-$NODE_VERSION"
+
+tempdir="$( mktemp -t node_XXXX )"
+rm -rf $tempdir
+mkdir -p $tempdir
+
+pushd $tempdir &> /dev/null
+curl -s -L -o tmp-nodejs.tar.gz $NODE_ARCHIVE
+tar -zxvf tmp-nodejs.tar.gz > /dev/null
+rm tmp-nodejs.tar.gz
+popd &> /dev/null
+
+mkdir -v -p $BUILD_DIR/.heroku/vendor &> /dev/null
+pushd $BUILD_DIR/.heroku/vendor &> /dev/null
+rm -rf node
+mv $tempdir/$NODE_BASENAME node
+popd &> /dev/null
+
+ln -sf ../../vendor/node/bin/node .heroku/python/bin/node
+ln -sf ../../vendor/node/bin/node-waf .heroku/python/bin/node-waf
+ln -sf ../../vendor/node/bin/npm .heroku/python/bin/npm
diff --git a/stat_track/bin/post_compile b/stat_track/bin/post_compile
new file mode 100644
index 0000000..9dcdfb0
--- /dev/null
+++ b/stat_track/bin/post_compile
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+
+set -eo pipefail
+source bin/common.sh
+
+if ! type node &> /dev/null; then
+ status "Installing node.js"
+ chmod +x bin/install_nodejs
+ bin/install_nodejs 2>&1 | indent
+ echo
+fi
+
+if ! type yuglify &> /dev/null; then
+ status "Installing yuglify"
+ npm install -g yuglify@0.1.4 2>&1 | indent
+ echo
+fi
+
+status "Post-compile done"
+echo
diff --git a/stat_track/docs/README.md b/stat_track/docs/README.md
new file mode 100644
index 0000000..db7d0c8
--- /dev/null
+++ b/stat_track/docs/README.md
@@ -0,0 +1,34 @@
+Welcome to stat_track's documentation!
+==============================================
+
+[Setup](setup.md)
+-------------------------------
+Instructions to get your environment set up and to start coding!
+
+[Development](development.md)
+-----------------------------
+Instructions to start your dev server.
+
+[Deployment](deployment.md)
+---------------------------
+Instructions to deploy to production.
+
+[Architecture](architecture.md)
+-------------------------------
+High-level overview of how this app is structured.
+
+[Testing](testing.md)
+---------------------
+Instructions to run unit and functional tests.
+
+[Libraries](libraries.md)
+-------------------------
+List of what third-party plugins/libraries are used and what they do.
+
+[Services](services.md)
+-----------------------
+List of cloud services used.
+
+[Change Log](changelog.md)
+-------------------------
+List of changes in each version update.
diff --git a/stat_track/docs/architecture.md b/stat_track/docs/architecture.md
new file mode 100644
index 0000000..3837742
--- /dev/null
+++ b/stat_track/docs/architecture.md
@@ -0,0 +1,2 @@
+Architecture
+============
diff --git a/stat_track/docs/changelog.md b/stat_track/docs/changelog.md
new file mode 100644
index 0000000..a5693d9
--- /dev/null
+++ b/stat_track/docs/changelog.md
@@ -0,0 +1,2 @@
+Changelog
+=========
diff --git a/stat_track/docs/deployment.md b/stat_track/docs/deployment.md
new file mode 100644
index 0000000..7c3cda7
--- /dev/null
+++ b/stat_track/docs/deployment.md
@@ -0,0 +1,2 @@
+Deployment
+==========
diff --git a/stat_track/docs/development.md b/stat_track/docs/development.md
new file mode 100644
index 0000000..ab0c3b3
--- /dev/null
+++ b/stat_track/docs/development.md
@@ -0,0 +1,2 @@
+Development
+===========
diff --git a/stat_track/docs/libraries.md b/stat_track/docs/libraries.md
new file mode 100644
index 0000000..237e420
--- /dev/null
+++ b/stat_track/docs/libraries.md
@@ -0,0 +1,2 @@
+Libraries
+=========
diff --git a/stat_track/docs/services.md b/stat_track/docs/services.md
new file mode 100644
index 0000000..14f3e5a
--- /dev/null
+++ b/stat_track/docs/services.md
@@ -0,0 +1,2 @@
+Services
+========
diff --git a/stat_track/docs/setup.md b/stat_track/docs/setup.md
new file mode 100644
index 0000000..ad9665d
--- /dev/null
+++ b/stat_track/docs/setup.md
@@ -0,0 +1,2 @@
+Setup
+=====
diff --git a/stat_track/docs/testing.md b/stat_track/docs/testing.md
new file mode 100644
index 0000000..96994bb
--- /dev/null
+++ b/stat_track/docs/testing.md
@@ -0,0 +1,2 @@
+Testing
+=======
diff --git a/stat_track/grunt/aliases.yaml b/stat_track/grunt/aliases.yaml
new file mode 100644
index 0000000..3ac3a9e
--- /dev/null
+++ b/stat_track/grunt/aliases.yaml
@@ -0,0 +1,61 @@
+# Aliases for registered tasks
+# https://github.com/firstandthird/load-grunt-config#aliases
+
+lint_stylesheets:
+ - 'scsslint'
+
+lint_scripts:
+ - 'coffeelint:scripts'
+
+lint:
+ - 'lint_stylesheets'
+ - 'lint_scripts'
+
+build_stylesheets:
+ - 'clean:stylesheets'
+ - 'sass'
+ - 'autoprefixer'
+ - 'replace:stylesheets'
+
+build_scripts:
+ - 'clean:scripts'
+ - 'coffee:scripts'
+
+build_images:
+ - 'clean:images'
+ - 'imagemin'
+
+build:
+ - 'build_stylesheets'
+ - 'build_scripts'
+ - 'build_images'
+
+heroku:
+ - 'build'
+
+dev:
+ - 'lint'
+ - 'build'
+ - 'notify:compile'
+ - 'watch'
+
+lint_jasmine:
+ - 'coffeelint:jasmine'
+
+build_jasmine:
+ - 'copy:jasmine'
+ - 'coffee'
+ - 'jasmine'
+ - 'copy:coverage'
+ - 'copy:specRunner'
+ - 'clean:specRunner'
+ - 'replace:coverage'
+ - 'replace:specRunner'
+
+test:
+ - 'shell:django'
+ - 'clean:jasmine'
+ - 'lint_jasmine'
+ - 'build_jasmine'
+ - 'notify:test'
+ - 'concurrent:tests'
diff --git a/stat_track/grunt/autoprefixer.coffee b/stat_track/grunt/autoprefixer.coffee
new file mode 100644
index 0000000..8ba476e
--- /dev/null
+++ b/stat_track/grunt/autoprefixer.coffee
@@ -0,0 +1,15 @@
+module.exports =
+
+ # Parse CSS and add vendor-prefixed CSS properties
+ # https://github.com/nDmitry/grunt-autoprefixer
+
+ stylesheets:
+ options:
+ map: true
+ files: [
+ expand: true
+ cwd: '<%= paths.css %>/build/'
+ src: ['*.css']
+ dest: '<%= paths.css %>/build'
+ ext: '.css'
+ ]
diff --git a/stat_track/grunt/clean.coffee b/stat_track/grunt/clean.coffee
new file mode 100644
index 0000000..adba919
--- /dev/null
+++ b/stat_track/grunt/clean.coffee
@@ -0,0 +1,27 @@
+module.exports =
+
+ # Clear files and folders
+ # https://github.com/gruntjs/grunt-contrib-clean
+
+ stylesheets: ['<%= paths.css %>/build']
+
+ scripts: [
+ '<%= paths.js %>/build'
+ '<%= paths.js %>/tests/build'
+ ]
+
+ images: ['<%= paths.img %>/compressed']
+
+ tests: [
+ '<%= paths.tests %>/*'
+ '.coverage'
+ ]
+
+ jasmine: ['<%= paths.tests %>/jasmine']
+
+ specRunner: ['_SpecRunner.html']
+
+ logs: [
+ 'logs/*.log'
+ 'logs/*.log.*'
+ ]
diff --git a/stat_track/grunt/coffee.coffee b/stat_track/grunt/coffee.coffee
new file mode 100644
index 0000000..9cda337
--- /dev/null
+++ b/stat_track/grunt/coffee.coffee
@@ -0,0 +1,26 @@
+module.exports =
+
+ # Compile CoffeeScript files to JavaScript
+ # https://github.com/gruntjs/grunt-contrib-coffee
+
+ scripts:
+ options:
+ sourceMap: true
+ files: [
+ expand: true
+ cwd: '<%= paths.js %>/coffee'
+ src: ['*.coffee']
+ dest: '<%= paths.js %>/build'
+ ext: '.js'
+ ]
+
+ jasmine:
+ options:
+ sourceMap: true
+ files: [
+ expand: true
+ cwd: '<%= paths.js %>/tests/coffee'
+ src: ['*.coffee']
+ dest: '<%= paths.js %>/tests/build'
+ ext: '.js'
+ ]
diff --git a/stat_track/grunt/coffeelint.coffee b/stat_track/grunt/coffeelint.coffee
new file mode 100644
index 0000000..8065bfe
--- /dev/null
+++ b/stat_track/grunt/coffeelint.coffee
@@ -0,0 +1,8 @@
+module.exports =
+
+ # Lint your CoffeeScript
+ # https://github.com/vojtajina/grunt-coffeelint
+
+ scripts: ['<%= paths.js %>/coffee/*.coffee']
+
+ jasmine: ['<%= paths.js %>/tests/coffee/*.coffee']
diff --git a/stat_track/grunt/concurrent.coffee b/stat_track/grunt/concurrent.coffee
new file mode 100644
index 0000000..f279561
--- /dev/null
+++ b/stat_track/grunt/concurrent.coffee
@@ -0,0 +1,13 @@
+module.exports =
+
+ # Run grunt tasks concurrently
+ # https://github.com/sindresorhus/grunt-concurrent
+
+ tests:
+ options:
+ logConcurrentOutput: true
+ tasks: [
+ 'connect:tests'
+ 'watch'
+ 'shell:tdaemon'
+ ]
diff --git a/stat_track/grunt/connect.coffee b/stat_track/grunt/connect.coffee
new file mode 100644
index 0000000..4700a69
--- /dev/null
+++ b/stat_track/grunt/connect.coffee
@@ -0,0 +1,11 @@
+module.exports =
+
+ # Start a static web server
+ # https://github.com/gruntjs/grunt-contrib-connect
+
+ tests:
+ options:
+ port: 9000
+ hostname: 'localhost'
+ livereload: true
+ keepalive: true
diff --git a/stat_track/grunt/copy.coffee b/stat_track/grunt/copy.coffee
new file mode 100644
index 0000000..b480de0
--- /dev/null
+++ b/stat_track/grunt/copy.coffee
@@ -0,0 +1,18 @@
+module.exports =
+
+ # Copy files and folders
+ # https://github.com/gruntjs/grunt-contrib-copy
+
+ jasmine:
+ expand: true
+ flatten: true
+ src: '<%= paths.js %>/tests/lib/*.js'
+ dest: '<%= paths.js %>/tests/build/'
+
+ coverage:
+ src: '<%= paths.tests %>/jasmine/index.html'
+ dest: '<%= paths.tests %>/jasmine/coverage.html'
+
+ specRunner:
+ src: '_SpecRunner.html'
+ dest: '<%= paths.tests %>/jasmine/index.html'
diff --git a/stat_track/grunt/imagemin.coffee b/stat_track/grunt/imagemin.coffee
new file mode 100644
index 0000000..422fd43
--- /dev/null
+++ b/stat_track/grunt/imagemin.coffee
@@ -0,0 +1,15 @@
+module.exports =
+
+ # Minify PNG, JPEG, GIF, and SVG images
+ # https://github.com/gruntjs/grunt-contrib-imagemin
+
+ images:
+ files: [
+ expand: true
+ cwd: '<%= paths.img %>/'
+ src: [
+ '**/*.{png,jpg,gif,svg,ico}',
+ '!compressed/'
+ ]
+ dest: '<%= paths.img %>/compressed'
+ ]
diff --git a/stat_track/grunt/jasmine.coffee b/stat_track/grunt/jasmine.coffee
new file mode 100644
index 0000000..e0a9596
--- /dev/null
+++ b/stat_track/grunt/jasmine.coffee
@@ -0,0 +1,31 @@
+module.exports =
+
+ # Run jasmine specs headlessly through PhantomJS
+ # https://github.com/gruntjs/grunt-contrib-jasmine
+
+ # Code coverage template mix-in for grunt-contrib-jasmine, using istanbul
+ # https://github.com/maenu/grunt-template-jasmine-istanbul
+
+ coverage:
+ options:
+ specs: '<%= paths.js %>/tests/build/*Spec.js'
+ helpers: '<%= paths.js %>/tests/build/*Helper.js'
+ vendor: [
+ 'https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js'
+ '<%= paths.js %>/lib/*.js'
+ ]
+ keepRunner: true
+ template: require('grunt-template-jasmine-istanbul')
+ templateOptions:
+ coverage: '<%= paths.tests %>/jasmine/coverage.json'
+ report: [
+ {
+ type: 'html'
+ options:
+ dir: '<%= paths.tests %>/jasmine'
+ }
+ { type: 'text-summary' }
+ { type: 'text' }
+ ]
+
+ src: '<%= paths.js %>/build/*.js'
diff --git a/stat_track/grunt/notify.coffee b/stat_track/grunt/notify.coffee
new file mode 100644
index 0000000..e912676
--- /dev/null
+++ b/stat_track/grunt/notify.coffee
@@ -0,0 +1,20 @@
+module.exports =
+
+ # Automatic desktop notifications for Grunt
+ # https://github.com/dylang/grunt-notify
+
+ lint:
+ options:
+ message: "Linting is complete"
+
+ build:
+ options:
+ message: "Building is complete"
+
+ test:
+ options:
+ message: "Testing is complete"
+
+ compile:
+ options:
+ message: "Compiling is complete, now watching..."
diff --git a/stat_track/grunt/open.coffee b/stat_track/grunt/open.coffee
new file mode 100644
index 0000000..4178d22
--- /dev/null
+++ b/stat_track/grunt/open.coffee
@@ -0,0 +1,13 @@
+module.exports =
+
+ # Open urls and files from a grunt task
+ # https://github.com/jsoverson/grunt-open
+
+ jasmine:
+ path: 'http://localhost:9000/tests/jasmine/'
+
+ django:
+ path: 'http://localhost:9000/tests/django/'
+
+ dev:
+ path: 'http://localhost:8000'
diff --git a/stat_track/grunt/replace.coffee b/stat_track/grunt/replace.coffee
new file mode 100644
index 0000000..1a84483
--- /dev/null
+++ b/stat_track/grunt/replace.coffee
@@ -0,0 +1,50 @@
+module.exports =
+
+ # General purpose text replacement for grunt
+ # https://github.com/yoniholmes/grunt-text-replace
+
+ stylesheets:
+ src: ['<%= paths.css %>/build/*.css.map']
+ overwrite: true
+ replacements: [
+ from: '<%= name %>/static'
+ to: '/static'
+ ]
+
+ coverage:
+ src: ['<%= paths.tests %>/jasmine/coverage.html']
+ overwrite: true
+ replacements: [
+ from: '