# Geeklog Configuration

## Configuration files

Previous versions of Geeklog used one huge file called config.php that held all the core configuration options. As of Geeklog 1.5.0, most of the configuration options have been moved to the database and can now be reached from the Configuration admin panel within Geeklog.

For technical reasons, some configuration options still have to be stored in files. There are two such configuration files now:

- db-config.php
- siteconfig.php

These files are updated when you install Geeklog and you will not normally have to edit them manually.

# Configuration options

Geeklog's configuration options are grouped like this:

- Site
- Articles and Trackback
- Theme
- Blocks
- Users and Submissions
- Images
- Languages and Locale
- Miscellaneous
- File Manager

## Site

### Site: Site

Variable | Default Value | Description
--- | --- | ---
site_url | http://www.example.com | Base URL for your site (no trailing slash)
site_admin_url | http://www.example.com/admin | Base URL of the admin area of your site (no trailing slash). You won't have to change this normally, but some hosting services use a predefined "admin" directory for other purposes. In this case, you can rename Geeklog's admin directory and adjust the URL accordingly to avoid conflicts.
site_name | Geeklog Site | Name of your site
site_slogan | Another Nifty Geeklog Site | Slogan for your site. This is added to the HTML title field.
path_site_logo | '' (empty) | Logo image filename and absolute path. For example if you use the Denim Three theme this would be `/layout/denim_three/images/logo2.png`. This information is used along with the site name by the Publisher property with Structured Data. This option is not dependent on what theme is selected and will be used for all themes (unless a theme has an override for this option). For more information also see the section on Structured Data below.
site_disabled_msg | 'Geeklog Site is down. Please come back soon.' | This contains the message to display when a Geeklog site is disabled. If the text begins with "http:" then visitors are redirected to that URL. Note: The option which actually disables the site can be found in the siteconfig.php file.
owner_name | '' (empty) | The name of the owner of the site. This is used in the copyright notice if set, else the site name is used.
copyrightyear | (disabled) | Set this to the year you want to appear in the copyright notice of your site's footer. If not set, Geeklog will use the current year.
url_rewrite | false | Enable (true) or disable (false) URL rewriting. Also see the section on URL Rewriting below.
url_routing | Disabled | Enable or disable URL routing. Caution: This feature takes effect only when URL Rewriting is enabled. The setting 'Enabled (without "index.php")' requires additional settings for your web server to work properly. See the section on URL Routing below for more information.
cdn_hosted | false | Enable (true) or disable (false) CDN-hosted source for jQuery, jQuery UI and uikit.
meta_tags | Disabled | If "Enabled" (1) the meta tags for articles and topics will be displayed. If none are found, then the default will be used. The default will also be used for any page that doesn't have meta tags. If "Enabled (Default for Homepage only)" (2) then it behaves the same as "Enabled" except, the defaults are used only for the Homepage. If "Disabled" (0) then Meta tags are not used. Please note, if enabled and the article has it's own meta keywords then the article page will also display a list of up to 5 related articles (displayed under the title "You might also like"). This relation is based on how many keywords the article shares with others and how new the other articles are.
meta_description | 'Geeklog, the open source content management system designed with security in mind.' | The default meta description for your site.
meta_keywords | 'Geeklog, Blog, Content Management System, CMS, Open Source, Security' | The default meta keywords for your site.
cookie_consent | Enable | Enable or disable Cookie Consent. Themes that support it will use the About Cookies Link (if it is not empty) for the "Learn More" button of the consent. See the About Cookies Link below for more information.
about_cookies_link | '' (empty) | An external or internal link to the About Cookies page. If linking to an internal page please do not include the domain of your site. For example to link to an article, you would add: `/article.php?story=some_article_id`. If Cookie Consent is enabled above, Themes that support it will use this link (if it is not empty) for the "Learn More" button of the consent.
terms_of_use_link | '' (empty) | An external or internal link to the Terms of Use or Terms of Service page. If linking to an internal page please do not include the domain of your site. For example to link to a page, you would add: `/staticpages/index.php?page=some_page_id`
privacy_policy_link | '' (empty) | An external or internal link to the Privacy Policy page. If linking to an internal page please do not include the domain of your site. For example to link to a page, you would add: `/staticpages/index.php?page=some_page_id`
ip_anonymization | -1 | IP anonymization policy. -1 if you don't want to anonymize IP addresses, 0 for instant anonymization. If you set X (an integer), IP anonymization will be performed after X seconds have passed. Please note that the Geeklog Cron (cron_schedule_interval) needs to be enabled to anonymize IPs. This only anonymizes IP addresses stored in the Geeklog database (that supports this feature). To remove all IP data, the Geeklog log files and web server log files should be deleted as well. Anonymization only happens after the cron job is triggered. This means there most likely will be a delay in anonymization until the cron job is run. Setting anonymization to instant (0) or a low value may interfere with plugins and/or the functionality of Geeklog. For example, in some cases IPs are used to determine if a visitor is behaving badly by submitted spam or content to often.

### Site: Mail

Variable | Default Value | Description
--- | --- | ---
site_mail | admin@example.com | E-mail address for all admin mail
noreply_mail | noreply@example.com | This is the sender's address of emails sent by the system when users register etc. This should be either the same as $_CONF['site_mail'] or a bouncing address to prevent spammers from getting your email address by registering on the site. If this is NOT the same as above, there will be a message in sent messages that replying to those emails is recommended.
mail_settings_backend | mail | Used to select how to send email. Can be one of 'smtp', 'smtps', 'sendmail', or 'mail'. The smtps protocol requires the PHP extension OpenSSL to work.
mail_settings_sendmail_path | /usr/bin/sendmail | If you chose 'sendmail' for the backend setting, this specifies the complete path to the sendmail binary.
mail_settings_sendmail_args | '' (empty) | If you chose 'sendmail' for the backend setting, this variable can be used to pass additional parameters to the sendmail binary.
mail_settings_host | smtp.example.com | If you chose 'smtp' or 'smtps' for the backend setting, this is the SMTP server to use.
mail_settings_port | 25 | If you chose 'smtp' (port 25) or 'smtps' (port 587) for the backend setting, this is the port number to talk to on the SMTP server.
mail_settings_auth | 0 | If you chose 'smtp' or 'smtps' for the backend setting, set this to `1` if your SMTP server requires authorization, and `0` (or leave the field empty) if it doesn't.
smtp-username | smtp-username | If you chose 'smtp' or 'smtps' for the backend setting, this is the name of your SMTP account.
smtp-password | smtp-password | If you chose 'smtp' or 'smtps' for the backend setting, this is the password for your SMTP account.
mail_cc_enabled | True | Whether to allow users to send a copy of an email to themselves.
mail_cc_default | False | Whether the carbon copy checkbox in the email form is ticked by default.
mail_charset | '' (empty) | Character set to be used for encoding email messages. If you leave this empty, $_CONF['default_charset'] will be used instead.

### Site: Syndication

