schwabrak -- simple flat file based issue tracker I want a relatively simple issue/ticket tracker. Something like Trac, Redmine or Fossil. But they require heavy dependencies (Python, Ruby), database and they are centralised. You can not work with them offline and it is relatively complicated to replicate data to a locally running copy of any of those trackers (well, except for Fossil I believe). And is a web-interface necessary at all? What is a ticket/issue? Just some plain text descriptions, with attached enumerations (statuses, assignments, priorities, projects, subsystems, severities, resolutions, etc) and a pile of append-only comments, possibly with another file attachments. Can all of that live in a directory with several plain text files? Can it be linked with other issues just by making a symbolic links in deps/ subdirectory? Do Git commits provide supplementary metainformation about when and by whom any of the change is made in that directory? Definitely yes! And because of DVCS you get ability to keep the whole distributed copy of the tracker on each developer's machine. You can send changes to it asynchronously as a patch or bundle. Basically schwabrak is mainly about a convention how to keep issues in files, loosely similar to https://github.com/driusan/PoormanIssueTracker, from which I borrowed idea of replacing spaces with dashes in issue names. Issues are kept in the issues/ directory. Directory's name is the issue's brief name, prepended with datetime for sorting purposes. Dashes should be interpreted as spaces and n > 1 dashes should be interpreted as n-1 dashes when converting the directory name to a human readable issue title, as PoormanIssueTracker suggests. The "about" file contains the description of the issue. The "result" (initially empty) contains the closed issue resolution information. Each issue can have attached tags. For keeping their set in consistent well-defined state, the tags/ directory above the issues/ contains available tags for your projects. $ for tag in status:open status:done assignee:alice assignee:bob doc db test:integration severity:high severity:low ... ; do touch tags/$tag done It is your choice how to name and deal with them. Want to find all issues in done state? for i (issues/**/tags/status:done) print $i:h:h. This kind of information are all just enumerations. Project's name is expected to be "proj:NAME" tag for example. The deps/ subdirectory in each issue can contain symbolic links to another issues, referencing it. Create another kind of links between them as you wish. Want to search among the issues? Just use git grep, or ordinary grep! Want to search through attached PDFs or other kind of documents? You are free to index issues/ directory with something like recoll. Want to see the whole history of changes related to specific issues? Just run git log issues/issue-name! You can add a tag by simply touching issues/issues-name/tags/tag, but "tag-add" included in schwabrak creates symbolic links to tags/tag and checks if the tag is known beforehand, to keep the tags set consistent. Want to remove a tag? (git) rm issues/issues-name/tags/tag! The "comment" issue's file is intended to keep the last comment related to the issue. By committing it you automatically accompany it with your (commit's author) name and the time it was added. $ cat >issues/issues-name/comment <