Keep your app fast — run slow work in the background.

A task queue with no message broker. Your app hands slow work — sending email, processing uploads, running pipelines — to a background worker and gets the result later; the queue, results, and schedules all live in one SQLite file (scale to Postgres). First-class Python, Node, and Java over one Rust core.

No brokerRust coreMIT licensedPython · Node · Java
tasks.py
worker · live
from flexiq import Queue

queue = Queue(db_path="tasks.db")

@queue.task(max_retries=3)
def add(a: int, b: int) -> int:
    return a + b

job = add.delay(2, 3)
print(job.result())   # → 5
$flexiq worker --app tasks:queue
scheduler online · 6 workers ready
add(2, 3) =512 ms
How it works

From .delay() to result

Your application code enqueues a job. The Rust scheduler hands it to a worker. The result lands back in the shared store — same core, same queue, no broker in the middle, whichever SDK you called it from.

YOUR CODEenqueue.delay()
QUEUEstoreSQLite · PG
SCHEDULERdispatchRust · Tokio
WORKERSexecute6 · pool
result written back to the store
New here?

Tell us what's going wrong

Not sure you need a task queue? Pick the problem that sounds like yours — flexiq shows you how it handles it, with the exact code and a live demo you can try.

?Which sounds like you?
Pick a problem — see how flexiq handles it.
flexiq handles thisHeavy processing

Hand it off, return instantly, stream the progress back

Never make a user watch a spinner. Push the work into flexiq, respond in milliseconds, and report a live percentage as it runs.

  • Respond now.delay() queues the job and your endpoint returns immediately
  • Report progresscall progress.update() from inside the task
  • User sees it moveyour UI subscribes and shows a live % bar
tasks.py
@queue.task
def process(file_id):
    for i, chunk in enumerate(chunks):
        crunch(chunk)
        progress.update((i+1)/total)  # ← live %
Read the guide
What you get

The convenience of Celery, the performance of Rust

Everything you need to run background jobs in production — and nothing you don't.

Brokerless

No Redis, no RabbitMQ. Everything in a single SQLite file — queue, results, rate limits, schedules. Just pip install or pnpm add and go.

Rust-powered

The scheduler, dispatcher, and storage engine are all Rust. Tokio runtime, OS-thread worker pool; thin PyO3, napi-rs and JNI boundaries keep per-SDK overhead negligible.

One core, native SDKs

First-class Python, Node.js and Java clients are peers over the same Rust core and store — enqueue in one runtime, run workers in another. Zero cross-language dependency.

DAG workflows

Multi-step pipelines as directed acyclic graphs. Fan-out, fan-in, conditions, approval gates, sub-workflows, incremental re-runs, Mermaid viz.

Resource system

Inject database connections, HTTP clients, and cloud SDKs by name. Three-layer pipeline: argument interception, worker DI, transparent proxy.

Production-ready

Retries with exponential backoff, dead letter queue, rate limits, circuit breakers, distributed locks, structured logs, OTel/Sentry/Prometheus.

flexiq vs Celery

Less to operate

The same task, two stacks. Side by side, with the operational delta.

flexiq brokerlesssingle process
from flexiq import Queue queue = Queue(db_path="tasks.db") @queue.task(max_retries=3, rate_limit="100/m") def send_email(to, subject, body): smtp.send(to, subject, body) # Enqueue + run send_email.delay("a@x.com", "Hi", "Body") # $ flexiq worker --app tasks:queue
Celery + Redis3 processes
from celery import Celery app = Celery("myapp", broker="redis://localhost:6379/0", backend="redis://localhost:6379/1") app.conf.task_default_rate_limit = "100/m" @app.task(bind=True, max_retries=3) def send_email(self, to, subject, body): try: smtp.send(to, subject, body) except SMTPError as exc: raise self.retry(exc=exc, countdown=60) # $ celery -A myapp worker (+ Redis)
 flexiqCelery + Redis
Installpip install flexiqpip install celery[redis] + run Redis daemon
Background services1 (worker)3 (worker, beat, Redis)
Default storageSQLite file (built-in)Redis (separate daemon)
Retry config abovemax_retries=3 decorator argtry/except + self.retry(exc=…)
Integrations

Slots into your stack

First-class support for the tools you already run.

Python frameworks

Django
FastAPI
Flask

Node frameworks

Express
Fastify
NestJS

Storage

Postgres
SQLite
Redis

Observability

OpenTelemetry
Sentry
Prometheus
Get started

Five minutes from install to your first job.

The quickstart walks you through defining a task, enqueuing it, and watching the worker run it — in the SDK you already use, no Redis, no broker, no config.

$pip install flexiq
$pnpm add @byteveda/flexiq
implementation("org.byteveda:flexiq:1.0.0")