Laidline overview

Read this if you are deciding whether Laidline fits your product, or you are an engineer meeting it for the first time. You will know what Laidline does to each output, the four ways to run it, what stays on your servers, what is free and what is metered, and where its measured limits are. Skip if you are ready to install (Install) or want a first marked file (Quickstart). Time: 10 minutes. Needs: nothing.

In short

  • Every image, audio clip, video or text your system generates leaves signed, watermarked and logged.
  • It runs on your servers in one of four modes: library, storage hook, sidecar proxy or plugin.
  • Media, models and keys stay with you; Laidline never receives your outputs.
  • Detection and verification are free; marking is free up to 1,200 credits a month, then metered.
  • Detection returns graded evidence, from A to D, never a statement that content is human-made.

What Laidline does to each output

Laidline is a Python package (pip install laidline) for providers of generative AI who must mark what their systems produce, for example under the EU AI Act's Article 50 marking duty. Each output it marks gets three things.

Output What it is Where it lives
Signed Content Credentials: a C2PA manifest signed with your own key (AWS KMS, Vault or OpenBao Transit; a local key for development) and, by default, an RFC 3161 timestamp inside the file, where the format carries one
Watermarked an invisible watermark in the pixels, samples or tokens that carries your issuer number and, in keyed mode, a tag under your secret payload key in the content itself, so it survives a stripped manifest
Logged an evidence entry in a hash-chained log, anchored by signed and timestamped checkpoints in your evidence store: files, S3 or Postgres

The watermark depends on the medium:

  • Image: PixelSeal by default, TrustMark selectable.
  • Audio: AudioSeal, for files and for live streams.
  • Video: VideoSeal (wants a GPU), or a keyframe TrustMark scheme on CPU.
  • Text: a statistical watermark (SynthID-style or KGW) applied while the model samples, through the vLLM plugin or the transformers helper. Text carries no Content Credentials.

From the log, laidline evidence export packs a date range into a bundle with a standalone verify.py that checks it without Laidline installed, and fills in the Article 50 texts (Compliance, Evidence log).

To read marks back, laidline detect and the POST /detect route of the sidecar return a graded result: grade A for a trusted, timestamped manifest; B for a watermark confirmed against your evidence log; C for a watermark that names your issuer but resolves to no entry; D for weaker signals, including a shared mark; none when nothing is found (Grading). Absence of a signal is not evidence that content is human-made.

Four ways to run it

Pick the mode that matches where your outputs are produced. Every mode writes the same manifest, watermark and evidence entry. The Integrations page maps each platform to a mode and says what each integration was tested on.

Mode Fits when What you run
Library you run the model in your own Python process Marker.from_config(...), then marker.mark_image, mark_audio or mark_video before you encode or upload (Quickstart)
Storage hook outputs land in a bucket, from any provider laidline ingest on the bucket's event queue (S3 with SQS, R2 with Queues, a local directory), or the same worker as an AWS Lambda function or a Cloud Run service; each object is marked in place
Sidecar proxy you serve an OpenAI-compatible endpoint or a JSON image API laidline serve in front of it: images and speech come back marked, chat and completions are logged; adapter.rules covers other JSON APIs
Plugin you build on a framework laidline-comfyui, laidline-diffusers, laidline-vllm, laidline-transformers, laidline-pipecat or laidline-livekit

The sidecar and the storage hook are ordinary Python 3.12 processes: run them on a virtual machine, in your own container image, under Compose or on Kubernetes. Images and audio are marked on the CPU; video marking and the hardened audio detection want an NVIDIA GPU (Video). Production setup covers the signing key, the shared evidence store and readiness.

What stays on your servers

  • Your media. Laidline marks it where it is made or stored; no output is uploaded to Laidline.
  • Your models and the watermark models. Your generator never leaves your hosts; the watermark models run locally from $LAIDLINE_HOME/models.
  • Your keys. Signing keys stay in your KMS; payload keys stay in your files or your KMS (Payload keys). The one shared pool key is public by design, so a shared mark proves a Laidline mark and nothing more.
  • Your evidence log. It is written to your own files, S3 bucket or Postgres database, and it is the meter.

What does leave your network, and when:

