Migration Assistant

Queue migration of heartbeats and API keys from legacy Hackatime.

{#if !migration.enabled}

Hackatime v1 import is currently disabled due to an integration issue. We're working on reinstating imports!

{/if} {#if migration.jobs.length > 0}
{#each migration.jobs as job}
Job {job.id}: {job.status}
{/each}
{/if}
{#if ui.show_imports_and_mirrors}

Import from WakaTime

{#if importSource}

Status: {importSource.status}

Last synced: {importSource.last_synced_ago || "Never"}

Imported: {importSource.imported_count.toLocaleString()}

{#if importSource.last_error_message}

Last error: {importSource.last_error_message}

{/if}
{/if}
{#if importSource} {/if}
{#if importSource}

Leave blank to keep the existing key.

{/if}

Backfill scope

{#if backfillMode === "all_time"} {:else}
{/if}
{#if importSource} {/if}
{#if importSource}
{ if (!window.confirm("Remove import source configuration?")) { event.preventDefault(); } }} >
{/if}

Mirror to WakaTime

{#if mirrors.length > 0}
{#each mirrors as mirror}

{mirror.endpoint_url}

Status: {mirror.enabled ? "enabled" : "paused"}

Last synced: {mirror.last_synced_ago}

{#if mirror.last_error_message}

Last error: {mirror.last_error_message}

{/if} {#if mirror.consecutive_failures && mirror.consecutive_failures > 0}

Consecutive failures: {mirror.consecutive_failures}

{/if}
{ if (!window.confirm("Delete this mirror endpoint?")) { event.preventDefault(); } }} >
{/each}
{/if}
{/if}

Download Data

{#if data_export.is_restricted}

Data export is currently restricted for this account.

{:else}

Download your coding history as JSON for backups or analysis.

Total heartbeats

{data_export.total_heartbeats}

Total coding time

{data_export.total_coding_time}

Last 7 days

{data_export.heartbeats_last_7_days}

Exports are generated in the background and emailed to you.

{#snippet children({ processing })} {/snippet}
{#snippet children({ processing })} {/snippet}
{#if ui.show_dev_import}
{ const target = event.currentTarget as HTMLInputElement; selectedFile = target.files?.[0] ?? null; }} class="w-full rounded-md border border-surface-200 bg-surface px-3 py-2 text-sm text-surface-content disabled:cursor-not-allowed disabled:opacity-60" /> {#if submitError}

{submitError}

{/if} {#if importState !== "idle"}

Status: {importState}

{Math.round($tweenedProgress)}%

{formatCount(processedCount)} / {formatCount(totalCount)} processed

{#if importMessage}

{importMessage}

{/if} {#if importState === "completed"}

Imported: {formatCount(importedCount)}. Skipped {formatCount( skippedCount, )} duplicates and {errorsCount.toLocaleString()} errors

{/if}
{/if}
{/if} {/if}

Account Deletion

{#if user.can_request_deletion}

Request permanent deletion. The account enters a waiting period before final removal.

{ if ( !window.confirm( "Submit account deletion request? This action starts the deletion process.", ) ) { event.preventDefault(); } }} >
{:else}

Deletion request is unavailable for this account right now.

{/if}