Geeklog can export its headlines to a news feed in various formats (RSS, RDF, and Atom). This will let you share your news with other sites (Hint: Create a Portal block from Geeklog's Block menu to import news feeds from other sites).

Starting with Geeklog 1.3.9, feeds can be created and configured from Geeklog's Admin menu ("Content Syndication"). The following settings will only be used as the default settings for any new feeds that you create from the admin panel.

Variable | Default Value | Description
--- | --- | ---
backend | 1 | Create a feed file for the articles in rdf_file (0=no, 1=yes)
rdf_file | HTML path with "/backend/geeklog.rss" suffix | File system path for the feed file. This file allows you to share your site's headlines with others. Important: This directory path for the rss feeds MUST be part of the path_html.
rdf_limit | 10 | Limit the number of articles to export to the news feed. If the value for this setting is a number, the feed will hold this many articles. If the number is followed by a lower-case 'h' (e.g. 24h) it denotes the number of hours from which to chose the articles.
rdf_storytext | 0 | If this value is 1, then the entire introtext of the articles will be included in the news feed. Any number greater than 1 limits the introtext to that many characters (e.g. a value of 80 would only include the first 80 characters from the introtext in the feed). If set to 0, the introtext is not included in the feed.
rdf_language | en-gb | Value for the feed's language tag. Depending on your site's language and operating system, this may differ from the language setting in the locale (see above). Example: The PHP locale setting for German is 'de_DE' while the correct language setting for a German RSS feed would be 'de-DE' (note the dash instead of the underscore).
syndication_max_headlines | 0 | Upper limit for the max. number of headlines when importing a feed (into a portal block). The limit can also be set for each individual portal block in the block menu. When set to 0, all headlines are imported.
comment_feeds_article_tag |
    <p>[Original Article: <a href="%s">%s</a>%s%s]\n
| The string used to enter a tag about the article for the comment: This must take three strings, in the order: Article URL - the url to the article Article title - the title of the article Article Author tag, the result of evaluating 'article_author_tag' Comment author tag, the result of evaluating 'comment_author_tag' This is generated with a sprintf command, so each item is indicated by a %s. If you want either of the last two to be blank, set article_author_tag and/or comment_author_tag to be empty strings.
comment_feeds_article_tag_position | end | The position of the article_tag in the comment body. This indicates where the article tag, when formatted, should be inserted into the comment. This may be start, end or none.
comment_feeds_article_author_tag | '' (empty) | A tag to link to the article author's profile, and display their name. This is included in the 'article_tag', if you don't want anything in the 'article_tag' then set it to the empty string. An example of an Article Author Tag would be:
     Written By: <a href="%s">%s</a>
comment_feeds_comment_author_tag |
    , Comment By: <a href="%s">%s</a>
| A tag to link to the comment author's profile, and display their name. This is included in the 'article_tag', if you don't want anything in the 'article_tag' then set it to the empty string.

### Site: Paths

Variable | Default Value | Description
--- | --- | ---
path_html | /path/to/geeklog/public_html/ | Path to your web tree directory for your site (trailing slash necessary). This directory holds all the web pages used by Geeklog and should not be changed in the Geeklog Configuration once your site is up and running. This only should be changed by the install when migrating a site. Important: If this path is changed you MUST also update path_images, path_editors, path_themes, and path_rdf_file as these paths must reside in the path_html.
path_log | /path/to/geeklog/logs/ | File system path for the log files
path_language | /path/to/geeklog/language/ | location of the Geeklog language files
backup_path | /path/to/geeklog/backups/ | location where database backups are stored
path_data | /path/to/geeklog/data/ | File system path for the data directory, used e.g. for the user batch add feature
path_images | /path/to/geeklog/public_html/images/ | Path where Geeklog expects to find its images, including user photos and images for articles. Important: This directory path for the images MUST be part of the path_html.
path_editors | /path/to/geeklog/public_html/editors/ | Path where all WYSIWYG editors reside. Important: This directory path for the editors MUST be part of the path_html.

### Site: Database

Variable | Default Value | Description
--- | --- | ---
dbdump_filename_prefix | geeklog_db_backup | Prefix to use for the names of the backup files. Default file name will be "geeklog_db_backup_date_time.sql".
dbdump_tables_only | 0 | Enable or disable dumping of table structure only, else dump both table and table data (1 = on, 0 = off).
dbdump_gzip | 1 | Compress database dump if gzip is available.
dbdump_max_files | 10 | Limit the number of backup files to keep. Use "0" to disable purging.

### Site: Search

Variable | Default Value | Description
--- | --- | ---
search_style | 'google' | Sets the style of the results page. Can be either 'google' or 'table'
search_limits | 10,15,25,30 | The result limits a user can select. Each value must be separated with a comma.
num_search_results | 30 | The default number of results per page. Should be a value from 'search_limits' above.
search_show_limit | true | Shows (= true) or hides (= false) the page limits selection box.
search_show_sort | true | Shows (= true) or hides (= false) the 'Sort By' selection box. (When using the table style it will enable/disable column sorting)
search_show_num | true | Shows (= true) or hides (= false) the result number.
search_show_type | true | Shows (= true) or hides (= false) the plugin name the result came from.
search_separator | &gt; (Space before and after character) | The character to display between result type sub groups.
search_def_keytype | 'phrase' | Default to one of these search methods: 'all': results must contain all of the search terms. 'any': results may contain any of the search terms. 'phrase': search for the exact phrase as entered. (default)
search_def_sort | 'Hits (desc)' | The default sort order for the search results.
search_use_topic | false | If true the last topic the user visited will be set on the advanced search page and used automatically in the search block. If false, "All" topics will be set when the user visits the advance search page, and will be used when searching via the search block.

## Articles and Trackback

### Articles and Trackback: Article

Variable | Default Value | Description
--- | --- | ---
maximagesperarticle | 5 | max. number of images you can have in an article
limitnews | 10 | Number of articles to limit the index page to, this same number will appear in the older stuff block
minnews | 1 | Minimum numbers of articles than can appear on a topic page
contributedbyline | 1 | Show author username to public, and enable search by username (0=no, 1=yes)
hideviewscount | 0 | Whether to show (= 0) or to hide (= 1) the number of views an article has had.
hideemailicon | 0 | When set to 1, this will disable the ability to send an article by email. It will also hide the email icon from articles and the "Email Article To a Friend" from the Article Options block.
hideprintericon | 0 | When set to 1, this will disable display of an article in a "printer friendly" format. It will also hide the printer icon from articles and the "View Printable Version" from the Article Options block.
allow_page_breaks | 1 | Allow usage of the `[page_break]` tag in articles (when set to 1), so that articles can spread over multiple pages.
page_break_comments | last | When the `[page_break]` tag is allowed in articles (see above), where should the article's comments be displayed: `'last'` = on the article's last page only, `'first'` = on the first page only, `'all'` = on every page. Please note that if comments are displayed on every page of articles with multiple pages, if `$_CONF['comment_on_same_page'] = false` any comment posting done by the user will result in the user to be taken back to the first page of the article. This is a limitation of the Geeklog comment library as the page of the article being displayed is not tracked.
article_image_align | right | Which side of article the topic image should be shown (right or left)
show_topic_icon | 1 | Default setting for new articles and article submissions: Whether to show the topic icon (1) or not (0).
structured_data_type_default | 'core-article' | Default Structured Data Type for new articles. Structured Data markup will only be included when viewing the full article. Some plugins may also use this as the default. Supported types include: 'none' => None 'core-webpage' => WebPage 'core-article' => Article 'core-newsarticle' => NewsArticle 'core-blogposting' => BlogPosting Geeklog will add Structured Data markup (JSON-LD code) to your pages (either in the head of the page or near the actual content as it depends on caching) which increases the understanding of the page by search engines and can enhance your appearance in search results. This does not require any additional changes to your theme (unless your theme contains hard coded conflicting structured data markup). Currently Geeklog supports Structured Data for Breadcrumbs, Articles, and Staticpages. Based on the page (i.e. Article or Staticpage) and structured data type selected, Geeklog will map the data fields to the appropriate Structured Data properties. Additional Structured Data properties can be added (or some current ones changed) by using the [structureddata: ] autotag in the actual article, static page, and other supported plugins items. To use the autotag in your content remember to add the security right `structureddata.autotag` to the appropriate Security Group which gives the user [structureddata: ] autotag usage permissions (this is done by default already for article and static page admins). Here are some examples of using this autotag: `[structureddata:image height:60 width:200]/images/example.jpg[/structureddata]` This would add the image property to the structured data of the page. You could do this multiple times to add more than one image to the Structured Data. Alternately you could also include the id of the page and the type of item it is (plugin name) as well in the autotag. This has been added since some plugins which support Structured Data may not support the ability of the autotag to know what object it is embedded in. `[structureddata:image type:staticpages id:page_id height:60 width:200]/images/example.jpg[/structureddata]` For articles and static pages, the meta description is used for the structured data description property. If you wanted to change this without changing the meta description you could include an autotag like so within your content: `[structureddata:description]This is my new example description.[/structureddata]` For more on Structured Data itself, see Schema.org and Google Search Reference. To test your pages for Structured Data and see if it is setup correctly you can use the Google Structured Data Testing Tool. Please note this tool test includes checking that the Structured Data supports the AMP specification so if some errors are reported they may only deal with AMP specific issues and may be fine for normal web pages. For more on the tool itself you can read Google's guide.
structured_data_article_topic | 0 | Default setting for Articles that have structured data set and if it is displayed on the homepage and topic pages (1) or not (0). For more information also see the section on Structured Data above.
draft_flag | 0 | Default setting for new articles created by Story Admins: Whether the article's draft flag should be set (1) or not (0).
frontpage | 0 | Default setting for new articles and article submissions: Whether the article should appear on the site's frontpage (1) or only in its topic's page (0). Please note that for articles submitted to the archive topic, this setting will be ignored and the article will not appear on the frontpage.
hide_no_news_msg | 0 | When set to 1, hide the "No News To Display" message on the index page (e.g. when viewing a topic without any articles in it)
hide_main_page_navigation | false | When set to frontpage, this option will hide the "Google paging" navigation from index.php, i.e. from the site's frontpage. When set to frontpage_topics it will hide the navigation from the frontpage and all topic pages. This may come in handy for more advanced layouts but will of course prevent people from easily reaching older articles.
onlyrootfeatures | 0 | This restricts the featuring of articles to root user(s). If you have several article admins who can create content that is not visible to other article admins, and such a content is featured, another admin might think its ok to feature his own content. To prevent that two admins unknowingly take features from each other away, only a user who can see all content (= root) should be able to feature an article.
aftersave_story | 'list' | Which page to go to after an article has been saved: 'item': display the article 'list': show admin's list of articles (default) 'home': display the site's homepage 'admin': go to the "Admin Home" page, i.e. Command & Control Note: This option is ignored for article submissions. Editing an article submission will always send you back to the submission queue (i.e. "Admin Home" aka Command & Control).
related_topics | 1 | Set to display related topics on just article pages, article and topic pages, or no pages at all.
related_topics_max | 6 | Maximum numbers of topics to display for Related Topics. If 0 will display all related topics.
whats_related | 1 | Disable or Enable article What's Related block. You may also select to have no links (from the article) to be displayed in the list, or only no outbound links (pointing to other websites).
whats_related_max | 0 | Maximum numbers of items to display for the What's Related list on the article page. If 0 will display all related items found. A minimum of 2 items is required.
whats_related_trim | 26 | Max. length of the title of items listed in the What's Related list. If 0 will not trim titles. If this option is changed this will update all related links in the database for articles.
default_cache_time_article | 0 | The default cache time for an article. Possible values: 1 or more = Amount of seconds an article will be cached before it is regenerated and saved again to a new cache file. 0 = Not cached. Article is always regenerated. -1 = Always cached and only regenerated when the article is updated and saved through the article editor.
blocks_article_topic_list_repeat_after | 1 | The Article Topic List Blocks location repeats after this many article introductions are displayed on a topic page (includes the homepage). If set to 0 this block location will be disabled.

### Articles and Trackback: Trackback

Variable | Default Value | Description
--- | --- | ---
trackback_enabled | true | Enable (true) or disable (true) trackback comments. This applies to both sending and receiving trackback comments.
trackback_code | 0 | Default value for new articles: Trackback enabled (0) or disabled (-1)
trackbackspeedlimit | 300 | Number of seconds between two trackbacks / pingbacks from the same IP address.
check_trackback_link | 2 | This option can be used to check the validity of a trackback. You can check if the URL in the trackback actually contains a link back to your site (otherwise, it's probably spam). You can also check if the trackback was sent from the proper IP address, i.e. the IP of the site in the trackback URL (again, if they don't match, it's probably spam). Note that you can add up the values below to do more than one check (but using option 1 and 2 doesn't make sense and will be treated as if you requested option 2). Options are: 0 = don't perform any checks, 1 = check only for your site's main URL (`$_CONF['site_url']`), 2 = check for the exact URL of the entry (e.g. an article) on your site, 4 = check IP address of the sender of the trackback against the site referred to in the trackback URL. Example: `$_CONF['check_trackback_link'] = 6; // check for the exact URL (2) and proper IP address (4)`
multiple_trackbacks | 0 | How to handle multiple trackbacks and pingbacks from the same source: 0 = keep only the first, reject any further trackbacks / pingbacks; 1 = overwrite, i.e. only keep the latest trackback / pingback; 2 = allow multiple trackbacks / pingbacks, i.e. list them all

### Articles and Trackback: Pingback

Variable | Default Value | Description
--- | --- | ---
pingback_enabled | true | Enable (true) or disable (true) pingback support. This applies to both sending and receiving pingbacks.
pingback_excerpt | true | Unlike Trackbacks, Pingback don't include an excerpt of the text from the site linking to us. When this option is enabled, Geeklog will try and create an excerpt by searching the backlink on the site that sent the Pingback, extract a piece of the text near the link, and use that as the excerpt for the Pingback.
pingback_self | 0 | Pingbacks are sent out automatically to all the URLs linked from an article - which includes articles on your own site that you may have linked in the article. This option lets you specify how these "self pingbacks" are to be handled: 0 = skip them, i.e. don't send pingbacks to articles on your own site; 1 = allow them, but obey the speed limit; 2 = allow them and ignore the speed limit. If your article contains more than one link to other articles on your site, then option 1 is probably of limited use, as it would only pingback the first linked article and run into the speed limit for the others.
ping_enabled | true | Enable (true) or disable (true) the ability to ping weblog directory services like Technorati.

## Theme

### Theme: Theme

Variable | Default Value | Description
--- | --- | ---
theme | Denim Three | Default theme to use on the site. Changing this setting will affect all new users, existing users (only if "Allow User Themes" is set to false) and anonymous users. When "Allow User Themes" is set to true, existing users will have to update the theme setting on the "My Account" user page and the Layout tab if they want to change themes.
doctype | HTML 4.01 Strict | Document Type Declaration (aka DOCTYPE aka DTD) to use for all the themes on your site, assuming they use the {doctype} variable instead of a hard-coded DOCTYPE in their index.thtml.
menu_elements | array('contribute', 'search', 'stats', 'directory', 'plugins') | Specifies which entries are displayed in the site's menu bar (if your theme uses the `{menu_elements}` variable to display the menu bar). Can be any combination of 'home', 'contribute', 'search', 'stats', 'directory', 'login', 'prefs', 'plugins', and 'custom' where 'plugins' is the same as the `{plg_menu_elements}` variable, i.e. a list of the menu entries provided by plugins, and 'custom' displays the entries returned by a custom function `CUSTOM_menuEntries` (see lib-custom.php for details).
path_themes | /path/to/geeklog/public_html/layout/ | Path to where all theme directories reside. This cannot be changed from the default (which is "/path/to/geeklog/public_html/layout/"). For more information see path_html.
cache_templates | true | If set to true, all templates will be cached, which should improve performance of the web site. In some cases, caching could slow performance down. For example, if the disk access is slow on the web server or if the web server is accessing Windows shared drives, setting this option to FALSE may improve performance. Another reason to disable caching of template files is if you use autotags in the themes template files that need to display updated information to the visitor (since the autotags would only be run at the time when the cache file is created. Note: As stated this only affects the theme template files. Caching of other items like Articles, Blocks, Staticpages, etc... have there own config options for caching.
cache_mobile | true | If set to true, mobile devices (phones and tablets) will be cached separately from computers. This includes the template files, blocks, articles and other plugins which may use Geeklog's template cache system. You should only set this to false if you do not plan to display different information depending on if a mobile device is detected being used by the user. Performance will be improved slightly if set to false since less cached files will be created.
cache_resource | true | If set to true, JavaScript files and CSS files will be combined, minified and cached. Note: For themes that use the file "style.css.php" like the Modern Curve theme will ignore this setting and automatically always cache resources as some processing on the css files are required for the theme to display correctly.

### Theme: Advanced Settings

Variable | Default Value | Description
--- | --- | ---
show_right_blocks | false | If set to true, the right-side column of blocks will be displayed on all pages (instead of only on the index page).
showfirstasfeatured | 0 | When set to 1, this will render the first article on any page using the templates for a featured article, even if that article is not featured. This will even be applied to the first article on page 2 of a topic page, for example.
template_comments | false | Each template contains some internal comments (surrounded with {# #} ) that are removed before the template is sent to the browser. If this option is set to True, the {# and #} will become <!-- --> HTML comments and will be included in the output to the browser. Also, at the beginning and end of each template, its physical location on the server, will be included in the output only if you are in the Root group and the `debug` property of the template class is set to the value other than 0. This feature is useful if you are trying to determine which template controls a specific display item, or when developing a new theme. If this is set to False, the comments are removed prior to sending the output to the browser.

## Blocks

### Blocks: Admin Block

Variable | Default Value | Description
--- | --- | ---
sort_admin | false | If set to true will sort the entries in the Admin's block and the icons on the Command and Control page alphabetically.
link_documentation | 1 | Add a link to Geeklog's documentation to the Admin block. Set this to 0 if you don't want that link to show up.
link_versionchecker | 1 | Add a link "GL Version Test" to the Admin block so that you can easily check if your Geeklog version is up to date. Set this to 0 if you don't want that link to show up. Note: The link is only displayed to members of the Root group anyway.

### Blocks: Topics Block

Variable | Default Value | Description
--- | --- | ---
sortmethod | alpha | alpha = Sort topics in topic list alphabetically sortnum = Sort topics in topic list by the given sort number
showstorycount | 1 | Show the number of articles in a topic in the Sections block (0=no, 1=yes)
showsubmissioncount | 1 | Show the number of article submissions for a topic in the Sections block (0=no, 1=yes)
hide_home_link | 0 | Hide the "Home" link from the Sections block (0=no, 1=yes)

### Blocks: Who's Online Block

Variable | Default Value | Description
--- | --- | ---
whosonline_threshold | 300 | How long, in seconds, users can be idle before removing them from the whosonline block
whosonline_anonymous | 0 | If enabled (i.e. set to 1), anonymous users will only see the number of registered users currently online in the Who's Online block but not their names. Only logged-in users will see the names of other users that are currently online.
whosonline_photo | 0 | If enabled (i.e. set to 1), and a photo exists for the user, a thumbnail of that photo will be displayed. Else, a photo icon will be displayed.

### Blocks: What's New Block

Variable | Default Value | Description
--- | --- | ---
newstoriesinterval | 86400 | Articles are "new" if they are this many seconds old.
newcommentsinterval | 172800 | Comments are "new" if they are this many seconds old.
newtrackbackinterval | 172800 | Trackback comments are "new" if they are this many seconds old.
hidenewstories | 0 | Set to 1 to hide new articles from the What's New block.
hidenewcomments | 0 | Set to 1 to hide new comments from the What's New block.
hidenewtrackbacks | 0 | Set to 1 to hide new trackback comments from the What's New block.
hidenewplugins | 0 | Set to 1 to hide new entries by plugins from the What's New block.
title_trim_length | 20 | Max. length of the title of items listed in the What's New block.
whatsnew_cache_time | 3600 | The What's New Block will be cached for no longer than this many seconds. If 0 caching is disabled.

## Users and Submissions

### Users and Submissions: Users

Variable | Default Value | Description
--- | --- | ---
disable_new_user_registration | false | When set to true completely disables all options to sign up as a new user.
allow_user_themes | 1 | If set to 1, users can set their own theme that the site uses
allow_user_photo | 1 | If set to 1, users can upload a photo to their profile
allow_username_change | 0 | If set to 1, users will be allowed to change their username (login name). Articles and comments posted under the old username will automatically show the new username.
allow_account_delete | 0 | If set to 1, users will be allowed to delete their accounts. Articles and comments posted under that account will be kept and show up as being posted by "Anonymous".
hide_author_exclusion | 0 | If set to 1, the option to to exclude certain authors from being seen is hidden from the user's preferences.
show_fullname | 0 | Whether to display a user's full name (= 1) or only their username (= 0). For users that haven't entered their full name, Geeklog will always display the username.
require_user_email | true | If set to true, users without email addresses will be required to add an email address to their account and need to verify it before they can continue to use the website while logged in. This affects remote accounts as some may not return an email address to Geeklog when the account is created due to permissions from the remote service. When this is set to true Geeklog will check for an email address when a user logs in. If there is not one, the user account status will be switched from "Active" to "New Email Required".
show_servicename | true | If you allow users to log in with accounts on remote services (like LDAP), this option will at the service's name to the username to avoid confusion with local users of the same name. Set to false to disable.
custom_registration | false | When set to `true`, Geeklog will let you use your own signup form for new user registrations. Please see the file lib-custom.php that ships with Geeklog for an example.
standard | true | Whether to allow normal logins into the site, i.e. with a user account that only exists in your site's database.
openid | false | Whether to allow logins using OpenID. This will display a special OpenID login below the normal login field. If User Submissions is enabled then this login type will be disabled. It is currently not possible to have these type of accounts go through the submission process. Note: Currently only OpenID 1.1 is supported.
3rdparty | false | Allow (when set to true) users who already have an account with some other service to log into your Geeklog site with the login for that service. Currently supported: LDAP. Please note that to enable login for a specific service, you need an authorization class in system/classes/authentication. If you don't want to allow LDAP users, simply remove the class file for the unwanted service. If User Submissions is enabled then this login type will be disabled. It is currently not possible to have these type of accounts go through the submission process. See Remote Authentication in Geeklog for more information.
oauth | false | Whether to allow logins using OAuth. This will display a special OAuth login below the normal login field. Note: Currently OAuth 1.0, 1.0a, and 2.0 is supported (depends on what the OAuth provider supports). Current login methods supported: Facebook, Twitter, LinkedIn, Google, Microsoft, and Yahoo. To enable logins for a specific method, you need to enable the method below and you must also update the config options with the correct key and secret string values. The PHP extension OpenSSL is required to be loaded for OAuth logins to work. If User Submissions is enabled then this login type will be disabled. It is currently not possible to have these type of accounts go through the submission process. See our Wiki OAuth page for more information.
google_login | false | Allow (when set to true) users who already have an account with Google to log into Geeklog with said account using OAuth. You must set the Google client id and client secret.
google_consumer_key | '' (empty) | Required to use Google OAuth login method. Visit the Google Developers Console to create an application to receive your client ID and client secret. See our Wiki OAuth page for more information.
google_consumer_secret | '' (empty) | Required to use Google OAuth login method. Visit the Google Developers Console to create an application to receive your client ID and client secret. See our Wiki OAuth page for more information.
facebook_login | false | Allow (when set to true) users who already have an account with Facebook to log into Geeklog with said account using OAuth. You must set the Facebook application ID and secret.
facebook_consumer_key | '' (empty) | Required to use Facebook OAuth login method. Visit this Facebook Developers page to create an application to receive your key and secret. See our Wiki OAuth page for more information.
facebook_consumer_secret | '' (empty) | Required to use Facebook OAuth login method. Visit this Facebook Developers page to create an application to receive your key and secret. See our Wiki OAuth page for more information.
linkedin_login | false | Allow (when set to true) users who already have an account with LinkedIn to log into Geeklog with said account using OAuth. You must set the LinkedIn API and secret key.
linkedin_consumer_key | '' (empty) | Required to use LinkedIn OAuth login method. Visit this LinkedIn Developers page to create an application to receive your API and secret key. See our Wiki OAuth page for more information.
linkedin_consumer_secret | '' (empty) | Required to use LinkedIn OAuth login method. Visit this LinkedIn Developers page to create an application to receive your API and secret key. See our Wiki OAuth page for more information.
twitter_login | false | Allow (when set to true) users who already have an account with Twitter to log into Geeklog with said account using OAuth. You must set the Twitter consumer key and secret.
twitter_consumer_key | '' (empty) | Required to use Twitter OAuth login method. Visit this Twitter Application page to create an application to receive your consumer key and secret. See our Wiki OAuth page for more information.
twitter_consumer_secret | '' (empty) | Required to use Twitter OAuth login method. Visit this Twitter Application page to create an application to receive your consumer key and secret. See our Wiki OAuth page for more information.
microsoft_login | false | Allow (when set to true) users who already have an account with Microsoft to log into Geeklog with said account using OAuth. You must set the Microsoft client id and client secret.
microsoft_consumer_key | '' (empty) | Required to use Microsoft OAuth login method. Visit the Microsoft Seller Dashboard to create an application to receive your client id and client secret. See our Wiki OAuth page for more information.
microsoft_consumer_secret | '' (empty) | Required to use Microsoft OAuth login method. Visit the Microsoft Seller Dashboard to create an application to receive your client id and client secret. See our Wiki OAuth page for more information.
yahoo_login | false | Allow (when set to true) users who already have an account with Yahoo to log into Geeklog with said account using OAuth. You must set the Yahoo consumer key and consumer secret.
yahoo_consumer_key | '' (empty) | Required to use Yahoo OAuth login method. Visit this Yahoo Developer page to create an application to receive your consumer key and consumer secret. See our Wiki OAuth page for more information.
yahoo_consumer_secret | '' (empty) | Required to use Yahoo OAuth login method. Visit this Yahoo Developer page to create an application to receive your consumer key and consumer secret. See our Wiki OAuth page for more information.
github_login | false | Allow (when set to true) users who already have an account with GitHub to log into Geeklog with said account using OAuth. You must set the GitHub client id and client secret.
github_consumer_key | '' (empty) | Required to use GitHub OAuth login method. Visit this GitHub Developer page to create an application to receive your client id and client secret. See our Wiki OAuth page for more information.
github_consumer_secret | '' (empty) | Required to use GitHub OAuth login method. Visit this GitHub Developer page to create an application to receive your client id and client secret. See our Wiki OAuth page for more information.
aftersave_user | 'item' | Which page to go to after a user has been saved: 'item': display the user's profile 'list': show admin's list of users (default) 'home': display the site's homepage 'admin': go to the "Admin Home" page, i.e. Command & Control

### Users and Submissions: Spam-X

Variable | Default Value | Description
--- | --- | ---
spamx | 128 | Tells Geeklog's Spam-X plugin what to do when a spam post has been detected. The value is the sum of all values that uniquely identify the Spam-X modules that should be executed. E.g. the "delete" action module uses 128, the "email admin" module uses 8, so if both modules should be executed, this option should be set to 128 + 8 = 136.

### Users and Submissions: Login Settings

Variable | Default Value | Description
--- | --- | ---
lastlogin | true | Whether to keep track of when a user last logged in (`= true`) or not (`= false`).
loginrequired | 0 | Login is required to access any part of the site. When set to 1, this overrides the following settings. When you only want to block access to certain parts of the site, set this to 0 and select from the following settings.
submitloginrequired | 0 | When set to 1, only registered users can submit articles and items handled by plugins, e.g. links and events
commentsloginrequired | 0 | When set to 1, only registered users can submit comments
statsloginrequired | 0 | When set to 1, only registered users can access the site stats
searchloginrequired | 0 | When set to 1, only registered users can use the advanced search. When set to 2, the simple search is blocked for anonymous users, too.
profileloginrequired | 0 | When set to 1, only registered users can view another user's profile
emailuserloginrequired | 0 | When set to 1, only registered users can use the email submission form to send an email to another user
emailstoryloginrequired | 0 | When set to 1, only registered users can email articles
directoryloginrequired | 0 | When set to 1, only registered users can access the list of past articles
passwordspeedlimit | 300 | Minimum delay between two requests for a new password, in seconds.
login_attempts | 3 | Max. number of login attempts before the speedlimit (see below) kicks in and further logins are blocked for the given amount of time.
login_speedlimit | 300 | How many seconds have to pass before another login attempt can be made after `$_CONF['login_attempts']` (see above) login attempts have failed.
invalidloginattempts | 7 | Max. number of invalid login attempts of a user account before an email is sent to the Admin informing them of the situation. This is based on the max time config option below. If this config option is set to 0, then the feature is disabled.
invalidloginmaxtime | 1200 | How many seconds have to pass before an email is sent to the Admin about the max number of invalid login attempts for the user. If the threshold is reached an email will be sent to the Admin regarding a possible hack attempt of the account. One thing you need to take into consideration when specifying this time is the Login Speed Limit config option. With the current default setting for Login Speed Limit and Invalid Login Attempts, the Login Speed Limit can be triggered twice before the Invalid Login can get triggered. If the Login Speed Limit is set to high then it is possible that Invalid Login Attempts may never get triggered. If this config option is set to 0, then the feature is disabled.
enable_twofactorauth | False | If this config option is set to 1, then Two Factor Authentication is enabled. In order for each user to use Two Factor Authentication, they have to enable Two Factor Authentication in their account settings and install the Google Authenticator application on their mobile devices.
pass_alg | sha1 | Hash algorithm used to generate password hashes. Options include md5, sha1, sha256, sha512, and blowfish. sha1 is recommended for maximum portability between PHP versions, blowfish is considered the most secure
pass_stretch | 4096 | The number of iterations of the hash algorithm that should be applied to the password. Must be greater than 0. See the wikipedia article for more information.

### Users and Submissions: User Submission

Variable | Default Value | Description
--- | --- | ---
usersubmission | 0 | Enable (1) or disable (0) the user submission queue (i.e. new users must be approved before they receive their password). Note: If disabling this make sure you have no users currently in the user submission queue.
allow_domains | '' (empty) | When the user submission queue is enabled this can contain a comma-separated list of domain names from which user submissions will not be queued (but approved automatically). Regular expressions are also allowed and interpreted. Example: 'mycompany.com,myothercompany.com'
disallow_domains | '' (empty) | This is the opposite of `$_CONF['allow_domains']` (see above): A list of domain names that are not allowed in email addresses of new users. Note that this list is always used, even when the user submission queue has been switched off. Again, regular expression can be used. Example disallow email addresses with a certain domain name and from any ".edu" domain: 'somebaddomain.com,\.edu$'

### Users and Submissions: Submission Settings

Variable | Default Value | Description
--- | --- | ---
storysubmission | 1 | Enable (1) or disable (0) the article submission queue
listdraftstories | 0 | When set to 1, this will display an additional block on the submissions page (moderation.php) that lists all the articles that have the 'draft' flag set.
postmode | plaintext | Sets the default submission mode to 'html' or 'plaintext'
speedlimit | 45 | Minimum delay between submissions in seconds. This helps prevent Denial of Service (DOS) attacks
skip_preview | 0 | If 1, allows submission of articles and comments without previewing (i.e. the submission form will always have a Preview and a Submit button).
advanced_editor | false | Enable (if set to `true`) a WYSIWYG editor for article and comment submissions and static pages. Geeklog ships with CKEditor.
advanced_editor_name | CKEditor | Default editor to use on the site
wikitext_editor | false | Allow using wiki syntax in articles. This adds a third option, "Wiki-style format", to the Post Mode dropdown in the article editor (implemented using the PEAR::Text_Wiki package).
remove_4byte_chars | true | If set to `true`, 4-byte utf-8 characters, including emoji icons, will be removed when you call COM_applyBasicFilter(). If set to `false` make sure your MySQL Geeklog database, tables and column collations is already set to one that supports multi byte characters. For example if your current collation is utf8_general_ci, you will want to then convert your database, tables, and columns to the "utf8mb4_general_ci" collation before setting this option to false. If not SQL errors may happen if someone attempts to save a 4 byte character to the database that is not stripped out of the content. Note: Some third party plugins may not support a mb4 collation or this config option.

### Users and Submissions: Comments

Variable | Default Value | Description
--- | --- | ---
commentspeedlimit | 45 | Number of seconds between posting a comment for the user.
comment_limit | 100 | Maximum number of comments to show per page.
comment_mode | nested | How to display comments (threaded, nested, flat or nocomments)
comment_order | ASC | Date sort order to display comments at the top level (ASC = Oldest First, DESC = Newest First)
comment_code | 0 | Default value for new articles: Comments enabled (0) or disabled (-1)
commentsubmission | 0 | Enable (1) or disable (0) comment submission queue.
comment_edit | 0 | Allows users to edit a comment within a certain time period (see below). Anonymous users (those that did not register an account) can never edit their comments while admins can always edit comments (i.e. those with comment.edit permission). If Comment Submissions are Queued, then in most cases this setting should be set to false (0) as once a comment is submitted, a user does not have access to it until it has been approved.
comment_edittime | 1800 | How long (in seconds) a comment is editable for the user who submitted it. Requires that comments are editable (see above).
article_comment_close_enabled | 0 | Whether or not articles should be closed for comments after a certain amount of days (see next option). This is only the default setting for new articles and can be changed separately for each article.
article_comment_close_days | 30 | Number of days after which an article is to be automatically closed for comments, i.e. no new comments can be posted after that many days. Note that this is only the default value to which the "Disable Comments" option is set when creating a new article. It will not take effect unless it has also been enabled for the article.
comment_close_rec_stories | 0 | Number of most recent articles for which comment posting is allowed. Posting a new article will automatically close comments for the oldest of these articles. Set to 0 to disable this option.
allow_reply_notifications | 0 | Allow (1) or disallow (0) subscribing to comment notifications. Registered users can get an email notifying them of direct replies to comments they left.
comment_on_same_page | 0 | Enable (1) or disable (0) comment editor on same page as content (instead of loading in a separate page).
show_comments_at_replying | 0 | Show (1) or hide (0) comment list when you are replying to a comment on the comment page. If `$_CONF['comment_on_same_page']` is enabled then this setting does not matter (as the comments are already on the same page as the content).

### Users and Submissions: Likes

Variable | Default Value | Description
--- | --- | ---
likes_enabled | 1 | Disable (0) the Likes System or enable it for Users and Anonymous Users (1) or just Users (2). Anonymous users are based on IP.
likes_articles | 1 | Disable (0) the Likes System for articles or enable it with Likes and Dislikes (1) or just Likes (2). The Geeklog config option likes_enabled also must be set if you wish to enable the Likes System for articles.
likes_comments | 1 | Disable (0) the Likes System for comments or enable it with Likes and Dislikes (1) or just Likes (2). The Geeklog config option likes_enabled also must be set if you wish to enable the Likes System for comments.
likes_speedlimit | 45 | Number of seconds between using the Likes System for the user.
likes_users_listed | 5 | List the last X number of users in a tooltip on the actual number who liked or disliked the item. 0 disables this feature.
likes_block_enable | true | Enable the Dynamic Likes block that shows the most actions (likes and/or dislikes) a content item has had in a specific time frame (based on the settings below).
likes_block_isleft | 1 | Whether to display the block on the left (when set to 1) or right (when set to 0).
likes_block_order | 10 | The order the block appears in the column.
likes_block_topic_option | 'all' | Set to 'All' for block to appear on all pages. Set to 'Homepage Only' for block to appear on just the homepage. Set to 'Selected Topics' for block to appear only in Topics selected in the Topic setting. This setting only affects where the block is displayed and not what is displayed in the block.
likes_block_topic |  | The topics the block will appear for if the Topic Options is set to 'Select Topics'. This setting only affects where the block is displayed and not what is displayed in the block.
likes_block_cache_time | 3600 | The Dynamic Likes Block will be cached for no longer than this many seconds. If 0 caching is disabled.
likes_block_displayed_actions | 3 | The action types that the Dynamic Likes Block will take into account and display. Likes and Dislikes (3), Likes Only (1), or Dislikes Only (2).
likes_block_include_time | 604800 | The Dynamic Likes Block will take into account and display items that are this many seconds old. Default is 604800 seconds (1 week). 1 day is 86400 seconds, 4 weeks is 2419200 seconds. Setting this to 0 will disable this option so the block will include all items that have been liked.
likes_block_max_items | 10 | The maximum number of items to show in the Dynamic Likes Block.
likes_block_title_trim_length | 20 | Max. length of the title of items listed in the Likes block.
likes_block_likes_new_line | true | If enabled the Likes and/or Dislikes display on a new line underneath the title of the item. Else they will display right after the title.
likes_block_type | '' (empty) | Only show items in the Dynamic Links Block that match this item type. Must either be empty (for all types) or include 1 supported like type. For example 'article', 'comment', 'poll', 'page', 'forum'. The config option Links Block Sub Type may also need to be set.
likes_block_subtype | '' (empty) | Only show items in the Dynamic Links Block that match this item sub type (the matching Likes Block Type must also be specified correctly). Type must either be empty (as it may not be needed) or include 1 supported like sub type. For example if Likes Block Type is set to 'forum', then the sub type must be set to 'post'. Sub types allow plugins to have more than 1 item type that can be liked.
likes_block_group_id | Block Admin | The group used by permissions.
likes_block_permissions[0] | Read-Only | View permission for dynamic block by block Owner (Default Root User).
likes_block_permissions[1] | Read-Only | View permission for dynamic block by assigned Admin Group (see config option block_group_id).
likes_block_permissions[2] | Read-Only | View permission for dynamic block by all logged in users.
likes_block_permissions[3] | Read-Only | View permission for dynamic block by anonymous users.

## Images

### Images: Image Library

Variable | Default Value | Description
--- | --- | ---
image_lib | None | Set this to either 'imagemagick', 'netpbm', or 'gdlib' if images should be resized during upload. Leave as 'None' if you don't want images to be resized or if you don't have those packages available.
path_to_mogrify | (disabled) | If you chose 'imagemagick' for `$_CONF['image_lib']` above, then this should hold the complete path to the mogrify executable (from the ImageMagick package), e.g. '/usr/bin/mogrify' (ImageMagick 5.4.9 or newer recommended).
path_to_netpbm | (disabled) | If you chose 'netpbm' for `$_CONF['image_lib']` above, then this should hold the complete path to the directory where the binaries from the Netpbm package are kept, e.g. `'/usr/bin/netpbm/'`. Note that the path must end in a slash. Precompiled binaries for various platforms can be downloaded from the Netpbm homepage.

### Images: Upload

Variable | Default Value | Description
--- | --- | ---
keep_unscaled_image | 0 | Set this to 1 if you want Geeklog to keep the original, unscaled images after upload. The smaller image will then be used as a thumbnail and will link to the original image. Note that this may use a lot of disk space (depending on the size of your images).
allow_user_scaling | 1 | When unscaled images are kept (see above), this option lets the user chose between using the scaled or unscaled image in the article, i.e. enables the `[unscaledX]` image tag (in addition to the `[imageX]` tag).
jpeg_quality | (disabled) | Control the image quality when resizing JPEGs. All the image libraries supported by Geeklog are based on the IJG JPEG library which uses an arbitrary range of 0-100 to specify the "quality" (note that this is not a percent value). The default, when not set, is 75 which provides good quality in most cases. In some cases, higher values may provide better results. Rules of thumb: Values above 90 usually don't improve the image quality any more but only produce larger files. Values below 50 will result in poor image quality. Values of 25 and below will produce distorted images.
debug_image_upload | false | When set to `true`, this option enables debugging output to be written into Geeklog's error.log file during the upload of an image. This is useful to track down problems with the image upload and resizing.

### Images: Images in Articles

Variable | Default Value | Description
--- | --- | ---
max_image_width | 160 | Max. width of an image in pixels. If it exceeds this, it is either rejected or resized (depending on the setting of `$_CONF['image_lib']` above).
max_image_height | 160 | Max. height of an image in pixels. If it exceeds this, it is either rejected or resized (depending on the setting of `$_CONF['image_lib']` above).
max_image_size | 1048576 (equals 1 MB) | Max. size of an image in bytes. If it exceeds this, it is is rejected (even if you're using a graphics package to resize images).

### Images: Topic Icons

Variable | Default Value | Description
--- | --- | ---
max_topicicon_width | 48 | Max. width of a topic icon in pixels. If it exceeds this, it is either rejected or resized (depending on the setting of `$_CONF['image_lib']` above).
max_topicicon_height | 48 | Max. height of a topic icon in pixels. If it exceeds this, it is either rejected or resized (depending on the setting of `$_CONF['image_lib']` above).
max_topicicon_size | 65536 (equals 64 KB) | Max. size of a topic icon in bytes. If it exceeds this, it is rejected (even if you're using a graphics package to resize images).

### Images: Photos

Variable | Default Value | Description
--- | --- | ---
max_photo_width | 128 | Max. width of a user photo in pixels. If it exceeds this, it is either rejected or resized (depending on the setting of `$_CONF['image_lib']` above).
max_photo_height | 128 | Max. height of a user photo in pixels. If it exceeds this, it is either rejected or resized (depending on the setting of `$_CONF['image_lib']` above).
max_photo_size | 65536 (equals 64 KB) | Max. size of a user photo in bytes. If it exceeds this, it is rejected (even if you're using a graphics package to resize images).
force_photo_width | (disabled) | This option, when enabled, will only apply when displaying a user photo. The `<img>` tag for the user photo will be emitted with a max. width, as specified by this option. This means that the actual photo can still be larger, but will only be displayed smaller. This is useful for cases where you don't want oddly shaped user photos to break your page's layout (e.g. in a forum).
default_photo | (disabled) | When enabled, this option should point to an image (full URL required!) that should be displayed for users without a user photo. When this option is not set and a user does not have a user photo (or an avatar) then Geeklog will simply not display anything.
generate_user_icon | true | If enabled (set to true) and config option "default_photo" is disabled, a user's avatar icon will be automatically generated from their username if they don't have one. The appearance is controlled by "additional.css" in respective themes. By default CSS Variables (Custom Properties) are used to also change the color of the user icon based on their display name. This is not supported by very old browsers. If this is a concern, you can update the CSS file and set a specific background and text color. For browsers which support CSS Variables see Can I Use.

### Images: Gravatar

Variable | Default Value | Description
--- | --- | ---
use_gravatar | false | If enabled (set to true), a user's avatar image will be requested from gravatar.com if the user didn't upload a user photo (i.e. an uploaded photo always takes precedence). Please note that this option may slow down your site on pages that display a lot of userphotos for different users (e.g. forum threads).
gravatar_rating | (disabled) | Avatars submitted to gravatar.com are rated with the rating system used for movies (in the U.S.), i.e. the letters G, PG, R, or X. This option will let you chose the maximum allowed rating for an avatar. For example, a max. rating of R will make sure that no X-rated avatars will be displayed on your site (only G, PG, and R).
gravatar_identicon | (disabled) | the default image when the user hasn't uoloaded his/her avartar image to gravatar.com. You can choose from 'Mystery Man', 'Identicon', 'MonsterId', 'WAvatar', and 'Retro'. See this page for detail.

## Languages and Locale

### Languages and Locale: Language

Variable | Default Value | Description
--- | --- | ---
language | english | The default language of the Geeklog site. Additional language files may be available for download at https://www.geeklog.net. If you translate a language file, please send it to us. Also see Localization below. If you wish to remove languages from this list and what the user can pick from, just delete the corresponding language file(s) from the Geeklog language directory.
allow_user_language | 1 | If set to 1, users can select the language for the site labels from My Account.
switchlang_homepage | 0 | If set to 1, the switch language block will always redirect to the homepage. You will want to set this to 1 if you have language specific content on your site (articles, topics, staticpages) that don't have matching corresponding content in all languages that your site supports. For example if you have an English Topic (with id "topic_en") and the user is on that topic and switches the language to Japanese, if a corresponding topic with the id "topic_ja" does not exist (or the user doesn't have access to it) then a 404 error will result after the language change.
new_item_set_current_lang | 0 | If set to 1, and multiple languages for the site is setup correctly, on new items (that support multiple languages and uses Geeklog's make id function COM_makeSid) the current language id will be added to the item id. Articles and the Staticpages Plugin currently support this option. While Blocks and Topics support multiple languages they do not automatically generate an id on a new item so they do not support this option.
language_files | (disabled) | For multi-lingual content setups only: A list mapping language shortcuts ('en', 'de', etc.) to the Geeklog language files to use. These shortcuts must each contain the same number of characters and the language file must exist in the Geeklog languages directory. When creating content that supports multiple langagues (topics, articles, blocks, staticpages, etc.) you would end the id of the content with one of these shortcuts ('storyid_en' or 'storyid2_de'). This would then map this content to the specific language. For more information on how multi-language content works with Geeklog please visit our Wiki. A hreflang link element(s) will be generated for articles, staticpages and topics (and 3rd party Plugins if they support it) if Multi Language Content is setup for Geeklog. This element will only appear on the canonical link of the item, or for topics on the first page. For multi-language content sites Admins must setup both language_files and languages configuration options for the same languages. Both must either be enabled (for multi-language content) or disabled (for content of only one language).
languages | (disabled) | For multi-lingual content setups only: A list mapping language shortcuts ('en', 'de', etc.) to the language's native name ("English", "Deutsch", etc.). These shortcuts must match the shortcuts set in the "Language Files" configuration option. For multi-language content sites Admins must setup both language_files and languages configuration options for the same languages. Both must either be enabled (for multi-language content) or disabled (for content of only one language).

Also see Multi-Language Support in the Geeklog Wiki.

### Languages and Locale: Locale

Variable | Default Value | Description
--- | --- | ---
locale | en_GB | Locale for the system. This defines both the language and the country that PHP will use when deciding how to display localized information such as dates (e.g. for the names of months).
date | %A, %B %d %Y @ %I:%M %p %Z | Date format used for most of the site, including article displays. See date formats below.
daytime | %m/%d %I:%M%p | Date format used when a shorter date is needed. See date formats below.
shortdate | %x | Date format this is the shortest date. See date formats below.
dateonly | %d-%b | Short date format (day and month only), to be used e.g. in the Upcoming Events and Older Articles blocks. See date formats below.
timeonly | %I:%M %p %Z | Format string for the time only, to be used e.g. on the Event Details page. See date formats below.
week_start | Sun | First day of the week in the calendar. Can be either 'Sun' (Sunday) or 'Mon' (Monday).
hour_mode | 12 | Which format to use when submitting or editing an object with a time setting (e.g. the publish time of an article). Can be 12 (for the 12 hour am/pm format) or 24 (for the 24 hour format).
thousand_separator | , | Character to use between every group of thousands.
decimal_separator | . | Character to use before decimals.
decimal_count | 2 | How many decimal places to display.
timezone | (disabled) | If your server is located in a different timezone, use this option to set your local (i.e. your own) timezone, so that the time and date on the site match your own.

## Miscellaneous

### Miscellaneous: Cookies

These variables define the names of all of Geeklog's cookies. They can easily be changed in case there's a name collision with the cookies used by some other software package that you may use on your site.

Variable | Default Value | Description
--- | --- | ---
cookie_session | gl_session | Name of the cookie that stores the session ID.
cookie_name | geeklog | Name of the permanent cookie.
cookie_password | password | Name of the password cookie.
cookie_theme | theme | Name of the theme cookie.
cookie_language | language | Name of the language cookie.
cookie_tzid | timezone | Name of the timezone cookie.
cookie_anon_name | anon_name | Name of the cookie to store the username of anonymous users.
cookie_ip | 0 | Session ID to contain IP address of user as well as random number. This is more secure but will more than likely require dialed up users to login each and every time. (0=no, 1=yes)
default_perm_cookie_timeout | 28800 | Permanent cookie timeout in seconds (28800 = 8 hours). This is the default Auto Login time limit for the users "Remember Me For" setting. When the Auto Login expiry is set for a user it includes this value, plus the session_cookie_timeout config setting. This is so that the default_perm_cookie_timeout will always be longer than the session_cookie_timeout.
session_cookie_timeout | 7200 | Session cookie timeout in seconds (7200 = 2 hours). This is how long a session will last with no user activity. The minimum is 5 mins (or 300 seconds) and the max is 1 day (or 86400 seconds).
cookie_path | / | Cookie path (see the PHP manual for details).
cookiedomain | (empty) | The domain that the cookie is available. Geeklog will attempt to guess the correct value for this setting (based on the 'site_url' variable). See the PHP manual for details.
cookiesecure | 0 | Only set to 1 if your site uses HTTPS (see the PHP manual for details).

### Miscellaneous: Miscellaneous

Variable | Default Value | Description
--- | --- | ---
notification | array() | Send an email notification to $_CONF['site_email'] when a new article, comment, trackback or pingback has been submitted or a new user has registered with the site (or a user updated their account). The array() can hold any combination of the strings 'article', 'comment', 'trackback', 'pingback', 'user', and 'user_update' (separated by commas), depending on which notification(s) you want. Example: `array('article','user');` would send notifications when a new article has been submitted or a new user has registered. No notifications would be sent, for example, for new comments.
cron_schedule_interval | 0 | Geeklog can emulate a cronjob, i.e. trigger a certain action at a given time. The code to be executed can be provided by a plugin or through the `CUSTOM_runScheduledTask` function in your lib-custom.php. The value given is in seconds and specifies the interval in which the code should be executed (e.g. 86400 for daily activation). Please note that to trigger this action, you will need to have someone visit your sites homepage (or front page) at around the specified time. On a site with few visitors, the code may only be executed with considerable delay. Set to 0 to disable.
disable_autolinks | 0 | If set to 1, disables the autotags. I.e. the special tags in square brackets (e.g. [article:]) will not be interpreted any more.
clickable_links | true | Whether or not URLs in plain-text posting should automatically be turned into clickable links.
linktext_maxlen | 50 | Maximum text length of clickable URLs. If 0 then there is no maximum length.
compressed_output | false | If enabled and supported by both the browser and the webserver, HTML output will be compressed before sending it to the browser. This will typically result in much smaller amounts of data to be sent (usually between 20% and 25%, compared to the uncompressed output). It may, however, result in slightly more load on the webserver. For now, this feature should be considered experimental and hasn't been implemented for all HTML output yet.
frame_options | DENY | Protection against Clickjacking: This option indicates that the site's content should not be displayed in a frame. This only works, however, when the visitor's browser respects the X-FRAME-OPTIONS HTTP header. Options are to disallow all framing (Strict), only allow framing from within the same site (Same Origin), or to allow all framing (disabled). We strongly suggest not to disable this option.
page_navigation_max_pages | 7 | Maximum number of pages to show for the page navigation when visitors use a computer. Minimum of 3 pages to a maximum of 20 pages allowed.
page_navigation_mobile_max_pages | 7 | Maximum number of pages to show for the page navigation when visitors are on mobile devices. Minimum of 3 pages to a maximum of 20 pages allowed. If this value differs from the config option page_navigation_max_pages and you have enabled "Cache Templates" (cache_templates) make sure that you have also enabled the config option "Cache Mobile Devices Separately" (cache_mobile) as well.
default_cache_time_block | 0 | The default cache time for a block. Possible values: 1 or more = Amount of seconds a block will be cached before it is regenerated and saved again to a new cache file. 0 = Not cached. Block is always regenerated. -1 = Always cached and only regenerated when the block is updated and saved through the block editor.
titletoid | false | Whether or not to automatically create an id based on the title. This is used by the Article, Topic and Staticpage Editors (and other plugins that support it) and it automatically updates the id field when the user types in a Title.
404_log | true | Whether or not to log 404 errors to the 404.log file located in the logs directory.

### Miscellaneous: Debug

Variable | Default Value | Description
--- | --- | ---
rootdebug | false | When a PHP error occurs, Geeklog's error handler will only display the actual error message to members of the Root group (to prevent leakage of possibly sensitive information). When set to `true`, this information will be displayed to all users. Use only for debugging purposes! Tip: If an error prevents you from logging into your site to enable that option, you can also enable it in your siteconfig.php file.

### Miscellaneous: Daily Digest

Variable | Default Value | Description
--- | --- | ---
emailstories | 0 | Let users get articles e-mailed to them (0=no, 1=yes), aka Daily Digest. Please note that this requires cron and the use of PHP as a shell script. See the section on Cron Jobs and Daily Digest below.
emailstorieslength | 1 | When emailstories (above) is enabled, send only the title and the link to the new articles (0), or send the entire introtext (1) or send the first n characters from the introtext (where n = any other number)
emailstoriesperdefault | 0 | When set to 1, new users will be subscribed to the daily digest automatically when they register with the site.

### Miscellaneous: HTML Filtering

Variable | Default Value | Description
--- | --- | ---
user_html | <p>, <b>, <i>, <a>, <em>, <br>, <tt>, <hr>, <ol>, <ul>, <li>, <code>, <pre> | HTML tags and attributes that normal users are allowed to use in article submissions and comments. To add an attribute for a tag click the plus button beside it.
admin_html | additional HTML tags, e.g. for tables | HTML tags and attributes that admin users are allowed to use (in addition to those from user_html). Redefining a tag with additional attributes will overwrite the definition from user_html. To add an attribute for a tag click the plus button beside it.
advanced_html | additional HTML tags for use with the Advanced Editor, e.g. for images | Additional HTML tags and attributes that users are allowed to use when the Advanced Editor is enabled. To add an attribute for a tag click the plus button beside it.
skip_html_filter_for_root | 0 | When set to 1, this will allow members of the Root group to use all HTML in their posts. Use at your own risk!
allowed_protocols | array ('http', 'https', 'ftp'); | Defines which protocols are allowed in links (i.e. HTML `<a>` tags).

### Miscellaneous: Censoring

Variable | Default Value | Description
--- | --- | ---
censormode | 1 | Censor submissions and comments (0 = Disabled, 1 = Enabled, exact matches, 2 = Enabled, match start of word, 3 = Enabled, match fragment)
censorreplace | *censored* | Text to replace a censored word with. Note: If the text being checked for censored words contains tags (like HTML or BBCode) censored words may not be found if the actual word is embedded with tags. For example if "badword" was in the Censor List. The text "This is a bad<b>wo</b>rd." would not get censored because of the bold tags.
censorlist | array(a list of "bad" words goes here ...) | An array of censored words

### Miscellaneous: IP Lookup

Variable | Default Value | Description
--- | --- | ---
ip_lookup | (disabled) | The IP addresses of comment posters are logged and displayed for admin users. When this variable is set to point to a service that can do IP address lookups, it's possible to lookup the owner of an IP address by clicking on it, making it easier to report abuse to ISPs, etc. `$_CONF['ip_lookup']` should hold the complete URL to the lookup service, with a '`*`' marking the place where the IP address should go. It's also possible to use Tom Willet's NetTools package, in which case the correct setting would be `$_CONF['ip_lookup'] = $_CONF['site_url'] . '/nettools/whois.php?domain=*';`

### Miscellaneous: Permissions

Variable | Default Value | Description
--- | --- | ---
default_permissions_story[0] | Read-Write | Default permission for Owner of new articles.
default_permissions_story[1] | Read-Only | Default permission for Group of new articles.
default_permissions_story[2] | Read-Only | Default permission for all logged in users of new articles.
default_permissions_story[3] | Read-Only | Default permission for all anonymous visitors of new articles.
default_permissions_topic[0] | Read-Write | Default permission for Owner of new topics.
default_permissions_topic[1] | Read-Only | Default permission for Group of new topics.
default_permissions_topic[2] | Read-Only | Default permission for all logged in users of new topics.
default_permissions_topic[3] | Read-Only | Default permission for all anonymous visitors of new topics.
default_permissions_block[0] | Read-Write | Default permission for Owner of new blocks.
default_permissions_block[1] | Read-Only | Default permission for Group of new blocks.
default_permissions_block[2] | Read-Only | Default permission for all logged in users of new blocks.
default_permissions_block[3] | Read-Only | Default permission for all anonymous users of new blocks.
autotag_permissions_story[0] | Use | Usage permission for autotag by autotag Owner (Default Root User).
autotag_permissions_story[1] | Use | Usage permission for autotag by Article Admin Group.
autotag_permissions_story[2] | Use | Usage permission for autotag by all logged in users.
autotag_permissions_story[3] | Use | Usage permission for autotag by anonymous users.
autotag_permissions_user[0] | Use | Usage permission for autotag by autotag Owner (Default Root User).
autotag_permissions_user[1] | Use | Usage permission for autotag by User Admin Group.
autotag_permissions_user[2] | Use | Usage permission for autotag by all logged in users.
autotag_permissions_user[3] | Use | Usage permission for autotag by anonymous users.
autotag_permissions_topic[0] | Use | Usage permission for autotag by autotag Owner (Default Root User).
autotag_permissions_topic[1] | Use | Usage permission for autotag by Topic Admin Group.
autotag_permissions_topic[2] | Use | Usage permission for autotag by all logged in users.
autotag_permissions_topic[3] | Use | Usage permission for autotag by anonymous users.
autotag_permissions_related_topics[0] | Use | Usage permission for autotag by autotag Owner (Default Root User).
autotag_permissions_related_topics[1] | Use | Usage permission for autotag by Topic Admin Group.
autotag_permissions_related_topics[2] | No Access | Usage permission for autotag by all logged in users.
autotag_permissions_related_topics[3] | No Access | Usage permission for autotag by anonymous users.
autotag_permissions_related_items[0] | Use | Usage permission for autotag by autotag Owner (Default Root User).
autotag_permissions_related_items[1] | Use | Usage permission for autotag by Topic Admin Group.
autotag_permissions_related_items[2] | No Access | Usage permission for autotag by all logged in users.
autotag_permissions_related_items[3] | No Access | Usage permission for autotag by anonymous users.
autotag_permissions_block[0] | Use | Usage permission for autotag by autotag Owner (Default Root User).
autotag_permissions_block[1] | Use | Usage permission for autotag by Block Admin Group.
autotag_permissions_block[2] | No Access | Usage permission for autotag by all logged in users.
autotag_permissions_block[3] | No access | Usage permission for autotag by anonymous users.
autotag_permissions_structureddata[0] | Use | Usage permission for autotag by autotag Owner (Default Root User).
autotag_permissions_structureddata[1] | Use | Usage permission for autotag by Root Group. Please note, changing this will not affect permissions since the Root Group automatically has access to everything. To give usage permissions for this autotag to other Security Groups, assign them the feature `structureddata.autotag`.
autotag_permissions_structureddata[2] | No Access | Usage permission for autotag by all logged in users.
autotag_permissions_structureddata[3] | No access | Usage permission for autotag by anonymous users.
autotag_permissions_likes_block[0] | Use | Usage permission for autotag by autotag Owner (Default Root User).
autotag_permissions_likes_block[1] | Use | Usage permission for autotag by Blocks Admin Group.
autotag_permissions_likes_block[2] | No Access | Usage permission for autotag by all logged in users.
autotag_permissions_likes_block[3] | No Access | Usage permission for autotag by anonymous users.

### Miscellaneous: Webservices

Variable | Default Value | Description
--- | --- | ---
disable_webservices | false | Set this to `true` to disable the webservices.
restrict_webservices | false | Set this to `true` to restrict webservices usage to users with the webservices.atompub permission (e.g. those in the predefined "Webservices Users" group).
atom_max_stories | 10 | Max. number of articles returned when an Atom feed is requested through the webservices API.

Also see Using the Webservices in the Geeklog Wiki.

### Miscellaneous: Topics

Variable | Default Value | Description
--- | --- | ---
multiple_breadcrumbs | false | Set this to `true` to allow multiple breadcrumbs to display if available.
disable_breadcrumbs_topics | false | Set this to `true` to disable topic breadcrumbs.
disable_breadcrumbs_articles | false | Set this to `true` to disable article breadcrumbs.
disable_breadcrumbs_plugins | false | Set this to `true` to disable all breadcrumbs that are displayed by plugins.
breadcrumb_root_site_name | false | Set this to `true` to use the site name as the name of the breadcrumb root.

## File Manager

Geeklog-2.2.1 integrated the Rich Filemanager, an open-source file manager release under MIT license by Pavel Solomienko.

Only Root Admins, Story Admins and Static Page Admins can use the Filemanager on a fresh install.

### File Manager: General Settings

Variable | Default Value | Description
--- | --- | ---
filemanager_disabled | false | Set this to `true` to disable the Filemanager feature. Still, those in the Root group can use it.
filemanager_browse_only | false | Set this to `true` to make the Filemanager read-only mode.
filemanager_default_view_mode | grid | Default view mode. Possible options are 'grid' and 'list'.
filemanager_show_confirmation | true | Whether to show a confirmation message.
filemanager_search_box | true | Whether to show a search box.
filemanager_file_sorting | default | How to to specify output on ordering files/folders list. Possible options are: 'Name (asc)', 'Name (desc)', 'Type (asc)', 'Type (desc)', 'Modified (asc)', and 'Modified (desc)'.
filemanager_chars_only_latin | true | Whether to allow non-latin characters into folder names.
filemanager_date_format | yMMMdHm | Format of the date to display. See this page for details.
filemanager_logger | false | If set to true, the Filemanager will log server-side actions into Geeklog's error file (error.log).
filemanager_show_thumbs | true | Whether to show thumbnails.
filemanager_generate_thumbnails | true | Whether to generate thumbnails using PHP to increase performance on listing directory. Thumbnails are stored into the invisible folder '_thumbs'. If you want to make it visible, just remove it from unallowed_files configuration section.

### File Manager: Upload

Variable | Default Value | Description
--- | --- | ---
filemanager_upload_overwrite | false | If set to true, files will be overwritten on uploads if they have same names. If set to false, an index will be added.
filemanager_upload_file_size_limit | 16 | File size limit for HTML5 and the PHP connector file size check in MiB.

### File Manager: Images

Variable | Default Value | Description
--- | --- | ---
filemanager_images_ext | 'jpg', 'jpeg', 'gif', 'png', 'svg' | An array of accepted images extensions.

### File Manager: Videos

Variable | Default Value | Description
--- | --- | ---
filemanager_show_video_player | true | Whether to show browser video player.
filemanager_videos_ext | 'ogv', 'mp4', 'webm' | An array of videos extensions to embed in player.
filemanager_videos_player_width | 400 | Videos player width in pixels.
filemanager_videos_player_height | 222 | Videos player height in pixels.

### File Manager: Audios

Variable | Default Value | Description
--- | --- | ---
filemanager_show_audio_player | true | Whether to show browser audio player.
filemanager_audios_ext | 'ogg', 'mp3', 'wav' | An array of audios extensions to embed in player.

## db-config.php

As the name implies, the file db-config.php contains the database configuration. This information is put there during the initial install and you should not normally have to edit this file.

Variable | Default Value | Description
--- | --- | ---
_DB_host | localhost | Database Server (to be entered in the form: hostname:port:unixsocket). In most cases you won't need to change the default value.
_DB_name | geeklog | Database Name
_DB_user | root | Database User Account
_DB_pass | null | Database User Password
_DB_table_prefix | gl_ | Prefix to put in front of all of Geeklog's table names (to avoid name collisions with tables used by other applications)
_DB_dbms | mysql | This option tells Geeklog which type of database it's running on. Can be either `'mysql'` (for MySQL) or `'pgsql'` (for PostgreSQL).

## siteconfig.php

The siteconfig.php file holds configuration data that can not be stored in the database. Again, most of this information is put there during the installation and you should not normally have to edit this file.

Variable | Default Value | Description
--- | --- | ---
path | /path/to/geeklog/ | Base file system path for your site (trailing slash necessary)
path_system | /path/to/geeklog/system/ | Path to your system directory for your site (trailing slash necessary). This directory holds the code libraries used throughout Geeklog
site_enabled | true | A Geeklog site can be disabled quickly (e.g. for maintenance) by setting this to 'false'. Also see the site_disabled_msg configuration option.
default_charset | iso-8859-1 | Character encoding used by Geeklog when serving HTML pages or sending email. Only used if the language file did not already set another character encoding. For multi-language setups, using `'utf-8'` as the default character set is recommended.
rootdebug | (disabled) | Same as the 'rootdebug' option in the Configuration. However, sometimes an error may occur that prevents you from logging into your site and enabling the 'rootdebug' option. In such a case, you can uncomment this line and enable the option here. In addition to 'true' and 'false', you can also set this option to 'force' (only in siteconfig.php). This will enable displaying of sensitive information like passwords and cookies. In any case, the same strong warning as above applies here, too: Do not leave this option enabled on a "live" site!

## URL Rewriting

Geeklog includes a simple but useful URL rewriting feature which can help make your site more crawler friendly (i.e. the URLs of your site are more likely to be picked up by the search engine's indexing bots). This feature is supported for URLs to articles, topics, static pages, the article directory, and links.

URL rewriting means that your URLs will look like this:

Original URL | URL Rewritten
--- | ---
https://www.example.com/article.php?story=@sid | https://www.example.com/article.php/@sid
https://www.example.com/article.php?story=@sid&mode=print | https://www.example.com/article.php/@sid/print
https://www.example.com/article.php?story=@sid&page=@page | https://www.example.com/article.php/@sid/@page
https://www.example.com/index.php?topic=@topic | https://www.example.com/index.php/topic/@topic/
https://www.example.com/index.php?topic=@topic&page=@page | https://www.example.com/index.php/topic/@topic/@page
https://www.example.com/directory.php?topic=@topic&year=@year&month=@month | https://www.example.com/directory.php/@topic/@year/@month
https://www.example.com/staticpages/index.php?page=@page | https://www.example.com/staticpages/index.php/@page
https://www.example.com/staticpages/index.php?page=@page&disp_mode=print | https://www.example.com/staticpages/index.php/@page/print
https://www.example.com/links/portal.php?what=link&item=@item | https://www.example.com/links/portal.php/link/@item
https://www.example.com/links/index.php?category=@cat | https://www.example.com/links/index.php/@cat

While some search engines will pick up the first url form, Google seems to prefer the second url format and often ignores the second format.

Note: This feature may not work with all web servers. It is known to work with Apache (all versions) and known not to work with IIS (at least some older versions). Please try it out before you go public with your site.

Note: For the homepage, if on a page other than 1, the topic URL format will be followed. The topic Id that will be used to represent the homepage is a dash "-". This is true for URL Routing as well.

## URL Routing

This feature enhances the above URL Rewriting feature and makes public_html/index.php work like a front controller. So, in order to use URL Routing feature, you have to enable URL Rewriting beforehand. Remember URL Routing currently only works with whatever URL Rewriting supports (articles, topics, static pages, the article directory, and links plugin).

Currently, the following rules are predefined (which covers all supported URL Rewrite URLs):

Rule | Route | Priority
--- | --- | ---
https://www.example.com/article/@sid | https://www.example.com/article.php?story=@sid | 100
https://www.example.com/article/@sid/print | https://www.example.com/article.php?story=@sid&mode=print | 110
https://www.example.com/article/@sid/@page | https://www.example.com/article.php?story=@sid&page=@page | 120
https://www.example.com/topic/@topic | https://www.example.com/index.php?topic=@topic | 130
https://www.example.com/topic/@topic/@page | https://www.example.com/index.php?topic=@topic&page=@page | 140
https://www.example.com/archives/@topic/@year/@month | https://www.example.com/directory.php?topic=@topic&year=@year&month=@month | 150
https://www.example.com/page/@page | https://www.example.com/staticpages/index.php?page=@page | 160
https://www.example.com/page/@page/print | https://www.example.com/staticpages/index.php?page=@page&disp_mode=print | 170
https://www.example.com/links/portal/@item | https://www.example.com/links/portal.php?what=link&item=@item | 180
https://www.example.com/links/category/@cat | https://www.example.com/links/index.php?category=@cat | 190

Look at the second row in the table. This means if you access "https://www.example.com/index.php/article/@sid/print", then you will be redirected to "https://www.example.com/article.php?article=@sid&mode=print". @sid is an article ID.

Note: This route in the second row must always be above the third row which is for routing articles with page numbers. The reason for this is backwards compatibility and for websites that just have URL Rewrite enabled and not URL Routing.

Now look at the fourth row. You will see an at mark (@), followed by alphabetical letters. This is a placeholder. For instance, when you access "https://www.example.com/index.php/archives/all/2016/1", @topic matches "all", @year matches "2016", and @month matches "1" in the rule. Then, all placeholders in the route will be replaced with the matched values. And you will be redirected to "https://www.example.com/directory.php?topic=all&year=2016&month=1".

You don't have to include "/index.php" in a rule.

You must NOT start a route with "/index.php/", since this will cause an infinite loop. However, you can start with a route with "/index.php?".

A placeholder starts with @ and an alphabetical letter or letters follow it. Placeholders are case-sensitive.

URL Routing works in the reverse way as well. When you output a URL in your plugin or custom function, you can URL-route it by using COM_buildURL function and adding your own rule and route in the URL Routing screen (admin/router.php).

Note: This feature may not work with all web servers. It uses PHP's $_SERVER['PATH_INFO'] variable. Please try it out before you go public with your site.

Note: The priority of the rules are important. For example a 301 redirect rule for an article will only get triggered if it is before other rules related to routing articles.

Note: If you use URL Routing but remove or disable one of the predefined routes that also supports URL Rewrite, that route will fallback to how URL Rewrite will display the URL.

Note: Only the Status Code "200" should be used. The other options currently do not work correctly and if used may cause unforeseen problems.

Advanced feature: If you use IIS as a Web server and want to remove "index.php" from URLs you access, you will have to create the appropriate web.config file in the same directory as lib-common.php, with the proper redirects defined. An example file called "web.config.txt" is included with Geeklog which you can rename to "web.config". It includes the proper rewrite rule along with some other security and optimizing enhancements for your IIS web server.

1. Install the rewrite module on your web server if it has not been already (use the Microsoft Web Platform Installer for this).
2. Create a file named "web.config" in the top of the public directory of your Geeklog installation (where lib-common.php is located) and add the following lines. If you have installed Geeklog in a subdirectory of the document root, you will need to modify the code below and include the appropriate sub directory in front of index.php.

               <configuration>
                   <system.webServer>
                       <rewrite>
                           <rules>
                               <rule name="Imported Rule 1" stopProcessing="true">
                                   <match url="^(.*)$" ignoreCase="false" />
                                   <conditions>
                                       <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                                       <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                                   </conditions>
                                   <action type="Rewrite" url="/index.php/{R:1}" />
                               </rule>
                           </rules>
                       </rewrite>
                   </system.webServer>
               </configuration>

3. Finally, log in as admin and go to the Configuration screen, and set URL Routing to 'Enabled (without "index.php")'.

Advanced feature: If you use Apache as a Web server and want to remove "index.php" from URLs you access, you have to do the following things. Be warned! Unless you are familiar with Web server configurations, you might as well not use this feature. An example file called ".htaccess.txt" is included with Geeklog which you can rename to ".htaccess". It includes the proper rewrite rule along with some other security and optimizing enhancements for your Apache web server.

1. Enable the rewrite module of your web server. In "httpd.conf", look for
   `# LoadModule rewrite_module modules/mod_rewrite.so`
   and uncomment the line by removing # at the top of the line. Don't forget to reboot your Web server.
2. Create a file named ".htaccess" in the top of the public directory of your Geeklog installation (where lib-common.php is located) and add the following lines.

                   <IfModule mod_rewrite.c>
                       RewriteEngine On
                       # RewriteBase /
                       # Directs all Geeklog requests through the site index file
                       RewriteCond %{REQUEST_FILENAME} !-f
                       RewriteCond %{REQUEST_FILENAME} !-d
                       RewriteRule ^(.*)$ /index.php/$1 [L]
                   </IfModule>

   If you have installed Geeklog in a subdirectory of the document root, you will have to change the line

       RewriteRule ^(.*)$ /index.php/$1 [L]

   into

       RewriteRule ^(.*)$ [sub_directory]/index.php/$1 [L]

   or

       RewriteRule ^(.*)$ /[sub_directory]/index.php/$1 [L]

   Please Note: In this case only (URL Routing enabled without "index.php" along with installing Geeklog in a subdirectory) you will have to edit all the rules in the Route Manager and add the sub directory in front of each Rule (but not the Route) so the proper rule can be found.
3. Finally, log in as admin and go to the Configuration screen, and set URL Routing to 'Enabled (without "index.php")'.

## Localization

Localizing Geeklog is fairly easy. All strings are contained in a language file. The default file that ships with the tarball is english.php. People interested in translating Geeklog to other languages are encouraged to join the geeklog-translations mailing list. All important information concerning translating Geeklog will be posted there.

### Locale and Date Formats

You can set the locale and date format in the configuration. To set the locale, set the variable to the proper string or if you leave it blank it will pull the default locale from the operating system. The date formats are handled by your locale. Isn't that smart? Locale names are OS dependent. On most UNIX hosts, you can find locale codes in the /usr/share/locale/locale.alias file and on some systems the command locale -a will display all available locales on a system. If a locale doesn't exist you can create it using the localedef command.

More info on locale: http://www.opengroup.org/onlinepubs/7908799/xbd/locale.html
More info on localdef: http://www.opengroup.org/onlinepubs/7908799/xcu/localedef.html

### Date Format Syntax

- %a - abbreviated weekday name according to the current locale
- %A - full weekday name according to the current locale
- %b - abbreviated month name according to the current locale
- %B - full month name according to the current locale
- %c - preferred date and time representation for the current locale
- %C - century number (the year divided by 100 and truncated to an integer, range 00 to 99)
- %d - day of the month as a decimal number (range 00 to 31)
- %D - same as %m/%d/%y
- %e - day of the month as a decimal number, a single digit is preceded by a space (range ' 1' to '31')
- %h - same as %b
- %H - hour as a decimal number using a 24-hour clock (range 00 to 23)
- %I - hour as a decimal number using a 12-hour clock (range 01 to 12)
- %j - day of the year as a decimal number (range 001 to 366)
- %m - month as a decimal number (range 1 to 12)
- %M - minute as a decimal number
- %n - newline character
- %p - either `am' or `pm' according to the given time value, or the corresponding strings for the current locale
- %r - time in a.m. and p.m. notation
- %R - time in 24 hour notation
- %S - second as a decimal number
- %t - tab character
- %T - current time, equal to %H:%M:%S
- %u - weekday as a decimal number [1,7], with 1 representing Monday
- %U - week number of the current year as a decimal number, starting with the first Sunday as the first day of the first week
- %V - The ISO 8601:1988 week number of the current year as a decimal number, range 01 to 53, where week 1 is the first week that has at least 4 days in the current year, and with Monday as the first day of the week.
- %W - week number of the current year as a decimal number, starting with the first Monday as the first day of the first week
- %w - day of the week as a decimal, Sunday being 0
- %x - preferred date representation for the current locale without the time
- %X - preferred time representation for the current locale without the date
- %y - year as a decimal number without a century (range 00 to 99)
- %Y - year as a decimal number including the century
- %Z - time zone or name or abbreviation
- %% - a literal `%' character

## Cron Jobs

The cron command-line utility, also known as cron job is a job scheduler. You can schedule jobs to run ever minute, hourly, daily, or monthly. Most web hosts offer the ability to create cron jobs from their web hosting control panel (usually found under Cron Jobs or Crontab Manager).

Geeklog has 2 cron job scripts available. These cron job scripts are not required for Geeklog to function. For them to work you must have compiled PHP so it can also be used as a shell scripting language. You should call these script from your crontab (man crontab). You will also need to set the executable flags for these files.

The cron job scripts filenames start with "cron-" and can be found in the root directory. It is recommended to keep these files located here as you do not want them in a location where anyone that visits your website can run them.

The PHP in these cron job scripts also have some code you will need to update including the path to the "lib-common.php" file. For full instructions on the changes you can do, see the comments in the cron job scripts.

If you're not familiar with the crontab syntax: You will need to add a line to your cron job in your web host control panel that looks like this:

    30 2 * * * /path/to/geeklog/cron-emailgeeklogdailydigest

This would call the cron-emailgeeklogdailydigest) script every day at 2:30am. In some cases (like with cPanel) the scheduling of the job may be done through the user interface instead of the command line. Make sure that the script is executable, i.e. do a chmod 775 (or similar) on it.

### Daily Digest

The file "cron-emailgeeklogdailydigest" (formerly called emailgeeklogstories) will email new articles to any user that signs up for the Daily Digest. To use this feature the Daily Digest must be enabled in the Geeklog Configuration.

A word of warning: The first time you activate this, all articles in your Geeklog database are considered new - so the first email may be quite large. This only happens the very first time you activate this feature on your site, not for every new user subscribing to the Daily Digest (they will only get the new articles since the last time the digest was sent). For the first time, if you want to only send articles from a certain date, you could set the "lastemailedstories" record found in the Geeklog "gl_vars" table to the date and time you wish (e.g. 2021-10-05 12:00:00). This would mean that only articles published after this time will be sent out with the next digest.

### Emailed Database Backup

The file "cron-emailgeeklogdatabasebackup" will email a backup of the Geeklog database to a specified email address. Configuration options can be found in the Geeklog Database Administration and the Geeklog Configuration. The recipient of the email can be set either directly in the cron job script file or by adding (or updating if it exists) a "db_backup_sendto" record in the Geeklog "gl_vars" table.

This cron script should only be run when the site is not busy (like early in the morning) and only as often as needed (usually weekly or for a site that has content updated often, daily). If you have a large database you will need to make sure the email address the backup is being sent to allows for large file attachments or the email will be rejected.