VanityForge is a config-driven Solana vanity address generator with both CPU and GPU engines. GPU acceleration is for NVIDIA CUDA GPUs only. It supports Rust-based multithreaded CPU search and CUDA-accelerated NVIDIA GPU search, with shared pattern files, shared config, and JSONL output for collecting matches locally.
Users can switch between CPU and GPU in vanity.config.json, edit patterns/prefixes/*.txt and patterns/suffixes/*.txt, and run the same top-level PowerShell entrypoint. The public project name is VanityForge; the internal package and binary names currently remain solana-vanity and solana-vanity-gpu for compatibility.
- Solana vanity address generation with CPU or NVIDIA GPU
- shared config and shared prefix/suffix pattern files
- interactive
doctor,init, andsmokecommands for setup and safe first runs - helper script for generating Base58-valid word variants and updating config
- one-command build, run, and stop PowerShell helpers for Windows
- append-only JSONL match output plus optional key export formats
- safer smoke-test run mode that refuses unbounded helper-triggered searches
Run all commands from the repository root.
CPU requirements:
- Rust
- Cargo
GPU requirements:
- NVIDIA GPU
- CUDA Toolkit
- Visual Studio Build Tools with C++
- PowerShell on Windows
If you already have the tools installed, skip this section.
CPU-only setup:
- Install Rust from rustup.rs.
- Open a new PowerShell window after install.
- Verify it works:
cargo --versionGPU setup on Windows:
- Make sure you have an NVIDIA GPU.
- Install the CUDA Toolkit.
- Install Build Tools for Visual Studio.
- In the Visual Studio installer, install the C++ build tools workload.
- In the installer details, make sure these components are selected:
MSVC v143 - VS 2022 C++ x64/x86 build toolsWindows 11 SDK
- Open a new PowerShell window after installation.
- Verify the toolchain:
nvcc --versionProject verification:
.\install.ps1
vanity doctorIf vanity doctor recommends CPU mode, you can still use the project without CUDA by staying on the CPU engine.
Install the global vanity and v commands:
.\install.ps1Remove them later if needed:
.\uninstall.ps1Result files can contain private keys.
- Do not share result files
- Do not commit result files
- Do not send private keys to anyone
- Keep
private/and any exported key files private runs/can contain private key material whenoutput.private_key_formatsincludes export formats such asbase58
Use CPU when:
- you want the simplest setup
- you want broad compatibility
- you do not have a ready NVIDIA CUDA environment
Use GPU when:
- you have an NVIDIA GPU
- you have CUDA Toolkit and Visual Studio Build Tools installed
- you want much higher throughput for harder vanity addresses
Recommended CPU path:
- run
vanity doctor - run
vanity init - keep
engineset tocpu - run
vanity smoke, thenvanity run
Recommended GPU path:
- run
vanity doctor - run
vanity init - confirm
gpu.cuda_archfor your card during setup - run
vanity smoke, thenvanity run
Simplest setup path:
- Install the commands once:
.\install.ps1- Check your machine and get an engine recommendation:
vanity doctor- Run the setup wizard:
vanity init- Run a bounded smoke test:
vanity smoke- Run the search:
vanity run- Stop a running search if needed:
vanity stopRepo-local fallback without installing:
- Check your machine and get an engine recommendation:
.\vanity.ps1 doctor- Run the setup wizard:
.\vanity.ps1 init- Run a bounded smoke test:
.\vanity.ps1 smoke- Run the search:
.\vanity.ps1 run- Stop a running search if needed:
.\vanity.ps1 stopIf you want to work manually instead, you can still edit vanity.config.json and the pattern files yourself.
For personal experiments, test configs, or machine-specific setups you do not want to commit, prefer keeping them under .local/, for example .local/configs/my-vanity.config.json and .local/patterns/.
After .\install.ps1, you can use:
Check GPU/CUDA/build tools and get an engine recommendation:
vanity doctorShow the current config, pattern files, and example entries:
vanity showRun the interactive setup wizard:
vanity initRun a bounded smoke test:
vanity smokeGenerate prefix and suffix variants and update config:
vanity setup Star forgeUse setup when you want two separate pattern pools:
Starbecomes the prefix wordforgebecomes the suffix word- this is best for searches like "starts with Star, ends with forge"
Generate one full-word pattern file and update config:
vanity word StarforgeUse word when you want one full target word:
Starforgeis treated as a single whole word- this is best for searches that should match one complete word pattern instead of split prefix/suffix parts
Run the currently configured search:
vanity runBuild the currently configured engine:
vanity buildStop any running project search process:
vanity stopShort alias:
v runRepo-local fallback without installing:
Check GPU/CUDA/build tools and get an engine recommendation:
.\vanity.ps1 doctorShow the current config, pattern files, and example entries:
.\vanity.ps1 showRun the interactive setup wizard:
.\vanity.ps1 initRun a bounded smoke test:
.\vanity.ps1 smokeGenerate prefix and suffix variants and update config:
.\vanity.ps1 setup Star forgeUse setup for split prefix/suffix words.
Generate one full-word pattern file and update config:
.\vanity.ps1 word StarforgeUse word for one full target word.
Run the currently configured search:
.\vanity.ps1 runBuild the currently configured engine:
.\vanity.ps1 buildStop any running project search process:
.\vanity.ps1 stopMain config file:
vanity.config.json
For local-only configs that should stay out of git, prefer a path under .local/configs/.
Example:
{
"engine": "cpu",
"patterns": {
"prefix_file": "patterns/prefixes/example.txt",
"suffix_file": "patterns/suffixes/example.txt"
},
"output": {
"results_file": "runs/matches.jsonl",
"aesthetic_results_file": "private/aesthetic-matches.jsonl",
"single_keypair_file": "private/vanity-keypair.json",
"private_key_formats": ["base58"],
"write_match_files": false,
"matches_dir": "private/matches"
},
"cpu": {
"threads": 0,
"report_every": 2,
"max_attempts": 0,
"keep_running": true
},
"gpu": {
"cuda_arch": "sm_89",
"attempts_per_execution": 100000,
"max_iterations": 0,
"max_matches": 0
}
}Key settings:
engine:cpuorgpucpu: settings for the Rust multithreaded enginegpu: settings for the CUDA enginepatterns.prefix_file: text file with one allowed prefix per linepatterns.suffix_file: text file with one allowed suffix per lineoutput.results_file: append-only JSONL results fileoutput.aesthetic_results_file: append-only JSONL file for aesthetic matches; defaults toprivate/aesthetic-matches.jsonloutput.single_keypair_file: base output path used by CPU one-hit modeoutput.private_key_formats: which private-key representations to saveoutput.enable_save_filter: show save-policy details for keep-running modeoutput.min_total_matched_chars: additional aesthetic save threshold; listed configured targets still save even when they are below this valuecpu.threads:0means auto; any positive number pins the worker countcpu.max_attempts:0means unlimitedgpu.max_iterations:0means unlimitedgpu.max_matches:0means unlimitedgpu.cuda_arch: CUDA arch likesm_89for an RTX 4090
Default output layout:
runs/: listed/config-target JSONL run output and other run artifacts; treat as secret-bearing with the currentbase58default unless you switchoutput.private_key_formatsto["none"]private/: aesthetic JSONL output, secret-bearing keypair files, and per-match secret exports
Config value conventions:
cpu.threads: 0means auto-detect and use available CPU threadscpu.max_attempts: 0means unlimited attemptsgpu.max_iterations: 0means unlimited kernel launchesgpu.max_matches: 0means unlimited matches
Supported values in output.private_key_formats:
nonebase58solana-jsonseed-base58seed-hexall
Current default:
"private_key_formats": ["base58"]Save every supported format:
"private_key_formats": ["all"]What each format means:
none: do not include private-key material in JSONL outputbase58: Base58-encoded 64-byte Solana keypairsolana-json: Solana CLI-friendly 64-byte decimal arrayseed-base58: Base58-encoded first 32-byte seed onlyseed-hex: hex-encoded first 32-byte seed only
Shared pattern files live in:
patterns/prefixes/patterns/suffixes/
The default example setup uses:
patterns/prefixes/example.txtpatterns/suffixes/example.txt
Each file uses one pattern per line. Blank lines, surrounding whitespace, and # comments are ignored.
The helper generates Base58-valid case variants for a target word and can optionally write pattern files or update vanity.config.json. Most users should start with vanity init; use the commands below when you want direct control over pattern generation.
Default example:
vanity generateCommon helper workflows:
vanity setup Star forgesetup means prefix word then suffix word.
vanity setup Star forgemeans prefixes based onStarand suffixes based onforge- use this when you want split matching, not one single combined word
vanity word Starforgeword means one full combined word.
vanity word Starforgemeans generate variants for the whole wordStarforge- use this when you want one target word instead of separate prefix and suffix pools
vanity stopMore examples:
vanity generate -Word "Moonwalker" -OutputPath "patterns/prefixes/moonwalker.txt"vanity generate -PrefixWord "Nova" -SuffixWord "core" -UpdateConfig -ConfigPath "my-vanity.config.json" -Quietvanity generate -GroupedSpecPath ".local/configs/grouped-variant-smoke-spec.json" -ConfigPath ".local/configs/my-grouped-search.config.json" -UpdateConfigUse grouped rules when you want multiple allowed prefix...suffix families in one run without cross-matching between them.
Example grouped spec:
{
"engine": "gpu",
"rules": [
{
"name": "alpha-to-beta",
"prefix_word": "Alpha",
"suffix_word": "Beta"
},
{
"name": "north-to-curated-suffixes",
"prefix_word": "North",
"suffix_file": ".local/patterns/suffixes/debt-grouped.txt"
},
{
"name": "curated-prefixes-to-south",
"prefix_file": ".local/patterns/prefixes/project-grouped.txt",
"suffix_word": "South"
}
]
}What this means:
- rule 1 matches
Alpha...Beta - rule 2 matches
North...<any suffix from the referenced file> - rule 3 matches
<any prefix from the referenced file>...South - prefixes and suffixes only pair inside the same rule
- cross-combinations are not allowed
For example, if one rule is Alpha...Beta and another is Gamma...Delta, the grouped matcher allows Alpha...Beta and Gamma...Delta, but it will not accept Alpha...Delta.
Running grouped generation:
vanity generate -GroupedSpecPath ".local/configs/my-grouped-spec.json" -ConfigPath ".local/configs/my-grouped-search.config.json" -UpdateConfigThat writes per-rule pattern files and a grouped runtime config with a rules array like:
{
"rules": [
{
"prefix_file": ".local/patterns/prefixes/grouped-01-alpha-to-beta-prefix.txt",
"suffix_file": ".local/patterns/suffixes/grouped-01-alpha-to-beta-suffix.txt"
},
{
"prefix_file": ".local/patterns/prefixes/grouped-02-north-to-curated-suffixes-prefix.txt",
"suffix_file": ".local/patterns/suffixes/debt-grouped.txt"
}
]
}Notes:
- only Base58-valid characters are emitted
- invalid vanity characters such as
0,O,I, and lowercaselare rejected - letters that only have one valid Base58 case stay fixed
- use
-PrefixWordand-SuffixWordwhen you want smaller, more practical pattern sets - use
-Quietwhen you only want the summary, warnings, and output paths -UpdateConfigwrites generated files and updatespatterns.prefix_fileandpatterns.suffix_file-GroupedSpecPathgenerates multiple isolated prefix/suffix rule pairs and writes a groupedrulesconfig- grouped specs support
prefix_word,suffix_word,prefix_file, andsuffix_file -Runstarts a bounded smoke test only and refuses unbounded configs- use
.\run.ps1for full searches - in single-word mode,
-UpdateConfigsets the prefix file and creates an intentionally empty suffix file - very large expansions are blocked unless you raise
-MaxVariants
GPU-specific pattern limits:
- maximum
256prefixes - maximum
128suffixes - maximum pattern length
31characters per entry
In grouped mode, those GPU limits apply to the flattened total across all rule entries, not per rule.
Example:
- rule 1 with
20prefixes and8suffixes - rule 2 with
8prefixes and16suffixes - flattened GPU totals become
28prefixes and24suffixes
Progress timing note:
- the live
avg .../matchfield is an expected average time per match at the current rate, not a guaranteed countdown to the next hit - in GPU keep-running mode, listed/config matches are appended to
output.results_file, aesthetic matches are appended tooutput.aesthetic_results_file, and the terminal stays focused on iteration/progress updates - when
output.enable_save_filteristrue, the runner printsSave policy : listed targets always savedplusAesthetic : on|off ...before the live status stream starts - when the aesthetic path is enabled, the live
avg ...timing remains an estimate for listed/config targets only
If you need larger pattern sets or longer entries, use the CPU engine.
Use the engine selected in vanity.config.json:
vanity runQuick CPU example:
"engine": "cpu"vanity runQuick GPU example:
"engine": "gpu"Before running, confirm gpu.cuda_arch for your NVIDIA card. The easiest path is:
vanity doctor
vanity initvanity runWhat the top-level scripts do:
run.ps1: readsvanity.config.jsonand runs either the CPU or GPU enginebuild.ps1: readsvanity.config.jsonand builds either the CPU or GPU engine
Choose CPU in the config when you want broad compatibility and easy setup.
Choose GPU in the config when you have an NVIDIA card and want much higher search throughput.
Build the engine selected in vanity.config.json:
vanity buildRun CPU explicitly:
vanity build -Engine cpu
vanity run -Engine cpuRun GPU explicitly:
vanity build -Engine gpu
vanity run -Engine gpuBuild both:
vanity build -Engine allThe CPU engine uses the Rust binary in src/main.rs.
Use CPU when:
- you want the simplest setup
- you do not have a supported NVIDIA CUDA environment
- you want maximum portability
Behavior:
- loads prefixes and suffixes from the shared pattern files
- supports one-hit mode or keep-running mode
- can write separate JSONL files for listed/config matches and aesthetic matches
- can optionally write one file per match
When cpu.keep_running is true, listed/config matches are appended to output.results_file and aesthetic matches are appended to output.aesthetic_results_file.
Keep-running mode always persists exact listed targets from your configured pattern/rule set. If output.min_total_matched_chars is set, that threshold also enables extra aesthetic saves without blocking listed targets below the threshold.
The extra aesthetic path is meant for arbitrary nice-looking 5x5+-style hits while your project-specific search is already running. It currently recognizes:
- repeated-character runs such as
55555...55555orAAAAA...AAAAA - ascending and descending digit runs such as
12345...12345or98765...98765 - ascending and descending alphabetic runs, including case-insensitive letter sequences such as
ABCDE...abcde - alternating digit patterns such as
12121...12121 - alternating alphabetic patterns such as
aBaBa...aBaBa, but only when both sides use the same exact visible alternating fragment - repeated chunk patterns such as
123123...123123orabcabc...abcabc, but only when both sides use the same exact visible repeated fragment - mirrored curated words such as
SOLANA...SoLanAorPUMPFUN...pumpfun, matched case-insensitively on both sides - keyboard-row runs such as
qwert...asdfg - tight numeric motifs such as
112233...13579
Saved result rows now include match_type, which is either listed or aesthetic.
cpu.threads: 0 means auto-detect the worker count. cpu.max_attempts: 0 means run without an attempt limit.
When cpu.keep_running is false, the single winning keypair is written to:
output.single_keypair_fileifsolana-jsonis selected<same-stem>.pubkey.txt<same-stem>.base58.txtifbase58is selected<same-stem>.seed.base58.txtifseed-base58is selected<same-stem>.seed.hex.txtifseed-hexis selected
If output.write_match_files is true, keep-running CPU mode also writes one set of files per match in output.matches_dir.
The GPU engine lives in gpu/ and is built with nvcc.
Use GPU when:
- you have an NVIDIA GPU
- you have CUDA Toolkit and Visual Studio Build Tools installed
- you want much higher throughput than CPU
Behavior:
- rebuilds a small generated CUDA config from the shared pattern files
- uses the configured
gpu.cuda_arch - appends listed/config match rows to
output.results_file - appends aesthetic match rows to
output.aesthetic_results_file - only emits private-key fields when
output.private_key_formatsis not["none"] - supports JSONL match output, not CPU-style one-hit companion files
gpu.max_iterations: 0 means unlimited kernel launches. gpu.max_matches: 0 means keep collecting matches until you stop the run.
Shipped example target:
sm_89, which matches an RTX 4090
The GPU config expects a CUDA architecture string like:
sm_89sm_86sm_75
Users usually find it in 3 steps:
- Find the GPU model name:
nvidia-smi -L- Look up that GPU on NVIDIA's CUDA GPU / compute capability list
- Convert compute capability to the
sm_XXformat used byvanity.config.json
Examples:
- compute capability
8.9->sm_89 - compute capability
8.6->sm_86 - compute capability
7.5->sm_75
Common NVIDIA examples:
RTX 4090->sm_89RTX 3090->sm_86RTX 3080->sm_86RTX 2080 Ti->sm_75
If users are unsure, they should:
- run
nvidia-smi -L - search their GPU model plus
CUDA compute capability - put the resulting
sm_XXvalue intogpu.cuda_archinvanity.config.json
- The shipped config defaults to
cpuso the repo works on more machines out of the box. - Switch
enginetogpuwhen you want CUDA acceleration. - Locally built unsigned GPU binaries can trigger antivirus heuristics on Windows. If that happens, review the repo, then allow or exclude only this project folder if you trust it.
The JSONL output file contains one JSON object per line. Typical fields:
addressmatched_prefixmatched_suffixattemptsprivate_key_base58ifbase58is enabledsolana_keypair_bytesifsolana-jsonis enabledsecret_seed_base58ifseed-base58is enabledseed_hexifseed-hexis enabled- file path fields for CPU file outputs when applicable
With the default ["base58"] setting, JSONL output includes the Base58 private key field.
Solana addresses use Base58 and cannot contain:
0OI- lowercase
l
vanity command not found:
- Run
.\install.ps1 - Open a new PowerShell window
- Or use
.\vanity.ps1 ...directly from the repo root
cargo not found:
- Install Rust from rustup.rs
- Open a new PowerShell window
- Verify with
cargo --version
nvcc not found:
- Install the CUDA Toolkit
- Open a new PowerShell window
- Verify with
nvcc --version
GPU build fails with compiler or SDK errors:
- Make sure Visual Studio Build Tools with C++ are installed
- Make sure
MSVC v143 - VS 2022 C++ x64/x86 build toolsis installed - Make sure
Windows 11 SDKis installed - Run
vanity doctoragain after installation
vanity doctor recommends CPU even though you have an NVIDIA GPU:
- CPU mode still works and is the simplest fallback
- Check that CUDA Toolkit is installed
- Check that
nvcc --versionworks in a new PowerShell window - Re-run
vanity doctor
vanity smoke finds nothing:
- This is normal
vanity smokeis intentionally bounded and may complete without a match
GPU search is running too hard or you want to stop immediately:
- Run
vanity stop - If needed, stop leftover processes in Task Manager
- Prefer
vanity smokebeforevanity runwhen testing a new setup
Antivirus flags the GPU binary:
- Locally built unsigned CUDA binaries can trigger Windows antivirus heuristics
- Review the repo first
- If you trust it, allow or exclude only this project folder
Private keys are missing from results:
- This usually means private key export was disabled in your config
- Set
output.private_key_formatsto includebase58,solana-json,seed-base58,seed-hex, orall
- The GPU engine is much faster for broad vanity pools, but exact long targets are still expensive.
- The CPU engine is easier to set up and works without CUDA.
- The CUDA engine currently targets Windows + NVIDIA + CUDA Toolkit + Visual Studio Build Tools.
- The GPU scanner is derived from Apache-licensed CUDA Solana
ed25519code invendor-solanity.
This project is licensed under Apache-2.0. See LICENSE.
