Preview and sharing

Updated Oct 13, 2026 Open the tool

A preview link is a public, expiring 3D page at /preview/<code> that shows a model with the texture you painted on it. You create one from the Photoshop, Photopea or Browser plugin. Viewers do not need an account. Files behind the link are stored privately and streamed encrypted. Right-clicking the model in /app/preview opens the render, share, UV and view menu (not after a right-drag pan), and results, YTD textures, pieces and recent projects open their menus on right-click (since 2026-09-22).

Preview links are created from the design plugins: the Photoshop plugin, the Photopea plugin, and the Browser Plugin at /app/preview. Use the "Share Preview" action. The plugin uploads the current model and the texture you are painting, then shows the link and copies it to the clipboard.

What you see while it runs: a toast "Sharing preview..." that steps through "Preparing model for sharing", "Computing file hash...", "Checking for duplicates...", "Uploading model directly to storage...", "Uploading texture...", and finally "Preview link created!" with "Link copied to clipboard". If the clipboard is blocked the description reads "Link ready" and the dialog offers a manual copy. The link opens in a new tab unless the plugin shows it inline.

Supported models: vehicle YFT, clothing YDD, their XML variants, and GLB. Binary YFT and YDD are converted to GLB in your browser before upload, which needs a signed-in session. A stacked share can hold several YDD pieces at once (up to 12) so an outfit renders on one character.

The empty stage in /app/preview offers Choose file, Generate with AI (since 2026-10-13), Catalog and Library. Generate with AI opens the AI 3D generator in a dialog ("Generate a model"; on Describe it "Made for Preview", one object whole and centred); the finished model opens in Preview like a dropped GLB. It spends credits (see the Image to 3D doc) and is not offered in the Photoshop and Photopea panels.

A model that fails to open while another is already on the stage now says why in a line over the stage, with a close button (2026-09-23); before, the message was only drawn on the empty stage. "Sign in again to open a YFT or YDD" renews the session and retries by itself first; in the Photoshop and Photopea panels its Sign in brings back the link-code card.

In the Photoshop and Photopea panels, a model opened from a file on disk marks the stage so that an update (the panel reloads itself when a new version of the site is out) asks first with "Update ready · Refresh" rather than dropping the model (2026-09-24).

Making a link needs plugin access: Plugin Pass, Standard and up, the Referrer role, or an active free hour. Since 2026-09-19 the server checks that on every upload step, not only when the tool opens, so a Free account without a trial gets "Plugin access required" (403) instead of a link. Viewing a link needs nothing.

You can give a share a title. The same model uploaded twice by the same account is reused rather than stored again, so re-sharing after a texture change is quick.

Failures show "Failed to create preview" with the reason. Common ones: "Authentication required" (sign in first), "Model not found" or "Texture not found in storage" (the upload did not finish; try again).

Sharing from the rebuilt plugin panel (in progress)

The rebuilt plugin panel and the Preview tool at /app/preview (not released yet) make the same preview links as the plugins above. Share link sits in the stage's render menu, beside Copy render and, outside Photoshop, Download PNG; in Photoshop and Photopea a render goes into the editor instead. A share needs a texture on the model first, otherwise it says "Put a texture on the model first", and an outfit of stacked clothing pieces shares as one link. The link, its 30 day expiry and its privacy are exactly as described in the other sections, because the tool uses the same upload pipeline. Until the release is announced, point users at the "Share Preview" action in their current plugin. Since 2026-09-30 the panel reopens the last model by itself when it starts (models opened from disk too, see photoshop-plugin.md); a model that came back that way shares like any other.

The Showcase (Preview, Render, Showcase, 2026-09-24; front and back over a brand background, the old /design/outfit page) works the same way: a PNG on the person's computer, nothing uploaded or shared.

The Pack tab added to Preview on 2026-09-20 (pictures of a whole pack; see the workspace guide) makes PNG files and a zip on the person's own computer. It creates no preview links and uploads nothing to share: sharing is still one model at a time from the stage's render menu.

A preview link looks like https://zoov.dev/preview/Ab3kP9xQ: eight characters, letters and digits, case sensitive. Anyone with the link can open it without signing in.

The viewer shows the model with your texture, turning on its own, with orbit controls. Rebuilt on the workspace's own viewer and design on 2026-09-19 (route src/routes/(pages)/preview/[code]/, pieces built in src/lib/preview-view/): the model fills the first screen on the app's dark ground, the name and three facts (type, views, time left) sit bottom left, and Turn, Refit and Full screen sit bottom right. Under the stage the page says what made it, with Open the Preview tool and a link to the plugin page, plus the dates and the view count. The bar at the top carries the Zoovdev mark and a way into the workspace. Nothing on the page belongs to the owner of the file: there is no download and no delete. While the files come down the page shows "Loading the model"; if one cannot be read it shows "Preview did not open" with the reason and a Try again.

