Download .zip Download .tar.gz View on GitHub

Vee is a command line blog tool that is very portable across Unix systems. It provides an interactive as well as a batch interface to maintain a log of entries. Formatting is done using a module architecture that allows a high degree of customization. There are minimal flags and no set up is required.

Found a BUG or have a feature REQUEST?

Check out the latest release

Project Status:

This is one of those "forever" projects that met my needs very early on, and I have revisited the code for only incremental improvements. I'd like to get to 1.0, but this would realy just mean a nice set of useful utilities (veels, veecat, vee-rebuild) and associated documentation. Work towards this has been spotty, but progress has been good. At some point, I'll have some time to wrap it up and present version 1.0 - at which point it's likely I'll cease any work on it other than bug fixes or applying patches from others.

All Options

  %vee [-c fold_column] [-t title] [-m message] [-b #toggle batchmode]        
  -b                batch mode; used when piping in msg via stdin             
  -B  file          define bottom template; default is ./vee-bottom.tpl       
  -c  [1-9\d*]      specify the number of characters 'fold' allows per line   
                    this only applies when 'fold' (-f) is used              
  -d  'publis_dir'  specify the directory .vee is in - defaults to PWD        
  -f  'format'      use defined format instead of the default, groff;
                    'groff', 'fold', and 'none' are supported out of the box
  -h                prints this blurb                                         
  -i  'custom.html' specify a custom index file over the default              
  -I                force index file to be "index.html"                     
  -l                edit latest post's *.raw; used with '-r' publishes changes;
                    calls reformat automatically;                             
  -L  [1-9\d*]      edit the Nth latest, relative to last post; lp starts at 1
  -m  'message ...' specify entry message at commandline and avoid vi         
  -n                lists all entries, newest first, then quits               
  -o                lists all entries, oldest first, then quits               
  -p                see what *raw files don't have an entry in the INDEX      
  -P                forever deletes all *raw and formatted files associated with
                    posts that are listed with -p;                            
  -r  [1-9\d*]      reformats the Nth latest post                             
  -R                reformats _all_ .vee/*.raw files; -c applies as well      
  -s  summary       placed below title in INDEX                               
  -t  'title'       specify title at commandline and avoid annoying default prompt
  -T  file          define top template; default is ./vee-top.tpl             
  -v                version and exit                                          
  -x  filter        defines filter if not using default ./vee-pre; filter     
                    must be executable, i.e., chmod 755 vee-pre 

Main Repository

git clone git://

Don't feel like installing vee?
Get an account at!

Basic Usage

Note: one needs not configure anything to start using vee "out of the box".

vee [-t "title"] [-m "msg.."] [-f [groff | fold | none | yourcustom]] [-I|-i "customindex.html"] [-d "/pub/dir"]

Usage Examples

Full entry via commandline:
vee -t "title" -m "very short msg"

Full entry via $EDITOR:
vee -t "title text" # opens to $EDITOR

Fully non-interactive entry, I'm talking batch mode!, which is suitable for use with a crontab:
/path/to/xyz 2>&1 | /usr/local/bin/vee -d /usr/local/www/data/mirrors/log -b -I -t "XYZ Output" -f none

Edit and reformat last entry:
vee -rl

Reformat all:
vee -R -f [groff | fold | none | yourcustom]

The .veerc File

The .veerc file is looked for in the publish directory, even if you supply the -d pub/dir option. This is so each publish directory can have its own customized options. Variables are read in the following order:
  1. initialization at the top of the vee shell script; note that the environmental variable $EDITOR is respected.
  2. options are set via the commandline arguments
  3. the .veerc file is read in
If there is a strong need to allow for command line flags to override the .veerc file, then let me know and I'll put more thought into how this flows.

Post Management

The 0.9.9-zeta release introduced the ability to update posts other than the most recent one. See this post for more information.

Index File

The index file is by default, vee.html. Using the -I flag forces it to be index.html, and using the -i customindex.htm flag will allow a specific file to be used. For a description of the index file format, please see the vee file formats page. This includes information on the entry file format and management. The file may also be included inside of PHP or mod_perl scripts by importing the text file itself.


Template files that specify the top and bottom html, vee-top.tpl and vee-bottom.tpl respectively, are looked for automatically inside the publish directory. Files named differently may be specified using the -T and -B flags.

Preformat Filter

One may define a filter that processes the raw input the first time one enters the text. See this post for more information.

Custom Format Functions

One may define their own set of custom format functions much more easily. See this post for more information.