<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="theme-color" content="#fdfcfc"> <meta name="description" content="Rak is a programming language for hackers and OSINT investigators. First-class hex, pipelines, regex, binary pattern matching, FFI, memory-mapped files — and a built-in desktop IDE."> <title>Rak: A language for hackers and OSINT investigators</title> <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='4' fill='%23fdfcfc'/%3E%3Cpath d='M9 9l14 0 0 14-14 0z' fill='none' stroke='%23201d1d' stroke-width='2.5'/%3E%3C/svg%3E"> <link rel="stylesheet" href="style.css"></head><body class="landing"><header class="site-header"> <div class="container header-inner"> <a class="brand" href="index.html"> <span class="brand-mark">R</span> <span class="brand-name">Rak</span> <span class="brand-ver">v8.0.0</span> </a> <nav class="site-nav"> <a href="#features">Features</a> <a href="#status">Status</a> <a href="#feel">Examples</a> <a href="docs.html">Docs</a> </nav> <div class="header-actions"> <button id="theme-toggle" class="btn btn-ghost btn-sm" type="button" aria-label="Toggle theme"></button> <a class="btn btn-ghost btn-sm" href="https://github.com/Louiml/Rak" target="_blank" rel="noopener">GitHub</a> </div> </div></header><main> <section class="hero"> <div class="hero-inner reveal is-visible"> <h1 class="hero-title">A language for <span class="grad">hackers</span> & OSINT</h1> <p class="lead">English-readable syntax, first-class hexadecimal, pipelines, regex literals, and a systems stdlib: foreign function calls, zero-copy memory maps, raw sockets, and wire parsers. Write scanners like sentences.</p> <div class="cta-row"> <a class="btn btn-primary" href="docs.html"> Read the docs <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <a class="btn btn-ghost" href="#features">What's new</a> <a class="text-link" href="#feel">See it in action <svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a> </div> </div> <div class="hero-tui reveal is-visible"> <div class="tui-bar"> <span class="tui-tabs"> <span class="tui-tab">summary</span> <span class="tui-tab active">terminal</span> <span class="tui-tab">console</span> </span> <span class="tui-status">rak — recon.rak — ~/lab</span> </div> <div class="tui-wordmark"><pre>███ ██ █ ██ █ █ █ █ ████ ████ ███ █ █ █ █ ██ █ █ █ █ █</pre></div> <div class="tui-body"> <pre><code data-lang="rak">fn sniff(d: bytes) { match d { [0x89, 'P', 'N', 'G', ..] => { return "png" }, ['%', 'P', 'D', 'F', ..] => { return "pdf" }, _ => { return "unknown" }, }}let m = mmap_open("trace.pcap", "r")let hits = mmap_slice(m, 0x1000, 64) |> regex_find_all(/\d+\.\d+\.\d+\.\d+/g)dump hits</code></pre> <div class="tui-prompt-row"> <span class="tui-caret">▮</span> <span>rak> scan "10.0.0.0/24" { range: [0x0016, 0x01F4] }</span> </div> </div> <div class="tui-keyhints"> <span><b>tab</b> switch agent</span> <span><b>ctrl-p</b> commands</span> <span><b>ctrl-r</b> run</span> </div> </div> </section> <section class="section" id="features"> <div class="container"> <div class="section-head reveal"> <p class="kicker">Features</p> <h2 class="section-title">What is Rak?</h2> <p class="section-sub">One frontend, two backends: a tree-walking interpreter and a bytecode VM. Everything below ships in the compiler and works in the IDE.</p> </div> <div class="feature-grid"> <div class="feature reveal"> <div class="feature-ico">[+]</div> <h4>Pipeline <code style="color:var(--ink)">|></code></h4> <p>Chain calls left-to-right. <code>data |> parse |> load</code> reads top-to-bottom like a sentence.</p> </div> <div class="feature reveal"> <div class="feature-ico">[+]</div> <h4>Regex literals</h4> <p>Write <code>/\d+/g</code> inline. A <code>/</code> after a value is division; everywhere else it's a regex.</p> </div> <div class="feature reveal"> <div class="feature-ico">[+]</div> <h4>Binary patterns</h4> <p>Match byte slices by magic number: <code>[0x89, 'P', 'N', 'G', ..]</code>. Built for PCAP and file sniffing.</p> </div> <div class="feature reveal"> <div class="feature-ico">[+]</div> <h4>Traits & protocols</h4> <p>Implement <code>Display</code>, <code>Iterable</code>, <code>Index</code>. They drive <code>dump</code>, <code>for</code>, and <code>obj[key]</code>.</p> </div> <div class="feature reveal"> <div class="feature-ico">[+]</div> <h4>Systems stdlib</h4> <p>FFI, memory-mapped files, raw sockets, async I/O, DNS/TLS/PCAP parsers, macros, and modules.</p> </div> <div class="feature reveal"> <div class="feature-ico">[+]</div> <h4>Bytecode VM</h4> <p>The VM runs the same code ~6x faster than the tree-walker. Compare with <code>rakc bench</code>.</p> </div> <div class="feature reveal"> <div class="feature-ico">[+]</div> <h4>VPN toolkit</h4> <p>X25519 key exchange, ChaCha20-Poly1305 AEAD, HKDF/PBKDF2 key derivation, tunnel framing and an encrypted UDP transport — all application-layer, Windows-friendly.</p> </div> <div class="feature reveal"> <div class="feature-ico">[+]</div> <h4>Desktop IDE</h4> <p>A Tauri + Next.js IDE with a real-time-explorer, smart completion and predictions, an in-editor searchable docs panel (<span class="kbd">Ctrl+K</span>), and recent projects on the welcome screen.</p> </div> </div> </div> </section> <section class="section" id="status"> <div class="container"> <div class="section-head reveal"> <p class="kicker">Project status</p> <h2 class="section-title">Real today, more coming</h2> <p class="section-sub">The interpreter, VM, systems stdlib, standard library, and IDE all run today. The next slice of the spec is macros-rules repetition, live capture, and full libffi.</p> </div> <div class="card notice reveal"> <h3>Start in 30 seconds</h3> <p>Grab a release from GitHub, or build from source. Then open the IDE and the tutorial walks you through everything new.</p> <div class="btn-row"> <a class="btn btn-primary" href="https://github.com/Louiml/Rak/releases" target="_blank" rel="noopener"> Download </a> <a class="btn btn-ghost" href="docs.html">Read the docs</a> </div> </div> </div> </section> <section class="section" id="feel"> <div class="container"> <div class="section-head reveal"> <p class="kicker">The language</p> <h2 class="section-title">English in, packets out</h2> <p class="section-sub">No ceremony. Read it like a sentence, run it like a scanner.</p> </div> <div class="grid-2"> <figure class="codeblock reveal" data-title="pipeline.rak"> <div class="codeblock-bar" aria-hidden="true"><span class="bar-title">pipeline.rak</span></div> <pre><code data-lang="rak">fn inc(n) { return n + 1 }fn dbl(n) { return n * 2 }// pipeline reads left-to-rightdump 5 |> inc |> dbl // 12// regex literals match inlinelet re = /\d+/gdump re.find_all("a1 b22 c333") // [1, 22, 333]</code></pre> </figure> <figure class="codeblock reveal" data-title="sniff.rak"> <div class="codeblock-bar" aria-hidden="true"><span class="bar-title">sniff.rak</span></div> <pre><code data-lang="rak">// binary pattern matching over bytesfn sniff(d: bytes) { match d { [0x89, 'P', 'N', 'G', ..] => { return "png" }, [0xFF, 0xD8, 0xFF, ..] => { return "jpeg" }, _ => { return "unknown" }, }}dump sniff(b"\x89PNG\x0d\x0a\x1a\x0a") // png</code></pre> </figure> <figure class="codeblock reveal" data-title="ffi.rak"> <div class="codeblock-bar" aria-hidden="true"><span class="bar-title">ffi.rak</span></div> <pre><code data-lang="rak">// call C from Rakextern "C" from "libc.so.6" { fn abs(n: i32) -> i32}dump abs(-42) // 42let libc = ffi_load("libc.so.6")let pid = libc.call("getpid", [])</code></pre> </figure> <figure class="codeblock reveal" data-title="recon.rak"> <div class="codeblock-bar" aria-hidden="true"><span class="bar-title">recon.rak</span></div> <pre><code data-lang="rak">// async I/O + raw packet forginglet f = tcp_probe(host, 80, 200)let open = await flet pkt = net_raw_tcp_syn("10.0.0.5", "10.0.0.10", 12345, 80)dump len(pkt) // 40 bytesdns_query("example.com", "A")</code></pre> </figure> </div> </div> </section></main><footer> <div class="container footer-inner"> <p>Rak © 2026 Louiml · MIT License</p> <p><a href="docs.html">Documentation</a> · <a href="https://github.com/Louiml/Rak/releases" target="_blank" rel="noopener">Releases</a> · <a href="https://github.com/Louiml/Rak" target="_blank" rel="noopener">GitHub</a></p> </div></footer><script src="script.js"></script></body></html>