Welcome to Nocterra
===================
    Nocterra is a freedom-respecting Content Management System that
helps you build comprehensive websites with a focus on speed, privacy,
security, and accessibility.

    Nocterra is free software, as in libre.
It is copyrighted 2005-2026 by ASK-Solutions and released under
the GNU Affero General Public License version 3. Please see
the file license.txt for details. For the official user, developer
and administrator documentation, please visit https://www.nocterra.org/.



System Requirements
===================

    Nocterra can work on any web server or hosting plan capable of
running PHP scripts. The latest PHP version is recommended.
The minimum supported PHP version is PHP 5.6. Nocterra works best
with PHP 7.2, PHP 8.0 or greater. Please note that anything below
PHP 8.2, such as PHP 8.1 or 7.x, is end-of-life.

    As a minimum server specification, at least 2 GB of RAM and an
Intel Core2 Duo, Intel Atom 330 or comparable CPU is recommended. The
minimum free disk space required is 5 MB, but this depends heavily on
the website's contents, such as images, video and log files.



Installing Nocterra 0.99.5
==========================

    To install Nocterra, unpack the downloaded archive, which you probably
already have done, as you are reading this file. Copy the contents of the
base directory to your web server's document root. Copy the supplied .htaccess
file to your web server's document root or copy its contents in your already
present .htaccess file. Use the supplied site.example.php file to create a
site.php file with the configuration for your website in the document root
of your webserver. Give all files and directories proper access rights.
Make sure that Nocterra can create a directory named cache.

    To install one or multiple extensions present in the extensions
directory of the Nocterra archive: copy the files in, for instance the 
extensions/slideshow directory, into your server's document root. Some 
extensions may require extra configuration.


Maintenance and Support
=======================

    Nocterra development is coordinated through ASK-Solutions' own
project management, issue tracking and version control systems. Public
releases are prepared from a single upstream development line.

    Maintenance and feature development is primarily request-driven and
is supported by collaborating partners, donations, grants and foundation
proceeds. Requested changes are implemented for the general Nocterra
project and released through the upstream development line, either as
part of Nocterra itself, as an extension or as a separate add-on.
Before public release, changes are tested and evaluated in
pre-release builds and on real Nocterra-based websites maintained by
ASK-Solutions and collaborating partners.

    For support, installation help, bug reports, feature requests,
suspected security issues or access to the current upstream development
sources, please use the support options provided on
https://www.nocterra.org/.


Changelog
=========

