Fruitful Docs
Concepts

The package lifecycle

Why the manifest has four blocks in data-flow order, and what each one is allowed to do.

A Feed Package manifest reads top to bottom as the life of one followed page. That order is not a style choice; each block owns a phase, and the boundaries between phases are where the system checks its work.

capture   a feed is offered → its route captures the page → the binding's engine produces the extract
transform the extract becomes Lexicon-validated records
render    the root record becomes an Activity item through the View and A2UI surfaces
focus     meanwhile, the extension hides distractions on the live site

Capture: from URL to extract

A route is the unit. It says what it yields (a collection of entries or one item), how it is reached (a feed people follow, a detailOf link from another record, or only a pasted URL), and how the page becomes a record (which binding, and through it which engine). Everything else on the route, login, readiness, hooks, scrolling, exists to get the page into a state where the engine can read it.

The output is an extract validated against a Lexicon def. Entries that do not conform are dropped and reported, never passed on.

Transform: from extract to records

The transform is the first of the two places code may appear. It runs in a sandbox with no host access and turns extract items into records, each validated against its pinned Lexicon before anything is saved. Identity (/uri) and links (ref properties) come from the Lexicon, so the transform cannot invent a new way to relate things.

Render: from record to something a person reads

The root record becomes an Activity item. The package builds a View deterministically and ships surface templates; Fruitful renders them from its trusted catalog. When any of that is missing or invalid, the item shows as Presentation unavailable. It never falls back to opening the website.

Focus: on the live site, outside the pipeline

Focus is the odd one out on purpose. It runs in the browser extension on the real page, is data only, and cannot see records or Views. It ships in the package because the package is what knows the site. See Focus is not part of the pipeline.

Why exactly two places for code

Code lives in capture.hooks.file and transform.hooks.file, and nowhere else. Hooks get a fixed vocabulary of page operations, granted per export. The transform gets pure computation. Bindings are selectors, surfaces are templates, Focus is rules. Every other part of the manifest is version pins and wiring, which means it can be validated completely before anything runs.

On this page