Resume Designer 1.15.0
✨ New features
Profiles
- Move profile switching into Settings → Account with stats
- Move the profile switcher beside the brand as an avatar chip
- Manage-profiles dialog with export, import, and guards
- Header profile switcher with reload-based switching
- Per-profile export and import-as-new-profile
- Multi-profile backup format 2 and scoped legacy restore
- Share the openrouter api key across profiles
- Crash-safe adoption migration and boot wiring
- Registry crud with delete guards
- Namespace per-profile keys at the appStorage facade
- Add pure profile key classification module
Library
- Phase 2 polish - resize-aware preview, backdated adds, scoped empty states
- Timeline view with per-resume lanes
- Timeline tab with outcome stats strip
- Application stats and timeline helpers
- Live first-page preview in detail pane
- Detail pane with application tracking and variant actions
- Add library dialog with tiered search and status chips
- Add tiered library search module
- Auto-draft applications when tailoring
- Add applications store with status pipeline
Bridge
- Pairing token section in settings data tab
- Headless per-variant pdf export endpoint
- Wire loopback requests through the js router
- Pure request router with auth and all v1 endpoints
- Context-free ai completion entry point
- Include learned answers and bridge token in backups
- Learned-answers store for application q&a
- Start loopback listener and register bridge_respond
- Add loopback bridge state, respond command, and request forwarding
Updates & Changelog
- Split digest summary from full log in release bodies
- Synthesize a user-level digest with grouped-log fallback
- Sentinel-based digest validator for release notes
Canvas
- Actionable empty state when no resume is loaded
Settings
- Distinguish current profile and keep profile list compact
🐛 Fixes
Profiles
- Refuse profile ops while a backup restore is guarded
- Roll back partial adoption copies on a browser quota failure
- Treat markerless degraded init as adoption pending
- Keep the blob credential until the shared write is durable
- Flush an imported profile and roll back if it isn't durable
- Block switching/creating profiles during adoption recovery
- Surface profile-dialog save failures to switch/export callers
- Abort a profile switch when the pre-switch save fails
- Give the adoption marker a resume- prefix so disk adoption keeps it
- Validate/coerce registry emoji so a bad one can't blank the app
- Activate mapping only after sources are durably deleted
- Never delete adoption sources while mapping is off
- Roll back a profile import that fails mid-write
- Keep print mapping off during pending adoption
- Flush pending edits before exporting the active profile
- Hide the switcher while an adoption is mid-recovery
- Include unprefixed live data in a recovery-state profile export
- Keep mapping inactive when adoption doesn't complete
- Move adoption keys one at a time to avoid doubling storage
- Don't recopy a stale source over post-adoption edits
- Use a filename-safe separator for namespaced storage keys
- Throw synchronously for unknown export profile ids
- Gate adoption finalization on every durability barrier
- Durable adoption barriers and existence-checked key extraction
- Reject corrupt registries whole and re-roll id collisions
Backup
- Resume saves only if this import acquired the suspension
- Only resume saves if this import suspended them
- Resume saves after a failed flush only on the merge path
- Re-enable saves when the post-import flush fails
- Suspend saves before the durable import, not after
- Suspend saves before a restore reload to prevent stale overwrite
- Avoid prototype-name collisions in the profile map
- Reject case-colliding registry ids before a format-2 restore
- Reject unknown shared keys before a format-2 restore
- Capture markerless recovery data in full backups
- Roll back cached imports when the durability flush fails
- Reconcile orphan namespaces into the exported registry
- Reject orphan profiles entries before a format-2 restore
- Roll back a quota-failed import instead of losing the store
- Capture unprefixed live data in a recovery-state export
- Reject a non-object shared container before the format-2 wipe
- Validate shared values before the format-2 wipe
- Accept keyless profiles in format-2 restores
- Validate profile entries before wipe and restore quota-safely
Library
- Persist notes on every edit so they survive a native close
- Flush pending note edits on teardown
- Persist application notes during editing, not only on blur
- Clear appliedAt when reverting an application to prepared
- Caption and status legend for the timeline view
- Show tab panels only while active so hidden panes free their space
- Honest backdated history and guarded timeline jumps
- Anchor view-all item in variant dropdown
- Cancel dialog escape-close while renaming via onEscapeKeyDown
- Keep dialog open when escape cancels a rename
- Reset rename on escape and pin tailor variant id
- Route library variant deletes through thread handling
- Include applications store in full backup
Profile
- Track a failed markdown import on the tracked-save flag
- Make renames durable and surface rename failures
- Make deletion durable before reporting success
- Abort the switch reload when the pointer is not durable
- Retry a failed debounced save when flushing
Bridge
- Reject writes while a destructive import is in flight
- Polish — init rejection guard, clipboard catch, aria-label, unicode test, comments
- 404 prototype-key resume ids instead of resolving inherited keys
- Mirror applications.js storage-error handling in learned answers
Settings
- Refresh the header avatar after renaming the active profile
- Surface a quota failure from profile creation
- Cleared shared api key masks stale blob values
Storage
- Drop unreachable passthrough branch in flushDeferredWrites
- Central appStorage guard for backup restores
- Cancel the coalescing drain timer when a flush forces a drain
Updates & Changelog
- Require every post-heading digest line to be a bullet
- Degrade malformed release bodies atomically
- Reject inline sentinels and bare section headers in digests
Job Descriptions
- Skip tailor drafts when the pinned résumé was deleted mid-generation
- Keep tailored changes on the resume they were generated for
Migration
- Skip legacy import when physical namespaces survive
- Skip legacy electron import on profiled stores
Onboarding
- Make dismissing the wizard durable for empty profiles
- Let a new empty profile's onboarding be dismissed
Updates
- Gate release-notes dialog on scheduled onboarding too
- Defer release-notes dialog until onboarding closes
Ci
- Emit the validated normalized digest, not the raw lines
General
- Close cross-feature seams from the whole-branch review
PDF Export
- Hold the export guard across the interactive preview lifecycle
Persistence
- Keep the blob credential fallback on every settings save
Security
- Generate profile and thread ids with crypto.getRandomValues
⚡ Improvements
Storage
- Coalesce write-behind drains instead of one per keystroke