Configuration Properties Reference

Last modified: 8/26/2026

Configuration Properties Reference

This page documents all configuration properties available in config/app-default-config.json. These are the base defaults for every ngdpbase installation. Override any property in config/app-custom-config.json (not tracked in git) or an environment-specific config file.

See Server Management for how configuration files are loaded and how to apply overrides.

Configuration Loading Order

  1. config/app-default-config.json — base defaults (documented here)
  2. config/app-{NODE_ENV}-config.json — environment overrides
  3. config/app-custom-config.json — local machine overrides (gitignored)

Later files override earlier ones. Only set what differs from defaults.


Application Core

KeyDefaultDescription
ngdpbase.application-name"ngdpbase"Display name for the application
ngdpbase.favicon-path"/favicon.svg"Path to the favicon served to browsers
ngdpbase.application.category"Digital Platform"Application category label
ngdpbase.version(current version)Application version string
ngdpbase.github.repo"jwilleke/ngdpbase"GitHub repository identifier
ngdpbase.base-url"http://localhost:3000"Canonical base URL — used in links, RSS, Schema.org output
ngdpbase.encoding"UTF-8"Default character encoding
ngdpbase.front-page"Welcome"Title of the page shown at the root URL
ngdpbase.server.port3000HTTP port the server listens on
ngdpbase.server.host"localhost"Network host/interface to bind

Session

KeyDefaultDescription
ngdpbase.session.secret(default string)Secret used to sign session cookies — change in production
ngdpbase.session.max-age86400000Session lifetime in milliseconds (default: 24 h)
ngdpbase.session.securefalseSet true to require HTTPS for session cookies
ngdpbase.session.http-onlytruePrevent client-side JavaScript from reading the session cookie
ngdpbase.session.storagedir${FAST_STORAGE}/sessionsDirectory for server-side session files — use fast storage (SSD)
ngdpbase.session.store"users/sessions.json"Legacy session store path (superseded by storagedir)

KeyDefaultDescription
ngdpbase.translator-reader.match-english-pluralstrueAllow page links to match plural/singular page name variants
ngdpbase.translator-reader.camel-case-linkstrueAutomatically link CamelCase words as page names
ngdpbase.translator-reader.allow-htmlfalseAllow raw HTML in markup
ngdpbase.translator-reader.plain-uristrueAutomatically hyperlink bare URLs in content

Application Organization (Install Identity)

