rustqueue 0.2.0

Background jobs without infrastructure — embeddable job queue with zero external dependencies
Documentation
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="RustQueue: background jobs without infrastructure. Add persistent job processing to any Rust app with zero external dependencies.">
    <title>RustQueue | Background Jobs Without Infrastructure</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Manrope:wght@400;500;700;800&family=Syne:wght@500;700;800&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="/dashboard/landing.css">
</head>
<body>
<div class="scene" aria-hidden="true">
    <div class="orb orb-a"></div>
    <div class="orb orb-b"></div>
    <div class="orb orb-c"></div>
</div>

<header class="nav-shell reveal">
    <nav class="container nav">
        <a href="/" class="logo" aria-label="RustQueue home">
            <span class="logo-mark"></span>
            <span class="logo-text">RustQueue</span>
        </a>
        <div class="nav-links">
            <a href="#how-it-works">How It Works</a>
            <a href="#features">Features</a>
            <a href="#get-started">Get Started</a>
            <a href="/blog/background-jobs-without-redis">Blog</a>
        </div>
        <a class="btn btn-ghost" href="/dashboard">Open Dashboard</a>
    </nav>
</header>

<main>
    <section class="hero container">
        <div class="hero-copy reveal">
            <p class="eyebrow">No Redis. No RabbitMQ. No external services.</p>
            <h1>Background Jobs <span>Without Infrastructure</span></h1>
            <p class="lead">
                Add persistent, crash-safe background job processing to any Rust application.
                Three lines of code. Zero operational overhead.
            </p>
            <div class="hero-code">
                <pre><code><span class="kw">let</span> rq = RustQueue::redb(<span class="str">"./jobs.db"</span>)?.build()?;
rq.push(<span class="str">"emails"</span>, <span class="str">"send-welcome"</span>, json!({<span class="str">"to"</span>: <span class="str">"a@b.com"</span>}), None).<span class="kw">await</span>?;

<span class="comment">// That's it. The job is persisted. It survives crashes.</span></code></pre>
            </div>
            <div class="hero-cta">
                <a class="btn btn-primary" href="#get-started">Get Started</a>
                <a class="btn btn-ghost" href="https://github.com/ferax564/rustqueue">View Source</a>
            </div>
        </div>

        <div class="hero-side">
            <article class="panel panel-stats reveal">
                <h2>Single Binary</h2>
                <div class="kpis">
                    <div>
                        <span class="mono">binary</span>
                        <strong>6.8 MB</strong>
                    </div>
                    <div>
                        <span class="mono">startup</span>
                        <strong>10 ms</strong>
                    </div>
                    <div>
                        <span class="mono">idle RAM</span>
                        <strong>15 MB</strong>
                    </div>
                </div>
            </article>
            <article class="panel panel-compare reveal">
                <h2>Setup Comparison</h2>
                <ul class="compare-list">
                    <li><strong>RustQueue</strong> <code>cargo add rustqueue</code></li>
                    <li><span class="muted">BullMQ</span> <code>Install Redis + npm i bullmq</code></li>
                    <li><span class="muted">Celery</span> <code>Install Redis/RabbitMQ + pip install celery</code></li>
                </ul>
            </article>
        </div>
    </section>

    <section id="how-it-works" class="how-it-works container">
        <div class="section-head reveal">
            <p class="eyebrow">How it works</p>
            <h2>Start Embedded. Grow Into a Server.</h2>
        </div>
        <div class="growth-path">
            <article class="growth-step reveal">
                <div class="step-num">1</div>
                <h3>Import the Library</h3>
                <p>Add <code>rustqueue</code> to your Cargo.toml. Use it directly in your app — no server process, no network, no config file.</p>
                <pre class="code-sm"><code>let rq = RustQueue::redb("./jobs.db")?.build()?;
rq.push("emails", "welcome", data, None).await?;</code></pre>
            </article>
            <article class="growth-step reveal">
                <div class="step-num">2</div>
                <h3>Run as a Server</h3>
                <p>When you need language-agnostic access, run the same engine as a standalone server. Same data file, same guarantees.</p>
                <pre class="code-sm"><code>rustqueue serve --storage ./jobs.db</code></pre>
            </article>
            <article class="growth-step reveal">
                <div class="step-num">3</div>
                <h3>Scale With SDKs</h3>
                <p>Connect workers in any language. Node.js, Python, and Go SDKs included — zero runtime dependencies each.</p>
                <pre class="code-sm"><code>const rq = new RustQueueClient("http://localhost:6790");
await rq.push("emails", "welcome", { to: "user@a.com" });</code></pre>
            </article>
        </div>
    </section>

    <section id="features" class="features container">
        <div class="section-head reveal">
            <p class="eyebrow">Batteries included</p>
            <h2>Everything You Need, Nothing You Don't</h2>
        </div>
        <div class="feature-grid">
            <article class="card reveal">
                <h3>Crash-Safe Storage</h3>
                <p>ACID-compliant embedded database. Jobs persist automatically. Safe to kill -9 at any time.</p>
            </article>
            <article class="card reveal">
                <h3>Retries + Backoff + DLQ</h3>
                <p>Fixed, linear, or exponential backoff. Failed jobs land in a dead-letter queue for inspection.</p>
            </article>
            <article class="card reveal">
                <h3>Cron + Interval Scheduling</h3>
                <p>Built-in schedule engine. Cron expressions and fixed intervals with pause/resume.</p>
            </article>
            <article class="card reveal">
                <h3>DAG Workflows</h3>
                <p>Job dependencies with cycle detection and cascade failure. Multi-step pipelines built in.</p>
            </article>
            <article class="card reveal">
                <h3>Webhooks + WebSocket</h3>
                <p>HMAC-signed callbacks on job events. Real-time WebSocket stream for live monitoring.</p>
            </article>
            <article class="card reveal">
                <h3>Observability</h3>
                <p>15+ Prometheus metrics, per-queue gauges, latency histograms. Pre-built Grafana dashboard.</p>
            </article>
        </div>
    </section>

    <section id="get-started" class="launch container reveal">
        <div>
            <p class="eyebrow">Get started</p>
            <h2>Your First Background Job in Two Minutes</h2>
        </div>
        <pre class="code"><code># As a library in your Rust project
cargo add rustqueue tokio serde_json anyhow

# Or as a standalone server
cargo install rustqueue && rustqueue serve

# Or with Docker
docker compose up -d</code></pre>
        <div class="launch-actions">
            <a class="btn btn-primary" href="/dashboard">Open Dashboard</a>
            <a class="btn btn-ghost" href="https://github.com/ferax564/rustqueue">View Source</a>
        </div>
    </section>
</main>

<footer class="footer container">
    <p>RustQueue &middot; Background jobs without infrastructure</p>
    <p class="mono">MIT OR Apache-2.0</p>
</footer>
</body>
</html>