Nocterra 0.99.5
---------------
2026-06-15 #768: Replace __DIR__ with own defined constant
2026-06-13 #865: Incorporate central file modification time cache
2026-06-12 #858: cacheGetSystemDependencies always returns empty list
2026-06-11 #864: Improve cache API functions
2026-02-18 #399: Add the ability to set the class for the body, navigation and footer  per page
2026-02-13 #859: Incorrect OpenGraph URL is sent in metadata for multi-language sites
2026-01-22 #855: Blog: blogRefreshTOCCacheFromArticles can fail for tocType year because of integer versus string
2026-01-22 #857: Blog: blogGetTOCCacheSection should invalidate cache instead of relying on unlink
2026-01-22 #856: Blog: blogGetTOCCacheSection $create = TRUE ignored when the toc cache for a section is still unknown
2026-01-22 #854: Blog: blogRefreshTOCCache checks wrong array key
2026-01-22 #853: Blog: infinite loop with deep nested article sources
2026-01-19 #852: Move toc_prologue, toc_epilogue, list_prologue and list_epilogue outside the toc/list div
2026-01-14 #849: Link processing regex in generateFromContent contains error
2026-01-11 #848: keyword checked twice in compileLanguages()
2026-01-11 #847: environment.dynamicMaxAge is misspelled
2026-01-08 #846: Remove html elements from site meta
2026-01-08 #830: Blog: Remove html elements from titles to generate urls
2026-01-08 #831: Blog: iconv can fail resulting in empty id or url without error or warning logged
2026-01-08 #842: Mark non-canonical pages as index but nofollow by default to prevent link fan-out
2026-01-08 #844: Incorrectly named variable in shutdown handler
2026-01-08 #843: Content-Security-Policy header code handles error incorrectly
2026-01-07 #841: Head should include current page with language in link rel alternate hreflang
2026-01-07 #834: blog: blogGetArtcleUrl uses $category instead of $author
2026-01-07 #833: format_datetime() references $format instead of $formatDate
2026-01-07 #827: Blog: Add option to auto generate a TOC at the top of an article
2025-11-21 #765: PHP Warnings after "FATAL: Host xxxx.yyy not found in settings"
2025-11-21 #825: Add opengraph and twitter vocabularies namespace prefix to head
2025-11-20 #824: Breadcrumbs RDFa suppression logic incorrect
2025-11-20 #823: Breadcrumbs RDFa incorrect quotation marks in position output
2025-11-19 #822: blog: accept optional publication modification time
2024-12-07 #774: Blog: Syntax error logged but value used for seq, published and updated fields
2024-12-07 #778: Improve readability of log messages for CSP reports
2024-12-07 #775: blog: blogLoadArticle looks for language in key+value pair instead of in the key
2024-12-07 #770: Fix PHP 8.1+ deprecated functions/syntax issues
2024-11-29 #771: Change log message No resource match leaving alone... to debug level
2024-11-28 #772: Forms: fix FORM_BLANK misnaming
2024-09-20 #767: Add the ability to specify a different (shorter) name for the navigation menu

Nocterra 0.99.4
---------------
2024-08-16 #763: CSP: frame-ancestor should be frame-ancestors
2024-08-16 #762: Slideshow: Remove inline script
2024-08-15 #761: Comparing URL against blog without check if blog is active
2024-07-14 #754: Double breadcrumb for / on single language domain
2024-07-10 #753: Add the ability to exclude paths from file time stamping
2024-07-10 #752: File time stamping does not handle URL encoded characters like %20
2024-07-09 #751: blog: resync default of blogGetSortedTOCCache with config default
2024-07-09 #750: blog: Article definitions not loaded in blogGenerateArticleContent
2024-07-09 #749: Suppress E_WARNING when cache is missing or removed
2024-07-09 #748: Add %sec% and %title% to default sort order
2024-07-06 #746: blog: default toc order is set to %time% instead of %published%
2024-07-05 #745: blog: blogGetArticleDescription only loads article body not headers
2024-07-05 #744: blog: Tag list does never contain links
2024-07-03 #742: URLs starting with a scheme like mailto: or fragment should not be processed
2024-07-02 #741: Accidentally saves blog cache in the site's menu cache
2024-07-02 #740: Saves uncompiled site.php into cache
2024-06-28 #739: E_Warning in layoutCompileLanguages when no variants configured
2024-06-28 #731: Blog: Internal server error 500 page returned when URL has extra space in title
2024-06-27 #737: Remove CSP from (cached) HTML after copying it to the response header
2024-06-27 #738: Remove &lt;!--nocterra-end-of-body--&gt; when messages are off
2024-06-27 #736: Link processing sometimes causes extra &gt; in output
2024-06-27 #735: Add blog article URL/link processing to pages
2024-05-09 #726: Generate URL's in sitemap always in canonical scheme

