Export your catalog
This guide copies the original bytes of every feed that matches a filter into a storage resource,
where any tool that reads that storage can read them. You need a signed-in account with
xixo:catalog:write, and at least one attached resource that serves storage. See
resources and attaching a resource.
What an export writes
Section titled “What an export writes”An export starts an export run and queues ExportItemsJob on the export queue. The job walks
every feed that has at least one reference and matches
the filter. For each one it takes an original reference held on some other resource, downloads the
bytes, and uploads them to the destination.
- Each file is written at
<source resource key>/<locator key>. A file from the resourcephotosat2024/beach.jpglands atphotos/2024/beach.jpg. - In an
s3resource, the bucket is the resource’s key, and the path is the object key from the bucket’s root. The resource’sprefixdoes not apply. - In a
filesystemresource, the path is relative to the resource’s root, which sits inside the tenant’s directory underXIXO_FILESYSTEM_ROOTS. - Only original bytes are copied. Previews, thumbnails, analyses, titles, tags, and edges stay in xixo.
- Each copy is recorded as another reference on its feed, so the feed lists the destination among its locations.
- A feed with no original reference, or whose only original is already on the destination, is skipped.
- Exporting again to the same destination skips every copy whose source version has not changed. A changed source is written over the existing copy at the same path.
Export from the app
Section titled “Export from the app”- Open the catalog. To export part of it, pick a type or type a search in the bar first. The dialog starts with both filled in.
- Open the More menu (the three dots) and choose Export these….
- Under Write them to, pick a storage resource. Left empty, the export goes to the tenant’s default storage. If the tenant has none, Export stays disabled until you pick one.
- Narrow it with Of type and Matching if you want. Matching takes the same search you would type in the bar. With both empty, every referenced feed is exported.
- Choose Export. The dialog closes and says the export is running.
- The export goes on as a run. It is
queued, thenrunning, and finishesdone,failed,cancelled, orgated. Follow it and read its log over GraphQL.
Export over GraphQL
Section titled “Export over GraphQL”exportFeeds takes an optional destinationId, query, type, and resourceId, and needs
xixo:catalog:write. resourceId limits the export to feeds with a reference on that resource.
See the GraphQL reference.
-
Find the destination’s id. This query needs
xixo:resources:read.query {resources { id key capabilities defaultStorage }} -
Start the export:
mutation {exportFeeds(input: { destinationId: "12", type: "xixo:file", query: "invoices 2025" }) {run { id status }}} -
Poll the run until
statusisdoneorfailed:query {run(id: "34") { status processed error logs }}
To stop it, call cancelRun with the run’s id.
Export over MCP
Section titled “Export over MCP”The resource tool exports with do: "export". The token needs xixo:resources:read and
xixo:resources:command. See MCP and scopes.
-
Call
resourcewith no arguments to list resources, and pick one whosecapabilitiesincludestorage. -
Call it with that resource’s key:
{"key": "archive","do": "export","input": { "type": "xixo:file", "query": "invoices 2025" }}inputacceptsquery,type,mime,tag,resource_id,folder,since, andbefore. The call answers with the run’sidandstatus. -
Follow it with
do: "runs"on the same key, and stop it withdo: "cancel"andinput: { "id": "<run id>" }.
Each token can start XIXO_RUN_BUDGET runs an hour through MCP (20 by default). Syncs and exports
share the budget.
Fetch the files
Section titled “Fetch the files”Read the destination with any client for its type.
- For
s3, list or copy the bucket with the provider’s tools, for exampleaws s3 sync s3://archive ./archive --endpoint-url https://s3.example.com. - For
filesystem, copy the directory from the server. In the example Compose project it is inside thefilesvolume, at/data/files/<tenant>/. - For
webdav, use any WebDAV client.
Move the files to another xixo
Section titled “Move the files to another xixo”- Export to an
s3orwebdavresource that the other deployment can reach. - In the other xixo, attach the same bucket or share as a resource.
- Sync it. Every file it finds becomes a reference on a feed there, and is analyzed. See adding.
Titles, tags, edges, and analyses are not part of the export. The new catalog analyzes the files again.
If it doesn’t work
Section titled “If it doesn’t work”- “this tenant has no default storage resource”: pick a destination, or make a storage resource the default with Take drops in its ⋯ menu on Resources.
- “
<key>is not storage”: the destination does not servestorage. Pick ans3,filesystem, orwebdavresource. - The run ends
gated: anexportgate is closed for the tenant, orXIXO_ITERATORS_DISABLEDis set on the server. - The run ends
failed: the destination refused a write. The job retries five times with a growing wait before it fails the run, and the error is on the run. Check the destination from Resources. - The run stays
queued: no worker is running theexportqueue. See self-hosting. - “this token has started N runs in the last hour”: the MCP run budget is spent. The count resets at
the start of each clock hour. An operator can raise
XIXO_RUN_BUDGET, and0removes the limit.