Every feature of Generation History — explained
The History panel is not just a list of past audio files. It is a full production record for every generation — with playback, metadata, re-download, credit tracking, and archive management built in. Here is every feature in detail.
🗂
15-day generation archive
Every TTS generation you produce is automatically saved to your Levizr account history and retained for 15 days. You do not need to manually save anything — the moment a generation completes successfully, it is added to your history. This gives you a rolling two-week window to revisit, re-download, or review any audio you have produced.
The 15-day window applies from the timestamp of each individual generation, not from the start of a session or billing period. Generations expire on a rolling basis — older entries drop off automatically as they cross the 15-day threshold.
⬇
Re-download any generation without spending credits
Every generation stored in your history includes a Download MP3 button that re-fetches the audio from the Levizr CDN and saves it to your device. Re-downloading from history does not deduct any credits — the generation was already paid for. This means you never lose a file just because you forgot to download it after the initial generation.
The download uses the same forced-download CDN method as the main Studio — files are served with a content-disposition header that triggers a native browser save prompt. Auto-naming follows the format: levizr-[voicename]-[generationid].mp3.
▶
In-history audio playback
You can listen to any generation directly inside the History panel without downloading it first. Each history card has a play/pause button that streams the audio from the CDN. Only one track plays at a time — starting a new track automatically pauses the current one. The player stops cleanly when you close the History panel.
The play button is styled with the unique color associated with the voice model used for that generation. For example, generations made with Kore appear with a mint green play button, while Fenrir generations use amber. This makes it easy to visually identify which voice a track was produced with at a glance.
🎨
Voice-color coded cards
Each history card is visually tagged with a unique color associated with the voice model used for that generation. The play button, chip labels, and card accents all inherit the voice color — making it immediately obvious which voice produced which audio without reading any text. This is especially useful when you are producing multiple pieces with different voices in the same session.
Voice colors include: Kore — mint green, Puck — sky blue, Charon — rose pink, Fenrir — amber, Aoede — soft violet. All other voices default to an indigo accent.
📋
Expandable generation cards with full metadata
Each history card starts in a collapsed view showing the script preview, voice chip, file size, credits deducted, and generation date. Clicking any card expands it to reveal the full metadata: the complete script text (not truncated), the system prompt used, voice model, audio format, and file size in a structured stats grid.
The expansion animation is smooth and uses spring physics — it does not cause jarring layout shifts in the surrounding cards. The expanded state persists as you scroll through the history list, so you can compare multiple expanded cards at once if needed.
📝
System prompt viewer with one-click copy
When you expand a generation card, the system prompt used for that generation is displayed in a scrollable text block inside the card. Clicking anywhere on the prompt block copies it to your clipboard. A toast notification confirms the copy. This makes it easy to retrieve and reuse a system prompt that produced a result you liked — without searching through your notes or browser history.
The prompt copy feature uses the navigator.clipboard API with a graceful fallback. If the clipboard API is unavailable (e.g., non-HTTPS environments), the copy silently fails without throwing a visible error. The copied text is the raw prompt string exactly as it was submitted to the neural model.
🪙
Per-generation credit tracking
Each history card displays the exact number of credits deducted for that generation as a chip label. This gives you a granular record of how your credits were used across different scripts, voices, and system prompt configurations — useful for understanding which types of content are most credit-efficient and for auditing your usage over the 15-day window.
Credits shown represent the total deducted for that specific generation request, including any system prompt surcharge. The value displayed is the same figure recorded server-side at the time of the API call.
💾
File size display per generation
Every history entry shows the file size of the generated MP3 in a human-readable format — bytes, KB, or MB depending on the file's size. Longer scripts with richer emotion tags and system prompt instructions tend to produce larger files. This stat helps you understand the relationship between script complexity and output file size, and gives you a rough sense of storage usage before downloading.
File size is stored server-side at the time of generation and retrieved directly from the database — it is not calculated client-side by inspecting the downloaded blob. The formatting follows standard binary conventions: 1 KB = 1,024 bytes, 1 MB = 1,024 KB.
∞
Cursor-based infinite scroll with 15 records per page
The History panel loads your 15 most recent generations on first open and automatically fetches the next page as you scroll toward the bottom. This is powered by an Intersection Observer — there is no "Load More" button to click. The panel uses cursor-based pagination rather than offset pagination, which means the list remains stable and consistent even as new generations are added while you browse.
Cursor-based pagination tracks position using an opaque server-side cursor rather than a page number. This prevents duplicate entries and missing records that can occur with offset pagination when items are added or deleted during a browsing session.
🗑
Safe delete with confirmation modal
Deleting a generation from history requires a two-step confirmation. Clicking the trash icon on a card opens a focused confirmation modal with a clear warning that the deletion is permanent. The modal uses a backdrop blur overlay that locks focus to the confirmation action. A loading state during the delete request prevents double-clicks and gives visual feedback that the operation is in progress.
Deleted generations are removed optimistically from the local list immediately after the API call succeeds — you do not need to wait for a page refresh. The total generation count in the header also updates immediately. If the delete API call fails, the error is caught and the item remains in the list.
📊
Total generation count display
The History panel header shows the total number of generations in your 15-day archive as a running count — for example "47 syntheses". This count updates live when you delete entries. The count is fetched from the API on each panel open and reflects your true server-side record count, not just the number of cards currently loaded in the local scroll list.
The count label uses correct singular/plural grammar — "1 synthesis" versus "2 syntheses". While the panel is loading, the header shows "Loading records..." to prevent a flash of a stale or zero count.
⌨
Keyboard shortcut to close — Escape key
The History panel listens for the Escape key while it is open. Pressing Escape at any time closes the panel cleanly — stopping any currently playing audio and unmounting the panel from the DOM. This follows standard modal UX conventions and makes keyboard-driven workflows faster for power users who prefer not to reach for the close button.
The keydown event listener is added when the panel opens and removed when it closes, so it does not persist and interfere with other keyboard interactions on the page. Audio playback is explicitly stopped before the panel exit animation begins.