1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="utf-8"> 5 6 7 8 9 10 11 12 13 <title>What Is TAPSIGNER? An NFC Bitcoin Hardware Signer</title> 14 15 16 17 <meta name="description" content="TAPSIGNER keeps a BIP-32 signing key on a separate NFC card while a compatible wallet constructs, displays, and broadcasts transactions."> 18 <meta name="author" content="TAPSIGNER®"> 19 20 <meta property="og:type" content="article"> 21 <meta property="og:site_name" content="TAPSIGNER®"> 22 <meta property="og:description" content="TAPSIGNER keeps a BIP-32 signing key on a separate NFC card while a compatible wallet constructs, displays, and broadcasts transactions."> 23 <meta property="og:title" content="What Is TAPSIGNER? An NFC Bitcoin Hardware Signer"> 24 <meta name="twitter:title" content="What Is TAPSIGNER? An NFC Bitcoin Hardware Signer"> 25 <meta name="twitter:description" content="TAPSIGNER keeps a BIP-32 signing key on a separate NFC card while a compatible wallet constructs, displays, and broadcasts transactions."> 26 27 <meta property="og:url" content="https://tapsigner.com/learn/what-is-tapsigner"> 28 <link rel="canonical" href="https://tapsigner.com/learn/what-is-tapsigner"> 29 30 <meta property="og:image" content="https://tapsigner.com/static/images/tapsigner-mockup.png"> 31 <meta property="og:image:alt" content="TAPSIGNER product image"> 32 <meta name="twitter:image" content="https://tapsigner.com/static/images/tapsigner-mockup.png"> 33 <meta name="twitter:image:alt" content="TAPSIGNER product image"> 34 35 36 <meta name="twitter:card" content="summary_large_image"> 37 <meta name="twitter:site" content="@TAPSIGNER"> 38 <meta name="twitter:creator" content="@TAPSIGNER"> 39 40 41 <meta name="viewport" content="width=device-width, initial-scale=1"> 42 43
43<script type="application/ld+json"> 44 { 45 "@context": "https://schema.org", 46 "@graph": [ 47 { 48 "@type": "Organization", 49 "@id": "https://coinkite.com/#organization", 50 "name": "Coinkite Inc.", 51 "url": "https://coinkite.com/" 52 }, 53 { 54 "@type": "WebSite", 55 "@id": "https://tapsigner.com/#website", 56 "url": "https://tapsigner.com/", 57 "name": "TAPSIGNER", 58 "publisher": {"@id": "https://coinkite.com/#organization"} 59 }, 60 { 61 "@type": "WebPage", 62 "@id": "https://tapsigner.com/learn/what-is-tapsigner#webpage", 63 "url": "https://tapsigner.com/learn/what-is-tapsigner", 64 "name": "What Is TAPSIGNER? An NFC Bitcoin Hardware Signer", 65 "description": "TAPSIGNER keeps a BIP-32 signing key on a separate NFC card while a compatible wallet constructs, displays, and broadcasts transactions.", 66 "isPartOf": {"@id": "https://tapsigner.com/#website"}, 67 "about": {"@id": "https://tapsigner.com/#product"}, 68 "inLanguage": "en" 69 } 70 71 , 72 { 73 "@type": "TechArticle", 74 "@id": "https://tapsigner.com/learn/what-is-tapsigner#article", 75 "headline": "What Is TAPSIGNER?", 76 "description": "TAPSIGNER keeps a BIP-32 signing key on a separate NFC card while a compatible wallet constructs, displays, and broadcasts transactions.", 77 "datePublished": "2026-07-10", 78 "dateModified": "2026-07-10", 79 "author": {"@type": "Organization", "name": "Coinkite Engineering"}, 80 "publisher": {"@id": "https://coinkite.com/#organization"}, 81 "mainEntityOfPage": {"@id": "https://tapsigner.com/learn/what-is-tapsigner#webpage"}, 82 "about": {"@id": "https://tapsigner.com/#product"}, 83 "inLanguage": "en" 84 } 85 86 , 87 { 88 "@type": "BreadcrumbList", 89 "@id": "https://tapsigner.com/learn/what-is-tapsigner#breadcrumb", 90 "itemListElement": [ 91 92 { 93 "@type": "ListItem", 94 "position": 1, 95 "name": "Home", 96 "item": "https://tapsigner.com/" 97 }, 98 99 { 100 "@type": "ListItem", 101 "position": 2, 102 "name": "Learn", 103 "item": "https://tapsigner.com/learn" 104 }, 105 106 { 107 "@type": "ListItem", 108 "position": 3, 109 "name": "What Is TAPSIGNER?", 110 "item": "https://tapsigner.com/learn/what-is-tapsigner" 111 } 112 113 ] 114 } 115 116 117 ] 118 } 119 </script>
119 120 121 122 123 124<!--[if lt IE 9]> 125
125<script type="text/javascript" src="/static/js/html5shiv.js"></script>
125 126<![endif]--> 127 128 129 130 <link rel="stylesheet" href="/static/semantic/semantic.min.css"/> 131 <link rel="stylesheet" href="/static/css/site-wide.css"/> 132
132<script src="/static/js/head.load.min.js"></script>
132 133 134 135 136 137 138<link rel="icon" href="/static/images/tapsigner-favicon.png"> 139 140
141<script src="https://analytics.ahrefs.com/analytics.js" data-key="IUoGC2EXMpdomQfybxy6RA" async></script>
141 142 143 144 145 146 <link rel="stylesheet" href="/static/css/content.css?v=20260710cafe"> 147 <link rel="stylesheet" href="/static/tapsigner/content.css?v=20260710cafe"> 148 149 150</head> 151 152<body> 153 154 155 156 <div id="coinkite-banner" data-skip-promo="true"></div> 157 158 159 <div id="top-navbar" class="ui fixed menu"> 160 <div class="ui container"> 161 162 163 164 <a href="/" class="header item" title="Homepage" 165 ><img id="top-navbar-image" src="/static/images/tapsigner-logo-oj.svg" alt="TAPSIGNER®"></a> 166 167 168 <button type="button" class="btn menu-toggle"> 169 <span></span> 170 </button> 171 <div class="menu-items"> 172 173 174 175 <a href="/learn" class="header item 176 active">Learn</a> 177 178 <a href="/start" class="header item 179 ">Get Started</a> 180 <a href="/faq" class="header item 181 ">F.A.Q</a> 182 <a href="https://dev.coinkite.cards" class="header item mobile hidden">SDK</a> 183 184 <a href="/#custom-branding" class="header item mobile hidden medium screen hidden">Custom Branding</a> 185 186 <a href="https://twitter.com/@TAPSIGNER" class="header item"><i class="blue large twitter icon"></i></a> 187 188 189 190 <div id="top-navbar-right-menu" class="right menu"> 191 192 193 <a href="https://satscard.com" class="header item medium screen hidden">SATSCARD</a> 194 195 196 <a href="https://satschip.com" class="header item medium screen hidden">SATSCHIP</a> 197 198 199 200 <div id="top-navbar-dropdown-button" class="ui dropdown item mobile hidden large screen hidden"> 201 More <i class="dropdown icon"></i> 202 <div id="top-navbar-dropdown-menu" class="menu"> 203 204 205 <a href="https://satscard.com" class="header item">SATSCARD</a> 206 207 208 <a href="https://satschip.com" class="header item">SATSCHIP</a> 209 210 211 <a href="/#custom-branding" class="header item">Custom Branding</a> 212 213 </div> 214 </div> 215 216 <a href="https://store.coinkite.com/store/tapsigner" class="header item"><i class="shopping 217 cart big icon"></i> Shop</a> 218 </div> 219 220 </div> 221 </div> 222 </div> 223 224 <div class="main-content-wrapper"> 225 226 227 <div class="ui main container"> 228 229<article class="content-page"> 230 <nav class="content-breadcrumbs" aria-label="Breadcrumb"> 231 232 233 <a href="/">Home</a><span aria-hidden="true">/</span> 234 235 236 237 <a href="/learn">Learn</a><span aria-hidden="true">/</span> 238 239 240 241 <span aria-current="page">What Is TAPSIGNER?</span> 242 243 244 </nav> 245 246 <header class="content-header"> 247 <p class="content-eyebrow">TAPSIGNER basics</p> 248 <h1>What Is TAPSIGNER?</h1> 249 <p class="content-deck">A reusable NFC Bitcoin hardware signer that works with a companion wallet.</p> 250 251 <p class="content-byline"> 252 By Coinkite Engineering · Published 2026-07-10 · Updated 2026-07-10 253 </p> 254 255 </header> 256 257 <div class="markdown content-body"> 258 <p><strong>TAPSIGNER is a reusable NFC Bitcoin hardware signer.</strong> A compatible wallet manages balances, constructs transactions, and shows the details; TAPSIGNER holds a BIP-32 private key on a separate card and signs after a tap and PIN. It is not a complete wallet interface and has no onboard display.</p> 259<h2>Why separate the signing key from the phone?</h2> 260<p>A phone wallet that stores its own private key can sign whenever software gains access to that key. TAPSIGNER changes the boundary: the phone keeps the public wallet information and asks a separate physical card to sign. Normal signing does not give the phone the unencrypted master XPRV.</p> 261<p>This can reduce exposure to key extraction from the phone. It does not make a compromised phone harmless. The companion wallet chooses the transaction digest sent for signing, and TAPSIGNER cannot show that transaction on its own screen because it has none.</p> 262<h2>What happens during setup</h2> 263<p>TAPSIGNER ships without a wallet private key. A compatible app supplies a 32-byte chain code, and the card generates a fresh random key pair using its internal true random number generator. The resulting BIP-32 master key incorporates both inputs, and the app can verify that its chain code was used.</p> 264<p>The default hardened derivation path is <code>m/84h/0h/0h</code>, commonly used as the account prefix for native SegWit single-signature wallets. Wallet software can select another hardened account path, including a path used by its multisig design. The card then signs at non-hardened receive/change subpaths selected for individual addresses.</p> 265<h2>What happens when you sign</h2> 266<ol> 267<li>
267The compatible wallet constructs a Bitcoin transaction and calculates the digest that each input requires.</li> 268<li>You review the wallet's displayed destination, amount, fee, inputs, and change.</li> 269<li>The wallet connects to TAPSIGNER over NFC and authenticates with the current CVC/PIN through an encrypted session.</li> 270<li>TAPSIGNER signs the requested digest at the applicable derivation path.</li> 271<li>The wallet adds the signature, finalizes when policy requirements are met, and broadcasts when you choose.</li> 272</ol> 273<p>The card authorizes a digest, not a human-readable payment. The review in step two is therefore part of the security model, not decoration.</p> 274<h2>Backup without seed words</h2> 275<p>TAPSIGNER does not use a BIP-39 mnemonic. Its backup command exports a small file containing the master XPRV and current derivation path, encrypted with AES-128-CTR. The fixed 128-bit decryption key is printed in hexadecimal on the card.</p> 276<p>Recovery needs the encrypted file and a preserved copy of that printed key. A complete wallet recovery may also need the wallet descriptor or configuration, script type, cosigner XPUBs, and quorum. There is no protocol command to restore an XPRV onto a replacement TAPSIGNER; recovery uses the key outside the original card.</p> 277<p>Read the complete <a href="/guides/backup-recovery">backup and recovery guide</a> before funding a new wallet.</p> 278<h2>PIN/CVC behavior</h2> 279<p>The initial CVC is printed on the card. After at least one backup has been completed, it can be changed to a numeric value between 6 and 32 digits. The old factory value no longer works, and there is no reset path if the new PIN is forgotten.</p> 280<p>Do not store the working PIN with the card. Do preserve the separate backup decryption key: changing the PIN does not change the fixed key printed for backup recovery.</p> 281<h2>TAPSIGNER compared with common options</h2> 282<table> 283<thead> 284<tr> 285<th>Option</th> 286<th>Where the signing key lives</th> 287<th>Independent transaction display</th> 288<th>Normal recovery</th> 289</tr> 290</thead> 291<tbody> 292<tr> 293<td>Phone-only hot wallet</td> 294<td>On the phone</td> 295<td>Phone only</td> 296<td>App's seed/backup model</td> 297</tr> 298<tr> 299<td>TAPSIGNER</td> 300<td>Separate NFC card</td> 301<td>No; companion wallet only</td> 302<td>Encrypted XPRV file + printed key + wallet configuration</td> 303</tr> 304<tr> 305<td>Display-equipped hardware wallet</td> 306<td>Separate hardware device</td> 307<td>Yes, device-dependent</td> 308<td>Device's documented seed/backup model</td> 309</tr> 310<tr> 311<td>SATSCARD</td> 312<td>One current bearer slot</td> 313<td>No</td> 314<td>Unseal that slot and sweep</td> 315</tr> 316</tbody> 317</table> 318<h2>Who it is for</h2> 319<p>TAPSIGNER fits a user who wants convenient mobile signing without keeping the signing key in the phone, or a multisig user who wants a compact independent cosigner. Developers can integrate it through the public protocol.</p> 320<p>Use a display-equipped hardware wallet when on-device transaction review is required, and use <a href="https://satscard.com/">SATSCARD</a> when the goal is to hand funded bitcoin to a new owner. Next, <a href="/wallets">choose a compatible wallet</a> or review <a href="/learn/screenless-signer">screenless signer tradeoffs</a>.</p> 321 </div> 322 323 324 <section class="content-sources" aria-labelledby="sources-heading"> 325 <h2 id="sources-heading">Official sources</h2> 326 <p>Protocol claims on this page were checked against these first-party sources on 2026-07-10.</p> 327 <ul> 328 329 <li><a href="https://github.com/coinkite/coinkite-tap-proto/blob/6ea18e9e94b5cc877885a9dd92518c28e814e251/docs/protocol.md">Coinkite Tap Protocol specification (commit 6ea18e9)</a></li> 330 331 <li><a href="https://github.com/coinkite/coinkite-tap-proto/blob/6ea18e9e94b5cc877885a9dd92518c28e814e251/docs/best-practices.md">Coinkite Tap Protocol best practices (commit 6ea18e9)</a></li> 332 333 <li><a href="https://github.com/coinkite/coinkite-tap-proto/blob/6ea18e9e94b5cc877885a9dd92518c28e814e251/docs/tapsigner-hints.md">TAPSIGNER developer hints (commit 6ea18e9)</a></li> 334 335 </ul> 336 </section> 337 338 339 <aside class="content-correction"> 340 Found a technical error? <a href="mailto:[email protected]">Tell Coinkite support</a>.
341 </aside> 342</article> 343 344 </div> 345 346 </div> 347 348 349 <div id="footer" class="ui inverted footer segment"> 350 <div class="ui stackable grid container"> 351 <div class="ui four wide middle aligned column mobile hidden"> 352 353<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="132px" height="24.831px" viewBox="0 0 132 24.831" enable-background="new 0 0 132 24.831" xml:space="preserve"> 354<g> 355 <g> 356 <path fill="#F16422" d="M0,12.557C0,5.229,5.514,0.284,12.664,0.284c5.193,0,8.217,2.811,9.889,5.799l-4.339,2.135 357 c-0.996-1.921-3.131-3.45-5.549-3.45c-4.34,0-7.471,3.309-7.471,7.79c0,4.482,3.131,7.79,7.471,7.79 358 c2.419,0,4.553-1.529,5.549-3.45l4.339,2.1c-1.672,2.952-4.696,5.834-9.889,5.834C5.514,24.83,0,19.849,0,12.557z"></path> 359 <path fill="#F16422" d="M24.366,15.794c0-4.873,3.414-9,9.071-9c5.692,0,9.107,4.126,9.107,9c0,4.874-3.414,9.037-9.107,9.037 360 C27.781,24.83,24.366,20.668,24.366,15.794z M37.848,15.794c0-2.667-1.565-4.98-4.411-4.98c-2.811,0-4.375,2.312-4.375,4.98 361 c0,2.704,1.565,5.016,4.375,5.016C36.282,20.81,37.848,18.498,37.848,15.794z"></path> 362 <path fill="#F16422" d="M45.493,2.668C45.493,1.174,46.703,0,48.162,0c1.494,0,2.703,1.174,2.703,2.668 363 c0,1.494-1.209,2.703-2.703,2.703C46.703,5.371,45.493,4.162,45.493,2.668z M45.92,24.403V7.221h4.517v17.182H45.92z"></path> 364 <path fill="#F16422" d="M66.516,24.403V14.016c0-2.383-1.245-3.201-3.166-3.201c-1.778,0-3.131,0.996-3.913,1.992v11.597h-4.518 365 V7.221h4.518v2.205c1.104-1.281,3.237-2.633,6.013-2.633c3.805,0,5.619,2.134,5.619,5.479v12.13L66.516,24.403L66.516,24.403z"></path> 366 <path fill="#F16422" d="M86.648,24.403l-4.554-6.617l-2.063,2.206v4.412h-4.517V0.675h4.517v14.193l6.511-7.648h5.548l-6.795,7.79 367 l7.008,9.391L86.648,24.403L86.648,24.403z"></path> 368 <path fill="#F16422" d="M94.151,2.668c0-1.494,1.21-2.668,2.668-2.668c1.494,0,2.704,1.174,2.704,2.668 369 c0,1.494-1.209,2.703-2.704,2.703C95.361,5.371,94.151,4.162,94.151,2.668z M94.579,24.403V7.221h4.518v17.182H94.579z"></path> 370 <path fill="#F16422" d="M104.501,20.099v-8.928h-2.845v-3.95h2.845V2.524h4.519v4.697h3.485v3.95h-3.485v7.718 371 c0,1.103,0.57,1.921,1.565,1.921c0.676,0,1.317-0.249,1.566-0.533l0.96,3.45c-0.676,0.605-1.885,1.103-3.77,1.103 372 C106.173,24.83,104.501,23.194,104.501,20.099z"></path> 373 <path fill="#F16422" d="M114.497,15.794c0-4.98,3.699-9,8.893-9c5.158,0,8.61,3.842,8.61,9.427v1.068h-12.772 374 c0.321,2.098,2.028,3.842,4.945,3.842c1.459,0,3.451-0.605,4.553-1.672l2.028,2.988c-1.708,1.566-4.412,2.383-7.079,2.383 375 C118.445,24.83,114.497,21.308,114.497,15.794z M123.39,10.494c-2.811,0-4.02,1.957-4.197,3.664h8.466 376 C127.517,12.522,126.379,10.494,123.39,10.494z"></path> 377 </g> 378</g> 379</svg> 380 381 </div> 382 383 <div class="ui four wide middle aligned column mobile hidden"> 384 <a href='https://coinkite.com/terms'>Terms of Sale</a> 385 | <a href='https://coinkite.com/terms-of-use'>Terms of Use</a> 386 </div> 387 388 <div class="ui four wide middle aligned column mobile hidden"> 389 Get yours <a href="https://store.coinkite.com/store/tapsigner">here</a> 390 </div> 391 392 <div class="ui four wide middle aligned column center aligned"> 393 Copyright © 2026 394 by <a href="https://coinkite.com">Coinkite Inc.</a> 395 </div> 396 </div> 397 </div> 398 399 400<div class="ui basic modal js-busy-modal"> 401 <div class="ui icon header"> 402 <i class="notched circle loading icon"></i> 403 <span class='js-message'>Wait...</span> 404 </div> 405 <div class="actions"> 406 <div class="ui red basic cancel inverted button"> 407 <i class="remove icon"></i> 408 Dismiss 409 </div> 410 </div> 411</div> 412 413 414 415 416 417 418 419 420 421 422
422<script 423 src="https://code.jquery.com/jquery-3.6.0.min.js" 424 integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" 425 crossorigin="anonymous"></script>
425 426 427 428 429 430
430<script> 431 head.load( 432 "/static/semantic/semantic.min.js", 433 434 "/static/js/qrcode.min.js", 435 "/static/code.js" 436 ); 437 </script>
437 438 439 440<!--[if lte IE 9]> 441
441<script src="/static/js/respond.min.js"></script>
441 442<![endif]-->
vendor: 73 bytes, lines 442-446
442 443 444 445 446 <script async src="https://www.googletagmanager.com/gtag/js?id=
446G-S4ZH8N241C
vendor: 16 bytes, lines 446-447
446"></script> 447
447<script> 448
vendor: 145 bytes, lines 448-451
448window.dataLayer = window.dataLayer || []; 449 function gtag(){dataLayer.push(arguments);} 450 gtag('js', new Date()); 451 gtag('config', '
451G-S4ZH8N241C
vendor: 8 bytes, lines 451-452
451'); 452
452</script>
452 453 454 455 456
457<script src="/static/js/menu.js?v=20260710cafe"></script>
vendor: 1 bytes, line 457
457
458<script> 459 head.ready(function() { 460 // Initialize Semantic UI's dropdown menu. 461 $('.ui.dropdown').dropdown(); 462 }); 463</script>
463 464 465
466<script src="//coinkite.com/static/banner/banner.js"></script>
466 467 468
469<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"6d9e3da3c53d44ba87a885b9dd44d41a","r":1,"spa":2}' crossorigin="anonymous"></script>
469 470</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.