Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
190edb8
fix(img): preserve native attributes and enforce loading contracts
kvz Sep 12, 2026
267278b
fix(img): reserve signing layout and document responsive geometry
kvz Sep 12, 2026
ef5638e
docs(img): explain durable redirects and bound existing CDN grants
kvz Sep 12, 2026
36fef92
fix(img): retain decoding defaults and reject invalid styles
kvz Sep 12, 2026
2f61e01
Merge reviewed image attribute fixes into layout work
kvz Sep 12, 2026
8e02baa
Merge reviewed image attribute fixes into lifetime work
kvz Sep 12, 2026
397bc36
fix(img): preserve picture layout selectors while signing
kvz Sep 12, 2026
9dd4299
Merge placeholder layout review fix into lifetime work
kvz Sep 12, 2026
4f3e392
feat(img): document and verify Storage image onboarding
kvz Sep 12, 2026
64a8e7b
Validate image alternatives and keep placeholder identity inert
kvz Sep 12, 2026
bc5dc58
test(img): prove native cookie delivery in production Next fixture
kvz Sep 12, 2026
73f8dc2
Prove native private image delivery
kvz Sep 12, 2026
e946915
Make the first-image walkthrough complete
kvz Sep 12, 2026
4b330c6
Connect Storage ingestion to image receipts
kvz Sep 12, 2026
0f214f8
Add an explicit-policy environment factory
kvz Sep 12, 2026
a62e991
Fix Storage receipt orientation and error contracts
kvz Sep 12, 2026
5539a32
Polish Storage image onboarding and bound fallback delivery
kvz Sep 12, 2026
23f24e4
Store images and atomically append receipts from the CLI
kvz Sep 12, 2026
63490af
Preserve all existing CLI receipt keys
kvz Sep 12, 2026
ab4bde6
Derive Storage image layouts and add development feedback
kvz Sep 12, 2026
a760ae8
Lead private image onboarding with authorized delivery
kvz Sep 12, 2026
0ce8c14
Preserve Storage preview transparency
kvz Sep 12, 2026
1e9f575
Clarify Storage image failure recovery
kvz Sep 12, 2026
888c4e0
Complete Storage image onboarding and delivery policy
kvz Sep 12, 2026
8e5d7fc
Cover cold compatibility checks and Storage listing readiness
kvz Sep 12, 2026
3cc783a
Fix final Storage image onboarding review findings
kvz Sep 12, 2026
030bc9a
Record final image review and fresh stranger verification
kvz Sep 12, 2026
1e554c4
docs: verify live Storage listing and HEAD metadata
kvz Sep 12, 2026
e41f1b1
Recover image rendering receipts with Storage List and HEAD
kvz Sep 12, 2026
aa59c0d
Identify Storage receipt sync failures by object path
kvz Sep 12, 2026
bfcdc50
Unify catalog image factories and make public delivery static
kvz Sep 12, 2026
dee1b17
Verify Storage image onboarding and browser recovery
kvz Sep 13, 2026
c855236
Buffer the real Flight response in the sign-in proof
kvz Sep 13, 2026
47e4069
Document verified EXIF-aware Storage receipt recovery
kvz Sep 13, 2026
93e5fd6
Fix Storage delivery and receipt recovery edge cases
kvz Sep 13, 2026
71d93ad
Merge remote-tracking branch 'origin/main' into img-onboard
kvz Sep 13, 2026
1c785ea
Simplify Storage image onboarding and factory API
kvz Sep 13, 2026
86af1c4
Add public Storage delivery and browser login
kvz Sep 13, 2026
b4e1336
Honor login signing and public delivery contracts
kvz Sep 13, 2026
4c8d3ec
Clarify CLI failures and verify committed image refreshes
kvz Sep 13, 2026
598cee1
Align image onboarding with the API2 wire contract
kvz Sep 13, 2026
2a464df
Match public image prefixes to the API UTF-8 limit
kvz Sep 13, 2026
7fa2184
Make public image onboarding secretless and verify credential flow
kvz Sep 13, 2026
0159371
Bound constrained images to their original width
kvz Sep 13, 2026
13dce64
Bind image projects to their catalog and simplify onboarding
kvz Sep 13, 2026
044af09
Handle constrained geometry edges and preserve login identity
kvz Sep 13, 2026
3002db3
Keep workspace discovery and saved credential provenance fail closed
kvz Sep 13, 2026
baea1d1
Require consent before revoking imported application keys
kvz Sep 13, 2026
cd9430a
Verify project-selected credentials before trusting workspace identity
kvz Sep 13, 2026
aa839c1
Handle unrestricted keys and mixed-catalog image scaffolds
kvz Sep 13, 2026
3e473f4
Preserve explicit expiry and clean up interrupted Storage commands
kvz Sep 13, 2026
00f5ec0
Complete cancellation forwarding and clarify Storage recovery
kvz Sep 14, 2026
5561c31
Record completed round-eight image verification
kvz Sep 14, 2026
5ba977f
Preserve stored image receipts after upload transformations
kvz Sep 14, 2026
ce623e2
Keep receipt recovery targeted and observer failures harmless
kvz Sep 14, 2026
c7017d3
Record verified signup addendum and remaining release gates
kvz Sep 14, 2026
ea67186
Fix image scaffold diagnostics and first-login guidance
kvz Sep 14, 2026
38e1dc6
Handle cached image candidates and concurrent login recovery
kvz Sep 14, 2026
bfed39e
Wait for native image selection before development reload checks
kvz Sep 14, 2026
3b26679
Finish stranger onboarding checks without rewriting dev HTML
kvz Sep 14, 2026
8c39cde
test: drain image response reads before browser teardown
kvz Sep 14, 2026
2befc53
Clarify image delivery diagnostics and final onboarding details
kvz Sep 14, 2026
9193869
Complete image onboarding recovery and reader follow-ups
kvz Sep 14, 2026
3a95a4b
Polish generated scaffolds and close onboarding review findings
kvz Sep 14, 2026
f830f75
Keep scaffold generation independent of built packages
kvz Sep 14, 2026
7fbd81c
Make StorageImage package-first with a conventional catalog
kvz Sep 14, 2026
bfca86b
Harden catalog scaffolding and read-only Next startup
kvz Sep 14, 2026
ec9ddba
Bind credentialed image init to catalog delivery
kvz Sep 14, 2026
14a50e9
Make private image setup and recovery advice actionable
kvz Sep 14, 2026
36538a2
Keep image recovery advice safe and catalog-aware
kvz Sep 14, 2026
2779025
Keep exact catalog suggestions for formatting mistakes
kvz Sep 14, 2026
2b5584d
Prepare ThumbHash receipts and compact image delivery URLs
kvz Sep 14, 2026
0d8aa74
Keep blur placeholders server-only for opaque images
kvz Sep 14, 2026
e054145
Close blur rendering and public preview boundary regressions
kvz Sep 14, 2026
98bcee8
Align private image setup messages with the README
kvz Sep 14, 2026
c56ec58
Keep image setup advice accurate across configs and workspaces
kvz Sep 14, 2026
222aff3
Add content-addressed image uploads with --hashed
kvz Sep 15, 2026
ff776b6
Bind hashed replay receipts to their API environment
kvz Sep 15, 2026
945c798
Clarify Storage recovery command availability
kvz Sep 15, 2026
13a239c
docs: clarify image onboarding and server uploads
kvz Sep 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .changeset/public-image-candidates.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@transloadit/utils": minor
---

Add `getSmartCdnImageCandidates` next to the signed candidate builder on the Node entry point.
Share candidate validation and URL encoding while omitting signatures and expiry for genuinely
public delivery. Callers can use receipt-derived version tags for stable, immutable cache keys.
Include a proportional (rounded-up) fit height, or the backend limit without source metadata,
so a Template's default height does not silently invalidate the width descriptors.
9 changes: 9 additions & 0 deletions .changeset/storage-image-prefixes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@transloadit/utils": minor
"@transloadit/node": patch
"transloadit": patch
---

Share Storage path and directory-prefix validation between image integrations and CLI scaffolds.
Keep generated image recipes scoped, preserve relative imports for hidden receipt catalogs, and
sign Storage listing requests against the endpoint belonging to the selected key credentials.
78 changes: 78 additions & 0 deletions .changeset/storage-image-receipts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
---
"@transloadit/node": minor
"transloadit": minor
"@transloadit/mcp-server": patch
---

Release gate: publish this minor release only after transloadit/api2#9057 and
transloadit/content#5973 are deployed. Device login, public delivery and safe CLI-key revocation
depend on that coordinated backend/Console rollout. The image package remains private dogfood.
At publication, switch preview-branch documentation links to their then-merged main locations.
Require Node 20.10.0+ for JSON import attributes and composed AbortSignal cancellation. Logout
only forgets imported and legacy application keys unless revocation is explicitly requested
with `--revoke`.

Add `client.storeImage(filePath, { path })` for one original Storage image without overwriting.
Stream the input checksum and verify the completed receipt's path, asset ID, stored bytes and
EXIF-oriented display dimensions. Community-plan transformations may change the stored size/MD5;
return authoritative result metadata and expose the input comparison through `onReceipt`.
The CLI warns about changed bytes, saves the receipt and adds bounded debug diagnostics.
Return typed metadata suitable for saving and rendering without another lookup. Preserve Assembly
upload progress, cancellation and errors; receipt validation after a write is not a rollback.

Add `transloadit storage store <file> <path>` using the CLI's existing
Assembly credentials. Atomically append keyed receipts, preserve previous data on failures and
reject concurrent writers, then print a ready-to-render StorageImage snippet.
Add `storage store --hashed` for content-addressed filenames: eight MD5 hex digits before the
extension, with catalog keys, generated types and JSX following the stored path. Retain the local
filename as `source`; reuse matching full-checksum/size receipts without uploading. Never overwrite
a hash conflict. Keep production-unavailable S3 recovery commands in the image reference only.
When receipt validation fails after writing, print the destination and Assembly ID for recovery.
Point to list/sync, not overwrite or another upload. Report pending browser approval every minute.
Document npm-first onboarding, browser signup and free-plan watermark behavior.
Keep receipts-file filesystem errors distinct from JSON validation failures, with the file path.
Retain a completed temporary catalog on local replacement failures, print the verified receipt,
and preserve an existing catalog's permissions.

Add `getStoredImageReceipt({ assemblyId, expected })` to recover the same verified metadata after
a trusted upload notification or a local file error. Add explicit `store --overwrite` and
read-scoped `storage ls <prefix>`; overwriting is never implicit.

Add `storage receipts sync <prefix> --receipts images.json` to recover rendering metadata from
signed, paginated List + HEAD reads without an Assembly or original download. Rebuild
path/width/height with an optional compatible MD5 ETag, without inventing an asset ID. Share
atomic receipt-file writes and credential-bound endpoint resolution with the existing commands;
preserve unmatched records and the entire previous file on metadata, listing or write failures.

Add browser device authorization for `auth login`, with bounded polling, cancellation and
owner-only credential persistence. Keep `--stdin` for an existing Auth Key, verified by a signed read.
Keep newly entered credentials independent from project dotenv endpoint settings; save an explicit
trusted endpoint with the key. Add `image init [--public | --private]`, with
opt-in private `.env.local` scaffolding via `--write-env`. Never overwrite existing application files.
Default store/sync catalogs to `transloadit.images.json`. Init writes an empty catalog and a runnable example
for `app` or `src/app`, preserving existing files. Store prints only the saved path and component
usage; its snippet-only public/private flags and init's dead next flag are removed. Keep upload
asset IDs and sizes on sync only when the HEAD MD5 still matches the stored receipt.

Consolidate the unpublished Next factories into `createStorageImages`; select `public`, `authorize`,
or `delivery: 'direct'` explicitly. The authorize overload retains its typed redirect handler.
Require Next 16.3.3 or newer in the peer range.

Reuse the login workspace and combined Auth Key for optional env scaffolding without extra prompts.
Add signed public-prefix declaration, revocation and listing methods with `storage publish`,
`storage unpublish` and `storage publications`. Public image init declares server policy before writing
files and explains that already cached public bytes cannot be recalled.

Preserve the device key's signing algorithm in CLI credentials and subsequent API requests.
Add `signatureAlgorithm` to SDK client options while retaining the legacy SHA-384 default and
explicit per-call overrides. Init's env setup uses the saved key/workspace/endpoint together,
independently of stale project or shell credentials. Public/private Template overrides are separate.

Public init stores workspace and published prefixes in the committed catalog, with no app env file.
Require public/private intent and bind Storage operations to the selected key's verified workspace.
Support multi-file store, auth status and server-side auth logout before removing credentials.
Infer allowed directories from
public policy even with an empty catalog, and accepts a missing trailing slash. Storage commands
report the winning credential source without showing credentials; store prints constrained JSX
bounded to the receipt width. Login makes a bounded read-only Storage policy preflight and gives
Console advice when unavailable. Keep the image quickstart concise and ship its detailed reference.
13 changes: 13 additions & 0 deletions .changeset/storage-image-seed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
'@transloadit/node': patch
'@transloadit/types': patch
'@transloadit/zod': patch
'transloadit': patch
'@transloadit/mcp-server': patch
---

Include the Transloadit Storage import and store Robots in the offline catalog and generated
instructions, and type the optional `asset_id` in Assembly results. Recognize Storage import/store
error codes in response validation and terminal-status helpers, preserving API errors while polling.
Sync the canonical `recursive` option for Storage folder imports into the offline linter and
generated instructions without adding SDK-only schema fields.
23 changes: 17 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Ensure yarn.lock matches dependency changes
- name: Ensure each package's lockfile matches dependency changes
env:
BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }}
HEAD_SHA: ${{ github.sha }}
Expand Down Expand Up @@ -59,13 +59,11 @@ jobs:
}
return !file.startsWith('docs/fingerprint/')
})
const lockfileChanged = diffNames.includes('yarn.lock')

if (packageFiles.length === 0) {
process.exit(0)
}

const hasDependencyChanges = packageFiles.some((file) => {
const changedPackages = packageFiles.filter((file) => {
let before = {}
let after = {}
try {
Expand All @@ -85,8 +83,15 @@ jobs:
})
})

if (hasDependencyChanges && !lockfileChanged) {
console.error('yarn.lock must be updated when dependency ranges change in package.json.')
// The packed Next app is a standalone npm consumer, outside the Yarn workspaces.
const missingLockfiles = new Set(changedPackages
.map((file) => file === 'scripts/fixtures/img-next/package.json'
? 'scripts/fixtures/img-next/package-lock.json'
: 'yarn.lock')
.filter((lockfile) => !diffNames.includes(lockfile)))

if (missingLockfiles.size > 0) {
console.error(`${[...missingLockfiles].join(', ')} must be updated when dependency ranges change.`)
process.exit(1)
}
NODE
Expand Down Expand Up @@ -161,6 +166,12 @@ jobs:
node-version: 24
- run: corepack yarn install --immutable
- run: corepack yarn test:img:fixture
- uses: actions/upload-artifact@v7
if: always()
with:
name: img-browser-evidence
path: test-results/img-next
if-no-files-found: ignore

unit:
name: Unit tests (Node ${{ matrix.node }})
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ sample.js
npm-debug.log
env.sh
/coverage
/test-results/
packages/node/coverage

.pnp.*
Expand Down
8 changes: 8 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,14 @@
}
},
"overrides": [
{
"includes": ["scripts/fixtures/img-next/app/**"],
"linter": {
"rules": {
"correctness": { "useImportExtensions": "off" }
}
}
},
{
"includes": ["**/package.json"],
"formatter": {
Expand Down
Loading