{"id":26026426,"url":"https://github.com/chrisguidry/docket","last_synced_at":"2026-05-04T02:04:33.177Z","repository":{"id":279509946,"uuid":"939050384","full_name":"chrisguidry/docket","owner":"chrisguidry","description":"docket is a distributed background task system for Python","archived":false,"fork":false,"pushed_at":"2026-01-21T22:16:20.000Z","size":965,"stargazers_count":80,"open_issues_count":9,"forks_count":5,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-01-22T07:10:06.508Z","etag":null,"topics":["python","redis","tasks"],"latest_commit_sha":null,"homepage":"https://chrisguidry.github.io/docket/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chrisguidry.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-25T23:02:41.000Z","updated_at":"2026-01-21T22:16:23.000Z","dependencies_parsed_at":"2025-10-07T22:18:33.184Z","dependency_job_id":"ec7fd84e-587b-4306-b31a-fb539027e567","html_url":"https://github.com/chrisguidry/docket","commit_stats":null,"previous_names":["chrisguidry/docket"],"tags_count":55,"template":false,"template_full_name":null,"purl":"pkg:github/chrisguidry/docket","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisguidry%2Fdocket","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisguidry%2Fdocket/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisguidry%2Fdocket/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisguidry%2Fdocket/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chrisguidry","download_url":"https://codeload.github.com/chrisguidry/docket/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisguidry%2Fdocket/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28730311,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T10:24:43.181Z","status":"ssl_error","status_checked_at":"2026-01-24T10:24:36.112Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python","redis","tasks"],"created_at":"2025-03-06T14:56:25.387Z","updated_at":"2026-05-04T02:04:33.163Z","avatar_url":"https://github.com/chrisguidry.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Docket is a distributed background task system for Python functions with a focus\non the scheduling of future work as seamlessly and efficiently as immediate work.\n\n[![PyPI - Version](https://img.shields.io/pypi/v/pydocket)](https://pypi.org/project/pydocket/)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pydocket)](https://pypi.org/project/pydocket/)\n[![GitHub main checks](https://img.shields.io/github/check-runs/chrisguidry/docket/main)](https://github.com/chrisguidry/docket/actions/workflows/ci.yml)\n[![Codecov](https://img.shields.io/codecov/c/github/chrisguidry/docket)](https://app.codecov.io/gh/chrisguidry/docket)\n[![PyPI - License](https://img.shields.io/pypi/l/pydocket)](https://github.com/chrisguidry/docket/blob/main/LICENSE)\n[![Documentation](https://img.shields.io/badge/docs-latest-blue.svg)](https://docket.lol/)\n\n## At a glance\n\n```python\nfrom datetime import datetime, timedelta, timezone\n\nfrom docket import Docket\n\n\nasync def greet(name: str, greeting=\"Hello\") -\u003e None:\n    print(f\"{greeting}, {name} at {datetime.now()}!\")\n\n\nasync with Docket() as docket:\n    await docket.add(greet)(\"Jane\")\n\n    now = datetime.now(timezone.utc)\n    soon = now + timedelta(seconds=3)\n    await docket.add(greet, when=soon)(\"John\", greeting=\"Howdy\")\n```\n\n```python\nfrom docket import Docket, Worker\n\nasync with Docket() as docket:\n    async with Worker(docket) as worker:\n        worker.register(greet)\n        await worker.run_until_finished()\n```\n\n```\nHello, Jane at 2025-03-05 13:58:21.552644!\nHowdy, John at 2025-03-05 13:58:24.550773!\n```\n\nCheck out our docs for more [details](https://docket.lol/),\n[examples](https://docket.lol/en/latest/getting-started/), and the [API\nreference](https://docket.lol/en/latest/api-reference/).\n\n## Why `docket`?\n\n⚡️ Snappy one-way background task processing without any bloat\n\n📅 Schedule immediate or future work seamlessly with the same interface\n\n⏭️ Skip problematic tasks or parameters without redeploying\n\n🌊 Purpose-built for Redis streams\n\n🧩 Fully type-complete and type-aware for your background task functions\n\n💉 Dependency injection like FastAPI, Typer, and FastMCP for reusable resources\n\n## Installing `docket`\n\nDocket is [available on PyPI](https://pypi.org/project/pydocket/) under the package name\n`pydocket`. It targets Python 3.10 or above.\n\nWith [`uv`](https://docs.astral.sh/uv/):\n\n```bash\nuv pip install pydocket\n\nor\n\nuv add pydocket\n```\n\nWith `pip`:\n\n```bash\npip install pydocket\n```\n\nDocket requires a [Redis](http://redis.io/) server with Streams support (which was\nintroduced in Redis 5.0.0). Docket is tested with:\n\n- Redis 6.2, 7.4, and 8.6 (standalone and cluster modes)\n- [Valkey](https://valkey.io/) 8.1\n- In-memory backend via [burner-redis](https://github.com/PrefectHQ/burner-redis) for testing\n\nFor testing without Redis, use the in-memory backend:\n\n```python\nfrom docket import Docket\n\nasync with Docket(name=\"my-docket\", url=\"memory://my-docket\") as docket:\n    # Use docket normally - all operations are in-memory\n    ...\n```\n\nSee [Testing with Docket](https://docket.lol/en/latest/testing/#using-in-memory-backend-no-redis-required) for more details.\n\n# Hacking on `docket`\n\nWe use [`uv`](https://docs.astral.sh/uv/) for project management, so getting set up\nshould be as simple as cloning the repo and running:\n\n```bash\nuv sync\n```\n\nThe to run the test suite:\n\n```bash\npytest\n```\n\nWe aim to maintain 100% test coverage, which is required for all PRs to `docket`. We\nbelieve that `docket` should stay small, simple, understandable, and reliable, and that\nbegins with testing all the dusty branches and corners. This will give us the\nconfidence to upgrade dependencies quickly and to adapt to new versions of Redis over\ntime.\n\nTo work on the documentation locally:\n\n```bash\nuv sync\nuv run zensical serve\n```\n\nThis will start a local preview server. The docs are built with\n[Zensical](https://zensical.org/) and configured in `mkdocs.yml`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrisguidry%2Fdocket","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchrisguidry%2Fdocket","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrisguidry%2Fdocket/lists"}