Photoshop
Install the ArtInStack UXP plugin, Device Code Connect, pick a portfolio, and publish the active document from Adobe Photoshop.
This is the integration how-to for the official Photoshop UXP Plugin. API reference: OAuth, Media, Portfolios.
Prerequisites
- Adobe Photoshop 23+ (UXP)
- Creative Cloud Desktop (to install the
.ccx) - ArtInStack account with at least one portfolio created in the dashboard
.ccxfrom Software
Install
- Download
ArtInStack-Photoshop-latest.ccxfrom Software - Double-click the
.ccx(or open it with Creative Cloud Desktop) to install into Photoshop - Restart Photoshop if the panel does not appear
- Open Plugins → ArtInStack
Private beta / development: load manifest.json with UXP Developer Tools instead of the .ccx.
Connect (Device Code)
Photoshop UXP cannot bind a loopback HTTP listener, so the plugin uses OAuth 2.0 Device Authorization Grant (not Authorization Code + PKCE).
- In the ArtInStack panel, click Connect
- The plugin requests a device code and opens
/oauth/devicein your browser - Sign in if prompted, enter the user code shown in the panel (if asked), then approve scopes
- The plugin polls
/api/oauth/tokenuntil approved, then stores access + refresh tokens - Connected apps in Settings → Developer lists ArtInStack Photoshop after consent
Pick a portfolio
- After Connect, the panel loads
GET /api/v1/portfolios - Choose the portfolio for this publish
- Create portfolios in the ArtInStack dashboard. The plugin does not create them
Publish
- Open the document you want to publish (the master)
- Adjust Export settings in the panel if needed (defaults match Lightroom / Capture One web sizing)
- Click Publish active document. The plugin prepares a JPEG and uploads via
POST /api/v1/mediawithIdempotency-Keyandportfolio_id - On success, the photo appears in the dashboard portfolio; the panel log shows
media_id
Supported API types (JPEG, PNG, GIF, WebP, TIFF) are listed on Media. The panel publishes JPEG only today.
Export settings (v0.1.1+)
| Setting | Default | Notes |
|---|---|---|
| Resize | On — 2048 px | Longer side (alternatives: shorter side, width, height, custom px) |
| Convert to sRGB | On | Web/portfolio color |
| Embed profile | On | With sRGB convert |
| Duplicate image | On | Work on a copy; master is never modified |
| Convert to 8-bit | On | JPEG path |
| Sharpening | Light | Light or Screen Smart Sharpen on a stamped layer; None to skip |
| JPEG quality | High (~10) | UXP scale 1–12 |
What happens when you publish (Duplicate on)
- Photoshop duplicates the active document and runs export steps on the copy only (8-bit, sRGB, resize, merge visible, optional sharpen stamp)
- The plugin writes
{document-basename}-copy.jpgand uploads it - The processed copy stays open so you can inspect layers, tweak sharpen opacity in the Layers panel (
ArtInStack sharpen), or Save As locally - The copy opens at 100% zoom, or Fit on Screen when the canvas is larger than the view
- Publish again while that copy is still frontmost → re-upload only (no second duplicate). Activate the master to prepare a fresh copy or change export settings
Upload title uses the document name; multipart filename uses {basename}-copy.jpg (e.g. Tiger-Edit-copy.jpg). Masters whose names already contain copy get an extra -copy suffix on export — that is expected.
Troubleshooting
| Symptom | Check |
|---|---|
| Connect stalls / denied | Complete consent on /oauth/device; Device Grant enabled for the Photoshop OAuth client |
| Empty portfolio list | portfolios:read granted; portfolio exists in same workspace as consent; Connect completed |
| Upload 403 | Missing media:write or portfolios:write |
| File type rejected | Keep the active document open; plugin export must succeed |
| File too large | Enable Resize or lower JPEG quality; platform max image size applies |
| Export settings changed error | Activate the master and publish again (prepared copy was built with different settings) |
| Duplicate uploads on retry | Stable Idempotency-Key per prepared document. Safe to Publish again from the same open copy |
Disconnect
Use Disconnect in the panel or Revoke access under Connected apps in the dashboard.
