Brazen Framework - Configuration Manager

Configuration management for the Brazen user scripts framework

Estas são as versões deste script em que o código foi atualizado. Mostrar todas as versões.

  • v. 7.1.0 14/08/2026

    [7.1.0] — current

    Added

    • resetAllTagsDiscovered(onProgress?) — delegates to TagRepository.resetAllTagsDiscovered; clears TagRuntime cache and _commitTagFieldChange() on success.

    [7.0.0]

    Breaking

    • Defaults written once at setup/migration only — no runtime DEFAULT_* merge; isIdbBlocked() / degraded mode removed.
    • Legacy tag-registry paths removedaddTagRulesetField, writeTagRuleLines, ensureTagRuleSetsCompiled, etc.
    • Immediate-download dock templates removedautoDownload, removeMediaOnDownload, singleDownload, only-show-download-manager gate.

    Added

    • Unified ruleset field APIaddRulesetField + createRulesetPanel, setTemplate / setTemplateConfig, RulesetMutationBus, setRulesetSubject, setSortHelpText, setGroupingAvailable.
    • Bookmarks as bookmarks ruleset templaterulesetContainsAnyTag replaces bookmarksContainAnyTag.
    • Config seedsregisterFieldSeed(s), getFieldSeeds, CONFIG_TYPE_DEFAULTS, _seedAllFields(); exported DEFAULT_RULESET_USER_CONFIG / RULESET_USER_CONFIG_KEYS.
    • MigrationgetPendingMigrationPlan(), onMigrationProgress, createPreMigrationSafetyBackup(), schema-too-new probes (getSchemaVersionConflict, resolveSchemaVersionConflictFromError).
    • LedgercountDownloadLedger(), replaceDownloadLedgerIds, streaming folder import (beginDownloadLedgerFolderImport, mergeDownloadLedgerImportBatch, finalizeDownloadLedgerFolderImport).
    • resolveCanonicalTypeName(descriptor) — passthrough to TagRepository for site payload typing.
    • Ruleset detail batch create via View Layer multi-form.

    Changed

    • DEFAULT_RULESET_USER_CONFIG.hideTagTypesfalse (v10 migration paired in IDB).
    • Boot compile via RulesetFieldRepository.getCompiledField.
    • Ruleset panel copy derived from rulesetSubject (removed manual empty/search/add setters).
    • Tag toggles + backup importrulesetEntries only.
    • Field helpfield.help + setHelp().
    • Bookmarks panel — sort via ⚙ settings only (no toolbar ⇅).
    • Backup zip assembly — shared _buildBackupZip({ purpose, stores?, onProgress? }).
    • Boot repair scope — empty-field repair runs only on setup/migration paths (not normal boot).

    Fixed

    • Native duplicate rules — inherits IndexedDB RulesetEntryRepository.add + fieldKey_rawLine index dedup (all templates/imports).
    • Substitution subject lookup + panel refresh via mutation bus.
    • Filename ignore / combo lookup — entry-id-first matching, _repairRulesetRowTagEntryIds.
    • Ruleset legacy import — empty incoming values no longer wipe migrated rows.
    • Ruleset detail save — template resolved consistently on create/edit.

    Removed

    • setDefault / setConfigDefaults / setGroupingEnabled / _commitRulesetRegistration.
    • addBookmarksField / setNormalizeBookmarks / bookmarksContainAnyTag (→ rulesetContainsAnyTag).
    • CONFIG_TYPE_BOOKMARKS — bookmarks are CONFIG_TYPE_RULESET with the bookmarks template.
  • v. 6.1.1 24/07/2026

    Removed

    • Dead field setterssetStorageKey, setLegacyStorageKeys, setLegacyIdFields (nothing read customStorageKey / legacyStorageKeys / ledgerLegacyIdFields after IDB migration; dual-prefix bookmarks use legacyScriptPrefix).
  • v. 6.1.0 24/07/2026

    Added

    • initialize({ onMigrationStatus }) — after a healthy open, runs chunked runPendingIsDiscoveredBackfill and forwards progress strings to the optional callback (dock migration UI).

    Fixed

    • Bookmarks reload() — keeps prior _bookmarkRows until listAll resolves, and discards stale overlapping reload results via _reloadGeneration so a pre-write listAll cannot clobber rows after a newer add/remove/reload.
    • hasTagSoleAttribute cache miss — when the tag row is not in RAM, falls back to synced sole ruleset hasRule so bookmark/sidebar chrome does not false-negative after eviction or clearCache.
    • Bookmarks attribute prefetchonBeforeRender passes blacklist / explore field keys into prepareBookmarkRowAttributeData so late compliance-spec loads can heal row icons.

    Changed

    • notifyConfigurationChange(source, local, detail?) — optional detail ({ tags, fieldKeys }) for tag attribute writes; createTagsChangeDetail / mergeChangeDetails helpers; _commitTagFieldChange / sole + substitution toggles plumb the touched tag.
    • Bookmark tag index_bookmarkTagIndex rebuilt on reload / attribute-config / optimistic row mutate; bookmarksContainAnyTag for gated UI refresh.
  • v. 6.0.0 22/07/2026

    [6.0.0] — current

    Breaking

    • jQuery removedfield.element / field.dockElement are HTMLElement|null; createElement / createDockElement return HTMLElement|null (empty sentinel is null, not $()).

    Changed

    • Field UI — native querySelector / .value / .checked / classList; ruleset input uses AbortController.
    • Cross-tab sync — native visibilitychange / pageshow listeners (event.persisted).

    Added

    • addBookmarksField setOnBeforeRender — forwards optional onBeforeRender(visible) to View Layer createBookmarksPanel so consumers can warm tag caches before row-action status is read.
    • addBookmarksField setAttributeActionsConfig — wires framework-owned bookmark-row blacklist/explore remediation (host.createBookmarkRowAttributeActions / prepareBookmarkRowAttributeData) ahead of optional consumer getRowActions / onBeforeRender extras.

    Fixed

    • Registry ruleset Save — snapshot uiDirty for TAG_FIELD_SPEC fields before update() so Tag Blacklist / Explored Tags Tracker textarea edits still call _persistTagFieldFromUI (previously update() cleared dirty and Save always skipped IDB re-import).
  • v. 5.3.1 21/07/2026

    Added

    • disposeBookmarkFields() — tears down bookmark widgets (dispose) on Framework pagehide.

    Changed

    • Bookmarks updateUserInterface — re-renders the cached _bookmarkRows only; full IDB listAll stays on reload() / reloadBookmarkFields() / createElement (no full-table mirror on every settings paint).
  • v. 5.3.0 19/07/2026

    Added

    • singleDownload dock template — action-button recipe (immediateDownload) for single-post download; default include is media pages. Apps override include via sparse applyDockTemplate args when needed.
    • immediateDownload dock gateautoDownload, removeMediaOnDownload, and singleDownload set field.dock.immediateDownload. When only-show-download-manager is on, _evaluateDockInclude hides those buttons regardless of rail placement. applyDockTemplate records field.dock.templateName.

    Changed

    • Tag attribute togglestoggleTagRule (sole attributes), setTagSubstitution, and clearTagSubstitution update the TagRuntime cache and notify listeners before IndexedDB put/compile; failed persists revert the cache and notify again.
    • Download ledgerdownloadedIds is a bounded positive cache (LEDGER_POSITIVE_CACHE_MAX), not a full-table Set. reload() invalidates the cache only; has / primeHits / claim use IndexedDB postId lookups. Backup still streams ids via getAll at export time only.

    Fixed

    • getCachedTagEntry / isFilenameTagIgnored — resolve via TagRuntime.resolveCachedByName (legacy casing) so Aa ignore chrome matches filename join.
    • setTagSubstitution type context — optional 4th argument can pass subject/replacement type names so discovery-panel substitutions confirm typeEntryId (not name-only rows).
    • Cross-tab sidebar / filters — on foreign meta.revisionId, clear TagRuntime RAM before reload. After warmCache() stopped full-table loads, ensureNames kept stale attribute rows so tab focus never refreshed sidebar colors or compliance. Also re-check on pageshow (bfcache).
    • Backup blob URLsURL.revokeObjectURL after Toolbox zip download so repeated backups do not retain blob memory until navigation.
  • v. 5.2.0 17/07/2026

    Added

    • Ruleset setReadOnly / setSubstitutionComposer — optional Subject → Alias composer above the textarea; marks the list read-only and adds via setTagSubstitution (skips re-importing the textarea on Save when IndexedDB is active). Mounted substitution textareas refresh immediately after setTagSubstitution / clearTagSubstitution.

    Fixed

    • _deduplicateRulesetRules — non-array values (e.g. text-sanitization maps) pass through instead of becoming [], so Apply/Save no longer wipe those fields.
    • Ruleset setRules — sorts only when the value is an array (object-valued rulesets no longer throw).
    • Registry ruleset Save/Apply clobberuiDirty tracks textarea edits; unedited TAG_FIELD_SPEC fields keep the IDB/cache projection on Apply and skip re-import on Save. Sidebar toggles refresh the textarea when it is not dirty.
    • initialize pending wipe — if {scriptPrefix}pending-idb-wipe is set in sessionStorage, delete the database before open() so Clear Database survives a blocked/aborted delete across reload.
    • getDockRailMembershipSignature() — ordered include-eligible root dock keys for Framework to skip unnecessary composeDockRail rebuilds.
  • v. 5.1.2 16/07/2026

    Fixed

    • Sole-attribute toggle latencytoggleTagRule reads status from the warm cache first, paints UI via an early notifyConfigurationChange before IDB put/compile, and _commitTagFieldChange notifies before warmCache so discovery/sidebar no longer wait on a full-table reload to react.
  • v. 5.1.1 16/07/2026

    Changed

    • autoDownload dock template — slide-out uses the default flag rule (slideOutWhen omitted), so paired controls (e.g. Remove Media On Download Success) only appear while Auto Download is on.
  • v. 5.1.0 16/07/2026

    Added

    • clearScriptDatabase() — delete this script’s IndexedDB database entirely (settings, bookmarks, ledger, tags, queues). Caller should reload afterward so setup rebuilds an empty store.
    • Dock template removeMediaOnDownload — eye-off flag toggle; apps typically setDockSlideOut it under Auto Download.
    • autoDownload templateslideOutWhen: () => true so paired slide-outs (e.g. remove-media) stay available.

    Removed

    • setMaxEntries / ledgerMaxEntries — IndexedDB ledger is uncapped; FIFO trim no longer applies.
  • v. 5.0.0 15/07/2026

    Breaking

    • New required module@require IndexedDB Storage before Configuration Manager. Driver-only apps must remain on CM v4.x until migrated.
    • initialize() is async — open DB, setup (legacy import + setScriptSetup), and cache hydrate complete only after await initialize().
    • Removed local/GM runtime driver stack — Configuration Manager driver stores, attachStorage(), saveSyncCompat(), deferred migration APIs. Utilities v5 removed LocalStore, StorageDriver, LocalStorageDriver, GmStorageDriver, DriverStore. One-time legacy import uses module helpers in IndexedDB Storage (readLegacyLocal, readLegacyGm, legacyStorageHasData).
    • Settings source of truth_settingCache backs getValue(), getOptimized(), and tag-domain reads when canPersist(). field.value is ephemeral (DOM editing only). getField() overlays cache for backward compat.
    • Persistence model — one IndexedDB database per script. Bookmarks use numeric entryId; backup v3 (zip per store). v2/v1 backups import to IDB via _importV2BackupToIdb / _importLegacyBackupToIdb.
    • Bookmarks / ledger IDB-only — no GM/local fallback. Bookmarks use _bookmarkRows from BookmarkRepository. Ledger uses LedgerRepository; when !canPersist(), claim returns true and has returns false.
    • Write gates — check canPersist() before sidebar/repository writes. IDB blocked → read-only, no driver fallback.
    • Tag rules pipeline — raw rules in tagRules rows; compliance reads compiled tagRuleSets. Sidebar toggles use toggleTagRule() / clearTagRules().

    Fixed

    • Ledger reload() — replaces downloadedIds atomically after IndexedDB load instead of clearing the Set first; concurrent Hide Downloaded Media / compliance checks no longer see an empty ledger during reload.
    • Ledger claims + revision cursorLedgerRepository.claim() calls meta.bumpRevision(), which advances _syncedRevisionId immediately via IndexedDB Storage onRevisionBump (same path as all local writes). Tab focus no longer treats ledger claims as foreign revisions that wipe unsaved settings edits.
    • Local revision tracking — every local meta.bumpRevision() advances _syncedRevisionId immediately via IndexedDB Storage onRevisionBump. Minimize/maximize (visibilitychange) no longer treats the script’s own mid-write bumps as foreign updates that wipe unsaved settings edits.
    • _commitTagFieldChange — re-warms TagRuntime before notifyConfigurationChange instead of clearing the cache. Sidebar / discovery substitution (and other sole-attribute) icons no longer stay idle until a tab minimize/maximize re-warm.

    Added

    • BrazenStorageRepositories integrationgetRepos(), isStorageReady(), isIdbBlocked(), canPersist().
    • Tag-rule APItoggleTagRule(), clearTagRules(), scheduleTagRuleCompile(), ensureTagRuleSetsCompiled().
    • getTagRuntime() — access TagRuntime after init; warmCache() on init, visibility resync, and tag writes.
    • Tagging registry APIisTagRegistryField, hasTagSoleAttribute, hasTagSubstitutionSubject, setTagSubstitution, clearTagSubstitution, hasTagComplianceRules, evaluateTagCompliance, createTagContext, registerTypedTagGroups, prepareTagComplianceRuntime, applyTagRegistryDownloadResolver.
    • clearTagDomain() — testing helper: wipe tags + rules + compiled sets; sync empty panel projection (no rebuild).
    • clearDownloadLedger() — wipe all ledgerEntries rows and reload the in-memory downloadedIds Set.
    • applyDockTemplate(name, args?) — named dock-button recipes with baked copy (tagBlacklist, exploredTags, autoDownload, autoNextPage, defaultTags, resolutionFilter, hideOlderPosts, invertedFiltersMaster, skipDuplicates, hideDownloaded). Apps call by template name at field registration; do not restated button strings. Sparse args are for future dock-behavior overrides only.
    • rebuildTagDomainFromPanel() — testing helper: wipe then re-import from current panel fields.
    • Tagging persistTAG_FIELD_SPEC fields use persistTaggingFieldLines (sole attributes on TagEntry, combos in tagRules.expression); _syncFieldFromIdb projects panel text from registry.
    • readSetting / writeSetting — direct IDB get/put for headless fields (e.g. dock-position); updates _settingCache only.
    • getOptimized(name) — read compiled/optimized value from cache.
    • Cache helpers_cacheSetting, _getCachedSetting, _overlayFieldFromCache, _refreshSettingCacheFromIdb.
    • Setup hooksetScriptSetup(async (repos, cm) => …).
    • Legacy importBrazenLegacyImporter during setup (verify-before-delete).
    • Health recovery — unhealthy DB on open → delete and re-run setup.

    Changed

    • save() — mounted panel fields only (DOM → IDB → cache).
    • Lazy hydrate — text/ruleset fields on first createElement().
    • Cross-tab syncmeta.revisionId + visibilitychange.

    Changed (central configuration-change refresh)

    • notifyConfigurationChange(source, local) — pure notification hub; no longer calls refreshMountedFields() or updateDockInterface().
    • onConfigurationChange — single listener slot (Framework); onExternalConfigurationChange deprecated.
    • Write sourceswriteSetting'settings'; tag mutations → 'tags'; save/revertChanges/restore'all'; cross-tab resync → 'all', false.
    • Repository callbacks — bookmark/ledger repo mutations notify via optional onRepositoryChange wired in CM constructor.

    Fixed

    • updateInterface() — overlay _settingCache onto mounted fields before refreshing DOM controls so saved values appear after reload (UI is built before initialize() hydrates IDB).
    • update() — sync _settingCache from mounted controls so Apply and compliance use current DOM values without requiring Save first.
    • setDefault() — update _settingCache so text-field defaults apply when no IDB value exists yet.
    • Dock button visuals — resolve active class/tooltip from _settingCache (via _getEffectiveFieldValue); writeSetting() overlays cache onto headless dock-only fields so toggles update .bv-dock-btn-active immediately.
    • onDockToggle() — chain handlers so scripts can hook dock toggles without replacing Framework's save callback.
    • onExternalConfigurationChange() — deprecated; replaced by Framework-owned configuration-change handler. CM notifyConfigurationChange fires after local writeSetting() / save() and cross-tab visibilitychange.
    • Repository → panel synctoggleTagRule() / clearTagRules() / writeTagRuleLines() bump revision and notify after IDB writes; Framework handler refreshes panel/dock/bookmarks.
  • v. 5.0.0 15/07/2026

    Breaking

    • New required module@require IndexedDB Storage before Configuration Manager. Driver-only apps must remain on CM v4.x until migrated.
    • initialize() is async — open DB, setup (legacy import + setScriptSetup), and cache hydrate complete only after await initialize().
    • Removed local/GM runtime driver stack — Configuration Manager driver stores, attachStorage(), saveSyncCompat(), deferred migration APIs. Utilities v5 removed LocalStore, StorageDriver, LocalStorageDriver, GmStorageDriver, DriverStore. One-time legacy import uses module helpers in IndexedDB Storage (readLegacyLocal, readLegacyGm, legacyStorageHasData).
    • Settings source of truth_settingCache backs getValue(), getOptimized(), and tag-domain reads when canPersist(). field.value is ephemeral (DOM editing only). getField() overlays cache for backward compat.
    • Persistence model — one IndexedDB database per script. Bookmarks use numeric entryId; backup v3 (zip per store). v2/v1 backups import to IDB via _importV2BackupToIdb / _importLegacyBackupToIdb.
    • Bookmarks / ledger IDB-only — no GM/local fallback. Bookmarks use _bookmarkRows from BookmarkRepository. Ledger uses LedgerRepository; when !canPersist(), claim returns true and has returns false.
    • Write gates — check canPersist() before sidebar/repository writes. IDB blocked → read-only, no driver fallback.
    • Tag rules pipeline — raw rules in tagRules rows; compliance reads compiled tagRuleSets. Sidebar toggles use toggleTagRule() / clearTagRules().

    Added

    • BrazenStorageRepositories integrationgetRepos(), isStorageReady(), isIdbBlocked(), canPersist().
    • Tag-rule APItoggleTagRule(), clearTagRules(), scheduleTagRuleCompile(), ensureTagRuleSetsCompiled().
    • readSetting / writeSetting — direct IDB get/put for headless fields (e.g. dock-position); updates _settingCache only.
    • getOptimized(name) — read compiled/optimized value from cache.
    • Cache helpers_cacheSetting, _getCachedSetting, _overlayFieldFromCache, _refreshSettingCacheFromIdb.
    • Setup hooksetScriptSetup(async (repos, cm) => …).
    • Legacy importBrazenLegacyImporter during setup (verify-before-delete).
    • Health recovery — unhealthy DB on open → delete and re-run setup.

    Changed

    • save() — mounted panel fields only (DOM → IDB → cache).
    • Lazy hydrate — text/ruleset fields on first createElement().
    • Cross-tab syncmeta.revisionId + visibilitychange.

    Changed (central configuration-change refresh)

    • notifyConfigurationChange(source, local) — pure notification hub; no longer calls refreshMountedFields() or updateDockInterface().
    • onConfigurationChange — single listener slot (Framework); onExternalConfigurationChange deprecated.
    • Write sourceswriteSetting'settings'; tag mutations → 'tags'; save/revertChanges/restore'all'; cross-tab resync → 'all', false.
    • Repository callbacks — bookmark/ledger repo mutations notify via optional onRepositoryChange wired in CM constructor.

    Fixed

    • updateInterface() — overlay _settingCache onto mounted fields before refreshing DOM controls so saved values appear after reload (UI is built before initialize() hydrates IDB).
    • update() — sync _settingCache from mounted controls so Apply and compliance use current DOM values without requiring Save first.
    • setDefault() — update _settingCache so text-field defaults apply when no IDB value exists yet.
    • Dock button visuals — resolve active class/tooltip from _settingCache (via _getEffectiveFieldValue); writeSetting() overlays cache onto headless dock-only fields so toggles update .bv-dock-btn-active immediately.
    • onDockToggle() — chain handlers so scripts can hook dock toggles without replacing Framework's save callback.
    • onExternalConfigurationChange() — deprecated; replaced by Framework-owned configuration-change handler. CM notifyConfigurationChange fires after local writeSetting() / save() and cross-tab visibilitychange.
    • Repository → panel synctoggleTagRule() / clearTagRules() / writeTagRuleLines() bump revision and notify after IDB writes; Framework handler refreshes panel/dock/bookmarks.
  • v. 4.0.1 14/07/2026

    store format v4 migration fix

  • v. 4.0.0 13/07/2026

    Breaking

    • Field key/title split — the first argument to add*Field(key) is the persistence identity only (field.key, normalized via Utilities.toKebabCase). UI labels are field.title, set explicitly with field.setTitle(...). Registering a human-readable string without setTitle no longer doubles as the display label contract.
    • Lookups and linking use field.keygetField, createElement, setDockSlideOut([...]), dock root/child wiring, bookmarks canonical key, and backup field names all resolve by key, not title. Any code or dock config that passed display strings where keys are expected must migrate.

    Fixed

    • Dock internals — slide-out parent/child linking, bookmarks field key, and dock root slot sync use field.key instead of field.title.
  • v. 3.0.0 13/07/2026

    Added

    • Field builder API — every add*Field(name, …integral…) returns the ConfigurationField; optionals are chainable set* methods on that field (setHelpText, setDefault, setRows, setOptions, bookmark/ledger setters, etc.). One statement per field; manager-level methods (onExternalConfigurationChange, setDockActive, …) still return the manager.
    • legacyScriptPrefix migration — on initialize(), legacy {prefix}settings on each driver are merged into that driver's canonical prefix blob (legacy fills gaps when the new blob is empty); legacy keys are deleted only on that same driver after bookmark/ledger migration verifies canonical storage. Drivers are independent — no cross-driver copy, dual-write, or GM→local promote.
    • CONFIG_TYPE_ACTION / addActionField(name) — action/button fields with setAction / setOnClick; persist: false (excluded from save/backup value round-trip unless custom serializeForBackup).
    • Dock element APIsetDockButton({ icon, tooltip, isActive?, getState?, include?, onClick?, slideOutWhen?, buttonClass? }), setDockSlideOut([childNames]), setDockOrder(n), setDockActive(bool), setDockIncludeContext(userScript), onDockToggle(callback), createDockElement(name), getDockRootFields(), updateDockInterface(railBody?). When dock is active, createElement(name) returns an empty jQuery set for docked fields (panel XOR dock). Dock include callbacks are invoked with the user-script instance as this; updateDockInterface adds or removes root dock buttons when include changes.

    Changed

    • addLedgerField registry migration — on reload(), legacy registries are converted to the canonical storageKey, per-id entry keys are backfilled, legacy keys are removed, and only the canonical blob is read thereafter.

    Fixed

    • addFlagField dock safetyupdateUserInterface no-ops when field.element is absent (dock-only flags).
    • addBookmarksField persistence — on reload() / initialize(), bookmarks are migrated from legacy dedicated keys and aggregate settings on the gm driver only into the canonical {storageKey} GM value, legacy copies are deleted on that driver, and only the canonical key is used. Fixed setLegacyStorageKeys being overwritten by the ledger builder (bookmark legacy keys were never registered). Legacy GM values stored as JSON strings are coerced to arrays before migrate; updateUserInterface uses full reload() (not canonical-only read); _storageMigrated is set only after verified canonical write or when no legacy remains; initialize() and post-async migration reload bookmark fields; stuck migrated flag retries when canonical is empty but legacy remains.
    • Async storage migration — legacy bookmark/ledger conversion runs after the dock mounts via runStorageMigrationAsync() (chunked/yielding for large ledgers); a non-blocking .bv-dock-status badge shows progress; store onChange notifications are suppressed during migration to avoid UI reload loops.
    • Self-managed GM fields — bookmark and ledger fields no longer create an aggregate {prefix}settings key on GM; only drivers with persist: true fields get a settings store. Legacy ledger per-id keys ({legacyKey}/e/*) are copied to canonical keys via GM_listValues before purge.
    • Bookmark finalize_finalizeBookmarkMigrationState loads canonical data before marking migrated when legacy is gone, so a renamed key with data is not skipped as "already migrated" with an empty field value.
    • GM clone revivalGmStorageDriver.read and bookmark coercion revive Tampermonkey arrays/objects/properties clone blobs; canonical load retries JSON revival when coercion returns empty but raw storage exists.
    • Bookmark reload — clears a stuck _storageMigrated flag when canonical is empty but legacy remains; host onBookmarksHydrate runs after async storage migration reload.
    • Dock slide-out children_getDockChildFields() preserves setDockSlideOut([...]) declaration order.

    Recovery (manual, not in code)

    If a prior migration run wrote local-only keys into GM (e.g. brazen-r34xxx-settings), remove those from Tampermonkey GM storage after updating. Restore wiped local settings by pasting values into DevTools → Application → Local Storage (one-off conversion from a GM export; not automated by the framework).

    Breaking

    • Positional optionals removed from all add*Field signatures — consumers on the latest Brazen Framework stack (rule34xxx, ehentai as of v3.0.0) must use add*Field(integral…).set*(…); no .addXField().addYField() cross-field manager chains. Scripts on Brazen Base Search Enhancer with pinned Configuration Manager 2.x keep the positional API until individually migrated.
  • v. 2.7.1 10/07/2026

    Fixed

    • setRules sort — when sortRules is enabled, derives a string sort key per rule (via onFormatForUI for object rules) instead of calling localeCompare directly on each entry.
  • v. 2.7.0 10/07/2026

    [2.7.0] — current

    Added

    • addBookmarksField getRowActions — forwards optional getRowActions(bookmark) to View Layer createBookmarksPanel for per-row action buttons.

    [2.6.0] — 2026-06-23

    Added

    • Ruleset per-rule field APIaddRulesetField attaches onMatchRule, setRules, findRuleIndex, hasRule, addRule, removeRule, toggleRule, and clearRules to each ruleset field. onMatchRule is optional; default matcher is strict equality. setRules runs the translate/sort/optimize/render pipeline without deduplication (dedup remains in setFromUserInterface on Apply/Save).
  • v. 2.5.0 04/07/2026

    [2.5.0] — current

    Changed

    • addBookmarksField — self-managed on the gm driver (storageKey, normalizeBookmarks, reload / save); included in backup v2 under drivers.gm (replace on restore). Removed handlers.load — persistence is config-manager-owned.
    • backup() — includes any persist: false field that defines serializeForBackup (no ledger-only whitelist).

    [2.4.0]

    Added

    • Storage driverslocal (localStorage, default) and gm (Tampermonkey GM storage). Fields attach via fluent attachStorage(driverKey) after any add*Field.
    • CONFIG_TYPE_LEDGER / addLedgerField — self-managed duplicate-download ledger on the gm driver (FIFO index, per-id atomic keys, has / claim / reload / merge / flushPending).
    • Versioned backup (v2){ version: 2, id, drivers: { local: {...}, gm: {...} } }. Each field's serializeForBackup / applyFromBackup handle value semantics (ledger merges on restore). Legacy flat backups still import.
  • v. 2.3.0 10/06/2026
    • Ruleset deduplication — On Apply/Save, duplicate individual rule lines are removed after onTranslateFromUI and before onOptimize (case-sensitive compare; first occurrence kept). The textarea refreshes when duplicates are stripped.
  • v. 2.2.0 09/06/2026
    • change branding
    • various new features
  • v. 2.1.1 31/12/2025

    removed forgotten debug logger

  • v. 2.1.0 30/12/2025

    Added ability to sort ruleset fields

  • v. 2.0.0 29/12/2025
    • rulesets with combination rules
    • local storage handling refactor
    • back/restore feature refactor
    • code style update
  • v. 1.7.0 21/08/2025

    Added a color config type

  • v. 1.6.0 10/11/2024

    Added default value to text field

  • v. 1.5.3 20/09/2024
    • Removed tag blacklist ruleset for better integration in the search enhancement library
    • Other minor chores
  • v. 1.5.2 10/07/2024

    Fixed config getting synced even when there was no change in other tabs

  • v. 1.5.1 04/09/2023

    Fixes

  • v. 1.5.0 03/09/2023

    Added generic validation callback generator

  • v. 1.4.0 03/09/2023

    Added support for tag blacklist ruleset field

  • v. 1.3.1 19/03/2023

    Added settings sync on change in some other tab

  • v. 1.3.0 08/11/2022
  • v. 2.1.1 19/06/2021
  • v. 2.1.0 09/06/2021

    Merged statistics recorder

  • v. 2.0.0 04/06/2021
  • v. 1.2.0 20/01/2021 Added select field
  • v. 1.1.0 09/01/2021
  • v. 1.0.1 05/01/2021 Clearer code organization
  • v. 1.0.0 15/12/2020