Skip to content

v0.26.0 - Major Release (UX and polish focused)#58

Open
TkTech wants to merge 32 commits into
mainfrom
26_ux
Open

v0.26.0 - Major Release (UX and polish focused)#58
TkTech wants to merge 32 commits into
mainfrom
26_ux

Conversation

@TkTech

@TkTech TkTech commented Oct 28, 2025

Copy link
Copy Markdown
Owner

(This is a huge release, changelog to come. WIP)

0.26.0

✨ Improvements

  • Reworked the dashboard, much more informative for operational insights, light/dark themes.
  • Added much, much better composable filtering widgets to both jobs and workflows.
  • Added a visualization of your upcoming (and past) cron schedule, making it easy to identify overloaded periods.
  • Added a realtime view of the internal Chancy communication traffic, helping to debug and identify pain points (like using push() in a loop instead of a single push_many())
  • HTTP API now supports mutation - create queues on the fly, move jobs around, retry workflows, etc...
  • HTTP API is now stable, with documentation still a work in progress.
  • HTTP API now includes an unauthenticated endpoint for health checks, meant for docker/containers (Best way to do containerised healthchecks on workers #54)
  • Added dozens of new metrics, including metrics for the metrics plugin and metrics on workflows.
  • Added postgres 18 to test matrix (@jklaise)
  • The starlette app can now be created without being started for advanced use cases, and the mounting prefix for the SPA can be changed (@jklaise, Feature request: Expose Starlette API app so it can be mounted onto an existing FastAPI/ASGI app #64)
  • Workflow performance has been significantly improved and can now handle many, individual workflows with thousands of jobs without issue.
  • Workflows will now be validated before saving, verifying there are no unreachable nodes in the DAG, no cycles, etc
  • Can now be used as a django-tasks backend, albeit with less functionality than using Chancy directly

🐛 Fixes

image image image image image

@codecov

codecov Bot commented Oct 28, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 41.10613% with 394 lines in your changes missing coverage. Please review.
✅ Project coverage is 67.58%. Comparing base (0cb14b1) to head (e700b54).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
chancy/plugins/api/core.py 0.00% 210 Missing ⚠️
chancy/plugins/api/auth.py 0.00% 60 Missing ⚠️
chancy/worker.py 72.66% 41 Missing ⚠️
chancy/plugins/debug.py 0.00% 19 Missing ⚠️
chancy/plugins/workflow/api.py 0.00% 15 Missing ⚠️
chancy/contrib/django/task_wrapper.py 50.00% 12 Missing ⚠️
chancy/cli/worker.py 0.00% 11 Missing ⚠️
chancy/contrib/django/auth.py 0.00% 8 Missing ⚠️
chancy/contrib/django/backend.py 92.95% 5 Missing ⚠️
chancy/executors/process.py 76.92% 3 Missing ⚠️
... and 6 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main      #58      +/-   ##
==========================================
- Coverage   73.19%   67.58%   -5.62%     
==========================================
  Files          58       62       +4     
  Lines        3193     3754     +561     
==========================================
+ Hits         2337     2537     +200     
- Misses        856     1217     +361     
Flag Coverage Δ
unittests 67.58% <41.10%> (-5.62%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@TkTech TkTech changed the title v0.26.0 - Major Release v0.26.0 - Major Release (UX and polish focused) Oct 29, 2025
@TkTech

TkTech commented Nov 29, 2025

Copy link
Copy Markdown
Owner Author

Added a cron job visualizer.

image

API plugin settings (host, port, debug, allow_origin) are now overridden if the corresponding CLI flags are explicitly provided, even when an Api instance is defined outside the default behaviour.
@fcortes

fcortes commented Dec 17, 2025

Copy link
Copy Markdown

Hi! I saw that you mentioned django-tasks compatibility on this PR but couldn't find any reference about it on the code. Do you mind committing those changes or maybe open a new PR with it (to avoid getting this one so large). I was playing around with chancy and also have a semi-functional implementation and it would be nice to see how you managed some issues I've been encountering.

Great project btw!

Respect CLI flags for API plugin configuration
@phillycheeze

Copy link
Copy Markdown

@TkTech We just started leveraging chancy and super excited for this new dashboard! Any outstanding items you're looking for help with?

@TkTech

TkTech commented Jan 28, 2026

Copy link
Copy Markdown
Owner Author

@TkTech We just started leveraging chancy and super excited for this new dashboard! Any outstanding items you're looking for help with?

It's been running for testing in a production environment since Monday, so I'd say we'll release this weekend if all goes well.

@TkTech

TkTech commented Jan 29, 2026

Copy link
Copy Markdown
Owner Author

Hi! I saw that you mentioned django-tasks compatibility on this PR but couldn't find any reference about it on the code. Do you mind committing those changes or maybe open a new PR with it (to avoid getting this one so large). I was playing around with chancy and also have a semi-functional implementation and it would be nice to see how you managed some issues I've been encountering.

Great project btw!

I've left some comments in the #82 ticket regarding this, there are some behavioral Qs to answer before we commit to anything.

@TkTech TkTech requested a review from Copilot May 28, 2026 23:50
@TkTech TkTech self-assigned this May 28, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR is part of the v0.26.0 major release and, in the areas reviewed here, focuses on improving CI reliability and adding/adjusting test coverage for worker resilience, executor cancellation behavior, trigger isolation under parallel runs, and Django integration.

Changes:

  • Reduced test flakiness by replacing fixed sleeps with condition-based waits and loosening overly strict timing assertions in scale/perf tests.
  • Added targeted tests for worker backoff bounds and heartbeat recovery from transient database errors.
  • Added Django “Tasks backend” integration tests and improved test isolation (prefix/suffix) for parallel runs.

Reviewed changes

Copilot reviewed 113 out of 125 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
tests/test_worker.py Replaces fixed sleeps with polling timeouts; adds backoff/heartbeat resilience tests.
tests/test_scale.py Adjusts fetch timing thresholds to reduce CI noise while still catching regressions.
tests/test_jobs.py Refactors cancellation coverage into executor-specific tests and waits for cancellation completion.
tests/plugins/test_trigger.py Makes trigger tests xdist-safe via per-worker schema/table names and updates assertions/cleanup.
tests/contrib/django/test_models.py Skips ORM model tests under xdist due to static table naming at import time.
tests/contrib/django/test_django_tasks.py Adds Django Tasks backend integration tests (conditional on Django version).
tests/contrib/django/test_connection.py Uses a worker-specific prefix for test isolation.
tests/contrib/django/settings.py Expands Django test settings (secret key, contenttypes, DB config, timezone).
chancy/executors/process.py Updates process executor cancellation/timeout handling used by the new cancellation tests.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +60 to +67
settings.TASKS = {
"default": {
"BACKEND": "chancy.contrib.django.backend.ChancyBackend",
"QUEUES": ["default", "async_queue"],
"OPTIONS": {
"dsn": "postgresql://postgres:localtest@localhost:8190/postgres",
"prefix": chancy.prefix,
},
Comment thread tests/test_jobs.py
Comment on lines +317 to +320
executor = worker._executors.get("cancel_test")
async with asyncio.timeout(10):
while executor.is_job_running(ref):
await asyncio.sleep(0.1)
Comment thread tests/test_jobs.py
Comment on lines +343 to +346
executor = worker._executors.get("async_cancel_test")
async with asyncio.timeout(10):
while executor.is_job_running(ref):
await asyncio.sleep(0.1)
Comment on lines +60 to +67
settings.TASKS = {
"default": {
"BACKEND": "chancy.contrib.django.backend.ChancyBackend",
"QUEUES": ["default", "async_queue"],
"OPTIONS": {
"dsn": "postgresql://postgres:localtest@localhost:8190/postgres",
"prefix": chancy.prefix,
},
Comment thread tests/test_jobs.py
Comment on lines +317 to +320
executor = worker._executors.get("cancel_test")
async with asyncio.timeout(10):
while executor.is_job_running(ref):
await asyncio.sleep(0.1)
Comment thread tests/test_jobs.py
Comment on lines +343 to +346
executor = worker._executors.get("async_cancel_test")
async with asyncio.timeout(10):
while executor.is_job_running(ref):
await asyncio.sleep(0.1)
Comment on lines +150 to 153
async def _handle_timeout(self, job_id: UUID, time_limit: int):
try:
await asyncio.sleep(time_limit)
pid = self.pids_for_job.get(job_id)
Comment on lines +60 to +67
settings.TASKS = {
"default": {
"BACKEND": "chancy.contrib.django.backend.ChancyBackend",
"QUEUES": ["default", "async_queue"],
"OPTIONS": {
"dsn": "postgresql://postgres:localtest@localhost:8190/postgres",
"prefix": chancy.prefix,
},
Comment thread tests/test_jobs.py
Comment on lines +317 to +320
executor = worker._executors.get("cancel_test")
async with asyncio.timeout(10):
while executor.is_job_running(ref):
await asyncio.sleep(0.1)
Comment thread tests/test_jobs.py
Comment on lines +343 to +346
executor = worker._executors.get("async_cancel_test")
async with asyncio.timeout(10):
while executor.is_job_running(ref):
await asyncio.sleep(0.1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants