Wrenn — Templates { if (e.key === 'Escape') { if (openDropdownName) { openDropdownName = null; return; } if (deleting || launching) return; deleteTarget = null; launchTarget = null; } }} onclick={(e) => { if (openDropdownName && !(e.target as Element)?.closest('.split-btn-container')) { openDropdownName = null; } }} />

Templates

Snapshots capture a running capsule's state. Base images are the starting point for every new capsule. Launch from either.

{#if pageTab === 'snapshots'}
{#if error}
{error}. Try refreshing the page.
{/if} {#if loading}
{#each Array(3) as _, i}
{/each}
Name
Type
vCPUs
Memory
Size
Created
Actions
{#each Array(4) as _, i}
{/each}
{:else}
{#each ([['all', 'All', ''], ['snapshot', 'Snapshots', 'var(--color-accent)'], ['base', 'Images', 'var(--color-blue)']] as const) as [val, label, color]} {/each}
{filteredSnapshots.length} {typeFilter === 'snapshot' ? filteredSnapshots.length === 1 ? 'snapshot' : 'snapshots' : typeFilter === 'base' ? filteredSnapshots.length === 1 ? 'image' : 'images' : filteredSnapshots.length === 1 ? 'item' : 'total'}
{#if filteredSnapshots.length === 0}

{emptyHeading(typeFilter)}

{emptyDescription(typeFilter)}

{#if typeFilter === 'all' || typeFilter === 'snapshot'} Go to Capsules {/if}
{:else}
Name
Type
vCPUs
Memory
Size
Created
Actions
{#each filteredSnapshots as snapshot, i (snapshot.name)} {@const isSnapshot = snapshot.type === 'snapshot'} {@const typeColor = isSnapshot ? 'var(--color-accent)' : 'var(--color-blue)'}
{snapshot.name}
{#if isSnapshot} Snapshot {:else} Image {/if}
{#if snapshot.type === 'snapshot' && snapshot.vcpus != null} {snapshot.vcpus} {:else} {/if}
{#if snapshot.type === 'snapshot' && snapshot.memory_mb != null} {snapshot.memory_mb} MB {:else} {/if}
{formatBytes(snapshot.size_bytes)}
{timeAgo(snapshot.created_at)}
{/each}

{filteredSnapshots.length} {typeFilter === 'snapshot' ? filteredSnapshots.length === 1 ? 'snapshot' : 'snapshots' : typeFilter === 'base' ? filteredSnapshots.length === 1 ? 'image' : 'images' : filteredSnapshots.length === 1 ? 'item' : 'total'} {typeFilter !== 'all' ? '· filtered' : '· total'}

{/if} {/if}
{/if}
All systems operational
{#if openDropdownName} {@const dropdownSnapshot = snapshots.find((s) => s.name === openDropdownName)} {#if dropdownSnapshot}
{#if !dropdownSnapshot.platform} {/if}
{/if} {/if} {#if deleteTarget}
{ if (!deleting) deleteTarget = null; }} onkeydown={(e) => { if (e.key === 'Escape' && !deleting) deleteTarget = null; }} >

Delete snapshot

Permanently delete {deleteTarget.name}. Running capsules won't be affected, but you won't be able to launch new ones from it.

{#if deleteTarget.type === 'snapshot'}

This snapshot includes memory state. Paused capsules that depend on it won't be able to resume.

{/if} {#if deleteError}
{deleteError}
{/if}
{/if} {#if launchTarget}
{ if (!launching) launchTarget = null; }} onkeydown={(e) => { if (e.key === 'Escape' && !launching) launchTarget = null; }} >

Launch Capsule

Configure resources and launch a new capsule from this snapshot.

{#if launchError}
{launchError}
{/if}
{#if launchTarget.type === 'snapshot'} {:else} {/if} {launchTarget.name} {launchTarget.type === 'snapshot' ? 'Snapshot' : 'Image'}
{#if launchTarget.type === 'snapshot'}
{launchTarget.vcpus ?? 1}
{:else} {/if}
{#if launchTarget.type === 'snapshot'}
{launchTarget.memory_mb ?? 512}
{:else} {/if}

Seconds of inactivity before the capsule pauses. Set to 0 to keep it running indefinitely.

{/if}