Uniform Siphon - Sitecore Download commands Reference

This page is the command-line reference for the download (extract) phase of a Sitecore migration — the commands of Siphon.Download.exe that pull items, media, and presentation out of a live Sitecore instance.

They reach Sitecore two different ways, and it matters where each one points. download-items and download-media go through the deployed UniformMigrationService.aspx endpoint (--uniformServiceUrl) on a CD instance; download-presentation drives a browser against the Experience Editor (--host) on the CM. See Deploy to Sitecore.

The executables, how configuration and environment variables are resolved, logging, and the common options shared by every command are documented once on the common reference. Each switch below lists its command-scoped environment variable; the global SIPHON_{PARAMETER} form works too.

If you are migrating for the first time, start with the Sitecore migration walkthrough — it explains when and why to run each command.


Interactive wizard (part of the siphon wrapper) that walks you through the download-phase settings and writes a ready-to-use .env. Run it once at the start of a migration instead of assembling environment variables by hand — it saves progress after each answer, so you can re-run it to resume or edit.

PS C:\migration> siphon configure-download

It prompts for the work directory, the common connection settings (database, service URL, secret), and per-command options for download-items, download-media, and (optionally) download-presentation, then writes keys such as SIPHON_DOWNLOAD_ITEMS_ROOT and SIPHON_DOWNLOAD_ITEMS_OUTPUTDIR. See the download guide for a full sample session. (For a blank template covering every key instead of a guided wizard, use siphon generate-dot-env.)


Download Sitecore content items (and, optionally, their rendering datasources and field-referenced items) through the migration service. This is the backbone of the migration — every later phase reads from these files.

PS C:\migration> siphon download download-items ` --database web ` --uniformServiceUrl https://cd.example.com/layouts/UniformMigrationService.aspx ` --secret my_secret ` --root "DAC24EDD-44FB-42EF-9ECD-1E8DAF706386" ` --outputDir "C:\migration\data\items"

SIPHON_DOWNLOAD_ITEMS_ROOT = <guid> (--root)
Root item whose subtree (item + all descendants) is downloaded. For a single site pass its Home item; for a multi-site solution either download sites one by one, or pass the all-content root 11111111-1111-1111-1111-111111111111 to grab everything.

SIPHON_DOWNLOAD_ITEMS_DATABASE = <string> (--database)
The Sitecore database to download from. Use web — the database that serves published content (i.e. your publishing target) — for a normal migration; if your solution publishes to a different database, use that one instead. You can run a second pass against master to also pull unpublished / draft content, but this is not recommended: reconciling draft and published versions adds significant complexity. Prefer publishing all required content before the content freeze and migrating from web only.

SIPHON_DOWNLOAD_ITEMS_UNIFORMSERVICEURL = <url> (--uniformServiceUrl)
Full URL to the UniformMigrationService.aspx you deployed to the Sitecore CD, e.g. https://cd.example.com/layouts/UniformMigrationService.aspx. Deploy it to every load-balanced CD instance — the load balancer then spreads --threads across the whole farm, which is the biggest lever on extraction speed, and a node without the file fails requests intermittently. Point this at the CM only for a --database master pass, since a CD has no master database. See Deploy to Sitecore.

SIPHON_DOWNLOAD_ITEMS_SECRET = <string> (--secret)
The secret phrase configured inside UniformMigrationService.aspx.

SIPHON_DOWNLOAD_ITEMS_OUTPUTDIR = <path> (--outputDir)
Local folder the downloaded items are written to.

SIPHON_DOWNLOAD_ITEMS_DOWNLOADRENDERINGSDATASOURCES = true|false (--downloadRenderingsDatasources)
Also download the rendering datasource items referenced from each page's Shared/Final Renderings layout, even when they live outside --root. Recommended, so components keep their content. Default: false.

SIPHON_DOWNLOAD_ITEMS_DOWNLOADFIELDSREFERENCES = true|false (--downloadFieldsReferences)
Also download items referenced from fields (links, droptrees, multilists, …) when they fall outside --root. Recommended, so references resolve during migration. Default: false.

SIPHON_DOWNLOAD_ITEMS_DEVICEID = (empty)|<guid> (--deviceId)
Sitecore device whose layout is read (default: the Default device {FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}).

