PageSourceSearch

https://tapsigner.com/learn/what-is-tapsigner

html tapsigner.com collected 2026-10-04 00:14:43 UTC 19,181 bytes, 470 lines download raw bytes

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 &nbsp;<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.