_model: page
---
title: Charter
---
body:
The [charter](https://github.com/aisamanra/charter) tool is a basic tool for Cabal-based project scaffolding. There are a number of tools that do this—Cabal comes with the `cabal init` command built-in, for example, and there's also the heavily configurable [`hi`](https://github.com/fujimura/hi) project—but none of them had quite what I wanted, so I built my own.
It has three main modes of operation, all of which will create a directory that contains a `cabal` file, initialize a git repo, and build out whatever other scaffolding is required. For basic executables, you can use
```
$ charter quick the-thing
```
and it will create `the-thing/the-thing.cabal` and `the-thing/src/Main.hs` for you, with a trivial entry point, and initialize a git repo with them. For a library, you can use a similar command, with optional `-m` flags to add new modules
```
$ charter library the-thing -m This -m That.TheOther
```
and in addition to `the-thing/the-thing.cabal`, it will also create the stubbed-out library modules `the-thing/src/This.hs` and `the-thing/src/That/TheOther.hs`. Finally, for larger executables (which I prefer to implement as a wrapper executable along with a library), you can use
```
$ charter executable the-thing
```
and in addition to `the-thing/the-thing.cabal`, it will also create the stubbed-out library code in `the-thing/src/TheThing.hs` as well as stubbed-out executable code in `the-thing/the-thing/Main.hs`.
All of these commands can also take other flags that fill in Cabal metadata: for example, `-l GPL` to specify a GPL license, `-d "some description"` to set the package description, `-a package-name` to add a dependency, and so forth. You can also add extra executable stanzas with `-b executable-name` and modules with `-m ModuleName`.