GeoHazardWatch

Page Actions


Overview

Plugin is a system code that generates various outputs for use on GeoHazardWatch

For instance the [{VariablesPlugin}] provides this HTML output

System Variables
Variables that don't require user or page context
Variable NameCurrent ValueDescription
[{$appname}]GeoHazardWatchApplication name (alias)
[{$applicationname}]GeoHazardWatchApplication name from configuration
[{$version}]5.34.0ngdpbase version number
[{$baseurl}]https://geohazardwatch.comBase URL for the wiki
[{$uptime}]10h 15m 20sServer uptime
[{$totalpages}]183Total number of pages in wiki
Contextual Variables
Variables that require user or page context
Variable NameYour Current ValueDescription
[{$pagename}]PluginCurrent page name
[{$username}]AnonymousCurrent user's name
[{$loginstatus}]Not logged inUser authentication status
[{$userroles}]anonymousUser's assigned roles
[{$date}]10/26/2026Current date
[{$time}]11:50:31 PMCurrent time
[{$timestamp}]2026-10-26T23:50:31.317ZCurrent ISO timestamp
[{$year}]2026Current year
[{$month}]10Current month
[{$day}]26Current day
[{$displayname}]Anonymous UserUser's display name
[{$useragent}]Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])Browser user agent string
[{$browser}]Unknown BrowserBrowser name and version
[{$clientip}]216.73.216.220Client IP address
[{$referer}]DirectHTTP referer
[{$sessionid}]iLeiinAFxcmAEOZyMTu4VLPvsGC67nMiSession identifier
[{$acceptlanguage}]UnknownAccept-Language header
Available Plugins
Registered plugins that can be invoked in wiki pages
Plugin NameDescriptionVersionAuthor
[{AppHealthPlugin}]Deterministic app-health audit: orphan pages, broken links, stale pages1.0.0ngdpbase
[{ATTACH}]Renders wiki attachments inline. Images display as clickable thumbnails; other files display as download links.1.0.0Unknown
[{AttachmentsPlugin}]Shows total attachment count or a list of attachments1.0.0ngdpbase
[{CommentsPlugin}]Displays page comments and a submission form for authenticated users1.0.0ngdpbase
[{ConfigAccessorPlugin}]Access configuration values including roles, features, and system settings2.9.0ngdpbase
[{CounterPlugin}]Maintains page-specific counters for numbering and tracking1.0.0ngdpbase
[{CurrentTimePlugin}]Displays current date and time with user locale/timezone preferences1.0.0ngdpbase
[{DataFeed}]Render a feed source's records as a table or list (#685)N/AUnknown
[{EarthquakeList}]No descriptionN/AUnknown
[{EarthquakeMap}]No descriptionN/AUnknown
[{FirmsHotspots}]No descriptionN/AUnknown
[{FootnotesPlugin}]Lists footnote definitions from sidecar storage with editor CRUD UI2.0.0ngdpbase
[{HansAlerts}]No descriptionN/AUnknown
[{Image}]Renders an image with optional caption, alignment, and display mode controlN/AUnknown
[{IndexPlugin}]Generates an alphabetical index of all wiki pages1.0.0ngdpbase
[{InsertPlugin}]Embed another wiki page (or one section of it) into the current page1.0.0ngdpbase
[{Location}]Display locations with map links and embedded previews1.0.0ngdpbase
[{MarqueePlugin}]CSS scrolling text banner (marquee replacement)1.0.0ngdpbase
[{MediaGallery}]Displays a gallery of media items (stub — MediaManager not yet available)0.1.0ngdpbase
[{MediaItem}]Embeds a single media item inline (stub — MediaManager not yet available)0.1.0ngdpbase
[{MediaPlugin}]Shows total media item count, a list, or a thumbnail album of indexed media items1.2.0ngdpbase
[{MediaSearch}]Displays media search results (stub — MediaManager not yet available)0.1.0ngdpbase
[{MyContributionsPlugin}]Renders the My Contributions card from /profile on any wiki page1.0.0ngdpbase
[{MyLinksPlugin}]Renders the current user's pinned My Links sidebar section1.0.0ngdpbase
[{PageSlideshowPlugin}]Bootstrap 5 carousel cycling through wiki page content1.0.0ngdpbase
[{RecentChangesPlugin}]Displays recent page changes in chronological order2.0.0ngdpbase
[{ReferringPagesPlugin}]Lists pages that refer to the current page1.0.0ngdpbase
[{SearchPlugin}]JSPWiki-style search plugin for embedding search results in pages2.0.0ngdpbase
[{SessionsPlugin}]Shows active session count or list of authenticated users3.0.0ngdpbase
[{SlideshowPlugin}]Bootstrap 5 image carousel / slideshow1.0.0ngdpbase
[{TablePlugin}]JSPWiki-compatible Table plugin — enables # auto-numbering in table rows1.0.0ngdpbase
[{TabPlugin}]Defines a tab within [{Tabs}]; rendering is handled by TabsPlugin1.0.0ngdpbase
[{TabsPlugin}]Renders Bootstrap nav-tabs from [{Tab name="..."}]content[{/Tab}] body blocks1.0.0ngdpbase
[{TotalPagesPlugin}]Shows the total number of pages1.0.0ngdpbase
[{UndefinedPagesPlugin}]Lists pages that are linked to (RED-LINKs) but do not exist1.2.0ngdpbase
[{UptimePlugin}]Shows the server uptime1.0.0ngdpbase
[{UserLookupPlugin}]Search and display users — permission-gated PII via API1.0.0ngdpbase
[{VaacAdvisories}]No descriptionN/AUnknown
[{VariablesPlugin}]Displays system and contextual variables available in the wiki1.0.0ngdpbase
[{VolcanoInfobox}]No descriptionN/AUnknown
[{VolcanoList}]No descriptionN/AUnknown
[{VolcanoMap}]No descriptionN/AUnknown
[{VolcanoSearch}]No descriptionN/AUnknown
Configuration Values (627 matches) — ngdpbase.*
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.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.addons {}
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-name GeoHazardWatch
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.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.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.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.authorizer DefaultAuthorizer
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.maxpages 10
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.capture.default-page {date}-capture-{username}
ngdpbase.capture.enabled false
ngdpbase.capture.keywords [ "capture" ]
ngdpbase.catalog.ai.enabled false
ngdpbase.catalog.ai.provider
ngdpbase.catalog.ai.threshold 0.7
ngdpbase.chrome.footer-page footer-content
ngdpbase.chrome.left-menu-page left-menu-content
ngdpbase.comments.allow true
ngdpbase.comments.storagedir ${SLOW_STORAGE}/comments
ngdpbase.config.env-keys { "ngdpbase.session.secret": "(hidden)", "ngdpbase.server.port": "NGDPBASE_PORT", "ngdpbase.server.host": "NGDPBASE_HOST", "ngdpbase.hostname": "NGDPBASE_HOSTNAME", "ngdpbase.application-name": "NGDPBASE_APP_NAME", "ngdpbase.application.base-url": "NGDPBASE_BASE_URL", "ngdpbase.system.principal": "NGDPBASE_SYSTEM_USER" }
ngdpbase.config.sensitive-values { "ngdpbase.session.secret": "(hidden)", "ngdpbase.user.security.passwordsalt": "(hidden)", "ngdpbase.user.security.defaultpassword": "(hidden)", "ngdpbase.addons.demo.admin-account.password": "(hidden)", "ngdpbase.mail.provider.smtp.pass": "secret", "ngdpbase.auth.google-oidc.client-secret": "(hidden)", "ngdpbase.auth.oidc.providers": "sensitive", "ngdpbase.access.policies": "sensitive", "ngdpbase.backup.directory": "sensitive", "ngdpbase.backup.restore-manifest": "sensitive", "ngdpbase.auth.credentials.file": "(hidden)", "ngdpbase.auth.agent-token.directory": "(hidden)", "ngdpbase.auth.proxy-access.enabled": "sensitive", "ngdpbase.audit.chain-witness.destination": "sensitive", "ngdpbase.media.folders": "sensitive", "ngdpbase.export.pdf.provider.local-chrome.chromium-path": "sensitive", "ngdpbase.export.pdf.provider.chrome-service.url": "sensitive", "ngdpbase.server.tls.cert-file": "sensitive", "ngdpbase.server.tls.key-file": "sensitive", "ngdpbase.server.geolite2-city-file": "sensitive", "ngdpbase.telemetry.otlp.endpoint": "sensitive", "ngdpbase.auth.authentik-bearer.issuer": "sensitive", "ngdpbase.auth.authentik-bearer.jwks-url": "sensitive", "ngdpbase.auth.authentik-bearer.audience": "sensitive", "ngdpbase.auth.cloudflare-access.team-domain": "sensitive", "ngdpbase.auth.cloudflare-access.application-aud": "sensitive", "ngdpbase.addons.install": "sensitive", "ngdpbase.managers.addons-manager.install.registry": "sensitive", "ngdpbase.managers.addons-manager.install.sigstore-tuf-url": "sensitive" }
ngdpbase.consent.documents [ "terms-of-service", "privacy-policy" ]
ngdpbase.consent.storagedir ${FAST_STORAGE}/consent
ngdpbase.database.backup.worker-timeout-ms 3600000
ngdpbase.database.busy-timeout-ms 5000
ngdpbase.database.file ${FAST_STORAGE}/ngdpbase.db
ngdpbase.database.provider none
ngdpbase.dawarichCompat.enabled false
ngdpbase.dawarichCompat.thumbnailSize 500x500
ngdpbase.default.system-category general
ngdpbase.default.template.dateformat dd-MMM-yyyy HH:mm
ngdpbase.default.timezone UTC
ngdpbase.diff-provider TraditionalDiffProvider
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.encoding UTF-8
ngdpbase.export.pdf.max-concurrent 2
ngdpbase.export.pdf.page-size Letter
ngdpbase.export.pdf.provider none
ngdpbase.export.pdf.provider.chrome-service.max-bytes 52428800
ngdpbase.export.pdf.provider.chrome-service.url
ngdpbase.export.pdf.provider.local-chrome.chromium-path
ngdpbase.export.pdf.timeout-ms 30000
ngdpbase.favicon-path /favicon.svg
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.fetch-timeout-ms 30000
ngdpbase.files.migration.clash-suffix-digits 3
ngdpbase.files.migration.default-owner admin
ngdpbase.files.migration.owner-map {}
ngdpbase.filters.custom.auto-load true
ngdpbase.filters.custom.cache-results true
ngdpbase.filters.custom.enabled false
ngdpbase.filters.custom.search-paths ./filters,./src/filters
ngdpbase.filters.enabled true
ngdpbase.filters.pipeline.enable-profiling true
ngdpbase.filters.pipeline.fail-on-error false
ngdpbase.filters.pipeline.max-filters 50
ngdpbase.filters.pipeline.timeout 10000
ngdpbase.filters.security.allowed-attributes class,id,href,src,alt,title
ngdpbase.filters.security.allowed-tags p,div,span,strong,em,ul,ol,li,h1,h2,h3,h4,h5,h6,a,img
ngdpbase.filters.security.prevent-csrf true
ngdpbase.filters.security.prevent-xss true
ngdpbase.filters.security.priority 110
ngdpbase.filters.security.sanitize-html true
ngdpbase.filters.security.strip-dangerous-content true
ngdpbase.filters.spam.blacklist-words spam,casino,pharmacy,viagra
ngdpbase.filters.spam.cache-blacklist true
ngdpbase.filters.spam.enabled false
ngdpbase.filters.spam.max-images 5
ngdpbase.filters.spam.max-links 10
ngdpbase.filters.spam.priority 100
ngdpbase.filters.spam.whitelist-domains wikipedia.org,github.com,stackoverflow.com
ngdpbase.filters.validation.enabled true
ngdpbase.filters.validation.max-content-length 1048576
ngdpbase.filters.validation.priority 90
ngdpbase.filters.validation.report-errors true
ngdpbase.filters.validation.validate-images true
ngdpbase.filters.validation.validate-links true
ngdpbase.filters.validation.validate-markup true
ngdpbase.footnotes.enabled true
ngdpbase.footnotes.storagedir ${SLOW_STORAGE}/footnotes
ngdpbase.front-page volcanoes-and-earthquakes
ngdpbase.github.repo jwilleke/ngdpbase
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.http.user-agent ngdpbase/{version} (+{base-url})
ngdpbase.import.engine.default-original none
ngdpbase.import.engine.ledger-dir ${FAST_STORAGE}/import-ledger
ngdpbase.import.engine.ledger-max-entries 10000
ngdpbase.import.engine.max-chain-depth 5
ngdpbase.import.engine.max-file-bytes 104857600
ngdpbase.import.engine.max-kept-runs 100
ngdpbase.import.engine.noise [ "__MACOSX/", ".DS_Store", "Thumbs.db", "desktop.ini", "._*" ]
ngdpbase.import.engine.upload-max-bytes 268435456
ngdpbase.import.engine.upload-max-files 20
ngdpbase.import.engine.zip-max-bytes 268435456
ngdpbase.import.engine.zip-max-depth 3
ngdpbase.import.engine.zip-max-entries 10000
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.jobs.history-limit 50
ngdpbase.jobs.max-checkpoint-bytes 65536
ngdpbase.jobs.max-timeout-ms 0
ngdpbase.jobs.min-interval-ms 60000
ngdpbase.jobs.shutdown-grace-ms 5000
ngdpbase.jobs.state.dir ${FAST_STORAGE}/jobs
ngdpbase.jobs.state.provider auto
ngdpbase.jsonorganizationsdatabase users/organizations.json
ngdpbase.jsonpersonsdatabase .users/persons.json
ngdpbase.knowledge-role { "source": { "label": "source", "description": "Authoritative primary content; body treated as immutable (step 2 of LLM-wiki build plan)", "default": false, "enabled": true, "page-badge": { "color": "bg-dark", "label": "Source", "title": "Source page — primary, immutable material" } }, "citation": { "label": "citation", "description": "Interpretive claim grounded in one or more sources", "default": false, "enabled": true, "page-badge": { "color": "bg-warning text-dark", "label": "Citation", "title": "Citation page — claims grounded in sources" } }, "concept": { "label": "concept", "description": "Synthesis drawing on multiple citations", "default": false, "enabled": true, "page-badge": { "color": "bg-danger", "label": "Concept", "title": "Concept page — synthesis across citations" } } }
ngdpbase.location.default-provider osm
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.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.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.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.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.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.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.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.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.searchresult.maxItems 50
ngdpbase.plugin.searchresult.showScore true
ngdpbase.plugin.versioning.use true
ngdpbase.reviews.details-max-bytes 65536
ngdpbase.reviews.list-limit 200
ngdpbase.reviews.retention-days 365
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.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 { "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.schema-types { "documentation": "TechArticle", "developer": "TechArticle", "journal": "BlogPosting" }
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.security.egress.allowed-ranges []
ngdpbase.security.egress.denied-ranges []
ngdpbase.security.headers.csp-mode report-only
ngdpbase.security.posture { "ngdpbase.security.headers.csp-mode": { "group": "Browser security headers", "restart": false }, "ngdpbase.security.egress.allowed-ranges": { "group": "Egress boundary", "restart": true }, "ngdpbase.security.egress.denied-ranges": { "group": "Egress boundary", "restart": true }, "ngdpbase.session.secure": { "group": "Session and cookie", "restart": true }, "ngdpbase.session.http-only": { "group": "Session and cookie", "restart": true }, "ngdpbase.session.max-age": { "group": "Session and cookie", "restart": true }, "ngdpbase.session.idle-timeout-minutes": { "group": "Session and cookie", "restart": false }, "ngdpbase.server.trust-proxy": { "group": "Session and cookie", "restart": true }, "ngdpbase.server.tls.cert-file": { "group": "Transport", "restart": true }, "ngdpbase.server.tls.key-file": { "group": "Transport", "restart": true }, "ngdpbase.auth.password.enabled": { "group": "Identity and registration", "restart": false }, "ngdpbase.auth.factors": { "group": "Identity and registration", "restart": false }, "ngdpbase.application.registration": { "group": "Identity and registration", "restart": false }, "ngdpbase.application.registration.password": { "group": "Identity and registration", "restart": false }, "ngdpbase.auth.user.default-external": { "group": "Identity and registration", "restart": false }, "ngdpbase.auth.magic-link.auto-provision": { "group": "Identity and registration", "restart": false }, "ngdpbase.auth.magic-link.ttl-minutes": { "group": "Identity and registration", "restart": false }, "ngdpbase.auth.google-oidc.auto-provision": { "group": "Identity and registration", "restart": false }, "ngdpbase.auth.oidc.auto-provision": { "group": "Identity and registration", "restart": false }, "ngdpbase.auth.proxy-access.enabled": { "group": "Identity and registration", "restart": false }, "ngdpbase.auth.invitation.ttl-days": { "group": "Identity and registration", "restart": false }, "ngdpbase.auth.throttle.enabled": { "group": "Login throttling", "restart": false }, "ngdpbase.auth.throttle.max-attempts": { "group": "Login throttling", "restart": false }, "ngdpbase.auth.throttle.window-minutes": { "group": "Login throttling", "restart": false }, "ngdpbase.auth.throttle.lock-minutes": { "group": "Login throttling", "restart": false }, "ngdpbase.auth.throttle.max-lock-minutes": { "group": "Login throttling", "restart": false }, "ngdpbase.auth.agent-token.enabled": { "group": "Agent tokens", "restart": true }, "ngdpbase.auth.agent-token.max-per-user": { "group": "Agent tokens", "restart": false }, "ngdpbase.auth.agent-token.max-ttl-hours": { "group": "Agent tokens", "restart": false }, "ngdpbase.auth.agent-token.default-ttl-hours": { "group": "Agent tokens", "restart": false }, "ngdpbase.auth.agent-token.retention-days": { "group": "Agent tokens", "restart": false }, "ngdpbase.audit.enabled": { "group": "Audit", "restart": true }, "ngdpbase.audit.provider": { "group": "Audit", "restart": true }, "ngdpbase.audit.on-failure": { "group": "Audit", "restart": true }, "ngdpbase.audit.events": { "group": "Audit", "restart": false }, "ngdpbase.permissions.definitions": { "group": "Audit", "restart": false }, "ngdpbase.auth.step-up": { "group": "Identity and registration", "restart": false }, "ngdpbase.audit.retentiondays": { "group": "Audit", "restart": false }, "ngdpbase.access.policies": { "group": "Access control", "restart": false }, "ngdpbase.roles.definitions": { "group": "Access control", "restart": false }, "ngdpbase.markup.html-policy": { "group": "Content sanitisation", "restart": false }, "ngdpbase.filters.security.prevent-xss": { "group": "Content sanitisation", "restart": true }, "ngdpbase.filters.security.prevent-csrf": { "group": "Content sanitisation", "restart": true }, "ngdpbase.filters.security.sanitize-html": { "group": "Content sanitisation", "restart": true }, "ngdpbase.filters.security.strip-dangerous-content": { "group": "Content sanitisation", "restart": true }, "ngdpbase.filters.security.allowed-tags": { "group": "Content sanitisation", "restart": true }, "ngdpbase.filters.security.allowed-attributes": { "group": "Content sanitisation", "restart": true }, "ngdpbase.style.security.allow-inline-css": { "group": "Content sanitisation", "restart": true }, "ngdpbase.style.security.allowed-properties": { "group": "Content sanitisation", "restart": true }, "ngdpbase.mail.rate-limit.enabled": { "group": "Rate limiting", "restart": false }, "ngdpbase.mail.rate-limit.max-submissions": { "group": "Rate limiting", "restart": false }, "ngdpbase.mail.rate-limit.window-minutes": { "group": "Rate limiting", "restart": false } }
ngdpbase.seo.enabled false
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.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.share.enabled true
ngdpbase.share.storagedir ${FAST_STORAGE}/shares
ngdpbase.status { "draft": { "label": "draft", "description": "Work in progress", "order": 1, "enabled": true }, "review": { "label": "review", "description": "Content under review", "order": 2, "enabled": true }, "published": { "label": "published", "description": "Finalized and approved content", "order": 3, "default": true, "enabled": true } }
ngdpbase.stores.import.maxsize 268435456
ngdpbase.stores.recovery.confirmretries 1
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.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.system.principal $NGDPBASE_SYSTEM_USER
ngdpbase.system.roles [ "admin" ]
ngdpbase.tab.pagetabs true
ngdpbase.tab.pagetabs.template Template:PageTabs
ngdpbase.tab.persist true
ngdpbase.tab.style tabs
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.active volcano
ngdpbase.theme.defaults.mode light
ngdpbase.theme.directory themes
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.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.user-keywords { "default": { "label": "default", "description": "Default keyword with no special restrictions", "category": "general", "enabled": true, "restrictEditing": false } }
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
ngdpbase.version 5.34.0
Total Variables: 31 | System: 6 | Contextual: 17 | Plugins: 43