Integrations
Read this if you know where your outputs are produced and want the page that wires Laidline in there. You will pick a mode and a guide, and see what each integration was tested on. Skip if you want the product in brief first (Overview). Time: 3 minutes. Needs: nothing.
Every mode writes the same three things for each output: Content Credentials, a watermark and an evidence entry. The modes differ only in where Laidline sits: in your process (library), on your bucket (storage hook), in front of your API (sidecar proxy) or inside your framework (plugin).
Pick a mode
| Where your outputs are produced | Mode | Guide |
|---|---|---|
| in your own Python process (a GPU worker, a container, a Kubernetes job) | Library: Marker in your code |
Quickstart |
| a diffusers pipeline you run | Plugin: laidline-diffusers |
diffusers |
| a ComfyUI workflow | Plugin: laidline-comfyui |
ComfyUI |
| a vLLM server generating text | Plugin: laidline-vllm, with the sidecar for the evidence log |
vLLM |
| a text model you run with transformers | Plugin: laidline-transformers |
transformers |
| a Pipecat voice pipeline | Plugin: laidline-pipecat |
Pipecat |
| a LiveKit voice agent | Plugin: laidline-livekit |
LiveKit Agents |
| an OpenAI-compatible API (images, speech, chat), yours or a vendor's | Sidecar proxy: laidline serve |
OpenAI-compatible proxy |
| another vendor's JSON image API | Sidecar proxy with adapter.rules |
Generic JSON adapter |
| files landing in an S3 bucket, from any provider | Storage hook: laidline ingest on SQS |
AWS S3 with SQS |
| the same, without a server to run | Storage hook as an AWS Lambda function | AWS Lambda |
| Cloudflare R2 or another S3-compatible store | Storage hook | R2 and other S3-compatible stores |
| Google Cloud Storage | Storage hook as a Cloud Run service | Google Cloud Run |
Two media guides apply across modes: Audio (files, the /v1/mark/audio route, streaming sessions and
phone calls) and Video (the async job route, the CUDA image, keyframe TrustMark on CPU).
Not listed?
| You have | Use |
|---|---|
| any server that speaks the OpenAI routes | the sidecar proxy, pointed at it with upstream.base_url |
| any JSON API that returns images | one adapter rule that says where the images sit in the answer |
| any Python pipeline | the library: load a Marker once and mark before you save (Quickstart) |
| any live voice stream at 16 kHz or more | a streaming session |
What each integration was tested on
Each guide ends with what was proven and how; this is the one-line version. Every row ran against the real service or framework named, not a stand-in.
| Integration | Proof | Tested on |
|---|---|---|
| Library | A fresh environment from the package: image, audio and video marked and detected, on CPU and on a GPU | 19 Oct 2026 |
| OpenAI-compatible proxy | Against api.openai.com: gpt-image-1-mini generations (n=2) and an edit, marked with the input kept as ingredient; gpt-4o-mini-tts speech buffered and streamed, with its signed twin |
24 Sep 2026; speech 27 Sep 2026 |
| Generic JSON adapter | A b64 rule against api.openai.com and a url rule fetching a real presigned S3 URL: marked, re-served and detected |
25 Sep 2026 |
| Audio | Number-to-number phone calls recorded at the callee at 8 kHz: 21 of 21 SignalWire calls read exactly; earlier 99 of 100 Twilio calls detected, 0 of 10 unmarked controls flagged | 21-22 Oct 2026; Twilio 27 Sep 2026 |
| Video | The CUDA image on an RTX 5080 and an AWS L4: a 360-frame 720p job marked in 11.0 s, bit accuracy 1.0, manifest trusted | 27 Sep 2026 (RTX 5080); 22 Oct 2026 (L4) |
| Pipecat | A Pipecat 1.13 pipeline with OpenAI speech over a websocket: marked audio detected at confidence 0.94, two evidence entries | 21 Oct 2026 |
| LiveKit Agents | A LiveKit 1.13.10 room with OpenAI speech: a 20 s WebRTC recording read back the exact payload under the hardened decode | 21 Oct 2026 |
| vLLM | A vLLM nightly on an RTX 5080: 20 of 20 completions marked through the sidecar, 30 of 30 marked texts detected | 19 Oct 2026 |
| transformers | Qwen2.5-0.5B on an RTX 5080 from the documented install line: 3 of 3 marked completions detected at grade B, 0 of 2 controls flagged | 21 Oct 2026 |
| diffusers | SDXL base 1.0 (fp16) on an RTX 5080: 4 of 4 images marked and detected at grade B, the unmarked control not found | 21 Oct 2026 |
| ComfyUI | ComfyUI v0.37.0 on CPU, remote and embedded: PNG and JPEG outputs detected as marked_by_this_system |
19 Oct 2026 |
| AWS S3 with SQS | A real AWS account in eu-central-1: JPEG and PNG marked in place; WAV and MP4 once ingest.mime_allowlist named them |
19 Oct 2026 |
| Cloudflare R2 | A real R2 bucket and Queue: an uploaded JPEG marked in place in 28.9 s, detected at grade A, backlog 0 | 21 Oct 2026 |
| AWS Lambda | A container image on Lambda in eu-central-1: PNG, JPEG, WebP, WAV and MP4 marked in place and detected, a WAV skipped by default; the first MP4 took 21.4 s and 1,726 MB of memory | 21 Oct 2026 |
| Google Cloud Run | Eventarc to Cloud Run in europe-west3: 4 of 4 images marked in place, Content Credentials valid, watermark found, evidence chains verified | 21 Oct 2026 |
What each guide did not run, and its measured limits, are in the guide itself.
Troubleshooting
| Message | Cause | Fix |
|---|---|---|
skipped_filtered for WAV or MP4 objects |
the storage hook's default ingest.mime_allowlist is PNG, JPEG and WebP |
add audio/wav or video/mp4 to ingest.mime_allowlist and install the audio or video extra (AWS S3 with SQS) |
no ingest ... outcome= lines in CloudWatch |
Lambda logs below INFO by default | set AWS_LAMBDA_LOG_LEVEL=INFO (AWS Lambda) |
the vLLM engine dies about two minutes after vllm serve starts |
the FlashInfer sampler compiles at warm-up and needs the CUDA toolkit (nvcc) |
start vLLM with VLLM_USE_FLASHINFER_SAMPLER=0 (vLLM) |
video_disabled from POST /v1/mark/video |
video marking is off by default | install laidline[video] and set watermark.video.enabled: true (Video) |
Reference
- Overview: what Laidline does, the four modes, free and metered
- Install: the package, the extras and the plugin packages
- Production setup: KMS signing, registration, a shared evidence store, readiness
- Configuration: every key the guides set
- Grading: what a detection result means