Skip to main content

Viglet Dumont: Architecture Overview

Introduction​

Viglet Dumont is a modular data extraction platform that runs connectors independently and delivers indexed documents to a search engine via an asynchronous message queue. It is designed as a companion application to Viglet Turing, but can also deliver content directly to Apache Solr or Elasticsearch.


System Overview​

The system has three layers: content sources on the left, the Dumont pipeline in the center, and search engines on the right.

Dumont: High-Level Architecture

Each numbered block is detailed in its own diagram below.


① Connectors: How Content Enters the Pipeline​

Connectors extract content and feed it into the pipeline. They come in three forms: Java plugins, standalone CLI tools, and the WordPress PHP plugin.

Dumont: Connector Types

TypeConnectorsHow they connect
Java PluginsWeb Crawler, AEM, Catalog & JSON APILoaded into dumont-connector.jar via -Dloader.path, one plugin per JVM
Standalone CLIDatabase, FileSystemSeparate JARs that connect to a running Dumont instance via REST API
PHP PluginWordPressInstalled inside WordPress: sends content directly to Turing, bypasses Dumont

For details on each connector, see Connectors Overview.


② Pipeline Engine: How Content Is Processed​

Once a connector produces a Job Item, it passes through a multi-stage pipeline before reaching the search engine.

Dumont: Pipeline Detail

StageComponentWhat it does
①Job ItemA single document with fields, an action (INDEX / DELETE), and a locale
②Processing StrategiesPriority chain: deindex (P10) → ignore rules (P20) → index new (P30) → reindex changed (P40) → skip unchanged (P50)
③Batch Processor + QueueGroups items into batches of 50, sends to Apache Artemis persistent queue
④Indexing PluginDelivers to Turing (default), Apache Solr, or Elasticsearch

The Indexing DB stores checksums and status for every processed document, enabling incremental indexing on subsequent runs.

For the conceptual explanation of each stage, see Core Concepts, The Processing Pipeline.


③ Data Flow: Indexing Sequence​

The complete sequence from content source to search engine:

Dumont, Indexing Flow


④ Keeping the Index Honest​

A pipeline that finished without error is not proof the index is right. A write can fail after the ledger recorded it, a delete can be lost, and a run cut short can make content that was never read look like content that was removed. Dumont treats both halves of that as first-class: it checks its own work, and it refuses to delete on weak evidence.

MechanismWhat it protects against
Content auditRe-enumerates each source on a cron and files a record for anything never queued
Index auditCompares source, ledger and index, and requeues documents that never landed or whose later write failed
Orphan reportsDocuments left in the index after leaving the source are written into a dated report you approve, never deleted by the audit itself
Safe finishA run that was interrupted, or where too large a share of extractions failed, finishes standalone: the previously indexed documents are preserved rather than swept
Coverage & driftPer-field fill rates per run, with a warning when a field's coverage drops between runs: the signal of a layout or selector break
Field provenanceEvery published field records the strategy and selector it came from, so a value can be traced instead of trusted
Indexing logEvery status a document passed through, attributed to the source and run that caused it, so a claim about what happened can be checked rather than believed

The common rule is that removal is always the conservative branch. A pass that reports nothing, or much less than it should, never becomes a mass de-index, and the one case where deletion is right is routed through a report a human applies.

The same rule governs how these mechanisms report: a failure must never be readable as an absence. An unreachable indexing log answers 503, not an empty page; a log row that cannot be parsed costs its own row and is counted in unreadable, rather than emptying the query; and the log's status endpoint reports configured and enabled separately, so "someone set the flag" and "the store answers" cannot be mistaken for each other.

It holds on the way in as well. A row the store refuses to accept is reported at WARN (once per outage, with a count of what was lost and a line when writes resume) rather than dropped in silence, so a history that reads short can be told from a connector that was quiet. Those warnings are deliberately written to the file and the console rather than to the store being complained about, which is what stops an outage from swallowing the notice of itself.

