Skip to content

Content types

SyncBins supports eleven content types (ITEM_TYPES in shared/src/types.ts). The type field is stored unencrypted on the server so sync can route without decrypting. Every field inside payload is ciphertext on the wire.

The composer and clipboard hint only infer a subset:

InputDetected typeWhere
http(s)://…, domain-like stringlinkComposer + clipboard
Text with braces/; heuristiccodeComposer + clipboard
12–64 char high-entropy tokenpasswordClipboard hint only
Image in clipboardimageClipboard hint
Other texttextComposer + clipboard
Dropped image fileimageDrag/drop
Dropped other filefileDrag/drop

There is no composer auto-detect for note, video, audio, contact, or location yet — create those via API/MCP or future UI.

Link items save with placeholder title New link and desc Fetching preview…. Open Graph fetching is not implemented — metadata stays placeholder until edited.


{ service: string; user: string; secret: string; }

UI hides secret by default with a reveal toggle and copy button.


{ url: string; title: string; desc: string; site: string; }

Renders as a link tile (title, description, domain). site is derived client-side from the URL host.


{ text: string; }

Same payload shape. Rendered with pre-wrap. Distinction is cosmetic in the UI.


{ lang: string; label: string; text: string; }

Monospace block, language chip, copy button. Composer defaults: lang: 'txt', label: 'snippet'.


{ w: number; h: number; label: string; tone: number; blobRef?: string; }

Inline if small; blobRef set when encrypted bytes exceed inline limit (~64 KB ciphertext). Drag/drop currently uses placeholder dimensions until blob pipeline fills them in.


{ url: string; title: string; desc: string; duration: string; tone: number; }

Thumbnail + play overlay when UI supports it. Large files use blob storage like images.


{ name: string; size: string; kind: string; blobRef?: string; }

Icon tile with filename and download. size is human-readable (e.g. 2.4 MB).


{ duration: number; label: string; wave: number[]; blobRef?: string; }

Play control + waveform from wave samples. Voice memo recording UI is not in the alpha web composer.


{ name: string; role: string; email: string; phone: string; }

Initials avatar + contact lines.


{ name: string; addr: string; lat: number; lng: number; }

Map pin rendered client-side from lat/lng.


Payloads larger than ~64 KB after encryption use the blob flow:

  1. POST /api/blobs/upload-url
  2. Upload ciphertext to presigned URL (R2 / Azure / signed local URL)
  3. POST /api/items with blobRef, blobNonce, blobKeys (no inline payloadEnc)

See Encryption envelope.


TypeBlob-backedAuto-detect in web UI
passwordNoClipboard only
linkNoComposer + clipboard
textNoComposer + clipboard
noteNoNo
codeNoComposer + clipboard
imageOftenDrag/drop + clipboard
videoOftenNo
fileOftenDrag/drop
audioOftenNo
contactNoNo
locationNoNo