SIPHON_DOWNLOAD_ITEMS_EXCLUDEITEMSFILE = (empty)|<path> (--excludeItemsFile)
Skip specific items. Point at a JSON file (or pass its contents) shaped as { "item-guid-1": "any comment", ... } — the keys are the item IDs to exclude.

SIPHON_DOWNLOAD_ITEMS_SKIPLOCALDATASOURCES = true|false (--skipLocalDatasources)
Do not walk a page's local datasource folder: a child of a page named _local or data is not downloaded, and neither is anything below it. Only a child of a page (an item that has a layout) is skipped — a shared, site-wide Data folder that does not sit under a page is still downloaded in full. Default: false. See skipping page-local datasources.

SIPHON_DOWNLOAD_ITEMS_LOCALDATASOURCEFOLDERNAMES = (empty)|<string> (--localDatasourceFolderNames)
Replace the folder names --skipLocalDatasources looks for. Compared case-insensitively; delimiters ,;|. A value here replaces the defaults rather than adding to them. Default: _local|data.

SIPHON_DOWNLOAD_ITEMS_FORCE = true|false (--force)
Re-download items that already exist locally instead of skipping them. Use it to refresh a stale download. Default: false.

SIPHON_DOWNLOAD_ITEMS_INPUTFILE = (empty)|<path> (--inputFile)
Download only the items listed in a _missing-datasources-and-media-{timestamp}.json file (produced by an earlier run) — used to fetch items that were reported missing.

SIPHON_DOWNLOAD_ITEMS_UNSUCCESSFULDOWNLOADSFILENAME = (empty)|<string> (--unsuccessfulDownloadsFileName)
Override the name of the _unsuccessful_downloads-{timestamp}.json report file.

SIPHON_DOWNLOAD_ITEMS_DISABLEKEEPALIVECHECK = true|false (--disableKeepAliveCheck)
Stop polling /sitecore/service/keepalive.aspx. Use it when that endpoint is restricted or removed on the target instance. Default: false.

SIPHON_DOWNLOAD_ITEMS_THREADS = (empty)|<int> (--threads)
Number of parallel download workers. Default: 4.

SIPHON_DOWNLOAD_ITEMS_STATSINTERVALSECONDS = (empty)|<int> (--statsIntervalSeconds)
How often, in seconds, to log the throughput report and re-read --tuningFile. 0 turns both off. Default: 10. See monitoring and tuning a running download.

SIPHON_DOWNLOAD_ITEMS_TUNINGFILE = (empty)|<path> (--tuningFile)
The JSON file re-read while the run is in flight, so the thread count can be changed — or the run paused — without restarting it. Default: settings-override.json in the current directory.

SIPHON_DOWNLOAD_ITEMS_AUTOTUNE = true|false (--autotune)
Search for a good thread count while the run is in flight: add or remove one worker every --autotuneinterval, keep the change if throughput improved, revert it otherwise. Default: false.

SIPHON_DOWNLOAD_ITEMS_AUTOTUNEMAX = (empty)|<int> (--autotunemax)
Upper bound for --autotune; the lower bound is always 1. Default: 32.

SIPHON_DOWNLOAD_ITEMS_AUTOTUNEINTERVAL = (empty)|<int> (--autotuneinterval)
Seconds between --autotune steps — each step is measured over exactly one of these. Default: 10.

SIPHON_DOWNLOAD_ITEMS_RETRYCOUNT = (empty)|<int> (--RetryCount)
Retry attempts for each item before it is recorded as unsuccessful. Default: 3.

SIPHON_DOWNLOAD_ITEMS_TIMEOUT = (empty)|<int> ms (--Timeout)
Timeout for each request to the migration service, in milliseconds. Default: 60000 (must be > 100).

SIPHON_DOWNLOAD_ITEMS_STOPONERROR = true|false (--stopOnError)
Abort the download on the first error instead of collecting errors and continuing. Default: false.

SIPHON_DOWNLOAD_ITEMS_SKIPCLEARINGFOLDERS = true|false (--skipClearingFolders)
Do not clear the download output folders before writing — use it when combining several runs into one folder. Default: false.

Plus the common options (--languages, logging).

Download `en` first

