Game Files | Electric Cherry
{#snippet actions()}{#if canManage}{/if}{/snippet} {#if error}{/if} {#if notice}

{notice}

{/if} {#if !canManage}

Administrators publish game files. Active hosts prepare verified copies automatically.

{/if} {#if canManage && showUpload}

{uploadId ? phase === 'published' ? 'Version published' : 'Continue folder upload' : 'Upload a game folder'}

Select your complete T5 or T6 game folder, including its installed DLC. The files upload directly to this controller; a game host is only needed when you are ready to run servers.

{#if uploadError}{/if}
{#if phase !== 'verifying' && phase !== 'published'}

{uploadId ? 'To resume, file names, sizes, and modification dates must match the original upload.' : 'Choose the game directory itself. Its top-level folder name is removed once; all files and subfolders inside it keep their paths.'}

{/if} {#if folder}
{folder.name}{folder.files.length.toLocaleString()} files · {formatGameBytes(folder.size)}
Preview folder paths
    {#each folder.files.slice(0, 8) as file}
  • {file.path}
  • {/each}
{#if folder.files.length > 8}

And {(folder.files.length - 8).toLocaleString()} more files.

{/if}
{/if} {#if phase !== 'idle'}
{phase === 'preparing' ? 'Preparing upload…' : phase === 'uploading' ? 'Uploading game files' : phase === 'verifying' ? 'Verifying and publishing…' : phase === 'published' ? 'Published · host downloads are automatic' : 'Upload paused'}{completedFiles.toLocaleString()} / {totalFiles.toLocaleString()} files

{formatGameBytes(progressBytes)} / {formatGameBytes(totalBytes)} saved or transferring

{#if currentPath}

{currentPath}

{/if} {#if phase === 'verifying'}

The controller checks every file and publishes this version when verification finishes. Verification continues if you leave this page.

{:else if phase === 'paused'}

Saved chunks are kept on the controller. Resume this upload to check the saved progress and retry.

{/if}
{/if}
{#if transferring} {:else if phase !== 'verifying' && phase !== 'published'}{/if} {#if phase === 'idle' || phase === 'uploading'}Keep this page open while files transfer. Interrupted uploads can be resumed below.{/if}
{/if}
{libraries.length} libraries · Game folders and runtime images are versioned separately.
{#each matching as library (library.id)} {@const latestPublished = library.versions.find(item => item.state === 'ready')}

{library.name}

{library.game.toUpperCase()} · {library.description}

{#if canManage}{/if}
{#each library.versions as item (item.id)} {@const browserUpload = !item.sourceHostId}

{item.version}

{item.state === 'ready' ? 'Published' : item.state === 'importing' ? browserUpload ? item.id === uploadId && phase === 'verifying' ? 'Verifying' : 'Uploading' : 'Importing' : 'Failed'}

{formatGameBytes(item.sizeBytes)} · {item.fileCount.toLocaleString()} files · Created {new Date(item.createdAt).toLocaleString()}

{#if item.error}

{item.error}

{/if}
Version details
Immutable version ID
{item.id}
Manifest SHA256
{item.manifestSha256 ?? 'Available after verification'}
Uploaded from
{browserUpload ? 'Game folder in browser' : `${hostName(item.sourceHostId)} / ${item.sourceVolume}`}
{#if item.state === 'ready'}View complete file manifest{/if}
{#if item.state === 'ready'} {#if item.id === latestPublished?.id}

This is the latest published version. Active hosts download and verify it automatically, including hosts enrolled later. Running servers keep their selected version.

{:else}

This older version remains available to servers pinned to it. Use the advanced download control to prepare it on another host.

{/if} {#if !hosts.length}

Files are published. Add a host to prepare them automatically.

{/if}
{#each item.caches as cache} {@const cacheHost = hosts.find(host => host.id === cache.hostId)} {@const awaitingAutomaticDownload = item.id === latestPublished?.id && cache.status === 'missing'} {:else}{/each}
HostCache stateProgressDetail
{hostName(cache.hostId)} {awaitingAutomaticDownload ? 'Waiting' : cache.status}{!cacheHost?.connected ? ' · offline' : ''} {#if cache.status === 'downloading' || cache.status === 'verifying'}{formatGameBytes(cache.bytesDownloaded)} / {formatGameBytes(cache.bytesTotal)}{:else if cache.status === 'ready' || cache.status === 'outdated'}Verified{cache.status === 'outdated' ? ' · older version' : ''}{:else}—{/if} {cache.error ?? (awaitingAutomaticDownload ? automaticDownloadDetail(cacheHost) : '')}{#if awaitingAutomaticDownload || cache.status === 'failed'} View host setup{/if}
No host copies yet.
{#if canManage}
Advanced: download or verify this version

Prepare an older version or retry a download now. Latest versions are prepared automatically.

{/if} {:else if browserUpload}

Resume with the original unchanged folder. Once published, this version is prepared automatically on active hosts.

{#if canManage}
{/if} {:else if item.state === 'importing'}

The existing host import continues independently. It is reconciled when the host reconnects.

{/if}
{/each}
{:else}{#if loaded}{:else}

Loading game libraries…

{/if}{/each}