Nocterra 0.99.3
---------------
2024-03-15 #713: Add the ability to specify RDFa object type in menu
2024-03-15 #709: Move referrer settings to page and variant
2024-03-15 #708: Move footer settings to page and variant
2024-03-14 #712: Improve blog article RDFa
2024-03-11 #711: Configure TOC to have it's items formatted depending on article attribute
2024-03-09 #707: Add the ability to specify the sort order of a TOC
2024-03-08 #710: Per category toc_item is collected but not used
2024-03-07 #706: Add support for single size source set
2024-03-06 #705: title_prefix and title_postfix missing in blogLoadArticle
2024-03-06 #704: Current TOC hidden from menu when TOC type is added added to menu 
2024-03-06 #176: Add the ability to have prologue and epilogue per section instead of only for the body
2024-03-06 #695: Add layout variants that can be selected from a page
2024-03-02 #674: Add support for Content Security Policy Reporting
2024-03-01 #673: Add support for Content Security Policies
2024-02-27 #703: Double slash by getPathMenuItem for PATH_URL mode for absolute URLs
2024-02-25 #702: Use system dependencies to determine changes to site.php cache
2024-02-25 #701: Make scripts configurable similar to stylesheet configuration
2024-02-25 #108: Consolidate breadcrumbs configuration
2024-02-24 #400: Add functions to more easily define a per page prologue and epilogue
2024-02-23 #700: blogExtendMenu incorrect determination of flat vs nested menu
2024-02-23 #696: Leading slash added to links for external URL's in the menu
2024-02-23 #521: Domain / Menu group support
2024-02-22 #274: Make the referer location available at more points
2024-02-22 #692: Add the ability to cache 404 responses
2024-02-22 #694: Layer regular pages in data and blog lists/tocs/articles
2024-02-22 #691: 404 page instead of an empty page with only a title for empty TOC and list pages
2024-02-20 #693: Incorrect &quot;No more source 'x' in article cache, removing it from y toc cache for section 'z'&quot;
2024-02-20 #546: Redirect loop caused by mod_dir 301-ing with / added and nocterra 301-ing with / removed
2024-02-19 #688: replace time and date forming in cache to be compatible with blog format parameters
2024-02-19 #690: tocSection sources not set when article cache directory is not present during cache refresh
2024-02-18 #689: Add multiple debug flags per type ie cache io, logic and URL generation
2024-02-18 #685: Add support to add TOCs to any page
2024-02-17 #679: Include debug report into fallback error 404 and 500 pages
2024-02-17 #683: Move dynamic pair expansion code to functions
2024-02-16 #687: Add support to override article title and subtitle per category
2024-02-16 #684: Add prologue, interlude and epilogue support to all TOCs
2024-02-16 #686: Add support to override TOC title, item, prologue... per author, category and tag
2024-02-16 #678: Add support for category and tag list next to year list
2024-02-15 #682: Multiple menu items can get marked as current page
2024-02-15 #681: Breadcrumbs nolink only checks for presence not also value
2024-02-12 #19 : Streamline path, link and image generation functions
2024-02-05 #375: Change the storage model for blog articles
2024-02-05 #675: Blog cache has trouble to detect new sources and removed sources
2024-02-02 #677: image function generates IMG element without filename in src attribute
2024-01-22 #662: Add support for source sets to images
2024-01-16 #16:  Be able to sort languages in the language selector
2024-01-16 #540: Add support for 307
2024-01-16 #368: Add debug flag to easily filter out debug messages
2024-01-16 #121: Warnings are generated when facebook is not configured
2024-01-15 #669: Tag, Category and Author URLs not localized
2024-01-15 #238: Add blog author configuration with profile information functionality
2024-01-15 #668: Add support for incongruent URLs to menu
2024-01-15 #667: Save compiled blog settings in site cache instead of preparing on each serve
2024-01-14 #666: Add support for remote resources to noLangLink and langLink
2024-01-12 #659: Redirect or a 500 instead of a 404 response when data file is deleted but page is cached
2024-01-12 #100: Add the ability to group the data files in subfolders per path component with an upper threshold
2024-01-10 #665: Make blog source directory configurable
2024-01-06 #661: Double 404 not found response generated for non blog requests
2024-01-06 #660: Internal server error due to unset variable for non 2xx responses
2024-01-06 #658: Path changes not checked for first path lookup in cache
2024-01-03 #657: non-localized urlScheme conversion only works if non-localized urlScheme is an array
2024-01-01 #64:  Add cache to sitemap
2024-01-01 #124: Cache for blog TOCs is not updated for all languages, only for the language visited first
2024-01-01 #374: URL with title of blog article
2024-01-01 #402: Add the ability to choose an URL scheme to identify blog articles
2024-01-01 #649: Specify host in host not found in settings message
2024-01-01 #648: Improve algorithm to auto create a blog article description  
2023-11-15 #643: Add support to create a list of terms that get special markup in the article
2023-11-04 #401: Add the ability to customize the blog URL base
2023-11-03 #110: Make loaded style sheets configurable
2023-11-02 #265: Heading of blog article wrong level
2023-11-02 #62:  Make CSS modular

