Wiki using happstack, git or darcs, and pandoc.

Latest on Hackage:

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow to host generated Haddocks.

GPL licensed by John MacFarlane
Maintained by


Gitit is a wiki program written in Haskell. It uses Happstack for the web server and pandoc for markup processing. Pages and uploaded files are stored in a git, darcs, or mercurial repository and may be modified either by using the VCS's command-line tools or through the wiki's web interface. By default, pandoc's extended version of markdown is used as a markup language, but reStructuredText, LaTeX, HTML, DocBook, or Emacs Org-mode markup can also be used. Pages can be exported in a number of different formats, including LaTeX, RTF, OpenOffice ODT, and MediaWiki markup. Gitit can be configured to display TeX math (using texmath) and highlighted source code (using highlighting-kate).

Other features include

  • plugins: dynamically loaded page transformations written in Haskell (see "Network.Gitit.Interface")

  • categories

  • TeX math

  • syntax highlighting of source code files and code snippets (using highlighting-kate)

  • caching

  • Atom feeds (site-wide and per-page)

  • a library, "Network.Gitit", that makes it simple to include a gitit wiki in any happstack application

Getting started

Compiling and installing gitit

The most reliable way to install gitit from source is to get the stack tool. Then clone the gitit repository and use stack to install:

git clone
cd gitit
stack install

Alternatively, instead of using stack, you can get the Haskell Platform and do the following:

cabal update
cabal install gitit

This will install the latest released version of gitit. To install a version of gitit checked out from the repository, change to the gitit directory and type:

cabal install

The cabal tool will automatically install all of the required haskell libraries. If all goes well, by the end of this process, the latest release of gitit will be installed in your local .cabal directory. You can check this by trying:

gitit --version

If that doesn't work, check to see that gitit is in your local cabal-install executable directory (usually ~/.cabal/bin). And make sure ~/.cabal/bin is in your system path.

Running gitit

To run gitit, you'll need git in your system path. (Or darcs or hg, if you're using darcs or mercurial to store the wiki data.)

Gitit assumes that the page files (stored in the git repository) are encoded as UTF-8. Even page names may be UTF-8 if the file system supports this. So you should make sure that you are using a UTF-8 locale when running gitit. (To check this, type locale.)

Switch to the directory where you want to run gitit. This should be a directory where you have write access, since three directories, static, templates, and wikidata, and two files, gitit-users and gitit.log, will be created here. To start gitit, just type:


If all goes well, gitit will do the following:

  1. Create a git repository, wikidata, and add a default front page.
  2. Create a static directory containing files to be treated as static files by gitit.
  3. Create a templates directory containing HStringTemplate templates for wiki pages.
  4. Start a web server on port 5001.

Check that it worked: open a web browser and go to http://localhost:5001.

You can control the port that gitit runs on using the -p option: gitit -p 4000 will start gitit on port 4000. Additional runtime options are described by gitit -h.

Using gitit

For instructions on editing pages and creating links, see the "Help" page.

Gitit interprets links with empty URLs as wikilinks. Thus, in markdown pages, [Front Page]() creates an internal wikilink to the page Front Page. In reStructuredText pages, `Front Page <>`_ has the same effect.

If you want to link to a directory listing for a subdirectory, use a trailing slash: [foo/bar/]() creates a link to the directory for foo/bar.

Page metadata

Pages may optionally begin with a metadata block. Here is an example:

format: latex+lhs
categories: haskell math
toc: no
title: Haskell and
  Category Theory

\section{Why Category Theory?}

The metadata block consists of a list of key-value pairs, each on a separate line. If needed, the value can be continued on one or more additional line, which must begin with a space. (This is illustrated by the "title" example above.) The metadata block must begin with a line --- and end with a line ... optionally followed by one or more blank lines. (The metadata block is a valid YAML document, though not all YAML documents will be valid metadata blocks.)

Currently the following keys are supported:

format : Overrides the default page type as specified in the configuration file. Possible values are markdown, rst, latex, html, markdown+lhs, rst+lhs, latex+lhs. (Capitalization is ignored, so you can also use LaTeX, HTML, etc.) The +lhs variants indicate that the page is to be interpreted as literate Haskell. If this field is missing, the default page type will be used.

categories : A space or comma separated list of categories to which the page belongs.

toc : Overrides default setting for table-of-contents in the configuration file. Values can be yes, no, true, or false (capitalization is ignored).

title : By default the displayed page title is the page name. This metadata element overrides that default.

Highlighted source code

If gitit was compiled against a version of pandoc that has highlighting support (see above), you can get highlighted source code by using delimited code blocks:

~~~ {.haskell .numberLines}
qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++
               qsort (filter (>= x) xs) 

To see what languages your pandoc was compiled to highlight:

pandoc -v

Configuring and customizing gitit

Configuration options

Use the option -f [filename] to specify a configuration file:

gitit -f my.conf

The configuration can be split between several files:

gitit -f my.conf -f additional.conf

One use case is to keep sensible part of the configuration outside of a SCM (oauth client secret for example).

If this option is not used, gitit will use a default configuration. To get a copy of the default configuration file, which you can customize, just type:

gitit --print-default-config > my.conf

The default configuration file is documented with comments throughout.

The static directory

On receiving a request, gitit always looks first in the static directory (or in whatever directory is specified for static-dir in the configuration file). If a file corresponding to the request is found there, it is served immediately. If the file is not found in static, gitit next looks in the static subdirectory of gitit's data file ($CABALDIR/share/gitit-x.y.z/data). This is where default css, images, and javascripts are stored. If the file is not found there either, gitit treats the request as a request for a wiki page or wiki command.

So, you can throw anything you want to be served statically (for example, a robots.txt file or favicon.ico) in the static directory. You can override any of gitit's default css, javascript, or image files by putting a file with the same relative path in static. Note that gitit has a default robots.txt file that excludes all URLs beginning with /_.

Note: if you set static-dir to be a subdirectory of repository-path, and then add the files in the static directory to your repository, you can ensure that others who clone your wiki repository get these files as well. It will not be possible to modify these files using the web interface, but they will be modifiable via git.

Using a VCS other than git

By default, gitit will store wiki pages in a git repository in the wikidata directory. If you'd prefer to use darcs instead of git, you need to add the following field to the configuration file:

repository-type: Darcs

If you'd prefer to use mercurial, add:

repository-type: Mercurial