And it holds for the log that was never switched on. Reading the log and writing it are configured by separate settings, so the status endpoint reports them separately: whether the store is reachable, and whether an appender is attached that would accept a row. A log nothing is writing says so, rather than presenting an empty history as a quiet one.

See Content Audit configuration, the orphan report endpoints and the Logging API.


Internal Module Structure​

ModulePackageResponsibility
Connector CoreconnectorPlugin interface, session management, and REST API controllers
Processing Strategiesconnector/strategyPriority-based chain: index, re-index, de-index, ignore, or skip
Batch Processorconnector/batchThread-safe buffer that groups Job Items before queue delivery
Message Queueconnector/queueJMS listener on Apache Artemis: delegates to indexing plugins
Indexing Pluginsconnector/indexingOutput adapters: Turing, Apache Solr, Elasticsearch
Web Crawlerweb-crawlerJSoup, URL filtering, authentication, locale detection
DatabasedbJDBC queries, batch chunking, multi-database support
FileSystemfilesystemApache Tika text extraction, OCR, metadata mapping
AEMaemAuthor servlets (infinity.json, QueryBuilder) or publish delivery APIs (model.json), tags, delta tracking, custom extensions
Catalog & JSON APIcatalogNormalized catalog feeds, and paged JSON APIs run from a manifest (paging, call budgets, incremental expiry)
WordPresswordpressPHP plugin: event-driven indexing inside WordPress
CommonscommonsShared models, interfaces, utilities
AEM Commonsaem-commonsAEM extension interfaces, component extractors, content types and versioned recipes (published to Maven Central)
DB Commonsdb-commonsDB extension interface (published to Maven Central)
Consoledumont-reactThe web interface: React 19 + Vite, served by the connector and also mountable inside Turing

Console: two interfaces, both live​

The console serves every screen at two addresses, and you can use either:

AddressInterface
/bento/integration/instance/{id}/…A fixed navigation rail, a hub per section, and a ⌘K (Ctrl+K) command palette that jumps to any screen by name
/admin/integration/instance/{id}/…The original interface: a collapsible sidebar

Every screen that configures or monitors a connector answers at both: the six source types and their detail forms, AI source inference, indexing rules, the indexing manager, monitoring, indexing statistics, field coverage, double-check, orphan reports, plugins, system information and AI insights. Nothing was removed from /admin; a bookmark or a deep link into it keeps working.

The screens around the connector (sign-in, first-run setup, users, groups and roles, and your own profile) are served from /admin only.

Both interfaces read the same REST API and show the same data, so switching between them mid-task loses nothing.


Technology Stack​

LayerTechnologyNotes
RuntimeJava 21Minimum supported version
FrameworkSpring Boot 4.0.3JMS, caching, async, scheduling
Message BrokerApache ArtemisEmbedded, persistent queues
DatabaseH2 (dev) / PostgreSQL (prod)Indexing state, checksums, config
HTML ParsingJSoup 1.22.1Web Crawler
Text ExtractionApache Tika 3.2.3FileSystem: PDF, DOCX, images (OCR)
Search ClientsTuring Java SDK, SolrJ 10.0.0, ES Client 9.3.2One active per deployment
BuildApache MavenMulti-module project
ConsoleReact 19, Vite, Tailwind CSS v4Built into the connector's static resources
Console components@viglet/viglet-design-systemShared with Viglet Turing and Shio, so the three look like one product

Deployment Topologies​

Development​

Dumont (H2 embedded + Artemis embedded)
→ Turing (http://localhost:2700)

Production​

Dumont + PostgreSQL
→ Turing + Apache Solr

Direct Indexing (without Turing)​

Dumont + PostgreSQL
→ Apache Solr (direct via SolrJ)
→ Elasticsearch (direct via ES Client)

PageDescription
Core ConceptsPipeline stages, strategies, and change detection
Connectors OverviewAll connectors and deployment types
Indexing PluginsTuring, Solr, Elasticsearch output targets
Installation GuideSetup with -Dloader.path and systemd
Turing: ArchitectureSearch-side architecture: indexing reception, search flow, and deployment topologies