Call When What it carries Turn it off
Timestamp server (DigiCert by default, Sectigo as fallback) each signed asset and each checkpoint a hash, never the media signing.tsa.url for your own server, or signing.tsa.required: false (the manifest then grades B at best)
Model downloads (Hugging Face and Meta's public download server) first use of each watermark model, or laidline models fetch a download of a pinned file, checked against its SHA-256 fetch once and copy $LAIDLINE_HOME/models to hosts without internet access
Issuing service (issue.laidline.com) once, at laidline register your email, legal name, signing certificate chain, payload key fingerprints, current issuer number and your acceptance of the customer agreement; no secrets. The issuer directory then shows your name and domain beside your registered number do not register
Licence renewal near the end of a licence, when registered a request for this deployment's renewed documents licence.auto_fetch: false
Usage report once a month, when registered counts only: credits per medium, private and shared mark counts, key fingerprints; never media, prompts or file names issuer.usage_report: false
Issuer directory when you run laidline issuer refresh a download of the signed directory snapshot do not run it
Another issuer's checker only when you run laidline detect --confirm the file you are checking, to the checker that issuer lists do not pass --confirm

Free and metered

  • Detection and verification are free in every licence state: laidline detect, /detect, laidline evidence verify and the bundle's verify.py never read the licence.
  • Marking is counted in credits per calendar month (UTC): 1 credit per image, 0.05 per second of audio, 0.2 per second of video, 0.05 per 1,000 tokens of text. Unmarked and failed outputs cost nothing, and up to 10 self-test marks a day are not counted.
  • Registration is free and gives you 1,200 credits a month of marks attributed to your name: 1,200 images, or 100 minutes of video, or 400 minutes of audio, or 24 million tokens of text. Paid plans raise the allowance; plans and prices are at laidline.com/licensing.
  • Marking never stops. Without registration, over the free allowance, or after a licence lapses, every output is still watermarked, signed and logged. What changes is the key: new marks are shared marks (detect reads "shared mark, provider not identified", grade D) instead of marks attributed to your registered name. Over the cap without a licence, the export still works but leaves out the filled-in compliance texts.

Licensing and metering has the full rules, and What a mark carries shows which key each state uses.

Limits

Watermarks survive ordinary handling, not every edit. A PixelSeal image decodes after a half crop in 87 of 100 cases and after WebP at quality 50 in 93 of 100 (Grading); a VideoSeal clip decodes after a social-media re-encode in 33 of 43 clips (Grading); a keyed audio payload needs about 10 s of audio (the floor is 8.0 s on the 20 ms grid), and tempo changes remove the mark (Audio); Opus at 12 kbit/s is best effort, 188 of 200 clips under deep scanning on a GPU (Benchmarks); and about half of text marks survive a paraphrase by the same model (SynthID-style 49.5 %, KGW 57.0 %; Robustness). A grade B confirmed by fingerprint guards against coincidence, not against a forger; only exact bytes and a trusted manifest resist forgery (Payload keys). Removal by a determined adversary is out of scope. On unmarked media the 2026-10 null campaign counted no false positive in 38,500 photos (upper bound 0.0100 %) or 4,854 video clips (0.079 %), and no text grade B in 40,000 reads; it also found two limits, unmarked music (7.25 % public presence in an unkeyed deployment) and the audio payload, which is built for speech of 8 s and more (Images, video, audio, text; Audio scope). Every measured figure, with its sample and interval, is on the Proof pages: Benchmarks and Robustness.

Licence

Laidline is published under the Laidline Source-Available Licence: you may read, run, modify and self-host it; you may not build a competing product or hosted service from it. Detection is free for everyone. The watermark models and other third-party components keep their own licences (Third-party licences).

Troubleshooting

Message Cause Fix
shared mark, provider not identified on your own marks the deployment is not registered, or a free registration crossed 1,200 credits this month run laidline register --email you@yourcompany.com --display-name "Yourcompany Inc" --accept-terms; see Licensing
claimed by trial number N, unconfirmed (several deployments may share this number) laidline init drew a trial issuer number, shared by design register to get a registered issuer number
/readyz answers 503 after laidline serve starts the start-up self-test cannot reach the timestamp server allow outbound HTTP to timestamp.digicert.com, set signing.tsa.url to your own server, or set signing.tsa.required: false
warning manifest_skipped:container_unsupported Opus, AAC and PCM audio cannot carry Content Credentials the watermark and the evidence entry are the provenance; write WAV, FLAC, MP3 or M4A when you need a manifest
video_disabled from POST /v1/mark/video video marking is off by default install laidline[video] and set watermark.video.enabled: true

Reference