Snap! Websites Projects

Project Dependencies
(Click to Enlarge)

The Snap! Websites system makes use of several projects that are listed here.

All of these projects are maintained and supported by us so feel free to contact us if you have any problem or question. For contact information, check out the projects each has its own contact information.

All of the projects offered here are also available on launchpad (packages)

All our projects are documented, some have a separate reference found in the list of References of Snap! Websites Projects.

With time we end up with obsolete projects. We are keeping the obsolete projects pages and added a redirect to the new pages, but we are not working on those projects and they are not used in Snap! anymore.

  • Introduction

    Advanced getopt, the C++ libraryThis project is an advanced getopt() class to use with your C++ projects. It handles most everything that GNU-like tools offer as far as command line options go.

    The main idea is for you to have as little to do as possible parsing your command line arguments and configuration files. The library expects a table of available options with a short and long version of the options, and whether they accept arguments (i.e. -f <filename>).

    In your C++ program you can the just check whether a parameter is defined or not with the is_defined() function and get the value as a ...

  • Introduction

    libaddr logo, with arrows going in many directionslibaddr is an easy to use C++ library that parses IP & Unix addresses to C++ objects. This includes parsing one or more IPv4 and IPv6 addresses, with a port or a CIDR mask and the latest also supports real or abstract paths to Unix addresses.

    The library also includes functions to list interfaces (i.e. "eth0", "eth1", etc.) and your route tables (see route(8).) The library actually includes a tool, ipv4_routes, one can use to list routes as the libaddr sees them.

    The existing parser has limits since it is streaming the input characters instead of converting the input to tokens that can be managed. However, it is still much more powerful than what the default C library functions offer.

  • Introduction

    The C++ Thread project is the snap_thread.cpp/.h moved in its own project.

    We also will include any multi-thread related code to this project as we find it in our other libraries.

    The project allows for easy thread manipulation and communication which makes it really easy to add multitasking to your projects. It also includes a thread pool with workers which we want to ameliorate to allow for concurrent programming rather than parallel programming, very much based on the Go environment.

  • CSS Preprocessor Logocsspp

    CSS Preprocessor (csspp) is a scripting language that transforms advanced (extended) CSS code into a script that browsers can read.

    The input to csspp can be the same as standard CSS, or it can use extensions as described below such as using basic math, embedding rules in other rules (cascading by nesting) and many other things.

    The project offers a C++ library that can readily be used in your own C++ project and a command line tool.

  • The cluck project is our an implementation of a cluster wide lock mechanism one can use to obtain a lock and run code synchronously in a whole cluster.

    Git repository:

  • The Communicator Daemon is a service used to communicate between any number of nodes in any number of clusters, local (same LAN) and remote. The network connection can be plain text (LAN, fast) or encrypted (remote, safe).

    The Communicator service supports a text message which has its own compact format. You may also use JSON if it makes it easier with your systems (such as a browser).

    The daemon supports a basic set of system messages such as QUIT and CONNECT. It comes with a library that other services are expected to use to connect and manage their connection with the Communicator ...

  • The Event Dispatcher LogoIntroduction

    The Event Dispatcher library is a low level C++ library used to communicate between local and remote services.

    For communication, the library supports TCP, UDP (direct and broadcast), Unix pipes.

    The event part also supports events from Unix signals and the File System.

    Each one of these objects can also be given a timeout date or an elapse time to generate ticks.

    Most of the components of the Event Dispatcher library were developed in the libsnapwebsites library. It was detached from that library so we could make use of its powerful features in other projects.

  • IP Manager LogoThe IP Manager is a tool we created in order to manage our DNS zone files.

    Working on those manually is time consuming and many of the parameters (most, actually!) are repeated between all the different files. Not only that, you are much more likely to have (many) mistakes.

    Instead, the ipmgr command line tool reads configuration files and transforms them in Bind9 compatible zone files. It also takes care of restarting bind9 when something changed.

    Ultimately, we would like to use the rndc and nsupdate tools to dynamically create zones and add sub-domains to them. However, our attempts at using those tools at the time we created ipmgr did not succeed. Setting up the permissions properly seems to require quite a bit of work. Note that although we do not use those tools, the ipmgr configuration files can be setup for dynamically updateable zones. This is important in various situations such as automatically setting up an SSL (TLS really now) certificate with letsencrypt.

  • Prinbee

    Snap! Database — a diverse database system for the Snap! CMSThe Snap! C++ Content Management System makes use of a distributed database system called Prinbee.

    The Prinbee system automatically duplicates the data saved in it, allowing for distribution of the data as well as automatic backup. It works within one data center, separate clusters, and large computers for backing up the data.

    The database supports a JavaScript like language (see the as2js project) used for two main purposes:

    1. Verify that the data is valid for the column
    2. Generate a key used by indexes to sort rows as required by your application
  • Sitter

    Sitter -- tools to closely watch your serversThe sitter project is a daemon, plugins, and tools that can be used to watch a computer to make sure that it runs smoothly.

    It has the ability to verify that a process is running. A service responds to a ping. That the memory is not maxed out. Ensure the disk drive is not close to being full. Etc.


  • The snapbuilder project is used to build our projects on Launchpad (PPA).

    This is a Qt application which lists our projects and allows us to do all the grueling maintenance to keep the packages built at their latest version.

  • The Snap! Logger Project

    Snap Logger LogoOriginally, this project was a break up of the log.cpp and log.h from the libsnapwebsites to its own project. However, that implementation had a dependency on log4cplus which has all sorts of drawbacks for our Snap! environment. Don't get me wrong, up to here, it served us well and log4cplus version 1.2.x works very well.

    That being said, our way of handling configuration files, the fact that we like to use fork() and a few other things, made us think that having our own implementation of a logger would improve our general environment quite a bit. This newer version of the logger is the result.

  • Snap Replication File System

    Prinbee Logo — drives with arrows going back and forth between each drivesnaprfs is a daemon used to replicate files between computers on your Snap! cluster.

    This is somewhat similar to what Hadoop is expected to do.

    There are several capabilities as described below.

    Synchronize Directory

    Keep a directory synchronized by copying the newest version of a file to all the other computers that do not already have it.

    This is used to keep definitions in synchronization.

    snaprfs keeps the files meta data in place (i.e. stat(3) information, especially the modification time) so it can detect whether one of the files on a computer is ...

  • Snap! CMake Modules ExtensionsIntroduction

    Snap! comes with many different projects, all of which need a common set of cmake rules and some of those are rather complex. For that reason we created a common project used to compile all of those projects. This project is the Snap! CMake Modules.


  • The Catch2 logo from the catch2 project.

    All of our C++ tests make use of Catch2, which is a  C++ framwork allowing us to very quickly develop unit tests against our code.

    We have our own extensions1 in the snapcatch2.hpp file so we can very quickly create new tests with our standard set of command line extensions, verbose sections, etc.

    • 1. Some of which are now in Catch2 itself, such as comparing floating points for near equality instead of exact equality.
  • Introduction

    WARNING: We are in the process of replacing this tool with snapmanager.cgi and snapmanagerdaemon which together allow an administrator to manage his cluster of computers. We already installed a 12 computer cluster with these two tools. At this time, the snapmanager is still necessary to setup the domains and websites tables, but that too will be converted to an interface accessible through snapmanager.cgi.

    The Snap! Manager graphical tool was created in order to setup the basics in the database. This is important because without those basics snapcgi and snapserver do not know ...

  • Snap! LogoThis is the project page of the Snap! Websites CMS. It is here to give you basic information about the project. This website as a whole represents the Snap! Websites project and includes all the details you need.

    At some point the source code will be made available on so you will be able to compile it on your own system. Note that it has many dependencies, some of which are not available as is in your Debian or Ubuntu repository. They should appear as time passes, but at this time you will have to do a lot of manual work to get the first binary going.

    Ubuntu Installation Instructions

  • Introduction

    The libtld is a C/C++ library used to extract the TLD from a URI. This allows you to extract the exact domain name, sub-domains, and all the TLDs (top level, second level, third level, etc.)

    The problem with TLDs is that you cannot know where the domain starts. Some domains can use one top-level domain, others use two, three, etc. (up to five at this time). However, it may be useful to know where the domain is to have the exact list of sub-domains. For example, if you want to force www. at the start of the domain name if no other sub-domains are specified, then you need to ...

  • Zipios Logo


    We maintain the Zipios library. This is a C++ library one can use to read or create 32 bit zip files. The advantage of this library is that it offers standard C++ streams to copy the data. The main stream gives you information about each file and you can create a sub-stream for each one of those files. The input is automatically compressed and the output automatically decompressed.

  • as2js compiler

    The as2js compiler and library is used to convert C++ like scripts in JavaScript that will run in your browsers. The name comes "AlexScript to JavaScript" as the system is used to transcode an advanced version of JavaScript to a version that browsers can execute. Our version includes full support for classes, interfaces, and a complete system environment, contrary to browsers that have many limits (although since version 6, browsers also support classes).

    Current status: the trascoder is still in development... I have a version that compiles to binary which is used by the Prinbee system. You can find the status of the coverage and tests below.

    The source code compiles, but most certainly does not work as expected yet. You can find it here:

Snap! Websites
An Open Source CMS System in C++

Contact Us Directly