If you restrict --languages, the first pass must be en and it must cover /sitecore/templates and /sitecore/system/Languages — those items normally have an en version only, and without them the migration has no content types and no locales to build from. This holds even when all of your content lives in other languages. See Always download en first.

`--skipLocalDatasources` prunes the tree walk only

A datasource that lives inside a skipped folder but is pointed at explicitly — from a rendering's datasource or from a reference field — is still downloaded when --downloadRenderingsDatasources or --downloadFieldsReferences is on. Those switches follow an item id, and an item's path is not known until it has been fetched. So the switch removes the bulk of a page-local subtree (everything nothing points at), not every item in it.

Resuming a download

download-items is resumable. Items already present on disk ({outputDir}/{language}/{item-id}.json) are skipped, so an interrupted download can simply be re-run. Note that content created between attempts may not be picked up automatically — pass --force to refresh everything.


Download Sitecore media library items and their binary files. Run it after download-items so --skipUnusedMedia can limit the download to the media your content actually references.

PS C:\migration> siphon download-media ` --database web ` --uniformServiceUrl https://cd.example.com/layouts/UniformMigrationService.aspx ` --secret my_secret ` --outputDir "C:\migration\data\items" ` --mediaRootDir "C:\migration\data\media" ` --skipUnusedMedia

SIPHON_DOWNLOAD_MEDIA_DATABASE = <string> (--database)
The Sitecore database — normally web (the publishing target); match whatever you used for download-items. See download-items for when a second master pass makes sense.

SIPHON_DOWNLOAD_MEDIA_UNIFORMSERVICEURL = <url> (--uniformServiceUrl)
URL to the deployed UniformMigrationService.aspx on the CD — same endpoint as download-items.

SIPHON_DOWNLOAD_MEDIA_SECRET = <string> (--secret)
Service secret.

SIPHON_DOWNLOAD_MEDIA_OUTPUTDIR = <path> (--outputDir)
Destination folder for the media item JSON (typically the same items folder used by download-items, so references line up).

SIPHON_DOWNLOAD_MEDIA_SKIPUNUSEDMEDIA = true|false (--skipUnusedMedia)
Download only the media files referenced by previously-downloaded content. Usually a large reduction in volume. Cannot be combined with --root. Default: false.

SIPHON_DOWNLOAD_MEDIA_ROOT = (empty)|<guid> (--root)
Media library subtree to download from (or, with --skipUnusedMedia off, to filter by). Not supported together with --skipUnusedMedia.

SIPHON_DOWNLOAD_MEDIA_MEDIAROOTDIR = (empty)|<path> (--mediaRootDir)
Folder the binary files are written to (default: {outputDir}/media). Keep it separate from the items folder.

SIPHON_DOWNLOAD_MEDIA_MEDIAPREFIX = (empty)|<string> (--mediaPrefix)
The media URL prefix to recognise/strip (default /-/media/). Change it only if your instance serves media under a different prefix.

SIPHON_DOWNLOAD_MEDIA_EXCLUDEUNSUPPORTEDMIMETYPES = true|false (--excludeUnsupportedMimeTypes)
Skip files whose MIME type Uniform does not yet support, instead of downloading them. Default: false.

SIPHON_DOWNLOAD_MEDIA_DEVICEID = (empty)|<guid> (--deviceId)
Sitecore device whose layout is read (default: the Default device {FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}).

SIPHON_DOWNLOAD_MEDIA_EXCLUDEITEMSFILE = (empty)|<path> (--excludeItemsFile)
Exclude specific media items via a JSON file shaped as { "item-guid": "comment", ... }.

SIPHON_DOWNLOAD_MEDIA_FORCE = true|false (--force)
Re-download media that already exists locally. Default: false.

SIPHON_DOWNLOAD_MEDIA_INPUTFILE = (empty)|<path> (--inputFile)
Fetch only the media listed in a _missing-…json file from an earlier run.

SIPHON_DOWNLOAD_MEDIA_UNSUCCESSFULDOWNLOADSFILENAME = (empty)|<string> (--unsuccessfulDownloadsFileName)
Override the name of the unsuccessful-downloads report file.

SIPHON_DOWNLOAD_MEDIA_DISABLEKEEPALIVECHECK = true|false (--disableKeepAliveCheck)
Stop polling keepalive.aspx. Default: false.

