🪶 Quill (Query-based Unified Issue Lightweight Linker)
quill syncs GitHub issues and comments from multiple public repositories to an on-premise Jira instance. It is fully stateless — no local database or state file needed.
How the stateless design works
Each synced Jira issue gets the original GitHub issue URL stored in a Jira custom field (e.g., customfield_10200). On every sync run, quill queries Jira via JQL to discover which issues are already synced, then creates or updates as needed.
A content hash is embedded as an invisible footer in the Jira description (<!-- quill:sha256:... -->), enabling fast change detection without full-text diffing.
Features
- Multi-repository sync: Map multiple GitHub repos to specific Jira projects.
- Stateless: No local database — works natively in GitHub Actions without caching hacks.
- Incremental updates: SHA256 content hashes detect changes to title, body, labels, or state.
- State transitions: Optionally closes Jira issues when GitHub issues are closed.
- Comment sync: Comments are attributed (e.g., "@user commented on GitHub").
- Dry-run mode: Preview changes without writing to Jira.
- Minimal dependencies: PyGithub, python-jira, pydantic, pyyaml, rich, and stdlib argparse.
Installation
pixi install
This creates a Conda environment, installs all dependencies, and links the quill package in editable mode.
Configuration
quill is configured via a YAML file (see quill.yaml.example):
github:
token: ${GITHUB_TOKEN}
repos:
- owner: your-org
repo: your-repo
jira_project: CAS
sync_labels: true
sync_comments: true
issue_filter:
labels: ["bug", "enhancement"]
state: open
since: "2024-01-01"
jira:
server: https://jira.example.com
token: ${JIRA_PAT}
verify_ssl: true
default_issue_type: Task
github_link_field: customfield_10200 # custom field for GitHub URL
sync:
dry_run: false
batch_size: 50
Jira custom field setup
You need a custom field in Jira (type: URL or Text) to store the GitHub issue link. Set github_link_field in the config to the field's internal ID (e.g., customfield_10200). Ask your Jira admin if you don't have one.
Usage
# Generate a template config
pixi run quill init
# Test connectivity to GitHub and Jira
pixi run quill check
# Run synchronization
pixi run quill sync
# Sync a specific repo only
pixi run quill sync --repo your-org/your-repo
# Dry run — preview without writing
pixi run quill sync --dry-run
# Show synced issue counts (queries Jira)
pixi run quill status
Or using pixi tasks directly:
pixi run sync
pixi run check
pixi run status
pixi run test
Metadata
Release files for quill-sync 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| quill_sync-0.1.4.tar.gz | 108.2 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| quill_sync-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 146.1 kB
Release files / quill_sync-0.1.4.tar.gz
| Download URL | quill_sync-0.1.4.tar.gz |
|---|---|
| Size | 108.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4a10f1b7552ec7810ceb5b50e183b5b6fd6a209fc62a630a2758917167584dd7
|
|
BLAKE2b-256 checksum How to use checksums |
1d6e16ede290568eaae2e8bab22a669c772bc80c03e1ea57da5e283606264e64
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 26, 2026.
Transparency logRelease files / quill_sync-0.1.4-py3-none-any.whl
| Download URL | quill_sync-0.1.4-py3-none-any.whl |
|---|---|
| Size | 38.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
247072190ff1fe72253400e2df90084e667901cc82253dade11b01186d6e33bb
|
|
BLAKE2b-256 checksum How to use checksums |
d1e7c5d2111ed40b8916bcf0db3eaecbf1f63aed4efb4c2435512b571c42cf97
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 26, 2026.
Transparency logSecurity for quill-sync 0.1.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for quill_sync-0.1.4.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 26, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.