ScanBridge
local scanning service
Windows 10/11 · TWAIN & WIA

Scanning
infrastructure
for web apps

A 1.5 MB local service answers plain HTTP on the user's own machine. Any web app in the browser can scan through it. No plug-in, no applet, no SDK you are locked into.

1.5 MB
installer
127.0.0.1
endpoint
0
browser plug-ins
$ curl http://127.0.0.1:18625/scanners copy
The ScanBridge scan dialog

Pages
1
2
3
scans.pdf
Page 1, rotated in the editor
Page 2
Page 3
1 / 3
File details
File namescans.pdf
Size171 KB · 3 pages
Assembledin the browser
Why a service

Not a library.
Infrastructure.

Browsers removed the plug-ins, applets and ActiveX controls that used to reach a scanner. We did not replace them with another thing that lives inside the page.

01
One install.
Every internal app.

The MSI installs for the signed in user, without administrator rights. From then on every internal web app on that machine talks to the same local endpoint. No second application for anyone to keep up to date.

one install, every internal app
ERPCRMDMSHR portal 127.0.0.1:18625
02
Plain HTTP,
not an SDK

Our web component is one way to call it. Anything else running in that browser is another.

terminal
$ curl http://127.0.0.1:18625/scanners

[
    {
        "id": "brother-ads-2800w",
        "name": "Brother ADS-2800W",
        "source": "TWAIN"
    }
]
03
Nothing to
rewrite

The contract is five endpoints on the loopback address, not a client library you inherit. Change the framework, or drop our web component entirely, and the same calls still work.

the whole contract
GET/statusis the service running GET/readyone verdict, service and licence GET/scannersdevices this machine can see POST/scanner-optionswhat that device supports POST/scanone scan
What it does

Everything the
device reports.

The dialog only ever offers what the connected scanner actually supports. The plans stack, so each one carries everything below it.

Starter
the scan itself
  • Device discovery
    TWAIN and WIA drivers on that machine, with refresh
  • Paper size
    A4, A5, US Letter, from the list the device reports
  • Colour mode
    Colour, greyscale, black and white
  • Resolution
    From the device list, 300 DPI by default
  • Native scanner dialog
    Hand over to the scanner's own TWAIN window
  • PDF, PNG, JPG
    PDF is assembled in the browser, not on a server
  • Light and dark
    Two ready made looks, or follow Windows
  • One page at a time
    A Starter session holds a single page. Scanning a stack starts at Professional.
Professional
the stack, and fixing it
  • Feeder and duplex
    Both sides in one pass, if the device has it
  • Brightness and contrast
    Ranges taken from the device
  • Multi-page session
    Scan a stack, not a sheet. Up to 100 pages in one document.
  • Reorder and remove
    Drag the thumbnails, type a position, drop a page, clear all
  • Editor
    Rotate, flip, crop, brightness, contrast, greyscale, on canvas
and everything in Starter
Device discovery
Paper size
Colour mode
Resolution
Native scanner dialog
PDF, PNG, JPG
Light and dark
Enterprise
your product, your language
  • Eight languages
    English, Arabic, Spanish, French, German, Russian, Italian, Brazilian Portuguese
  • Built to order
    A language, a scan setting or a step in your workflow that we do not ship yet. Tell us and it goes into the product.
  • Interface customisation
    Beyond light and dark: reshape the dialog so it carries your own product's look
  • Priority support
    Your requests move to the front of the queue
and everything in Starter and Professional
Device discovery
Paper size
Colour mode
Resolution
Native scanner dialog
PDF, PNG, JPG
Light and dark
Feeder and duplex
Brightness and contrast
Multi-page session
Reorder and remove
Editor
Integration

One tag.
One event.

The web component is a custom element. Drop it in the page, listen for one event, and you have the file. Everything else is optional.

full integration guide at scanbridge.dev/install →
what you write
import '@scanner/web'

<scanner-widget
  license-key="SB-…"   // issued by us, bound to your domain
  file-type="pdf"
  lang="en">
</scanner-widget>

const scanner = document.querySelector('scanner-widget')

scanner.addEventListener('saved', e => {
  upload(e.detail.blob)
})

scanner.addEventListener('closed', onClosed)

scanner.show()
what you get back
// event.detail, for file-type="pdf"
{
  "fileType": "pdf",
  "blob": Blob   // application/pdf
}