SIPHON_DOWNLOAD_MEDIA_THREADS = (empty)|<int> (--threads)
Number of parallel media-download workers. Default: 4.

SIPHON_DOWNLOAD_MEDIA_STATSINTERVALSECONDS = (empty)|<int> (--statsIntervalSeconds)
How often, in seconds, to log the throughput report and re-read --tuningFile. 0 turns both off. Default: 10. See monitoring and tuning a running download.

SIPHON_DOWNLOAD_MEDIA_TUNINGFILE = (empty)|<path> (--tuningFile)
The JSON file re-read while the run is in flight, so the thread count can be changed — or the run paused — without restarting it. Default: settings-override.json in the current directory.

SIPHON_DOWNLOAD_MEDIA_AUTOTUNE = true|false (--autotune)
Search for a good thread count while the run is in flight: add or remove one worker every --autotuneinterval, keep the change if throughput improved, revert it otherwise. Default: false.

SIPHON_DOWNLOAD_MEDIA_AUTOTUNEMAX = (empty)|<int> (--autotunemax)
Upper bound for --autotune; the lower bound is always 1. Default: 32.

SIPHON_DOWNLOAD_MEDIA_AUTOTUNEINTERVAL = (empty)|<int> (--autotuneinterval)
Seconds between --autotune steps — each step is measured over exactly one of these. Default: 10.

SIPHON_DOWNLOAD_MEDIA_RETRYCOUNT = (empty)|<int> (--RetryCount)
Retry attempts for each media file before it is recorded as unsuccessful. Default: 3.

SIPHON_DOWNLOAD_MEDIA_TIMEOUT = (empty)|<int> ms (--Timeout)
Timeout for each request to the migration service, in milliseconds. Default: 60000 (must be > 100).

SIPHON_DOWNLOAD_MEDIA_STOPONERROR = true|false (--stopOnError)
Abort the download on the first error instead of collecting errors and continuing. Default: false.

SIPHON_DOWNLOAD_MEDIA_SKIPCLEARINGFOLDERS = true|false (--skipClearingFolders)
Do not clear the download output folders before writing — use it when combining several runs into one folder. Default: false.

Plus the common options (--languages, logging).

Versioned media

To download unversioned media files, set Media.RequestProtection.Enabled to false and clear the cache via /sitecore/admin/cache.aspx on the source instance first.


Download the Sitecore presentation layer — each page's rendered markup captured in Experience Editor mode (its special markup carries the hierarchical placeholder/rendering structure Siphon needs). This lets the migration reconstruct the component hierarchy of compositions and, experimentally, code-generate React components. It is optional: skip it for a content-only migration.

The command logs into Sitecore with Playwright and finds every previously-downloaded item under --startPath that has presentation assigned (a non-empty Layout or Page Design field). Install Playwright first with .\playwright.ps1 install (see the installation guide).

PS C:\migration> siphon download-presentation ` --inputDir C:\migration\data\items ` --outputDir C:\migration\data\presentation ` --host https://sc.dev ` --productionHost https://www.example.com ` --startPath /sitecore/content/Habitat/Home ` --loginUrl https://sc.dev/sitecore/login ` --username admin ` --password b ` --database web

SIPHON_DOWNLOAD_PRESENTATION_INPUTDIR = <path> (--inputDir)
Folder of the previously downloaded Sitecore items (the download-items output).

SIPHON_DOWNLOAD_PRESENTATION_OUTPUTDIR = <path> (--outputDir)
Destination for the presentation files (index.html + index.json per page, under <outputDir>/<language>/<item path>/). With --assets, downloaded assets go into <outputDir>/<language>/_assets/ instead of the page folders.

SIPHON_DOWNLOAD_PRESENTATION_HOST = <url> (--host)
The Sitecore CM URL, e.g. https://cm.example.com/. A bare host is upgraded to https:// (or http:// for localhost/IPs). This must be a Content Management instance: the command captures Experience Editor markup (?sc_mode=edit), which a CD cannot render — point it at a CD and every page comes back a server error page instead of content. Note this is the opposite of --uniformServiceUrl, which belongs on the CD.

SIPHON_DOWNLOAD_PRESENTATION_PRODUCTIONHOST = <url> (--productionHost)
The production/CD host used for production-HTML comparison, e.g. when --host is https://cm.example.com the production host is https://www.example.com.