This program may be called "darcsit" instead of "gitit" when a darcs backend is used.

Note: we recommend that you use gitit/darcsit with darcs version 2.3.0 or greater. If you must use an older version of darcs, then you need to compile the filestore library without the (default) maxcount flag, before (re)installing gitit:

cabal install --reinstall filestore -f-maxcount
cabal install --reinstall gitit

Otherwise you will get an error when you attempt to access your repository.

Changing the theme

To change the look of the wiki, you can modify custom.css in static/css.

To change the look of printed pages, copy gitit's default print.css to static/css and modify it.

The logo picture can be changed by copying a new PNG file to static/img/logo.png. The default logo is 138x155 pixels.

To change the footer, modify templates/

For more radical changes, you can override any of the default templates in $CABALDIR/share/gitit-x.y.z/data/templates by copying the file into templates, modifying it, and restarting gitit. The template is the master template; it includes the others. Interpolated variables are surrounded by $s, so literal $ must be backslash-escaped.

Adding support for math

To write math on a markdown-formatted wiki page, just enclose it in dollar signs, as in LaTeX:

Here is a formula:  $\frac{1}{\sqrt{c^2}}$

You can write display math by enclosing it in double dollar signs:


Gitit can display TeX math in three different ways, depending on the setting of math in the configuration file:

  1. mathml (default): Math will be converted to MathML using texmath. This method works with IE+mathplayer, Firefox, and Opera, but not Safari.

  2. jsMath: Math will be rendered using the jsMath javascript. If you want to use this method, download jsMath and jsMath Image Fonts from the jsMath download page. You'll have two .zip archives. Unzip them both in the static/js directory (a new subdirectory, jsMath, will be created). This works with all browsers, but is slower and not as nice looking as MathML.

  3. raw: Math will be rendered as raw LaTeX codes.

Restricting access

If you want to limit account creation on your wiki, the easiest way to do this is to provide an access-question in your configuration file. (See the commented default configuration file.) Nobody will be able to create an account without knowing the answer to the access question.

Another approach is to use HTTP authentication. (See the config file comments on authentication-method.)

Authentication through github

If you want to authenticate the user from github through oauth2, you need to register your app with github to obtain a OAuth client secret and add the following section to your configuration file:

oauthclientid: 01239456789abcdef012
oauthclientsecret: 01239456789abcdef01239456789abcdef012394
oauthcallback: http://mysite/_githubCallback
## Uncomment if you are checking membership against an organization and change
## gitit-testorg to this organization:
# github-org: gitit-testorg

The github authentication uses the scope user:email. This way, gitit gets the email of the user, and the commit can be assigned to the right author if the wikidata repository is pushed to github. Additionally, it uses read:org if you uses the option github-org to check membership against an organization.

To push your repository to gitub after each commit, you can add the file post-commit with the content below in the .git/hooks directory of your wikidata repository.

git push origin master 2>> logit


Plugins are small Haskell programs that transform a wiki page after it has been converted from Markdown or another source format. See the example plugins in the plugins directory. To enable a plugin, include the path to the plugin (or its module name) in the plugins field of the configuration file. (If the plugin name starts with Network.Gitit.Plugin., gitit will assume that the plugin is an installed module and will not look for a source file.)

Plugin support is enabled by default. However, plugin support makes the gitit executable considerably larger and more memory-hungry. If you don't need plugins, you may want to compile gitit without plugin support. To do this, unset the plugins Cabal flag:

cabal install --reinstall gitit -f-plugins

Note also that if you compile gitit for executable profiling, attempts to load plugins will result in "internal error: PAP object entered!"

Accessing the wiki through git

All the pages and uploaded files are stored in a git repository. By default, this lives in the wikidata directory (though this can be changed through configuration options). So you can interact with the wiki using git command line tools:

git clone ssh://
cd wikidata
vim Front\  # edit the page
git commit -m "Added message about wiki etiquette" Front\
git push

If you now look at the Front Page on the wiki, you should see your changes reflected there. Note that the pages all have the extension .page.

If you are using the darcs or mercurial backend, the commands will be slightly different. See the documentation for your VCS for details.



By default, gitit does not cache content. If your wiki receives a lot of traffic or contains pages that are slow to render, you may want to activate caching. To do this, set the configuration option use-cache to yes. By default, rendered pages, highlighted source files, and exported PDFs will be cached in the cache directory. (Another directory can be specified by setting the cache-dir configuration option.)

Cached pages are updated when pages are modified using the web interface. They are not updated when pages are modified directly through git or darcs. However, the cache can be refreshed manually by pressing Ctrl-R when viewing a page, or by sending an HTTP GET or POST request to /_expire/path/to/page, where path/to/page is the name of the page to be expired.

Users who frequently update pages using git or darcs may wish to add a hook to the repository that makes the appropriate HTTP request to expire pages when they are updated. To facilitate such hooks, the gitit cabal package includes an executable expireGititCache. Assuming you are running gitit at port 5001 on localhost, and the environment variable CHANGED_FILES contains a list of the files that have changed, you can expire their cached versions using

expireGititCache http://localhost:5001 $CHANGED_FILES

Or you can specify the files directly:

expireGititCache http://localhost:5001 "Front" foo/bar/baz.c

This program will return a success status (0) if the page has been successfully expired (or if it was never cached in the first place), and a failure status (> 0) otherwise.

The cache is persistent through restarts of gitit. To expire all cached pages, simply remove the cache directory.


By default, GHC's runtime will repeatedly attempt to collect garbage when an executable like Gitit is idle. This means that gitit will, after the first page request, never use 0% CPU time and sleep, but will use ~1%. This can be bad for battery life, among other things.

To fix this, one can disable the idle-time GC with the runtime flag -I0:

gitit -f my.conf +RTS -I0 -RTS


To enable RTS, cabal needs to pass the compile flag -rtsopts to GHC while installing.

cabal install --reinstall gitit --ghc-options="-rtsopts"

Using gitit with apache

Most users who run a public-facing gitit will want gitit to appear at a nice URL like or rather than This can be achieved using apache's mod_proxy.

Proxying to

Set up your DNS so that maps to your server's IP address. Make sure that the mod_proxy, mod_proxy_http and mod_rewrite modules are loaded, and set up a virtual host with the following configuration:

