Website · Syntax · Sandbox · Cookbook · Contributing
Pattern-based string generator — library and CLI in many languages, one shared grammar. Enumerate combinations for wordlists, domain brainstorming, test data, and similar tasks.
Requirements: Docker for language builds; Node 18+ only for the JavaScript port and the documentation site.
Docs and a live browser sandbox are published with GitHub Pages:
Build the site locally with ./scripts/build-site.sh (output in _site/). In the repo Settings → Pages, set the source to GitHub Actions.
Pick a published channel when you can; otherwise clone and build that language directory.
| Channel | Install |
|---|---|
| npm | npm install wildling |
| PyPI | pip install wildling |
| crates.io | cargo install wildling |
| Go | go get github.com/dotmonk/wildling/go/v2@latest |
| NuGet | dotnet tool install -g DotMonk.Wildling |
More registries (Maven, Packagist, RubyGems, pub.dev, Hex, LuaRocks, …) and git-only ports are listed on the website language wall and in each <language>/README.md.
| Language | Library | CLI |
|---|---|---|
| JavaScript / TypeScript | Yes | Yes |
| Python | Yes | Yes |
| Java | Yes | Yes |
| C# | Yes | Yes |
| Visual Basic / VB.NET | Yes | Yes |
| C++ | Yes | Yes |
| PHP | Yes | Yes |
| C | Yes | Yes |
| Go | Yes | Yes |
| Rust | Yes | Yes |
| Kotlin | Yes | Yes |
| Ruby | Yes | Yes |
| Swift | Yes | Yes |
| Scala | Yes | Yes |
| Dart | Yes | Yes |
| POSIX shell | Yes | Yes |
| PowerShell | Yes | Yes |
| Lua | Yes | Yes |
| Assembly (x86-64 NASM) | Yes | Yes |
| R | Yes | Yes |
| Groovy | Yes | Yes |
| Perl | Yes | Yes |
| Elixir | Yes | Yes |
| Pascal / Free Pascal | Yes | Yes |
| Zig | Yes | Yes |
| Fortran | Yes | Yes |
| Ada | Yes | Yes |
| F# | Yes | Yes |
| Haskell | Yes | Yes |
cd javascript && npm ci --include=dev && npm run build
./bin/wildling "Year 19##"Year 1900
Year 1910
…
Year 1999
As a library (from this repo):
const createWildling = require("./javascript/dist/index.js").default;
const wildling = createWildling({
patterns: ["Year 19##"],
dictionaries: {},
});
let value;
while ((value = wildling.next()) !== false) {
console.log(value);
}cd python && ./build.sh
./bin/wildling "Year 19##"from wildling import create_wildling
wildling = create_wildling(patterns=["Year 19##"])
value = wildling.next()
while value is not False:
print(value)
value = wildling.next()cd java && ./build.sh
./bin/wildling "Year 19##"import wildling.Wildling;
import java.util.List;
Wildling wildling = Wildling.create(List.of("Year 19##"));
Object value = wildling.next();
while (!Boolean.FALSE.equals(value)) {
System.out.println(value);
value = wildling.next();
}cd csharp && ./build.sh
./bin/wildling "Year 19##"using WildlingLib;
var wildling = Wildling.Create(new[] { "Year 19##" });
object value = wildling.Next();
while (value is not false)
{
Console.WriteLine(value);
value = wildling.Next();
}cd visualbasic && ./build.sh
./bin/wildling "Year 19##"Imports WildlingLib
Dim wildling = Wildling.Create({"Year 19##"})
Dim value As Object = wildling.Next()
While Not (TypeOf value Is Boolean AndAlso Not CBool(value))
Console.WriteLine(value)
value = wildling.Next()
End Whilecd cpp && ./build.sh
./bin/wildling "Year 19##"#include "wildling.hpp"
#include <iostream>
wildling::Dictionaries dictionaries;
wildling::Wildling w({"Year 19##"}, dictionaries);
auto value = w.next();
while (value.has_value()) {
std::cout << *value << '\n';
value = w.next();
}cd php && ./build.sh
./bin/wildling "Year 19##"<?php
require 'php/bootstrap.php';
use Wildling\Wildling;
$wildling = Wildling::create(['Year 19##']);
$value = $wildling->next();
while ($value !== false) {
echo $value, "\n";
$value = $wildling->next();
}cd c && ./build.sh
./bin/wildling "Year 19##"cd go && ./build.sh
./bin/wildling "Year 19##"import "github.com/dotmonk/wildling/go/v2/wildling"
w := wildling.New([]string{"Year 19##"}, nil)
for {
value, ok := w.Next()
if !ok {
break
}
fmt.Println(value)
}cd rust && ./build.sh
./bin/wildling "Year 19##"use wildling::{Dictionaries, Wildling};
let dicts = Dictionaries::new();
let mut w = Wildling::new(&["Year 19##".to_string()], &dicts);
while let Some(value) = w.next() {
println!("{value}");
}cd kotlin && ./build.sh
./bin/wildling "Year 19##"import wildling.Wildling
val wildling = Wildling.create(listOf("Year 19##"))
var value = wildling.next()
while (value != false) {
println(value)
value = wildling.next()
}cd ruby && ./build.sh
./bin/wildling "Year 19##"require_relative "lib/wildling"
wildling = Wildling.create(["Year 19##"])
value = wildling.next
while value != false
puts value
value = wildling.next
endcd swift && ./build.sh
./bin/wildling "Year 19##"let wildling = Wildling(patterns: ["Year 19##"])
while let value = wildling.next() {
print(value)
}cd scala && ./build.sh
./bin/wildling "Year 19##"val wildling = Wildling(Seq("Year 19##"))
var value = wildling.next()
while (value != false) {
println(value)
value = wildling.next()
}cd dart && ./build.sh
./bin/wildling "Year 19##"import 'package:wildling/wildling.dart';
final wildling = Wildling(['Year 19##']);
var value = wildling.next();
while (value != false) {
print(value);
value = wildling.next();
}See language READMEs for patterns, CLI options, and templates.
Shared CLI contracts (help text, --check format): docs/cli.md.
Language identifiers live in languages.txt. Every
*/build.sh uses Docker.
./build.sh # build every language (Docker)
./build.sh powershell # build one language
./test.sh # test every language against tests/
./test.sh lua python # test selected languages
./scripts/build-site.sh # documentation site → _site/Shared CLI contracts (help text, --check format, out-of-range stderr + exit 1):
docs/cli.md. Versioning and publishing: docs/publishing.md.
See CONTRIBUTING.md. Security reports: SECURITY.md.
Architecture and stack notes: PLAN.md.
MIT — see LICENSE.