SIPHON_DOWNLOAD_PRESENTATION_STARTPATH = <path> (--startPath)
Site root item, e.g. /sitecore/content/Habitat/Home.

SIPHON_DOWNLOAD_PRESENTATION_LOGINURL = <url> (--loginUrl)
Sitecore login page used, with --username/--password, to authenticate the Playwright session.

SIPHON_DOWNLOAD_PRESENTATION_USERNAME = <string> (--username)
Sitecore user for the Experience Editor session.

SIPHON_DOWNLOAD_PRESENTATION_PASSWORD = <string> (--password)
Password for that user.

SIPHON_DOWNLOAD_PRESENTATION_DATABASE = <string> (--database)
The Sitecore database — normally web (the publishing target), matching your download-items run; defaults to the logged-in user's context database. See download-items for the master/draft-content note.

SIPHON_DOWNLOAD_PRESENTATION_VIRTUALPATH = (empty)|<path> (--virtualPath)
Capture only a sub-tree of the site, e.g. /about-habitat.

SIPHON_DOWNLOAD_PRESENTATION_SITENAME = (empty)|<string> (--siteName)
The Sitecore <site> name (from <sites> in showconfig, or the SXA Site item) to render under in Experience Editor, e.g. website.

SIPHON_DOWNLOAD_PRESENTATION_ASSETHOST = (empty)|<url> (--assetHost)
Asset host used to make media URLs absolute, e.g. https://sc.blob.core.windows.net/assets.

SIPHON_DOWNLOAD_PRESENTATION_ASSETS = true|false (--assets)
Also download the presentation assets (stylesheets, scripts, images) referenced in the production HTML of each page, plus the site's sitemap.xml. Default: false.

Assets are per-site, not per-page, so they are written once into <outputDir>/<language>/_assets/, kept out of the page folders. Inside _assets every file keeps its site-root-relative path — an asset served from https://www.example.com/styles/main.css lands in _assets/styles/main.css — so the folder can be published as the web root of a static mirror as-is. Sitecore media (/-/media/...) is skipped here; use download-media for it, and files already on disk are not re-downloaded.

SIPHON_DOWNLOAD_PRESENTATION_SKIPDESCENDANTS = true|false (--skipDescendants)
Capture only the matched items themselves, not their descendants. Default: false.

SIPHON_DOWNLOAD_PRESENTATION_EXCLUDETEMPLATES = (empty)|<list> (--excludeTemplates)
Pipe-separated list of templates (names or IDs) to skip downloading.

SIPHON_DOWNLOAD_PRESENTATION_RESTOREINITIALCOOKIES = true|false (--restoreInitialCookies)
After a successful login, save the cookies and restore them before every subsequent request (helps with instances that rotate session state). Default: false.

SIPHON_DOWNLOAD_PRESENTATION_FORCE = true|false (--force)
Re-download the Experience Editor HTML and regenerate the index.json files even if they are already cached. Default: false.

SIPHON_DOWNLOAD_PRESENTATION_WHATIF = true|false (--whatIf)
Dry run: make no web requests, only log the intended actions. Default: false.

SIPHON_DOWNLOAD_PRESENTATION_DISABLEKEEPALIVECHECK = true|false (--disableKeepAliveCheck)
Stop polling keepalive.aspx. Default: false.

SIPHON_DOWNLOAD_PRESENTATION_THREADS = (empty)|<int> (--threads)
Number of pages captured in parallel. Each worker logs in and drives a browser session of its own, and loads that page's production HTML through a second one. Default: 4.

SIPHON_DOWNLOAD_PRESENTATION_STATSINTERVALSECONDS = (empty)|<int> (--statsIntervalSeconds)
How often, in seconds, to log the throughput report and re-read --tuningFile. 0 turns both off. Default: 10. See monitoring and tuning a running download.

SIPHON_DOWNLOAD_PRESENTATION_TUNINGFILE = (empty)|<path> (--tuningFile)
The JSON file re-read while the run is in flight, so the thread count can be changed — or the run paused — without restarting it. Default: settings-override.json in the current directory.

