Skip to content


Subversion checkout URL

You can clone with
Download ZIP
A streamlined approach to working with multiple projects and tasks
Branch: master
Pull request Compare This branch is even with joshnesbitt:master.

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.



  • Overview
  • Installation
  • Usage
  • Changelog
  • Bugs
  • Contributors
  • Note on Patches/Pull Requests


Project aims to make working with multiple projects as simple as possible. By registering projects with workflows you can quickly create a set of commands that will be run against each project. Check out the blog post for a bit more background on how project came to life.


The project is hosted on Getting it is simple:

gem install project

Once the gem is installed run:

project install

Assuming you haven’t already had the gem installed this will create a file at ~/.project (or ~/.config/project/config.yaml, if you’re using X). This is the main configuration file used to drive project.


Project uses a YAML file for its configuration. Edit the file located in at ~/.project to you liking.


A project can be anything revolving around a particular context. A typical use case would be opening your default environment for a project. An example project configuration might look like this:

  :path: /path/to/project
  :workflow: default

The only required key within a project is workflow. This is important as you need to tell the project binary which workflow to apply against the project. Any other variables specified here will be passed through to a workflow (more on this below).


A workflow is a set of commands you want run against a particular project. An example workflow might look something like this:

  - cd %path
  - mate .
  - gitx

Which translates to:

  • cd /path/to/project
  • mate .
  • gitx

A workflow is just a YAML array of templated commands. Any variable used in a workflow will get looked up on the project that’s running it. In the example above the %path variable is replaced by the path specified within the project. Using this method you can quickly build up a set of common workflows to use against many projects.

Each workflow runs within its own subshell. This means that every command executed will run in the environment as it was left by the previous command. Given the above workflow, first a command executes which changes the current directory then commands are executed relative to that directory.

My default workflow looks something like this:

  - cd %path
  - mate .
  - gitx
  - open 'http://%basecamp_url'
  - open 'http://%app'
  - rails server


  • changes to the project directory
  • opens the project in Textmate
  • opens it’s Git history in GitX
  • opens the Basecamp project for the app
  • starts the Rails server (and opens it up in the default browser)

Note: at the moment commands do not support being daemonised, hence why the call to rails server is the last command executed.

Running a project

Running a project is simple, just specify the name of the project you want to load and the workflow will run for it:

project name



  • Added support for an alternative configuration file on X based systems (within XDG_CONFIG_HOME) thanks to Simon Hafner.


  • Added the ability for each workflow command to run within the same sub-shell. Commands executed within a sequence now respect the last ran command.


  • Fixed issue in the template regular expression where numerics were being ignored.


If you have any problems with Project, please file an issue.


  • Simon Hafner (Tass)

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don’t break it in a
    future version unintentionally.
  • Commit, do not mess with rakefile, version, or history.
    (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.


Josh Nesbitt / /

Something went wrong with that request. Please try again.