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 #
| What | Where |
|---|---|
| Folders | wp_terms / wp_term_taxonomy, taxonomy media_category (or any taxonomy you assign) |
| Which files are in which folder | wp_term_relationships |
| Alt text | _wp_attachment_image_alt post meta, where WordPress keeps it |
| Titles and captions | The attachment post itself |
Delete this plugin and every one of those stays. That is the design.
Term meta the plugin adds #
| Key | Holds |
|---|---|
vergeml_color | A folder's colour |
vergeml_order | Manual folder order |
_vergeml_centroid | The folder's centre, for auto-filing |
_vergeml_autonomy | The per-folder ledger of accepted and dismissed suggestions |
Post meta the plugin adds #
| Key | Written by | Holds |
|---|---|---|
_vergeml_hash | Duplicate scan | md5 and dHash |
_vergeml_unused | Library scan | 1 if no reference was found |
_vergeml_used_in | Library scan | Post ids that reference the file |
_vergeml_filesize | Library scan | Bytes |
_vergeml_quarantined | Set aside | When it was set aside |
_vergeml_quarantine_why | Set aside | The reason recorded at the time |
_vergeml_alt_filled | Alt backfill | Marks alt text the plugin wrote, so it can be undone |
_vergeml_ai | AI layer | Per-attachment AI state |
_vergeml_title_before | Title rename | The title as it was, so a rename is reversible |
User meta #
| Key | Holds |
|---|---|
vergeml_tree_state | Which folders you have expanded |
Options #
| Option | Autoload | Holds |
|---|---|---|
vergeml_version | yes | The installed version, used to guard migrations |
vergeml_taxonomies | yes | Taxonomy definitions and per-taxonomy behaviour |
vergeml_lib_options | yes | Library, filter, grid and search settings |
vergeml_tax_options | yes | Taxonomy behaviour options |
vergeml_mimes | yes | The MIME type map |
vergeml_private_folders | yes | Term id → owner id. Small by construction, and rebuilt from nothing if lost |
vergeml_ai | yes | AI settings. The licence key is sealed |
vergeml_ai_credits | — | The last known credit balance, for display |
vergeml_ai_run | no | The 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_watchdog | yes | Fatal 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
embeddingis packed single-precision floats;embedding_dimsrecords how many, per row, so changing model does not silently mix incomparable vectors.projectionis a small reduction of the vector, which is what keeps a 20,000-image meaning search under half a second.lockedis 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 #
| Hook | When | What |
|---|---|---|
vergeml_ai_run_tick | Single event, re-scheduled by each tick | 20 seconds of background describing |
vergeml_meaning_convert | Single event | Converts older index rows to the current projection format |
vergeml_provision_site | Single event, one minute after a new subsite is created | Provisions 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 media | Only the links to attachments go. The terms themselves are never touched |
| Options, the three tables, the plugin's meta keys | Removed |
| Media files | Never 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