A YDD opened in the viewer comes back from winapi's ydd-extract-lod as a GLB that, since 2026-09-26, also carries the piece's own four-bone rows (JOINTS_0 as skeleton indices, WEIGHTS_0), which is what lets the Packs stage put the piece on the moving rig; the viewer draws it still unless a stage asks for motion.

Expiry: every link expires 30 days after it is created. There is no way to extend a link; create a new one. After expiry the page shows "This preview has expired" with the line "Preview links last 30 days. Whoever sent it can make a new one from the same model." and the button Open the Preview tool (HTTP 404; since 2026-09-19, on the workspace design through src/routes/(pages)/+error.svelte; before that it was a bare "Preview link not found or expired"). A code that is not eight characters shows "That is not a preview link" (HTTP 400) and the viewer says "Failed to load preview" if the assets are fetched after the link lapsed. Expired links and the files behind them are cleaned up by a scheduled database job.

Deleting early: the owner can delete a share through the API (DELETE /api/v1/preview/<code>), which removes the texture and preview image from storage. No button for this was found in the plugins (verify). If a user needs a link removed quickly, ask staff.

View counts increase on every load of the page, including the owner's.

Size limits and uploads

Size limits: the code sets no explicit maximum on model or texture size. Uploads go straight from the browser to storage using signed upload URLs, so the 4.5 MB request limit of the web servers does not apply. Very large binary YFT files still have to pass through the GLB conversion step, which can time out (verify the practical ceiling with staff).

Per share: one model plus one texture (PNG), an optional preview image for social cards, an optional title. Stacked shares: up to 12 pieces, each with its own model and texture ("A share can contain at most 12 pieces").

Textures are uploaded as PNG. Supported model formats are yft, ydd, yft-xml, ydd-xml and glb; anything else is rejected with "Invalid format. Must be one of: yft, ydd, yft-xml, ydd-xml, glb".

Privacy of shared assets

Shared files live in a private storage bucket. Nothing in it has a public URL. When someone opens a preview page, the page asks the server for a short-lived access token (valid 5 minutes) that names exactly one file, then downloads that file through an encrypting endpoint. The stream is encrypted with AES-256 and decrypted in the viewer's browser, so the raw model or texture is never served as a plain file.

For a visitor without an account, the token is only issued if they present a valid, unexpired share code and the requested file belongs to that share (each piece of a stacked share counts). Since 2026-10-13 the encrypted file pipeline serves only three kinds of file: a catalog model's files, a live share's own files (with its code), and a signed-in person's own uploads. Any other file, and a share code that is wrong or expired, returns "Access denied to this file". With no account and no share code the answer is "Share code required for secure preview access".

Only the account that created a share can delete it ("You do not own this share link"). Only the owner of a model can build a share from it ("You do not own one of the referenced models").

Keep in mind: anyone who has the link can view it and can screenshot or record the viewer. The link is not password protected. If a design leaks, delete the share (ask staff) and create a new one.

Embedding a viewer

The embed page at /embed?id=<model id> renders a library model in a bare full-screen viewer meant for an <iframe>. It reads the model from the public model library by id, not from a share code, so it cannot show a preview share. The older path /tools/environments/embed redirects here.

Query parameters:

  • spin=true auto-rotates the model.
  • gizmo=true shows the orientation gizmo.
  • interaction=false disables orbit and zoom.
  • controls=true shows the viewer controls.
  • texture=<url> applies a texture image from that URL.
  • camPos=x,y,z and camTarget=x,y,z set the camera.

Example: <iframe src="https://zoov.dev/embed?id=<model id>&spin=true&interaction=false"></iframe>. Whether hidden or custom models can be embedded by other people is not confirmed (verify). Embedding a preview share link itself in an iframe is not documented, ask staff.

The legacy page /preview?model_id=<id>&texture=<name> shows a library model with a stored texture and includes sky presets (Afternoon, Noon, Sunset, Night). It requires both parameters or it errors with "No model specified" or "No texture specified".

Sharing a conversion to Discord

Sharing a conversion to Discord for credits no longer exists, and it was never part of preview links. The "Share to Discord" dialog ("Earn 10 credits for sharing", once every 24 hours) belonged to the legacy Prop Converter editor, retired on 2026-09-26, and its route /api/v1/convert/share was removed on 2026-10-13. There is no share bonus now. If someone asks why sharing no longer gives credits, the feature is gone; a preview link ("Creating a preview link") is the way to show a model to others.

