Software Release Practice HOWTO

Eric Steven Raymond

  [1]Thyrsus Enterprises

      [email protected]

  This is version 3.0

  Copyright � 2000 by Eric S. Raymond

  $Date: 2000/08/21 18:29:23 $
  Revision History
  Revision 3.0 12 August 2000 Revised by: esr
  First DocBook version. Advice on SourceForge and a major section on
  documentation practice added.

  This HOWTO describes good release practices for Linux open-source
  projects. By following these practices, you will make it as easy as
  possible for users to build your code and use it, and for other
  developers to understand your code and cooperate with you to improve
  it.

  This document is a must-read for novice developers. Experienced
  developers should review it when they are about to release a new
  project. It will be revised periodically to reflect the evolution of
  good-practice standards.
    _________________________________________________________________

  Table of Contents
  1. [2]Introduction

       1.1. [3]Why this document?
       1.2. [4]New versions of this document

  2. [5]Good project- and archive- naming practice

       2.1. [6]Use GNU-style names with a stem and major.minor.patch
               numbering.

       2.2. [7]But respect local conventions where appropriate
       2.3. [8]Try hard to choose a name prefix that is unique and easy
               to type

  3. [9]Good licensing and copyright practice: the theory

       3.1. [10]Open source and copyrights
       3.2. [11]What qualifies as open source

  4. [12]Good licensing and copyright practice: the practice

       4.1. [13]Make yourself or the FSF the copyright holder
       4.2. [14]Use a license conformant to the Open Source Definition
       4.3. [15]Don't write your own license if you can possibly avoid
               it.

  5. [16]Good development practice

       5.1. [17]Write either pure ANSI C or a portable scripting
               language

       5.2. [18]Follow good C portability practices
       5.3. [19]Use autoconf/automake/autoheader
       5.4. [20]Sanity-check your code before release
       5.5. [21]Sanity-check your documentation and READMEs before
               release

  6. [22]Good distribution-making practice

       6.1. [23]Make sure tarballs always unpack into a single new
               directory

       6.2. [24]Have a README
       6.3. [25]Respect and follow standard file naming practices
       6.4. [26]Design for Upgradability
       6.5. [27]Provide RPMs

  7. [28]Good documentation practice

       7.1. [29]Good practice in the present
       7.2. [30]Good practice for the future

  8. [31]Good communication practice

       8.1. [32]Announce to c.o.l.a and Freshmeat
       8.2. [33]Announce to a relevant topic newsgroup
       8.3. [34]Have a website
       8.4. [35]Host project mailing lists
       8.5. [36]Release to major archives

  9. [37]Good project-management practice
    _________________________________________________________________

1. Introduction

1.1. Why this document?

  There is a large body of good-practice traditions for open-source code
  that helps other people port, use, and cooperate with developing it.
  Some of these conventions are traditional in the Unix world and
  predate Linux; others have developed recently in response to
  particular new tools and technologies such as the World Wide Web.

  This document will help you learn good practice. It is organized into
  topic sections, each containing a series of checklist items. Think of
  these as a pre-flight checklist for your software distribution.
    _________________________________________________________________

1.2. New versions of this document

  This document will be posted monthly to the newsgroups
  [38]comp.os.linux.answers. You can also view the latest version of
  this HOWTO on the World Wide Web via the URL
  [39]http://www.linuxdoc.org/LDP/HOWTO/Software-Release-Practice.html.

  Feel free to mail any questions or comments about this HOWTO to Eric
  S. Raymond, <[40][email protected]>.
    _________________________________________________________________

2. Good project- and archive- naming practice

  As the load on maintainers of archives like Metalab, the PSA site and
  CPAN increases, there is an increasing trend for submissions to be
  processed partly or wholly by programs (rather than entirely by a
  human).

  This makes it more important for project and archive-file names to fit
  regular patterns that computer programs can parse and understand.
    _________________________________________________________________

