Skip to content

F8.2 — OS file-handler registration for .pf / .aseprite #123

Description

@Flow-Fly

Parent: F8 (PWA). Depends on F8.1 (installed PWA is a prerequisite for file handling).

Owner decision — 2026-07-09: .pf is the canonical full-fidelity Pixel Forge project-file extension. Project save/download flows should choose .pf automatically rather than exposing the underlying JSON representation. A .pf file carries the complete project state, including text, references, animation, palette, and other project data.

Recipe

  1. Manifest file_handlers (via the vite-plugin-pwa manifest config):
    "file_handlers": [{
      "action": "/",
      "accept": {
        "application/x-pixelforge": [".pf"],
        "application/x-aseprite": [".aseprite", ".ase"]
      }
    }]
    Update the project save/download path in src/services/file-service.ts to use .pf automatically. Keep the existing versioned ProjectFile serialization inside the file; .pf is the product-facing identity, not a partial export.
  2. Launch queue consumer (app startup, src/main.ts or app root component): window.launchQueue?.setConsumer(...) → read FileSystemFileHandles → route .pf through the existing project-load path (projectStore.loadProject via file-service.ts) and .aseprite/.ase through src/services/aseprite-service.ts import. With F1 landed, imported files become new library projects (never silently overwrite the current one).
  3. Graceful degradation: File Handling API is Chromium-only — feature-detect; no errors on Firefox/Safari.
  4. Drag-and-drop parity: while here, verify dropping a .pf/.aseprite file onto the window goes through the same code path (single load entry point).
  5. Test: unit-test the launch-queue consumer with a mocked handle; manual OS-level test documented in the PR (install → double-click file → opens loaded).

Acceptance

  • Project save/download produces a full-fidelity .pf file by default.
  • On an installed PWA (Chromium), OS double-click on .pf/.aseprite opens the app with that file loaded as a project.
  • Non-supporting browsers unaffected.

Metadata

Metadata

Assignees

No one assigned

    Labels

    agentic-loopTracked by the reusable agentic loop workflowenhancementNew feature or requestneeds-humanNeeds a human decision, approval, review, or playtest before agent work proceedsnot-ready-for-agentQueued or blocked; not currently safe for autonomous implementationrisk:mediumMedium-risk work touching shared behavior, architecture, or broader design

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions