Skip to the document
DocsReference

Data model

Where everything lives, so you can back it up, query it, migrate it, or check what uninstalling would take with it.

The short version: your folders and your filing are WordPress's own terms and term relationships. Nothing the plugin creates is required to read them.


Your data — in WordPress's tables #

WhatWhere
Folderswp_terms / wp_term_taxonomy, taxonomy media_category (or any taxonomy you assign)
Which files are in which folderwp_term_relationships
Alt text_wp_attachment_image_alt post meta, where WordPress keeps it
Titles and captionsThe attachment post itself

Delete this plugin and every one of those stays. That is the design.

Term meta the plugin adds #

KeyHolds
vergeml_colorA folder's colour
vergeml_orderManual folder order
_vergeml_centroidThe folder's centre, for auto-filing
_vergeml_autonomyThe per-folder ledger of accepted and dismissed suggestions

Post meta the plugin adds #

KeyWritten byHolds
_vergeml_hashDuplicate scanmd5 and dHash
_vergeml_unusedLibrary scan1 if no reference was found
_vergeml_used_inLibrary scanPost ids that reference the file
_vergeml_filesizeLibrary scanBytes
_vergeml_quarantinedSet asideWhen it was set aside
_vergeml_quarantine_whySet asideThe reason recorded at the time
_vergeml_alt_filledAlt backfillMarks alt text the plugin wrote, so it can be undone
_vergeml_aiAI layerPer-attachment AI state
_vergeml_title_beforeTitle renameThe title as it was, so a rename is reversible

User meta #

KeyHolds
vergeml_tree_stateWhich folders you have expanded

Options #

OptionAutoloadHolds
vergeml_versionyesThe installed version, used to guard migrations
vergeml_taxonomiesyesTaxonomy definitions and per-taxonomy behaviour
vergeml_lib_optionsyesLibrary, filter, grid and search settings
vergeml_tax_optionsyesTaxonomy behaviour options
vergeml_mimesyesThe MIME type map
vergeml_private_foldersyesTerm id → owner id. Small by construction, and rebuilt from nothing if lost
vergeml_aiyesAI settings. The licence key is sealed
vergeml_ai_credits—The last known credit balance, for display
vergeml_ai_runnoThe background describe run's state
vergeml_smart_scan / vergeml_smart_scan_progress—Reference scan state
vergeml_health—Duplicate scan state
vergeml_index—AI index schema version and state
vergeml_librarian / vergeml_librarian_batches / vergeml_librarian_moves—Folder-sorting run state and table names
vergeml_organize—Clustering state
vergeml_imports—The import log, which is what undo reads
vergeml_import_csv—CSV import state
vergeml_talk_undo—The last folder-talk plan, for undo
vergeml_watchdogyesFatal error counts and safe-mode state
vergeml_uninstall_wipe—Whether deleting the plugin takes its data
vergeml_backup—Settings export/restore
vergeml_stats—The local statistics summary
vergeml_support_token—A site token used when you send a support ticket
vergeml_upgrading—Set during an upgrade

Network (site) options: vergeml_ai_network holds a network-wide licence key and its lock flag.

Why private folders live in an option rather than term meta. Term meta would be the obvious home, but every folder query anywhere would then need a meta join or a second query to know what to exclude — and /tree has a query budget that must not move with folder count. Autoloaded, an option of ids costs nothing: a site with no private folders pays zero, and a site with fifty pays zero as well.


Tables #

Three, and none of them holds your filing.

{prefix}vergeml_ai_index #

One row per described attachment.

attachment_id   bigint(20) unsigned NOT NULL
caption         text NULL
alt             text NULL
title           varchar(255) NOT NULL DEFAULT ''
tags            text NULL
kind            varchar(32)  NOT NULL DEFAULT ''
has_people      tinyint(1) NULL
has_text        tinyint(1) NULL
document_type   varchar(32)  NOT NULL DEFAULT ''
orientation     varchar(16)  NOT NULL DEFAULT ''
embedding       longblob NULL
embedding_dims  smallint(5) unsigned NULL
projection      blob NULL
model           varchar(96)  NOT NULL DEFAULT ''
model_version   varchar(64)  NOT NULL DEFAULT ''
prompt_hash     varchar(64)  NOT NULL DEFAULT ''
locked          varchar(191) NOT NULL DEFAULT ''
error           varchar(64)  NOT NULL DEFAULT ''
described_at    datetime NULL
updated_at      datetime NOT NULL
PRIMARY KEY (attachment_id)
KEY kind, has_people, has_text, document_type, described_at
  • embedding is packed single-precision floats; embedding_dims records how many, per row, so changing model does not silently mix incomparable vectors.
  • projection is a small reduction of the vector, which is what keeps a 20,000-image meaning search under half a second.
  • locked is a comma list of field names you have edited by hand. A re-describe leaves those alone.

{prefix}vergeml_librarian_batches and …_moves #

-- batches
batch_id, run_id, scheme, status, step_cursor, done_n, skip_n, params, reason,
created_at, updated_at

-- moves: one row per assignment a sorting run made
move_id, batch_id, attachment_id, term_id, term_created, undone

term_created is the whole basis of undo. A folder that already existed is one you own, and undo must never delete it however empty it ends up.

{prefix}vergeml_organize_runs #

run_id, parent_run_id, status, k, n, load_cursor, tree, params,
created_at, updated_at

Clustering runs, so a proposal can be re-opened rather than recomputed.

All three are created with dbDelta and are safe to re-check on every load.


Scheduled events #

HookWhenWhat
vergeml_ai_run_tickSingle event, re-scheduled by each tick20 seconds of background describing
vergeml_meaning_convertSingle eventConverts older index rows to the current projection format
vergeml_provision_siteSingle event, one minute after a new subsite is createdProvisions it on a network

Single events rather than recurring schedules: a finite job should not leave a repeating hook behind when it finishes.

Transients #

vergeml_known_issues — the known-issues list from the public repository, cached for an hour. On failure an empty list is cached, so a network problem does not mean a request on every admin page load.


What uninstalling removes #

Deactivating: nothing.

Deleting the plugin (the default): transients and scheduled events. Nothing else. Your folders are terms and your AI descriptions were paid for in credits; neither can be rebuilt for free, so neither goes just because the plugin does. A reinstall — or another folder plugin reading the same taxonomy — finds everything where it was.

With "Remove all data on uninstall" switched on, or via Complete cleanup, the wipe is opt-in twice over and does remove your filing. Precisely:

What happens
Taxonomies this plugin created (eml_media is 1)Their terms are deleted, along with the links to attachments
Taxonomies that are the site's own, merely assigned to mediaOnly the links to attachments go. The terms themselves are never touched
Options, the three tables, the plugin's meta keysRemoved
Media filesNever touched. There is no code path in this plugin that removes a media file

The uninstall routine runs without the plugin loaded, so no taxonomy is registered and no plugin function exists. It works directly, per table, with every value placeheld.

Written from version 3.15.0 of the plugin. Last updated 2026-10-02. All documentation · Legal · Support