How to Add Commenting and Annotations To Your Nutrient PDF Viewer (a build-vs-buy breakdown) September 2026
Want comments and annotations on your Nutrient PDF viewer? Compare build vs. buy costs and see how Velt ships the full stack in days. (September 2026)

TLDR:
Velt is review and approval infrastructure for Nutrient PDF Viewer teams.
- Building threaded comments on Nutrient PDF Viewer from scratch takes 4 to 6 months across data modeling, sync, permissions, and edge cases.
- Annotation anchoring is the hardest part: pixel-coordinate approaches drift silently when PDFs reflow or zoom levels shift.
- Audit trails and permissions can't be retrofitted after the fact. Both require the right schema decisions in week one.
- Build only if you need to hook into Nutrient's display pipeline below the DOM, or if compliance bars every external data processor.
- Velt provides review and approval infrastructure that layers comments, presence, approval workflows, and audit trails on top of Nutrient in days.
Why Nutrient PDF Viewer Teams Weigh Building vs Buying Commenting
Nutrient PDF Viewer gives you a solid display engine and a clean API surface. What it doesn't ship with is a review layer: no threaded comments, no annotation tools, no presence indicators, no approval states. Velt fills that gap directly as review and approval infrastructure, layering comments, approval workflows, presence, notifications, audit trails, and recording on top of Nutrient's display layer. That gap is intentional on Nutrient's part, but it means every team embedding the viewer faces the same decision: build commenting yourself, or bring in something purpose-built.
The build path looks deceptively short at first. You wire up a comment sidebar, store threads in your database, and call it done. But the real scope shows up later: anchor stability when pages reflow, permission scoping per document, real-time sync across reviewers, audit trails for compliance, notification routing, and the mobile edge cases that break coordinate-based anchoring. A realistic from-scratch build runs 4 to 6 months of engineering time, spread across data modeling, sync infrastructure, UI components, and permissions integration.
The buy path trades that time for integration work upfront and an ongoing vendor dependency. The right call depends on how central document review is to your product, and whether your team's time is better spent on features that move the product forward or collaboration plumbing. See the full build vs buy collaboration software breakdown for a deeper framework.
What "Commenting" Actually Means on a Nutrient PDF Viewer
Before you can decide whether to build or buy annotation support for your Nutrient PDF viewer, you need to be clear on what "commenting" actually covers. The surface looks simple. It isn't. Adobe's guide to PDF annotation and document review shows how many distinct actions fall under the umbrella of "annotating a PDF."
There are two distinct layers here:
- Native PDF annotations follow the PDF spec (ISO 32000) and get stored inside the file itself. Select a sentence, drop a sticky note, draw a markup. These travel with the document wherever it goes, and Nutrient's viewer displays them natively.
- Collaboration comments are a different thing entirely. These are threaded conversations anchored to document content, with resolved states, @mentions, reactions, and real-time presence. They live in a database, not in the file.
Why the Distinction Matters for Developers
Nutrient handles the first layer well out of the box. The second layer is where teams run into trouble.
Building threaded comments with real-time sync, user presence, and persistent state on top of a PDF viewer means wiring together websockets, a comments data model, auth, and UI components from scratch. That's typically 4 to 6 months of engineering time before you have something production-ready. Velt is review and approval infrastructure that covers that second layer entirely: see comments and annotations built for Nutrient. Your team ships the feature without the build.
The Hidden Engineering Cost of Building It Yourself for a Nutrient PDF Viewer
Building annotation support for a Nutrient PDF viewer from scratch sounds manageable at first. Then you start listing what actually needs to ship.
Comment threading, user presence, sticky annotations that survive document re-draws, permission layers, audit trails, real-time sync across concurrent reviewers, notifications, and mobile support. Each of these is its own project. Together, they represent roughly 4 to 6 months of engineering time for an experienced team, with the breakdown looking something like this: one month for the data model and sync layer, one month for UI components, one month for permissions and auth integration, and one to two months for edge cases like DOM instability, conflict resolution, and offline states.
What Gets Underestimated
The pieces that blow up timelines tend to be the ones that look solved until they aren't.
- Annotation anchoring in a PDF context is harder than in a standard web app. PDFs reflow, pages re-render, and zoom levels shift coordinate systems. If your anchoring relies on pixel coordinates instead of stable element IDs, annotations drift silently. No error, no warning, just misplaced feedback by the time a second reviewer opens the file.
- Real-time sync requires conflict resolution logic. Two reviewers commenting on the same paragraph at the same moment will produce race conditions your data model needs to handle explicitly, not optimistically ignore.
- Permissions can't be bolted on later. If you build comment storage without access control baked into the schema, retrofitting reviewer-level vs. editor-level visibility is a rewrite, not a config change.
- Audit trails have the same problem. Once you need to prove who approved what and when, an append-only event log with immutable records is a hard architectural requirement. Building that after the fact means touching every write path in your system.
The opportunity cost matters too. Every sprint spent on annotation infrastructure is a sprint not spent on the features that actually set your product apart.
How Velt's Commenting Works on a Nutrient PDF Viewer
Velt is review and approval infrastructure, and adding it to a Nutrient PDF Viewer integration is straightforward. You install the SDK, wrap your viewer in a VeltProvider, and attach a VeltComments component. Velt supports editors, grids, and canvases beyond Nutrient as well. From there, Velt handles the rest.
Here's what that looks like in practice with a React-based Nutrient setup. Start by installing the dedicated Nutrient-Velt package alongside the core Velt SDK:
npm i @veltdev/nutrient-velt-comments
npm i @veltdev/reactYou can find the package on npm: @veltdev/nutrient-velt-comments. For the complete setup guide, see the Velt docs for Nutrient:
import { VeltProvider, VeltComments, VeltCommentTool } from '@veltdev/react';
export default function NutrientPDFViewer() {
return (
<VeltProvider apiKey="YOUR_API_KEY">
<VeltComments />
<div id="nutrient-viewer-container">
{/* Your Nutrient PSPDFKit viewer renders here */}
<VeltCommentTool />
</div>
</VeltProvider>
);
}
Once mounted, reviewers can pin comments to exact locations on the document. Threads stay anchored to DOM elements, not pixel coordinates, so they survive layout changes and zoom level changes without detaching.
What You Get Out of the Box
Beyond comment pinning, Velt ships with the full collaboration infrastructure stack:
- Threaded comments with @mentions, so reviewers can loop in teammates without leaving the document.
- Presence indicators that show who's viewing the PDF in real time, reducing duplicated review effort.
- Approval workflow builder with discrete states (approved, needs revision, rejected), giving document owners a clear audit trail.
- Notifications routed to email or Slack when a thread is updated or a status changes.
No custom state management. No backend for storing comment data. Velt handles sync, persistence, and access control so your team ships the feature in days, not the 4 to 6 months a from-scratch build typically consumes. That's review and approval infrastructure doing its job.
From Commenting to Review and Approval: What Teams Actually Need
Basic commenting gets teams started, but production document workflows demand more. Here's what that gap looks like in practice.
A reviewer leaves a comment on page 4 of a contract. The author replies. Someone else marks it resolved. Three days later, a compliance officer asks who approved the final version and when. If your commenting layer has no state model, no resolution tracking, and no audit trail, that question has no answer.
The features teams actually need go well beyond a text bubble:
- Comment threading and resolution states so conversations have a clear lifecycle, beyond an open-ended stream of replies.
- Annotation types beyond text, including drawing tools, shape overlays, and area selections that let reviewers point to exactly what they mean on a PDF page.
- Review and approval workflows with named statuses so documents move through defined stages instead of getting stuck in informal back-and-forth.
- Audit trails added to your SaaS product log every action with a timestamp and user ID, which compliance teams require and which are nearly impossible to backfill once omitted from the data model.
- Permission controls that scope what each role can see, comment on, or approve, because not every reviewer should see every thread.
Velt ships all of this as review and approval infrastructure: comments, approval workflows, presence, notifications, audit trails, and recording. Not a UI widget bolted on top. The distinction matters when you're integrating into a Nutrient PDF viewer: you need comment anchoring that survives page reflows, presence indicators that show who's looking at which page, and notification routing that actually reaches people. Building that from scratch on top of Nutrient's SDK takes months. The architecture decisions you make in week one determine whether you can add approval states to your app in week six or whether you're rewriting the data model instead.
Build vs. Buy: A Direct Comparison for Nutrient PDF Viewer Teams
The comparison table below captures the raw trade-offs, but numbers alone don't tell you when to build and when to buy. Understanding what review and approval infrastructure is helps clarify which category your requirements fall into. Two conditions make building defensible.
The first is when your annotation behavior needs to be tightly coupled to Nutrient's internal display pipeline in ways no third-party SDK can reach. If your product depends on hooking directly into Nutrient's document model at a level below the DOM, custom is your only path. The failure mode here is underestimating how long that work takes: a custom sync layer, a write-once audit store, a state machine for approvals, and a role model scoped per document each take weeks of engineering time before you ship anything reviewers can use.
The second is when your compliance requirements prohibit any external data processor entirely, with no self-hosting option accepted. Velt supports self-hosted data via DataProviders, which covers most compliance-restricted environments, but if your legal team has ruled out every third-party data path categorically, that forecloses the buy option regardless of features.
Outside those two conditions, the table speaks for itself. Three days to a working comment thread versus four to six weeks of custom build, with real-time sync, audit trails, approval workflow SDK, and enterprise permissions included. No hand-rolling required.
Build vs. Buy: A Direct Comparison for Nutrient PDF Viewer Teams
| Factor | Build from Scratch | Use Velt |
|---|---|---|
| Time to first working comment thread | 4 to 6 weeks | Days |
| Total engineering time | 4 to 6 months | Integration only (days to weeks) |
| Annotation anchoring | Custom (pixel coordinates risk silent drift) | DOM element IDs: survives zoom, scroll, reflow |
| Real-time sync | Must build WebSocket layer + conflict resolution | Included out of the box |
| Permissions and access control | Must be designed into schema from week one | Built-in, scoped per document and role |
| Audit trail | Requires append-only event log architecture from day one | Included: timestamped, attributed, immutable |
| Approval workflows | Custom state machine required | Named states (approved, needs revision, rejected) included |
| Notifications (email / Slack) | Must build routing and delivery | Included out of the box |
| Presence indicators | Requires custom WebSocket presence layer | Included out of the box |
| Compliance / self-hosted data | Full control, but full responsibility | Self-hosted via DataProviders covers most compliance-restricted environments |
FAQ
Can I add comments to a Nutrient PDF viewer?
Yes. You can build comment functionality directly on top of Nutrient's PDF viewer using Velt's SDK. Velt binds comment threads to stable document elements, not pixel coordinates, so threads stay anchored even when users zoom, scroll, or reflow the document.
Does Velt work with Nutrient's existing viewer setup?
Velt integrates alongside Nutrient without replacing it. You keep Nutrient handling PDF display; Velt layers in comments, presence, approval workflows, notifications, and audit trails on top of that existing setup.
How do you add commenting and annotations to a Nutrient PDF viewer without building from scratch?
Install the Velt SDK, wrap your Nutrient viewer in a VeltProvider, and attach a VeltComments component. Velt handles thread storage, real-time sync, permissions, and presence so you ship in days, not the 4 to 6 months a from-scratch build typically takes.
How long does it take to add Velt commenting to a Nutrient viewer?
Most teams ship in days, not the months a from-scratch build would require. The Velt SDK handles the data model, sync layer, UI components, and permissions so your team isn't building any of that from scratch.
Do annotation threads stay anchored when the PDF is zoomed or scrolled?
Yes. Because Velt binds comments to document element IDs instead of fixed coordinates, threads remain correctly positioned regardless of how the viewer state changes.
How does Velt keep comment threads anchored when a PDF is zoomed, scrolled, or reflowed inside a Nutrient viewer?
Velt binds threads to document element IDs, not pixel coordinates. When the viewer state changes through zoom, scroll, or page reflow, the anchoring survives because the element ID stays stable. Coordinate-based systems drift silently with no error and no warning.
What happens to comments if a PDF page is replaced or updated?
Velt stores comment context against stable identifiers. If your document structure changes, threads can be remapped instead of lost, giving you meaningful continuity across document versions.
What's the real engineering cost of building Nutrient PDF annotations yourself vs. using Velt?
A custom build runs 4 to 6 months for an experienced team: roughly one month each for the data model and sync layer, one month for UI components, one month for permissions and auth integration, and one to two months for edge cases like anchor drift, conflict resolution, and offline states. Velt ships all of that as prebuilt infrastructure, so your team skips the plumbing entirely.
Nutrient PDF viewer build vs. buy: when does building your own annotation layer actually make sense?
Building is defensible in two cases: your product requires hooks directly into Nutrient's internal display pipeline below the DOM layer, or your legal team has ruled out every third-party data processor with no self-hosting exception accepted. Outside those two conditions, Velt's self-hosted DataProviders cover most compliance-restricted environments and the time difference is measured in months.
What is the difference between native PDF annotations and collaboration comments on a Nutrient PDF viewer?
Native PDF annotations follow the ISO 32000 spec and live inside the file itself. Collaboration comments are threaded conversations stored in a database, with resolved states, @mentions, approval workflows, and real-time presence. Nutrient handles the first layer; Velt covers the second.