// for png or jpg, one entry per page
{
  "fileType": "png",
  "pages": [ {
    id,
    name,
    url,
    mimeType,
    blob
  } ]
}
The port finds itselfThe client walks 18625 to 18630, takes the one the service answers on, and remembers it. You never configure it.
The component is optionalIt is one caller. Anything else running in that browser can call the same endpoints.
Rollout

If the service
is not there yet.

Two ways it gets onto the machine, and the widget handles both. Neither of them ends with a support ticket.

scanner-widget
The install dialog the widget shows when the service is missing
path one
The user installs it

The widget notices the service is not answering and offers the installer itself. Download, install, then Verify. No link to send, nothing to explain.

1.5 MB installer2.5 MB on diskno admin rights required
path two
The administrator pushes it

One MSI, pushed to your users the usual way. Those users never see the dialog on the left at all.

the download always resolves to the current build
Security

The scan stays
on the machine.

Nothing is uploaded to make scanning work. What your application does with the file afterwards is your decision, not ours.

where the image goes
1
Scanner
TWAIN or WIA driver on that machine
2
Local service
Answers on 127.0.0.1, nowhere else
3
The page
Pages arrive as blobs and the PDF is merged here
4
Wherever you send it
Your handler, your server, your rules
Steps 1 to 3 never leave the machine.
Step 4 is your code.
The user never types a key

You set the licence key once, in your own bundle. The helper activates it quietly on the first scan.

license-key, set by you
Bound to your domains

The licence carries an allow-list of origins. A key copied out of your bundle does not work on somebody else's host.

origin allow-list
Fail closed

Without a valid verdict the scan flow does not open. There is no client-side switch that lets it through anyway.

no scan without a verdict
Offline, but not forever

An activated machine keeps working without a connection until the licence really expires. A revocation on the server always beats the cached answer.

revocation wins
Limits

Windows only.
Said up front.

The browser is not the limit. The operating system is. Better you find that out here than three meetings into a purchase order.

Operating system
Windows 10 and 11x86 and x64. Windows 10 needs .NET Framework 4.8, which every build since the May 2019 update already carries.
Browsers
Any modern browser on that machineChrome, Edge and Firefox tested. Nothing in the client is Chromium specific.
Drivers
TWAIN or WIAA device that exposes neither is invisible to us. We do not talk to hardware directly.
Not supported
Internet Explorer, and anything that is not WindowsmacOS, Linux and mobile have no service to talk to. No date we are willing to promise.
Pricing

Per application.
Not per seat.

One licence covers one production application and every internal user inside it. Nobody counts heads. Prices in USD.

PlanMonthlyYearly Lifetime pay once
Starterthe scan itself
$199
$1,990
$6,900
Professionalthe stack, and fixing it
$349
$3,490
$10,900
Enterpriseyour product, your language
$599
$5,990
$17,900
14 days on the Professional setAsk us for a trial key. Same paperwork as buying, without the invoice.
One domain per licenceThe key is bound to it. More domains are arranged separately.
Questions

Asked before
every purchase.

These come up before the paperwork starts, every time. If yours is not here, the address is at the bottom of this page.

01

Can we build before we have a domain?

Yes. Every key we issue covers localhost alongside the production domain you name. Additional live domains, staging included, are arranged with us.

02

Does it work with our framework?

Yes. The widget is a plain custom element, so anything that renders HTML can mount it: React, Angular, Vue, or a server rendered page. Ready made snippets for each are in the install docs.

03

How do we get a key?

You talk to us and we issue it, bound to your domain. A trial key is the same procedure without the invoice.

04

On how many machines can we install it?

As many as you need. The licence covers one application, not a count of machines or users, so the installer goes on every workstation that has a scanner, for each user who scans there.

05

Does the installer need administrator rights?

No. A standard user can run it, because it installs for that user rather than for the whole machine. Who runs it is your policy, not our requirement.

06

Does the end user have to activate anything?

No. You set license-key once in your page. The service activates that machine silently at the first scan.

07

Does it work over remote desktop?

The rule never changes: the browser and the service run on the same Windows machine, and that machine has to see the scanner as a TWAIN or WIA device. If your remote session forwards the scanner that far, we find it, because we ask the driver and never the hardware. If you are planning a terminal server rollout, talk to us before you buy.

Contact

Get a key.
Ask anything.

Tell us the domain the licence should run on and what you are building. A trial key is the same request, without the invoice.

Guided demo
We walk you through it On a machine with a real scanner. Pick it in the form.
Install docs
scanbridge.dev/install Snippets per framework, the full event payload, the MSI
Email
hello@scanbridge.dev If you would rather not fill in a form

We use this to answer you and to issue the key. Nothing else.