All notable changes to FlashQ will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Web Dashboard: Starlette-based real-time monitoring UI with dark theme
- Task list with state/queue/search filtering
- Task detail modal with result, error, traceback
- Cancel/revoke actions
- Auto-refresh (5s)
- CLI:
flashq dashboard myapp:app --port 5555
- Canvas Primitives: Celery-inspired task composition
Signature: task reference with args/kwargs/optionsChain: sequential execution, result piped to nextGroup: parallel executionChord: group + callback when all complete.s()and.si()(immutable) shorthand on Task
- Rate Limiting: Token bucket algorithm
- Per-task and global rate limits
RateLimitermiddleware- Rate format:
"100/m","60/h","10/s"
- Dead Letter Queue: Permanent failure management
DeadLetterQueuewith add, list, replay, replay_all, purge_DLQMiddlewarefor automatic capture
- Benchmark Suite: Throughput and latency measurements
- Enqueue throughput: ~19,000 tasks/s
- Concurrency scaling tests
- CPU-bound and I/O-bound workloads
- 20 production hardening edge case tests
- Examples: basic, advanced (canvas + middleware + DLQ), FastAPI integration
- Group.delay() no longer injects
__group_id__into task kwargs - Chain.delay() no longer injects
__chain_id__into task kwargs
- Core Engine:
FlashQapp class with@app.task()decorator - Task System: Type-safe
.delay()and.apply()with PEP-612ParamSpec - SQLite Backend: WAL journal mode,
BEGIN IMMEDIATEfor atomic dequeue, zero dependencies - PostgreSQL Backend:
LISTEN/NOTIFYfor real-time delivery,FOR UPDATE SKIP LOCKED - Redis Backend: Lists for queues, sorted sets for scheduling, Lua scripts for atomicity
- Worker: Thread pool executor, async+sync task execution, graceful shutdown (SIGINT/SIGTERM)
- Task Timeouts: Non-blocking
ThreadPoolExecutorwithshutdown(wait=False) - Middleware System:
before_execute,after_execute,on_error,on_retry,on_dead- Built-in:
LoggingMiddleware,TimeoutMiddleware
- Built-in:
- Periodic Scheduler:
every(hours=6)andcron("0 9 * * 1-5")syntax - Retry System: Exponential backoff, configurable max retries and delay
- CLI:
flashq worker,flashq info,flashq purge - Serializers: JSON (default) and Pickle
- Type Safety:
py.typedmarker, full type annotations - CI/CD: GitHub Actions (Python 3.10–3.13, ubuntu/macos/windows) + PyPI publish on tag
- 168 core tests at ~95% coverage