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}
{#if snapshots.length === 0}

{emptyHeading(typeFilter)}

{emptyDescription(typeFilter)}

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

{total} {typeFilter === 'snapshot' ? total === 1 ? 'snapshot' : 'snapshots' : typeFilter === 'base' ? total === 1 ? 'image' : 'images' : total === 1 ? 'template' : 'templates'} {search.trim() ? '· matching' : typeFilter !== 'all' ? '· filtered' : '· visible'}

{#if totalPages > 1}
{page} / {totalPages}
{/if}
{/if} {/if}
{/if}
{#if openDropdownName} {@const dropdownSnapshot = snapshots.find((s) => s.name === openDropdownName)} {#if dropdownSnapshot}
{/if} {/if} {#if deleteTarget}

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 renameTarget}

Rename template

Rename {renameTarget.name}.

{#if renameTarget.public}

This template is published. Renaming unpublishes it — other teams' references stop working and you'll need to publish it again.

{/if}
{ if (e.key === 'Enter' && !renaming) handleRename(); }} class="w-full rounded-[var(--radius-input)] border border-[var(--color-border)] bg-[var(--color-bg-1)] px-3 py-2 font-mono text-ui text-[var(--color-text-primary)] outline-none transition-colors duration-150 focus:border-[var(--color-border-mid)]" />

Letters, digits, dot, dash, underscore. Max 64 characters.

{#if renameError}
{renameError}
{/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 template.

{#if launchError}
{launchError}
{/if}
Template
{#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 ?? 2048}
{:else} {/if}

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

{/if}