Giter Site home page Giter Site logo

gupax's Introduction

Gupax is a GUI for mining Monero on P2Pool, using XMRig.

To see a 3-minute video guide on how to set-up Gupax: click here.

CI gupax.io Remote Node Ping

Contents

What is Monero/P2Pool/XMRig/Gupax?

Monero is a secure, private, and untraceable cryptocurrency.

Monero GUI allows you to run a Monero node (among other things).


P2Pool allows you to create/join decentralized peer-to-peer Monero mining pools.

P2Pool as a concept was first developed for Bitcoin although failed to stay relevant for various reasons.

In late 2021, SChernykh rewrote P2Pool from scratch for Monero.

P2Pool combines the best of solo mining and traditional pool mining:

  • It's decentralized: There's no central server that can be shutdown or pool admin that controls your hashrate
  • It's permissionless: It's peer-to-peer so there's no one to decide who can and cannot mine on the pool
  • It's trustless: Funds are never in custody, all pool blocks pay out to miners directly and immediately
  • 0% transaction fee, 0 payout fee, immediate ~0.0003 XMR minimum payout

XMRig is an optimized miner that can mine Monero.

Both Monero and P2Pool have built in miners but XMRig is quite faster than both of them. Due to issues like anti-virus flagging, it is not feasible to integrate XMRig directly into Monero.


Gupax is a GUI that helps manage P2Pool & XMRig (both originally CLI-only).

XMRig mines to P2Pool

P2Pool fetches blocks from a Monero node

Monero GUI runs the Monero node

Gupax runs P2Pool/XMRig



By default, Gupax will use a Remote Monero Node so you don't have to run your own Monero node to start mining on P2Pool.


Guide

video.mp4
  1. Download the bundled version of Gupax
  2. Extract
  3. Launch Gupax
  4. Input your Monero address in the P2Pool tab
  5. Select a Remote Monero Node (or run your own local Monero Node)
  6. Start P2Pool
  7. Start XMRig

You are now mining to your own instance of P2Pool, welcome to the world of decentralized peer-to-peer mining!

Simple

The Gupax/P2Pool/XMRig tabs have two versions, Simple & Advanced.

Simple is for a minimal & working out-of-the-box configuration.


Status

This tab has 3 submenus.

Processes:
This submenu shows:

  • General PC stats
  • General P2Pool stats
  • General XMRig stats

P2Pool:
This submenu shows:

  • Permanent stats on all your payouts received via P2Pool & Gupax
  • Payout sorting options
  • Share/block time calculator

Benchmarks:
This submenu shows:

  • Your hashrate vs others with the same CPU
  • List of similar CPUs and their stats
  • Data source: here


Gupax

This tab has the updater and general Gupax settings.

If Check for updates is pressed, Gupax will update your Gupax/P2Pool/XMRig (if needed) using the GitHub API.

Below that, there are some general Gupax settings:

Setting What does it do?
Update via Tor Causes updates to be fetched via the Tor network. Tor is embedded within Gupax; a Tor system proxy is not required
Auto-Update Gupax will automatically check for updates at startup
Auto-P2Pool Gupax will automatically start P2Pool at startup
Auto-XMRig Gupax will automatically start XMRig at startup
Ask before quit Gupax will ask before quitting (and notify if there are any updates/processes still alive)
Save before quit Gupax will automatically saved any un-saved setting on quit

P2Pool

P2Pool Simple allows you to ping & connect to a Remote Monero Node and start your own local P2Pool instance on the Mini sidechain.

To start P2Pool, first input the Monero address you'd like to receive payouts from. You must use a primary Monero address to mine on P2Pool (starts with a 4). It is highly recommended to create a new wallet since addresses are public on P2Pool!

Warning: There are negative privacy/security implications when using a Monero node not in your control. Select a remote node that you trust, or better yet, run your own node. If you'd like to manually specify a node to connect to, see Advanced.


XMRig

XMRig Simple has a log output box, a thread slider, and Pause-on-active setting.

If XMRig is started with Pause-on-active with a value greater than 0, XMRig will automatically pause for that many seconds if it detects any user activity (mouse movements, keyboard clicks). This setting is only available on Windows/macOS.

Windows:
Gupax will automatically launch XMRig with administrator privileges to activate mining optimizations. XMRig also needs a signed WinRing0 driver (© 2007-2009 OpenLibSys.org) to access MSR registers. This is the file next to XMRig called WinRing0x64.sys. This comes in the bundled version of Gupax. If missing/deleted, a copy is packaged with all Windows XMRig releases. A direct standalone version is also provided, here.

macOS/Linux:
Gupax will prompt for your sudo password to start XMRig with and do all the things above.

XMRig Simple will always mine to your own local P2Pool (127.0.0.1:3333), if you'd like to manually specify a pool to mine to, see Advanced.

Advanced

Verifying

It is recommended to verify the hash and PGP signature of the download before using Gupax.

Download the SHA256SUMS file, download and import my PGP key, and verify:

sha256sum -c SHA256SUMS
gpg --import hinto-janai.asc
gpg --verify SHA256SUMS

Q: How can I be sure the P2Pool/XMRig bundled with Gupax hasn't been tampered with?
A: Verify the hash.

You can always compare the hash of the P2Pool/XMRig binaries bundled with Gupax with the hashes of the binaries found here:

Make sure the version you are comparing against is correct, and make sure you are comparing the binary to the binary, not the tar/zip. If they match, you can be sure they are the exact same. Verifying the PGP signature is also recommended:


Running a Local Monero Node

Running and using your own local Monero node improves privacy and security. It also means you won't be depending on one of the Remote Monero Nodes provided by Gupax. This comes at the cost of downloading and syncing Monero's blockchain yourself (currently 155GB).

If you'd like to run and use your own local Monero node for P2Pool, follow these steps:

  1. In the Monero GUI, go to Settings
  2. Go to the Node tab
  3. Enable Local node
  4. Enter --zmq-pub=tcp://127.0.0.1:18083 into Daemon startup flags
  5. (Optionally) enter --disable-dns-checkpoints --enable-dns-blocklist into Daemon startup flags

After syncing the blockchain, you will now have your own Monero node.

