@@ -41,7 +41,7 @@ <h1>The production worker for Django Tasks</h1>
4141 development only. < strong > < span data-brand > Oxpull</ span > </ strong > stores the queue in the
4242 database you already run and executes tasks with a separate worker process. No broker,
4343 no Redis, nothing new to operate.</ p >
44- < p class ="hero-sub "> The part that matters: < code > enqueue()</ code > is a plain INSERT on your
44+ < p class ="hero-sub "> < code > enqueue()</ code > is a plain INSERT on your
4545 default connection, so a task enqueued inside < code > transaction.atomic()</ code > commits
4646 or rolls back together with your business data. A broker cannot share your database
4747 transaction. There is no window where an order exists without its email task, and no
@@ -70,8 +70,8 @@ <h2>Measured, not promised</h2>
7070 37,804 tasks, including nine minutes in which a worker was SIGKILLed every 20 to
7171 45 seconds. Every task reached a terminal state, no task ran twice in this run,
7272 and every interrupted execution was re-executed inside the documented bound.
73- Execution is at-least-once: a worker killed after the work finished but before
74- the result was recorded leaves that task to run again, and the harness asserts
73+ Execution is at-least-once. A worker killed after the work finished but before
74+ the result was recorded leaves that task to run again. The harness asserts
7575 that a second execution is only ever attributable to a kill.</ p >
7676 < p class ="caveat "> No-op benchmarks flatter every queue, so read these as relative, not as
7777 capacity planning. The full methodology, every run, and the raw per-sample data ship in
@@ -89,12 +89,12 @@ <h3><span data-package>django-ox</span> <span class="tag">BSD-3 · free fo
8989 < ul >
9090 < li > Durable queue in your existing database</ li >
9191 < li > Transactional enqueue</ li >
92- < li > At-least-once execution, SKIP LOCKED claiming</ li >
92+ < li > At-least-once execution, SKIP LOCKED claiming on PostgreSQL and MySQL 8 </ li >
9393 < li > Retries with backoff, per-attempt tracebacks</ li >
9494 < li > Reaper for tasks from dead workers</ li >
9595 < li > Graceful drain on SIGTERM</ li >
9696 < li > Priorities, deferred tasks, multiple queues</ li >
97- < li > Recurring schedules, cron syntax </ li >
97+ < li > Recurring schedules, cron or fixed interval, in settings or the Django admin </ li >
9898 < li > Pruning command for finished rows</ li >
9999 < li > Stats API and health command</ li >
100100 </ ul >
@@ -108,15 +108,15 @@ <h3><span data-package>django-ox</span> <span class="tag">BSD-3 · free fo
108108 < div class ="tier pro-tier ">
109109 < h3 > < span data-brand > Oxpull</ span > Pro < span class ="tag "> commercial license</ span > </ h3 >
110110 < ul >
111- < li > Batches: enqueue many, track as one </ li >
111+ < li > Batches: group tasks, with a callback when every member is settled </ li >
112112 < li > Unique tasks (deduplication)</ li >
113113 < li > Rate limiting</ li >
114114 < li > Email support from the maintainer</ li >
115115 < li > Requires Django 6.0 or later</ li >
116116 </ ul >
117- < p class ="note "> All three are built and tested. Not yet on sale: the purchase path is still
118- being set up, and the waitlist below is how to hear when it opens. Delivered from a private
119- package index using credentials issued per company, with no licence key and no runtime check
117+ < p class ="note "> All three are built and tested. Pro is not on sale yet, and the waitlist
118+ below is how to hear when it opens. Delivered from a private
119+ package index using credentials issued per company, with no license key and no runtime check
120120 to break your production. Install stays < code > pip install</ code > .</ p >
121121 </ div >
122122 </ div >
@@ -136,7 +136,8 @@ <h2>Pricing, and the waitlist</h2>
136136 </ form >
137137 < p id ="form-error " hidden > That didn't go through. Check the address and try again.</ p >
138138 < p class ="privacy "> Your email is used only to tell you when Pro launches. Reply
139- "remove" and it is deleted.</ p >
139+ "remove", or write to
< a href ="
mailto:[email protected] "
> [email protected] </ a > ,
140+ and it is deleted.</ p >
140141 </ div >
141142 </ section >
142143
@@ -146,28 +147,29 @@ <h2>Questions you should ask</h2>
146147 < h3 > What is the license situation?</ h3 >
147148 < p > The worker itself, < span data-package > django-ox</ span > , is BSD 3-Clause and stays
148149 that way. Pro is separate code under a commercial license, sold per company. The free
149- tier is not a demo; it is the backend the docs mean when they say production systems
150+ tier is not a demo. It is the backend the docs mean when they say production systems
150151 need a durable queue and a worker process.</ p >
151152
152153 < h3 > When does this ship?</ h3 >
153154 < p > The open source worker is live: < code > pip install django-ox</ code > , with
154155 < a href ="https://oxpull.com/django-ox/ "> documentation here</ a > . Pro is built and
155- tested; what is left is the purchase path. Waitlist email is the announcement channel.</ p >
156+ tested. What is left is the purchase path. Waitlist email is the announcement channel.</ p >
156157
157158 < h3 > Who is behind it?</ h3 >
158159 < p > An independent software vendor with one product: this one. You will know who
159160 maintains it, contracts get signed under the company name, and support answers come
160161 from the person who wrote the code.</ p >
161162
162163 < h3 > What does support look like?</ h3 >
163- < p > Open source: GitHub issues, taken seriously. Pro: email support from
164- the maintainer. If your procurement needs a PO and an invoice instead of a card,
165- say so on the waitlist; invoiced purchasing is planned alongside self-serve.</ p >
164+ < p > Open source support is on GitHub issues. Pro comes with email support from
165+ the maintainer at
< a href ="
mailto:[email protected] "
> [email protected] </ a > . If your
166+ procurement needs a PO and an invoice instead of a card, write to that address.
167+ Invoiced purchasing is planned alongside self-serve.</ p >
166168
167169 < h3 > Do I need Pro to run production?</ h3 >
168170 < p > No. Durability, retries, the reaper, and graceful shutdown are all in the free
169171 worker, and so are the stats API and the health command. Pro adds three
170- things the free tier does not do: batching , deduplication and rate limiting.
172+ things the free tier does not do: batches , deduplication and rate limiting.
171173 Support comes with it. Pro needs Django 6.0 or later. The free worker also
172174 runs on Django 5.2 LTS through the < code > django-tasks</ code > backport, and
173175 Pro does not.</ p >
0 commit comments