Settings - TypstDrive
{#if activeSection === 'account'}

Account Settings

{$userStore?.username?.[0]?.toUpperCase() || '?'}

{$userStore?.username}

{$userStore?.email}

{#if $userStore?.is_admin} Administrator {/if}

Profile

{#if profileError}
{profileError}
{/if} {#if profileSuccess}
Profile updated successfully.
{/if}

Change Password

{#if passwordError}
{passwordError}
{/if} {#if passwordSuccess}
Password changed successfully.
{/if}
{/if} {#if activeSection === 'theme'}

Theme Settings

Customize the appearance of your editor and dashboard. These settings are saved to your browser.

{/if} {#if activeSection === 'storage'}

Storage

Total space used {storageStats ? formatBytes(storageStats.total_size_bytes) : 'Loading...'}

Documents

{storageStats ? formatBytes(storageStats.documents_size_bytes) : '...'}

Images & assets

{storageStats ? formatBytes(storageStats.files_size_bytes) : '...'}

{/if} {#if activeSection === 'api-keys'}

API Keys

Use API keys to render Typst documents programmatically via POST /v1/render. Each key allows up to 60 requests/minute. View API docs →

Requests — {usagePeriod === '1hr' ? 'Last 60 Min' : usagePeriod === '1day' ? 'Last 24 Hours' : 'Last 7 Days'} {#if usageData.length > 0} ({usageData.reduce((s, p) => s + p.count, 0)} total) {/if}

{#each ([['1hr', '1 hr'], ['1day', '1 day'], ['1week', '1 week']] as const) as [val, label]} {/each}
{#if usageLoading}
Loading...
{:else if usageData.length === 0}
No usage yet — make your first API call to see data here.
{:else} {/if}
{#if newlyCreatedKey}

Key created: {newlyCreatedKey.name}

Copy this key now — it will not be shown again.

{newlyCreatedKey.key}
{/if} {#if showCreateKeyForm}

Create API Key

{#if createKeyError}
{createKeyError}
{/if}
{/if} {#if apiKeysError}
{apiKeysError}
{/if} {#if apiKeysLoading}
Loading keys...
{:else if apiKeys.length === 0}

No API keys yet. Create one to get started.

{:else}
{#each apiKeys as key (key.id)}

{key.name}

{key.key_prefix}... · {key.rate_limit}/min

{#if confirmRegenerateId === key.id}
Regenerate?
{:else if confirmDeleteKeyId === key.id}
Delete?
{:else} {/if}
{/each}
{/if}
{/if} {#if activeSection === 'devices'}

Devices

Typst Desktop apps signed in to your account. A device stays connected while it is running with live sync; revoke a device to sign it out immediately.

{#if devicesError}
{devicesError}
{/if} {#if devicesLoading}
Loading devices...
{:else if devices.length === 0}

No devices signed in yet.

{:else}
{#each devices as device (device.id)}

{device.name} {#if device.connected} Connected {/if}

{device.last_used_at ? `Last used ${formatDate(device.last_used_at)}` : 'Never used'}

{#if confirmRevokeDeviceId === device.id}
Revoke?
{:else} {/if}
{/each}
{/if}
{/if} {#if activeSection === 'admin' && $userStore?.is_admin}

User Management

{adminUsers.length} user{adminUsers.length !== 1 ? 's' : ''}
{#if showCreateForm}

Create New User

{#if createError}
{createError}
{/if}
{/if} {#if adminError}
{adminError}
{/if} {#if adminLoading}
Loading users...
{:else}
{#each adminUsers as user (user.id)}
{user.username[0].toUpperCase()}

{user.username}

{#if user.is_admin} Admin {/if} {#if user.id === $userStore?.id} You {/if}

{user.email}

{#if user.id !== $userStore?.id} {#if confirmDeleteId === user.id}
Delete?
{:else} {/if} {/if}
{/each}
{/if}
{/if}