Background Task Queue

A Celery-inspired Redis-backed asynchronous queue system with zero-config discovery.

Defining Tasks

#[floz::task(queue = "default", max_retries = 3)]
async fn send_email(to: String, subject: String) -> Result<(), floz::FlozError> {
    // Do background work...
    Ok(())
}

Dispatching Tasks

// Dispatch immediately
send_email::dispatch("user@example.com".into(), "Welcome".into())
    .enqueue()?;

// Schedule with delay
send_email::dispatch("admin@site.com".into(), "Daily Report".into())
    .delay(chrono::Duration::hours(24))
    .enqueue()?;

Worker Runtime

// Start 4 concurrent worker threads alongside the web server
floz::App::new()
    .with_worker(4)
    .run(|cfg| {
        app::configure(cfg);
    })
    .await

Note: Requires the worker feature flag and a valid REDIS_URL configured in your environment.

Auth Module

JWT token management and API key generation. Feature-gated — zero overhead if not used.

JWT

let (token, expiry) = jwt::create_token(
    "user-123", "admin", b"secret",
    "my-app", "floz", 24,  // hours
)?;

let claims = jwt::verify_token(&token, b"secret", "my-app", "floz")?;
// claims.sub → "user-123", claims.role → "admin"

API Keys

let key = api_key::generate_api_key("sk");
// → "sk_V1StGXR8_Z5jdHi6B-myT"
let hash = api_key::hash_api_key(&key)?;        // bcrypt
let valid = api_key::verify_api_key_hash(&key, &hash)?;

Logging

Daily-rotating log files with stdout mirroring. Auto-initialized by App::run().

// Auto-initialized when logger feature is enabled
floz::logger::init_tracing();

// Output: logs/my-app.log.2026-04-03
// Daily rotation, non-blocking writes
// Override filter via RUST_LOG env var

Utility Macros

MacroDescriptionExample
res!(body)JSON response (200 or custom status)res!(body, 201)
pp!(&data)Pretty-print in DEV, compact in PRODpp!(&users).unwrap()
echo!(...)Debug log only when ECHO is setecho!("user {}", id)
xquery!(sql, ...)SQLx query with auto-bindxquery!("SELECT...", id)
to_json!(row)Convert sqlx::Row to JSON mapto_json!(row)

Controller Utilities

JsonResponse

JsonResponse::ok(&users)              // 200 (pretty in DEV)
JsonResponse::created(&user)          // 201
JsonResponse::no_content()            // 204
JsonResponse::bad_request("Invalid")  // 400
JsonResponse::not_found("Not found")  // 404

PaginationParams

// Auto-extracted from query string
// /users?limit=20&offset=0&order_by=name&search=alice

#[ntex::web::get("/users")]
async fn list(params: web::types::Query<PaginationParams>) -> HttpResponse {
    let p = params.into_inner();
    // p.limit, p.offset, p.order_by, p.filter, p.search
}

CLI Tool

The floz-cli scaffolds projects and generates domain modules.

$ floz new my-app --template api
$ floz generate model Post title:string body:text
$ floz generate scaffold Post title:string body:text

# Generates: src/app/post/{mod,model,route}.rs

Project Templates

TemplateFeaturesUse Case
minimalSingle-file server + healthMicroservices
apiModular src/app/ structureREST APIs
saasFull: auth + workers + RedisSaaS apps