SIPHON_DOWNLOAD_PRESENTATION_AUTOTUNE = true|false (--autotune)
Search for a good thread count while the run is in flight: add or remove one browser session every --autotuneinterval, keep the change if throughput improved, revert it otherwise. Default: false.

SIPHON_DOWNLOAD_PRESENTATION_AUTOTUNEMAX = (empty)|<int> (--autotunemax)
Upper bound for --autotune; the lower bound is always 1. Default: 32. Worth lowering here — every session is a browser context against the CM, and every captured page also loads the production page.

SIPHON_DOWNLOAD_PRESENTATION_AUTOTUNEINTERVAL = (empty)|<int> (--autotuneinterval)
Seconds between --autotune steps — each step is measured over exactly one of these. Default: 10.

SIPHON_DOWNLOAD_PRESENTATION_RETRYCOUNT = (empty)|<int> (--RetryCount)
Retry attempts for each page before it is recorded as unsuccessful. Default: 3.

SIPHON_DOWNLOAD_PRESENTATION_TIMEOUT = (empty)|<int> ms (--Timeout)
Timeout for each request to Sitecore, in milliseconds. Default: 60000 (must be > 100).

SIPHON_DOWNLOAD_PRESENTATION_STOPONERROR = true|false (--stopOnError)
Abort the download on the first error instead of collecting errors and continuing. Default: false.

SIPHON_DOWNLOAD_PRESENTATION_SKIPCLEARINGFOLDERS = true|false (--skipClearingFolders)
Do not clear the output folders before writing — use it when combining several runs into one folder. Default: false.

Plus the common options (--languages, logging).


A download of a large tree runs for hours, so every Siphon.Download.exe command reports what it is achieving while it works, and all three — download-items, download-media and download-presentation — can be re-tuned, or paused and resumed, without being restarted.

Every --statsIntervalSeconds (default 10) a download command logs one line: what the last window transferred, what the run has averaged since it started, and how many workers are running. A final line reports the run as a whole.

[stats] last 10s: 152 items, 673.8 KB, 336.2 KB/s, 76 items/s | total 00:16: 725 items, 3.3 MB, 213.5 KB/s, 45 items/s | threads 4 [stats] finished in 00:21: 1,111 items, 5 MB, 241.2 KB/s, 52 items/s

Only what was actually fetched is counted. An item, media file or page that was already on disk and skipped is not a download, so a resumed run reports the speed of the work it is really doing rather than the speed of skipping files it already has.

On the same interval, a download command re-reads a small JSON file — settings-override.json in the current directory by default, or wherever --tuningFile points:

{ "threads": 8 }

All three commands resize their worker pool within one interval. Workers are added straight away; when the number goes down, workers stop after the item they are on — never in the middle of a request — so nothing in flight is lost. Delete the file, or just the "threads" key, to hand control back to --threads. Any other keys in the file are left alone.

Tune against the [stats] lines

The right thread count depends on the source instance rather than on the size of the tree: too few and the download crawls, too many and Sitecore starts timing out. Raise the number in the tuning file while you watch the [stats] lines, and back it off as soon as throughput stops improving or errors start appearing — an eight-hour download no longer has to be killed and restarted to try a different value.

What a thread costs on `download-presentation`

A worker here is not a socket, it is a browser session: it logs into Sitecore separately, holds an Experience Editor session of its own, and loads each page's production HTML through a second browser context. All of them share one Chromium, but --threads 4 still means four concurrent Experience Editor renders on the CM and four concurrent hits on the production site. Start low, watch the [stats] line, and keep --autotunemax modest on this command — a production host behind a WAF or rate limiter will notice.

"pause": true in the same file holds the run where it is:

{ "pause": true, "threads": 8 }

Workers finish the item they are already fetching and then park — nothing new is requested from Sitecore until the pause is lifted. The run itself stays alive, with its queue, its index and everything already on disk intact (on download-presentation the workers keep their browser sessions too, so resuming costs no logins), so this is how you get out of the way of a content freeze, a backup or a CM restart without throwing away hours of progress.

While a run is paused the file is re-read every second instead of once per --statsIntervalSeconds, so it picks up again promptly. Removing the "pause" key, setting it to false, or deleting the file altogether all resume the run.