<VirtualHost *>
    DocumentRoot /var/www/
    RewriteEngine On
    ProxyPreserveHost On
    ProxyRequests Off

    <Proxy *>
       Order deny,allow
       Allow from all

    ProxyPassReverse /
    RewriteRule ^(.*)$1 [P]

    ErrorLog /var/log/apache2/error.log
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
    ServerSignature On


Reload your apache configuration and you should be all set.

Using nginx to achieve the same

Drop a file called into /etc/nginx/conf.d (or where ever your distribution puts it).

server {
    listen 80;
    location / {
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_redirect off;
    access_log /var/log/nginx/ main;

Reload your nginx config and you should be all set.

Proxying to

Make sure the mod_proxy, mod_headers, mod_proxy_http, and mod_proxy_html modules are loaded. mod_proxy_html is an external module, which can be obtained [here] ( It rewrites URLs that occur in web pages. Here we will use it to rewrite gitit's links so that they all begin with /wiki/.

First, tell gitit not to compress pages, since mod_proxy_html needs uncompressed pages to parse. You can do this by setting the gitit configuration option

compress-responses: no

Second, modify the link in the reset-password-message in the configuration file: instead of


set it to


Restart gitit.

Now add the following lines to the apache configuration file for the server:

# These commands will proxy /wiki/ to port 5001

ProxyRequests Off

<Proxy *>
  Order deny,allow
  Allow from all

ProxyPass /wiki/

<Location /wiki/>
  SetOutputFilter  proxy-html
  ProxyPassReverse /
  ProxyHTMLURLMap  /   /wiki/
  ProxyHTMLDocType "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' ''>" XHTML
  RequestHeader unset Accept-Encoding

Reload your apache configuration and you should be set.

For further information on the use of mod_proxy_http to rewrite URLs, see the mod_proxy_html guide.

Using gitit as a library

By importing the module Network.Gitit, you can include a gitit wiki (or several of them) in another happstack application. There are some simple examples in the haddock documentation for Network.Gitit.

Reporting bugs

Bugs may be reported (and feature requests filed) at

There is a mailing list for users and developers at


A number of people have contributed patches:

  • Gwern Branwen helped to optimize gitit and wrote the InterwikiPlugin. He also helped with the Feed module.
  • Simon Michael contributed the patch adding RST support.
  • Henry Laxen added support for password resets and helped with the apache proxy instructions.
  • Anton van Straaten made the process of page generation more modular by adding Gitit.ContentTransformer.
  • Robin Green helped improve the plugin API and interface, and fixed a security problem with the reset password code.
  • Thomas Hartman helped improve the index page, making directory browsing persistent, and fixed a bug in template recompilation.
  • Justin Bogner improved the appearance of the preview button.
  • Kohei Ozaki contributed the ImgTexPlugin.
  • Michael Terepeta improved validation of change descriptions.
  • mightybyte suggested making gitit available as a library, and contributed a patch to ifLoggedIn that was needed to make gitit usable with a custom authentication scheme.

I am especially grateful to the darcs team for using darcsit for their public-facing wiki. This has helped immensely in identifying issues and improving performance.

Gitit's default visual layout is shamelessly borrowed from Wikipedia. The stylesheets are influenced by Wikipedia's stylesheets and by the bluetrip CSS framework (see BLUETRIP-LICENSE). Some of the icons in img/icons come from bluetrip as well.


Version released 14 Feb 2017

* Bump version bounds for time, pandoc, blaze-html, aeson.
* Added MTable plugin (Simon Heath).
Adds simple but easy-to-use variable-width table syntax.
* Fixed Subst plugin (Simon Heath, #548).
* Fixed Dot plugin (Simon Heath, #568).

Version 0.12.2 released 09 Nov 2016

* Allow pandoc 1.18, tagsoup 0.14, aeson, 1.x.

Version released 22 Mar 2016

* Allow pandoc 1.17 (Phil Ruffwind).
* Allow aeson 0.11.

Version 0.12.1 released 17 Feb 2016

* Use fmap instead of <$> so ghc 7.8 won't fail.
* Allow latest hoauth2
* Fix typo (Chas Leichner).
* Allow compiling with pandoc 1.16.x.
* Add page for login failure when authorization is required for reading
(Phil Ruffwind). When authorization is required to read the wiki, the
error message from a failed GitHub login cannot be displayed. Instead it
will redirect to GitHub for another OAuth authentication, which can lead to
a redirect loop. To avoid this, the user is now redirected to a special
landing page to display the login failure. Note: no changes are made for
the case where authorization is not required to read the wiki.
* Improve error message of GitHub membership check (Phil Ruffwind).
* Add delete-summary config variable (Phil Ruffwind).
Used to change the commit message when a page is deleted.
* Use primary GitHub email rather than just the first (Phil Ruffwind).
The order in which user emails are returned via the GitHub API is not
specified, so the first may not be the one that the user prefers,
i.e. the so-called "primary" email. To fix this problem, we eliminate
all emails except for the one marked as "primary".
* Make default theme responsive (Lincoln Mullen, #450).
This commit makes the default theme responsive. For smaller browsers, it
will move the sidebar below the main content div and make the sidebar
three columns. On phones, it will also collapse the sidebar into a
single column.
* README: Tell how to enable rtsopts for disabling GC (norpol).

Version released 24 Aug 2015

* Revert change of curly to straight quote for starting
User's Guide page (Wouter Oosterveld).
* stack.yaml: removed pandoc flag setting.

Version 0.12 released 19 Aug 2015

* Export all modules.
* Make executable builds depend on the library in cabal file.
* Moved library files to src directory.
* Added stack.yaml.
* Updated README with stack install instructions.

Version released 14 Aug 2015

* Fixed Network.Gitit.Initialize so it compiles with older pandoc (#506).
* Removed extra import of liftIO in Dot.hs plugin.

Version 0.11.1 released 23 Jul 2015

* Allow `commonmark` as a page type.
* Handle CommonMark page type on initialization.

Version 0.11 released 02 Jun 2015

* Allow page extensions to be configurable (not just `.page`)
(Caleb McDaniel).
- Added `page-extension` option in config file (Caleb McDaniel).
- Added new type for `defaultExtension`
- Changed `isPageFile` to get extension from config
- New function `isNotDiscussPageFile`
- `pathForPage` must be passed extension as String
- `isPageFile` now returns GititServerPart Bool instead of just Bool.
* Reverted some changes to Plugins that caused excessive memory use.
* Allow pandoc 1.15.
* Added missing `<br>` tag in form on registration page (Vaughn Iverson).
* Show page diffs in feed (Imuli).
* Display commit messages in feed entry titles (Imuli).
* Fix preview button for modern jQuery (Imuli).
* Feed titles reflect site and page names (Imuli).
* Present feed in canonical order (recent first, Imuli).
* https support for base-url config option (Imuli).

Version 0.10.7 released 02 Jun 2015

* Fixes to allow building with pandoc 1.14. `CommonMark` added
as a constructor of `PageType`. CommonMark can now be used as
a page format and is also available for page export.
* Plugins: added some recommended option flags.
* Allow `---` as well as `...` to end metadata (#493).
* README: changed dead links (Rick Hanson).

Version released 08 May 2015

* README: use shortcut style markdown links.
* Fixed profiling options.
* Added .travis.yml.
* Allow both time >= and time < with old-locale
(Michal Antkiewicz)

Version released 02 April 2015

* Bumped upper version bounds.
* Fix typos in README.markdown (Igor Vuk).
* Update bug tracker link (Waldir Pimenta).

Version released 28 October 2014

* Added Network.Gitit.Compat.Except to cabal module list.

Version 0.10.6 released 28 October 2014

* Escape HTML characters in user name when showing it on a web page.
This addresses a security flaw in previous versions, pointed out
by Davy Stoffel. A fake password reset email could be provided
to users, with the link:

If the person clicked the link, the unknown username would be
displayed (unescaped), and the javascript would run.
This fix addresses the flaw, not by preventing the funny user name,
but by ensuring that the HTML tags are escaped when the user name
is shown on the page.

* Network.Gitit.Initialize: Allow mediawiki for default pages.

* Enable readerParseRaw for all formats.
This will enable things like script and iframe tags to get
parsed from HTML sources, and unrecognized latex tags from LaTeX.

* Refined github login (Freiric Barral).

* Include jquery sources in sdist tarballs (Anthony Towns).

* Add support for `mediawiki` as a page format (Raymond Gauthier).

Version released 21 September 2014

* Added markup help for org mode. Closes #449.

* Utils.parsePageType: Added case for "org".

* Allow newer versions of dependencies.

Version 0.10.5 released 23 August 2014

* Added github login option (Freiric Barral).

* Change default math display to mathjax.

* Relaxed package bounds, fixed compiler warnings.
Added Network.Gitit.Compat.Except module for compatibility
with earlier and later mtl versions.

* Added network-uri flag to accommodate network-uri/network split.

* Fixed failure when loading the Subst plugin (Glenn Searby).

* Added Makefile, for use in installing on server.

* Include takeBaseName in System.FilePath import (Caleb McDaniel).

* Update README.markdown on Apache installation (Peter Gallagher).

* Add full versions of minified JavaScript (#400) (Peter Gallagher).

* Enable highlighting of patterns that start or end with punctuation
(Caleb McDaniel).

* Moved oauth secret to separate config file (Freiric Barral).

* Corrected MathJax CDN URL (Maciek Makowski).

Version 0.10.4 released 30 Jun 2014

* Updated package bounds for happstack (#382), pandoc, blaze-html,

* Display EPS as image, not code.

* Fixed recent activity page for binary files (Sergey Koposov).

* Use normal spaces instead of nbsp in activity page (Sergey Koposov).

* Display a delete link next to uploads in file list (rekado).

* Change _search to use HTTP GET, so searches can be linked
and refreshed (Joe Hillenbrand).

* Document mod_proxy_html setting in README. Added a mod_proxy_html
configuration directive to insert a DOCTYPE string (Johann Visagie).

* Added new template variables `isdiscusspage`, `isarticleUrl`,
`discussionUrl`. This makes it possible to treat discussion pages
specially in templates, and insert appropriate links (Shane O'Brien).

* Added template variables `articlename`, `discussionname`,
`isarticlepage` (Shane O'Brien).

* Added redirects (#233). You can now create a redirect page by adding
a `redirect` field to the metadata of a page (Shane O'Brien).

- When a user visits a redirect page, they are redirected to the
destination page.
- At the destination page, a message is displayed telling the user
that they have been redirected from the source page. A link is
provided back to the source page, with a parameter to disable the
redirect (so that it can be edited).
- Gitit will detects circular redirects and explain to the user
what is going on in such cases.

* Added "search for pages containing..." option to `createPage`.
Changed "page not found" page to give the option of searching for
the page name or creating a page with that name (Shane O'Brien).

* Set `pgTitle` in `showDiff` (Shane O'Brien).

* Made the default "since" for the activity page configurable
(Shane O'Brien).

* Only set the `tabs` template variable if there are tabs (Shane O'Brien).

* Removed access question from password reset form. It's only
needed for the register form (Shane O'Brien).

* Added `for` attribute to all labels on forms (Shane O'Brien).

* Updated `pageToString` to use new metadata format (Shane O'Brien).

* Handlers: Fixed duplicate function defn for `fileAnchor`.

* Added `Org` and `BocBook` to `PageType` (API change). Pages
may now be written in Ord mode or DocBook syntax.

* Allow multiple categories, separated by commas,
in a `_category` URL (Caleb McDaniel). The pages in all listed
categories will be returned.

* Added filter links for `_category` pages (Cabel McDaniel).

* Fixed image exports in Docx, RTF, slides, PDF (#399, #353).

* Restored inline syntax highlighting.

* Fixed highlighting in exports (#356).

* Added `ICML` and `beamer` as export formats (#391).

* Added github-style backgrounds to code blocks (Joe Hillenbrand).

* Lighter heading border (like wikimedia) (Joe Hillenbrand).

* Fixed links on activity page (Shane O'Brien).

* Added markup help for Textile, Org, DocBook (#434).

* Modified plugins/Subst.hs to work with latest pandoc (Tianyi Cui).

* Fixed wiki links when `base-url` is empty and `absolute-urls` yes
(Tianyi Cui).

* README: document that changes to templates require a restart (Raphael).

Version released 19 Mar 2013

* Fixed filename encoding problem affecting caching,
for gitit compiled with GHC 7.4 or later.

* Fixed padding on some buttons (akerbos).

* Specify correct format in header for initial pages (benmachine).

Version 0.10.3 released 09 Mar 2013

* Allow latest versions of pandoc, blaze-html, HStringTemplate.

* Fixed duplicate ids in user box.

* Added `mathjax-script` option, specifies the mathjax script to
use. (Dmitry Gerasimov.)

* Set focus on editedText on page load. (Mathieu Larose.)

* Added `address` config option. (Matieu Larose.)

Version 0.10.2 released 09 Feb 2013

* Updated to work with pandoc 1.10.

* Fixed path for MathMLInHTML.js script. Closes #345.
Thanks to tstgruby.

* Updated interwiki plugin (gwern).

* Made it possible to export pages with images stored in the
repository itself (as opposed to the static directory). Thanks
to Claudio Bley for the patch.

Version released 11 Jan 2013

* Fixed regression in option parsing. An earlier patch
caused the '-f' option not to work. Closes #336.

Version released 01 Jan 2013

* Allow compilation with directory < 1.2.

Version 0.10.1 released 31 Dec 2012

* Fixed duplicate dropExtension on categoryPage. (atsuo yamada)
This created problems with categories containing periods.

* Fixed duplicate unescaping of HTML entities. (atsuo yamada)

* Supply $revision$ at _diff if "Changes from beginning to..."
(atsuo yamada)

* MathJax rendering is now working in edit preview mode
(Dmitry Gerasimov).

* Upgrade directory package dependency to 1.2, and
fix compilation issue with GHC 7.6.1 (Bin Jin).

* Allow metadata keys to include digits, _, -. Closes #328.

* Don't read config for --help or --version (Ben Millwood).
Also involves a refactor of options into those that make the program
quit immediately, and those that just alter the configuration.

* Updated to use filestore 0.6 (new diff API).
Thanks to markwright for partial patch.

* Include format metadata in default installed pages.
This allows them to continue working when the user changes the
default page format. Closes #329.

* Added explicit path to Gitit User's Guide in default front page.

* Fix Gitit User's Guide link on front page.
Previously it was broken due to "smart punctuation."

* Fixed validation messages. Switched from using lookRead "messages"
to using looks "message" for messages. Closes #294.

Version released 02 Nov 2012

* Raised version bounds for dependencies.

* Updated post-update script to use new forms of git commands.
Closes #317.

* Fixed withTempDir so it returns to old directory.
Closes #303. This is a slightly different solution than the one
proposed by tstgruby, but it has the advantage that only withTempDir
itself needs to be changed.

* Added nginx example for proxy setup (README) (Andre Kelpe).

Version released 07 Jun 2012

* Fixed double-encoding bug for unicode page names
(Alexander Vershilov).

* Require happstack-server >= 7.

Version 0.10 released 30 May 2012

* Changed 'readFileUTF8' so it doesn't encode filename on ghc 7.4.

* Upgraded for compatibility with blaze-html 0.5. Closes #299.

* Improved categories. Files are now read strictly to avoid a 'too
many open files' error. 'Page' now exports 'readCategories' instead of

* Require filestore 0.5. This brings in (a) correct handling
of unicode paths when compiled under GHC 7.4, and (b) a 'limit'
parameter for 'history'. The limit parameter is essential when
gitit is used with very large repositories; otherwise history
commands would have to parse the entire log. Handler functions
that use 'history' have been updated to use the optional
'limit' parameter.

* Atom feeds are now limited to 200 entries, to prevent server

* Indicate size of default logo picture in README. Closes #291.

* Added a README section on restricting access. Closes #292.

Version released 15 Feb 2012

* Fixed bug in fromEntities that caused text to be lost in the page
source after semicolons. Thanks to Perry Wagle for reporting the bug.

* Updated code to run on happstack 7.

* Removed dependency on happstack-util; depend on base64-bytestring

* Updated gitit.cabal to include footnotes.js (Ben Sinclair).

Version 0.9 released 29 Feb 2012

* Gitit now uses the latest pandoc (1.9.x) and happstack-server (6.6.x),
and compiles on ghc 7.4.1.

* Added Docx, AsciiDoc, and DZSlides as export formats.

* HTML slide show exports are now "self-contained": they embed all
required js, css, and images, so they can be used offline.

* Allow spaces in usernames (Juraj Hercek).

* Improve PDF/RTF exports containing images in the wiki.
Wikidata paths are translated to absolute ones, so pandoc/pdflatex
can find them (Juraj Hercek).

* Protect against XSS in slide show exports. Previous versions
of gitit sanitized wikipages, but not HTML slide shows.

* Table of contents is now in a div with ID `TOC`, so it can
be styled.

* Removed letter and word spacing from print.css.

* Added s5 directory to static. This is needed by pandoc 1.9.

* Updated Interwiki plugin (gwern).

* Added `fromEntities` to `Types`, since `decodeCharacterReferences`
is no longer exported from Pandoc. Added dependency on tagsoup.

* Provided `FromReqURI` instance for `[String]`, since
this is not automatic with recent happstack.

Version 0.8.1 released 02 Sep 2011

* Support mathjax as a math option.
Added MathJax as MathMethod, and mathjax as an option in
the 'math' config field. Resolves GoogleCode 122.

* Added xss-sanitize configuaration option.
Setting it to 'no' turns off sanitization, enabling
file:// URLs and other things that get filtered out
by xss-sanitize.

* Listen interface explanation on help file could be more clear (#266)

* Add the new configuration option 'absolute-urls'.
When turned on, this makes wikilinks absolute w.r.t. the base-url.
By default, they are relative. So, for example, in a wiki served
at the path 'wiki', on a page Sub/Page, the wikilink '[Cactus]()'
will produce a link to '/wiki/Cactus' if absolute-urls is on,
and otherwise the relative link 'Cactus'. Patch due to lemmih.

* Change default listen address to

* Serve svg file as image, not source code!

* Page history: use 'limit' instead of restricting to past year.
limit defaults to 100. If 100 are displayed, you'll get a
"Show more..." link that will increase the limit.
Also fixed bug that caused a 404 when no history was returned.

* Require pandoc >= 1.8.2.

* Allow build with happstack-server 6.2.

* Updated for use with xss-sanitize 0.3, which uses Text.
New dependency on text.

Version released 07 Jun 2011

* Fixed file upload problem with recent versions of directory
package. (Thanks to Oliver Braun.)

* Relaxed some version upper bounds.

Version 0.8 released 13 May 2011

* Uses happstack 6.

* Added textile and org export formats, textile page format.

* Added support for RPXNow authentication, based on a patch from
Pasqualino Titto Assini.

* Added `authentication-required` field in config.

* If set to 'modify', authentication is required to modify the wiki.
* If set to 'read', atuhentication is required to view the wiki.
* If set to 'none', authentication is never required, and pages can
be edited anonymously.

API changes:

* currentUser moved to Authentication module
* requireAuthentication added to Config
* Added AuthenticationLevel type
* requireUser renamed authenticate, parameter for AuthenticationLevel
added; requireUserThat renamed authenticateUserThat

* MathML and jsMath now work in the preview pane (Sean Seefried).

* Use footnotes.js for fancy footnote styling (gwern).

* Added a `--listen` parameter to specify the listen device
(Timo B. Hübel).

* Removed withInput.

* Replaced fileContents with filePath in Params.

* Fixed bug in uploadForm.js which caused a prefix to be added in the
default wikiname.

Version released 01 Feb 2011

* Use pandoc 1.8.

* New export formats: textile, org.

* New page form: textile.

Version released 28 Jan 2011

* Allow time 1.2.

Version released 26 Jan 2011

* Updated for filestore- Gitit should now compile with ghc 7.
Note: It may be necessary to supply the --disable-library-for-ghci
flag to 'cabal install highlighting-kate'.

Version released 25 Jan 2011

* Removed dependency on cautious-file.
It no longer seems to be actively maintained, and the current
configuration does not compile on windows.

* Removed dependency on datetime package.
It is no longer maintained.
Everything can be done just as well with the time package.

* Depend on filestore >= 0.4 (without datetime dependency).

* Bump version bounds on hslogger, network and HTTP.

* Support for GHC 7.0 in Plugins (thanks to Max Bollingbroke).

* Use xss-sanitize for sanitizing HTML.
Previously pandoc's sanitization was used, but this will be
removed in the next pandoc release. xss-sanitize is a more complete
solution, and also prevents people from messing up layout by inserting
unbalanced </div>.

* Updated Feed module to make it decouplable from gitit.

* jQuery.load wasn't working on Safari. Use instead.
Also, the convert function was not always in scope. (It is only in
scope when MathML is enabled?) We check if it is defined before
calling it. (Thanks to Sean Seefried.)

* Export Page module.

* Templates are in data directory

* Fixed bug in Subst plugin (Lars Petersen).
Subst plugin could not deal with non-existing pages, resulting
in an server error when trying to substitute with an absent file.
This patch now creates a link to the page in order to create it.

* Added alt attribute to logo.

Version released 24 July 2010

* Fixed MathML in Slidy and S5 exports.

* Use languagesByFilename instead of languagesByExtension in isSource.

Version released 24 July 2010

* Depend on pandoc >= 1.6, highlighting-kate >=

* Added epub and slidy export formats.

* Require happstack >= 0.5.

* Added google math option (uses google charts api).
Slightly modified from a patch by lpeterse.

* Made WebArchiver plugin more parallel (gwern).

* Fixed Dot plugin to work with GHC 6.12.
We were having string encoding issues reading the output
of dot with readProcess. Solution is to pass dot an output
filename so we don't have to read its output.

Version released 05 May 2010

* Fixed ODT/PDF export for files in subdirectories. Resolves Issue #81.

* Fix image URLs before calling the ODT or PDF processors

* Added plain text export format.

* Raised upper bound for datetime, parsec, and happstack dependencies.

* Fix wikilinks to they don't get a leading slash.
This reverts a bug introduced by 2128afb070b7, which added leading
slashes to wikilinks, breaking them for people using gitit as a
library on a path other than /.

Version released 21 Mar 2010

* Returned to using pandoc's MathML writer option.
This is fixed in pandoc Depend on pandoc >=

Version released 21 Mar 2010

* Use custom readFileUTF8 (exported in Network.Gitit.Util) instead of
broken System.IO.UTF8. This way we have a uniform solution for GHC
6.10 and 6.12, and don't have to use CPP tricks. This change fixes
categories on GHC 6.12. Resolves Issue #98.

Version released 21 Mar 2010

* Reverted to handling math in MathML mode in the old way, using
a transform, rather than relying on pandoc's MathML writer option.
The latter was causing amazing CPU and memory usage, for reasons
I don't yet understand. This should fix the problem for now.

* Fixed caching for unicode page names.

* Added max-page-size config option. Thanks to Jinjing Wang for the patch.

* Prevented _expire/ from failing if the page is not cached.

* Fixed URL encoding for pages. (Note: Don't use + for spaces;
that breaks the Ctrl-R cache expiration.)

Version released 20 Mar 2010

* Fixed editing of pages when max-upload-size=0.
max-upload-size should not double as max-page-size.
Resolves Issue #96.

Version released 20 Mar 2010

* Changed "In" to "in" in MathMLinJS.js link.

Version 0.7.3 released 20 Mar 2010

* Added PDF export option and pdf-export config field.
(Based on a patch by gwern.)

* Added markdown export.

* Use pandoc's new MathML math mode for more efficient

* Improved multi-wiki example code in haddocks.

* Added session-timeout config setting.

* Config module: Added readSize (recognizing K,M,G suffix).
Previously readNumber always recognized K,M,G suffixes,
but these only make sense in some contexts (not e.g. for

* Added Subst plugin (thanks to gwern).

* Added notes on PDF caching and idle.

* Fixed table of contents in wiki pages (resolving Issue #91).

* Added pandoc-user-data config option, allowing the user
to specify a directory with e.g. templates that override
the defaults used for exported pages.

* Fix filesToClean GHC panic when loading plugins on GHC HEAD

* Fixed problem with doubled // in updir links.
Resolves Issue #88.

* Updated interwiki plugin.

* Fixed caching for feeds. Thanks to brian.sniffen for pointing
out the need to normalize the time diff. Resolves Issue #87.

* Improved Feed module (gwern).

* Use line anchors from highlighting-source, so that you can link
directly to a particular line in a source file.

* Disable upload functionality if maxUploadSize is 0.

* Exported queryGititState, updateGititState, Network.Gitit.Layout.
Exported filledPageTemplate. (Thanks to tphyahoo.)
Split off and expose createDefaultPages.
Exposed compilePageTemplate.

* Use charset=utf-8 on output from Layout.

* Use isUnescapedInURI with escapeURIString rather than isAllowedInURI.
The latter does not escape % signs.

Version 0.7.2 released 02 Jan 2010

* Now compiles with GHC 6.12.

Version 0.7.1 released 02 Jan 2010

* Updated exports to work with pandoc 1.4.

* Began updating to work with GHC 6.12. (Still untested; there may
be further issues involving filestore.)

Version 0.7 released 20 Dec 2009

* Updated cabal file to allow happstack 0.4.

* Added support for the new mercurial filestore backend.
(Depending on filestore >= 0.3.4.)

* Depend on xml >= 1.3.5. This fixes a bug in the display of
mathml. Previously the self-closed tags in matrices with empty
cells confused browsers and caused them to construct the
DOM incorrectly. The problem is fixed by using xml's new
ppcElement function to render the MathML without self-closed tags.

* Depend on pandoc >= 1.3.

* Properly handle UTF-8 in config files.

* Moved option parsing code from Config module to main program.
The Config module now exports getConfigFromFile instead of
getConfigFromOpts. This should be more useful for those using gitit as
a library.

* Use wikiTitle config field in default HTML title.

* Improved search results:
+ Highlight search terms in search results.
Partially resolves Issue #76.
+ Made search results message uniform when no results.
+ Search: don't match page name against empty patterns.
+ Allow search matches on subdirectory part of page name.
+ Search: catch error status from filestore search.
Filestore <= 0.3.3 does not properly handle the error status
returned by later versions of 'git grep' when no match is found.
The problem has been fixed in darcs filestore.

* CSS tweaks:
+ Removed base-min.css, folded necessary styles into screen.css.
+ Removed 'text-align: left' for th from CSS reset.

* Feed improvements:
+ Modified feed handling so that feeds validate.
+ Perform proper escaping in Feed.hs (thanks to gwern).
+ Don't reveal author email in feeds.
+ Sitewide feed is /_feed/ (with trailing slash).
+ Add "http://" to base-url config option if needed.

* Use + for spaces in URLs linking to wiki pages and folders.

* Updated plugins:
+ Updated Interwiki plugin (gwern).
+ Modified WebArchiver plugin to make Alexa requests (gwern).

Version 0.6.6 released 06 Nov 2009

* Require filestore >= 0.3.3, which closes a security

* Don't allow web file uploads to the static or templates directory,
even if these are subdirectories of the repository directory.
We don't want users uploading new CSS, javascript, or templates
that might break the site.

* Renamed gitit-dog.png -> logo.png in data/static/img.
This way the logo will show up even without a local img directory.
Thanks to Thomas Hartmann for the patch.

* Return 404 when page not found. Thanks to Richard Fergie.

* Improved layout of Export button.

* Added links for atom feeds to and, to
make the feeds more discoverable.

* Minor code safety improvements.

* Check for commit messages consisting of whitespace.
Commit messages consisting only of whitespace characters are
rejected by Git as empty. Gitit should behave similarly.

* Allow gitit to start up if custom template directory not found.
Thanks to Thomas Hartmann.

* Fixed incorrect usage of nullGroup (a debugging function). Thanks
to Thomas Hartmann.

Version 0.6.5 released 06 Oct 2009

* Added metadata to Page and Context, provided askMeta for plugins.
This patch gives plugins access to all of the key/value pairs
in the page metadata block. Thanks to Dan Cook.

* Added PigLatin plugin to demonstrate use of askMeta.

* Display informative message on authentication failure.

* Fixed library stanza in cabal file so plugins are properly enabled.

Version 0.6.4 released 28 Sep 2009

* Fixed preview javascript so that tex math works properly in

Version 0.6.3 released 27 Sep 2009

* Fixed MathML conversion so it doesn't happen when exporting to
non-HTML output formats.

* Fixed shadowing on page templates: previously was always
taken from the defaults, even if a modified version existed
in templates/.

* Modified YUI CSS reset so that ordered list enumerators can be
styled properly.

* Modified showPage to work with both POST and GET requests.

Version 0.6.2 released 25 Aug 2009

* Use "reference obfuscation" for emails, rather than javascript
obfuscation, which seems to interfere with preview. Resolves
Issue #59.

Version 0.6.1 released 25 Aug 2009

Instructions for upgrading from 0.5.3:

- If you were using a Haskell configuration file, you will
need to create a new configuration file. 'gitit --print-default-config'
will print a self-documenting default configuration file in the new
format, which you can modify.

- If your wiki contains discuss pages of the form '',
rename them to ''.

- Delete template.html and the static directory so that these will
be replaced by the newest versions when you run gitit. If you have
customized these, you should back them up first, then merge your
changes into the new versions after they are created. (Note that
template.html will be replaced by a templates/ directory.)

Summary of main changes:

* Added support for plugins -- dynamically loaded Haskell programs that
transform pages. See the haddock documentation for Gitit.Interface for
plugin documentation. The plugins directory contains several sample

* Gitit's configuration file is now a text file with key-value pairs,
rather than a Haskell file. The default configuration file
(which can be printed using `gitit --print-default-config`
contains comments that document all of the options.

* Pages may now be written in (limited dialects of) LaTeX or HTML,
as well as markdown and reStructuredText. The default format
is determined by a configuration option, but can be overridden
on a per-page basis using metadata (see below). The default
Front Page and Help page are created in the default format specified
by the configuration file. In addition, syntax help is now displayed
to the left of the editing box when a page is being edited.

* Pages may be written in literate Haskell, using either bird
style with markdown or reStructuredText, or LaTeX style with
LaTeX. Literate Haskell can be made the default or specified on
a per-page basis.

* Gitit now exports a library, Network.Gitit, that makes it easy for
any happstack application to embed a gitit wiki.

* Added optional atom feeds, for whole site (at /_feed)
and for individual pages (at /_feed/path/to/page).
Feeds are cached with a configurable expiration time.

* Completely new caching system. Caching is turned off by default and
can be enabled by a configuration option. Complete pages are cached
on disk and expired when pages are revised through the web interface.
When pages are modified directly through a VCS, the cache must be
refreshed manually, either by pressing Ctrl-R while viewing a page,
or by sending an HTTP request to /_expire/path/to/page, or by using
the included program expireGititPath. The new system is much faster
than the old in-memory cache, because it avoids the considerable
overhead of filestore calls to get the current revision id.

* To make whole-page caching possible, the user login/out box has been
made into an ajax request to /_user. jQuery is now loaded on every

* Math is converted to MathML by default (using the texmath library),
and a javascript is linked in that renders it correctly in IE+mathplayer,
Firefox, and Opera. The 'math' configuration setting can alternatively
be set to 'jsMath' (to use jsMath javascript, which is more portable
but ugly and slower) or 'raw' (plain LaTeX code).

* Routing changes for better handling of web spiders. Instead of
"/foo?history" we now have "/_history/foo"; instead of "/foo?edit"
we haev "/_edit/foo"; etc. This makes it possible to exclude web
spiders from non-cached pages by excluding URLs that start with
'/_'. A default robots.txt file is now provided. Users need not
do anything special for this to be enabled.

* The authentication system has been revised and made much more
flexible. In the configuration file, you can specify either
'form', 'http', or 'generic' as authentication-method. Form
authentication is the old form-based gitit authentication system. HTTP
authentication presupposes that the wiki pages are locked down under
HTTP authentication; the gitit user will be set to the username used
for HTTP authentication. Generic authentication takes the username
from the REMOTE_USER request header. When gitit is being used as a
library, one can specify a custom withUser filter (which determines
the logged in user and sets REMOTE_USER accordingly) and a custom
authHandler (including handlers for /_login, /_logout, and whatever
else is needed).

* Security fix: Gitit did not verify that a change password request
is genuine when it receives the final POST. It has been changed to
re-verify the reset code, otherwise an attacker could simply steal
anyone's account by spoofing a POST request. (Thanks to Robin Green.)

* template.html has now been replaced by a directory, templates/, with
separate templates for each component of a page.

* Added /_reloadTemplates action that recompiles the templates. (By
default the templates are compiled only on startup.)

* Gitit's form-based authentication now includes a "password reset"
email. Slightly modified from a patch from Henry Laxen.

* The naming scheme for discussion pages has changed: the discussion
page for foo is now @foo, not foo:discuss. Reason: Windows, and
thus darcs, does not like colons in filenames.

* Improved logging, with configurable verbosity.

* Major code reorganization and cleanup. Gitit has been moved under
the Network namespace. The old WebT handlers are replaced by new ones
in ServerPartT. 'handle' has been removed; instead, we use happstack's
routing combinators. Configuration and filestores are now passed
around in a reader monad, in WikiState. (This also allows different
wikis to have different configurations.) Most handlers have been
simplified so that they no longer require Page and Params arguments.
A new function, 'withInput', is used to avoid the need to pass Params
between handlers.

* The static handler now "falls back" to the cabal data directory if the
requested file is not in "static" (or staticDir). So the user need
no longer have a copy of the standard gitit CSS, javascript, and
image files in "static" (unless these are to be overridden). This
should make updates easier. By default only 'custom.css' and
'logo.png' are put in the user's static directory.

* Similarly, the templates in "templates" "fall back" to defaults in
the cabal data directory. By default only '' is put in
the user's static directory.

* Gitit State now includes a renderPage function. This is more flexible
than storing a page template, since the user may want to use a custom
page rendering function, even one not based on string templates.

* Added Network.Gitit.ContentTransformer module (thanks to Anton van
Straaten). The ContentTransformer module replaces Gitit.Convert. It
defines a number of single-purpose combinators that can be combined to
yield various kinds of content conversions. These are used to define
showPage, preview, showHighlightedSource, and other handlers that used
to be defined in Gitit.hs.

* Verify in delete POST requests that filetodelete parameter matches

* Fixed revert when called from diff pages. Revert now reverts to the
older of the two revisions being compared.

* Revamped auto-merging: user must now verify an edited page after
a merge, even if there were no conflicts.

* Fixed Content-Disposition header on export so that filenames have
proper extensions.

* Updated for happstack-server-0.3.3. Since this version of happstack
supports UTF-8, gitit's old manual decoding and encoding were removed.

* Use fileServeStrict instead of fileServe. Resolves Issue #57.

* 'limit' is no longer used in search. The way it worked before was
confusing, since it limited total matches (usually to just a few files)
rather than limiting the number of matches in each file.

* rdgreen's cautious-file library is now used to write the gitit-users
file. This makes it less likely that the file will be corrupted on
a power outage or hardware failure.

* Redirects set properly after account creation. If users go from
the Login form to the Register form, they are no longer redirected
back to the Login form after creating an account.

* indexPage now uses filestore's new 'directory' function. It shows one
directory at a time. Subdirectories link to further index pages. This
improves on the old javascript folding interface, which did not preserve
state. (Thanks to Thomas Hartman for suggestions.)

* URLs of the form /a/b/ are now equivalent to /_index/a/b.

* Improvements and bug fixes to deleting. Deleting a non-page now works.
You get a nice informative message if you try to delete a nonexistent
page or file.

* Page names containing "..", "?", or "*", and '_' at beginning are
disallowed. Page names may now contain periods.

* The "Permanent link" link has been removed. It relied on the sha1
parameter always being set, but we've changed that for performance

* Gitit can now be proxied to a subdirectory path. Thanks to Henry Laxen
for the idea and patches. See README for instructions.

* Performance improvements (mostly due to Gwern Branwen): Pages can be
compressed (configurable); unneeded filestore calls removed; cache-control:
max-age used.

* Moved sidebar to end of HTML to make things easier for screen readers.

* Moved search box and go box to templates.

* Yahoo YUI CSS framework is now used for better consistency across browsers.
CSS cleaned up. Icons for page types removed.

* Fixed handling of 'forUser' parameter in 'recent activity'.

* Made default maxUploadSize 10 Mb.

* Renamed AppState -> GititState.

Version 0.5.3 released 1 Feb 2009

* Fixed bug which caused jsMath not to load.

Version 0.5.2 released 1 Feb 2009

* Fixed cookie problem caused by empty value fields.

Version 0.5.1 released 1 Feb 2009

* Major code reorganization, making gitit more modular.

* Gitit can now optionally be built using Happstack instead of HAppS
(just use -fhappstack when cabal installing).

* Fixed bug with directories that had the same names as pages.

* Added code from HAppS-Extra to fix cookie parsing problems.

* New command-line options for --port, --debug.

* New debug feature prints the date, the raw request, and
the processed request data to standard output on each request.

* Files with ".page" extension can no longer be uploaded.

* Apostrophes and quotation marks now allowed in page names.

comments powered byDisqus