Skip to content
runonweb

Image captioning

Alt

Describe any image in one sentence, in English, Spanish, Portuguese, French, German, Arabic, Chinese, Japanese or Korean. Useful for alt text, search indexing and accessibility. Generated on-device, no image ever leaves the page.

Try Alt

Runs in this tab · nothing uploaded

Pick a sample or drop an image. It runs right away
Try with

Drop an image here

or click · PNG JPG WEBP

What it does

One sentence for any image, in nine languages.

  • LFM2.5-VL-450M (Liquid AI, Nov 2025). A small vision-language model, prompted for captions, not a dedicated captioner.
  • Pass language (en, es, pt, fr, de, ar, zh, ja, ko) to caption in that language. Other languages are best-effort.
  • Pass detail: "detailed" or "more" for longer captions. Default is short alt text. onPartial streams the text as it is generated.
  • License: LFM Open License v1.0. Free for individuals and companies under USD 10M annual revenue. Above that, Liquid AI requires a commercial license. Not OSI-approved; the rest of the catalog is Apache-2.0 or MIT.
  • WebGPU is the fast path (fp16 vision + q4f16 decoder, about a second per caption). WASM works but takes ~30 s per caption.
  • It is a generative model: captions can hallucinate details. Review before publishing.

Specifications

Package
runonweb/caption
License
LFM Open License v1.0 (free < USD 10M revenue)
Download
~316 MB / ~505 MB
Quantization
fp16+q4f16 on WebGPUfp16+q8+q4 on WASM
Backend
WebGPUWASM fallback
Input
Image

Get started with runonweb/caption

pnpm add runonweb
runonweb/captionts
import { ImageCaptioner } from 'runonweb/caption'

const captioner = new ImageCaptioner({ language: 'es', detail: 'short' })
await captioner.load()

const { text } = await captioner.caption(imageFile)
// "Un gato sentado sobre una mesa de madera."

// Per call overrides, streamed
await captioner.caption(imageFile, {
  language: 'en',
  detail: 'detailed',
  onPartial: (partial) => console.log(partial),
})

captioner.dispose()

Same shape everywhere: construct, load(), run, dispose(). Pass onProgressto show download progress on first use.

Questions about Alt

Does Alt run on device?

Yes. Weights download once and stay in the browser. Nothing is sent to a server.

What does Alt cost?

Nothing. runonweb is free and MIT-licensed, with no device limits, tokens or sign-in.

Which browsers support Alt?

Chromium browsers use WebGPU. Firefox and Safari fall back to WebAssembly automatically, slower but identical output.

Can I use a different model with runonweb/caption?

Yes. See each module’s docs for the options it accepts (model, size, language…). Check the license and test both backends before shipping.