A pause is otherwise silent — no downloads, no errors — so the run keeps saying that it is holding, once per --statsIntervalSeconds, and the throughput report marks the same windows. A paused download is never left looking like a hung one:

[stats] last 10s: 0 items, 0 B, 0 B/s, 0 items/s | total 02:14: 580 items, 2.7 MB, 198.1 KB/s, 41 items/s | threads 4 | PAUSED [tuning] still PAUSED after 00:02:00 - nothing is being downloaded. Remove "pause" from settings-override.json, set it to false, or delete the file to resume.

A "threads" value alongside the pause is applied straight away, so { "pause": true, "threads": 8 } holds the run and brings it back at eight workers. --autotune sits out a paused window and takes a fresh baseline once the download is moving again.

A pause holds work, not a finished run

Pausing parks the workers, but it cannot keep a run that has nothing left to do from ending: if the queue drains while the download is paused, the command completes normally. Pause a download that is still working, not the last seconds of one.

--autotune runs that search for you. Every --autotuneinterval seconds (default 10) it moves the pool by one worker, measures the next window, and keeps the change only if throughput improved by more than a small noise margin (3%) — otherwise it reverts and tries the other direction next. It never goes below 1 or above --autotunemax (default 32), and it sits out the window a pause was lifted in, which is part hold and part work and would read as a collapse in throughput.

[autotune] baseline at 2 thread(s): 246.5 KB/s. [autotune] 3 thread(s): 298.6 KB/s beats 246.5 KB/s at 2 thread(s) - keeping it. [autotune] 4 thread(s): 369.8 KB/s beats 298.6 KB/s at 3 thread(s) - keeping it. [autotune] 5 thread(s): 471.6 KB/s beats 369.8 KB/s at 4 thread(s) - keeping it. [autotune] 4 thread(s): 378.3 KB/s is no better than 471.6 KB/s at 5 thread(s) - reverting to 5 and trying the other direction next.

The count it is trying is written back into the tuning file, so that file always shows the value in force. Editing the file yourself still wins — the tuner notices the change, re-measures from your number and carries on from there.

Which value applies

--threads is the starting point. The tuning file overrides it for as long as the file has a "threads" key, and --autotune writes into that same file. A run with no tuning file and no --autotune behaves exactly as before: the pool stays at --threads from beginning to end.


These auxiliary Siphon.Download.exe commands are not part of the normal download flow but are handy for troubleshooting and for reprocessing already-downloaded data. Each also accepts the common options.

Fetch a single downloaded item and print its JSON — useful when diagnosing why a specific item migrated the way it did.

SIPHON_DEBUG_GET_ITEM_INPUTDIR = <path> (--inputDir)
required; the downloaded items folder.

SIPHON_DEBUG_GET_ITEM_ITEM = <guid>|<path> (--item)
required; the item to dump, as an ID ({110D559F-…}) or a path (/sitecore/content/Home).

SIPHON_DEBUG_GET_ITEM_LANGUAGE = (empty)|<string> (--language)
optional; language version to read (defaults to --defaultLanguage).

SIPHON_DEBUG_GET_ITEM_THREADS = (empty)|<int> (--threads)
Worker count (rarely relevant for a single item). Default: 4.

SIPHON_DEBUG_GET_ITEM_RETRYCOUNT = (empty)|<int> (--RetryCount)
Retry attempts for each fetch before it is recorded as unsuccessful. Default: 3.

SIPHON_DEBUG_GET_ITEM_TIMEOUT = (empty)|<int> ms (--Timeout)
Timeout for the request, in milliseconds. Default: 60000 (must be > 100).

SIPHON_DEBUG_GET_ITEM_STOPONERROR = true|false (--stopOnError)
Abort the run on the first error instead of collecting errors and continuing. Default: false.

SIPHON_DEBUG_GET_ITEM_SKIPCLEARINGFOLDERS = true|false (--skipClearingFolders)
Do not clear the output folders before writing — use it when combining several runs into one folder. Default: false.

Rebuild the item index (index.json) from the items already on disk — run it after manually adding, removing, or editing downloaded item files so later stages see a consistent index. (The media index is not rebuilt.) Also available from Siphon.Migration.exe.

SIPHON_REINDEX_INPUTDIR = <path> (--inputDir)
required; the downloaded items folder.

