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 server_access plugin is used when sending data to the server and needing to receive a signal that the server is done doing whatever work was asked of it. More or less, it is very much like having a client/server callback, only within a browser only the client can generate a request to the server, never the other way around. For this reason, you need to have a way to repitively send requests to the server to know whether it is done with the work load.

This plugin very much simplifies such callbacks for other plugins. For example, when you attach an image in an Image Drag & Drop area, ...


The plugin named "server" is actually the core library (specifically, an object defined in the lib/ header file.)

It is mandatory and offers basic functionality to the library, functionality that is actually implemented in the plugins. For example, once a child process receives a request from Apache, it parses the URI to make sure it is correct and then it calls the execute() signal implemented in the server. The path plugin listens for that signal to work on generating the output for the client.

The server being somewhat of an abstract plugin has no settings of ...


The sendmail plugin is a low level plugin used to manager emails.

The plugin can break down a list email address in a set of registered users (this uses a signal that the mailinglist plugin implements.) It then saves those emails in each user's mail account. Finally, it runs a backend process that will actually email the message to the user as defined in the user's schedule.

The sendmail does not have its own user interface since it is very low level (i.e. the users plugin is using the sendmail plugin and thus sendmail cannot be using the editor plugin.)


The search plugin retrieves information about each page and saves it in a way that allows for fast searches.

The search is offered a widget one can use to enter a query and a way to display dynamic pages with the results.

The administrator settings include a few options such as the minimum length of a word before it gets added to the search table and whether Asian language texts should be searched (i.e. word length does not apply to asian languages.)


The robotstxt plugin dynamically manages the robots.txt file give to robots that try to read said file. It will include paths that robots should not check because they are going to be forbidden to access those pages. For example, all the pages under the "/admin" path are forbidden unless you have a Snap! Websites administrator user.

Various plugins may add forbidden paths or other information. For example, the sitemapxml plugin puts the path to the sitemap.xml file that robots can download to quickly find all (or at least most) of the public pages available on the website.

There ...


The QR Code plugin allows you to generate QR Codes for your pages.

Although you can display the QR Code directly on your pages, in most cases you just use it to get the code and use it on another website or to add do a document you want to print.

It is very easy to create a QR Code for any page on your website using the /qrcode path and adding the path to the page you want a QR Code for. You can also use attributes to define the size and various other parameters.

For example, say you have a blog page under "/blog/20160307/QR-Codes-Are-Cool". To get the QR Code image for that page, ...


The permissions plugin is used to verify access is allowed to the current or another user.

The plugin is written so you can send a signal to check whether any given user has access to any given URI. This is particularly useful to test whether a box can or cannot be shown. This also works with a very low granularity. For example, a menu item can be hidden because its destination page is not anyway accessible by that user.

The plugin first checks whether the permission information for the feat were cached. If so, it uses the cached permissions. The cached permissions are discarded after a ...


The path plugin is a low level plugin used to dispatch a call to a Snap! Website. This is the one plugin that the snap_child object calls once ready.

The path of the HTTP request is used to determine whether a page exists as is in the database. If so, it uses the page owner information to know which plugin owns that page (most pages are owned by the output plugin.) If the plugin is not currently installed, you get a 404 Plugin Missing error.

If the plugin exists and is installed, we call its execute function. Many plugins will in turn use the layout and content plugins to generate the ...


The password plugin is used to handle user passwords. Especially, it offers a way to define a password policy.

At this point the password policy offered is as found on most website, not the best as we already know, but certainly much better than not having a policy at all, especially if you have an e-Commerce website. The plugin also offers a function to generate a password that will validate against the current password policy of the website.

Note that various ways to log in your website can each include a different type of password policy. For example, the oauth2 plugin offers its own ...


The output plugin is an extension to the content plugin. It is used to actually output the content as it also has access to the layout and messages plugins. This helps in having a simple dependency tree between our various plugins.

The output plugin also includes a few low level JavaScript libraries, its own, called output.js, an extension to allow popups, called popup.js, and external libraries such as jquery.js.

The output is also defining various default for all the other plugins such as the default plugin logo that looks like a puzzle piece.

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

Contact Us Directly