Skip to content

Repository files navigation

Jota

Jota

A Monero-inspired wallet for IOTA Rebased. Supports interactive mode, one-shot commands for scripting, a native GUI, and encrypted wallet files.

NOTE: This is an EARLY PROTOTYPE. USE AT YOUR OWN RISK.

Install

MethodCommand
Homebrewbrew tap franzos/tap && brew install jota
Debian/UbuntuDownload .debsudo dpkg -i jota_*_amd64.deb
Fedora/RHELDownload .rpmsudo rpm -i jota-*.x86_64.rpm
Guixguix install -L <panther> jota (Panther channel)

Pre-built binaries for Linux (x86_64), macOS (Apple Silicon, Intel), AppImage and DMG on GitHub Releases.

Quick start

# Launch the REPL (testnet by default)
jota
# Use a named wallet
jota --wallet mywallet
# One-shot commands for scripting
jota --cmd "balance"
jota --cmd "address" --json
jota --wallet mywallet --password-stdin --cmd "balance"< password.txt
# Use a specific account index (derives a different address from the same seed)
jota --account 1 --cmd "address"

On first launch you'll be prompted to create a new wallet or recover from a seed phrase. The wallet file is encrypted with your password (argon2id + AES-256-GCM).

Features

FeatureCLIREPLGUI
Send & receive IOTAYesYesYes
Send & receive tokensYesYesYes
NFTsYesYesYes
StakingYesYesYes
Transaction historyYesYesYes
.iota name resolutionYesYesYes
Sign & verify messagesYesYesYes
On-chain notarizationYesYesYes
Multi-accountYesYesYes
Multi-signatureYesYesYes
QR code (receive)--Yes
QR code scan (send)--TODO
Browser extension bridge--Yes
Balance chart--Yes
JSON output (--json)YesYes-
Faucet (testnet/devnet)YesYesYes

Hardware wallets

FeatureLedger
Connect & create walletYes
Transaction signingYes
Address verification on deviceYes
Multi-accountYes
Sign messageYes
Display seed phraseN/A

Ledger

Hardware wallet signing is supported via Ledger devices (Nano S, Nano S+, Nano X, Flex, Stax). The IOTA app must be installed and open on the device.

# CLI — select "Connect Ledger" when creating a new wallet
jota --wallet myledger
# GUI — click "Connect Ledger" on the welcome screen
jota-gui

Build with Ledger support:

cargo build --release --features ledger

GUI

Wallet LoginWallet dApp Connection in ChromeWallet dApp Connection in Chrome SucceedsWallet Staking

Launch the GUI with:

jota-gui
jota-gui --mainnet
jota-gui --devnet

The GUI supports wallet creation, recovery, sending/receiving IOTA, transaction history with pagination, staking/unstaking, a balance chart, multi-account switching, and password changes. The GUI requires X11 or Wayland on Linux.

Browser Extension

A companion browser extension bridges dApps (like the IOTA Wallet Dashboard) to the desktop wallet via Chrome Native Messaging. The extension implements the Wallet Standard, so any dApp using @iota/dapp-kit will discover it automatically.

Setup:

  1. Download jota-extension.zip from Releases and unzip it
  2. Open chrome://extensions, enable Developer mode, click "Load unpacked", select the unzipped folder
  3. Click the extension icon in the toolbar — copy the Extension ID
  4. In the wallet GUI, go to Settings → Browser Extension, paste the ID, click "Install Native Host"

When a dApp requests signing, the wallet GUI shows an approval modal. If the GUI is already running, Chrome-spawned instances act as headless relays (no duplicate window).

Tested with CyberPerp, IOTA Wallet Dashboard, Virtue Money, and others.

Build from source:

cd extension
npm install
node build.mjs

Commands

CommandAliasesDescription
balancebalShow wallet balance
addressaddrShow wallet address
transfer <addr> <amount>sendSend IOTA to an address
sweep_all <addr>sweepSend entire balance minus gas
show_transfers [in|out|all]transfers, txsShow transaction history
show_transfer <digest>txLook up a transaction by digest
stake <validator> <amount>Stake IOTA to a validator
unstake <object_id>Unstake a staked IOTA object
stakesShow active stakes and rewards
tokenstoken_balancesShow all coin/token balances
status [node_url]Show epoch, gas price, network, and node URL
faucetRequest testnet/devnet tokens
account [index]accShow current account or switch (e.g. account 3)
seedDisplay seed phrase (requires confirmation)
passwordpasswdChange wallet encryption password
multisig <subcommand>msMulti-signature operations (see below)
help [cmd]Show help
exitquit, qExit the wallet

Amounts are in IOTA (e.g. 1.5 for 1.5 IOTA). Tab completion is available in the REPL. All commands support --json output.

Multi-signature

IOTA's native multi-sig uses a weighted threshold scheme: each signer has a public key with a weight, and the address has a threshold. A transaction is valid when collected signatures' weights meet or exceed the threshold. Up to 10 participants per address, with mixed key schemes (Ed25519, Secp256k1, Secp256r1).

Participants share public keys and proposals via self-contained JSON files (.jota-multisig, .jota-proposal, .jota-sig) — no server required. Transaction contents are always decoded from the raw bytes, never from advisory metadata.

SubcommandDescription
multisig create <name>Interactive wizard to set up a new multisig address
multisig import <file>Import a .jota-multisig address definition
multisig export <name>Export a .jota-multisig for sharing with participants
multisig listList configured multisig addresses
multisig show <name>Show participants, weights, threshold, and on-chain balance
multisig remove <name>Remove a multisig config (local only)
multisig send <name> <recipient> <amount>Propose a transfer, exports .jota-proposal
multisig sign <file>Review and sign a .jota-proposal, exports .jota-sig
multisig add-sig <id> <file>Import a .jota-sig or updated .jota-proposal
multisig submit <id>Combine signatures and execute on-chain
multisig proposals [name]List pending proposals
multisig proposal <id>Show proposal details and signature status
multisig cancel <id>Mark a proposal as cancelled locally

Network

Testnet by default. Override with flags:

jota --mainnet
jota --devnet
jota --node https://custom-graphql-endpoint.example.com
jota --node http://localhost:9125/graphql --insecure

The --insecure flag allows plain HTTP connections (for local development). The network is stored in the wallet file. CLI flags override the stored config if explicitly set.

Storage

All persistent data lives in the XDG data directory (~/.local/share/jota/ on Linux, ~/Library/Application Support/jota/ on macOS). The socket uses $XDG_RUNTIME_DIR.

~/.local/share/jota/
├── default.wallet # encrypted (mode 0600)
├── mywallet.wallet
├── permissions.json # dApp origin permissions
├── transactions.db # SQLite cache (mode 0600)
└── multisig/
├── company-funds.json # multisig config (plain JSON)
└── proposals/
└── a3f7b2c1...full-hex.json # transaction proposal
$XDG_RUNTIME_DIR/jota/
└── gui.sock # single-instance relay

File format: argon2id-derived key + AES-256-GCM. Override the wallet directory with --wallet-dir.

Building

This is a Cargo workspace with three crates: core (shared library), cli, and gui, plus a browser extension.

# Rust (CLI + GUI)
cargo build --release
# Browser extensioncd extension && npm install && node build.mjs

Run tests:

# Unit tests
cargo test# Integration tests (hits testnet/devnet)
cargo test -- --ignored

License

MIT

About

JOTA - IOTA Desktop Wallet with support for dApp's and Harware Wallets (Ledger)

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Contributors

Languages