SIPHON_REINDEX_THREADS = (empty)|<int> (--threads)
Number of parallel reindex workers. Default: 4.

Regenerate the presentation index.json files from the cached index.html files without re-downloading them from Sitecore — useful after a layout-parser change to reprocess captured markup quickly.

--productionHost is the exception: the command requests every page from the production site again to derive the component selectors, so a re-run still costs a full crawl. Set --useCachedProductionHtml to reuse the prod.html saved beside each index.html instead and make the whole re-run offline — the fast loop when you are iterating on selector generation rather than on the capture itself.

SIPHON_REBUILD_PRESENTATION_INPUTDIR = <path> (--inputDir)
required; the downloaded items folder.

SIPHON_REBUILD_PRESENTATION_PRESENTATIONDIR = <path> (--presentationDir)
required; the folder holding the cached index.html files.

SIPHON_REBUILD_PRESENTATION_STARTPATH = <path> (--startPath)
required; the site root item.

SIPHON_REBUILD_PRESENTATION_OUTPUTDIR = (empty)|<path> (--outputDir)
where the regenerated index.json files go (defaults to --presentationDir).

SIPHON_REBUILD_PRESENTATION_PRODUCTIONHOST = (empty)|<url> (--productionHost)
production/CD host used for the component-HTML comparison.

SIPHON_REBUILD_PRESENTATION_USECACHEDPRODUCTIONHTML = true|false (--useCachedProductionHtml)
Reuse the prod.html already saved next to each index.html instead of requesting the page from --productionHost again — turns a re-run into an offline re-parse. A cached copy that is not a real page (an intermittent outage response, an empty body) is requested again anyway, so a bad capture is never frozen in; a cached sign-in wall counts as a hit, because requesting it anonymously returns the same wall every time and that page simply yields no selectors. Default: false.

SIPHON_REBUILD_PRESENTATION_ASSETHOST = (empty)|<url> (--assetHost)
asset host used to make media URLs absolute.

SIPHON_REBUILD_PRESENTATION_SKIPEXISTING = true|false (--skipExisting)
skip pages whose index.json already exists. Default: false.

SIPHON_REBUILD_PRESENTATION_THREADS = (empty)|<int> (--threads)
Number of parallel page workers. Default: 4.

SIPHON_REBUILD_PRESENTATION_RETRYCOUNT = (empty)|<int> (--RetryCount)
Retry attempts for each page before it is recorded as unsuccessful. Default: 3.

SIPHON_REBUILD_PRESENTATION_TIMEOUT = (empty)|<int> ms (--Timeout)
Timeout for each request, in milliseconds. Default: 60000 (must be > 100).

SIPHON_REBUILD_PRESENTATION_STOPONERROR = true|false (--stopOnError)
Abort the run on the first error instead of collecting errors and continuing. Default: false.

SIPHON_REBUILD_PRESENTATION_SKIPCLEARINGFOLDERS = true|false (--skipClearingFolders)
Do not clear the output folders before writing — use it when combining several runs into one folder. Default: false.


When all downloads complete, your work directory holds the raw Sitecore export:

C:\migration\ ├── items\ │ ├── _languages.json # Available languages │ ├── .folders.json # The --itemFolders rule set this export was written with │ └── {folder}\ # content | media | core | other — see --itemFolders │ └── {language}\ │ ├── {0-f}\ │ | └── {0-f}\ │ | └── {item-id}.json # Individual items │ ├── _index.json # This folder's index, for this language │ └── _map.json # Path → id lookup for the same ├── media\ │ └── ...Binary media files └── presentation\ ├── test-results # For azure devops reporting tool └── {language}\ ├── {first-level-children}\ │ ├── {second-level-children}\ │ │ ├── .... │ │ ├── index.html # page raw output via Experience Editor │ │ ├── index.json # page structure parsed from index.html │ │ └── prod.html # page raw output from production website │ ├── index.html │ ├── index.json │ └── prod.html ├── index.html ├── index.json └── prod.html

Each item folder keeps its own index, so the commands that write different trees no longer contend over one file — see --itemFolders for the rules, and for how to read or convert an export that predates the split.

An export downloaded before --itemFolders existed has no {folder} level — items sit directly under items\{language}\ — and is still read exactly as it was. Nothing needs converting.