{"id":50908206,"url":"https://github.com/aniketc068/atick-python","last_synced_at":"2026-06-16T07:04:12.083Z","repository":{"id":364945720,"uuid":"1265984772","full_name":"Aniketc068/ATick-Python","owner":"Aniketc068","description":"Standalone Python library for PDF digital signatures — PAdES/CMS, USB tokens, Windows store, Indian eSign, timestamps, LTV and a green-tick appearance Adobe shows as valid. Zero dependencies.","archived":false,"fork":false,"pushed_at":"2026-06-15T07:40:55.000Z","size":9427,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-15T08:24:04.543Z","etag":null,"topics":["adobe","cades","cryptography","digital-signature","esign","ltv","pades","pdf","pdf-signature","pkcs11","python","sign-pdf","timestamp"],"latest_commit_sha":null,"homepage":"https://atick.readthedocs.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Aniketc068.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-11T08:27:42.000Z","updated_at":"2026-06-15T07:41:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Aniketc068/ATick-Python","commit_stats":null,"previous_names":["aniketc068/atick-python"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/Aniketc068/ATick-Python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-Python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-Python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-Python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-Python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Aniketc068","download_url":"https://codeload.github.com/Aniketc068/ATick-Python/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-Python/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34393306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["adobe","cades","cryptography","digital-signature","esign","ltv","pades","pdf","pdf-signature","pkcs11","python","sign-pdf","timestamp"],"created_at":"2026-06-16T07:04:11.119Z","updated_at":"2026-06-16T07:04:12.074Z","avatar_url":"https://github.com/Aniketc068.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Python/main/assets/atick_logo.png\" alt=\"ATick\" width=\"260\"/\u003e\n\n# ATick for Python\n\n**Standalone PDF digital-signature library for Python — PAdES / CMS signing with zero external dependencies.**\n\n[![PyPI](https://img.shields.io/badge/pip%20install-atick-2ea44f)](https://pypi.org/project/atick/)\n[![Downloads](https://img.shields.io/pypi/dm/atick?color=2ea44f\u0026label=downloads)](https://pepy.tech/project/atick)\n[![Python](https://img.shields.io/badge/python-3.8%2B-blue)](https://www.python.org/)\n[![PAdES](https://img.shields.io/badge/PAdES-B--B%20%7C%20B--T%20%7C%20B--LT%20%7C%20B--LTA-success)](#pades-levels)\n[![Zero deps](https://img.shields.io/badge/dependencies-0-brightgreen)](#why-atick)\n[![License: AGPL v3](https://img.shields.io/badge/license-AGPL--3.0-blue)](LICENSE)\n[![Also for Java](https://img.shields.io/badge/also%20for-Java-007396?logo=openjdk\u0026logoColor=white)](https://github.com/Aniketc068/ATick-Java)\n[![Also for .NET](https://img.shields.io/badge/also%20for-.NET-512BD4?logo=dotnet\u0026logoColor=white)](https://github.com/Aniketc068/ATick-DotNet)\n[![Also for Node.js](https://img.shields.io/badge/also%20for-Node.js-339933?logo=node.js\u0026logoColor=white)](https://github.com/Aniketc068/ATick-Node)\n[![Also for PHP](https://img.shields.io/badge/also%20for-PHP-777BB4?logo=php\u0026logoColor=white)](https://github.com/Aniketc068/ATick-PHP)\n\n\u003c/div\u003e\n\n**Also available in other languages** — the same ATick engine, the same API, native to each ecosystem:\n\n| Language | Install | Source · Docs |\n|---|---|---|\n| **Java** | `io.github.aniketc068:atick` (Maven) | [ATick-Java](https://github.com/Aniketc068/ATick-Java) · [docs](https://atick-java.readthedocs.io/) |\n| **.NET** | `dotnet add package ATick` | [ATick-DotNet](https://github.com/Aniketc068/ATick-DotNet) · [docs](https://atick-dotnet.readthedocs.io/) |\n| **Node.js** | `npm install atick` | [ATick-Node](https://github.com/Aniketc068/ATick-Node) · [docs](https://atick-node.readthedocs.io/) |\n| **PHP** | `composer require aniketc068/atick` | [ATick-PHP](https://github.com/Aniketc068/ATick-PHP) · [docs](https://atick-php.readthedocs.io/) |\n\n---\n\nATick signs PDFs the way Adobe Acrobat and the EU DSS do — **PAdES baseline** signatures with\ntimestamps and long-term validation — but everything ships **inside the one package**, so there are\n**no dependencies to install** at all. `pip install atick` and you are done. There's a Python API\n*and* a full command-line tool.\n\n```python\nimport atick\n\nsigned = atick.sign_pfx(\n    open(\"doc.pdf\", \"rb\").read(),\n    pfx=open(\"my.pfx\", \"rb\").read(), password=\"••••\",\n    style=atick.Style(cn=\"Aniket Chaturvedi\", reason=\"Approved\"),\n    placements=[(1, (300, 55, 575, 175))],\n    pades=True, timestamp=True, ltv=True,     # PAdES-B-LT\n)\nopen(\"signed.pdf\", \"wb\").write(signed)\n```\n\n---\n\n## The green tick your readers trust\n\nATick draws a verified-signature appearance with a green tick. When the certificate is valid and\ntrusted, Adobe Reader / Acrobat shows **“Signed and all signatures are valid.”**\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Python/main/assets/valid_signature_adobe.png\" alt=\"Adobe — signed and all signatures are valid\" width=\"560\"/\u003e\n\u003c/div\u003e\n\nAdobe colours that same mark by the signature's real status — you don't draw these, Adobe does:\n\n\u003ctable align=\"center\"\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Python/main/assets/signature_appearance.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eValid \u0026amp; trusted\u003c/b\u003e\u003cbr/\u003egreen tick\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Python/main/assets/sig_unknown.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eValidity unknown\u003c/b\u003e\u003cbr/\u003eyellow “?”\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Python/main/assets/sig_notverified.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eNot verified\u003c/b\u003e\u003cbr/\u003e“?” not validated\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Python/main/assets/sig_invalid.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eInvalid\u003c/b\u003e\u003cbr/\u003ered cross\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nThe **green** tick appears only when the signature is valid *and* the certificate chains to a root\nAdobe trusts.\n\n---\n\n## Why ATick\n\n| | ATick |\n|---|---|\n| **Zero dependencies** | the crypto, PFX/PKCS#12, PKCS#11, image decode, timestamp \u0026 LTV are all built in — nothing else to install |\n| **Four signing back-ends** | `.pfx`/`.p12` **or `.pem`** file · USB token / smart-card / HSM (PKCS#11) · Windows certificate store (its certificate picker) |\n| **Full PAdES** | B-B, B-T, B-LT, B-LTA — recognised by Adobe Acrobat as *“PAdES Signature Level”* |\n| **Indian eSign** | the full CCA eSign flow (rawrsa / PKCS7 / PKCS7pdf / PKCS7complete) |\n| **CLI + API** | every feature from Python *or* the terminal (`atick …`) |\n| **Clear errors** | every failure is a normal Python exception (`atick.AtickError`) you can catch |\n\n---\n\n## Features (A → Z)\n\n| Feature | How |\n|---|---|\n| **Sign with a `.pfx` / `.p12` / `.pem`** | `atick.sign_pfx(pdf, pfx=, password=, …)` — PKCS#12 or PEM (key + certs), auto-detected |\n| **Date / time format** | `Style(date_format=\"%Y-%m-%d %H:%M:%S\")` (any strftime) · `date=\"…\"` fixed · `date=\"\"` none |\n| **Sign with a USB token / HSM** (PKCS#11) | `atick.sign_pkcs11(pdf, dll=, pin=, serial=, …)` · list with `atick.pkcs11_list(dll, pin)` |\n| **Sign with the Windows store** (certificate picker) | `atick.sign_winstore(pdf, thumbprint=None, …)` |\n| **PAdES levels** B-B / B-T / B-LT / B-LTA | `pades=True` + `timestamp=True` + `ltv=True` + `lta=True` |\n| **Hash algorithm** | `hash_algo=\"sha256\" \\| \"sha384\" \\| \"sha512\"` (signature = RSA PKCS#1 v1.5) |\n| **Timestamp authority** | a timestamp service is already built in — or use your own with `tsa_url=` (and `tsa_auth=(user, pass)` if it needs a login) |\n| **Long-term validation (LTV)** | `ltv=True` embeds the certificate chain and its revocation (CRL/OCSP) so the signature keeps verifying for years |\n| **Multi-page / custom coordinates** | `placements=[(page, (x1,y1,x2,y2)), …]` |\n| **Signature layout** | `mode=\"single\"` (one signature, on one or many pages) · `mode=\"shared\"` (several fields all showing the **same** signature). For several **independent** signatures (different signers/values), sign the document again — see Multi-signatory — or pre-create the fields with `atick.prepare_fields(...)` |\n| **Multi-signatory** | sign an already-signed PDF again (each person signs in turn). Every signature is its own revision — Adobe shows *Rev 1, Rev 2, …* — and all of them stay valid. Use a different `field_name` per signer (auto-handled by default) |\n| **Certification (DocMDP)** | `certify=atick.Certify.NO_CHANGES \\| FORM_FILLING \\| FORM_FILLING_ANNOTATIONS` |\n| **Field locking (FieldMDP)** | `lock_fields=[\"*\"]` (all) or `[\"FieldA\", …]` |\n| **Pre-sign checks** | `verify=True` (not expired / CRL / OCSP) and `trusted_roots=[sha1, …]` (chain to a pinned root — built from AIA) |\n| **Document metadata** | `atick.set_metadata(pdf, title=, author=, subject=, keywords=, application=, created=, modified=)` |\n| **Password protection** | `encrypt_password=` (+ `owner_password=`) for the output; `open_password=` for an encrypted input; `atick.decrypt(pdf, pw)` |\n| **Appearance** | `atick.Style(cn, org, ou, location, reason, text, date, image, …)` — auto-fit text, transparent logo |\n| **The mark** | the `?` (Adobe greens it), an always-green tick, or nothing — see [The mark](#the-mark) |\n| **CN on the left** (Adobe-style) | `Style(image=\"cn\")` — the signer name as text on the left instead of a logo |\n| **Distinguished name** | `Style(dn=\"CN=…, O=…, C=IN\")` — shown under the \"Signed by:\" line |\n| **Custom-text-only appearance** | `Style(body=\"*APPROVED*\\nby *Aniket*\")` — only your text; `\\n` = line, `*x*` = bold |\n| **Auto-wrap long names** | long names wrap to more lines instead of shrinking the font |\n| **Invisible signature** | `placements=[]` — valid signature, nothing drawn |\n| **Sign an already-signed PDF** | sign again (incremental) — existing signatures stay valid; field name auto-uniquified (`Atick_1`, `Atick_2`, …) |\n| **Container only** | `prepare_deferred_multi(...)` — appearance + empty container, signed later |\n| **Document timestamp** | `lta=True` adds it while signing; `atick.add_doctimestamp(pdf)` adds one to an **already-signed** PDF afterwards (PAdES-B-LTA) |\n| **Fast signing** | revocation cache (ON by default): repeated signing with the same cert reuses CRL/OCSP — `atick.set_fast_signing(False)` to disable |\n| **Indian eSign** | two-step CCA flow — needs the separate **`managex-xml-sdk`** package (`pip install managex-xml-sdk`) to sign the request XML; then `embed` (PKCS7\\*) / `embed_rawrsa` (rawrsa) the ESP reply |\n| **Detached CMS / raw signature** | `atick.cms_pfx(data, pfx, pw)` · `atick.sign_hash_pfx(data, pfx, pw)` |\n| **Low-level field API** | `prepare`, `prepare_fields`, `sign_field`, `embed` for template / remote-key flows |\n\n---\n\n## Install\n\n```bash\npip install atick\n```\n\nNo other packages are required. (Windows-store signing is Windows-only; everything else is cross-platform.)\n\n---\n\n## The three signing methods\n\n```python\natick.sign_pfx(pdf, pfx=…, password=…, style=…, placements=…)              # .pfx / .p12 / .pem (auto-detected)\natick.sign_pkcs11(pdf, dll=…, pin=…, serial=…, style=…, placements=…)      # USB token / smart-card / HSM\natick.sign_winstore(pdf, style=…, placements=…, thumbprint=None)           # Windows store (certificate picker)\n```\n\n\u003e A **PEM** file (unencrypted PKCS#8/PKCS#1 key + one or more `CERTIFICATE` blocks) works in the same\n\u003e `sign_pfx` call — pass its bytes as `pfx=` (and `password=\"\"`); the format is auto-detected.\n\nAll three accept the same options: `pades=`, `hash_algo=`, `timestamp=`, `tsa_url=`, `tsa_auth=`,\n`ltv=`, `lta=`, `certify=`, `lock_fields=`, `verify=`, `trusted_roots=`, plus (on `sign_pfx`)\n`open_password=`, `encrypt_password=`, `owner_password=`.\n\n---\n\n## The mark\n\nThe little icon in the appearance — what Adobe shows for the signature's validity:\n\n```python\natick.Style(cn=\"…\", green_tick=True)     # the \"?\" mark — Adobe paints it GREEN for a valid+trusted cert, RED if invalid\natick.Style(cn=\"…\", always_check=True)   # our green-tick graphic as the base — Adobe still reds it if the signature is bad\natick.Style(cn=\"…\", green_tick=False)    # no mark at all — a plain, basic signature\n```\n\nColour the mark with any Python colour: `mark_color=\"#E53935\"`, `\"blue\"`, `(255, 140, 0)` — or a gradient\n`mark_gradient=[\"red\", \"orange\", \"yellow\"]`. The mark is always centred in the appearance.\n\n---\n\n## Custom appearance\n\n```python\natick.Style(cn=\"Aniket Chaturvedi\", image=\"cn\")                       # CN as text on the LEFT (Adobe-style)\natick.Style(cn=\"Aniket Chaturvedi\", dn=\"CN=Aniket, O=Personal, C=IN\") # DN under the \"Signed by:\" line\natick.Style(body=\"*APPROVED*\\nReviewed by: *Aniket*\\nLegally *binding*.\")  # ONLY this text; \\n = line, *x* = bold\natick.Style(cn=\"…\", image=\"logo.png\")                                 # your own logo (default = ATick logo)\natick.Style(cn=\"…\", image=False)                                      # no logo\n```\n\nLong names wrap onto more lines instead of shrinking the font, so the appearance never overflows.\n\n---\n\n## Fast signing\n\nON by default. With LTV on, the first signature fetches the certificate's CRL/OCSP; ATick caches it\nin-memory, so every later signature with the **same certificate** reuses it instead of re-fetching —\na big speed-up for batch / multi-signature runs (≈ 6× in practice). Timestamps are never cached\n(each must be unique).\n\n```python\natick.set_fast_signing(False)      # always fetch fresh (also clears the cache)\natick.clear_revocation_cache()     # forget cached revocation (e.g. after changing certificate)\n```\n\n---\n\n## Sign an already-signed PDF\n\n```python\nsigned = atick.sign_pfx(already_signed_pdf, pfx=…, password=…, style=…, placements=…)\n```\n\nATick signs as an **incremental update**, so existing signatures keep their byte ranges and stay\nvalid. The field name is auto-uniquified (`Atick_1`, `Atick_2`, …), so re-signing never collides;\npass `field_name=\"…\"` for a specific name.\n\n---\n\n## Indian eSign (every CCA API version)\n\n\u003e **eSign needs one extra package.** Signing the eSign **request XML** requires the separate\n\u003e **`managex-xml-sdk`** package — `pip install managex-xml-sdk`. It is only needed for eSign; every\n\u003e other ATick feature works with no extra installs.\n\nA two-step flow — sign the eSign **request** XML with `managex-xml-sdk`, then embed the ESP's\nreply with ATick:\n\n```python\nprepared, ctx = atick.prepare_deferred_multi(pdf, style, placements, sub_filter=\"adbe.pkcs7.detached\")\ninput_hash_hex = bytes(ctx[\"digest\"]).hex()        # the InputHash for the eSign request XML\n# ... build the \u003cEsign …\u003e request, sign it with managex-xml-sdk, POST to the ESP, read EsignResp ...\nsigned = atick.embed(prepared, doc_signature_cms)  # pkcs7 / pkcs7Pdf / pkcs7complete\n# rawrsa: atick.embed_rawrsa(prepared, raw_sig, user_cert)\n```\n\n`pkcs7Pdf` / `pkcs7complete` responses already carry the chain + revocation + timestamp, so the\nembedded signature is LTV-complete. See [`examples/esign/`](examples/esign/).\n\n---\n\n## PAdES levels\n\n```python\natick.sign_pfx(pdf, pfx=…, password=…, style=…, placements=…, pades=True)             # B-B\natick.sign_pfx(pdf, …, pades=True, timestamp=True)                                    # B-T\natick.sign_pfx(pdf, …, pades=True, timestamp=True, ltv=True)                          # B-LT\natick.sign_pfx(pdf, …, pades=True, timestamp=True, lta=True)                          # B-LTA\n```\n\nB-LT/B-LTA embed the complete validation material (chain + CRL + OCSP + VRI + `/Extensions /ESIC`) so\nAdobe Acrobat shows **“PAdES Signature Level: B-LT”** in the advanced signature properties.\n\n---\n\n## Command line\n\nEvery feature is available from the terminal too:\n\n```bash\natick sign in.pdf out.pdf --pfx my.pfx --password ••• \\\n      --cn \"Aniket Chaturvedi\" --reason Approved \\\n      --timestamp --ltv --always-check --cn-left --dn \"CN=Aniket, O=Personal, C=IN\" \\\n      --page 1 --rect 300,55,575,175\n\natick sign in.pdf out.pdf --pfx my.pfx --password ••• --body \"*APPROVED*\\nby *Aniket*\"  # custom text only\natick sign-token    in.pdf out.pdf --dll lib.dll --pin ••• --serial HEX --ltv\natick sign-winstore in.pdf out.pdf            # opens the Windows certificate picker\natick list-token    --dll lib.dll --pin •••\natick esign-prepare in.pdf prepared.pdf --certify form-annots   # eSign step 1 (prints the InputHash)\natick esign-embed   prepared.pdf response.xml out.pdf           # eSign step 2 (embeds the ESP reply)\natick metadata      in.pdf out.pdf --title \"Agreement\" --author \"Aniket\"\natick decrypt       in.pdf out.pdf --password •••\natick version\n```\n\nRun `atick \u003ccommand\u003e -h` for the complete option list (or `python -m atick …`). Every failure is a\nclean Python `atick.AtickError` (or a `TypeError` for a wrong argument) that you can catch.\n\n---\n\n## Examples\n\nSelf-contained, runnable scripts live in [`examples/`](examples/) (each writes to `examples/signed/`):\n\n`01_sign_pfx` · `02_pades_levels` · `03_appearance` · `04_certify_and_lock` · `05_multi_placement` ·\n`06_token_pkcs11` · `07_windows_store` · `08_deferred_esign` · `09_verify_certificate` · `10_encrypted` ·\n`11_mark_color` · `12_metadata` · `13_hash_algorithms` · `14_field_api` · `16_invisible` ·\n`17_multi_revision` (rev1 → rev2 → rev3) · `18_date_and_pem` (date formats + PEM signing) ·\n`always_green_tick` · `green_tick` · `without_green_tick` · `make_container` · `sign_already_signed` ·\n`document_timestamp` · `fast_signing` · `esign/` (eSign 2-step: `esign_prepare` + `esign_embed`).\n\nEvery example uses **only ATick** (the `esign/` flow also uses your `managex-xml-sdk` to sign the\nrequest XML). Run any with `python examples/\u003cname\u003e.py`.\n\n---\n\n## Documentation\n\nFull documentation lives in [`docs/`](docs/) (Sphinx + Markdown) — installation, signing, PAdES,\nappearance, certification, eSign, the CLI and the complete API reference. Build it with\n`pip install -r docs/requirements.txt \u0026\u0026 sphinx-build -b html docs docs/_build`. Publishing the\npackage and hosting the docs (Read the Docs, GitHub Pages, …) is covered in\n[`PUBLISHING.md`](PUBLISHING.md).\n\n---\n\n## Errors\n\nEverything raises `atick.AtickError` (a normal Python exception) you can catch:\n\n```python\ntry:\n    atick.sign_pfx(pdf, pfx=…, password=\"wrong\", style=…, placements=…)\nexcept atick.AtickError as e:\n    print(\"signing failed:\", e)\n```\n\n---\n\n## License\n\nATick is **dual-licensed** — free for personal \u0026 open use, paid if you sell:\n\n- **Free under [GNU AGPL-3.0](LICENSE)** — personal projects, learning, internal use, and\n  open-source projects (released publicly under AGPL-3.0).\n- **Commercial license (paid)** — if you **build a product with ATick and sell it**, or use it in a\n  **closed-source / commercial** product, you must buy a commercial license first. Contact\n  **aniketc.pro@gmail.com** for a quote.\n\nSee [LICENSING.md](LICENSING.md) for details. © 2026 Aniket Chaturvedi.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faniketc068%2Fatick-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faniketc068%2Fatick-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faniketc068%2Fatick-python/lists"}