Desktop Wallet

ARK Desktop

Build Status Latest Version License: MIT


Latest Release

Installing via Package Managers

Arch Linux

Install via AUR:


pamac build ark-desktop

Mac OS X

Install via Homebrew:

brew cask install ark-desktop-wallet


Translations are part of our ARK Development and Security Bounty Program.

Full translations are considered to be Tier 3, while grammar fixes, typos, etc. are considered to be Tier 6.

Full translations should involve 5 tasks

  • Create a pull request for the language you are going to translate. If you have doubts about something, use English to explain them.
  • Translate the textual content of the application, using the English language file as the reference. To do that, a new file, with the language locale code should be created. The name of the file should be a valid RFC 5646 and should be located at src/renderer/i18n/locales/LANGUAGE.js. Thanks to vue-i18n-extract, it is possible to execute yarn i18n src/renderer/i18n/locales/LANGUAGE.js to find suggestions of missing translations.
  • Add the language to the English language file at the LANGUAGES key.
  • Update the date and time formats file to include the short and long format that are used commonly by native speakers.
  • Update the number formats file to include the preferred way of displaying currencies used commonly by native speakers.
  • Add the language at the I18N.enabledLocales array at the main configuration file. This step is necessary to make the language would not be available.
  • Execute the application. Go to the development section to learn how to install the requirements and execute it.




In Ubuntu the development files of libudev are necessary:

sudo apt-get install libudev-dev libusb-1.0-0-dev


  • Python 2.7
  • Visual Studio 2017

Node 12

To download, head over to here and download Node 12.

If you already have npm installed, you can run

npm install -g n
sudo n 12


Install the Yarn dependency manager

npm install -g yarn


List of commands

# Install Dependencies
yarn install

# Execute the application. Making changes in the code, updates the application (hot reloading).
yarn dev

# Lint all JS/Vue files in `src` and `__tests__`
yarn lint

# Lint, and fix, all JS/Vue files in `src` and `__tests__`
yarn lint:fix

# Check That All Dependencies Are Used
yarn depcheck

# Collect the Code and Produce a Compressed File
yarn pack

# Build Electron Application for Production (Current OS)
yarn build

# Build Electron Application for Production (Windows)
yarn build:win

# Build Electron Application for Production (Mac)
yarn build:mac

# Build Electron Application for Production (Linux)
yarn build:linux

# Run Unit and End-to-End Tests
yarn test

# Run Unit Tests
yarn test:unit

# Run Unit Tests and Generate and Display the Coverage Report
yarn test:unit:coverage

# Run Unit Tests and Watch for Changes to Re-Run the Tests
yarn test:unit:watch

# Run end-to-end tests, without building the application
yarn test:e2e

# Build the Application and Run End-to-End Tests
yarn test:e2e:full

# List What Translations Are Missing or Unused on a Specific Language. It Could Capture Suggestions That Are Not Accurate
yarn i18n 'src/renderer/i18n/locales/LANGUAGE.js'

# List What English Messages Are Missing or Unused (English Is the Default Language)
yarn i18n:en-US

# List What Translations Are Missing or Unused on Every Language
yarn i18n:all


You can find a plugin template here which will help get you started.

File Structure

All plugins require at least the following files in order to work:

  • package.json
  • src/index.js


Plugins are to be installed inside of the ~/.ark-desktop/plugins folder.

Note: If running in development mode, the path used is ~/.ark-desktop/plugins-dev.


You also have the option of using the following permissions:

Accessibility permissions


Load in custom components.

To be used in combination with other permissions:



Loads additional routes into the Desktop Wallet.

To be used in combination with other permissions:


Loads custom menu items into the Desktop Wallet for the sidebar.

To be used in combination with other permissions:

  • ROUTES (required)


Plugin contains custom components.

Can be used in combination with the COMPONENTS permission.


Allow access to Font Awesome components.


Allow additional custom themes for the Desktop Wallet.


Allow showing an additional tab/page on the Wallet screen.

Can be used in combination with the COMPONENTS permission.


Allow access to the standard Desktop Wallet components used throughout the wallet. This gives plugins the ability to look and feel like they are a part of the application.

Allows access to all of the Button components:

  • ButtonClipboard
  • ButtonClose
  • ButtonGeneric
  • ButtonLayout
  • ButtonLetter
  • ButtonModal
  • ButtonReload
  • ButtonSwitch

Allows access to all of the Collapse components:

  • Collapse
  • CollapseAccordion

Allows access to all of the Input components:

  • InputAddress
  • InputCurrency
  • InputDelegate
  • InputFee
  • InputField
  • InputLanguage
  • InputPassword
  • InputSelect
  • InputSwitch
  • InputText

Allows access to all of the ListDivided components:

  • ListDivided
  • ListDividedItem

Allows access to the Loader component:

  • Loader

Allows access to all of the Menu components:

  • MenuDropdown
  • MenuDropdownAlternativeHandler
  • MenuDropdownHandler
  • MenuDropdownItem
  • MenuNavigation
  • MenuNavigationItem
  • MenuOptions
  • MenuOptionsItem
  • MenuStep
  • MenuStepItem
  • MenuTab
  • MenuTabItem

Allows access to the TableWrapper component:

  • TableWrapper


Allow showing remote URL pages within a frame. For example, showing the explorer within a page on the Desktop Wallet:

  • WebFrame

Wallet API permissions


Allow access to the Desktop Wallet alerts. For example, they could be used for notifications.


Trigger an error notification alert.


Trigger a success notification alert.

Trigger an info notification alert.


Trigger a warn notification alert.


Allow access to play audio from within the Desktop Wallet. For example, they could be used as an announcement for a new transaction.



Allow access to the Desktop Wallet events. For example, an event is triggered every time a new transaction is received.

walletApi.eventBus.on(event, callback)

Used to listen for an event., callback)

Used to disable listening for an event.


Allow performing external web requests. E.g. accessing the API of a third-party provider.

Note: This relies on a whitelist being provided within the package.json file

walletApi.http.get(url, opts)

Perform a GET request., opts)

Perform a POST request.


Allow WebFrame to have access to a one-way messaging system. E.g. trigger a plugin change when a button is pressed on an external page inside the WebFrame component.

Run sendToHost(event, data) from within a WebFrame to trigger a messaging event.

walletApi.messages.on(action, eventCallback)

Listen for a message from within the WebFrame.


Clear all messaging events.


Allows access to the currently connected peer. E.g. to fetch additional data from the network.

walletApi.peers.current.get(url, timeout = 3000)

Perform a GET request on the network., timeout = 3000)

Perform a POST request on the network.


Get all available profiles. E.g. to provide a list of wallets for the user to choose from which could be network independent.



Get the currently active profile. E.g. to provide a list of wallets for the user to choose from.



Allow access to the current route, including being able to navigate.


Get the current route.


Navigate to a new route.


Allow storing data within the Desktop Wallet, using a key-value pair., global = false)

Get a single value from the store based on key. If global is true, it will fetch the data stored globally in the wallet., value, global = false)

Set a value in the store. If global is true, it will globally store the data in the wallet.

Get all values from the store for the plugin.


Allows initiating and dealing with timers from inside a plugin.

walletApi.timers.setInterval(method, interval, ...args)

Start interval timer to run every interval milliseconds.

walletApi.timers.setTimeout(method, interval, ...args)

Start timeout timer to run once after interval milliseconds.


Clear interval timer created using setInterval.


Clear timeout timer created using setTimeout.


Get a list of intervals which are active.


Get a list of timeouts which are active.


Allows initiating and dealing with websockets from inside a plugin.


Clear existing websockets.

walletApi.websocket.on(action, eventCallback)

Create new websocket event.


Close an open websocket.


Close an open websocket and clear all active events.


Send data across the websocket.


Get whether the websocket is currently connecting.


Get whether the websocket is uninitiated or destroyed.


Get whether the websocket is open.


Get whether the websocket is in the process of closing.


Get whether the websocket is closed.


Get or set the binary type for the websocket.


If you discover a security vulnerability within this project, please send an e-mail to All security vulnerabilities will be promptly addressed.



MIT © ARK Ecosystem