Skip to content

Project library: per-project OPFS working copies with the side-panel management UI #456

Description

@maboa

The side panel returns as a project library over OPFS — the management UX of the former Recents (last-edited list, Starred section, kebab rename/duplicate/delete, current-project highlight) rebuilt against the .hyperaudio project model instead of localStorage. Successor to #434/#435/#440's UX after #451's deletion; pulls the per-project working-copy architecture forward from the Phase B umbrella (#452).

Model

  • Every project (transcription, import, opened .hyperaudio) lives in work/<projectId>/ — the single-file snapshot (Save integrity: delegated edit tracking, generation guards, transactional open (#403 Phase A) #448) plus media, with a small library index (name, starred, timestamps, media meta) maintained alongside.
  • The side panel lists the library: last-edited order with created-date fallback, Starred pinned above, current project highlighted, kebab actions (rename = the project title Save uses; duplicate = new id sharing nothing or copying media; delete with confirm — removes the directory).
  • Switching projects asks nothing and loses nothing: the outgoing project's pending autosave flushes to its own directory. The discard-on-switch dialogs existed only because there was one work slot; they go.
  • Save keeps its meaning: the .hyperaudio download is the durable, portable copy. The dirty dot and quit guard become per-project ("changes not yet saved to a file" tracked per project via its own lastDownloadAt).
  • The Second-tab guard: one Web Lock, read-only banner (#403 Phase A) #450 Web Lock becomes per-project (hyperaudio:project:<id>): two tabs can edit different projects; the same project in a second tab gets the guarded banner. The origin-global lock remains for index writes.
  • Identity is OPFS-native (generated ids) — none of the file↔workdir matching hazards; re-opening the same .hyperaudio twice simply creates a second library entry.

Notes

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestuxImproves the user experience

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions