anaksor-ocr
Sokheng · Kit
Reads Khmer and English text from documents, receipts and photos of signs, using a detector for text lines and a recogniser for each line. Suits developers who…
An n8n workflow with a one-field upload form. Send a product photo, and OpenAI writes the prompts, Runware draws a square hero frame and Kling turns it into a 10-second 360-degree turntable video. Three model names need checking.
Product photo to 360-degree turntable video is an n8n workflow in the Marketing & SEO category, listed by Mindket. It is free. This is version 1, last updated on . Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.
Upload form
It starts when someone sends the Image trigger form with:
A 10-second video of the product turning on a white studio turntable, as an address in the run’s last node
What you need before you start.
File storage
Holds each uploaded photo and gives it a public link that the workflow and Runware read from.
NeedsA Dropbox app with sharing scopes, and its access token
Language and vision model
Describes the photo and writes the render prompt and the video prompt. Two of its three steps name a retired model.
NeedsOpenAI API key
Image and video generation
Draws the hero frame with FLUX.1 Kontext [pro], then the video with a Kling model whose ID needs checking.
NeedsRunware API key, typed into three nodes’ headers
Checked by Mindket on 13 Nov 2026
This n8n workflow turns one product photo into a 10-second video of that product turning a full circle on a white studio turntable. OpenAI studies the photo and writes two prompts. Runware draws a square hero frame from the first, then animates it with a Kling model from the second. It adds no scene, story or presenter. The product should look as it does in the photo, only turning.
Online shops and product marketers who want a turning view of each item for a product page, without a photo studio or a 3D model. It suits boxed and bottled goods better than clothes, which look best on a person. Three model names need checking first. Pick it if you can edit a JSON body in n8n.
| Industry | Who uses it | How they use it | Example |
|---|---|---|---|
| Online retail | Shop owners | Upload each product’s photo once and add the clip to its page | A tea shop uploads a photo of a tin and puts the turning clip beside the product. |
| Cosmetics | Brand marketers | Make a turning view of a new product before the studio shoot | A skincare brand gets a spin of a new serum bottle for its launch email. |
| Agencies | Content producers | Send a client’s catalog through the form, one photo at a time | An agency turns a client’s six sauce bottles into six short clips for social posts. |
You need some n8n and three accounts: Dropbox, OpenAI and Runware. Its author puts setup at about 13 minutes. Allow longer, because the Dropbox app and the model checks come first.
Any n8n, on n8n Cloud or a server of your own. The form runs inside n8n, so nothing else needs hosting.
Get it saves a zip with workflow.json and Mindket’s setup notes in your downloads folder. Make the Dropbox app first, since three nodes need its token.
| Need | Detail |
|---|---|
| n8n | On n8n Cloud or a server of your own |
| Dropbox | An app from Dropbox’s App Console with files.content.write, sharing.read and sharing.write, and an access token |
| OpenAI | An API key for a model that reads images |
| Runware | An account with credit, and its API key |
workflow.json.Upload a file. Put the same token in place of <YOUR_DROPBOX_TOKEN> in HTTP Request and HTTP Request6.Analyze image, OpenAI Chat Model1 and OpenAI Chat Model2.Analyze image and OpenAI Chat Model1, swap chatgpt-4o-latest for a current model such as gpt-4.1-mini.<YOUR_RUNWARE_KEY> in Flux Image , kling image to video post1 and kling imag to video get status1. The brackets go too, so each header reads Bearer, a space and the key.kling image to video post1, check klingai:5@1 against Runware’s model list.finalVideoURL in Edit Fields3 about four minutes later, then press Publish.OpenAI’s deprecations page, read on 2 November 2026, lists chatgpt-4o-latest as shut down on 17 February 2026. That is why step 4 is there. The same day, klingai:5@1 was missing from Runware’s model list, which offered klingai:6@0, KlingAI 2.5 Turbo Standard, for clips of 5 or 10 seconds.
Open the form, choose one clear photo of the product on a plain background and send it. The form says thanks at once. The video takes about four minutes. Then open the run under Executions and copy the address from Edit Fields3.
| To change | Where |
|---|---|
| The turntable, backdrop and light | The rotation context at the end of the system message in Basic LLM Chain |
| The camera move | The prompt in AI Agent1 |
| The video’s length and size | duration, width and height in kling image to video post1, 10 seconds and 1280 by 720 in the file |
| The frame | model, width and height in Flux Image , FLUX.1 Kontext [pro] at 1024 by 1024 in the file |
| How long it waits | Wait1, three and a half minutes before the one check on the video |
A candle maker uploads a photo of an amber glass jar candle with a black lid and a paper label. Analyze image might note the glass, the lid and the label’s words. The render prompt could then read:
Ultra-realistic 8K CGI render of an amber glass jar candle with a matte black metal lid and a cream paper label, centered on a glossy white turntable, soft studio light, --ar 1:1
Runware draws that frame. About four minutes after the upload, Edit Fields3 holds the address of a 10-second clip of the jar turning on its base.
If you are new. n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. This one reads in four rows, each labelled by a sticky note: the upload, the prompt, the frame and the video. Run it once from the test address. Then open each node and see what it received.
For experts. The photo makes a round trip. It goes up to Dropbox and comes back down through the public link for OpenAI to read, and the same link is the reference image Runware reads. The render prompt ends in --ar 1:1, which is Midjourney syntax that FLUX reads as plain text, so the size fields are what make the frame square.
| Node | Task | What to know |
|---|---|---|
Flux Image | imageInference with bfl:3@1 | Waits for the PNG and returns its address. The prompt goes in unescaped, so a quote mark breaks the JSON |
kling image to video post1 | videoInference, delivered later | Sends the frame as the first frame. Runware’s guide now puts it under inputs |
kling imag to video get status1 | getResponse | Runs once. A video still rendering leaves finalVideoURL empty |
Three things catch people out: a single status check, an open form and a public link.
finalVideoURL comes out empty. Add an If that loops back to Wait1JSON.stringify in place of its quotesAn n8n workflow behind a one-field upload form. Send it a photo of a product, and it makes a 10-second video of that
same product turning a full circle on a white studio turntable. OpenAI describes the product and writes the prompts.
Runware renders a square hero frame with FLUX.1 Kontext [pro], then animates it with a Kling model. Dropbox holds the
photo and gives Runware a link to it.
It adds no scene, story or presenter. The product should look as it does in the photo, only turning.
Read "Models to check first" below before the first run: three model names in the file need a look.
workflow.json: the workflow as n8n exports it, 32 nodes, four of them sticky notes that label its four rows. ItREADME.md: these notes.Bearer <API>. The two that call Dropbox, in HTTP Request and HTTP Request6,Bearer <YOUR_DROPBOX_TOKEN>. The three that call Runware, in Flux Image , kling image to video post1 andkling imag to video get status1, say Bearer <YOUR_RUNWARE_KEY>.Upload a file path had lost a backslash. Its /s+/g turned every letter s in the file name into/\s+/g again, which turns spaces into underscores.Analyze image and OpenAI Chat Model1 name chatgpt-4o-latest. OpenAI's deprecations page, read on 2 November 2026,
lists it as shut down on 17 February 2026. Pick a current model in both, such as gpt-4.1-mini, which reads images too.
kling image to video post1 asks Runware for klingai:5@1. That ID was not in Runware's model list when we checked the
same day. Its Kling models then included klingai:6@0, KlingAI 2.5 Turbo Standard, which makes clips of 5 or 10
seconds at up to 720p. Runware's image-to-video guide also puts the start frame under inputs.frameImages now. It says
many models refuse width and height when a frame is given. If the call fails, move frameImages under inputs as
the guide shows, and take the two sizes out.
Upload a file is n8n's Dropbox node, set to take an access token. HTTP Request and HTTP Request6 call Dropbox's API
with a token in their headers. The quickest setup uses one token in all three:
files.content.write, sharing.read and sharing.write, and submit.Dropbox's OAuth guide says its access tokens are short lived, and that a token made in the App Console is for testing
with your own account. Expect to paste in a new one after a few hours.
For a setup that lasts, switch Upload a file to OAuth2 and give it n8n's Dropbox OAuth2 credential. That credential
asks Dropbox for files.content.write, files.content.read, sharing.read and account_info.read, which cannot make
the link in HTTP Request6. So give the two HTTP Request nodes a generic OAuth2 API credential for your app instead:
https://www.dropbox.com/oauth2/authorize and Access Token URLhttps://api.dropboxapi.com/oauth2/token, with your app's key and secretsharing.read sharing.write, and token_access_type=offline in the auth URI query parametersThen delete their Authorization headers.
workflow.json.Upload a file.HTTP Request and HTTP Request6, replace <YOUR_DROPBOX_TOKEN> with the same token. The brackets go too, so theAnalyze image, OpenAI Chat Model1 and OpenAI Chat Model2. Change theFlux Image , kling image to video post1 and kling imag to video get status1, replace <YOUR_RUNWARE_KEY>kling image to video post1 against Runware's list (above).On form submission, use its test address and upload a product photo. Wait about four minutes, then openfinalVideoURL in Edit Fields3.On form submission serves the Image trigger form, which has one file field. Code2 names each file it receivesproduct_image, one item for each.Upload a file saves the photo at the top of your Dropbox, or of the app's folder, with spaces in its name turnedHTTP Request asks Dropbox for a link to that file. When If finds one, Code7 takes it. OtherwiseHTTP Request6 makes a public link first. Code7 swaps dl=0 for raw=1, so the address serves the file itself.HTTP Request3 downloads the photo from that link, and Code6 labels it a PNG named product.png.Analyze image has OpenAI describe the product in detail: its label, material, logo, colors, shape and size.Basic LLM Chain turns that description into one render prompt. Its rules ask for an exact copy of the product,--ar 1:1. Structured Output Parser1 holds the answer to oneAd Concept 1, and Edit Fields and Code pass it on as prompt.AI Agent1, on gpt-4o-mini, writes the video prompt: one sentence of up to 40 words about a smooth 360-degree turn.Code3 makes a task ID. Flux Image asks Runware for one 1024 by 1024 PNG from bfl:3@1, FLUX.1 Kontext [pro],Split Out1 takes the result, and Wait6 pauses 10 seconds.Edit Fields2 keeps the frame's address under the name finalVideoURL, though it is still the picture. Code5kling image to video post1 asks Runware for a 10-second, 1280 by 720 video with thatWait1 pauses three and a half minutes. Then kling imag to video get status1 asks once for the result, andEdit Fields3 sets finalVideoURL to the video's address.Basic LLM Chain.AI Agent1.duration, width and height in the body of kling image to video post1.width and height in Flux Image .Wait6 after the frame, and Wait1 before the one check on the video.finalVideoURLkling imag to video get status1 again, or add an If that loops back to Wait1 until avideoURL appears.{{ JSON.stringify($('Basic LLM Chain').item.json.output['Ad Concept 1']) }} in place of the quoted text inFlux Image fixes that, and the same works for the video prompt.--ar 1:1 comes from Midjourney's prompt syntax. FLUX reads it as plain text. The frame is square because of thewidth and height in Flux Image .Code6 labels the photo a PNG whatever it is. Upload a PNG or a JPEG.README.md 9 KB workflow.json 25 KB
Sokheng · Kit
Reads Khmer and English text from documents, receipts and photos of signs, using a detector for text lines and a recogniser for each line. Suits developers who…
Qwen · Kit
Qwen2.5-7B-Instruct as GGUF files in eight quantization sizes, to chat with locally through llama.cpp. For people who want a capable 7.6B model on their own co…
ACE-Step · Kit
Generates music from text with a 4B diffusion decoder, 50 steps and guidance control, aiming for higher audio quality than the base. For creators with a GPU of…
alchaincyf · Skill
Turns a one-line request in your AI agent into a finished design: a launch animation, a clickable app prototype, an editable slide deck, an infographic or a se…
nerijs · Kit
A pixel art style add-on for Stable Diffusion XL that turns text prompts into pixel-style images, with an optional LCM LoRA for faster runs. For game makers, d…
LiconStudio · Kit
Keeps characters, clothing, objects and backgrounds consistent in generated video by feeding the model up to five reference images. A LoRA for LTX-2.5 in Comfy…