The 4th step enables ZMQ, which is extra Monero node functionality that is needed for P2Pool to work correctly.

The 5th step:

  • --disable-dns-checkpoints avoids periodical lag when DNS is updated (it's not needed when mining)
  • --enable-dns-blocklist bans known bad nodes

For more detailed information on configuring a Monero node, click here.


Command Line

By default, Gupax has auto-update & auto-ping enabled. This can only be turned off in the GUI which causes a chicken-and-egg problem.

To get around this, start Gupax with --no-startup. This will disable all auto features for that instance.

USAGE: ./gupax [--flag]

    --help            Print this help message
    --version         Print version and build info
    --state           Print Gupax state
    --nodes           Print the manual node list
    --payouts         Print the P2Pool payout log, payout count, and total XMR mined
    --no-startup      Disable all auto-startup settings for this instance (auto-update, auto-ping, etc)
    --reset-state     Reset all Gupax state (your settings)
    --reset-nodes     Reset the manual node list in the [P2Pool] tab
    --reset-pools     Reset the manual pool list in the [XMRig] tab
    --reset-payouts   Reset the permanent P2Pool stats that appear in the [Status] tab
    --reset-all       Reset the state, manual node list, manual pool list, and P2Pool stats

Key Shortcuts

The letter keys (Z/X/C/V/S/R) will only work if nothing is in focus, i.e, you are not editing a text box.

An ALT+F4 will also trigger the exit confirm screen (if enabled).

*---------------------------------------*
|             Key shortcuts             |
|---------------------------------------|
|             F11 | Fullscreen          |
|          Escape | Quit screen         |
|              Up | Start/Restart       |
|            Down | Stop                |
|               Z | Left Tab            |
|               X | Right Tab           |
|               C | Left Submenu        |
|               V | Right Submenu       |
|               S | Save                |
|               R | Reset               |
*---------------------------------------*

Resolution

The default resolution of Gupax is 1280x960 which is a 4:3 aspect ratio.

This can be changed by dragging the corner of the window itself or by using the resolution sliders in the Gupax Advanced tab. After a resolution change, Gupax will fade-in/out of black and will take a second to resize all the UI elements to scale correctly to the new resolution.

If you have changed your OS's pixel scaling, you may need to resize Gupax to see all UI correctly.

The minimum window size is: 640x480
The maximum window size is: 3840x2160
Fullscreen mode can also be entered by pressing F11.


Tor/Arti

By default, Gupax updates via Tor. In particular, it uses Arti, the official Rust implementation of Tor.

Instead of bootstrapping onto the Tor network every time, Arti saves state/cache about the Tor network (circuits, guards, etc) for later reuse onto the disk:

State:

OS Data Folder
Windows C:\Users\USER\AppData\Local\torproject\Arti\data
macOS /Users/USER/Library/Application Support/org.torproject.Arti
Linux /home/USER/.local/share/arti

Cache:

OS Data Folder
Windows C:\Users\USER\AppData\Local\torproject\Arti\cache
macOS /Users/USER/Library/Caches/org.torproject.Arti
Linux /home/USER/.cache/arti

Disk

Long-term state is saved onto the disk in the "OS data folder", using the TOML format. If not found, default files will be created.

Given a slightly corrupted state.toml file, Gupax will attempt to merge it with a new default one. This will most likely happen if the internal data structure of state.toml is changed in the future (e.g: removing an outdated setting). The node/pool database cannot be merged.

If Gupax can't read/write to disk at all, or if there are any other big issues, it will show an unrecoverable error screen.

OS Data Folder Example
Windows {FOLDERID_RoamingAppData} C:\Users\USER\AppData\Roaming\Gupax
macOS $HOME/Library/Application Support /Users/USER/Library/Application Support/Gupax
Linux $XDG_DATA_HOME or $HOME/.local/share /home/USER/.local/share/gupax

The current files saved to disk:

  • state.toml Gupax state/settings
  • node.toml The manual node database used for P2Pool advanced
  • pool.toml The manual pool database used for XMRig advanced
  • p2pool/ The Gupax-P2Pool API files

Logs

Gupax has console logs that show with increasing detail, what exactly it is is doing.

There are multiple log filter levels but by default, INFO and above are enabled. To view more detailed console debug information, start Gupax with the environment variable RUST_LOG set to a log level like so:

RUST_LOG=(trace|debug|info|warn|error) ./gupax

For example:

RUST_LOG=debug ./gupax

In general:

  • ERROR means something has gone wrong and that something will probably break
  • WARN means something has gone wrong, but things will be fine
  • INFO logs are general info about what Gupax (the GUI thread) is currently doing
  • DEBUG logs are much more verbose and include what EVERY thread is doing (not just the main GUI thread)
  • TRACE logs are insanely verbose and shows very low-level logs

Swapping P2Pool/XMRig

If you want to use your own P2Pool/XMRig binaries you can:

  • Edit the PATH in Gupax Advanced to point at the new binaries
  • Change the binary itself

By default, Gupax will look for P2Pool/XMRig in folders next to itself:

Windows:

Gupax\
├─ Gupax.exe
├─ P2Pool\
│  ├─ p2pool.exe
├─ XMRig\
   ├─ xmrig.exe

macOS (Gupax is packaged as an .app on macOS):

Gupax.app/Contents/MacOS/
├─ gupax
├─ p2pool/
│  ├─ p2pool
├─ xmrig/
   ├─ xmrig

Linux:

gupax/
├─ gupax
├─ p2pool/
│  ├─ p2pool
├─ xmrig/
   ├─ xmrig

Status

The [P2Pool] submenu in this tab reads/writes to a file-based API in a folder called p2pool located in the Gupax OS data directory:

File Purpose Specific Data Type
log Formatted payout lines extracted from P2Pool Basically a String that needs to be parsed correctly
payout The total amount of payouts received via P2Pool & Gupax u64
xmr The total amount of XMR mined via P2Pool & Gupax Atomic Units represented with a u64

The log file contains formatted payout lines extracted from your P2Pool:

<DATE> <TIME> | <12_FLOATING_POINT> XMR | Block <HUMAN_READABLE_BLOCK>

e.g:

2023-01-01 00:00:00.0000 | 0.600000000000 XMR | Block 2,123,123

The payout file is just a simple count of how many payouts have been received.

The xmr file is the sum of XMR mined as Atomic Units. The equation to represent this as XMR is:

XMR_ATOMIC_UNITS / 1,000,000,000,000

e.g:

600,000,000,000 / 1,000,000,000,000 = 0.6 XMR

Gupax interacts with these files in two ways:

  • Reading the files when initially starting
  • Appending/overwriting new data to the files upon P2Pool payout

These files shouldn't be written to manually or Gupax will report wrong data.

If you want to reset these stats, you can run:

./gupax --reset-payouts

or just manually delete the p2pool folder in the Gupax OS data directory.


Gupax

Along with the updater and settings mentioned in Simple, Gupax Advanced allows you to change:

  • The PATH of where Gupax looks for P2Pool/XMRig
  • The selected tab on startup
  • Gupax's resolution

Warning: Gupax will use your custom PATH/binary and will replace them if you use Check for updates in the [Gupax] tab. There are sanity checks in place, however. Your PATH MUST end in a value that appears correct or else the updater will refuse to start:

Binary Accepted values Good PATH Bad PATH
P2Pool P2POOL, P2Pool, P2pool, p2pool P2pool/p2pool Documents/my_really_important_file
XMRig XMRIG, XMRig, Xmrig, xmrig XMRig/XMRig Desktop/

If using Windows, the PATH must end with .exe.


P2Pool

P2Pool Advanced has:

  • Terminal input
  • Overriding command arguments
  • Manual node list
  • P2Pool Main/Mini selection
  • Out/In peer setting
  • Log level setting

The overriding command arguments will completely override your Gupax settings and start P2Pool with those arguments. Warning: If using this setting, use --no-color and make sure to set --data-api <PATH> & --local-api so that the [Status] tab can work!

The manual node list allows you save and connect up-to 1000 custom Monero nodes:

Data Field Purpose Limits Max Length
Name A unique name to identify this node (only for Gupax purposes) Only [A-Za-z0-9-_.] and spaces allowed 30 characters
IP The Monero Node IP to connect to with P2Pool It must be a valid IPv4 address or a valid domain name 255 characters
RPC The RPC port of the Monero node [1-65535] 5 characters
ZMQ The ZMQ port of the Monero node [1-65535] 5 characters

The Main/Mini selector allows you to change which P2Pool sidechain you mine on:

P2Pool Sidechain Description Use-case
Main More miners, finds blocks faster, has a higher difficulty Suitable for miners with MORE than 50kH/s
Mini Less miners, finds blocks slower, has a lower difficulty Suitable for miners with LESS than 50kH/s

Given enough time, both Main and Mini will result in the same reward (as will solo mining):

Mining Method Share Behavior Payout/Output Behavior Example Total (it's the same)
P2Pool Main LESS frequent shares that are MORE valuable Results in MORE outputs worth LESS 20 shares, 100 outputs worth 0.006 XMR 0.6 XMR
P2Pool Mini MORE frequent shares that are LESS valuable Results in LESS outputs worth MORE 100 shares, 20 outputs worth 0.03 XMR 0.6 XMR
Solo mining No shares, only payouts 1 output 1 output worth the block reward: 0.6 XMR 0.6 XMR

In the end, it doesn't matter too much which sidechain you pick, it will all average out. Getting LESS but more valuable outputs may be desired, however, since the transaction cost to combine all of them (sweep_all) will be cheaper due to being comprised of less outputs.

The remaining sliders control miscellaneous settings:

Slider Purpose Default Min/Max Range
Out peers How many out-bound peers P2Pool will connect to 10 10..450
In peers How many in-bound peers P2Pool will allow to connect to you 10 10..450
Log level Verbosity of the P2Pool console log 3 0..6

XMRig

XMRig Advanced has:

  • Terminal input
  • Overriding command arguments
  • Custom payout address
  • CPU thread slider
  • Manual pool list
  • Custom HTTP API IP/Port
  • TLS setting
  • Keepalive setting

The overriding command arguments will completely override your Gupax settings and start XMRig with those arguments.

Warning: If using this setting, use [--no-color] and make sure to set [--http-host <IP>] & [--http-port <PORT>] so that the [Status] tab can work!

The manual pool list allows you save and connect up-to 1000 custom Pools (regardless if P2Pool or not):

Data Field Purpose Limits Max Length
Name A unique name to identify this pool (only for Gupax purposes) Only [A-Za-z0-9-_.] and spaces allowed 30 characters
IP The pool IP to connect to with XMRig It must be a valid IPv4 address or a valid domain name 255 characters
Port The port of the pool [1-65535] 5 characters
Rig An optional rig ID; This will be the name shown on the pool Only [A-Za-z0-9-_] and spaces allowed 30 characters

The HTTP API textboxes allow you to change to IP/Port XMRig's HTTP API opens up on:

Data Field Purpose Default Limits Max Length
HTTP API IP The IP XMRig's HTTP API server will bind to localhost/127.0.0.1 It must be a valid IPv4 address or a valid domain name 255 characters
HTTP API Port The port XMRig's HTTP API server will bind to 18088 [1-65535] 5 characters

The remaining buttons control miscellaneous settings (both are disabled by default, as P2Pool does not require them):

Button Purpose
TLS Connection Enables SSL/TLS connections (needs pool support)
Keepalive Enables sending keepalive packets to prevent timeout (needs pool support)

Connections

For transparency, here's all the connections Gupax makes:

Domain Why When Where
https://github.com Fetching metadata information on packages + download [Gupax] tab -> Check for updates update.rs
Remote Monero Nodes Connecting to with P2Pool, measuring ping latency [P2Pool Simple] tab node.rs
DNS DNS connections will usually be handled by your OS (or whatever custom DNS setup you have). If using Tor, DNS requests for updates should be routed through the Tor network automatically All of the above All of the above

Remote Monero Nodes

These are the remote nodes used by Gupax in the [P2Pool Simple] tab.

IP/Domain Location RPC Port ZMQ Port
monero.10z.com.ar 🇦🇷 Argentina 18089 18084
monero1.heitechsoft.com 🇨🇦 Canada 18081 18084
node.monerodevs.org 🇨🇦 Canada 18089 18084
xmr3.rs.me 🇩🇪 Germany 18089 18084
node.cryptocano.de 🇩🇪 Germany 18089 18083
p2pmd.xmrvsbeast.com 🇩🇪 Germany 18081 18083
fbx.tranbert.com 🇫🇷 France 18089 18084
node2.monerodevs.org 🇫🇷 France 18089 18084
home.allantaylor.kiwi 🇳🇿 New Zealand 18089 18083
xmr1.rs.me 🇸🇬 Singapore 18089 18084
p2pool.uk 🇬🇧 United Kingdom 18089 18084
xmr2.rs.me 🇺🇸 United States 18089 18084
xmr.support 🇺🇸 United States 18081 18083
sf.xmr.support 🇺🇸 United States 18081 18083
xmrbandwagon.hopto.org 🇺🇸 United States 18081 18084
xmr.spotlightsound.com 🇺🇸 United States 18081 18084
xmrnode.facspro.net 🇺🇸 United States 18089 18084
node.richfowler.net 🇺🇸 United States 18089 18084

Build

General Info

You need cargo, Rust's build tool and package manager.

There are 41 unit tests, you should probably run:

cargo test

before attempting a full build.


Linux

The pre-compiled Linux binaries are built on Debian 11, you'll need these packages to build:

sudo apt install build-essential cmake libgtk-3-dev

After that, run:

cargo build --release

The Linux release tars come with another file next to the Gupax binary: Gupax.AppImage.

This is not an actual AppImage, it is just a text file that contains: ./gupax. This allows users to double-click and execute Gupax in file explorers like Nautilus in Ubuntu/Debian.

Building for a distribution

Gupax has a build flag for use as a package in a Linux distribution:

cargo build --release --features distro

This is the same as the --release profile, but with some changes:

Change Reason
Built-in Update feature is disabled Updates should be handled by the native package manager
Default P2Pool/XMRig path is /usr/bin/ P2Pool/XMRig exist in some repositories, which means they'll be installed in /usr/bin/

macOS

You'll need Xcode and brew.

Due to an issue with some TLS code, Arti (Tor) needs to fall back to using OpenSSL instead of the native TLS.

These are statically linked into Gupax, so you'll need to have them on your system:

brew install pkg-config openssl xz

If you want the binary to have an icon, you must use cargo-bundle:

cargo install cargo-bundle
cargo bundle --release

This bundles Gupax into a Gupax.app, the way it comes in the pre-built tars for macOS.

To build only the binary:

cargo build --release

Windows

You'll need Visual Studio.

There is a build.rs file in the repo solely for Windows-specific things:

  1. It sets the icon in File Explorer
  2. It statically links VCRUNTIME140.dll into Gupax (the binary will not be portable without this)

After installing the development tools, run:

cargo build --release

This will build Gupax with the MSVC toolchain (x86_64-pc-windows-msvc). This is the recommended method and is how the pre-compiled release binaries are built.

License

The GUI library Gupax uses is egui. It is licensed under MIT & Apache 2.0.

Many other libraries are used that have various licenses.

Gupax, P2Pool, and XMRig are licensed under the GNU General Public License v3.0.

FAQ

Where are updates downloaded from?

The latest versions are downloaded using GitHub's API.

GitHub's API blocks request that do not have an HTTP User-Agent header.

Gupax uses a random recent version of a Wget/Curl user-agent.


P2Pool connection errors

TL;DR: Run & use your own Monero Node.

If you are using the default P2Pool settings then you are using a Remote Monero Node. Using a remote node is convenient but comes at the cost of privacy and reliability. You may encounter connections issues with these nodes that look like this:

2023-01-05 12:27:37.7962 P2PServer peer 23.233.96.72:37888 is ahead on mainchain (height 2792939, your height 2792936). Is your monerod stuck or lagging?

To fix this you can select a different remote node, or better yet: Run your own local Monero Node.

Running and using your own local Monero node improves privacy and ensures your connection is as stable as your own internet connection. This comes at the cost of downloading and syncing Monero's blockchain yourself (currently 155GB). If you have the disk space, consider using the P2Pool Advanced tab and connecting to your own Monero node.

For a simple guide, see the Running a Local Monero Node section.


Can I quit mid-update?

If you started an update, you should let it finish. If the update has been stuck for a long time, quitting Gupax is probably okay. The worst that can happen is that your Gupax/P2Pool/XMRig binaries may be moved/deleted. Those can be easily redownloaded. Your actual Gupax user data (settings, custom nodes, pools, etc) is never touched.

Although Gupax uses a temporary folder (gupax_update_[A-Za-z0-9]) to store temporary downloaded files, there aren't measures in place to revert an upgrade once the file swapping has actually started. If you quit Gupax anytime before the Upgrading packages phase (after metadata, download, extraction), you will technically be safe but this is not recommended as it is risky, especially since these updates can be very fast.


Bundled vs Standalone

Bundled Gupax comes with the latest version of P2Pool/XMRig already in the zip/tar.

Standalone only contains the Gupax executable.


How much memory does Gupax use?

Gupax itself uses around 100-400 megabytes of memory.

Gupax also holds up to 500,000 bytes of log data from P2Pool/XMRig to display in the GUI terminals. These logs are reset once over capacity which takes around 1-4 hours.

Memory usage should never be above 500~ megabytes. If you see Gupax using more than this, please send a bug report.


How is sudo handled? (on macOS/Linux)

See here for more info.


Why does Gupax need to be Admin? (on Windows)

See here for more info.

gupax's People

Contributors

hinto-janai avatar maddymodd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

gupax's Issues

gupax compatibility issues

I encountered some garbled characters in the Chinese version of Windows 10 Professional.

Env: Windows 10 专业版 22H2
gupax version: v1.3.2
Monitor resolution: 2560x1440

1.As I show in the picture below, garbled characters appear at position 1 in the picture.
2.Can you add some other colors to the second miner line? , similar to that in XMRig. eg: green.
3.In the position 3, the input box will be partially blocked. I tried to zoom in a little bit, but it was still a little blocked,I think there is a little compatibility issue。
image info:
gupax

Mining over privacy network (Tor/i2p) setting

Would it be possible to add a simple setting for Gupax to run P2Pool / Mine over i2p or Tor? It would be great to see this software as resilient as possible for areas where it may be dangerous to be running p2pool software.

More `--flags` -> UI

These are some flag options that should probably be turned into UI options.

P2Pool:

  • --addpeers
  • --no-dns
  • --p2p-external-port
  • --no-upnp
  • --no-autodiff
  • --socks5

XMRig:

  • --cpu-priority
  • --print-time
  • --verbose
  • --pause-on-battery

bug: windows auto update

Describe the bug
The auto-update on windows has never worked for me. I've tried on multiple versions.

To Reproduce
Steps to reproduce the behavior:

  1. Be on windows
  2. Go to the gupax tab
  3. Click on 'Check for updates'
  4. 'update failed | metadata fetch failed'

Screenshots
image

OS & Version:
Windows 10, Gupax v1.3.1

checksums not correct

I've downloaded the v1.3.1 windows x64, both the bundled and the standalone archives from the official website and the checksums are coming back incorrect. They don't match whats displayed on the site. This is as of 8/3/2023 and 8/4/2023.

Its possible im doing it wrong but I don't think so. I've tried multiple different ways .

P2Pool/XMRig backup node/pool

Both [P2Pool] & [XMRig] tabs have UI for adding/deleting nodes/pools via a list.

There should also UI for allowing fallback, so when a node/pool goes down, the other ones set in the list are used as backup.

XMRig allows this natively, so just passing the extra pools via the startup arguments is sufficient.

P2Pool does not (yet), although since Gupax parses P2Pool output anyway, we could implement a bad hack:

  • detect node connection issues
  • restart P2Pool with a different node argument

Option to use Gupax via CLI

Feature request
An option to run Gupax via CLI. E.g. for use with another system you would also like to mine with, that does not have a GUI.

Additional context
I'm looking to add another system that does not have a GUI (Both systems are running Debian 12). Is there an easier way?

XMRig Uptime flickering beetwen 0s and actual time

Describe the bug
What is the bug?
Edit: It happens on Processes tab of Status
To Reproduce
Steps to reproduce the behavior:
1.Start Gupax
2.Start P2Pool
3.Start XMRig
4.Go to Status Screen

Screenshots
If possible, add screenshots to help explain the bug.
I could add video, but I'm not sure if it would be of use

OS & Version:
Arch Linux, kernel version: 6.4.12-arch1-1, Gupax v1.3.1

Gupax v1.2.0 to-do list

This release will have general features/fixes and include a P2Pool v3.0+ hardfork compatible binary in the bundle.

There will be an interim Gupax v1.1.1 release including minor fixes and so that the bundle can include a post-fork P2Pool binary.

Features:

  • Embed XMRig benchmarks stats; Parse and compare with user's CPU #12

Fixes:

  • Add documentation on practical downsides of community nodes #11
  • Create ZMQ batch tester, replace Community Monero Nodes with known ZMQ-open nodes from https://monero.fail
  • #5
  • Fix low OS resolution spacing #13
  • Fix [Status] P2Pool spacing (stats sometimes overflow the UI)
  • Update community node list (trim dead/slow nodes, add more variety)
  • Remove --no-color in P2Pool command arguments, use NO_COLOR instead SChernykh/p2pool@726224b
    EDIT: portable_pty's .env("NO_COLOR" "true") works standalone in a test program when writing to an actual terminal but doesn't work within Gupax, the egui text console still displays ANSI codes so --no-color stays for now.
  • Fix localhost IP parsing #16

Maybe:

  • Update egui v0.19.0 -> v0.20.1. This update includes many fixes but also has breaking UI changes and will need manual sizing adjustment of pretty much all the UI elements in Gupax
  • Backup manual Monero Node & Pool. This isn't hard to add but it will affect a lot of data points (UI, disk structs, command parsing functions) and might be a little awkward to fit given the already tight UI in the P2Pool/XMRig tab

Tests:

  • Review all unit tests, add/remove if necessary
  • Windows
  • macOS
  • Linux

Orphan block payouts are included

When P2Pool finds a payout, Gupax immediately saves it into it's own history.

In the case of orphan blocks, this payout is no longer existent, yet Gupax has already has written the data to the file and cannot remove it. There's not really a good way to fix this. Possible solutions and their drawbacks:

Solution Drawback
Wait a few minutes (2-3 blocks) before appending data Payout data will hang in memory, what happens when the user exits Gupax during this time? Flush the possible bad data to disk? Ignore it?
Check each payout for validity via the current monerod connection We have to make tons of connections that are 99.99% of the time useless
Upon Gupax startup, check payout validity via monerod RPC calls Same as above
Upon Gupax startup, check payout validity via a hardcoded list of known orphaned blocks Maintaining this is painful

The first two will also have the drawback of having delayed data, aka, when a payout is received, the user won't immediately see it in the [Status] tab and submenus.

Another solution (that puts the burden on the user) is to have a UI for deleting a payout line from the history, automatically deducting it from the total XMR received, and total payout count:

// Errors that aren't handled:
//   - Parsing `&str` -> `u64/f64`
//   - Subtraction underflows
//   - Writing to disk

for (line, payout) in payout_log_lines.enumerate() {
    if user_clicked_remove {
        subtract_payout(payout);
        remove_payout_log_line(line);
        decrement_total_payout_count();
    }
}

Appreciation.

Nice project guys! I love how it looks.

(feel free to close this)

Cannot start ARM M1 binary package (but build it ok)

Describe the bug
cannot start the ARM M1 (Intel is ok)

To Reproduce
Steps to reproduce the behavior:

  1. Download
  2. Click on App
  3. See error of damaged App

Screenshots
Screenshot 2023-09-14 at 10 50 46 AM

OS & Version:
macOS 13.5.2

I finally built one myself and hence I resolve the issue. I am not sure others want to do this as well.

ZMQ Reader failed to connect + peer PEER_IP is ahead on mainchain

Hey guys,

Everytime I use P2Pool, it shows ZMQ Reader failed to connect and peer PEER_IP is ahead on mainchain.
For example,
2023-01-05 12:27:37.7962 P2PServer peer 23.233.96.72:37888 is ahead on mainchain (height 2792939, your height 2792936). Is your monerod stuck or lagging?
2023-01-05 12:27:38.0009 P2PServer peer 77.249.85.87:37888 is ahead on mainchain (height 2792939, your height 2792936). Is your monerod stuck or lagging?
2023-01-05 12:27:39.9786 ZMQReader failed to connect to tcp://192.46.228.85:18083

Thank you in advance for your help.

MacOS sudo/admin priviledge for XMRig

As admin of my MacBook Pro (Apple M2) I cannot start XMRig with my sudo/admin password (incorrect password or sudo timeout). I tried to start Gupax as root, but Gupax wants to get started with a regular user. So, is this maybe a sudo timeout thing? P2Pool is running smoothly (with own node).

Undisplayable ANSI codes in terminals

When starting P2Pool/XMRig, some raw ANSI escape codes will appear in some of the output lines.

Color is off for both, so this is probably something to do with the PTY.

It happens the most often during newlines, but they aren't \n or \r codes either.

[Feature request] Background mode.

It would be convenient if you could close Gupax to system tray, so it can continue mining in the background. And also an option to automatically start Gupax closed to tray would be useful too.

[feat] Dockerize

I would love to package this for eOS, following the upcoming release of the Monero full node. Having a dockerfile/image would really simplify that process.

It would also generally please Docker nerds

P2Pool fails to start

P2Pool fails to start, the logs say:

2023-10-19 20:40:11.9268 ZMQReader failed to connect to tcp://37.120.165.105:18083 P2Pool can't continue execution: panic at /home/runner/work/p2pool/p2pool/src/p2pool.cpp:802 2023-10-19 20:40:11.9273 P2Pool Couldn't start ZMQ reader: exception Operation cannot be accomplished in current state 2023-10-19 20:40:11.9273 Log stopped

I think this is some network issue, anyone konws what is causing this?

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'P2Pool tab'
  2. add remote node (lower saxony - DE)
  3. click start P2Pool

OS & Version:
Linux Kubuntu, Gupax v1.3.1

Use polkit's `pkexec` instead of asking for the root password directly

Feature request
On Linux, Gupax has its own little UI that requests the admin password in order to launch XMRig. This is good reason for someone not to trust it, especially knowing what kind of issues have plagued cryptocurrency in the past. Polkit is installed by default on many Linux distributions and pkexec requests the user's password through an agent the user already trusts. This would greatly help transparency, trust, and would plug in better with the way that Linux systems tend to handle permissions.

release 1.31, 1.30, 1.21 suspends in windows

Describe the bug
When starting one of the gupax releases on Windows the exe is being suspended. this is vissible in the task manager, starting multiple instances results in them all being suspended.

To Reproduce
downloaded the full gupax suite (p2p, xmrig) turned off antivirus realtime protection, run gupax as admin.

OS & Version:
Windows 10 22H/Windows 11 22H2 22621.1992

Update Function Error

Describe the bug
Check for updates failed,
"Metadata Fetch Failed"

To Reproduce
Steps to reproduce the behavior:

  1. Open Gupax
  2. Click on Gupax Tab
  3. See error with update

Screenshots
If possible, add screenshots to help explain the bug.

OS & Version:
Linux Mint, Gupax v1.1.2

In short, auto update is not working. If I update manually (download the latest bundle) I assume I will have to manually re-enter all settings?

Status Page showing ??? values for fields

Describe the bug
What is the bug?

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'Status Page' while P2Pool and XMRig processes are Green/running.
  2. See it. Believe it. Possibly accept it? Noh. Noh-noh-noh.
  3. See error

Now, full disclosure: I run UFW (Uncomplicated FireWall) and wonder if something is blocking the http API, but I'm a noob in that field as well ^_^

Also worth mentioning: the XMRig tab accepts the [h] command and shows the hashrate. So as far as I can tell, the system is indeed mining, just not being reflected on the Status page. Uninstalled Gupax 1.3.1 and restarted the configuration, sadly it reappears on my second install.

Screenshots
1b_Gupax_Status_Error

OS & Version:
Debian 12 LTS (fresh install, fully updated) + Gupax 1.3.1

Improved Auto Download for P2Pool and XMRig

Hello!
I appreciate the great work on the project, which runs seamlessly on Ubuntu 22.04. However, I believe there is room for improvement in terms of the setup process for P2Pool and XMRig. Specifically, I suggest implementing an auto-download feature that retrieves and installs the latest versions of P2Pool and XMRig for the user.

For Windows, consider using the "Local" directory, and for Ubuntu, the "~/.gupax" directory can be used.

I hope this feature suggestion aligns with your vision for the project. If you agree I can start working on PR

[Idea / Feature request]

Could it be possible that in the Xmrig part of Gupax, we could monitor / control multiple xmrig miners with ssh, could be really usefull, thanks ;)

Status page Issue

Status page is blank. with 0s and ??s

P2Pool and XMRIG running

Instructions from readme for setting up a local node were followed. Everything is running and mining fine from this computer.

Multiple other systems on my network are also mining fine from same local node

Screenshots
Attached
Screenshot 2023-08-29 013847

OS & Version:

Windows 11, version 1.3.1

MacOS coud not start

After Update > it´wan´t start anymore on MaOS .

Nothing changed .

Error : GUPAX xcoud dort start - without any additional Info

Default `localhost` manual IP is not valid for P2Pool

The default Advanced/Manual IP entry for both XMRig and P2Pool is localhost but neither of them actually accept it, they need 127.0.0.1.

localhost is already parsed by Gupax and turned into 127.0.0.1 for XMRig, but not for P2Pool.

Ability to change p2pool p2p ports

Feature request
Additional config for users under vpns unable to open default ports 37889/37888.
if i got it right the p2pool command is like --p2p "0.0.0.0:37889"
thanks

Introduce a Basic Mode for Simplified Usage

Dear Gupax Team,

I would like to request the implementation of a new feature called "Basic Mode" in the gupax project. The goal of this mode is to simplify the app usage for non-technical users and make it more accessible to beginners.

Description: The current usage of the app is straightforward, but it can still be intimidating for non-tech people. By introducing the Basic Mode, we can streamline the experience and make it even easier for newcomers to navigate and utilize the app's functionality.

Features of Basic Mode:

Simplified User Interface: In the Basic Mode, we will display only the essential elements required for mining XMR, namely an input field for the XMR key and a "Start" button. This minimalistic design will reduce confusion and help users focus on the necessary tasks.

Automatic Remote Node Selection: Once the user clicks the "Start" button, the app will automatically select the fastest remote node in the background for syncing. This eliminates the need for users to manually choose a remote node, simplifying the process and reducing potential errors.

CPU Limit for Mining: To ensure a smoother experience and prevent excessive resource usage, we can set a default CPU limit of 80% (implemented via cpulimit on Linux, setting CPU Affinity on Windows, cputhrottle on Mac) during mining. This will strike a balance between mining performance and system responsiveness.

Benefits: Introducing the Basic Mode will have several benefits for both non-technical users and beginners:

Lower Learning Curve: By reducing the number of options and settings, new users will be able to grasp the main concept of mining XMR more quickly, allowing them to get started with minimal effort.

Increased Confidence: The simplified user interface and automated processes will instill confidence in users who may feel overwhelmed by technical jargon and complex settings. This will encourage more individuals to try mining XMR and explore the potential of it.

Thank you for considering this feature request. I look forward to seeing the gupax app evolve and become even more user-friendly.

Best regards, PrivOci

How to use OpenCL within GUPAX

This is less of a feature request and more of a help request, but wasn't sure where else to ask for support.

I previously set up XMRig to mine using my AMD video cards, openCL on Linux. I am very new to this, and although I got it working successfully, my understanding of the command line options isn't great.

I got interested in GUPAX when I learned about P2Pool mining and saw it as a way to simplify my entire setup/process.

That said, as far as I can tell, the Default XMRig settings in GUPAX don't include an option to use openCL.

I know I have the backends (openCL etc. etc.) installed properly as I was using them without error before.

In GUPAX I know I can override the default settings with my own, --opencl is all it would take, but I would then have to replicate the rest of the default settings string that GUPAX normally uses, and that's where I get tripped up.

I am using a Local Monero Node, configured through the Monero GUI.
XMRig in GUPAX is set to use Local P2Pool, all the standard settings, like out of the box just work as they are, everything runs fine.

But if I wanted to add the --openCL flag, how would I format the rest of the settings string, to replicate the defaults GUPAX is using? (short of begging to have a checkbox to use OpenCL, get added to the program).

I realize it's probably a fairly niche request, but any help would be great.

Reword Xmrig info text

I thought the info text for the address was slightly unclear on the Xmrig tab for newbies. Creating this issue to make it a little more clear. Does this address do anything if you already have an address in the P2Pool tab?

pub const XMRIG_ADDRESS: &str = "Specify which Monero address to payout to. This does nothing if mining to P2Pool since the address being payed out to will be the one P2Pool started with. This doubles as a rig identifier for P2Pool and some pools.";

Old:
Specify which Monero address to payout to. This does nothing if mining to P2Pool since the address being payed out to will be the one P2Pool started with. This doubles as a rig identifier for P2Pool and some pools.

New:
If you're not using P2Pool, add your Monero payout address here. This address is also used as the identifier of your rig on some pools.

P2Pool stopped | Uptime: [5 seconds] | Exit status: [Failed]

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. See error

Screenshots
If possible, add screenshots to help explain the bug.
�[2J�[m�[36m�[H2023-05-13 23:08:12.3293�[m�[90m�[1CLog�[m�[1Cstarted
�]0;C:\xmr\gupax-v1.2.2-windows-x64-bundle\P2Pool\p2pool.exe��[?25h2023-05-13 23:08:12.3297 P2Pool v3.3 (built with MSVC/1929 on Apr 30 2023)�[40X
2023-05-13 23:08:12.3298 Util UPnP: Started scanning for UPnP IGD devices�[41X
2023-05-13 23:08:12.3324 SideChain network type = mainnet�[56X
2023-05-13 23:08:12.3324 SideChain using default config�[59X
2023-05-13 23:08:12.3324 SideChain pool name = mini�[59X
2023-05-13 23:08:12.3324 SideChain block time = 10 seconds�[53X
2023-05-13 23:08:12.3324 SideChain min diff = 100000�[57X
2023-05-13 23:08:12.3324 SideChain PPLNS window = 2160 blocks�[52X
2023-05-13 23:08:12.3324 SideChain uncle penalty = 20%�[60X
2023-05-13 23:08:12.3324 SideChain generating consensus ID�[56X
2023-05-13 23:08:12.3324 SideChain consensus ID = 3982c91a************************************************35187ec4
2023-05-13 23:08:12.3469 RandomX_Hasher allocated 2592 MB�[11X
2023-05-13 23:08:12.3470 ConsoleCommands uv_guess_handle returned 14
2023-05-13 23:08:12.3475 TCPServer listening on 127.0.0.1:56098
2023-05-13 23:08:12.3475 ConsoleCommands processing stdin as UV_TTY
2023-05-13 23:08:12.3476 ConsoleCommands event loop started�[9X
2023-05-13 23:08:12.9668 P2Pool new miner data�[65X

major_version = 16�[83X
height = 2885286�[78X
prev_id = 5042540f6d2328cb6a11ec979f994c06f4824668a3a4a7900ebf571ea74ffa04�[21X
seed_hash = 2d4d50a4ab8aeda1132100e326551daf547095b5e57ff7f945dffe43a92cbcad�[21X
difficulty = 308220721063�[73X
median_weight = 300000�[79X
already_generated_coins = 18278368787152763164�[65X
transactions = 5�[84X

2023-05-13 23:08:12.9668 RandomX_Hasher new seed 2d4d50a4ab8aeda1132100e326551daf547095b5e57ff7f945dffe43a92cbcad�[16X
2023-05-13 23:08:12.9669 BlockTemplate base reward = 0.600000000000 XMR, 0 transactions, fees = 0.000000000000 XMR, weight = 0
2023-05-13 23:08:12.9671 BlockTemplate final reward = 0.600000000000 XMR, weight = 127, outputs = 1, 0 of 0 transactions included
2023-05-13 23:08:13.1678 RandomX_Hasher old seed 05ad473f3c7e6cd3293c99fe26abc53ff95e2ab13fc374140defb2cef5c76a3e
2023-05-13 23:08:13.2542 RandomX_Hasher cache updated
2023-05-13 23:08:13.2542 RandomX_Hasher running 8 threads to update dataset
2023-05-13 23:08:13.3492 Util UPnP: Finished scanning for UPnP IGD devices
2023-05-13 23:08:13.5469 RandomX_Hasher old cache updated
2023-05-13 23:08:13.8487 TCPServer listening on [::]:3333
2023-05-13 23:08:13.8493 TCPServer listening on 0.0.0.0:3333�[12X
2023-05-13 23:08:13.8494 StratumServer event loop started�[15X
2023-05-13 23:08:13.8499 BlockCache loading cached blocks�[15X
2023-05-13 23:08:13.8557 BlockCache loaded 0 cached blocks�[14X
2023-05-13 23:08:13.8568 TCPServer listening on [::]:37888�[14X
2023-05-13 23:08:13.8573 TCPServer listening on 0.0.0.0:37888�[11X
2023-05-13 23:08:13.8573 Util UPnP: trying to map WAN:37888 to LAN:37888
2023-05-13 23:08:13.8713 Util UPnP: LAN IP address 192.168.1.40
2023-05-13 23:08:13.8765 Util UPnP: WAN IP address 89.155.112.83
2023-05-13 23:08:13.8929 Util UPnP: Mapped 89.155.112.83:37888 to 192.168.1.40:37888
2023-05-13 23:08:13.8930 P2PServer event loop started�[31X
2023-05-13 23:08:14.9146 ZMQReader failed to connect to tcp://87.202.83.233:18083
P22023-05-13 23:08:14.9153 P2Pool Couldn't start ZMQ reader: exception Operation cannot be accomplished in current state
Pool can't continue execution: panic at D:\a\p2pool\p2pool\src\p2pool.cpp:768�[43X
2023-05-13 23:08:14.9165 Log stopped�[84X

P2Pool stopped | Uptime: [5 seconds] | Exit status: [Failed]

OS & Version:
Windows 10, Gupax v1.2.2

no auto update . no update manual

Autoupdate doesn't do well. I do the autoupdate from gupax and it is downloaded, version 1.2.1, I have version 1.2.0 running.

Even if I restart GUPAX or the machine, it's still at 1.2.0. I've hand-downloaded 1.2.1 and copied the files to the working folder, and when I launch gupax it's still 1.2.0

I don't know what else I can do, I think there is a problem in the update

Low OS resolution makes Gupax UI cramped

Having an OS resolution of less than 1920x1080 and changing the window size of Gupax causes some of the UI elements to be too big. Some elements (scrollbar) flicker and are glitchy as well.

Gupax resizes automatically based of available space but low OS resolution messes things up. Possible solution is to adjust the sizing multiplier based off the user's OS resolution at startup.

New Monero node

Feature request
Describe the feature you're requesting.
Monero node operated by stormycloud
Nodes https://stormycloud.org/crypto/
Additional context
Add any other context or screenshots about the feature request.
StormyCloud Inc. is a non-profit organization based in Austin, Texas, with a mission to provide privacy-based tools to allow everyone access to an unfiltered and unregulated Internet. They believe that unfettered access to the Internet is a basic, universal human right.

The organization has made significant strides in its mission. As of May 2023, it has routed 8916 TB’s of total bandwidth and deployed 26 Tor Exit Nodes and 20 I2P Routers

Gupax v1.3.0 to-do list

Release ETA: By end of July 2023

Features:

  • #37
  • #38
  • Background/tray mode #21 #25
  • Different status color indicating P2Pool's sync status (orange)
  • Different status color indicating XMRig's mining status (orange)

Fixes:

  • Fix [Status] P2Pool spacing (stats sometimes overflow the UI)
  • Add more user-friendly solution messages to init failure:
    app.node_vec = match Node::get(&app.node_path) {
  • Handle rare indexing panics:
    let (name, node) = app.og_node_vec[0].clone();

Maybe:

Maintenance:

Tests:

  • Windows
  • macOS
  • Linux

P2pool failing

I'm having issues running P2pool in both simple mode:

2022-12-15 10:07:47.9910 StratumServer failed to listen on tcp server socket [::]:3333, error EADDRINUSE
2022-12-15 10:07:47.9911 Log stopped

and advanced mode, trying to connect to local monero node:

2022-12-15 10:07:30.4385 P2Pool get_info RPC request failed: error Couldn't connect to server (empty response), trying again in 1 second

v1.3.0 Updates disabled on Windows

Describe the bug
I have just updated to Gupax v1.3.0. When opening it says Updates Disabled. This Gupax was built as a Linux distro and updates via tor and auto updates are disabled, or something to that effect.

To Reproduce
Steps to reproduce the behavior:

  1. Download the Windows Gupax v1.3.0 build from www.gupax.io
  2. Alternatively, let Gupax Auto Update to v1.3.0
  3. Open Gupax and see that Updates Disabled message

Screenshots
https://i.imgur.com/4Rh0Oz5.png

OS & Version:
e.g: Windows 11 Pro Insider 25905, Gupax v1.3.0

Request to Add App to Flathub for Easier Installation on Linux

I would like to request the addition of the app to Flathub, the centralized repository of Flatpak apps, to make it easier for Linux users to install the app regardless of their distribution.
Flathub offers several benefits for both developers and users, including:

  • Distribution independence: Packaging and testing desktop applications for different Linux distributions can be time-consuming and tedious. With Flatpak and Flathub, developers only need to package their app as a Flatpak once, making it compatible with various distributions without the need for separate packaging efforts.

  • Easy installation: Flathub provides a single point of entry for users to discover and install Flatpak apps. Users can install apps either through a graphical software center or using the flatpak command line

  • App updates: Once an app is included in Flathub, developers can easily distribute updates to users. New releases are automatically distributed to users, ensuring they have access to the latest version of the app

P.S. For Windows https://chocolatey.org can be used

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.