Fernweh
Travel AI
Overview GitHub

03 · Content Enrichment

Inventory that
repairs itself.

The problem

Incomplete listings do not convert

Supplier feeds arrive with holes: no description, no amenities, nothing to rank on. Those listings sit in the catalogue unfindable and unbookable, and fixing them by hand does not scale past a few hundred properties.

As it arrived

loading…

✕ Description

—

✕ Amenities

—
Unrankable. With no description and thin attributes there is nothing for search to match a traveller against.

After enrichment

—

✓ Description

—

✓ Amenities

—
Findable and bookable. Written only from facts already on the listing, and every change recorded with its source.


The solution

Content that completes itself

A scanner finds the gaps, a queue distributes the work, and a worker writes copy grounded strictly in facts already on the listing. Run it yourself below.

Waiting on enrichment

Recently repaired


Guarantees

Why this is safe to run unattended

It cannot invent facts

The prompt receives only the listing's own fields and is told not to invent. The reply is then validated in code: every original amenity must survive and at most three may be added. generator.go

It is safe to replay

A worker claims a listing with a compare-and-set in SQL, so two workers racing means one wins and the other cleanly skips. Overlapping scans are deduplicated at enqueue time. pipeline.go

It works with no model

If the model is unavailable or the daily budget is spent, a template generator composes from the same facts. Enrichment keeps progressing at zero cost, and the audit records which path wrote each field.

Failure stays visible

Transient errors release the claim so the queue retries with backoff. Exhausted retries park the listing as failed, where the dashboard shows it rather than losing it silently.


Template generation
910 nsThe zero-budget path
Per listing, with a model
$0.00094All 126 seeded gaps cost about twelve cents
Idempotency guards
2SQL claim, plus a content hash
Audit coverage
100%Before, after, and which path wrote it