These settings describe the organization that owns this install. They are written by the install wizard and read by OrganizationManager (issue #617). Install completion itself is tracked via $FAST_STORAGE/.install-complete — not via config.

KeyDefaultDescription
ngdpbase.application.organization.storagedir"${FAST_STORAGE}/organizations"Directory holding one JSON file per Organization record
ngdpbase.application.organization.file""Filename (under storagedir) of the install's anchor org, e.g. acme-corporation.json
ngdpbase.application.organization.url""Canonical URL of the org — becomes JSON-LD @id. Defaults to ngdpbase.base-url if blank
ngdpbase.application.organization.name""Short organization name used in page headers and metadata
ngdpbase.application.organization.legal-name""Legal organization name for Schema.org output
ngdpbase.application.organization.description""Short description of the organization
ngdpbase.application.organization.founding-date""ISO 8601 date the organization was founded
ngdpbase.application.organization.contact-email""Public contact email address
ngdpbase.application.organization.address-locality""City
ngdpbase.application.organization.address-region""State or region
ngdpbase.application.organization.address-country""Two-letter ISO country code
ngdpbase.application.organization.provider"fileorganizationprovider"Active OrganizationProvider class (lowercased)
ngdpbase.application.persons.storagedir"${FAST_STORAGE}/persons"Directory holding one JSON file per Person record
ngdpbase.application.persons.provider"filepersonprovider"Active PersonProvider class (lowercased)

Parser

KeyDefaultDescription
ngdpbase.markdown.footnotes.enabledtrueEnable Markdown footnote syntax

Page Storage

KeyDefaultDescription
ngdpbase.page.enabledtrueEnable the page subsystem
ngdpbase.page.provider"filesystemprovider"Active page provider class name
ngdpbase.page.provider.default"filesystemprovider"Fallback provider if the active one fails
ngdpbase.page.provider.filesystem.storagedir${SLOW_STORAGE}/pagesDirectory where user page files are stored
ngdpbase.page.provider.filesystem.requiredpagesdir"./required-pages"Directory containing bundled system/documentation pages
ngdpbase.page.provider.versioning.indexfile${FAST_STORAGE}/page-index.jsonPath to the page index file used for fast lookups — use fast storage
ngdpbase.page.provider.filesystem.encoding"utf-8"File encoding for page files
ngdpbase.page.provider.filesystem.autosavetrueAutomatically save the page index after each write
ngdpbase.directories.pages${SLOW_STORAGE}/pagesLegacy alias for filesystem.storagedir
ngdpbase.directories.required-pages"./required-pages"Legacy alias for filesystem.requiredpagesdir

Attachment Storage

KeyDefaultDescription
ngdpbase.attachment.enabledtrueEnable file attachments
ngdpbase.attachment.provider"basicattachmentprovider"Active attachment provider
ngdpbase.attachment.provider.default"basicattachmentprovider"Fallback provider
ngdpbase.attachment.maxsize10485760Maximum upload size in bytes (default: 10 MB)
ngdpbase.attachment.allowedtypes"image/*,text/*,application/pdf"Comma-separated MIME type patterns allowed for upload
ngdpbase.attachment.forcedownloadfalseForce browser download rather than inline display
ngdpbase.attachment.metadatafile${SLOW_STORAGE}/attachments/attachment-metadata.jsonPath to the attachment metadata index
ngdpbase.attachment.provider.basic.storagedir${SLOW_STORAGE}/attachmentsDirectory for stored attachment files
ngdpbase.attachment.provider.basic.hashcontenttrueHash file content for deduplication
ngdpbase.attachment.provider.basic.hashmethod"sha256"Hashing algorithm: "sha256" or "md5"

Enhanced Attachments

KeyDefaultDescription
ngdpbase.attachment.enhanced.enabledtrueEnable thumbnail generation and enhanced metadata
ngdpbase.attachment.enhanced.thumbnailstrueGenerate image thumbnails on upload
ngdpbase.attachment.enhanced.thumbnailsizes"150x150,300x300"Comma-separated WxH thumbnail sizes
ngdpbase.attachment.enhanced.metadatatrueExtract and store file metadata (EXIF, etc.)
ngdpbase.attachment.enhanced.showmetadatatrueShow metadata in the attachment UI
ngdpbase.attachment.enhanced.showfilesizetrueShow file size in attachment listings
ngdpbase.attachment.enhanced.showmodifiedtrueShow last-modified date in attachment listings
ngdpbase.attachment.enhanced.iconpath"/icons/filetypes"URL path for file-type icons
ngdpbase.attachment.enhanced.cachemetadatatrueCache extracted metadata in memory
ngdpbase.attachment.enhanced.generatethumbnailstrueGenerate thumbnails at upload time

Shared Settings

KeyDefaultDescription
ngdpbase.search.enabledtrueEnable search
ngdpbase.search.provider"lunrsearchprovider"Active search provider
ngdpbase.search.provider.default"lunrsearchprovider"Fallback provider
ngdpbase.search.maxresults50Maximum results returned per query
ngdpbase.search.autocomplete.enabledtrueEnable autocomplete suggestions
ngdpbase.search.autocomplete.minlength2Minimum characters before autocomplete activates
ngdpbase.search.suggestions.enabledtrueEnable query suggestions
ngdpbase.search.suggestions.maxitems10Maximum suggestion items to show

LunrSearchProvider

KeyDefaultDescription
ngdpbase.search.provider.lunr.indexdir${FAST_STORAGE}/search-indexDirectory for Lunr index files — use fast storage
ngdpbase.search.provider.lunr.stemmingtrueEnable word stemming (e.g. "running" matches "run")
ngdpbase.search.provider.lunr.boost.title10Search score boost for title matches
ngdpbase.search.provider.lunr.boost.systemcategory8Boost for system-category matches
ngdpbase.search.provider.lunr.boost.userkeywords6Boost for user-keyword matches
ngdpbase.search.provider.lunr.boost.tags5Boost for tag matches
ngdpbase.search.provider.lunr.boost.keywords4Boost for keyword matches
ngdpbase.search.provider.lunr.maxresults50Maximum results from the Lunr index
ngdpbase.search.provider.lunr.snippetlength200Character length of result snippets

ElasticsearchSearchProvider

Activate with "ngdpbase.search.provider": "elasticsearchsearchprovider". Lunr remains the default.

KeyDefaultDescription
ngdpbase.search.provider.elasticsearch.url"http://localhost:9200"Elasticsearch endpoint URL
ngdpbase.search.provider.elasticsearch.indexname"ngdpbase-pages"Index name in Elasticsearch (distinct from sist2 addon index)
ngdpbase.search.provider.elasticsearch.connecttimeout5000Connection timeout in milliseconds
ngdpbase.search.provider.elasticsearch.requesttimeout30000Request timeout in milliseconds

Cache

Shared Settings

KeyDefaultDescription
ngdpbase.cache.enabledtrueEnable caching
ngdpbase.cache.provider"nodecacheprovider"Active cache provider
ngdpbase.cache.provider.default"nodecacheprovider"Fallback provider
ngdpbase.cache.defaultttl300Default cache entry TTL in seconds
ngdpbase.cache.maxkeys1000Maximum number of keys in cache
ngdpbase.cache.checkperiod120Interval in seconds for expiry checks

NodeCacheProvider

KeyDefaultDescription
ngdpbase.cache.provider.nodecache.stdttl300Default TTL in seconds
ngdpbase.cache.provider.nodecache.checkperiod120Expiry check interval in seconds
ngdpbase.cache.provider.nodecache.maxkeys1000Maximum keys
ngdpbase.cache.provider.nodecache.useclonestrueReturn cloned objects (prevents mutation of cached values)

RedisCacheProvider (Future)

KeyDefaultDescription
ngdpbase.cache.provider.redis.url"redis://localhost:6379"Redis connection URL
ngdpbase.cache.provider.redis.keyprefix"ngdpbase:"Prefix for all cache keys
ngdpbase.cache.provider.redis.enableclusterfalseEnable Redis cluster mode
ngdpbase.cache.provider.redis.connecttimeout5000Connection timeout in milliseconds

Audit Trail

Shared Settings

KeyDefaultDescription
ngdpbase.audit.enabledtrueEnable audit logging
ngdpbase.audit.provider"fileauditprovider"Active audit provider
ngdpbase.audit.provider.default"fileauditprovider"Fallback provider
ngdpbase.audit.loglevel"info"Minimum level to record: "debug", "info", "warn", "error"
ngdpbase.audit.maxqueuesize1000Maximum events queued before flush
ngdpbase.audit.flushinterval30000Flush interval in milliseconds
ngdpbase.audit.retentiondays90Days to retain audit records

FileAuditProvider

KeyDefaultDescription
ngdpbase.audit.provider.file.logdirectory${FAST_STORAGE}/logsDirectory for audit log files
ngdpbase.audit.provider.file.auditfilename"audit.log"Active audit log filename
ngdpbase.audit.provider.file.archivefilename"audit-archive.log"Archive log filename
ngdpbase.audit.provider.file.maxfilesize"10MB"Maximum size before rotation
ngdpbase.audit.provider.file.maxfiles10Number of rotated files to keep

Markup / Parser

KeyDefaultDescription
ngdpbase.markup.enabledtrueEnable the markup subsystem
ngdpbase.markup.use-advanced-parsertrueUse the advanced extraction-pipeline parser
ngdpbase.markup.fallback-to-legacytrueFall back to legacy parser on advanced parser failure
ngdpbase.markup.integration.rendering-managertrueIntegrate with RenderingManager
ngdpbase.markup.log-parsing-methodtrueLog which parsing method (advanced vs legacy) is used
ngdpbase.markup.cachingtrueEnable markup result caching
ngdpbase.markup.cache-ttl300Default markup cache TTL in seconds

Markup Cache Sub-Sections

Each sub-section (parse-results, handler-results, patterns, variables) shares the same keys:

KeyDescription
*.enabledEnable this cache layer
*.ttlTTL in seconds
*.max-sizeMaximum number of cached entries
KeyDefaultDescription
ngdpbase.markup.cache.enable-warmuptruePre-warm cache on startup
ngdpbase.markup.cache.metrics-enabledtrueExpose cache hit/miss metrics

Handler Registry

KeyDefaultDescription
ngdpbase.markup.handler-registry.max-handlers100Maximum registered markup handlers
ngdpbase.markup.handler-registry.allow-duplicate-prioritiestrueAllow handlers with the same priority value
ngdpbase.markup.handler-registry.enable-dependency-resolutiontrueResolve handler ordering by declared dependencies
ngdpbase.markup.handler-registry.enable-conflict-detectiontrueWarn on handler conflicts
ngdpbase.markup.handler-registry.default-timeout5000Handler execution timeout in milliseconds

Markup Handlers

Each built-in handler has enabled (boolean) and priority (integer, higher runs first) keys.

HandlerDefault PriorityPurpose
plugin90Plugin tags [{PluginName ...}]
wikitag95Page link tags [[PageName]]
form85HTML form generation
interwiki80Inter-wiki links
attachment75Attachment display
style70WikiStyle CSS classes
search65Inline search results
rss60RSS feed inclusion

Additional attachment-handler flags:

KeyDefaultDescription
ngdpbase.markup.handlers.attachment.enhancedtrueEnable enhanced attachment display
ngdpbase.markup.handlers.attachment.thumbnailstrueShow thumbnails for image attachments
ngdpbase.markup.handlers.attachment.metadatatrueDisplay file metadata alongside attachments

Filters

Filter Pipeline

KeyDefaultDescription
ngdpbase.markup.filters.enabledtrueEnable the filter pipeline
ngdpbase.markup.filters.pipeline.max-filters50Maximum filters in the pipeline
ngdpbase.markup.filters.pipeline.timeout10000Pipeline execution timeout in milliseconds
ngdpbase.markup.filters.pipeline.enable-profilingtrueRecord per-filter timing
ngdpbase.markup.filters.pipeline.fail-on-errorfalseAbort the pipeline if any filter throws

Spam Filter

KeyDefaultDescription
ngdpbase.markup.filters.spam.enabledfalseEnable spam detection
ngdpbase.markup.filters.spam.priority100Filter priority (runs first when enabled)
ngdpbase.markup.filters.spam.max-links10Maximum links allowed per page save
ngdpbase.markup.filters.spam.max-images5Maximum images allowed per page save
ngdpbase.markup.filters.spam.blacklist-words(list)Comma-separated words that trigger spam rejection
ngdpbase.markup.filters.spam.whitelist-domains(list)Comma-separated domains exempt from link limits
ngdpbase.markup.filters.spam.cache-blacklisttrueCache the blacklist in memory

Security Filter

KeyDefaultDescription
ngdpbase.markup.filters.security.enabledfalseEnable HTML security sanitization
ngdpbase.markup.filters.security.priority110Filter priority
ngdpbase.markup.filters.security.prevent-xsstrueStrip XSS vectors
ngdpbase.markup.filters.security.prevent-csrftrueStrip CSRF vectors
ngdpbase.markup.filters.security.sanitize-htmltrueSanitize HTML to allowed tags/attributes
ngdpbase.markup.filters.security.allowed-tags(list)Comma-separated HTML tags permitted in content
ngdpbase.markup.filters.security.allowed-attributes(list)Comma-separated attributes permitted on allowed tags
ngdpbase.markup.filters.security.strip-dangerous-contenttrueRemove scripts, event handlers, and dangerous URLs

Validation Filter

KeyDefaultDescription
ngdpbase.markup.filters.validation.enabledtrueEnable content validation
ngdpbase.markup.filters.validation.priority90Filter priority
ngdpbase.markup.filters.validation.validate-markuptrueValidate markup syntax
ngdpbase.markup.filters.validation.validate-linkstrueCheck internal links exist
ngdpbase.markup.filters.validation.validate-imagestrueValidate image references
ngdpbase.markup.filters.validation.max-content-length1048576Maximum page content size in bytes (default: 1 MB)
ngdpbase.markup.filters.validation.report-errorstrueReturn validation errors to the editor

Custom Filters

KeyDefaultDescription
ngdpbase.markup.filters.custom.enabledfalseLoad custom filter plugins
ngdpbase.markup.filters.custom.search-paths"./filters,./src/filters"Comma-separated directories to scan for custom filters
ngdpbase.markup.filters.custom.auto-loadtrueAuto-discover and register found filters
ngdpbase.markup.filters.custom.cache-resultstrueCache filter results

InterWiki

KeyDefaultDescription
ngdpbase.interwiki.enabledtrueEnable inter-wiki links
ngdpbase.interwiki.options.openInNewWindowtrueOpen inter-wiki links in a new browser tab
ngdpbase.interwiki.options.addIconIndicatortrueShow an external-link icon next to inter-wiki links
ngdpbase.interwiki.options.caseSensitivefalseTreat site names as case-insensitive
ngdpbase.interwiki.options.showTooltipstrueShow tooltips on hover
ngdpbase.interwiki.options.cacheTTL3600Cache TTL in seconds for inter-wiki link resolution
ngdpbase.interwiki.options.maxCacheEntries1000Maximum cached inter-wiki entries
ngdpbase.interwiki.sites(object)Map of site keys to { url, description, icon, enabled, openInNewWindow } — %s in the URL is replaced by the link target

Default built-in sites: Wikipedia, JSPWiki, GVP, GVP-COUNTRY, geo (GeoHazardWatch), grok (Grokipedia).


Managers

KeyDefaultDescription
ngdpbase.managers.page-manager.enabledtrueEnable PageManager
ngdpbase.managers.plugin-manager.enabledtrueEnable PluginManager
ngdpbase.managers.plugin-manager.search-paths["./dist/plugins"]Array of directories scanned for plugin modules
ngdpbase.managers.rendering-manager.enabledtrueEnable RenderingManager
ngdpbase.managers.search-manager.enabledtrueEnable SearchManager
ngdpbase.managers.template-manager.enabledtrueEnable TemplateManager
ngdpbase.managers.cache-manager.enabledtrueEnable CacheManager
ngdpbase.managers.addons-manager.enabledtrueEnable AddonsManager
ngdpbase.managers.addons-manager.addons-path"./addons"Where add-ons are discovered. Accepts a single string or an array of entries. A plain entry is a directory; an entry of the form node_modules:<glob> (e.g. node_modules:@jwilleke/*-addon) discovers add-ons installed as npm packages
ngdpbase.addons{}Add-on configuration object — individual add-ons keyed under ngdpbase.addons.<name>
ngdpbase.addons.<name>.enabledfalseEnable one add-on. Required for every add-on at every path — discovery alone does not enable anything
ngdpbase.addons.page-reseedfalseRefresh add-on-seeded pages from source at boot when the source changed and the page was never edited in-app. Operator-edited pages are always skipped

Features

KeyDefaultDescription
ngdpbase.features.export.htmltrueEnable HTML page export
ngdpbase.features.export.pdffalseEnable PDF page export
ngdpbase.features.export.odtfalseEnable ODT (LibreOffice) page export
ngdpbase.features.llm.enabledfalseEnable LLM integration
ngdpbase.features.llm.endpoint"http://localhost:11434"LLM API endpoint (Ollama-compatible)
ngdpbase.features.llm.model"llama2"LLM model name to use
ngdpbase.features.images.enabledtrueEnable image uploads
ngdpbase.features.images.max-size"5MB"Maximum image file size
ngdpbase.features.images.allowed-types(list)Comma-separated MIME types for image uploads
ngdpbase.features.images.upload-dir"./public/images"Directory for uploaded images
ngdpbase.features.images.default-alt"Uploaded image"Default alt text for images without an explicit alt attribute
ngdpbase.features.images.default-class"wiki-image"Default CSS class on rendered <img> tags
ngdpbase.features.maintenance.enabledfalseEnable maintenance mode (in-memory only, resets on restart)
ngdpbase.features.maintenance.message(default message)Message shown to non-admin users during maintenance
ngdpbase.features.maintenance.allow-adminstrueAllow admins to access the platform during maintenance mode
ngdpbase.features.maintenance.estimated-durationnullOptional ISO 8601 duration shown to users

Logging

KeyDefaultDescription
ngdpbase.logging.level"info"Minimum log level: "debug", "info", "warn", "error"
ngdpbase.logging.dir${FAST_STORAGE}/logsDirectory for application log files
ngdpbase.logging.max-size"1MB"Maximum size of a log file before rotation
ngdpbase.logging.max-files5Number of rotated log files to keep
ngdpbase.logging.debug.enabledfalseEnable verbose debug logging
ngdpbase.logging.debug.sessionfalseLog session lifecycle events
ngdpbase.logging.debug.loginfalseLog login/logout events at debug level

Notifications

KeyDefaultDescription
ngdpbase.notifications.dir${FAST_STORAGE}/notificationsDirectory for notification files
ngdpbase.notifications.file"notifications.json"Notification store filename
ngdpbase.notifications.auto-save-interval300000Auto-save interval in milliseconds (default: 5 min)

Access Control

KeyDefaultDescription
ngdpbase.access-control.context-aware.enabledtrueEnable context-aware access control (time/schedule-based)
ngdpbase.access-control.context-aware.time-zone"UTC"Timezone used for schedule evaluation
ngdpbase.access-control.business-hours.enabledfalseRestrict access to business hours only
ngdpbase.access-control.business-hours.start"09:00"Business hours start time (HH:MM)
ngdpbase.access-control.business-hours.end"17:00"Business hours end time (HH:MM)
ngdpbase.access-control.business-hours.days"monday,...,friday"Comma-separated allowed days
ngdpbase.access-control.custom-schedules.enabledfalseLoad access schedules from an external file
ngdpbase.access-control.custom-schedules.schedules"./config/schedules.json"Path to custom schedules file
ngdpbase.access-control.holidays.enabledfalseBlock access on configured holidays
ngdpbase.access-control.holidays.calendar"./config/holidays.json"Path to holidays calendar file

Roles

Roles are defined under ngdpbase.roles.definitions.<role-name> with the following fields:

FieldDescription
nameRole identifier (lowercase)
displaynameHuman-readable label
descriptionRole description
issystemtrue for built-in roles — should not be deleted
iconFontAwesome icon name
colorHex color for the UI
permissionsArray of permission strings granted to this role

Built-in roles: admin, editor, contributor, reader, anonymous

Permission strings: page:read, page:edit, page:create, page:delete, page:rename, attachment:read, attachment:upload, attachment:delete, search:all, export:pages, admin:system, admin:users, admin:roles, admin:config


Access Policies

KeyDefaultDescription
ngdpbase.access.policies.enabledtrueEnable policy-based access control
ngdpbase.access.policies.default-policy"deny"Default effect when no policy matches: "allow" or "deny"
ngdpbase.access.policies(array)Ordered list of policy objects

Each policy object has:

FieldDescription
idUnique policy identifier
nameHuman-readable name
descriptionPolicy purpose
priorityHigher number is evaluated first
effect"allow" or "deny"
subjectsArray of { type, value } — type is "role"
resourcesArray of { type, pattern/value } — type is "page" or "category"
actionsArray of permission strings (use "*" for all)

System Categories

Defined under ngdpbase.system-category.<name>. Each entry controls storage routing and visibility.

FieldDescription
labelCategory identifier
descriptionHuman-readable description
defaulttrue if this is the default category for new pages
storageLocationWhere pages in this category are stored: "regular" (user pages dir), "required" (required-pages dir), "github" (docs dir)
enabledWhether this category is active

Built-in categories: general (default, regular storage), system (required storage), documentation (required storage), developer (github storage)


User Keywords

Defined under ngdpbase.user-keywords.<name>. Each entry is a keyword users can tag pages with.

FieldDescription
labelKeyword identifier
descriptionHuman-readable description
categoryGrouping: "general", "access", "status", "subject"
enabledWhether this keyword is available
restrictEditingIf true, only the creator and admins can edit pages with this keyword
storageLocationOptional storage override for pages with this keyword
allowedRolesOptional array of roles that can apply this keyword

Built-in keywords: default, private, draft, review, published, and domain subjects (medicine, geology, meteorology, oceanography, psychology, sociology, anthropology, economics, political-science)


Defaults and Miscellaneous

KeyDefaultDescription
ngdpbase.default.system-category"general"Default system-category for new pages
ngdpbase.maximum.user-keywords5Maximum number of user-keywords a page can have
ngdpbase.default.template.dateformat"dd-MMM-yyyy HH:mm"Date format used in templates
ngdpbase.default.timezone"UTC"Default timezone for display
ngdpbase.diff-provider"TraditionalDiffProvider"Provider class used for page diffs
ngdpbase.authorizer"DefaultAuthorizer"Authorization strategy class
ngdpbase.breadcrumbs.maxpages10Maximum pages shown in the breadcrumb trail

RSS

KeyDefaultDescription
ngdpbase.rss.generatetrueEnable RSS feed generation
ngdpbase.rss.file-name"rss.xml"Output filename for the RSS feed
ngdpbase.rss.interval3600Feed refresh interval in seconds
ngdpbase.rss.channel-title"ngdpbase RSS Feed"RSS channel title
ngdpbase.rss.channel-description(default)RSS channel description

Theme

KeyDefaultDescription
ngdpbase.theme.active"default"Active theme folder name under themes/
ngdpbase.theme.defaults.mode"light"Default UI mode for new users: "light" or "dark"

WikiStyle

KeyDefaultDescription
ngdpbase.style.custom-classes.enabledtrueAllow custom CSS classes in WikiStyle markup
ngdpbase.style.bootstrap.integrationtrueApply Bootstrap CSS class names via WikiStyle
ngdpbase.style.security.allow-inline-cssfalseAllow style="..." attributes in page content
ngdpbase.style.security.allowed-properties(list)Comma-separated CSS properties allowed when inline CSS is enabled
ngdpbase.style.predefined.text(list)Predefined text color classes
ngdpbase.style.predefined.background(list)Predefined background color classes
ngdpbase.style.predefined.layout(list)Predefined layout utility classes

Location

KeyDefaultDescription
ngdpbase.location.default-provider"osm"Default map provider for the LocationPlugin: "osm" (OpenStreetMap)

Telemetry (OpenTelemetry)

KeyDefaultDescription
ngdpbase.telemetry.enabledfalseEnable OpenTelemetry metrics
ngdpbase.telemetry.service-name""Service name reported to the collector
ngdpbase.telemetry.metrics.port9464Port for the Prometheus scrape endpoint
ngdpbase.telemetry.metrics.host"0.0.0.0"Host for the metrics endpoint
ngdpbase.telemetry.metrics.path"/metrics"URL path for the metrics endpoint
ngdpbase.telemetry.metrics.interval15000Metrics collection interval in milliseconds
ngdpbase.telemetry.otlp.enabledfalseEnable OTLP HTTP push export
ngdpbase.telemetry.otlp.endpoint""OTLP collector endpoint URL
ngdpbase.telemetry.otlp.headers{}HTTP headers sent with OTLP requests (e.g. auth tokens)
ngdpbase.telemetry.otlp.interval30000Push interval in milliseconds
ngdpbase.telemetry.otlp.timeout30000Request timeout in milliseconds

Backup

KeyDefaultDescription
ngdpbase.backup.directory${SLOW_STORAGE}/backupsDirectory where backup archives are stored
ngdpbase.backup.max-backups10Maximum number of backup archives to retain
ngdpbase.backup.compresstrueCompress backup archives
ngdpbase.backup.auto-backupfalseEnable automatic scheduled backups
ngdpbase.backup.auto-backup-interval86400000Auto-backup interval in milliseconds (default: 24 h)
ngdpbase.backup.auto-backup-time"02:00"Preferred time of day for auto-backup (HH:MM, local time)
ngdpbase.backup.auto-backup-days"daily"Backup frequency: "daily", "weekly", or "monthly"

Media Manager

KeyDefaultDescription
ngdpbase.media.enabledfalseEnable MediaManager (external photo/video library scanning)
ngdpbase.media.folders[]Array of absolute paths to external media directories to scan
ngdpbase.media.maxdepth5Maximum directory recursion depth when scanning
ngdpbase.media.scaninterval3600000Re-scan interval in milliseconds (default: 1 h)
ngdpbase.media.readonlytruePrevent write operations to media source directories
ngdpbase.media.thumbnail.sizes"300x300,150x150"Comma-separated WxH thumbnail sizes to generate
ngdpbase.media.metadata.priority["EXIF","IPTC","XMP"]Ordered list of metadata sources to prefer
ngdpbase.media.ignoredirs[".dtrash",".ts"]Directory names to skip during scanning
ngdpbase.media.extensions(list)File extensions recognized as media (images and video)

Storage Location Permissions

KeyDefaultDescription
ngdpbase.storageLocation.enabledtrueEnable storage-location-based access rules
ngdpbase.storageLocation.aclBasedStoragetrueEnforce ACL checks on storage locations
ngdpbase.storageLocation.roleBasedStorage.admin"required"Storage location accessible to the admin role
ngdpbase.storageLocation.roleBasedStorage.editor"regular"Storage location accessible to the editor role
ngdpbase.storageLocation.roleBasedStorage.user"regular"Storage location accessible to the user role
ngdpbase.storageLocation.categoryBasedStorage.System"required"Storage location for pages in the System category
ngdpbase.storageLocation.categoryBasedStorage.Admin"required"Storage location for pages in the Admin category
ngdpbase.storageLocation.categoryBasedStorage.Security"required"Storage location for pages in the Security category
ngdpbase.storageLocation.categoryBasedStorage.General"regular"Storage location for pages in the General category
ngdpbase.storageLocation.categoryBasedStorage.Documentation"regular"Storage location for pages in the Documentation category

Holidays

KeyDefaultDescription
ngdpbase.holidays.enabledtrueEnable holiday-based access restrictions
ngdpbase.holidays.dates(object)Map of YYYY-MM-DD dates to { name, message, enabled } — one-time specific dates
ngdpbase.holidays.recurring(object)Map of *-MM-DD patterns to { name, message, enabled } — repeats every year

Schedules

KeyDefaultDescription
ngdpbase.schedules.enabledtrueEnable named access schedules
ngdpbase.schedules(object)Map of schedule names to schedule definitions

Each schedule definition has:

FieldDescription
nameHuman-readable schedule name
descriptionPurpose description
timeZoneIANA timezone string for rule evaluation
rulesArray of { days, startTime, endTime, type } — type is "allow" or "deny"
exceptionsArray of date-specific overrides
enabledWhether this schedule is active

Special schedule keys: role_admin applies to the admin role; category_System applies to system category pages; default is the fallback for users without a specific assignment.



All Properties (Live Index)

The curated sections above explain the important settings and their trade-offs. This appendix is the complete, never-stale list of every property in config/app-default-config.json — rendered live from the running configuration by [{ConfigAccessor}], so new keys appear automatically the moment they are added (no hand-maintenance, no drift). Currently 432 properties across 55 groups. Use your browser's find (Ctrl/Cmd-F) within a group, or jump via the headings.

Maintenance note: do not hand-list keys here. Each group below is a [{ConfigAccessor key='<prefix>.*'}] wildcard — it stays correct on its own. See Using ConfigAccessorPlugin and docs/proper-documentation-pages.md.

jspwiki.*

No config keys match pattern: jspwiki.*

log4j.*

No config keys match pattern: log4j.*

ngdpbase.access.*

Configuration Values (4 matches) — ngdpbase.access.*
Key Value
ngdpbase.access.policies (hidden)
ngdpbase.access.policies.default-policy deny
ngdpbase.access.policies.enabled true
ngdpbase.access.resource-types { "page": { "description": "A page, matched by its name (glob pattern)" }, "system-category": { "description": "Every page of a system-category, matched by the page's system-category (glob pattern)" }, "vault": { "description": "A page or file in a private vault, matched by the vault id (glob pattern; `*` is every vault). Only the vault's owner gets past the private-container check, so a policy naming it applies to the owner's own vaults (#1539)" } }

ngdpbase.access-control.*

Configuration Values (5 matches) — ngdpbase.access-control.*
Key Value
ngdpbase.access-control.business-hours.enabled false
ngdpbase.access-control.context-aware.enabled true
ngdpbase.access-control.context-aware.time-zone UTC
ngdpbase.access-control.custom-schedules.enabled false
ngdpbase.access-control.custom-schedules.schedules ./config/schedules.json

ngdpbase.addons.*

Configuration Values (131 matches) — ngdpbase.addons.*
Key Value
ngdpbase.addons.demo.admin-account.display-name Demo Administrator
ngdpbase.addons.demo.admin-account.email [email protected]
ngdpbase.addons.demo.admin-account.enabled true
ngdpbase.addons.demo.admin-account.password (hidden)
ngdpbase.addons.demo.admin-account.username admindemo
ngdpbase.addons.demo.enabled false
ngdpbase.addons.feeds.enabled true
ngdpbase.addons.feeds.max-concurrent-ingests 4
ngdpbase.addons.feeds.sources.fems-nfdr.adapter csv
ngdpbase.addons.feeds.sources.fems-nfdr.intervalMinutes 360
ngdpbase.addons.feeds.sources.fems-nfdr.map.bi BI
ngdpbase.addons.feeds.sources.fems-nfdr.map.date ObservationTime
ngdpbase.addons.feeds.sources.fems-nfdr.map.erc ERC
ngdpbase.addons.feeds.sources.fems-nfdr.map.fm1000hr 1000HrFM
ngdpbase.addons.feeds.sources.fems-nfdr.map.fm100hr 100HrFM
ngdpbase.addons.feeds.sources.fems-nfdr.map.fm10hr 10HrFM
ngdpbase.addons.feeds.sources.fems-nfdr.map.fm1hr 1HrFM
ngdpbase.addons.feeds.sources.fems-nfdr.map.fuelModel FuelModel
ngdpbase.addons.feeds.sources.fems-nfdr.map.gsi GSI
ngdpbase.addons.feeds.sources.fems-nfdr.map.herbFm HerbFM
ngdpbase.addons.feeds.sources.fems-nfdr.map.ic IC
ngdpbase.addons.feeds.sources.fems-nfdr.map.kbdi KBDI
ngdpbase.addons.feeds.sources.fems-nfdr.map.sc SC
ngdpbase.addons.feeds.sources.fems-nfdr.map.station StationName
ngdpbase.addons.feeds.sources.fems-nfdr.map.stationId StationId
ngdpbase.addons.feeds.sources.fems-nfdr.map.type NFDRType
ngdpbase.addons.feeds.sources.fems-nfdr.map.woodyFm WoodyFM
ngdpbase.addons.feeds.sources.fems-nfdr.type Observation
ngdpbase.addons.feeds.sources.fems-nfdr.url https://fems.fs2c.usda.gov/api/ext-climatology/download-nfdr-daily-summary/?dataset=all&presetDate=-5Days7Days&dataFormat=csv&stationIds=40611,45114,350912,241907,420403,291301,52301,92201,472603,500754,498012&fuelModels=Y
ngdpbase.addons.feeds.sources.firms-viirs.adapter csv
ngdpbase.addons.feeds.sources.firms-viirs.intervalMinutes 60
ngdpbase.addons.feeds.sources.firms-viirs.map.acq_date acq_date
ngdpbase.addons.feeds.sources.firms-viirs.map.acq_time acq_time
ngdpbase.addons.feeds.sources.firms-viirs.map.confidence confidence
ngdpbase.addons.feeds.sources.firms-viirs.map.frp frp
ngdpbase.addons.feeds.sources.firms-viirs.map.latitude latitude
ngdpbase.addons.feeds.sources.firms-viirs.map.longitude longitude
ngdpbase.addons.feeds.sources.firms-viirs.type Event
ngdpbase.addons.feeds.sources.firms-viirs.url https://firms.modaps.eosdis.nasa.gov/api/area/csv/cca40944ae2c34ea326651daacf6ab81/VIIRS_SNPP_NRT/world/1
ngdpbase.addons.feeds.sources.landslide-events.adapter geojson
ngdpbase.addons.feeds.sources.landslide-events.dailyAt 06:00
ngdpbase.addons.feeds.sources.landslide-events.map.category properties.landslide_category
ngdpbase.addons.feeds.sources.landslide-events.map.country properties.country_name
ngdpbase.addons.feeds.sources.landslide-events.map.date properties.event_date
ngdpbase.addons.feeds.sources.landslide-events.map.fatalities properties.fatality_count
ngdpbase.addons.feeds.sources.landslide-events.map.location properties.location_description
ngdpbase.addons.feeds.sources.landslide-events.map.title properties.event_title
ngdpbase.addons.feeds.sources.landslide-events.map.trigger properties.landslide_trigger
ngdpbase.addons.feeds.sources.landslide-events.map.url properties.source_link
ngdpbase.addons.feeds.sources.landslide-events.recordIdField properties.event_id
ngdpbase.addons.feeds.sources.landslide-events.schemaType Article
ngdpbase.addons.feeds.sources.landslide-events.type Event
ngdpbase.addons.feeds.sources.landslide-events.url https://maps.nccs.nasa.gov/mapping/rest/services/COOLR/COOLR_Events_Point/FeatureServer/0/query?where=1%3D1&outFields=*&orderByFields=event_date%20DESC&resultRecordCount=50&f=geojson
ngdpbase.addons.feeds.sources.tsunami-alerts.adapter geojson
ngdpbase.addons.feeds.sources.tsunami-alerts.intervalMinutes 10
ngdpbase.addons.feeds.sources.tsunami-alerts.map.area properties.areaDesc
ngdpbase.addons.feeds.sources.tsunami-alerts.map.effective properties.effective
ngdpbase.addons.feeds.sources.tsunami-alerts.map.event properties.event
ngdpbase.addons.feeds.sources.tsunami-alerts.map.expires properties.expires
ngdpbase.addons.feeds.sources.tsunami-alerts.map.headline properties.headline
ngdpbase.addons.feeds.sources.tsunami-alerts.map.severity properties.severity
ngdpbase.addons.feeds.sources.tsunami-alerts.map.url id
ngdpbase.addons.feeds.sources.tsunami-alerts.recordIdField id
ngdpbase.addons.feeds.sources.tsunami-alerts.type Event
ngdpbase.addons.feeds.sources.tsunami-alerts.url https://api.weather.gov/alerts/active?event=Tsunami%20Warning,Tsunami%20Advisory,Tsunami%20Watch
ngdpbase.addons.feeds.sources.va-sigmets.adapter rest-json
ngdpbase.addons.feeds.sources.va-sigmets.intervalMinutes 20
ngdpbase.addons.feeds.sources.va-sigmets.map.dir dir
ngdpbase.addons.feeds.sources.va-sigmets.map.fir firName
ngdpbase.addons.feeds.sources.va-sigmets.map.received receiptTime
ngdpbase.addons.feeds.sources.va-sigmets.map.speed_kt spd
ngdpbase.addons.feeds.sources.va-sigmets.map.top_ft top
ngdpbase.addons.feeds.sources.va-sigmets.map.volcano qualifier
ngdpbase.addons.feeds.sources.va-sigmets.recordIdField rawSigmet
ngdpbase.addons.feeds.sources.va-sigmets.type Event
ngdpbase.addons.feeds.sources.va-sigmets.url https://aviationweather.gov/api/data/isigmet?format=json&hazard=VA
ngdpbase.addons.feeds.sources.vaac-advisories.adapter xml-index
ngdpbase.addons.feeds.sources.vaac-advisories.dedupeBy volcanoName
ngdpbase.addons.feeds.sources.vaac-advisories.intervalMinutes 15
ngdpbase.addons.feeds.sources.vaac-advisories.linkPattern xml_files/.*\.xml$
ngdpbase.addons.feeds.sources.vaac-advisories.map.advisoryNumber meteorologicalInformation.VolcanicAshAdvisory.advisoryNumber
ngdpbase.addons.feeds.sources.vaac-advisories.map.ashCloudTopFl meteorologicalInformation.VolcanicAshAdvisory.observation.VolcanicAshObservedOrEstimatedConditions.ashCloud.VolcanicAshCloudObservedOrEstimated.ashCloudExtent.aixm:AirspaceVolume.aixm:upperLimit.#text
ngdpbase.addons.feeds.sources.vaac-advisories.map.directionOfMotionDeg meteorologicalInformation.VolcanicAshAdvisory.observation.VolcanicAshObservedOrEstimatedConditions.ashCloud.VolcanicAshCloudObservedOrEstimated.directionOfMotion.#text
ngdpbase.addons.feeds.sources.vaac-advisories.map.issueTimeUtc meteorologicalInformation.VolcanicAshAdvisory.issueTime.gml:TimeInstant.gml:timePosition
ngdpbase.addons.feeds.sources.vaac-advisories.map.region meteorologicalInformation.VolcanicAshAdvisory.stateOrRegion
ngdpbase.addons.feeds.sources.vaac-advisories.map.remarks meteorologicalInformation.VolcanicAshAdvisory.remarks
ngdpbase.addons.feeds.sources.vaac-advisories.map.sourceXmlUrl __itemUrl
ngdpbase.addons.feeds.sources.vaac-advisories.map.speedOfMotionKt meteorologicalInformation.VolcanicAshAdvisory.observation.VolcanicAshObservedOrEstimatedConditions.ashCloud.VolcanicAshCloudObservedOrEstimated.speedOfMotion.#text
ngdpbase.addons.feeds.sources.vaac-advisories.map.volcanoName meteorologicalInformation.VolcanicAshAdvisory.volcano.EruptingVolcano.name
ngdpbase.addons.feeds.sources.vaac-advisories.maxAgeHours 48
ngdpbase.addons.feeds.sources.vaac-advisories.recordIdField __itemUrl
ngdpbase.addons.feeds.sources.vaac-advisories.type Event
ngdpbase.addons.feeds.sources.vaac-advisories.url https://www.ospo.noaa.gov/products/atmosphere/vaac/archive.html
ngdpbase.addons.feeds.sources.volcanodiscovery-activity.adapter xml
ngdpbase.addons.feeds.sources.volcanodiscovery-activity.intervalMinutes 30
ngdpbase.addons.feeds.sources.volcanodiscovery-activity.itemsPath rss.channel.item
ngdpbase.addons.feeds.sources.volcanodiscovery-activity.map.link link
ngdpbase.addons.feeds.sources.volcanodiscovery-activity.map.pubDate pubDate
ngdpbase.addons.feeds.sources.volcanodiscovery-activity.map.summary description
ngdpbase.addons.feeds.sources.volcanodiscovery-activity.map.title title
ngdpbase.addons.feeds.sources.volcanodiscovery-activity.recordIdField link
ngdpbase.addons.feeds.sources.volcanodiscovery-activity.schemaType Article
ngdpbase.addons.feeds.sources.volcanodiscovery-activity.type VolcanoActivityReport
ngdpbase.addons.feeds.sources.volcanodiscovery-activity.url https://www.volcanodiscovery.com/volcanonews.rss
ngdpbase.addons.feeds.sources.vona.adapter rest-json
ngdpbase.addons.feeds.sources.vona.intervalMinutes 30
ngdpbase.addons.feeds.sources.vona.map.alert alert_level
ngdpbase.addons.feeds.sources.vona.map.color color_code
ngdpbase.addons.feeds.sources.vona.map.gvp vnum
ngdpbase.addons.feeds.sources.vona.map.observatory obs_abbr
ngdpbase.addons.feeds.sources.vona.map.region region
ngdpbase.addons.feeds.sources.vona.map.sent sent_utc
ngdpbase.addons.feeds.sources.vona.map.url vona_url
ngdpbase.addons.feeds.sources.vona.map.volcano volcano_name
ngdpbase.addons.feeds.sources.vona.map.volcano_cd volcano_cd
ngdpbase.addons.feeds.sources.vona.recordIdField notice_identifier
ngdpbase.addons.feeds.sources.vona.type Event
ngdpbase.addons.feeds.sources.vona.url https://volcanoes.usgs.gov/hans-public/api/notice/getVonasWithinLastYear
ngdpbase.addons.feeds.timeout-max-ms 300000
ngdpbase.addons.feeds.timeout-min-ms 5000
ngdpbase.addons.forms.dataPath ${FAST_STORAGE}/forms
ngdpbase.addons.forms.enabled false
ngdpbase.addons.forms.notifyRole admin
ngdpbase.addons.geohazardwatch.dataPath
ngdpbase.addons.geohazardwatch.earthquakesSchedule every 20m
ngdpbase.addons.geohazardwatch.enabled true
ngdpbase.addons.geohazardwatch.hansSchedule every 10m
ngdpbase.addons.geohazardwatch.maxResponseBytes 33554432
ngdpbase.addons.geohazardwatch.volcanoesSchedule { "rrule": "daily 08:00", "tz": "America/New_York" }
ngdpbase.addons.install (hidden)
ngdpbase.addons.page-reseed true

ngdpbase.application.*

Configuration Values (25 matches) — ngdpbase.application.*
Key Value
ngdpbase.application.base-url https://geohazardwatch.com
ngdpbase.application.category Digital Platform
ngdpbase.application.contact.enabled true
ngdpbase.application.contact.footer.enabled true
ngdpbase.application.contact.page
ngdpbase.application.contact.persist.enabled true
ngdpbase.application.contact.persist.path
ngdpbase.application.contact.recipient [email protected]
ngdpbase.application.organization.file geohazardwatch.json
ngdpbase.application.organization.provider fileorganizationprovider
ngdpbase.application.organization.provider.default fileorganizationprovider
ngdpbase.application.organization.search.limit 50
ngdpbase.application.organization.storagedir ${FAST_STORAGE}/organizations
ngdpbase.application.persons.default-country US
ngdpbase.application.persons.link-offer.ttl-minutes 30
ngdpbase.application.persons.provider filepersonprovider
ngdpbase.application.persons.provider.default filepersonprovider
ngdpbase.application.persons.search.limit 50
ngdpbase.application.persons.storagedir ${FAST_STORAGE}/persons
ngdpbase.application.registration false
ngdpbase.application.registration.password true
ngdpbase.application.registration.redirect-page request-access
ngdpbase.application.roles.provider fileroleprovider
ngdpbase.application.roles.provider.default fileroleprovider
ngdpbase.application.roles.storagedir ${FAST_STORAGE}/roles

ngdpbase.attachment.*

Configuration Values (11 matches) — ngdpbase.attachment.*
Key Value
ngdpbase.attachment.allowedtypes image/*,text/*,application/pdf
ngdpbase.attachment.enabled true
ngdpbase.attachment.forcedownload false
ngdpbase.attachment.maxsize 10485760
ngdpbase.attachment.metadatafile ${SLOW_STORAGE}/attachments/attachment-metadata.json
ngdpbase.attachment.provider basicattachmentprovider
ngdpbase.attachment.provider.basic.hashcontent true
ngdpbase.attachment.provider.basic.hashmethod sha256
ngdpbase.attachment.provider.basic.legacyprivateroot private
ngdpbase.attachment.provider.basic.storagedir ${SLOW_STORAGE}/attachments
ngdpbase.attachment.provider.default basicattachmentprovider

ngdpbase.audit.*

Configuration Values (17 matches) — ngdpbase.audit.*
Key Value
ngdpbase.audit.chain-witness.destination
ngdpbase.audit.chain-witness.interval-minutes 60
ngdpbase.audit.enabled true
ngdpbase.audit.events {}
ngdpbase.audit.flushinterval 30000
ngdpbase.audit.loglevel info
ngdpbase.audit.maxqueuesize 1000
ngdpbase.audit.on-failure continue
ngdpbase.audit.provider fileauditprovider
ngdpbase.audit.provider.database.max-results 10000
ngdpbase.audit.provider.default fileauditprovider
ngdpbase.audit.provider.file.archivefilename audit-archive.log
ngdpbase.audit.provider.file.auditfilename audit.log
ngdpbase.audit.provider.file.logdirectory ${FAST_STORAGE}/logs
ngdpbase.audit.provider.file.maxfiles 10
ngdpbase.audit.provider.file.maxfilesize 10MB
ngdpbase.audit.retentiondays 90

ngdpbase.auth.*

Configuration Values (50 matches) — ngdpbase.auth.*
Key Value
ngdpbase.auth.agent-token.default-ttl-hours 24
ngdpbase.auth.agent-token.directory (hidden)
ngdpbase.auth.agent-token.enabled false
ngdpbase.auth.agent-token.max-per-user 10
ngdpbase.auth.agent-token.max-ttl-hours 24
ngdpbase.auth.agent-token.retention-days 1
ngdpbase.auth.agent-token.sweep-interval-seconds 60
ngdpbase.auth.authentik-bearer.audience (hidden)
ngdpbase.auth.authentik-bearer.default-role occupant
ngdpbase.auth.authentik-bearer.enabled true
ngdpbase.auth.authentik-bearer.group-map {}
ngdpbase.auth.authentik-bearer.issuer (hidden)
ngdpbase.auth.authentik-bearer.jwks-url (hidden)
ngdpbase.auth.cloudflare-access.application-aud
ngdpbase.auth.cloudflare-access.default-role reader
ngdpbase.auth.cloudflare-access.enabled false
ngdpbase.auth.cloudflare-access.group-map {}
ngdpbase.auth.cloudflare-access.team-domain
ngdpbase.auth.credentials.file (hidden)
ngdpbase.auth.email-change.cooldown-seconds 60
ngdpbase.auth.email-change.max-per-window 5
ngdpbase.auth.email-change.ttl-minutes 60
ngdpbase.auth.email-change.window-minutes 60
ngdpbase.auth.factors [ { "authproviderid": "passkey", "primary": true, "amr": [ "swk", "user" ], "aal": 2, "acr": "phr", "enabled": true }, { "authproviderid": "password", "primary": true, "amr": [ "pwd" ], "aal": 1, "enabled": true }, { "authproviderid": "magic-link", "primary": true, "amr": [ "email" ], "aal": 1, "enabled": true }, { "authproviderid": "oidc:google", "primary": true, "amr": [ "trust" ], "enabled": true }, { "authproviderid": "cloudflare-access", "primary": true, "amr": [ "trust" ], "enabled": true } ]
ngdpbase.auth.google-oidc.auto-provision true
ngdpbase.auth.google-oidc.callback-url
ngdpbase.auth.google-oidc.client-id
ngdpbase.auth.google-oidc.client-secret
ngdpbase.auth.google-oidc.default-roles [ "reader" ]
ngdpbase.auth.google-oidc.deny-redirect /login?error=Access+denied
ngdpbase.auth.google-oidc.enabled false
ngdpbase.auth.google-oidc.hd
ngdpbase.auth.invitation.ttl-days 7
ngdpbase.auth.magic-link.auto-provision false
ngdpbase.auth.magic-link.bind-to-requesting-device false
ngdpbase.auth.magic-link.enabled false
ngdpbase.auth.magic-link.registration.default-role reader
ngdpbase.auth.magic-link.ttl-minutes 15
ngdpbase.auth.oidc.auto-provision false
ngdpbase.auth.oidc.providers (hidden)
ngdpbase.auth.passkey.enabled true
ngdpbase.auth.password.enabled true
ngdpbase.auth.proxy-access.enabled (hidden)
ngdpbase.auth.step-up { "max-age-minutes": 60 }
ngdpbase.auth.throttle.enabled true
ngdpbase.auth.throttle.lock-minutes 1
ngdpbase.auth.throttle.max-attempts 10
ngdpbase.auth.throttle.max-lock-minutes 15
ngdpbase.auth.throttle.window-minutes 15
ngdpbase.auth.user.default-external false

ngdpbase.backup.*

Configuration Values (17 matches) — ngdpbase.backup.*
Key Value
ngdpbase.backup.auto-backup true
ngdpbase.backup.auto-backup-days daily
ngdpbase.backup.auto-backup-interval 86400000
ngdpbase.backup.auto-backup-time 02:00
ngdpbase.backup.compress true
ngdpbase.backup.directory (hidden)
ngdpbase.backup.env-keys-saved [ "NGDPBASE_BACKUP_KEY", "NGDPBASE_CREDENTIALS_KEY", "NGDPBASE_SESSION_SECRET", "PGID", "PUID" ]
ngdpbase.backup.health-check-interval 3600000
ngdpbase.backup.health-file ${FAST_STORAGE}/backup-health.json
ngdpbase.backup.key-saved-fingerprint
ngdpbase.backup.max-backups 10
ngdpbase.backup.provider filebackupprovider
ngdpbase.backup.restore-manifest (hidden)
ngdpbase.backup.space-margin 1.5
ngdpbase.backup.stale-fallback-days 7
ngdpbase.backup.stale-interval-multiplier 2
ngdpbase.backup.verify-timeout-ms 600000

ngdpbase.breadcrumbs.*

Configuration Values (1 matches) — ngdpbase.breadcrumbs.*
Key Value
ngdpbase.breadcrumbs.maxpages 10

ngdpbase.cache.*

Configuration Values (14 matches) — ngdpbase.cache.*
Key Value
ngdpbase.cache.checkperiod 120
ngdpbase.cache.defaultttl 300
ngdpbase.cache.enabled true
ngdpbase.cache.maxkeys 1000
ngdpbase.cache.provider nodecacheprovider
ngdpbase.cache.provider.default nodecacheprovider
ngdpbase.cache.provider.nodecache.checkperiod 120
ngdpbase.cache.provider.nodecache.maxkeys 1000
ngdpbase.cache.provider.nodecache.stdttl 300
ngdpbase.cache.provider.nodecache.useclones true
ngdpbase.cache.provider.redis.connecttimeout 5000
ngdpbase.cache.provider.redis.enablecluster false
ngdpbase.cache.provider.redis.keyprefix ngdpbase:
ngdpbase.cache.provider.redis.url redis://localhost:6379

ngdpbase.catalog.*

Configuration Values (3 matches) — ngdpbase.catalog.*
Key Value
ngdpbase.catalog.ai.enabled false
ngdpbase.catalog.ai.provider
ngdpbase.catalog.ai.threshold 0.7

ngdpbase.comments.*

Configuration Values (2 matches) — ngdpbase.comments.*
Key Value
ngdpbase.comments.allow true
ngdpbase.comments.storagedir ${SLOW_STORAGE}/comments

ngdpbase.default.*

Configuration Values (3 matches) — ngdpbase.default.*
Key Value
ngdpbase.default.system-category general
ngdpbase.default.template.dateformat dd-MMM-yyyy HH:mm
ngdpbase.default.timezone UTC

ngdpbase.directories.*

Configuration Values (9 matches) — ngdpbase.directories.*
Key Value
ngdpbase.directories.data ${FAST_STORAGE}
ngdpbase.directories.exports ${FAST_STORAGE}/exports
ngdpbase.directories.pages ${SLOW_STORAGE}/pages
ngdpbase.directories.required-pages ./required-pages
ngdpbase.directories.resources ./resources
ngdpbase.directories.schemas ${FAST_STORAGE}/schemas
ngdpbase.directories.templates ./templates
ngdpbase.directories.users ${FAST_STORAGE}/users
ngdpbase.directories.work ./

ngdpbase.features.*

Configuration Values (13 matches) — ngdpbase.features.*
Key Value
ngdpbase.features.export.html true
ngdpbase.features.export.odt false
ngdpbase.features.export.pdf false
ngdpbase.features.images.default-alt Uploaded image
ngdpbase.features.images.default-class wiki-image
ngdpbase.features.images.enabled true
ngdpbase.features.llm.enabled false
ngdpbase.features.llm.endpoint http://localhost:11434
ngdpbase.features.llm.model llama2
ngdpbase.features.maintenance.allow-admins true
ngdpbase.features.maintenance.enabled false
ngdpbase.features.maintenance.estimated-duration
ngdpbase.features.maintenance.message System is currently under maintenance. Please try again later.

ngdpbase.footnotes.*

Configuration Values (2 matches) — ngdpbase.footnotes.*
Key Value
ngdpbase.footnotes.enabled true
ngdpbase.footnotes.storagedir ${SLOW_STORAGE}/footnotes

ngdpbase.github.*

Configuration Values (1 matches) — ngdpbase.github.*
Key Value
ngdpbase.github.repo jwilleke/ngdpbase

ngdpbase.holidays.*

Configuration Values (2 matches) — ngdpbase.holidays.*
Key Value
ngdpbase.holidays.dates { "*-01-01": { "name": "New Year's Day", "message": "Access restricted on New Year's Day", "enabled": true }, "*-12-25": { "name": "Christmas Day", "message": "Access restricted on Christmas Day", "enabled": true } }
ngdpbase.holidays.enabled false

ngdpbase.interwiki.*

Configuration Values (3 matches) — ngdpbase.interwiki.*
Key Value
ngdpbase.interwiki.enabled true
ngdpbase.interwiki.options { "openInNewWindow": true, "addIconIndicator": true, "caseSensitive": false, "showTooltips": true, "cacheTTL": 3600, "maxCacheEntries": 1000 }
ngdpbase.interwiki.sites { "Wikipedia": { "url": "https://en.wikipedia.org/wiki/%s", "description": "Wikipedia, the free encyclopedia", "icon": "wikipedia.png", "enabled": true, "openInNewWindow": true }, "JSPWiki": { "url": "https://jspwiki-wiki.apache.org/Wiki.jsp?page=%s", "description": "Apache JSPWiki Documentation", "icon": "jspwiki.png", "enabled": true, "openInNewWindow": true }, "GVP": { "url": "https://volcano.si.edu/volcano.cfm?vn=%s", "description": "GVP (Global Volcanism Program)", "icon": "gvp-icon.jpg", "enabled": true, "openInNewWindow": true }, "GVP-COUNTRY": { "url": "https://volcano.si.edu/volcanolist_countries.cfm?country=%s", "description": "GVP (Global Volcanism Program) — Volcanoes by Country", "icon": "gvp-icon.jpg", "enabled": true, "openInNewWindow": true }, "geo": { "url": "https://geohazardwatch.com/view/%s", "description": "GeoHazardWatch", "enabled": true, "openInNewWindow": true }, "grok": { "url": "https://grokipedia.com/page/%s", "description": "Grokipedia", "enabled": true, "openInNewWindow": true }, "RFC": { "url": "https://www.rfc-editor.org/rfc/rfc%s", "description": "IETF Request for Comments", "enabled": true, "openInNewWindow": true } }

ngdpbase.location.*

Configuration Values (1 matches) — ngdpbase.location.*
Key Value
ngdpbase.location.default-provider osm

ngdpbase.logging.*

Configuration Values (8 matches) — ngdpbase.logging.*
Key Value
ngdpbase.logging.debug.enabled false
ngdpbase.logging.debug.login false
ngdpbase.logging.debug.session false
ngdpbase.logging.dir ${FAST_STORAGE}/logs
ngdpbase.logging.level info
ngdpbase.logging.max-files 5
ngdpbase.logging.max-size 1MB
ngdpbase.logging.provider fileloggingprovider

ngdpbase.mail.*

Configuration Values (15 matches) — ngdpbase.mail.*
Key Value
ngdpbase.mail.attachments.max-bytes 10485760
ngdpbase.mail.enabled true
ngdpbase.mail.failure-notice.window-minutes 60
ngdpbase.mail.from GeoHazardWatch Contact <[email protected]>
ngdpbase.mail.honeypot.enabled true
ngdpbase.mail.provider smtp
ngdpbase.mail.provider.smtp.from
ngdpbase.mail.provider.smtp.host smtp.gmail.com
ngdpbase.mail.provider.smtp.pass (hidden)
ngdpbase.mail.provider.smtp.port 587
ngdpbase.mail.provider.smtp.secure false
ngdpbase.mail.provider.smtp.user [email protected]
ngdpbase.mail.rate-limit.enabled true
ngdpbase.mail.rate-limit.max-submissions 5
ngdpbase.mail.rate-limit.window-minutes 15

ngdpbase.managers.*

Configuration Values (15 matches) — ngdpbase.managers.*
Key Value
ngdpbase.managers.addons-manager.addons-path [ "/app/addons", "/opt/geohazardwatch/addons", "node_modules:@jwilleke/*-addon" ]
ngdpbase.managers.addons-manager.enabled true
ngdpbase.managers.addons-manager.install.max-metadata-bytes 16777216
ngdpbase.managers.addons-manager.install.max-tarball-bytes 52428800
ngdpbase.managers.addons-manager.install.max-unpacked-bytes 209715200
ngdpbase.managers.addons-manager.install.registry (hidden)
ngdpbase.managers.addons-manager.install.sigstore-tuf-url (hidden)
ngdpbase.managers.addons-manager.install.timeout-ms 30000
ngdpbase.managers.cache-manager.enabled true
ngdpbase.managers.page-manager.enabled true
ngdpbase.managers.plugin-manager.enabled true
ngdpbase.managers.plugin-manager.search-paths { "./dist/src/plugins": true }
ngdpbase.managers.rendering-manager.enabled true
ngdpbase.managers.search-manager.enabled true
ngdpbase.managers.template-manager.enabled true

ngdpbase.markdown.*

Configuration Values (3 matches) — ngdpbase.markdown.*
Key Value
ngdpbase.markdown.footnotes.enabled true
ngdpbase.markdown.ncm.image.ad-deny-list { "doubleclick.net": true, "googlesyndication.com": true, "google-analytics.com": true, "facebook.com/tr": true, "scorecardresearch.com": true }
ngdpbase.markdown.ncm.table.default-classes [ "table-fit", "table-bordered", "table-striped", "table-hover", "sortable" ]

ngdpbase.markup.*

Configuration Values (32 matches) — ngdpbase.markup.*
Key Value
ngdpbase.markup.cache-ttl 300
ngdpbase.markup.cache.metrics-enabled true
ngdpbase.markup.cache.parse-results.enabled true
ngdpbase.markup.cache.parse-results.max-size 1000
ngdpbase.markup.cache.parse-results.ttl 300
ngdpbase.markup.caching true
ngdpbase.markup.enabled true
ngdpbase.markup.fallback-to-legacy true
ngdpbase.markup.fenced-code-tags { "text": true, "txt": true, "plaintext": true, "plain": true, "none": true, "javascript": true, "js": true, "typescript": true, "ts": true, "jsx": true, "tsx": true, "html": true, "xml": true, "svg": true, "css": true, "scss": true, "sass": true, "less": true, "json": true, "yaml": true, "yml": true, "toml": true, "bash": true, "sh": true, "shell": true, "zsh": true, "python": true, "py": true, "java": true, "kotlin": true, "c": true, "cpp": true, "csharp": true, "cs": true, "go": true, "rust": true, "ruby": true, "php": true, "sql": true, "markdown": true, "md": true, "diff": true, "patch": true, "mermaid": true }
ngdpbase.markup.handler-registry.allow-duplicate-priorities true
ngdpbase.markup.handler-registry.default-timeout 5000
ngdpbase.markup.handler-registry.enable-conflict-detection true
ngdpbase.markup.handler-registry.enable-dependency-resolution true
ngdpbase.markup.handler-registry.max-handlers 100
ngdpbase.markup.handlers.form.enabled true
ngdpbase.markup.handlers.form.priority 85
ngdpbase.markup.handlers.interwiki.enabled true
ngdpbase.markup.handlers.interwiki.priority 80
ngdpbase.markup.handlers.plugin.enabled true
ngdpbase.markup.handlers.plugin.priority 90
ngdpbase.markup.handlers.rss.enabled true
ngdpbase.markup.handlers.rss.priority 60
ngdpbase.markup.handlers.search.enabled true
ngdpbase.markup.handlers.search.priority 65
ngdpbase.markup.handlers.style.enabled true
ngdpbase.markup.handlers.style.priority 70
ngdpbase.markup.handlers.wikitag.enabled true
ngdpbase.markup.handlers.wikitag.priority 95
ngdpbase.markup.html-policy { "tags": { "p": true, "div": true, "span": true, "br": true, "hr": true, "strong": true, "em": true, "b": true, "i": true, "u": true, "s": true, "del": true, "ins": true, "mark": true, "small": true, "sub": true, "sup": true, "ul": true, "ol": true, "li": true, "dl": true, "dt": true, "dd": true, "h1": true, "h2": true, "h3": true, "h4": true, "h5": true, "h6": true, "a": true, "img": true, "figure": true, "figcaption": true, "blockquote": true, "q": true, "cite": true, "code": true, "pre": true, "kbd": true, "samp": true, "var": true, "table": true, "thead": true, "tbody": true, "tfoot": true, "tr": true, "th": true, "td": true, "caption": true, "colgroup": true, "col": true, "abbr": true, "time": true, "details": true, "summary": true }, "attributes": { "*": { "class": true, "title": true, "lang": true, "dir": true }, "a": { "href": true, "name": true, "target": true, "rel": true }, "img": { "src": true, "alt": true, "width": true, "height": true, "loading": true }, "th": { "colspan": true, "rowspan": true, "scope": true }, "td": { "colspan": true, "rowspan": true }, "col": { "span": true }, "colgroup": { "span": true }, "ol": { "start": true, "reversed": true, "type": true }, "li": { "value": true }, "blockquote": { "cite": true }, "q": { "cite": true }, "del": { "cite": true, "datetime": true }, "ins": { "cite": true, "datetime": true }, "time": { "datetime": true }, "details": { "open": true } }, "schemes": { "http": true, "https": true, "mailto": true, "tel": true }, "schemes-by-tag": { "img": { "http": true, "https": true, "data": true } } }
ngdpbase.markup.integration.rendering-manager true
ngdpbase.markup.log-parsing-method true
ngdpbase.markup.use-advanced-parser true

ngdpbase.maximum.*

No config keys match pattern: ngdpbase.maximum.*

ngdpbase.media.*

Configuration Values (9 matches) — ngdpbase.media.*
Key Value
ngdpbase.media.enabled false
ngdpbase.media.extensions { "jpg": true, "jpeg": true, "png": true, "gif": true, "heic": true, "heif": true, "tiff": true, "tif": true, "webp": true, "raw": true, "orf": true, "cr2": true, "nef": true, "arw": true, "dng": true, "bmp": true, "mp4": true, "mov": true, "avi": true, "mkv": true, "m4v": true, "wmv": true, "3gp": true, "m2ts": true }
ngdpbase.media.folders (hidden)
ngdpbase.media.ignoredirs [ ".dtrash", ".ts" ]
ngdpbase.media.maxdepth 5
ngdpbase.media.metadata.priority [ "EXIF", "IPTC", "XMP" ]
ngdpbase.media.readonly true
ngdpbase.media.scaninterval 3600000
ngdpbase.media.thumbnail.sizes 300x300,150x150

ngdpbase.notifications.*

Configuration Values (6 matches) — ngdpbase.notifications.*
Key Value
ngdpbase.notifications.auto-save-interval 300000
ngdpbase.notifications.dir ${FAST_STORAGE}/notifications
ngdpbase.notifications.escalation.enabled false
ngdpbase.notifications.escalation.levels [ "error" ]
ngdpbase.notifications.escalation.recipient-role admin
ngdpbase.notifications.file notifications.json

ngdpbase.page.*

Configuration Values (19 matches) — ngdpbase.page.*
Key Value
ngdpbase.page.delete.retentiondays 30
ngdpbase.page.enabled true
ngdpbase.page.nofooter [ "LeftMenu", "Footer", "Template:PageTabs" ]
ngdpbase.page.notabs [ "LeftMenu", "Footer", "Template:PageTabs" ]
ngdpbase.page.provider versioningfileprovider
ngdpbase.page.provider.default filesystemprovider
ngdpbase.page.provider.filesystem.attachmentsdir attachments
ngdpbase.page.provider.filesystem.autosave true
ngdpbase.page.provider.filesystem.commentsdir comments
ngdpbase.page.provider.filesystem.deleteddir deleted
ngdpbase.page.provider.filesystem.encoding utf-8
ngdpbase.page.provider.filesystem.footnotesdir footnotes
ngdpbase.page.provider.filesystem.private.files.storemeta store.json
ngdpbase.page.provider.filesystem.private.files.userindex user-index.json
ngdpbase.page.provider.filesystem.private.files.userkeys user-keys.json
ngdpbase.page.provider.filesystem.requiredpagesdir ./required-pages
ngdpbase.page.provider.filesystem.storagedir ${SLOW_STORAGE}/pages
ngdpbase.page.provider.filesystem.versionsdir versions
ngdpbase.page.provider.versioning.indexfile ${FAST_STORAGE}/page-index.json

ngdpbase.permissions.*

Configuration Values (1 matches) — ngdpbase.permissions.*
Key Value
ngdpbase.permissions.definitions { "page-read": { "description": "View pages", "label": "View pages", "icon": "eye", "color": "#6c757d", "audit": { "on-failure": "continue", "enabled": false, "description": "Page read; off by default so a general-purpose deployment does not drown its log in reads. On, a records-style deployment gets who looked at what (#1129)" } }, "page-edit": { "description": "Edit pages", "label": "Edit pages", "icon": "edit", "color": "#007bff", "audit": { "on-failure": "continue", "description": "Page edited" } }, "page-public": { "description": "Make a page public: move it out of its vault (checked by the page's system-category, #1504)", "label": "Make a page public by moving it out of its vault", "icon": "globe", "color": "#20c997" }, "page-create": { "description": "Create new pages", "label": "Create pages", "icon": "plus", "color": "#28a745", "audit": { "on-failure": "continue", "description": "Page created" } }, "page-delete": { "description": "Delete pages", "label": "Delete pages", "icon": "trash", "color": "#dc3545", "audit": { "on-failure": "refuse", "description": "Page deleted; destruction, so the record must outlive the page" } }, "page-rename": { "description": "Rename pages", "label": "Rename pages", "icon": "i-cursor", "color": "#fd7e14", "audit": { "on-failure": "continue", "description": "Page renamed" } }, "page-export": { "description": "Export pages", "label": "Export pages", "icon": "file-export", "color": "#6c757d", "audit": { "on-failure": "continue", "description": "Page exported to a file; bulk extraction of content, gated on read until a bulk surface exists" } }, "asset-read": { "description": "View assets (attachments)", "label": "View attachments", "icon": "paperclip", "color": "#6c757d", "audit": { "on-failure": "continue", "enabled": false, "description": "Attachment read; not recorded, read volume" } }, "media-read": { "description": "Browse and view the media library (not delegated to anonymous visitors)", "label": "Browse and view the media library", "icon": "images", "color": "#6c757d" }, "asset-upload": { "description": "Upload assets", "label": "Upload attachments", "icon": "upload", "color": "#28a745", "audit": { "on-failure": "continue", "description": "File uploaded" } }, "asset-delete": { "description": "Delete assets", "label": "Delete attachments", "icon": "trash", "color": "#dc3545", "audit": { "on-failure": "refuse", "description": "File deleted; destruction" } }, "share-create": { "description": "Create share links — hand out anonymous read access to content you may read — and see your own (#1224, #1638)", "label": "Create share links and see your own", "icon": "share-alt", "color": "#20c997", "audit": { "on-failure": "refuse", "description": "Share link created; mints an anonymous-access credential, the same shape as token-mint" } }, "share-extend": { "description": "Extend your own share links (#1638)", "label": "Extend your own share links", "icon": "clock", "color": "#20c997", "audit": { "on-failure": "refuse", "description": "Share link's lifetime extended by its issuer, by up to 24 hours (#1388)" } }, "share-revoke": { "description": "Revoke your own share links; revoking anyone's also needs admin-system (#1638)", "label": "Revoke your own share links", "icon": "ban", "color": "#20c997", "audit": { "on-failure": "refuse", "description": "Share link revoked; pairs with token-revoke" } }, "profile-manage": { "description": "Manage your own account — profile, preferences, display theme, pinned pages and the /my/* pages (#1198). Every signed-in role; never anonymous", "label": "Manage your own profile and preferences", "icon": "user-cog", "color": "#6f42c1" }, "account-security": { "description": "Change what protects your own account — password, email, sign-in methods (passkeys), vault takeout and import, approving a device (#1525). Granted wherever profile-manage is; asks for a fresh sign-in when listed in ngdpbase.auth.step-up", "label": "Change your password, email and sign-in methods, and approve devices", "icon": "user-shield", "color": "#6f42c1", "step-up": true }, "config-manage": { "description": "Change any configuration setting, and download a backup (#1525). Admin only by default; asks for a fresh sign-in when listed in ngdpbase.auth.step-up", "label": "Change site settings and download backups", "icon": "sliders-h", "color": "#dc3545", "step-up": true }, "secret-reveal": { "description": "Unmask a configuration secret (#1525). Admin only by default; asks for a fresh sign-in when listed in ngdpbase.auth.step-up. Hashed credentials (agent tokens) and shown-once secrets can never be revealed", "label": "Show hidden configuration secrets", "icon": "eye-slash", "color": "#dc3545", "audit": { "on-failure": "continue", "description": "A masked configuration value shown to an administrator; the key is recorded, never the value" }, "step-up": true }, "comment-create": { "description": "Add a comment, and delete your own; deleting anyone's is admin-system (#1198)", "label": "Add comments and delete your own", "icon": "comment", "color": "#0dcaf0", "audit": { "on-failure": "continue", "description": "Comment added to a page — user content written on someone's behalf, the page-edit class (#1232)" } }, "token-mint": { "description": "Mint, list and revoke your own agent tokens — a standing credential carrying a slice of your authority (#1198, #1178). Every signed-in role except demo-admin; never anonymous (#1734). A token can never carry this scope", "label": "Make and revoke your own agent tokens", "icon": "key", "color": "#fd7e14", "audit": { "on-failure": "refuse", "description": "Agent token minted; a credential nobody knows exists is the worst case" }, "step-up": true }, "token-extend": { "description": "Extend your own live agent tokens instead of minting new ones, to at most max-ttl-hours from now; the token and its scopes stay the same (#1734). Admin only by default. A token can never carry this scope", "label": "Extend your own agent tokens", "icon": "clock", "color": "#fd7e14", "audit": { "on-failure": "refuse", "description": "Agent token's expiry moved later by its owner; carries the old and new expiry (#1734)" }, "step-up": true }, "proxy-grant": { "description": "Let another person act for you, within permissions you hold, and revoke it (#1762). Every signed-in role except demo-admin; an administrator making or revoking a grant for someone else also needs user-edit, and that grant never carries a copy of the person's vault key. A grant that includes proxy-grant lets the proxy give others access too. Asks for a fresh sign-in", "label": "Let someone act for you, and stop them", "icon": "user-friends", "color": "#fd7e14", "audit": { "on-failure": "refuse", "description": "Proxy grant made: someone may act for the user named in user; actor is who made it (#1762)" }, "step-up": true }, "vault-proxy": { "description": "Let a person acting for you into your vaults (#1762). Read only from a proxy grant: a grant that includes it lets the proxy act inside your vaults within the grant's other permissions; without it a proxy never reaches them. Encrypted vaults stay shut to a proxy until a vault key copy is supported (#1762 slice 5). Every signed-in role except demo-admin, beside proxy-grant. Never carried by an agent token or an app", "label": "Let someone acting for you into your vaults", "icon": "lock-open", "color": "#fd7e14", "audit": { "on-failure": "continue", "enabled": false, "description": "Not an action: read from a proxy grant at the vault door; the grant itself is recorded as proxy-grant" } }, "store-create": { "description": "Walk through a private store's door and create your own copy of it — with a user key and recovery words when the store kind is encrypted (#1414). Every signed-in role; never anonymous. The door also needs a password sign-in, so a token or share cannot use it", "label": "Create your own private store", "icon": "lock", "color": "#198754", "audit": { "on-failure": "refuse", "description": "A user's private store copy created at its door (#1414) — with key material when sealed; never the words or a key in the record" } }, "asset-edit": { "description": "Edit asset metadata (EXIF/IPTC/XMP)", "label": "Edit attachment details such as photo information", "icon": "pen", "color": "#fd7e14", "audit": { "on-failure": "continue", "description": "Attachment metadata edited; EXIF/IPTC and catalog fields change provenance" } }, "search-page": { "description": "Search pages", "label": "Search pages", "icon": "search", "color": "#6c757d", "audit": { "on-failure": "continue", "enabled": false, "description": "Page search; not recorded, read volume" } }, "search-user": { "description": "Search users", "label": "Search for people", "icon": "search", "color": "#6c757d", "audit": { "on-failure": "continue", "enabled": false, "description": "Users searched for; enumerating users is disclosive in a way searching pages is not. Off by default as read volume" } }, "user-read": { "description": "View user list and profiles", "label": "View the list of people and their profiles", "icon": "users", "color": "#6c757d", "audit": { "on-failure": "continue", "enabled": false, "description": "User profile read; not recorded, read volume" } }, "user-edit": { "description": "Edit user accounts", "label": "Edit people's accounts", "icon": "user-edit", "color": "#007bff", "audit": { "on-failure": "continue", "description": "Account changed in a way that alters what it may do or who holds it: roles, password, active, external, email, profile lock. Preference edits are not recorded" } }, "user-create": { "description": "Create user accounts", "label": "Create accounts", "icon": "user-plus", "color": "#28a745", "audit": { "on-failure": "continue", "description": "Account created; by an administrator, by self-registration, or provisioned by an identity provider" } }, "user-delete": { "description": "Delete user accounts", "label": "Delete accounts", "icon": "user-minus", "color": "#dc3545", "audit": { "on-failure": "refuse", "description": "Account deleted; destruction of an identity and its attribution, recorded before the delete" } }, "identity-read": { "description": "List, search and view identity records, of users and contacts alike, and organizations, and their affiliations, through IdentityManager and OrganizationManager, and the /admin/contacts and /admin/organizations views (#1930). Was contact-read until #2038; a policy naming that is still read as this for one release. Admins and demo admins by default; an add-on grants it to its own roles in its own policy", "label": "Find and view identity records (users, contacts and organizations)", "icon": "address-book", "color": "#6c757d" }, "identity-manage": { "description": "Create, edit, delete and link identity records, of users and contacts alike, and organizations, and an identity's affiliations, through IdentityManager and OrganizationManager (#1930). Reading them is identity-read. Was contact-manage until #2038; a policy naming that is still read as this for one release. Admins by default; an add-on grants it to its own roles in its own policy", "label": "Add, change and link identity records (users, contacts and organizations)", "icon": "address-book", "color": "#0d6efd", "audit": { "on-failure": "continue", "description": "Identity record or organization created, changed, deleted or linked to an account (recorded as contact-manage before #2038); metadata names the kind (person or organization), the operation and the fields changed, never their values" } }, "admin-read": { "description": "View administration screens (read-only, no changes)", "label": "View administration screens without changing anything", "icon": "eye", "color": "#6c757d", "audit": { "on-failure": "continue", "enabled": false, "description": "Admin dashboard read; not recorded, read volume" } }, "admin-system": { "description": "System administration", "label": "Administer the site", "icon": "cog", "color": "#dc3545" }, "admin-roles": { "description": "Role management", "label": "Manage roles", "icon": "shield-alt", "color": "#dc3545" }, "comment-delete": { "description": "Comment marked deleted; who removed it and whose it was (#1232)", "grantable": false, "audit": { "on-failure": "continue" } }, "vault-repair": { "description": "A vault page's leftovers moved into its vault (#1842): its shared-pool files (moved, or copied where other public pages use them) and its footnotes and comments from the public folders. Names the owner, vault and page uuid and the counts, never a title or file name. Run by the vault's owner, or for a vault that isn't sealed by someone holding admin-system", "grantable": false, "audit": { "on-failure": "refuse" } }, "footnote-edit": { "description": "A page's footnote list changed — action add, import, transfer, update or delete; page content written on someone's behalf (#1233)", "grantable": false, "audit": { "on-failure": "continue" } }, "page-link-rewrite": { "description": "Inbound links rewritten after a rename", "grantable": false, "audit": { "on-failure": "continue" } }, "token-revoke": { "description": "Agent token revoked", "grantable": false, "audit": { "on-failure": "refuse" } }, "proxy-revoke": { "description": "Proxy grant ended: revoked, or the account closed; user is the user represented, actor who ended it (#1762)", "grantable": false, "audit": { "on-failure": "refuse" } }, "consent-grant": { "description": "A user accepted a document they are asked to accept (#1603): which document (core's terms-of-service or privacy-policy, or an add-on's), its version and effective date, and how (sign-up, sign-in, turning an add-on on). Recorded before the acceptance is stored, which cannot proceed without it: consent must be provable", "grantable": false, "audit": { "on-failure": "refuse" } }, "consent-withdraw": { "description": "A user's acceptances ended (#1603): today only when their account is deleted, which removes their consent records; names the documents and versions they had accepted. Recorded before the records are removed", "grantable": false, "audit": { "on-failure": "refuse" } }, "proxy-switch": { "description": "A signed-in session started or stopped acting for someone under a proxy grant, or opens their private store: chosen, switched-back, ended because the grant no longer allows it (grant-ended, proxy-access-off), or vault-opened; user is the user represented, actor the user signed in (#1762)", "grantable": false, "audit": { "on-failure": "continue" } }, "authentication-success": { "description": "Sign-in succeeded", "grantable": false, "audit": { "on-failure": "continue" } }, "authentication-failed": { "description": "Sign-in failed", "grantable": false, "audit": { "on-failure": "continue" } }, "authentication-logout": { "description": "User signed out", "grantable": false, "audit": { "on-failure": "continue" } }, "authorization-deny": { "description": "Access denied", "grantable": false, "audit": { "on-failure": "continue" } }, "authorization-allow": { "description": "Access granted; emitter exists, nothing in production calls it", "grantable": false, "audit": { "on-failure": "continue" } }, "policy-evaluate": { "description": "Security policy evaluated; emitter exists, nothing in production calls it", "grantable": false, "audit": { "on-failure": "continue" } }, "security-event": { "description": "Security violation detected; the kind is in metadata.securityEventType", "grantable": false, "audit": { "on-failure": "continue" } }, "share-access": { "description": "Share link used; batched counts for keyword links, one record per page or file opened through a vault link (#1388)", "grantable": false, "audit": { "on-failure": "continue" } }, "system-start": { "description": "Instance started; reports whether the previous run ended cleanly", "grantable": false, "audit": { "on-failure": "refuse" } }, "system-shutdown": { "description": "Instance shut down cleanly; its absence before the next start is the signal", "grantable": false, "audit": { "on-failure": "refuse" } }, "config-change": { "description": "Configuration changed by an administrator; standard so a broken audit configuration can still be repaired from the UI", "grantable": false, "audit": { "on-failure": "continue" } }, "manager-state-change": { "description": "A manager changed state: degraded, disabled, failed or recovered", "grantable": false, "audit": { "on-failure": "continue" } }, "posture-recorded": { "description": "Security posture at startup, compared against the previous start", "grantable": false, "audit": { "on-failure": "refuse" } }, "job-started": { "description": "A background job started, and who asked for it", "grantable": false, "audit": { "on-failure": "continue" } }, "review-filed": { "description": "A request was filed for review (#2072): who filed it, its id, kind, the add-on handler and the permission whose holders decide; never its summary or details", "grantable": false, "audit": { "on-failure": "continue" } }, "review-approved": { "description": "A request was approved and the add-on's handler carried it out (#2072): who decided, its id, kind and handler; never the note, summary or details", "grantable": false, "audit": { "on-failure": "continue" } }, "review-rejected": { "description": "A request was rejected (#2072): who decided, its id, kind and handler; never the note, summary or details", "grantable": false, "audit": { "on-failure": "continue" } }, "review-failed": { "description": "A request was approved but the add-on's handler did not carry it out, so it stays open (#2072): who approved it, its id, kind and handler", "grantable": false, "audit": { "on-failure": "continue" } }, "job-completed": { "description": "A background job finished successfully", "grantable": false, "audit": { "on-failure": "continue" } }, "job-failed": { "description": "A background job failed", "grantable": false, "audit": { "on-failure": "continue" } }, "job-skipped": { "description": "Scheduled slots a job passed over, by its catch-up or overlap rule", "grantable": false, "audit": { "on-failure": "continue" } }, "job-interrupted": { "description": "A scheduled run stopped by shutdown and handed to the next start, which resumes it", "grantable": false, "audit": { "on-failure": "continue" } }, "job-retry": { "description": "An administrator retried a scheduled run now instead of at its retry time", "grantable": false, "audit": { "on-failure": "continue" } }, "job-schedule-change": { "description": "A scheduled job's rule changed; its slots are counted again from then", "grantable": false, "audit": { "on-failure": "continue" } }, "page-raw-edit": { "description": "Edit a page's raw file in the admin raw editor — bypasses the page editor's checks (#1638)", "label": "Edit a page's raw file, skipping the page editor's checks", "icon": "file-code", "color": "#dc3545", "audit": { "on-failure": "continue", "description": "Page edited through the admin raw editor" } }, "session-revoke": { "description": "End another person's signed-in session (#1638)", "label": "Sign other people out", "icon": "user-slash", "color": "#dc3545", "audit": { "on-failure": "continue", "description": "Session revoked by an administrator" } }, "session-clear-anonymous": { "description": "Anonymous sessions cleared", "grantable": false, "audit": { "on-failure": "continue" } }, "store-takeout": { "description": "A whole private store downloaded by its owner, DECRYPTED; who took it, which store, and how much left", "grantable": false, "audit": { "on-failure": "continue" } }, "store-import": { "description": "A takeout imported into its owner's private store; a bulk write — who, which store, pages and files written or skipped", "grantable": false, "audit": { "on-failure": "continue" } }, "config-reset": { "description": "Every custom configuration value discarded; recorded before the reset, which cannot proceed without it", "grantable": false, "audit": { "on-failure": "refuse" } }, "backup-create": { "description": "A full backup written; where it went and who asked", "grantable": false, "audit": { "on-failure": "continue" } }, "backup-restore": { "description": "A restore of a backup's databases started from Admin → Backup: which backup and who asked; recorded before the fresh backup and the staging, which cannot proceed without it (#1723)", "grantable": false, "audit": { "on-failure": "refuse" } }, "backup-restore-replace": { "description": "A staged database restore replaced by another before the restart applied it: which backup replaced which, and who asked; recorded first, which cannot proceed without it (#1723)", "grantable": false, "audit": { "on-failure": "refuse" } }, "backup-restore-cancel": { "description": "A staged database restore cancelled before the restart applied it: which backup, who staged it and who cancelled; recorded first, which cannot proceed without it (#1723)", "grantable": false, "audit": { "on-failure": "refuse" } }, "backup-restore-applied": { "description": "A staged restore (site or databases-only) put in place at start: which backup, when it was taken, who started the restore and which parts were applied; written into the restored audit log, so the log itself says a restore happened (#1876)", "grantable": false, "audit": { "on-failure": "continue" } }, "addon-install": { "description": "An add-on named in ngdpbase.addons.install installed into the data folder: package, version, sha512 and the repository its provenance names; recorded before it is written, which cannot proceed without it (#1830)", "grantable": false, "audit": { "on-failure": "refuse" } }, "addon-update": { "description": "An installed add-on moved to another version by an administrator's Update: who, and from which version to which (#1830; the Update action is not built yet)", "grantable": false, "audit": { "on-failure": "refuse", "enabled": false } }, "addon-verify-failed": { "description": "An add-on refused or set aside by a check: its sha512, provenance, tarball contents, package.json, the lock file, or a changed installed folder (#1830)", "grantable": false, "audit": { "on-failure": "continue" } }, "audit-export": { "description": "Export the audit trail to a file (#1638)", "label": "Export the audit trail", "icon": "file-export", "color": "#dc3545", "audit": { "on-failure": "continue", "description": "The audit trail exported to a file; who took a copy, in what format, with what filter" } }, "audit-chain-restart": { "description": "Hash chain restarted, with the reason; the marker is the action and cannot half-complete", "grantable": false, "audit": { "on-failure": "refuse" } }, "oidcauthorize-allow": { "description": "OpenID Connect: an app's sign-in request was allowed and a code issued (#1575)", "grantable": false, "audit": { "on-failure": "continue" } }, "oidcauthorize-deny": { "description": "OpenID Connect: an app's sign-in request was refused (denied consent, sign-in required, bad request)", "grantable": false, "audit": { "on-failure": "continue" } }, "oidctoken-issue": { "description": "OpenID Connect: tokens issued to an app, with the grant type that earned them", "grantable": false, "audit": { "on-failure": "continue" } }, "oidctoken-error": { "description": "OpenID Connect: the token endpoint refused an app's request", "grantable": false, "audit": { "on-failure": "continue" } }, "oidctoken-reuse": { "description": "OpenID Connect: a used code or refresh token was presented again; its grant was revoked (possible replay)", "grantable": false, "audit": { "on-failure": "continue" } }, "oidctoken-revoke": { "description": "OpenID Connect: an access or refresh token was destroyed", "grantable": false, "audit": { "on-failure": "continue" } }, "oidcgrant-revoke": { "description": "OpenID Connect: an app's grant and every token under it were revoked", "grantable": false, "audit": { "on-failure": "continue" } }, "oidcuserinfo-error": { "description": "OpenID Connect: UserInfo refused a request (bad, expired or revoked token, unknown account)", "grantable": false, "audit": { "on-failure": "continue" } }, "oidcserver-error": { "description": "OpenID Connect: the provider failed while handling a request", "grantable": false, "audit": { "on-failure": "continue" } }, "reauth-prompt": { "description": "Step-up: an action asked for a fresh sign-in (#1525) — or refused a delegated credential that cannot give one", "grantable": false, "audit": { "on-failure": "continue" } }, "reauth-success": { "description": "Step-up: the user re-authenticated, with the factor used", "grantable": false, "audit": { "on-failure": "continue" } }, "reauth-failure": { "description": "Step-up: a re-authentication failed (wrong password, another user's passkey, throttled)", "grantable": false, "audit": { "on-failure": "continue" } }, "signinapproval-request": { "description": "Sign-in approval: an approval message was sent for a waiting sign-in, saying from where (IP, approximate place, browser) (#1532)", "grantable": false, "audit": { "on-failure": "continue" } }, "signinapproval-open": { "description": "Sign-in approval: the approval page was opened, with the opener's IP and browser; opening changes nothing (#1532)", "grantable": false, "audit": { "on-failure": "continue" } }, "signinapproval-approve": { "description": "Sign-in approval: the user pressed Approve (#1532)", "grantable": false, "audit": { "on-failure": "continue" } }, "signinapproval-deny": { "description": "Sign-in approval: the user pressed Deny; that sign-in will not complete (#1532)", "grantable": false, "audit": { "on-failure": "continue" } }, "signinapproval-expire": { "description": "Sign-in approval: a waiting sign-in expired before it was completed (#1532)", "grantable": false, "audit": { "on-failure": "continue" } }, "emailchange-request": { "description": "A user asked to change their own email: a confirmation link was sent to the new address (#2073). Names only, never an address", "grantable": false, "audit": { "on-failure": "continue" } }, "emailchange-confirm": { "description": "A user's new email was confirmed by its emailed link and saved (#2073). Names only, never an address", "grantable": false, "audit": { "on-failure": "continue" } }, "signinapproval-sendfail": { "description": "Sign-in approval: the approval message could not be sent (transport error, or no channel configured) (#1532)", "grantable": false, "audit": { "on-failure": "continue" } }, "signinapproval-abandon": { "description": "Sign-in approval: the browser that was waiting gave up the sign-in (#1532)", "grantable": false, "audit": { "on-failure": "continue" } }, "signinapproval-throttle": { "description": "Sign-in approval: another approval message was asked for too soon and not sent (#1532)", "grantable": false, "audit": { "on-failure": "continue" } }, "invitation-send": { "description": "Invitation sent (#2049): a one-time link emailed to a new user to set up their sign-in; user is who sent it, resource the account invited. A credential nobody knows exists is the worst case, so it is recorded before the link exists", "grantable": false, "audit": { "on-failure": "refuse" } }, "invitation-use": { "description": "Invitation used (#2049): the invited user opened their link and was signed in once; the link is spent", "grantable": false, "audit": { "on-failure": "continue" } }, "invitation-cancel": { "description": "Invitation cancelled (#2049): an administrator cancelled it or sent a new one, the email could not be sent, or the account was deleted; the link stops working", "grantable": false, "audit": { "on-failure": "refuse" } }, "invitation-expire": { "description": "Invitation expired (#2049): the link was not used in time and was removed", "grantable": false, "audit": { "on-failure": "continue" } } }

ngdpbase.plugin.*

Configuration Values (3 matches) — ngdpbase.plugin.*
Key Value
ngdpbase.plugin.searchresult.maxItems 50
ngdpbase.plugin.searchresult.showScore true
ngdpbase.plugin.versioning.use true

ngdpbase.roles.*

Configuration Values (1 matches) — ngdpbase.roles.*
Key Value
ngdpbase.roles.definitions { "admin": { "name": "admin", "required-aal": 2, "displayname": "Administrator", "description": "Full system access to all features", "issystem": true, "icon": "shield-alt", "color": "#dc3545" }, "user-admin": { "name": "user-admin", "required-aal": 2, "displayname": "User Administrator", "description": "Can manage users — create, edit, deactivate, delete", "issystem": true, "icon": "user-cog", "color": "#6610f2" }, "editor": { "name": "editor", "required-aal": 1, "displayname": "Editor", "description": "Can create, edit, delete, and rename pages", "issystem": true, "icon": "edit", "color": "#007bff" }, "contributor": { "name": "contributor", "required-aal": 1, "displayname": "Contributor", "description": "Can create and edit pages", "issystem": true, "icon": "user-edit", "color": "#28a745" }, "demo-admin": { "name": "demo-admin", "required-aal": 1, "displayname": "Demo Administrator", "description": "Read-only access to the admin dashboard. For public demo instances: can view every admin screen but change nothing, and cannot see the user list.", "issystem": false, "icon": "eye", "color": "#6c757d" }, "vault-owner": { "name": "vault-owner", "required-aal": 1, "displayname": "Vault Owner", "description": "Everything inside your own vaults — pages and files: read, create, edit, rename, delete, upload, share by link. Applies only in vaults you own; not deleting a vault. Given to every account (#1539)", "issystem": true, "icon": "lock", "color": "#198754" }, "reader": { "name": "reader", "required-aal": 1, "displayname": "Reader", "description": "Read-only access to content", "issystem": true, "icon": "book-reader", "color": "#6c757d" }, "anonymous": { "name": "anonymous", "displayname": "Anonymous", "description": "Public access without authentication", "issystem": true, "icon": "user-secret", "color": "#adb5bd" } }

ngdpbase.rss.*

Configuration Values (5 matches) — ngdpbase.rss.*
Key Value
ngdpbase.rss.channel-description RSS feed for ngdpbase updates
ngdpbase.rss.channel-title ngdpbase RSS Feed
ngdpbase.rss.file-name rss.xml
ngdpbase.rss.generate true
ngdpbase.rss.interval 3600

ngdpbase.schedules.*

No config keys match pattern: ngdpbase.schedules.*

ngdpbase.search.*

Configuration Values (28 matches) — ngdpbase.search.*
Key Value
ngdpbase.search.access-filter.max-candidates 5000
ngdpbase.search.autocomplete.enabled true
ngdpbase.search.autocomplete.minlength 2
ngdpbase.search.enabled true
ngdpbase.search.maxresults 50
ngdpbase.search.plugin.allowAdvanced true
ngdpbase.search.plugin.cacheResults true
ngdpbase.search.plugin.cacheTTL 300
ngdpbase.search.plugin.maxResults 50
ngdpbase.search.plugin.showScore true
ngdpbase.search.provider lunrsearchprovider
ngdpbase.search.provider.default lunrsearchprovider
ngdpbase.search.provider.elasticsearch.autotagging.enabled false
ngdpbase.search.provider.elasticsearch.connecttimeout 5000
ngdpbase.search.provider.elasticsearch.indexname ngdpbase-pages
ngdpbase.search.provider.elasticsearch.requesttimeout 30000
ngdpbase.search.provider.elasticsearch.url http://localhost:9200
ngdpbase.search.provider.lunr.boost.keywords 4
ngdpbase.search.provider.lunr.boost.systemcategory 8
ngdpbase.search.provider.lunr.boost.tags 5
ngdpbase.search.provider.lunr.boost.title 10
ngdpbase.search.provider.lunr.boost.userkeywords 6
ngdpbase.search.provider.lunr.indexdir ${FAST_STORAGE}/search-index
ngdpbase.search.provider.lunr.maxresults 50
ngdpbase.search.provider.lunr.snippetlength 200
ngdpbase.search.provider.lunr.stemming true
ngdpbase.search.suggestions.enabled true
ngdpbase.search.suggestions.maxitems 10

ngdpbase.server.*

Configuration Values (7 matches) — ngdpbase.server.*
Key Value
ngdpbase.server.behind-cloudflare false
ngdpbase.server.geolite2-city-file
ngdpbase.server.host 0.0.0.0
ngdpbase.server.port 3000
ngdpbase.server.tls.cert-file
ngdpbase.server.tls.key-file
ngdpbase.server.trust-proxy false

ngdpbase.session.*

Configuration Values (9 matches) — ngdpbase.session.*
Key Value
ngdpbase.session.anonymous-max-age 86400000
ngdpbase.session.http-only true
ngdpbase.session.idle-timeout-minutes 10080
ngdpbase.session.max-age 2592000000
ngdpbase.session.sameSite lax
ngdpbase.session.secret (hidden)
ngdpbase.session.secure true
ngdpbase.session.storagedir ${FAST_STORAGE}/sessions
ngdpbase.session.store users/sessions.json

ngdpbase.storageLocation.*

No config keys match pattern: ngdpbase.storageLocation.*

ngdpbase.style.*

Configuration Values (7 matches) — ngdpbase.style.*
Key Value
ngdpbase.style.bootstrap.integration true
ngdpbase.style.custom-classes.enabled true
ngdpbase.style.predefined.background bg-primary,bg-secondary,bg-light,bg-dark
ngdpbase.style.predefined.layout text-center,text-left,text-right,float-left,float-right
ngdpbase.style.predefined.text text-primary,text-secondary,text-success,text-danger,text-warning,text-info
ngdpbase.style.security.allow-inline-css false
ngdpbase.style.security.allowed-properties color,background-color,font-weight,font-style,text-align

ngdpbase.tab.*

Configuration Values (4 matches) — ngdpbase.tab.*
Key Value
ngdpbase.tab.pagetabs true
ngdpbase.tab.pagetabs.template Template:PageTabs
ngdpbase.tab.persist true
ngdpbase.tab.style tabs

ngdpbase.telemetry.*

Configuration Values (11 matches) — ngdpbase.telemetry.*
Key Value
ngdpbase.telemetry.enabled false
ngdpbase.telemetry.metrics.host 0.0.0.0
ngdpbase.telemetry.metrics.interval 15000
ngdpbase.telemetry.metrics.path /metrics
ngdpbase.telemetry.metrics.port 9464
ngdpbase.telemetry.otlp.enabled false
ngdpbase.telemetry.otlp.endpoint
ngdpbase.telemetry.otlp.headers {}
ngdpbase.telemetry.otlp.interval 30000
ngdpbase.telemetry.otlp.timeout 30000
ngdpbase.telemetry.service-name

ngdpbase.theme.*

Configuration Values (3 matches) — ngdpbase.theme.*
Key Value
ngdpbase.theme.active volcano
ngdpbase.theme.defaults.mode light
ngdpbase.theme.directory themes

ngdpbase.translator-reader.*

Configuration Values (5 matches) — ngdpbase.translator-reader.*
Key Value
ngdpbase.translator-reader.allow-html false
ngdpbase.translator-reader.camel-case-links true
ngdpbase.translator-reader.inline-pattern.1 s/\{\{([^}]+)\}\}/\<tt\>$1\<\/tt\>/g
ngdpbase.translator-reader.match-english-plurals true
ngdpbase.translator-reader.plain-uris true

ngdpbase.url.*

No config keys match pattern: ngdpbase.url.*

ngdpbase.user.*

Configuration Values (14 matches) — ngdpbase.user.*
Key Value
ngdpbase.user.account-roles { "vault-owner": true }
ngdpbase.user.coreFields [ "username", "email", "displayName", "password", "roles", "isActive", "isExternal", "isSystem", "isTest", "createdAt", "loginCount", "lastLogin", "preferences", "profilePage", "allowedAuthMethods", "avatar" ]
ngdpbase.user.defaults.locale en-us
ngdpbase.user.defaults.timezone utc
ngdpbase.user.enabled true
ngdpbase.user.provider jsonuserprovider
ngdpbase.user.provider.default jsonuserprovider
ngdpbase.user.provider.files.sessions sessions.json
ngdpbase.user.provider.files.users users.json
ngdpbase.user.provider.storagedir ${FAST_STORAGE}/users
ngdpbase.user.security.defaultpassword (hidden)
ngdpbase.user.security.password-min-length 6
ngdpbase.user.security.passwordsalt (hidden)
ngdpbase.user.security.sessionexpiration 86400000

Top-level ngdpbase.* (ungrouped)

Single-segment keys with no sub-group: