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
config/app-default-config.json— base defaults (documented here)config/app-{NODE_ENV}-config.json— environment overridesconfig/app-custom-config.json— local machine overrides (gitignored)
Later files override earlier ones. Only set what differs from defaults.
Application Core
| Key | Default | Description |
|---|---|---|
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.port | 3000 | HTTP port the server listens on |
ngdpbase.server.host | "localhost" | Network host/interface to bind |
Session
| Key | Default | Description |
|---|---|---|
ngdpbase.session.secret | (default string) | Secret used to sign session cookies — change in production |
ngdpbase.session.max-age | 86400000 | Session lifetime in milliseconds (default: 24 h) |
ngdpbase.session.secure | false | Set true to require HTTPS for session cookies |
ngdpbase.session.http-only | true | Prevent client-side JavaScript from reading the session cookie |
ngdpbase.session.storagedir | ${FAST_STORAGE}/sessions | Directory for server-side session files — use fast storage (SSD) |
ngdpbase.session.store | "users/sessions.json" | Legacy session store path (superseded by storagedir) |
Translator / Link Reader
| Key | Default | Description |
|---|---|---|
ngdpbase.translator-reader.match-english-plurals | true | Allow page links to match plural/singular page name variants |
ngdpbase.translator-reader.camel-case-links | true | Automatically link CamelCase words as page names |
ngdpbase.translator-reader.allow-html | false | Allow raw HTML in markup |
ngdpbase.translator-reader.plain-uris | true | Automatically 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.
| Key | Default | Description |
|---|---|---|
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
| Key | Default | Description |
|---|---|---|
ngdpbase.markdown.footnotes.enabled | true | Enable Markdown footnote syntax |
Page Storage
| Key | Default | Description |
|---|---|---|
ngdpbase.page.enabled | true | Enable 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}/pages | Directory 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.json | Path 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.autosave | true | Automatically save the page index after each write |
ngdpbase.directories.pages | ${SLOW_STORAGE}/pages | Legacy alias for filesystem.storagedir |
ngdpbase.directories.required-pages | "./required-pages" | Legacy alias for filesystem.requiredpagesdir |
Attachment Storage
| Key | Default | Description |
|---|---|---|
ngdpbase.attachment.enabled | true | Enable file attachments |
ngdpbase.attachment.provider | "basicattachmentprovider" | Active attachment provider |
ngdpbase.attachment.provider.default | "basicattachmentprovider" | Fallback provider |
ngdpbase.attachment.maxsize | 10485760 | Maximum upload size in bytes (default: 10 MB) |
ngdpbase.attachment.allowedtypes | "image/*,text/*,application/pdf" | Comma-separated MIME type patterns allowed for upload |
ngdpbase.attachment.forcedownload | false | Force browser download rather than inline display |
ngdpbase.attachment.metadatafile | ${SLOW_STORAGE}/attachments/attachment-metadata.json | Path to the attachment metadata index |
ngdpbase.attachment.provider.basic.storagedir | ${SLOW_STORAGE}/attachments | Directory for stored attachment files |
ngdpbase.attachment.provider.basic.hashcontent | true | Hash file content for deduplication |
ngdpbase.attachment.provider.basic.hashmethod | "sha256" | Hashing algorithm: "sha256" or "md5" |
Enhanced Attachments
| Key | Default | Description |
|---|---|---|
ngdpbase.attachment.enhanced.enabled | true | Enable thumbnail generation and enhanced metadata |
ngdpbase.attachment.enhanced.thumbnails | true | Generate image thumbnails on upload |
ngdpbase.attachment.enhanced.thumbnailsizes | "150x150,300x300" | Comma-separated WxH thumbnail sizes |
ngdpbase.attachment.enhanced.metadata | true | Extract and store file metadata (EXIF, etc.) |
ngdpbase.attachment.enhanced.showmetadata | true | Show metadata in the attachment UI |
ngdpbase.attachment.enhanced.showfilesize | true | Show file size in attachment listings |
ngdpbase.attachment.enhanced.showmodified | true | Show last-modified date in attachment listings |
ngdpbase.attachment.enhanced.iconpath | "/icons/filetypes" | URL path for file-type icons |
ngdpbase.attachment.enhanced.cachemetadata | true | Cache extracted metadata in memory |
ngdpbase.attachment.enhanced.generatethumbnails | true | Generate thumbnails at upload time |
Search
Shared Settings
| Key | Default | Description |
|---|---|---|
ngdpbase.search.enabled | true | Enable search |
ngdpbase.search.provider | "lunrsearchprovider" | Active search provider |
ngdpbase.search.provider.default | "lunrsearchprovider" | Fallback provider |
ngdpbase.search.maxresults | 50 | Maximum results returned per query |
ngdpbase.search.autocomplete.enabled | true | Enable autocomplete suggestions |
ngdpbase.search.autocomplete.minlength | 2 | Minimum characters before autocomplete activates |
ngdpbase.search.suggestions.enabled | true | Enable query suggestions |
ngdpbase.search.suggestions.maxitems | 10 | Maximum suggestion items to show |
LunrSearchProvider
| Key | Default | Description |
|---|---|---|
ngdpbase.search.provider.lunr.indexdir | ${FAST_STORAGE}/search-index | Directory for Lunr index files — use fast storage |
ngdpbase.search.provider.lunr.stemming | true | Enable word stemming (e.g. "running" matches "run") |
ngdpbase.search.provider.lunr.boost.title | 10 | Search score boost for title matches |
ngdpbase.search.provider.lunr.boost.systemcategory | 8 | Boost for system-category matches |
ngdpbase.search.provider.lunr.boost.userkeywords | 6 | Boost for user-keyword matches |
ngdpbase.search.provider.lunr.boost.tags | 5 | Boost for tag matches |
ngdpbase.search.provider.lunr.boost.keywords | 4 | Boost for keyword matches |
ngdpbase.search.provider.lunr.maxresults | 50 | Maximum results from the Lunr index |
ngdpbase.search.provider.lunr.snippetlength | 200 | Character length of result snippets |
ElasticsearchSearchProvider
Activate with "ngdpbase.search.provider": "elasticsearchsearchprovider". Lunr remains the default.
| Key | Default | Description |
|---|---|---|
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.connecttimeout | 5000 | Connection timeout in milliseconds |
ngdpbase.search.provider.elasticsearch.requesttimeout | 30000 | Request timeout in milliseconds |
Cache
Shared Settings
| Key | Default | Description |
|---|---|---|
ngdpbase.cache.enabled | true | Enable caching |
ngdpbase.cache.provider | "nodecacheprovider" | Active cache provider |
ngdpbase.cache.provider.default | "nodecacheprovider" | Fallback provider |
ngdpbase.cache.defaultttl | 300 | Default cache entry TTL in seconds |
ngdpbase.cache.maxkeys | 1000 | Maximum number of keys in cache |
ngdpbase.cache.checkperiod | 120 | Interval in seconds for expiry checks |
NodeCacheProvider
| Key | Default | Description |
|---|---|---|
ngdpbase.cache.provider.nodecache.stdttl | 300 | Default TTL in seconds |
ngdpbase.cache.provider.nodecache.checkperiod | 120 | Expiry check interval in seconds |
ngdpbase.cache.provider.nodecache.maxkeys | 1000 | Maximum keys |
ngdpbase.cache.provider.nodecache.useclones | true | Return cloned objects (prevents mutation of cached values) |
RedisCacheProvider (Future)
| Key | Default | Description |
|---|---|---|
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.enablecluster | false | Enable Redis cluster mode |
ngdpbase.cache.provider.redis.connecttimeout | 5000 | Connection timeout in milliseconds |
Audit Trail
Shared Settings
| Key | Default | Description |
|---|---|---|
ngdpbase.audit.enabled | true | Enable 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.maxqueuesize | 1000 | Maximum events queued before flush |
ngdpbase.audit.flushinterval | 30000 | Flush interval in milliseconds |
ngdpbase.audit.retentiondays | 90 | Days to retain audit records |
FileAuditProvider
| Key | Default | Description |
|---|---|---|
ngdpbase.audit.provider.file.logdirectory | ${FAST_STORAGE}/logs | Directory 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.maxfiles | 10 | Number of rotated files to keep |
Markup / Parser
| Key | Default | Description |
|---|---|---|
ngdpbase.markup.enabled | true | Enable the markup subsystem |
ngdpbase.markup.use-advanced-parser | true | Use the advanced extraction-pipeline parser |
ngdpbase.markup.fallback-to-legacy | true | Fall back to legacy parser on advanced parser failure |
ngdpbase.markup.integration.rendering-manager | true | Integrate with RenderingManager |
ngdpbase.markup.log-parsing-method | true | Log which parsing method (advanced vs legacy) is used |
ngdpbase.markup.caching | true | Enable markup result caching |
ngdpbase.markup.cache-ttl | 300 | Default markup cache TTL in seconds |
Markup Cache Sub-Sections
Each sub-section (parse-results, handler-results, patterns, variables) shares the same keys:
| Key | Description |
|---|---|
*.enabled | Enable this cache layer |
*.ttl | TTL in seconds |
*.max-size | Maximum number of cached entries |
| Key | Default | Description |
|---|---|---|
ngdpbase.markup.cache.enable-warmup | true | Pre-warm cache on startup |
ngdpbase.markup.cache.metrics-enabled | true | Expose cache hit/miss metrics |
Handler Registry
| Key | Default | Description |
|---|---|---|
ngdpbase.markup.handler-registry.max-handlers | 100 | Maximum registered markup handlers |
ngdpbase.markup.handler-registry.allow-duplicate-priorities | true | Allow handlers with the same priority value |
ngdpbase.markup.handler-registry.enable-dependency-resolution | true | Resolve handler ordering by declared dependencies |
ngdpbase.markup.handler-registry.enable-conflict-detection | true | Warn on handler conflicts |
ngdpbase.markup.handler-registry.default-timeout | 5000 | Handler execution timeout in milliseconds |
Markup Handlers
Each built-in handler has enabled (boolean) and priority (integer, higher runs first) keys.
| Handler | Default Priority | Purpose |
|---|---|---|
plugin | 90 | Plugin tags [{PluginName ...}] |
wikitag | 95 | Page link tags [[PageName]] |
form | 85 | HTML form generation |
interwiki | 80 | Inter-wiki links |
attachment | 75 | Attachment display |
style | 70 | WikiStyle CSS classes |
search | 65 | Inline search results |
rss | 60 | RSS feed inclusion |
Additional attachment-handler flags:
| Key | Default | Description |
|---|---|---|
ngdpbase.markup.handlers.attachment.enhanced | true | Enable enhanced attachment display |
ngdpbase.markup.handlers.attachment.thumbnails | true | Show thumbnails for image attachments |
ngdpbase.markup.handlers.attachment.metadata | true | Display file metadata alongside attachments |
Filters
Filter Pipeline
| Key | Default | Description |
|---|---|---|
ngdpbase.markup.filters.enabled | true | Enable the filter pipeline |
ngdpbase.markup.filters.pipeline.max-filters | 50 | Maximum filters in the pipeline |
ngdpbase.markup.filters.pipeline.timeout | 10000 | Pipeline execution timeout in milliseconds |
ngdpbase.markup.filters.pipeline.enable-profiling | true | Record per-filter timing |
ngdpbase.markup.filters.pipeline.fail-on-error | false | Abort the pipeline if any filter throws |
Spam Filter
| Key | Default | Description |
|---|---|---|
ngdpbase.markup.filters.spam.enabled | false | Enable spam detection |
ngdpbase.markup.filters.spam.priority | 100 | Filter priority (runs first when enabled) |
ngdpbase.markup.filters.spam.max-links | 10 | Maximum links allowed per page save |
ngdpbase.markup.filters.spam.max-images | 5 | Maximum 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-blacklist | true | Cache the blacklist in memory |
Security Filter
| Key | Default | Description |
|---|---|---|
ngdpbase.markup.filters.security.enabled | false | Enable HTML security sanitization |
ngdpbase.markup.filters.security.priority | 110 | Filter priority |
ngdpbase.markup.filters.security.prevent-xss | true | Strip XSS vectors |
ngdpbase.markup.filters.security.prevent-csrf | true | Strip CSRF vectors |
ngdpbase.markup.filters.security.sanitize-html | true | Sanitize 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-content | true | Remove scripts, event handlers, and dangerous URLs |
Validation Filter
| Key | Default | Description |
|---|---|---|
ngdpbase.markup.filters.validation.enabled | true | Enable content validation |
ngdpbase.markup.filters.validation.priority | 90 | Filter priority |
ngdpbase.markup.filters.validation.validate-markup | true | Validate markup syntax |
ngdpbase.markup.filters.validation.validate-links | true | Check internal links exist |
ngdpbase.markup.filters.validation.validate-images | true | Validate image references |
ngdpbase.markup.filters.validation.max-content-length | 1048576 | Maximum page content size in bytes (default: 1 MB) |
ngdpbase.markup.filters.validation.report-errors | true | Return validation errors to the editor |
Custom Filters
| Key | Default | Description |
|---|---|---|
ngdpbase.markup.filters.custom.enabled | false | Load 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-load | true | Auto-discover and register found filters |
ngdpbase.markup.filters.custom.cache-results | true | Cache filter results |
InterWiki
| Key | Default | Description |
|---|---|---|
ngdpbase.interwiki.enabled | true | Enable inter-wiki links |
ngdpbase.interwiki.options.openInNewWindow | true | Open inter-wiki links in a new browser tab |
ngdpbase.interwiki.options.addIconIndicator | true | Show an external-link icon next to inter-wiki links |
ngdpbase.interwiki.options.caseSensitive | false | Treat site names as case-insensitive |
ngdpbase.interwiki.options.showTooltips | true | Show tooltips on hover |
ngdpbase.interwiki.options.cacheTTL | 3600 | Cache TTL in seconds for inter-wiki link resolution |
ngdpbase.interwiki.options.maxCacheEntries | 1000 | Maximum 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
| Key | Default | Description |
|---|---|---|
ngdpbase.managers.page-manager.enabled | true | Enable PageManager |
ngdpbase.managers.plugin-manager.enabled | true | Enable PluginManager |
ngdpbase.managers.plugin-manager.search-paths | ["./dist/plugins"] | Array of directories scanned for plugin modules |
ngdpbase.managers.rendering-manager.enabled | true | Enable RenderingManager |
ngdpbase.managers.search-manager.enabled | true | Enable SearchManager |
ngdpbase.managers.template-manager.enabled | true | Enable TemplateManager |
ngdpbase.managers.cache-manager.enabled | true | Enable CacheManager |
ngdpbase.managers.addons-manager.enabled | true | Enable 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>.enabled | false | Enable one add-on. Required for every add-on at every path — discovery alone does not enable anything |
ngdpbase.addons.page-reseed | false | Refresh 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
| Key | Default | Description |
|---|---|---|
ngdpbase.features.export.html | true | Enable HTML page export |
ngdpbase.features.export.pdf | false | Enable PDF page export |
ngdpbase.features.export.odt | false | Enable ODT (LibreOffice) page export |
ngdpbase.features.llm.enabled | false | Enable 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.enabled | true | Enable 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.enabled | false | Enable 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-admins | true | Allow admins to access the platform during maintenance mode |
ngdpbase.features.maintenance.estimated-duration | null | Optional ISO 8601 duration shown to users |
Logging
| Key | Default | Description |
|---|---|---|
ngdpbase.logging.level | "info" | Minimum log level: "debug", "info", "warn", "error" |
ngdpbase.logging.dir | ${FAST_STORAGE}/logs | Directory for application log files |
ngdpbase.logging.max-size | "1MB" | Maximum size of a log file before rotation |
ngdpbase.logging.max-files | 5 | Number of rotated log files to keep |
ngdpbase.logging.debug.enabled | false | Enable verbose debug logging |
ngdpbase.logging.debug.session | false | Log session lifecycle events |
ngdpbase.logging.debug.login | false | Log login/logout events at debug level |
Notifications
| Key | Default | Description |
|---|---|---|
ngdpbase.notifications.dir | ${FAST_STORAGE}/notifications | Directory for notification files |
ngdpbase.notifications.file | "notifications.json" | Notification store filename |
ngdpbase.notifications.auto-save-interval | 300000 | Auto-save interval in milliseconds (default: 5 min) |
Access Control
| Key | Default | Description |
|---|---|---|
ngdpbase.access-control.context-aware.enabled | true | Enable 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.enabled | false | Restrict 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.enabled | false | Load access schedules from an external file |
ngdpbase.access-control.custom-schedules.schedules | "./config/schedules.json" | Path to custom schedules file |
ngdpbase.access-control.holidays.enabled | false | Block 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:
| Field | Description |
|---|---|
name | Role identifier (lowercase) |
displayname | Human-readable label |
description | Role description |
issystem | true for built-in roles — should not be deleted |
icon | FontAwesome icon name |
color | Hex color for the UI |
permissions | Array 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
| Key | Default | Description |
|---|---|---|
ngdpbase.access.policies.enabled | true | Enable 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:
| Field | Description |
|---|---|
id | Unique policy identifier |
name | Human-readable name |
description | Policy purpose |
priority | Higher number is evaluated first |
effect | "allow" or "deny" |
subjects | Array of { type, value } — type is "role" |
resources | Array of { type, pattern/value } — type is "page" or "category" |
actions | Array of permission strings (use "*" for all) |
System Categories
Defined under ngdpbase.system-category.<name>. Each entry controls storage routing and visibility.
| Field | Description |
|---|---|
label | Category identifier |
description | Human-readable description |
default | true if this is the default category for new pages |
storageLocation | Where pages in this category are stored: "regular" (user pages dir), "required" (required-pages dir), "github" (docs dir) |
enabled | Whether 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.
| Field | Description |
|---|---|
label | Keyword identifier |
description | Human-readable description |
category | Grouping: "general", "access", "status", "subject" |
enabled | Whether this keyword is available |
restrictEditing | If true, only the creator and admins can edit pages with this keyword |
storageLocation | Optional storage override for pages with this keyword |
allowedRoles | Optional 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
| Key | Default | Description |
|---|---|---|
ngdpbase.default.system-category | "general" | Default system-category for new pages |
ngdpbase.maximum.user-keywords | 5 | Maximum 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.maxpages | 10 | Maximum pages shown in the breadcrumb trail |
RSS
| Key | Default | Description |
|---|---|---|
ngdpbase.rss.generate | true | Enable RSS feed generation |
ngdpbase.rss.file-name | "rss.xml" | Output filename for the RSS feed |
ngdpbase.rss.interval | 3600 | Feed refresh interval in seconds |
ngdpbase.rss.channel-title | "ngdpbase RSS Feed" | RSS channel title |
ngdpbase.rss.channel-description | (default) | RSS channel description |
Theme
| Key | Default | Description |
|---|---|---|
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
| Key | Default | Description |
|---|---|---|
ngdpbase.style.custom-classes.enabled | true | Allow custom CSS classes in WikiStyle markup |
ngdpbase.style.bootstrap.integration | true | Apply Bootstrap CSS class names via WikiStyle |
ngdpbase.style.security.allow-inline-css | false | Allow 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
| Key | Default | Description |
|---|---|---|
ngdpbase.location.default-provider | "osm" | Default map provider for the LocationPlugin: "osm" (OpenStreetMap) |
Telemetry (OpenTelemetry)
| Key | Default | Description |
|---|---|---|
ngdpbase.telemetry.enabled | false | Enable OpenTelemetry metrics |
ngdpbase.telemetry.service-name | "" | Service name reported to the collector |
ngdpbase.telemetry.metrics.port | 9464 | Port 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.interval | 15000 | Metrics collection interval in milliseconds |
ngdpbase.telemetry.otlp.enabled | false | Enable 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.interval | 30000 | Push interval in milliseconds |
ngdpbase.telemetry.otlp.timeout | 30000 | Request timeout in milliseconds |
Backup
| Key | Default | Description |
|---|---|---|
ngdpbase.backup.directory | ${SLOW_STORAGE}/backups | Directory where backup archives are stored |
ngdpbase.backup.max-backups | 10 | Maximum number of backup archives to retain |
ngdpbase.backup.compress | true | Compress backup archives |
ngdpbase.backup.auto-backup | false | Enable automatic scheduled backups |
ngdpbase.backup.auto-backup-interval | 86400000 | Auto-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
| Key | Default | Description |
|---|---|---|
ngdpbase.media.enabled | false | Enable MediaManager (external photo/video library scanning) |
ngdpbase.media.folders | [] | Array of absolute paths to external media directories to scan |
ngdpbase.media.maxdepth | 5 | Maximum directory recursion depth when scanning |
ngdpbase.media.scaninterval | 3600000 | Re-scan interval in milliseconds (default: 1 h) |
ngdpbase.media.readonly | true | Prevent 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
| Key | Default | Description |
|---|---|---|
ngdpbase.storageLocation.enabled | true | Enable storage-location-based access rules |
ngdpbase.storageLocation.aclBasedStorage | true | Enforce 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
| Key | Default | Description |
|---|---|---|
ngdpbase.holidays.enabled | true | Enable 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
| Key | Default | Description |
|---|---|---|
ngdpbase.schedules.enabled | true | Enable named access schedules |
ngdpbase.schedules | (object) | Map of schedule names to schedule definitions |
Each schedule definition has:
| Field | Description |
|---|---|
name | Human-readable schedule name |
description | Purpose description |
timeZone | IANA timezone string for rule evaluation |
rules | Array of { days, startTime, endTime, type } — type is "allow" or "deny" |
exceptions | Array of date-specific overrides |
enabled | Whether 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 anddocs/proper-documentation-pages.md.
jspwiki.*
No config keys match pattern: jspwiki.*
log4j.*
No config keys match pattern: log4j.*
ngdpbase.access.*
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.*
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.*
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.*
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.*
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.*
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.*
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.*
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.*
ngdpbase.breadcrumbs.*
| Key | Value |
|---|---|
ngdpbase.breadcrumbs.maxpages |
10 |
ngdpbase.cache.*
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.*
ngdpbase.catalog.*
| Key | Value |
|---|---|
ngdpbase.catalog.ai.enabled |
false |
ngdpbase.catalog.ai.provider |
|
ngdpbase.catalog.ai.threshold |
0.7 |
ngdpbase.comments.*
ngdpbase.comments.*
| Key | Value |
|---|---|
ngdpbase.comments.allow |
true |
ngdpbase.comments.storagedir |
${SLOW_STORAGE}/comments |
ngdpbase.default.*
ngdpbase.default.*
| Key | Value |
|---|---|
ngdpbase.default.system-category |
general |
ngdpbase.default.template.dateformat |
dd-MMM-yyyy HH:mm |
ngdpbase.default.timezone |
UTC |
ngdpbase.directories.*
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.*
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.*
ngdpbase.footnotes.*
| Key | Value |
|---|---|
ngdpbase.footnotes.enabled |
true |
ngdpbase.footnotes.storagedir |
${SLOW_STORAGE}/footnotes |
ngdpbase.github.*
ngdpbase.github.*
| Key | Value |
|---|---|
ngdpbase.github.repo |
jwilleke/ngdpbase |
ngdpbase.holidays.*
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.*
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.*
ngdpbase.location.*
| Key | Value |
|---|---|
ngdpbase.location.default-provider |
osm |
ngdpbase.logging.*
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.*
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.*
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.*
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.*
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.*
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.*
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.*
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.*
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.*
ngdpbase.plugin.*
| Key | Value |
|---|---|
ngdpbase.plugin.searchresult.maxItems |
50 |
ngdpbase.plugin.searchresult.showScore |
true |
ngdpbase.plugin.versioning.use |
true |
ngdpbase.roles.*
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.*
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.*
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.*
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.*
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.*
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.*
ngdpbase.tab.*
| Key | Value |
|---|---|
ngdpbase.tab.pagetabs |
true |
ngdpbase.tab.pagetabs.template |
Template:PageTabs |
ngdpbase.tab.persist |
true |
ngdpbase.tab.style |
tabs |
ngdpbase.telemetry.*
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.*
ngdpbase.theme.*
| Key | Value |
|---|---|
ngdpbase.theme.active |
volcano |
ngdpbase.theme.defaults.mode |
light |
ngdpbase.theme.directory |
themes |
ngdpbase.translator-reader.*
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.*
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:
ngdpbase.addons: {}ngdpbase.application-name: GeoHazardWatchngdpbase.authorizer: DefaultAuthorizerngdpbase.diff-provider: TraditionalDiffProviderngdpbase.encoding: UTF-8ngdpbase.favicon-path: /favicon.svgngdpbase.fetch-timeout-ms: 30000ngdpbase.front-page: volcanoes-and-earthquakesngdpbase.jsonorganizationsdatabase: users/organizations.jsonngdpbase.jsonpersonsdatabase: .users/persons.jsonngdpbase.schedules: {"business-hours":{"name":"Standard Business Hours","description":"Monday-Friday, 9 AM - 5 PM","timeZone":"America/New_York","rules":[{"days":["monday","tuesday","wednesday","thursday","friday"],"startTime":"09:00","endTime":"17:00","type":"allow"},{"days":["saturday","sunday"],"type":"deny"}],"exceptions":[],"enabled":true},"weekend-support":{"name":"Weekend Support","description":"Limited weekend access for critical issues","timeZone":"America/New_York","rules":[{"days":["monday","tuesday","wednesday","thursday","friday"],"startTime":"09:00","endTime":"17:00","type":"allow"},{"days":["saturday"],"startTime":"10:00","endTime":"14:00","type":"allow"},{"days":["sunday"],"type":"deny"}],"exceptions":[],"enabled":true},"emergency-24-7":{"name":"24/7 Emergency Access","description":"Full access for emergency situations","timeZone":"UTC","rules":[{"type":"allow"}],"exceptions":[],"enabled":true},"role_admin":{"name":"Administrator Schedule","description":"Extended hours for administrators","timeZone":"America/New_York","rules":[{"days":["monday","tuesday","wednesday","thursday","friday"],"startTime":"08:00","endTime":"18:00","type":"allow"},{"days":["saturday"],"startTime":"09:00","endTime":"12:00","type":"allow"}],"exceptions":[],"enabled":true},"category_System":{"name":"System Pages Schedule","description":"Restricted access to system pages","timeZone":"America/New_York","rules":[{"days":["monday","tuesday","wednesday","thursday","friday"],"startTime":"09:00","endTime":"17:00","type":"allow"}],"exceptions":[],"enabled":true},"default":{"name":"Default Schedule","description":"Fallback schedule for users without specific assignments","timeZone":"UTC","rules":[{"days":["monday","tuesday","wednesday","thursday","friday"],"startTime":"09:00","endTime":"17:00","type":"allow"}],"exceptions":[],"enabled":true}}ngdpbase.system-category: {"general":{"label":"general","description":"General User pages","default":true,"source":"site","enabled":true,"storageLocation":{"defaultstore":"pages/","privatestore":"pages/vaults/{user}/default/"},"defaultPrivate":false,"encrypt":false,"shareMaxDays":15},"system":{"label":"system","description":"The minimal viable pages for a minimal site to start","default":false,"source":"shipped","enabled":true,"storageLocation":{"defaultstore":"pages/"},"page-badge":{"color":"bg-secondary","label":"System","title":"System page"}},"documentation":{"label":"documentation","description":"End-User documentation","default":false,"source":"shipped","enabled":true,"storageLocation":{"defaultstore":"pages/"},"page-badge":{"color":"bg-info text-dark","label":"Documentation","title":"Documentation page"}},"developer":{"label":"developer","description":"Developer documentation and technical notes, only in GitHub","default":false,"source":"repo","enabled":false},"addon":{"label":"addon","description":"Documentation about an installed add-on, seeded by it","default":false,"source":"shipped","enabled":true,"storageLocation":{"defaultstore":"pages/"},"page-badge":{"color":"bg-primary","label":"Addon","title":"Add-on page"}},"user-profile":{"label":"user-profile","description":"User profile pages","default":false,"source":"site","enabled":false,"storageLocation":{"defaultstore":"pages/"},"page-badge":{"color":"bg-success","label":"Profile","title":"User profile page"}},"capture":{"label":"capture","description":"Pages made by the capture bookmarklet","default":false,"source":"site","enabled":false,"storageLocation":{"defaultstore":"pages/","privatestore":"pages/vaults/{user}/capture/"},"defaultPrivate":"choice","encrypt":false,"shareMaxDays":15},"journal":{"label":"journal","description":"Personal journal entries — schema.org BlogPosting at JSON-LD render time (#791)","default":false,"source":"site","enabled":false,"owner":"journal","storageLocation":{"defaultstore":"pages/","privatestore":"pages/vaults/{user}/journal/"},"defaultPrivate":"choice","encrypt":false,"shareMaxDays":15,"page-badge":{"color":"bg-info","label":"Journal","title":"Journal entry"}}}ngdpbase.system-keywords: {"general":{"label":"general","description":"General-purpose keyword for standard wiki content","default":true,"category":"content-type","enabled":true},"medicine":{"label":"medicine","description":"Medical and healthcare-related content","category":"subject","enabled":true},"geology":{"label":"geology","description":"Geological and earth science content","category":"subject","enabled":true},"meteorology":{"label":"meteorology","description":"Weather and atmospheric science content","category":"subject","enabled":true},"oceanography":{"label":"oceanography","description":"Ocean and marine science content","category":"subject","enabled":true},"psychology":{"label":"psychology","description":"Psychological and behavioral science content","category":"subject","enabled":true},"sociology":{"label":"sociology","description":"Social science and society-related content","category":"subject","enabled":true},"anthropology":{"label":"anthropology","description":"Human culture and society content","category":"subject","enabled":true},"economics":{"label":"economics","description":"Economic and financial content","category":"subject","enabled":true},"political-science":{"label":"political-science","description":"Political science and governance content","category":"subject","enabled":true},"capture":{"label":"capture","description":"Machine provenance: page created by the capture bookmarklet (#881/#893)","category":"provenance","enabled":true},"test-page":{"label":"test-page","description":"Purpose: a test page — one content shape the unit tests render through the real pipeline; admin-only via audience (#1355)","category":"provenance","enabled":true},"test-artifact":{"label":"test-artifact","description":"Provenance: created by an automated test, probe or script run — not content, safe to delete. Stamped by the system, never typed by users","category":"provenance","enabled":true}}ngdpbase.timezones: [{"value":"UTC","label":"UTC (Coordinated Universal Time)","category":"Universal"},{"value":"America/New_York","label":"Eastern Time (New York)","category":"North America"},{"value":"America/Chicago","label":"Central Time (Chicago)","category":"North America"},{"value":"America/Denver","label":"Mountain Time (Denver)","category":"North America"},{"value":"America/Los_Angeles","label":"Pacific Time (Los Angeles)","category":"North America"},{"value":"America/Toronto","label":"Eastern Time (Toronto)","category":"North America"},{"value":"America/Vancouver","label":"Pacific Time (Vancouver)","category":"North America"},{"value":"Europe/London","label":"GMT (London)","category":"Europe"},{"value":"Europe/Paris","label":"CET (Paris)","category":"Europe"},{"value":"Europe/Berlin","label":"CET (Berlin)","category":"Europe"},{"value":"Europe/Rome","label":"CET (Rome)","category":"Europe"},{"value":"Europe/Madrid","label":"CET (Madrid)","category":"Europe"},{"value":"Europe/Moscow","label":"MSK (Moscow)","category":"Europe"},{"value":"Europe/Stockholm","label":"CET (Stockholm)","category":"Europe"},{"value":"Asia/Tokyo","label":"JST (Tokyo)","category":"Asia"},{"value":"Asia/Shanghai","label":"CST (Shanghai)","category":"Asia"},{"value":"Asia/Seoul","label":"KST (Seoul)","category":"Asia"},{"value":"Asia/Kolkata","label":"IST (Kolkata)","category":"Asia"},{"value":"Asia/Dubai","label":"GST (Dubai)","category":"Asia"},{"value":"Asia/Singapore","label":"SGT (Singapore)","category":"Asia"},{"value":"Australia/Sydney","label":"AEST (Sydney)","category":"Oceania"},{"value":"Australia/Melbourne","label":"AEST (Melbourne)","category":"Oceania"},{"value":"Australia/Perth","label":"AWST (Perth)","category":"Oceania"},{"value":"Pacific/Auckland","label":"NZST (Auckland)","category":"Oceania"},{"value":"Africa/Cairo","label":"EET (Cairo)","category":"Africa"},{"value":"Africa/Johannesburg","label":"SAST (Johannesburg)","category":"Africa"},{"value":"America/Sao_Paulo","label":"BRT (São Paulo)","category":"South America"},{"value":"America/Argentina/Buenos_Aires","label":"ART (Buenos Aires)","category":"South America"}]ngdpbase.user-keywords: {"default":{"label":"default","description":"Default keyword with no special restrictions","category":"general","enabled":true,"restrictEditing":false}}ngdpbase.version: 5.34.0
No comments yet.