Nocterra 0.99.2
---------------
2023-03-29 #543: Forms: Add support for text with select field
2023-03-26 #537: add the ability to exit after redirect
2023-03-25 #534: Forms add the ability to generate a BLANK form
2023-03-25 #533: Forms Add the ability to change post URL
2023-03-24 #532: Add title to image generation function
2023-03-24 #531: Add format_bytes
2023-03-24 #530: Forms: double to field in headers
2023-03-21 #525: Forms: Add newline support to form messages
2023-03-21 #524: Forms: process returns FORM_DONE without button being posted
2023-03-21 #522: Add parameter to link generation functions to return/print an expanded URL versus a parametric URL
2023-03-19 #264: Forms extension add support to set sender email address
2023-03-18 #506: Forms: Move required field attribute to list of required fields
2023-03-13 #505: Forms: Add specialised addField methods for hidden, text and textarea fields
2023-03-13 #504: Forms: Hidden fields incorrectly receive label paragraphs
2023-03-12 #503: Add setCookie and cookie domain setting support
2023-03-11 #214: Forms: add selection list inputs
2023-03-11 #497: bookkeeping_web expandmenu does not work properly
2023-03-10 #496: No error 500 output in certain parse error scenarios
2022-11-28 #424: Request for non-existing page gives wrong response code