2.1. Use GNU-style names with a stem and major.minor.patch numbering.

  It's helpful to everybody if your archive files all have GNU-like
  names -- all-lower-case alphanumeric stem prefix, followed by a dash,
  followed by a version number, extension, and other suffixes.

  Let's suppose you have a project you call `foobar' at version 1,
  release 2, level 3. If it's got just one archive part (presumably the
  sources), here's what its names should look:

  foobar-1.2.3.tar.gz
         The source archive

  foobar.lsm
         The LSM file (assuming you're submitting to Metalab).

  Please don't use these:

  foobar123.tar.gz
         This looks to many programs like an archive for a project
         called`foobar123' with no version number.

  foobar1.2.3.tar.gz
         This looks to many programs like an archive for a project
         called `foobar1' at version 2.3.

  foobar-v1.2.3.tar.gz
         Many programs think this goes with a project called
         `foobar-v1'.

  foo_bar-1.2.3.tar.gz
         The underscore is hard for people to speak, type, and remember.

  FooBar-1.2.3.tar.gz
         Unless you like looking like a marketing weenie. This is also
         hard for people to speak, type, and remember.

  If you have to differentiate between source and binary archives, or
  between different kinds of binary, or express some kind of build
  option in the file name, please treat that as a file extension to go
  after the version number. That is, please do this:

  foobar-1.2.3.src.tar.gz
         sources

  foobar-1.2.3.bin.tar.gz
         binaries, type not specified

  foobar-1.2.3.bin.ELF.tar.gz
         ELF binaries

  foobar-1.2.3.bin.ELF.static.tar.gz
         ELF binaries statically linked

  foobar-1.2.3.bin.SPARC.tar.gz
         SPARC binaries

  Please don't use names like `foobar-ELF-1.2.3.tar.gz', because
  programs have a hard time telling type infixes (like `-ELF') from the
  stem.

  A good general form of name has these parts in order:

   1. project prefix
   2. dash
   3. version number
   4. dot
   5. "src" or "bin" (optional)
   6. dot or dash (dot preferred)
   7. binary type and options (optional)
   8. archiving and compression extensions
    _________________________________________________________________

2.2. But respect local conventions where appropriate

  Some projects and communities have well-defined conventions for names
  and version numbers that aren't necessarily compatible with the above
  advice. For instance, Apache modules are generally named like mod_foo,
  and have both their own version number and the version of Apache with
  which they work. Likewise, Perl modules have version numbers that can
  be treated as floating point numbers (e.g., you might see 1.303 rather
  than 1.3.3), and the distributions are generally named
  Foo-Bar-1.303.tar.gz for version 1.303 of module Foo::Bar. (Perl
  itself, on the other hand, switched to using the conventions described
  un this document in late 1999.)

  Look for and respect the conventions of specialized communities and
  developers; for general use, follow the above guidelines.
    _________________________________________________________________

2.3. Try hard to choose a name prefix that is unique and easy to type

  The stem prefix should be common to all a project's files, and it
  should be easy to read, type, and remember. So please don't use
  underscores. And don't capitalize or BiCapitalize without extremely
  good reason -- it messes up the natural human-eyeball search order and
  looks like some marketing weenie trying to be clever.

  It confuses people when two different projects have the same stem
  name. So try to check for collisions before your first release. Two
  good places to check are the [41]index file of Metalab and the
  appindex at [42]Freshmeat. Another good place to check is
  [43]SourceForge; do a name search there.
    _________________________________________________________________

3. Good licensing and copyright practice: the theory

  The license you choose defines the social contract you wish to set up
  among your co-developers and users. The copyright you put on the
  software will function mainly as a legal assertion of your right to
  set license terms on the software and derivative works of the
  software.
    _________________________________________________________________

3.1. Open source and copyrights

  Anything that is not public domain has a copyright, possibly more than
  one. Under the Berne Convention (which has been U.S. law since 1978),
  the copyright does not have to be explicit. That is, the authors of a
  work hold copyright even if there is no copyright notice.

  Who counts as an author can be very complicated, especially for
  software that has been worked on by many hands. This is why licenses
  are important. By setting out the terms under which material can be
  used, they grant rights to the users that protect them from arbitrary
  actions by the copyright holders.

  In proprietary software, the license terms are designed to protect the
  copyright. They're a way of granting a few rights to users while
  reserving as much legal territory is possible for the owner (the
  copyright holder). The copyright holder is very important, and the
  license logic so restrictive that the exact technicalities of the
  license terms are usually unimportant.

  In open-source software, the situation is usually the exact opposite;
  the copyright exists to protect the license. The only rights the
  copyright holder always keeps are to enforce the license. Otherwise,
  only a few rights are reserved and most choices pass to the user. In
  particular, the copyright holder cannot change the terms on a copy you
  already have. Therefore, in open-source software the copyright holder
  is almost irrelevant -- but the license terms are very important.

  Normally the copyright holder of a project is the current project
  leader or sponsoring organization. Transfer of the project to a new
  leader is often signaled by changing the copyright holder. However,
  this is not a hard and fast rule; many open-source projects have
  multiple copyright holders, and there is no instance on record of this
  leading to legal problems.

  Some projects choose to assign copyright to the Free Software
  Foundation, on the theory that it has an interest in defending open
  source and lawyers available to do it.
    _________________________________________________________________

3.2. What qualifies as open source

  For licensing purposes, we can distinguish several different kinds of
  rights that a license may convey. Rights to copy and redistribute,
  rights to use, rights to modify for personal use, and rights to
  redistribute modified copies. A license may restrict or attach
  conditions to any of these rights.

  The [44]Open Source Initiative is the result of a great deal of
  thought about what makes software ``open source'' or (in older
  terminology) ``free''. Its constraints on licensing require that:

   1. An unlimited right to copy be granted.
   2. An unlimited right to use be granted.
   3. An unlimited right to modify for personal use be granted.

  The guidelines prohibit restrictions on redistribution of modified
  binaries; this meets the needs of software distributors, who need to
  be able to ship working code without encumbrance. It allows authors to
  require that modified sources be redistributed as pristine sources
  plus patches, thus establishing the author's intentions and an ``audit
  trail'' of any changes by others.

  The OSD is the legal definition of the `OSI Certified Open Source'
  certification mark, and as good a definition of ``free software'' as
  anyone has ever come up with. All of the standard licenses (MIT, BSD,
  Artistic, and GPL/LGPL) meet it (though some, like GPL, have other
  restrictions which you should understand before choosing it).

  Note that licenses which allow noncommercial use only do not qualify
  as open-source licenses, even if they are decorated with ``GPL'' or
  some other standard license. They discriminate against particular
  occupations, persons, and groups. They make life too complicated for
  CD-ROM distributors and others trying to spread open-source software
  commercially.
    _________________________________________________________________

4. Good licensing and copyright practice: the practice

  Here's how to translate the theory above into practice:
    _________________________________________________________________

4.1. Make yourself or the FSF the copyright holder

  In some cases, if you have a sponsoring organization behind you with
  lawyers, you might wish to give copyright to that organization.
    _________________________________________________________________

4.2. Use a license conformant to the Open Source Definition

  The Open Source Definition is the community gold standard for
  licenses. The OSD is not a license itself; rather, it defines a
  minimum set of rights that a license must guarantee in order to be
  considered an open-source license. The OSD, and supporting materials,
  may be found at the web site of the [45]Open Source Initiative.
    _________________________________________________________________

4.3. Don't write your own license if you can possibly avoid it.

  The widely-known OSD-conformant licenses have well-established
  interpretive traditions. Developers (and, to the extent they care,
  users) know what they imply, and have a reasonable take on the risks
  and tradeoffs they involve. Therefore, use one of the standard
  licenses carried on the OSI site if at all possible.

  If you must write your own license, be sure to have it certified by
  OSI. This will avoid a lot of argument and overhead. Unless you've
  been through it, you have no idea how nasty a licensing flamewar can
  get; people become passionate because the licenses are regarded as
  almost-sacred covenants touching the core values of the open-source
  community.

  Furthermore, the presence of an established interpretive tradition may
  prove important if your license is ever tested in court. At time of
  writing (mid-2000) there is no case law either supporting or
  invalidating any open-source license. However, it is a legal doctrine
  (at least in the U.S., and probably in other common-law countries such
  as England and the rest of the British Commonwealth) that courts are
  supposed to interpret licenses and contracts according to the
  expectations and practices of the community in which they originated.
    _________________________________________________________________

5. Good development practice

  Most of these are concerned with ensuring portability, not only across
  Linuxes but to other Unixes as well. Being portable to other Unixes is
  not just a worthy form of professionalism and hackerly politeness,
  it's valuable insurance against future changes in Linux itself.

  Finally, other people will try to build your code on non-Linux
  systems; portability minimizes the number of annoying perplexed email
  messages you will get.
    _________________________________________________________________

5.1. Write either pure ANSI C or a portable scripting language

  For portability and stability, you should write either in ANSI C or a
  scripting language that is guaranteed portable because it has just one
  cross-platform implementation.

  Scripting languages that qualify include Python, Perl, Tcl, Emacs
  Lisp, and PHP. Plain old shell does not qualify; there are too many
  different implementations with subtle idiosyncracies, and the shell
  environment is subject to disruption by user customizations such as
  shell aliases.

  Java holds promise as a portable language, but the Linux-available
  implementations are still scratchy and poorly integrated with Linux.
  Java is still a bleeding-edge choice, though one likely to become more
  popular as it matures.
    _________________________________________________________________

5.2. Follow good C portability practices

  If you are writing C, do feel free to use the full ANSI features --
  including function prototypes, which will help you spot cross-module
  inconsistancies. The old-style K&R compilers are history.

  On the other hand, do not assume that GCC-specific features such as
  the `-pipe' option or nested functions are available. These will come
  around and bite you the second somebody ports to a non-Linux, non-GCC
  system.
    _________________________________________________________________

5.3. Use autoconf/automake/autoheader

  If you're writing C, use autoconf/automake/autoheader to handle
  portability issues, do system-configuration probes, and tailor your
  makefiles. People building from sources today expect to be able to
  type "configure; make" and get a clean build -- and rightly so.
    _________________________________________________________________

5.4. Sanity-check your code before release

  If you're writing C, test-compile with -Wall and clean up the errors
  at least once before each release. This catches a surprising number of
  errors. For real thoroughness, compile with -pedantic as well.

  If you're writing Perl, check your code with perl -c (and maybe -T, if
  applicable). Use perl -w and 'use strict' religiously. (See the Perl
  documentation for discussion.)
    _________________________________________________________________

5.5. Sanity-check your documentation and READMEs before release

  Run a spell-checker on them. If you look like you can't spell and
  don't care, people will assume you code is sloppy and careless too.
    _________________________________________________________________

6. Good distribution-making practice

  These guidelines describe how your distribution should look when
  someone downloads, retrieves and unpacks it.
    _________________________________________________________________

6.1. Make sure tarballs always unpack into a single new directory

  The single most annoying mistake newbie developers make is to build
  tarballs that unpack the files and directories in the distribution
  into the current directory, potentially stepping on files already
  located there. Never do this!

  Instead, make sure your archive files all have a common directory part
  named after the project, so they will unpack into a single top-level
  directory directly beneath the current one.

  Here's a makefile trick that, assuming your distribution directory is
  named `foobar' and SRC contains a list of your distribution files,
  accomplishes this.
foobar-$(VERS).tar.gz:
       @ls $(SRC) | sed s:^:foobar-$(VERS)/: >MANIFEST
       @(cd ..; ln -s foobar foobar-$(VERS))
       (cd ..; tar -czvf foobar/foobar-$(VERS).tar.gz `cat foobar/MANIFEST`)
       @(cd ..; rm foobar-$(VERS))
    _________________________________________________________________

6.2. Have a README

  Have a file called README or READ.ME that is a roadmap of your source
  distribution. By ancient convention, this is the first file intrepid
  explorers will read after unpacking the source.

  Good things to have in the README include:

   1. A brief description of the project.
   2. A pointer to the project website (if it has one)
   3. Notes on the developer's build environment and potential
      portability problems.
   4. A roadmap describing important files and subdirectories.
   5. Either build/installation instructions or a pointer to a file
      containing same (usually INSTALL).
   6. Either a maintainers/credits list or a pointer to a file
      containing same (usually CREDITS).
   7. Either recent project news or a pointer to a file containing same
      (usually NEWS).
    _________________________________________________________________

6.3. Respect and follow standard file naming practices

  Before even looking at the README, your intrepid explorer will have
  scanned the filenames in the top-level directory of your unpacked
  distribution. Those names can themselves convey information. By
  adhering to certain standard naming practices, you can give the
  explorer valuable clues about what to look in next.

  Here are some standard top-level file names and what they mean. Not
  every distribution needs all of these.

  README or READ.ME
         the roadmap file, to be read first

  INSTALL
         configuration, build, and installation instructions

  CREDITS
         list of project contributers

  NEWS
         recent project news

  HISTORY
         project history

  COPYING
         project license terms (GNU convention)

  LICENSE
         project license terms

  MANIFEST
         list of files in the distribution

  FAQ
         plain-text Frequently-Asked-Questions document for the project

  TAGS
         generated tag file for use by Emacs or vi

  Note the overall convention that filenames with all-caps names are
  human-readable metainformation about the package, rather than build
  components.

  Having a FAQ can save you a lot of grief. When a question about the
  project comes up often, put it in the FAQ; then direct users to read
  the FAQ before sending questions or bug reports. A well-nurtured FAQ
  can decrease the support burden on the project maintainers by an order
  of magnitude or more.

  Having a HISTORY or NEWS file with timestamps in it for each release
  is valuable. Among other things, it may help establish prior art if
  you are ever hit with a patent-infringement lawsuit (this hasn't
  happened to anyone yet, but best to be prepared).
    _________________________________________________________________

6.4. Design for Upgradability

  Your software will change over time as you put out new releases. Some
  of these changes will not be backward-compatible. Accordingly, you
  should give serious thought to designing your installation layouts so
  that multiple installed versions of your code can coexist on the same
  system. This is especially important for libraries -- you can't count
  on all your client programs to upgrade in lockstep with your API
  changes.

  The Emacs, Python, and Qt projects have a good convention for handling
  this; version-numbered directories. Here's how an installed Qt library
  hierarchy looks (${ver} is the version number):
/usr/lib/qt
/usr/lib/qt-${ver}
/usr/lib/qt-${ver}/bin          # Where you find moc
/usr/lib/qt-${ver}/lib          # Where you find .so
/usr/lib/qt-${ver}/include      # Where you find header files

  With this organization, you can have multiple versions coexisting.
  Client programs have to specify the library version they want, but
  that's a small price to pay for not having the interfaces break on
  them.
    _________________________________________________________________

6.5. Provide RPMs

  The de-facto standard format for installable binary packages is that
  used by the Red Hat Package manager, RPM. It's featured in the most
  popular Linux distribution, and supported by effectively all other
  Linux distributions (except Debian and Slackware; and Debian can
  install from RPMs).

  Accordingly, it's a good idea for your project site to provide
  installable RPMs as well as source tarballs.

  It's also a good idea for you to include in your source tarball the
  RPM spec file, with a production that makes RPMs from it in your
  Makefile. The spec file should have the extension `.spec'; that's how
  the rpm -t option finds it in a tarball.

  For extra style points, generate your spec file with a shellscript
  that automatically plugs in the correct version number by analyzing
  the Makefile or a version.h.

  Note: if you supply source RPMs, use BuildRoot to make the program be
  built in /tmp or /var/tmp. If you don't, during the course of running
  the make install part of your build, the install will install the
  files in the real final places. This will happen even if there are
  file collisions, and even if you didn't want to install the package at
  all. When you're done, the files will have been installed and your
  system's RPM database will not know about it. Such badly behaved SRPMs
  are a minefield and should be eschewed.
    _________________________________________________________________

7. Good documentation practice

  The most important good documentation practice is to actually write
  some! Too many programmers omit this. But here are two good reasons to
  do it:

   1. Your documentation can be your design document. The best time to
      write it is before you type a single line of code, while you're
      thinking out what you want to do. You'll find that the process of
      describing the way you want your program to work in natural
      language focuses your mind on the high-level questions about what
      it should do and how it should work. This may save you a lot of
      effort later.
   2. Your documentation is an advertisement for the quality of your
      code. Many people take poor, scanty, or illiterate documentation
      for a program as a sign that the programmer is sloppy or careless
      of potential users' needs. Good documentation, on the other hand,
      conveys a message of intelligence and professionalism. If your
      program has to compete with other programs, better make sure your
      documentation is at least as good as theirs lest potential users
      write you off without a second look.

  This HOWTO wouldn't be the place for a course on technical writing
  even if that were practical. So we'll focus here on the formats and
  tools available for composing and rendering documentation.

  Though Unix and the open-source community have a long tradition of
  hosting powerful document-formatting tools, the plethora of different
  formats has meant that documentation has tended to be fragmented and
  difficult for users to browse or index in a coherent way. We'll
  summarize the uses, strengths, and weaknesses of the common
  documentation formats. Then we'll make some recommendations for good
  practice.
    _________________________________________________________________

7.1. Good practice in the present

  Here are the documentation markup formats now in widespread use among
  open-source developers. When we speak of "presentation" markup, we
  mean markup that controls the document's appearance explicitly (such
  as a font change). When we speak of "structural" markup, we mean
  markup that describes the logical structure of the document (like a
  section break or emphasis tag.) And when we speak of "indexing", we
  mean the process of extracting from a collection of documents a
  searchable collection of topic pointers that users can employ to
  reliably find material of interest across the entire collection.

  man pages
         The most most common format, inherited from Unix, a primitive
         form of presentation markup. The man(1) command provides a
         pager and stone-age search facility. No support for images or
         hyperlinks or indexing. Renders to Postscript for printing
         fairly well. Doesn't render to HTML at all well (essentially as
         flat text). Tools are preinstalled on all Linux systems.

         Man page format is not bad for command summaries or short
         reference documents intended to jog the memory of an
         experienced user. It starts to creak under the strain for
         programs with complex interfaces and many options, and
         collapses entirely if you need to maintain a set of documents
         with rich cross-references (the markup has no support for
         hyperlinks).

  HTML
         Increasingly common since the Web exploded in 1993-1994. Markup
         is partly structural, mostly presentation. Browseable through
         any web browser. Good support for images and hyperlinks.
         Limited built-in facilities for indexing, but good indexing and
         search-engine technologies exist and are widely deployed.
         Renders to Postscript for printing pretty well. HTML tools are
         now universally available.

         HTML is very flexible and suitable for many kinds of
         documentation. Actually, it's too flexible; it shares with man
         page format the problem that it's hard to index automatically
         because a lot of the markup describes presentation rather than
         document structure.

  Texinfo
         Texinfo is the documentation format used by the Free Software
         Foundation. It's a set of macros on top of the powerful TeX
         formatting engine. Mostly structural, partly presentation.
         Browseable through Emacs or a standalone info program. Good
         support for hyperlinks, none for images. Good indexing for both
         print and on-line forms; when you install a Texinfo document, a
         pointer to it is automatically added to a browsable "dir"
         document listing all the Texinfo documents on your system.
         Renders to excellent Postscript and useable HTML. Texinfo tools
         are preinstalled on most Linux systems, and available at the
         [46]Free Software Foundation website.

         Texinfo is a good design, quite usable for typesetting books as
         well as small on-line documents, but like HTML it's a sort of
         amphibian -- the markup is part structural, part presentation,
         and the presentation part creates problems for rendering.

  DocBook
         DocBook is a large, elaborate markup format based on SGML (more
         recent versions on XML). Unlike the other formats described
         here it is entirely structural with no presentation markup.
         Excellent support for images and hyperlinks. Good support for
         indexing. Renders well to HTML, acceptably to Postscript for
         printing (quality is improving as the tools evolve). Tools and
         documentation are available at the [47]DocBook website.

         DocBook is excellent for large, complex documents; it was
         designed specifically to support technical manuals and
         rendering them in multiple output formats. Its drawbacks are
         complexity, a not entirely mature (though rapidly improving)
         toolset, and introductory-level documentation that is scanty
         and (too often) highly obfuscated.
    _________________________________________________________________

7.2. Good practice for the future

  In July of 2000 representatives from several important open-source
  project groups (including GNOME, KDE, the Free Software Foundation,
  the Linux Documentation Project, and the Open Source Initiative) held
  a summit conference in Monterey, California. The goal was to try and
  settle on common practices and common documentation interchange
  formats, so that a much richer and more unified body of documentation
  can evolve.

  Concretely, the goal everyone has in view is to support a kind of
  documentation package which, when installed on a system, is
  immediately integrated into a rich system-wide index of documents in
  such a way that they can all be browsed through a uniform interface
  and searched as a unit. From the steps GNOME and KDE have already
  taken in this direction, it was already understood that this would
  require a structural rather than presentation markup standard.

  The meeting endorsed a trend which has been clear for a while; key
  open-source projects are moving or have already moved to DocBook as a
  master format for their documentation.

  The participants also settled on using the `Dublin core' metadata
  format (an international standard developed by librarians concerned
  with the indexing of digital material) to support document indexing;
  details of that are still being worked out, and will probably result
  in some additions to the DocBook markup to support embedding Dublin
  Core metadata in DocBook documents.

  The direction is clear; more use of Docbook, with auxiliary standards
  that support automatically indexing Docbook documents based on their
  index tags and Dublin core metadata. There are pieces still missing
  from this picture, but they will be filled in. The older
  presentation-based markups' days are numbered. (This HOWTO was moved
  to DocBook in August 2000.)

  Thus, people starting new open-source projects will be ahead of the
  curve, and probably saving themselves a nasty conversion process
  later, if they go with DocBook as a master format from the beginning.
    _________________________________________________________________

8. Good communication practice

  Your software and documentation won't do the world much good if nobody
  but you knows it exists. Also, developing a visible presence for the
  project on the Internet will assist you in recruiting users and
  co-developers. Here are the standard ways to do that.
    _________________________________________________________________

8.1. Announce to c.o.l.a and Freshmeat

  Announce new releases to [48]comp.os.linux.announce. Besides being
  widely read itself, this group is a major feeder for web-based
  what's-new sites like [49]Freshmeat.
    _________________________________________________________________

8.2. Announce to a relevant topic newsgroup

  Find USENET topics group directly relevant to your application, and
  announce there as well. Post only where the function of the code is
  relevant, and exercise restraint.

  If (for example) you are releasing a program written in Perl that
  queries IMAP servers, you should certainly post to comp.mail.imap. But
  you should probably not post to comp.lang.perl unless the program is
  also an instructive example of cutting-edge Perl techniques.

  Your announcement should include the URL of a project website.
    _________________________________________________________________

8.3. Have a website

  If you intend try to build any substantial user or developer community
  around your project, it should have a website. Standard things to have
  on the website include:

    * The project charter (why it exists, who the audience is, etc).
    * Download links for the project sources.
    * Instructions on how to join the project mailing list(s).
    * A FAQ (Frequently Asked Questions) list.
    * HTMLized versions of the project documentation
    * Links to related and/or competing projects.

  Some project sites even have URLs for anonymous access to the master
  source tree.
    _________________________________________________________________

8.4. Host project mailing lists

  It's standard practice to have a private development list through
  which project collaborators can communicate and exchange patches. You
  may also want to have an announcements list for people who want to be
  kept informed of the project's process.

  If you are running a project named `foo'. your developer list might be
  foo-dev or foo-friends; your announcement list might be foo-announce.
    _________________________________________________________________

8.5. Release to major archives

  For the last several years, the [50]Metalab archive has been the most
  important interchange location for Linux software.

  Since it was launched in fall 1999, [51]SourceForge has exploded in
  popularity. It is not just an archive and distribution site, though
  you can use it that way. It is an entire free project-hosting service
  that tries to offer a complete set of tools for open-source
  development groups -- web and archive space, mailing lists,
  bug-tracking, chat forums, CVS repositories, and other services.

  Other important locations include:

    * the [52]Python Software Activity site (for software written in
      Python).
    * the [53]CPAN, the Comprehensive Perl Archive Network, (for
      software written in Perl).
    _________________________________________________________________

9. Good project-management practice

  Managing a project well when all the participants are volunteers
  presents some unique challenges. This is too large a topic to cover in
  a HOWTO. Fortunately, there are some useful white papers available
  that will help you understand the major issues.

  For discussion of basic development organization and the
  release-early-release-often `bazaar mode', see [54]The Cathedral and
  the Bazaar.

  For discussion of motivational psychology, community customs, and
  conflict resolution, see [55]Homesteading the Noosphere.

  For discussion of economics and appropriate business models, see
  [56]The Magic Cauldron.

  These papers are not the last word on open-source development. But
  they were the first serious analyses to be written, and have yet to be
  superseded (though the author hopes they will be somesday).

References

  1. http://www.tuxedo.org/~esr/
  2. Software-Release-Practice-HOWTO.html#AEN30
  3. Software-Release-Practice-HOWTO.html#AEN32
  4. Software-Release-Practice-HOWTO.html#AEN36
  5. Software-Release-Practice-HOWTO.html#AEN43
  6. Software-Release-Practice-HOWTO.html#AEN47
  7. Software-Release-Practice-HOWTO.html#AEN127
  8. Software-Release-Practice-HOWTO.html#AEN131
  9. Software-Release-Practice-HOWTO.html#AEN138
 10. Software-Release-Practice-HOWTO.html#AEN141
 11. Software-Release-Practice-HOWTO.html#AEN149
 12. Software-Release-Practice-HOWTO.html#AEN169
 13. Software-Release-Practice-HOWTO.html#AEN172
 14. Software-Release-Practice-HOWTO.html#AEN175
 15. Software-Release-Practice-HOWTO.html#AEN179
 16. Software-Release-Practice-HOWTO.html#AEN184
 17. Software-Release-Practice-HOWTO.html#AEN189
 18. Software-Release-Practice-HOWTO.html#AEN195
 19. Software-Release-Practice-HOWTO.html#AEN200
 20. Software-Release-Practice-HOWTO.html#AEN203
 21. Software-Release-Practice-HOWTO.html#AEN207
 22. Software-Release-Practice-HOWTO.html#AEN210
 23. Software-Release-Practice-HOWTO.html#AEN213
 24. Software-Release-Practice-HOWTO.html#AEN221
 25. Software-Release-Practice-HOWTO.html#AEN245
 26. Software-Release-Practice-HOWTO.html#AEN293
 27. Software-Release-Practice-HOWTO.html#AEN299
 28. Software-Release-Practice-HOWTO.html#AEN306
 29. Software-Release-Practice-HOWTO.html#AEN318
 30. Software-Release-Practice-HOWTO.html#AEN347
 31. Software-Release-Practice-HOWTO.html#AEN355
 32. Software-Release-Practice-HOWTO.html#AEN358
 33. Software-Release-Practice-HOWTO.html#AEN363
 34. Software-Release-Practice-HOWTO.html#AEN369
 35. Software-Release-Practice-HOWTO.html#AEN386
 36. Software-Release-Practice-HOWTO.html#AEN390
 37. Software-Release-Practice-HOWTO.html#AEN404
 38. news:comp.os.linux.answers
 39. http://www.linuxdoc.org/LDP/HOWTO/Software-Release-Practice.html
 40. mailto:[email protected]
 41. http://metalab.unc.edu/pub/Linux
 42. http://www.freshmeat.net/
 43. http://www.sourceforge.net/
 44. http://www.opensource.org/
 45. http://www.opensource.org/
 46. http://www.gnu.org/
 47. http://www.docbook.org/
 48. news:comp.os.linux.announce
 49. http://www.freshmeat.net/
 50. http://www.metalab.unc.edu/pub/Linux/
 51. http://www.sourceforge.net/
 52. http://www.python.org/
 53. http://language.perl.com/CPAN
 54. http://www.tuxedo.org/~esr/writings/cathedral-bazaar/
 55. http://www.tuxedo.org/~esr/writings/homesteading/
 56. http://www.tuxedo.org/~esr/writings/magic-cauldron/