<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: gamie</title>
    <description>The latest articles on DEV Community by gamie (@g4m3m4g).</description>
    <link>https://dev.to/g4m3m4g</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4005473%2Fa2a9d7de-dc24-485e-8025-241852813a98.png</url>
      <title>DEV Community: gamie</title>
      <link>https://dev.to/g4m3m4g</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/g4m3m4g"/>
    <language>en</language>
    <item>
      <title>I Built a Targeted Wordlist Generator in Go (and It's Actually Pretty Cool)</title>
      <dc:creator>gamie</dc:creator>
      <pubDate>Sat, 27 Jun 2026 14:46:53 +0000</pubDate>
      <link>https://dev.to/g4m3m4g/i-built-a-targeted-wordlist-generator-in-go-and-its-actually-pretty-cool-1h74</link>
      <guid>https://dev.to/g4m3m4g/i-built-a-targeted-wordlist-generator-in-go-and-its-actually-pretty-cool-1h74</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmxvdjxmhw3az63zqfco4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmxvdjxmhw3az63zqfco4.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;a href="https://g4m3m4g.github.io/Valence/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I've been doing some security work lately and kept running into the same problem: generic wordlists like &lt;code&gt;rockyou.txt&lt;/code&gt; are massive but totally untargeted. If you're doing an authorized pentest or internal security awareness audit, you don't need millions of random passwords — you need a few thousand &lt;em&gt;smart&lt;/em&gt; ones based on what you know about the target.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;Valence&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is it?
&lt;/h2&gt;

&lt;p&gt;Valence is a CLI tool that takes a personal profile (name, birthdate, pet's name, partner, city, etc.) and generates a deduplicated list of password candidates that mirror how real people actually create passwords.&lt;/p&gt;

&lt;p&gt;The name comes from chemistry — the idea that atoms bond to form new structures. Here, personal data points are the atoms, and Valence bonds them together in every meaningful way.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;valence &lt;span class="nt"&gt;-first&lt;/span&gt; John &lt;span class="nt"&gt;-last&lt;/span&gt; Smith &lt;span class="nt"&gt;-pet&lt;/span&gt; Max &lt;span class="nt"&gt;-birthdate&lt;/span&gt; 1990-05-15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one command generates candidates like &lt;code&gt;john123&lt;/code&gt;, &lt;code&gt;MaxSmith!&lt;/code&gt;, &lt;code&gt;j0hn_1990&lt;/code&gt;, &lt;code&gt;nhoj@smith&lt;/code&gt;, &lt;code&gt;5m1th1990&lt;/code&gt; — you get the idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fun stuff it does
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Leet-speak substitutions&lt;/strong&gt; — not just simple &lt;code&gt;a→@&lt;/code&gt; swaps. It applies 1-, 2-, and 3-rule &lt;em&gt;combinations&lt;/em&gt;, so you get &lt;code&gt;j0hn&lt;/code&gt;, &lt;code&gt;j@ne&lt;/code&gt;, &lt;code&gt;$m1th&lt;/code&gt;, and everything in between.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-character toggle case&lt;/strong&gt; — generates all 2ⁿ combinations for each token. &lt;code&gt;jOhN&lt;/code&gt;, &lt;code&gt;JoHn&lt;/code&gt;, &lt;code&gt;jOHn&lt;/code&gt;... yeah, it covers them all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Birthdate expansion&lt;/strong&gt; — a single &lt;code&gt;1990-05-15&lt;/code&gt; expands into &lt;code&gt;1990&lt;/code&gt;, &lt;code&gt;90&lt;/code&gt;, &lt;code&gt;0515&lt;/code&gt;, &lt;code&gt;1505&lt;/code&gt;, &lt;code&gt;15051990&lt;/code&gt;, &lt;code&gt;05151990&lt;/code&gt;, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phone number derivation&lt;/strong&gt; — plug in &lt;code&gt;555-123-4567&lt;/code&gt; and it automatically extracts last-4 (&lt;code&gt;4567&lt;/code&gt;), last-6 (&lt;code&gt;234567&lt;/code&gt;), area code (&lt;code&gt;555&lt;/code&gt;), and the full digits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common-word mixing&lt;/strong&gt; — pairs profile tokens with real-world breach-corpus words. Think &lt;code&gt;johnlove&lt;/code&gt;, &lt;code&gt;dragonsmith&lt;/code&gt;, &lt;code&gt;ilovejohn&lt;/code&gt;. These show up &lt;em&gt;constantly&lt;/em&gt; in real password dumps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reversed tokens&lt;/strong&gt; — &lt;code&gt;nhoj&lt;/code&gt;, &lt;code&gt;htims&lt;/code&gt;. Sounds weird but people actually do this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initials&lt;/strong&gt; — derives &lt;code&gt;JSmith&lt;/code&gt; and &lt;code&gt;JohnS&lt;/code&gt; style tokens automatically.&lt;/p&gt;

&lt;p&gt;And it all runs through a &lt;code&gt;prefix → mutate → suffix → pair → word-mix → deduplicate&lt;/code&gt; pipeline that keeps output clean and sorted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two ways to use it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Interactive mode&lt;/strong&gt; — just run &lt;code&gt;valence&lt;/code&gt; with no flags and it walks you through everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Valence — interactive profile builder
Leave any field blank to skip it.

  First name:           John
  Last name:            Smith
  Pet's name:           Max
  Date of birth:        1990-05-15

  Output file [john_smith.txt]:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Flag mode&lt;/strong&gt; — great for scripting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;valence &lt;span class="nt"&gt;-first&lt;/span&gt; John &lt;span class="nt"&gt;-last&lt;/span&gt; Smith &lt;span class="nt"&gt;-nick&lt;/span&gt; Johnny &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-partner&lt;/span&gt; Sarah &lt;span class="nt"&gt;-pet&lt;/span&gt; Max &lt;span class="nt"&gt;-child&lt;/span&gt; Emma &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-phone&lt;/span&gt; &lt;span class="s2"&gt;"555-123-4567"&lt;/span&gt; &lt;span class="nt"&gt;-city&lt;/span&gt; Bangkok &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-username&lt;/span&gt; j0hn &lt;span class="nt"&gt;-birthdate&lt;/span&gt; 1990-05-15 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-o&lt;/span&gt; john_smith.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pipe it anywhere
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;stdout&lt;/code&gt; is reserved for candidates only; metadata goes to &lt;code&gt;stderr&lt;/code&gt;. So you can pipe directly into hashcat without any cleanup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;valence &lt;span class="nt"&gt;-first&lt;/span&gt; John &lt;span class="nt"&gt;-pet&lt;/span&gt; Max | hashcat &lt;span class="nt"&gt;-a&lt;/span&gt; 0 &lt;span class="nt"&gt;-m&lt;/span&gt; 1000 hashes.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or filter it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;valence &lt;span class="nt"&gt;-first&lt;/span&gt; John &lt;span class="nt"&gt;-birthdate&lt;/span&gt; 1990-05-15 | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; candidates.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Zero dependencies
&lt;/h2&gt;

&lt;p&gt;The whole core engine (&lt;code&gt;pkg/profiler&lt;/code&gt;) runs on Go's standard library — no third-party packages. That means it's auditable, embeddable, and you can import it into your own tools (web service, TUI, Burp extension, whatever).&lt;/p&gt;

&lt;p&gt;The architecture splits the core from the CLI intentionally. &lt;code&gt;pkg/profiler&lt;/code&gt; just does the work; &lt;code&gt;main.go&lt;/code&gt; just handles I/O. Clean separation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Homebrew&lt;/strong&gt; (macOS/Linux):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap g4m3m4g/tap
brew &lt;span class="nb"&gt;install &lt;/span&gt;valence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;curl one-liner&lt;/strong&gt; (no Go required):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/g4m3m4g/Valence/main/scripts/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Go install&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/g4m3m4g/valence@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The obvious disclaimer
&lt;/h2&gt;

&lt;p&gt;This is strictly for &lt;strong&gt;authorized&lt;/strong&gt; security work. Pentests, internal audits, security awareness campaigns — that kind of thing. Using it against accounts or individuals without explicit written authorization is illegal in pretty much every jurisdiction, and that's not what this is for. The README has a full legal breakdown if you want the details.&lt;/p&gt;




&lt;p&gt;If you're doing authorized security auditing and you're tired of blasting through 14 GB wordlists hoping for a hit, give Valence a try. It's a much more surgical approach.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/g4m3m4g/Valence" rel="noopener noreferrer"&gt;g4m3m4g/Valence&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback welcome — especially if you've built something similar and have thoughts on the mutation pipeline.&lt;/p&gt;

</description>
      <category>go</category>
      <category>security</category>
      <category>opensource</category>
      <category>pentest</category>
    </item>
  </channel>
</rss>