The stage toolbar's buttons (2026-09-21)

Two buttons sit at the top right of the preview stage: a sliders icon that opens the renderer settings (light, roughness, metalness, spin, the backing colour), and a camera icon that opens the render menu (render into the editor, download, copy, share a link).

Inside Photoshop the sliders button did nothing — except tint its own icon, which is what gave the cause away: the tint is the open state, so the trigger fired and only the floating layer failed to appear. A popover is placed by measuring its trigger against the viewport, and that measurement does not survive the UXP webview. So in a plugin panel the sliders are a plain button that opens the renderer settings as a dialog, centred and measuring nothing, which is what the narrow layout has always done. The browser tool keeps the popover, where it is verified to work.

Both buttons carry a plain title hint rather than one of our own tooltips: a tooltip hands its props to whatever it wraps, and wrapping another trigger leaves two components owning one element's handlers. The camera had no hint at all before and now has one.

The render actions also used to do nothing, in silence, when there was no renderer yet or nothing on the stage: no picture and no reason. They now say so.

The renderer settings also hold Sync size (1K, 2K or 4K; 2K by default, and plugin 1.5.6 stops at 2K): the long side a picture from a live host (Photoshop, Photopea) is held to on the model, since a 4K sync is slower. Since 2026-10-03 that setting only holds what Photoshop or Photopea sends. A texture read from a file (a YTD, a companion texture beside the model, a pack's letter, the UV map, a PNG or PSD the browser tool watches) is drawn on the model at its own size, up to 4096; before, every picture was held to the sync size, so a 4096 YTD texture was shown at 2048.

The stamp button (2026-10-12). In the Photoshop and Photopea panels a stamp button sits beside Select UV: "Add to model · Beta" (Image, Text, Graphics Library), which puts a picture on the model and writes it into the document as a layer at its spot. Photopea always; Photoshop from plugin 1.6.2. It is not in the browser tool, which has no document to write into. While a print is placed or moved its strip takes the stage's bottom edge (the outfit's pieces step aside). On a very narrow stage it folds into the ⋯ menu with the rest. How prints work: workspace.md, "Prints"; photoshop-plugin, "Prints". The document's size travels with the editor's pictures now (TextureFrame.sheet, kept as preview.sheet in the store), so a print is drawn for the document even when the sync is held lower.

Right-click on the model. A still right-click on the stage (not the right-drag that pans) opens what the toolbar folds into ⋯ on a narrow stage: the render actions, UV map, Select UV, Refit, Renderer, and with several pieces the list of pieces to pick the one in hand. A tool built on the stage can put its own rows above these (onmenu, menu and menuHeading on PreviewStage.svelte): it is told which piece the pointer is over (a ray from the pointer, skipping the ped under the clothes) before the menu is built, and when it has rows for it the stage's own fold into View › at the foot. Packs uses this to give a worn piece its row's menu (see packs.md, "The same menu on the stage"); the Preview tool itself offers the stage's menu alone.

Common questions

How long does a preview link last? 30 days from creation. It cannot be extended. Create a new share when it expires.

My link says "This preview has expired". Either the 30 days passed, the code was mistyped (codes are case sensitive, 8 characters), or the owner deleted it. Ask the creator for a fresh link.

Do viewers need an account? No. Anyone with the link can view it. Creating a link does need a signed-in account.

Can people download my model or texture from the preview? The files are served encrypted with short-lived tokens and are not exposed as plain URLs. Viewers can still take screenshots. Delete the share if you want it gone.

Is there a file size limit? No fixed limit is set in the code. Uploads go directly to storage. Very large binary vehicles may fail during the GLB conversion step (verify).

Can I embed a preview on my website? /embed?id=<model id> embeds library models in an iframe with spin, gizmo, interaction, controls, texture, camPos and camTarget parameters. Embedding a /preview/<code> share is not documented, ask staff.

Where is the share button? In the Photoshop, Photopea and Browser plugins, the "Share Preview" action. The old "Share to Discord" button with its credit bonus is gone.

Languages

Since 2026-09-20 this part of the site is available in English, French, German, Spanish, Portuguese, Polish and Dutch. It follows the browser's language on a first visit, and the language menu (the icon beside the profile in /app, or in the top navigation on public pages) changes it. Nothing about how it works, what it costs or what a plan includes differs by language; only the words do. File names, format names (GLB, YDR, YTD), product and model names, code, and some error lines that come from the server stay in English. Details and known gaps: Languages and translation.

Topics previewshareshare linkembed3d viewerexpiredprivacydiscord share

Something missing? Ask on Discord