= Introduction =

UniConf is the glue that binds configuration systems together.  We used to claim
it was the One True Configuration System, but that's a bit dogmatic.  The whole
point of it is to tie applications together, so that they can co-operate and
share their user-preferences.

We've tried to keep UniConf as simple as we could possibly make it.  And we
tried to make it as extensible as we could possibly make it.  By combining these
two things, we've got the nice property that you can probably implement any
configuration system out of it, and plug in to existing configuration systems as
well.

The basic building block of the UniConf system is the UniConfTree.  That's a
hierachical tree of key-value pairs.  Every key and every value is a string,
which is what most people store in configuration systems anyway.  You can
retrieve pairs, store pairs, and enumerate pairs, which is all you really need
to something simple.

But you can get a lot more out of it, which is why you should continue reading.


= Why you want UniConf =

Depending on who you are and what you do, UniConf offers some compelling
advantages, if only you'd look into it.  Here, let's give some examples:

== Application developers ==

Say you're a developer that's writing a new application.  Unless it's a really
trivial application, you're going to want to let users save some form of
preferences.  What you do nowadays is fire up the text editor and start writing
a configuration system.  You say to yourself, "I need to store some data in a
file.  I need to read and write some stuff.  I need to write another parser? 
Maybe I'll just use XML and libexpat?"  If you're going to link in a library
that does this, you could probably use UniConf that's designed for this sort of
thing.

Maybe you've already got an application that you've written before you heard of
UniConf.  Well, we're happy to let you play as well.  By using UniConf instead
of your own hand-rolled configuration system, you can save on maintaining a pile
of code.  To support your old configuration files, you can write a plugin that
lets UniConf use them as your backing store.  And if you don't want to link in
our library, you can talk the UniConfProtocol.

== System administrators ==

The applications for system administrators are just wonderful.  The nice feature
about UniConf that I haven't told you about is that it's distributed.  So you
can setup a whole bunch of client machines that will talk to one UniConfDaemon
and get group configuration settings that way.  UniConf supports a notion of
policy inheritance and access control, so you can centrally control and entire
cluster of servers.  Or a network of workstations.

== Distributors ==

Do you want to write configuration files with sane defaults?  Maybe give users
an interface to choose defaults on install?  It's easy to configure any
UniConf-aware application because there's a common interface to retrieve and
store configuration information.  So you no longer have to write parsers to
extract data and transform it safely.


== Users ==

Do you own more than one computer?  Maybe you have a desktop and a laptop?  It
sure would be nice to keep the settings on your laptop synchronized with the
settings on your desktop.  With UniConf-aware applications, this is definitely
possible.

If you have a house full of computers, you can keep them all synchronized.  And
once it's setup, it should happen automatically so you don't have to worry
anymore.  How cool is that?


= Presentation Slides/Paper =

[apenwarr] sometimes presents a UniConfPresentation.  (Download the slides:
[[Attach uniconf-presentation.pdf]])


He also wrote a paper about UniConf: [[Attach uniconf.pdf]] (20 pages).

- **NOTE** This presentation and paper was written in 2003, and thus contains
statements that are no longer accurate. It is still included here for historical
purposes.

[sfllaw] and [ppatters] went to the [http://desktopcon.org/2005 2005 Desktop
Developers' Conference] where they presented a talk on why UniConf is a good
universal configuration system: [[Attach uniconf_universal.pdf]].  (You can also
get the [http://www.law.yi.org/~sfllaw/talks/#uniconf source].)



= See Also =

- Get the code: http://code.google.com/p/wvstreams (see WvStreams) and 'unity'
(KDE, Gnome, MailDir, and [DBUS] plugins)
- The WvStreams documentation, which includes UniConf.
- UniConfFeatures
- UniConfArchitecture
 - UniConfPlugin
 - UniConfGen
 - UniConfDaemon
 - UniConfSecurity
- UniConfForMessagePassing
- TransactionalUniConf
- The WindowsRegistry, which is suspiciously similar in many ways (and
dissimilar in others).
- WvConf and UniConfHistoricalDiscussion

= Related Projects =

There are also other projects that purport to have similar goals, but will end
up being/have been UniConf enabled anyway since we subsume them. :)

- [http://elektra.sf.net Elektra Project] 
 - Supported by UniConf via ProjectUnity
- [http://www.freedesktop.org/Standards/config-spec FreeDesktop.org
Configuration Specification] which may eventually have some code in the
[http://www.freedesktop.org/Software/CFG Config4Gnu] project.
- [http://asg.web.cmu.edu/acap/ ACAP], Application Configuration Access
Protocol, used at CMU
- [http://yaml.org YAML, not a markup language], an interesting file format we
should consider supporting.
- GConf (Gnome) and KConfig (KDE), of course
 - Supported by UniConf via ProjectUnity
- DBUS, a good basic protocol for exchanging various requests, including config
requests.
 - Supported by UniConf via ProjectUnity