https://github.com/MetaMask/tkey
Whitelabel, design and own the full UI/UX with Self-host Web3Auth (tKey). All of the power of threshold key management at your fingertips
https://github.com/MetaMask/tkey
Last synced: 4 months ago
JSON representation
Whitelabel, design and own the full UI/UX with Self-host Web3Auth (tKey). All of the power of threshold key management at your fingertips
- Host: GitHub
- URL: https://github.com/MetaMask/tkey
- Owner: MetaMask
- License: other
- Created: 2020-08-20T03:16:17.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2025-06-06T08:48:40.000Z (8 months ago)
- Last Synced: 2025-09-23T03:02:03.388Z (4 months ago)
- Language: TypeScript
- Homepage:
- Size: 25.9 MB
- Stars: 179
- Watchers: 9
- Forks: 50
- Open Issues: 27
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
Awesome Lists containing this project
README
# tKey
[](https://lerna.js.org/)
[](https://github.com/prettier/prettier)

tKey is the underlying SDK used to implement [Web3Auth Plug n Play](https://github.com/web3auth/web3auth). This package can also be used to self host Web3Auth in your own system. tKey stands for Threshold Key, which refers to the management keys & shares generated using threshold cryptography.
## The `tKey` SDK
The `tKey` SDK manages private keys by generating shares of it using Shamir Secret Sharing. For example, for a 2 out of 3 (2/3) setup, we give the
user three shares: ShareA, ShareB, and ShareC.
- **ShareA** is stored on the userβs device: Implementation is device and system specific. For example, on mobile devices, the share could be stored
in device storage secured via biometrics.
- **ShareB** is managed and split across Web3Auth's Auth Network, accessed by an OAuth login provider that a user owns.
- **ShareC** is a recovery share: An extra share to be kept by the user, possibly kept on a separate device, downloaded or based on user input with
enough entropy (eg. password, security questions, hardware device etc.).
Similar to existing 2FA systems, a user needs to prove ownership of at least 2 out of 3 (2/3) shares, in order to retrieve his private key.
For more information, check out the [technical overview](https://hackmd.io/Tej2tf83SZOxZmz70ObEpg). Before integrating you can also check out the example for [tKey](https://github.com/tkey/tkey-example).
### To use the SDK in your application, please refer to our [SDK Reference](https://web3auth.io/docs/sdk/self-host/installation) in Web3Auth Documentation
## Features
- Typescript compatible. Includes Type definitions
- Fully composable API
- Module support (Include only those modules which you require)
- [Audited](https://github.com/tkey/audit)
## Packages
| Packages | `@latest` Version | Size | Description |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------- |
| π **tKey Standard Package** |
| `@tkey/default` | [](https://www.npmjs.com/package/@tkey/default/v/latest) | [](https://bundlephobia.com/result?p=@tkey/default@latest) | Bundles `Core` and `Modules` into one importable package |
| π **Core** |
| `@tkey/core` | [](https://www.npmjs.com/package/@tkey/core/v/latest) | [](https://bundlephobia.com/result?p=@tkey/core@latest) | Core functionalities for creating a tkey |
| πβπ¦Ί **Service Provider** |
| `@tkey/service-provider-torus` | [](https://www.npmjs.com/package/@tkey/service-provider-torus/v/latest) | [](https://bundlephobia.com/result?p=@tkey/service-provider-torus@latest) | `@service-provider-base` with DirectAuth functionality |
| π³ **Storage Layer** |
| `@tkey/storage-layer-torus` | [](https://www.npmjs.com/package/@tkey/storage-layer-torus/v/latest) | [](https://bundlephobia.com/result?p=@tkey/storage-layer-torus@latest) | get/set metadata for various shares |
| π **Modules** |
| `@tkey/chrome-storage` | [](https://www.npmjs.com/package/@tkey/chrome-storage/v/latest) | [](https://bundlephobia.com/result?p=@tkey/chrome-storage@latest) | Add/remove a share from chrome extension storage |
| `@tkey/web-storage` | [](https://www.npmjs.com/package/@tkey/web-storage/v/latest) | [](https://bundlephobia.com/result?p=@tkey/web-storage@latest) | Add/remove a share from local and file storage |
| `@tkey/security-questions` | [](https://www.npmjs.com/package/@tkey/security-questions/v/latest) | [](https://bundlephobia.com/result?p=@tkey/security-questions@latest) | Add/remove a security question and password as a share for tkey |
| `@tkey/share-transfer` | [](https://www.npmjs.com/package/@tkey/share-transfer/v/latest) | [](https://bundlephobia.com/result?p=@tkey/share-transfer@latest) | Transfer share from another device |
| `@tkey/seed-phrase` | [](https://www.npmjs.com/package/@tkey/seed-phrase/v/latest) | [](https://bundlephobia.com/result?p=@tkey/seed-phrase@latest) | Store and use seedphrases on metadata |
| `@tkey/private-keys` | [](https://www.npmjs.com/package/@tkey/private-keys/v/latest) | [](https://bundlephobia.com/result?p=@tkey/private-keys@latest) | Store extra private keys on tKey metadata |
| `@tkey/share-serialization` | [](https://www.npmjs.com/package/@tkey/share-serialization/v/latest) | [](https://bundlephobia.com/result?p=@tkey/share-serialization@latest) | Import/export a share from tKey |
| π **Low-Level** |
| `@tkey/common-types` | [](https://www.npmjs.com/package/@tkey/common-types/v/latest) | [](https://bundlephobia.com/result?p=@tkey/common-types@latest) | Shared [TypeScript](https://www.typescriptlang.org/) Types |
## Building the SDK Locally
### Requirements
- This package requires a peer dependency of `@babel/runtime`
- Node 18+
### Installation
```
npm install
npm run pack:lerna
```
## Bundling
Each sub package is distributed in 3 formats
- `esm` build `dist/.esm.js` in es6 format
- `commonjs` build `dist/.cjs.js` in es5 format
- `umd` build `dist/.umd.min.js` in es5 format without polyfilling corejs minified
By default, the appropriate format is used for your specified usecase
You can use a different format (if you know what you're doing) by referencing the correct file
The cjs build is not polyfilled with core-js.
It is upto the user to polyfill based on the browserlist they target
### Directly in Browser
CDN's serve the non-core-js polyfilled version by default. You can use a different
jsdeliver
```js
```
unpkg
```js
```
### Tips for NUXT
This is a plugin that works [only on the client side](https://nuxtjs.org/guide/plugins/#client-side-only). So please register it as a ssr-free plugin.