Nocterra 0.99.1
---------------
2022-05-21 #366: Add logException helper method to cache.php
2022-05-21 #364: Only the schema in generated links is depended on modeDynamic
2022-05-21 #365: Add dummy link and image generation functions to sitemap for blog compilation
2022-05-21 #362: sitemap.php might leave $path filled from compiling languages
2022-05-21 #361: Add default modeOutputBuffer to prevent php Warning while generating sitemap for blog articles
2022-05-21 #347: Add configuration checks in cache.php
2022-05-18 #349: Separate title and logo into seperate sections (div elements)
2022-05-17 #351: Add more places/locations for the language selector and referers
2022-05-17 #287: Add functionality to the language selector to use full texts
2022-05-17 #348: Fallback to default language
2022-05-17 #350: Strict getCurrentPath returns nearest for root/home/top page
2022-05-17 #285: Add the ability to dynamically add menu items from a page
2022-05-13 #286: Add the ability to have translations in a different language for only some pages
2022-05-13 #335: Notice: Undefined index: domain in sitemap.php line 57
2022-05-13 #268: languageSelector generates links for all languages instead of used languages
2022-05-13 #267: layout.php generateHeader generated alternate links for all languages instead of used languages
2022-05-13 #344: No localization path found in settings for domain xyz to language abc
2022-05-13 #273: For compatibility with php-fpm add a default .user.ini to the nocterra sources
2022-05-13 #275: Default .htaccess has trouble with php-fpm subrequests
2022-05-12 #342: Nested Internal 500 error
2022-05-11 #341: Branding and Social images are not shown
2022-05-10 #224: Cache.php has some functions with PHP7,0+ type hinting copied over from the account addon
2022-05-10 #334: Improve and consolidate logging
2022-05-07 #276: Redirect to wrong site when multiple domains have the same language
2022-05-07 #226: Give priority over matched domain when selecting languages and alternate languages
2022-05-07 #239: Implement improved cache mechanism with structural change detection
2022-05-07 #212: Forms: add the ability to set the style
2022-05-07 #210: Forms: add readonly controls
2022-05-07 #211: Forms: add the ability to set input value after process and before generate
2022-05-07 #336: Blog articles generated links go to output buffer instead of article text
2022-05-04 #333: Redirect to https when canonical does not seem to always work
2022-02-18 #10:  Add optional images to language selector
2021-07-19 #248: Add prepend and separator to local global meta settings
2021-07-18 #247: Add website meta function and improve local global scope
2021-07-18 #246: Remove extra whitespace around separators, prologue and epilogue
2021-07-17 #245: Google sometimes sees the top level blog page (which redirects to the current year) as a bread crumb
2021-06-21 #237: Add change frequency to sitemap
2021-06-21 #236: Add RDFa support to blog
2021-06-20 #235: Add cache control to redirects and responses
2021-06-20 #234: Change to canonical scheme at domain/url mismatch redirections
2021-06-19 #66:  research: add support for https pages to sitemap
2021-06-19 #233: Blog cache placed in wrong directory
2021-06-19 #225: E_NOTICE Undefined index: dynamic_pairs in cache.php line 206
2021-06-19 #63:  Add modification date to generated output
2021-06-19 #65:  Add modification date / time to generated sitemap
2021-06-14 #232: Navigation menu IOS hover fix
2021-06-14 #231: Add RDFa support with breadcrumbs
2021-04-17 #223: PHP 7.4.0 implode deprecated glue string
2020-12-11 #206: Add time and date formatting
2020-10-25 #177: Image information could not be found, due to changed working directory for code executed from the sh
2020-10-22 #149: Add ability to add messages to a form
2020-10-18 #170: OpenGraph generation gives warning about possible undefined contentType
2020-10-18 #169: Improve capture and display of error and warnings for debugging
2020-10-16 #168: No error handling present when trying to present data from the cache: "Warning fopen..."
2020-10-16 #167: Blank page shown when an exception is thrown during displaying the error 500 page
2020-10-16 #166: No error page 500 is shown when an exception is thrown
2020-10-10 #165: Fix php include path
2020-10-10 #164: Move account.php to addons subdirectory
2020-09-21 #148: Have addons generate their dynamic content after the normal page
2020-09-20 #145: Prevent the need for recursive replacement for dynamic content
2020-09-19 #144: Correct loading of addons and creation of content by addons
2020-09-19 #147: Split off account addon which is specific to the ASK website
2020-08-12 #277: Add TOC pages for tags and categories
2020-07-23 #122: Make referer location configurable like the language selector
2020-07-10 #120: Error page 410 is not excluded from the sitemap
2020-07-05 #118: Redirect is not working from blog to last year
2020-07-05 #119: Sitemap generates a slash for blog tags containing an underscore
2020-07-04 #117: blog.php gives a warning when loaded from sitemap.php
2020-07-04 #116: Pages marked as 410-gone are listed in the sitemap
2020-07-03 #11:  Add link titles to referers block
2020-07-03 #115: Add the ability to configure the scheme which should be seen as canonical
2020-06-29 #114: Add support for Twitter Cards
2020-06-28 #113: Add support for Facebook Open Graph
2020-06-21 #109: Move loose settings to new environment setting
2020-06-20 #112: Make capital / lower case starting letter for blog tags and categories configurable
2020-06-20 #111: Underscores in pages result in a redirect with the underscore removed
2020-06-17 #107: Add support for HTTP 410 Gone
2020-06-16 #67:  Add Blog pages to sitemap
2020-06-16 #106: Be able to add keywords per blog article
2020-06-16 #99:  Add the ability to group the data files in subfolders per language
2020-06-16 #105: Double keywords get generated for tags and categories with same name
2020-06-14 #5:   Finish blog support
2020-06-12 #104: addKeywords and setKeywords modify wrong global variable resulting is non altered keywords and PHP w
2020-06-11 #101: Problem with output buffer handling. Blog output does not get substituted and fills cache with 0 bytes
2020-06-06 #103: Make the language selector configurable
2020-06-03 #82:  Add support for per domain (default) language
2020-06-03 #83:  Add support for per locale domain
2020-06-03 #98:  Port copyright setting to branding  settings
2020-05-22 #55:  Convert rest of the settings to the new branding setting
2020-05-22 #84:  Generate fully qualified links
2020-05-04 #96:  Redirect page for malformed request URI's to a correctly formed URI
2020-03-08 #76:  Add the ability to add a menu item without a followable link
2020-03-08 #74:  Add non localized version of base to sitemap
2020-03-08 #75:  Double slashes in links for base URL in output
2020-03-08 #61:  is_array does give warning is variable to be tested is undefined
2020-03-05 #71:  Hreflang PHP_ vs ISO -
2020-03-02 #33:  Add support for auto generated sitemaps
2020-02-29 #60:  Image next to paragraph and heading text flow issue
2020-02-27 #52:  Add support for NoFollow and X-Robots-Tag to exclude pages or regions
2020-02-27 #53:  Add support for hreflang to mark locale variants of a page
2020-02-25 #3:   Add support for downloadable fonts
2020-02-25 #49:  Footer isn't checked if a specific language is set
2020-02-23 #18:  Add viewport settings to header
2020-02-19 #31:  Easily perform redirects from a addon or page
2020-02-19 #32:  Add the ability to add links to forms
2020-02-19 #29:  addField ignores the type of field
2020-02-19 #30:  Form always posts to contact URL
2020-02-18 #26:  Add support for Favicon
2020-02-18 #27:  Use keyword substitution to store dynamic content in the cache
2020-02-18 #22:  Add support for seperators in the footer
2020-02-18 #28:  robots.txt gets redirected to cache.php
2020-02-18 #24:  Add prologue like a epilogue is already supported
2020-02-18 #25:  Language selector should have it's own section
2020-02-17 #21:  Links in the referer container should open in a new tab or window
2020-02-14 #4:   Add HTML based slideshow support
2020-02-13 #15:  Language(s) of generated output should conform to BCP47
2020-02-13 #17:  Add class to indicate if a menu has subitems
2020-02-13 #13:  META name Author should be configured in site.php
2020-02-13 #14:  The footer uses a too high heading level for the document structure
2020-02-12 #6:   Add a container block for social media icons with links
2020-02-12 #12:  Move site settings from cache.php to settings file
2020-02-11 #7:   URLs are not recognized in menu structure when using per language URLs
2020-02-11 #8:   Sub menus are not always present in the generated menu structure
2020-02-11 #9:   Error 404 pages are not localised even if page is present in the correct locale
2020-02-09 #-10: Disabled auto generated directory indexes
2020-02-09 #-5:  Extended multi language support with locales
2020-02-09 #-14: Add support for an epilogue
2020-02-09 #1:   Images of a site's content and the site's style are mixed
2020-02-09 #-9:  Added scalable vector graphics image format
2020-02-09 #-13: Pressing submit button is not recognized
2020-02-09 #-8:  Make more of the generated layout configurable
2020-02-09 #-12: Update php options
2020-02-09 #-7:  Add blog functionality
2020-02-09 #-11: Add check if cached file is open
2020-02-09 #-6:  Fix changing current directory
2020-02-09 #-15: Add footer support
2019-06-13 #-4:  Split into main code base and site contents

Nocterra 0.99.0
---------------
2019-04-17 #-3:  Added localized URL support
2019-04-17 #-2:  Added emailed form support
2019-04-17 #-1:  First import
8<------8<------8<------8<------8<------8<------8<------8<--
Work done before this date was not tracked or has been lost.
8<------8<------8<------8<------8<------8<------8<------8<--

