Development Status Not Applicable

Some pages in the book are details about a feature or combination of features. This special status is used for those pages since they are not expected to have a status per se.

See a complete list of features sorted by Snap! Websites Development Status (note that not applicable pages are not shown in that list.)


The Snap! Server comes with a set of tools that incorporate a help. This help is found in this book. Each tool has his own chapter and the tool knows that URL to access that chapter.

Layout Extensions

There are features that are of interest but are not otherwise available in all Browsers. Those that are not available in Internet Explorer should be built in JavaScript whenever possible.

The following are features I have found on different websites and that are not possible as is with Internet Explorer but can be achieved with the use of JavaScript.

Shadow, Glow, etc.

More and more people like to add a shadow on text. Most browsers already support shadows on boxes so no worries there, but on text, that's not supportted as is by Internet Explorer. However, IE accepts special ...

List of Useful Widgets

Details about the Widget feature.

Widgets ideas goes to infinitum since for every application you need a few specialized widgets. However, having a strong base will definitively help in getting small applications done without the need to re-implement widgets everytime.

The following is a list based on Qt widgets (since I consider that Qt works quite well for many apps.):

  • Box -- a box used to group other widgets (should support a grid like feature -- this may be what we call the layout though)
  • Button -- a widget that you can click to generate an action; it should be ...

URL Test

This page is a proof of concept more for myself than for the community although it can be useful for you to further understand the search mechanism offered by the URL.

URL Parts

The URL may include several different types of parts that are defined in detail below.

This URL parts are:

  • http -- protocol
  • user:password -- authentication, always an option
  • en.3.5. -- sub-domain
  • port -- port, must also be defined in Apache
  • -- domain and TLD
  • software/snap -- path
  • page=1 -- ...

Table names

Tables are well defined so they get very specific names and do not need any special handling.

Column names

In most cases column names are like C++ member variable names: they are well defined. These names are expected to be defined with a namespace (i.e. the page data is written starting with page::.)

Once in a while column names are actually row names. This happens when a table is used as an index. In this case the column name uses the copy of a row name so there is nothing complicated to defining these names.

Row names

So... row names are complicated.

There are ...


It is expected that you use a firewall to prevent all connections to your webserver except those on port 80 and 443 and any other port that Apache would answer.

Any other port could cause issues and you are responsible for them.

The Snap Server, if given permission, will be capable to deal with iptables to block users that are detected as flooding the server and not slowing down when asked to.

See iplock firewall tool


At this point we intend to only support Apache as a webserver. One thing about this server, it is used by many and is known to be quite safe to use as a ...

Snap! Websites stackThe system process including all the steps I can think of at the moment.


Assuming you give the Snap! server permissions, it blocks IP addresses that misbehave with your firewall. Misbehavior is detected as spam posts, fast hits, or unwanted accesses.

Apache Server

Start the Apache server, check whether it is better (faster) to run Apache and have all special features (redirects and such) in the snap.cgi (i.e. dynamic) or in Apache (i.e. but that last option requires a reload of Apache every now and then!)

See whether we gain anything in having a static cache. The problem ...

HTML 5 Helper Libraries

We are finding more and more projects that help with HTML 5. Although we're not right now looking into supporting HTML 5 directly, we keep an eye open to new technology, especially if it can help us get a better feel for our sites.

Dynamic CSS (a form of scripting language for CSS content) --

CSSTidy (CSS compression/beautifier) --

A Compass Extension --

Responsive breakpoints (no idea what that really is though) --


We were thinking of ...


The following are 3 files you can use to create this example (see tar ball attachment below.) The original code comes from Aaron Isotton, although his example was not a true C++ sample... it would not use a global variable to auto-register the plug-in. Instead he would load a symbol. It is licensed under the GPL.

The first one (main.cpp) includes the code used to load and unload the plugin.

#include <iostream>
#include <dlfcn.h>

int main() {
    std::cout << "C++ dlopen demo" << std::endl << std::endl;

    // open the ...


We like to make our server very modular in order to simplify the testing.

Full coverage testing is what will give you more chances of finding most of the bugs before using the server. In other words, a good way to verify that the server works as expected.

The server is composed of a small core, libraries, and plugins.

By default, plugins should be compiled as such (i.e. a .so under Linux.) However, by simulating all the necessary core functionality in a test, it is possible to run the plugin tests on the command line and find problems early.

The main thing that we want to simulate to ...

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

Contact Us Directly