Adobe architecture variants
π§ The right skill, one API call. AI agent skills registry with token-efficient skill resolution. 5,000+ skills from 500+ top repos.
npx -y skills add ComeOnOliver/skillshub --skill adobe-architecture-variantsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Choose and implement Adobe architecture blueprints: standalone SDK integration, Adobe App Builder serverless, and dedicated microservice with event-driven Firefly/PDF pipelines. Decision matrix based on team size and throughput. Trigger with phrases like "adobe architecture", "adobe blueprint", "adobe app builder vs standalone", "adobe microservice".
The file declares its own license as MIT. That is the authorβs claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
9.4 KB, ~2.1k tokens by cl100k_base, as published. Nobody here has run it
Adobe Architecture Variants
Overview
Three validated architecture blueprints for Adobe integrations: (A) direct SDK integration in existing app, (B) Adobe App Builder with Runtime actions, and (C) dedicated microservice with event-driven pipelines.
Prerequisites
- Understanding of team size and throughput requirements
- Decision on which Adobe APIs to use (Firefly, PDF, Photoshop, Events)
- Knowledge of deployment infrastructure
- Growth projections for API usage
Instructions
Variant A: Direct SDK Integration (Simple)
Best for: MVPs, small teams (1-5), < 100 API calls/day, single Adobe API
my-app/
βββ src/
β βββ adobe/
β β βββ auth.ts # OAuth token management
β β βββ firefly.ts # or pdf-services.ts β one API client
β β βββ types.ts
β βββ routes/
β β βββ api/
β β βββ generate.ts # Direct API call in route handler
β βββ index.ts
βββ .env # ADOBE_CLIENT_ID, ADOBE_CLIENT_SECRET
βββ package.json # @adobe/firefly-apis or @adobe/pdfservices-node-sdk
// Direct integration β API call in route handler
app.post('/api/generate', async (req, res) => {
try {
const token = await getCachedToken();
const result = await fetch('https://firefly-api.adobe.io/v3/images/generate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'x-api-key': process.env.ADOBE_CLIENT_ID!,
'Content-Type': 'application/json',
},
body: JSON.stringify({ prompt: req.body.prompt, n: 1, size: { width: 1024, height: 1024 } }),
});
res.json(await result.json());
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
Pros: Fastest to build, simplest deployment, no extra infrastructure Cons: No background processing, route handler blocks for 5-30s on Firefly calls
Variant B: Adobe App Builder (Native Adobe)
Best for: Adobe-centric workflows, teams using Adobe ecosystem, event-driven CC Library automation
my-adobe-app/
βββ actions/ # Runtime actions (serverless functions)
β βββ generate-image/
β β βββ index.js # Firefly image generation action
β βββ extract-pdf/
β β βββ index.js # PDF extraction action
β βββ webhook-handler/
β βββ index.js # I/O Events webhook processor
βββ web-src/ # Optional frontend (React/SPA)
β βββ src/
βββ app.config.yaml # App Builder configuration
βββ .aio # AIO CLI configuration
βββ package.json
# app.config.yaml
application:
actions: actions
web: web-src
runtimeManifest:
packages:
adobe-integration:
actions:
generate-image:
function: actions/generate-image/index.js
runtime: nodejs:20
web: yes
inputs:
ADOBE_CLIENT_ID: $ADOBE_CLIENT_ID
ADOBE_CLIENT_SECRET: $ADOBE_CLIENT_SECRET
limits:
timeout: 60000
memory: 256
annotations:
require-adobe-auth: true
webhook-handler:
function: actions/webhook-handler/index.js
runtime: nodejs:20
web: yes
annotations:
require-adobe-auth: false # Webhooks need public access
// actions/generate-image/index.js β App Builder Runtime action
const { Core } = require('@adobe/aio-sdk');
async function main(params) {
const logger = Core.Logger('generate-image');
try {
// Token management handled by App Builder automatically
const token = params.__ow_headers?.authorization?.split(' ')[1]
|| await getServiceToken(params);
const response = await fetch('https://firefly-api.adobe.io/v3/images/generate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'x-api-key': params.ADOBE_CLIENT_ID,
'Content-Type': 'application/json',
},
body: JSON.stringify({
prompt: params.prompt,
n: 1,
size: { width: params.width || 1024, height: params.height || 1024 },
}),
});
const result = await response.json();
return { statusCode: 200, body: result };
} catch (error) {
logger.error(error);
return { statusCode: 500, body: { error: error.message } };
}
}
exports.main = main;
Pros: Native Adobe hosting, built-in auth, I/O Events integration, no infra management Cons: Vendor lock-in, cold start latency, limited runtime options
Variant C: Dedicated Microservice (Enterprise)
Best for: High throughput (1000+ calls/day), multi-API workflows, strict SLAs
adobe-service/ # Dedicated microservice
βββ src/
β βββ adobe/ # Client layer
β β βββ auth.ts
β β βββ firefly-client.ts
β β βββ pdf-client.ts
β β βββ photoshop-client.ts
β β βββ events-client.ts
β βββ pipelines/ # Workflow orchestration
β β βββ image-pipeline.ts # Firefly β Photoshop β Storage
β β βββ document-pipeline.ts # PDF Extract β Transform β Store
β βββ workers/ # Background job processors
β β βββ firefly-worker.ts
β β βββ pdf-worker.ts
β βββ api/
β β βββ grpc/adobe.proto # Internal API (gRPC)
β β βββ rest/routes.ts # External API + webhooks
β βββ index.ts
βββ k8s/
β βββ deployment.yaml
β βββ service.yaml
β βββ hpa.yaml # Auto-scale on pending jobs
β βββ configmap.yaml
βββ package.json
other-services/
βββ web-api/ # Calls adobe-service via gRPC
βββ marketing-automation/ # Calls adobe-service for assets
βββ document-processor/ # Calls adobe-service for PDFs
// src/pipelines/image-pipeline.ts
// Multi-step pipeline: Generate β Remove BG β Store
export async function imageProductionPipeline(request: {
prompt: string;
removeBackground: boolean;
outputBucket: string;
}) {
// Step 1: Generate with Firefly
const generated = await fireflyClient.generate({
prompt: request.prompt,
size: { width: 2048, height: 2048 },
});
let imageUrl = generated.outputs[0].image.url;
// Step 2: Optionally remove background with Photoshop
if (request.removeBackground) {
const presignedInput = await uploadToStorage(imageUrl);
const presignedOutput = await getPresignedUploadUrl(request.outputBucket);
await photoshopClient.removeBackground({
input: { href: presignedInput, storage: 'external' },
output: { href: presignedOutput, storage: 'external', type: 'image/png' },
});
imageUrl = presignedOutput;
}
// Step 3: Store final asset
return { url: imageUrl, pipeline: 'image-production' };
}
Pros: Full control, independent scaling, multi-API orchestration, strict isolation Cons: Complex ops, needs K8s/container platform, higher development cost
Decision Matrix
| Factor | A: Direct SDK | B: App Builder | C: Microservice |
|---|---|---|---|
| Team Size | 1-5 | 3-10 | 10+ |
| API Calls/Day | < 100 | 100-1000 | 1000+ |
| Adobe APIs Used | 1 | 1-3 | 2+ |
| I/O Events | No | Yes (native) | Yes (custom) |
| Deployment | Any platform | Adobe hosting | K8s/containers |
| Time to Market | Days | 1-2 weeks | 3-8 weeks |
| Vendor Lock-in | Low | High (Adobe) | Low |
| Operational Cost | Lowest | Low (managed) | Highest |
Migration Path
A (Direct) β B (App Builder):
Move route handlers to Runtime actions
Add I/O Events registration
Deploy with `aio app deploy`
A (Direct) β C (Microservice):
Extract Adobe code to dedicated service
Add background job queue (BullMQ)
Define gRPC API contract
Deploy to Kubernetes
B (App Builder) β C (Microservice):
Port Runtime actions to Express/Fastify
Replace I/O Events with custom webhook handling
Add HPA and monitoring
Output
- Architecture variant selected based on decision matrix
- Project structure matching chosen pattern
- Migration path documented for future scaling
Resources
Next Steps
For common anti-patterns, see adobe-known-pitfalls.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.