sklar.app / topaz-kipu
Installing the driver takes 10 minutes. Then Kipu throws away every signature you capture, and nothing in the browser tells you why.
Two settings cause it, and neither one is where you'd look. I found them rebuilding a clinic workstation where the pad worked, the signature drew fine, and every form came back rejected anyway. If you're staring at "No valid signature provided" right now, skip to signature compression.
Windows 11 Pro · Chrome · Topaz SigWeb · tested on a SignatureGem LCD 1x5 (T-L462-HSB-R)
Five links in the chain: the pad, the SigWeb service, an HTTPS call to tablet.sigwebtablet.com:47290, the Kipu page, and Kipu's server parsing the string it gets. One of the two problems below is the browser refusing to make that call. The other is the string.
CULPRIT 01
SigWeb hands the browser a compressed binary signature. Kipu's server only parses the uncompressed ASCII form, so it drops the signature and returns "No valid signature provided." Everything else tests clean, which is what makes this one expensive.
CULPRIT 02
Chrome won't let a public HTTPS site reach 127.0.0.1 anymore without permission. Kipu asks for the pad, the request dies after about two seconds, and the page offers mouse-only signing like nothing's plugged in.
Both fixes are one line. If the machine is already built, do those two and stop reading.
Kipu drives Topaz pads through SigWeb, a small Windows service that owns the USB device and answers HTTP requests from the browser. No Chrome extension, nothing to add to an extension allowlist. If a guide tells you otherwise, it's describing a different vendor.
The Topaz installer wants it, and Windows 11 doesn't ship with it turned on. From an administrator PowerShell window:
Enable-WindowsOptionalFeature -Online -FeatureName NetFx3 -All -NoRestart
That pulls from Windows Update, so the machine needs internet and it'll sit there a few minutes. Behind a network that blocks it, DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /Source:D:\sources\sxs works off mounted install media.
Download sigweb.exe from Topaz and run it as administrator. Topaz doesn't publish silent-install switches, so this is a click-through wizard. Take the defaults. They install the service, add the hosts entry, and drop the certificate covered in step 3.
Plug the pad in after the install finishes, then check that the service registered:
Get-Service | Where-Object { $_.DisplayName -match 'SigWeb' } | Format-List Name, DisplayName, Status, StartType
The person using this machine every day is probably a standard user with no rights to start services. Set SigWeb to Automatic so the pad is live before anyone logs in.
$svc = Get-Service | Where-Object { $_.DisplayName -match 'SigWeb' } | Select-Object -First 1
sc.exe config $svc.Name start= auto
Start-Service $svc.Name
Mind the space after start=. sc.exe is fussy about it and prints the usage text instead of doing anything.
An HTTPS page can't make plain HTTP requests to your machine; the browser kills it as mixed content. Topaz gets around this in a way you should know about, because otherwise you'll spend an hour hunting a certificate problem that isn't there.
The installer adds a line to C:\Windows\System32\drivers\etc\hosts pointing tablet.sigwebtablet.com at 127.0.0.1, and ships a real CA-issued certificate for that name. So the browser makes an ordinary, fully valid HTTPS request to a public-looking domain that resolves to the machine sitting in front of you. Check the mapping:
Select-String -Path C:\Windows\System32\drivers\etc\hosts -Pattern sigwebtablet
HTTPS answers on 47290, HTTP on 47289. Quick liveness check:
Invoke-RestMethod -Uri "https://tablet.sigwebtablet.com:47290/SigWeb/TabletState"
If that returns a value, the pad, driver, service and certificate are all fine. Stop debugging them. The two things still broken are in the next two steps.
Recent SigWeb builds default CompressionMode to 1. Older ones defaulted to 0. With it on, SigWeb returns the signature as a compressed binary blob, and Kipu's server wants the uncompressed ASCII form: coordinate numbers separated by CRLF. Anything else gets thrown out.
The failure looks nothing like an encoding problem. Pad lights up, signature draws smooth, dialog accepts it, form comes back with "No valid signature provided." I had two machines side by side, one working and one not, and this number was the only difference.
Read the current value:
Invoke-RestMethod -Uri "https://tablet.sigwebtablet.com:47290/SigWeb/CompressionMode?noCache=$([guid]::NewGuid())"
If it's anything but 0, set it:
Invoke-RestMethod -Method Post -Uri "https://tablet.sigwebtablet.com:47290/SigWeb/CompressionMode/0"
Invoke-RestMethod -Uri "https://tablet.sigwebtablet.com:47290/SigWeb/CompressionMode?noCache=$([guid]::NewGuid())"
The second line should print 0. It survives service restarts and reboots, but re-check it after any SigWeb upgrade, since an upgrade is exactly what puts it back. While you're here, confirm encryption is off too:
Invoke-RestMethod -Uri "https://tablet.sigwebtablet.com:47290/SigWeb/EncryptionMode?noCache=$([guid]::NewGuid())"
On a machine that works, the captured string is long and made of ASCII digits. On a broken one it's short and starts with binary bytes. In the Chrome console, on the Kipu form, after signing:
const v = document.querySelector('[name*="signature"]').value;
console.log(v.length, v.slice(0, 20));
About 5,000 characters starting with digits and line breaks is right. Around 1,400 characters of unprintable bytes means compression is still on.
Chrome treats a request from a public HTTPS site to a loopback address as Local Network Access and blocks it unless the site has permission. Kipu makes exactly that request: to SigWeb on 47290, and to a label printer service on 41951 if you run one.
When it's blocked, nothing errors in any useful way. The fetch hangs about two seconds, fails, and the signature dialog opens mouse-only. From inside the page it looks identical to a service that isn't running.
Set the policy machine-wide with a registry key Chrome reads at startup. No domain, Intune or group policy server involved. Swap the first URL for your own Kipu host:
$key = 'HKLM:\SOFTWARE\Policies\Google\Chrome\LocalNetworkAccessAllowedForUrls'
New-Item -Path $key -Force | Out-Null
$urls = @(
'https://yourclinic.kipuworks.com',
'https://tablet.sigwebtablet.com:47290',
'https://localhost:41951'
)
for ($i = 0; $i -lt $urls.Count; $i++) {
New-ItemProperty -Path $key -Name ($i + 1) -Value $urls[$i] -PropertyType String -Force | Out-Null
}
gpupdate /force
Chrome has to be fully quit and reopened, every window plus any background tray instance, before the policy takes. Check chrome://policy; the entry should show as applied with no conflict.
Grant Local Network Access through the browser prompt and Chrome files it as site data. Any "clear cookies and site data on exit" setting, which is a normal piece of a locked-down browser config, wipes it every time the browser closes. So the pad works today and is mysteriously gone tomorrow morning. The policy survives that.
Open a Kipu form that needs a signature and look at the console. Kipu keeps its pad integration in a namespace you can poke at directly:
Object.keys(window.KipuSignaturePad || {});
window.KipuSignaturePad?.Topaz && 'Topaz driver loaded';
Then time the call to the service from inside the page. This is the cleanest test of Local Network Access, since it's the same path Kipu uses:
const t = performance.now();
fetch('https://tablet.sigwebtablet.com:47290/SigWeb/TabletState?x=' + Math.random())
.then(r => console.log(r.status, Math.round(performance.now() - t) + 'ms'))
.catch(e => console.log('BLOCKED', Math.round(performance.now() - t) + 'ms', e.message));
A healthy machine answers 200 in single or low double-digit milliseconds. A blocked one fails at roughly 2,000 ms every time. The timeout is the tell.
Then sign a real form end to end. Open a fresh one; signing a form you already signed during testing won't hit the save path again.
| What you see | What it is |
|---|---|
| "No valid signature provided" after a clean capture | SigWeb CompressionMode isn't 0. See step 4. Most likely cause, and the least likely to look like one. |
| Only mouse signing is offered, pad ignored | Chrome is blocking the loopback call. Apply the policy in step 5 and restart Chrome all the way. |
| Works after a hard reload, not on a normal load | The page cached its capability check from a load that happened before the service was reachable. Ctrl+Shift+R once. If it happens at every login, SigWeb is starting after the browser; set the service to Automatic per step 2. |
| Works for the admin account, not for staff | Usually a service set to Manual, or a per-user helper app only the admin has ever launched. A machine-wide service plus a machine-wide policy removes the difference. |
| Worked yesterday, gone this morning | A browser set to clear site data on exit is throwing away a prompt-granted permission. Use the policy. |
| The SigWeb demo page works but Kipu doesn't | Hardware, driver, service and certificate are all fine. It's compression or Local Network Access. The demo page is same-origin with the service, so it never touches either one. |
| Nothing answers on port 47290 | The service is stopped, or the hosts entry is missing. Check both before anything else in this table. |
The Kipu-side driver choice, SigWeb versus the older SigPlus or another vendor entirely, is set once by a Kipu admin for the whole instance. It isn't per workstation. If signing already works somewhere else in your organization, that setting is right. Leave it alone.
Write down the SigWeb version from a machine that works. When a replacement machine misbehaves, comparing versions and the two settings above gets you there faster than anything else I tried.
Rule out the USB port and cable early. Use the liveness check in step 3 for that; the pad's backlight tells you nothing useful.
Written up after one long afternoon so the next person has a shorter one. If it saved you the afternoon, buy me a coffee ☕
Not affiliated with Topaz Systems or Kipu Health. Product names belong to their owners.