Browser/email sign-in stores a session token that covers credits + library sync, but Palette v2 generation/upload only accepts real dp_ keys — so a freshly signed-in user hits PALETTE_API_KEY_REQUIRED on their first generate (guard: backend/handlers/image_generation_handler.py:342). Today the unblock is manually pasting a key.
Desktop-side ask: after browser sign-in succeeds, detect the missing dp_ key and show a first-class "one more step" panel (link to directorspal.com/settings/api-keys + paste field) instead of failing per-job.
Palette-side dependency (Switchboard): POST /api/v1/keys is admin-only — either allow self-service key creation for signed-in users, or accept session bearers on v2 generation routes. Until one of those lands, browser sign-in alone cannot generate.
Browser/email sign-in stores a session token that covers credits + library sync, but Palette v2 generation/upload only accepts real dp_ keys — so a freshly signed-in user hits PALETTE_API_KEY_REQUIRED on their first generate (guard: backend/handlers/image_generation_handler.py:342). Today the unblock is manually pasting a key.
Desktop-side ask: after browser sign-in succeeds, detect the missing dp_ key and show a first-class "one more step" panel (link to directorspal.com/settings/api-keys + paste field) instead of failing per-job.
Palette-side dependency (Switchboard): POST /api/v1/keys is admin-only — either allow self-service key creation for signed-in users, or accept session bearers on v2 generation routes. Until one of those lands, browser sign-in alone cannot generate.