site-kit 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
site_kit-1.0.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jasveer Singh
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,437 @@
1
+ Metadata-Version: 2.4
2
+ Name: site-kit
3
+ Version: 1.0.0
4
+ Summary: Is this static site ready to launch? A pre-launch audit, legal-page generator, widget fragments, a link page and a testimonials wall as one local CLI with a single launch-check receipt.
5
+ Author: Jasveer Singh
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/jasveerai88/site-kit
8
+ Project-URL: Repository, https://github.com/jasveerai88/site-kit
9
+ Project-URL: Issues, https://github.com/jasveerai88/site-kit/issues
10
+ Project-URL: Changelog, https://github.com/jasveerai88/site-kit/blob/main/CHANGELOG.md
11
+ Keywords: static-site,site-audit,seo,privacy-policy-generator,widgets,link-in-bio,testimonials,cli
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: End Users/Desktop
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
21
+ Classifier: Topic :: Utilities
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Dynamic: license-file
26
+
27
+ <h1 align="center">site-kit</h1>
28
+
29
+ <p align="center"><strong>Is this site ready to launch? The audit, the legal pages, the widgets, the link page and the testimonials wall — checked together, in one local run.</strong></p>
30
+
31
+ <p align="center">
32
+ <img alt="tests: 324 passing" src="https://img.shields.io/badge/tests-324%20passing-brightgreen">
33
+ <img alt="python 3.10 | 3.11 | 3.12" src="https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue">
34
+ <img alt="version 1.0.0" src="https://img.shields.io/badge/version-1.0.0-orange">
35
+ <img alt="dependencies: none" src="https://img.shields.io/badge/dependencies-0-brightgreen">
36
+ <img alt="license: MIT" src="https://img.shields.io/badge/license-MIT-blue">
37
+ </p>
38
+
39
+ <p align="center"><img alt="site-kit demo: one launch-check run over a site folder with one planted fault per module — a page with no title, a legal profile missing its retention fact, a countdown aimed at 2020, a duplicated link and a duplicated testimonial — ending in a NOT READY verdict" src="demo.gif" width="880"></p>
40
+
41
+ Launching a small static site is one job seen from
42
+ five sides. The pages need a pre-launch audit (titles,
43
+ meta, alt text, links that resolve). The legal pages
44
+ have to exist — privacy, terms, cookies, a consent
45
+ banner — and they have to say only what is actually
46
+ true of the business. Then the boring widgets every
47
+ site re-buys as subscriptions: an FAQ, pricing, a
48
+ countdown, social proof. A link-in-bio page. A
49
+ testimonials wall. Five tools used to do these five
50
+ jobs separately, and nobody installs five tools for
51
+ one launch.
52
+
53
+ site-kit is the five as one suite. Each module keeps
54
+ its source tool's checks, generators, verdict words
55
+ and honesty limits — the engines are ported
56
+ byte-identical, not rewritten — and a combined
57
+ `launch-check` runs every module over a single site
58
+ folder and prints one launch-readiness receipt:
59
+ per-module verdicts, the exact findings, and one
60
+ READY / NOT READY line. No LLM. No network. Nothing
61
+ uploaded; site data never leaves the machine.
62
+
63
+ **What a verdict means — read this first.** A PASS or
64
+ a READY means the folder satisfies the checks
65
+ *encoded in these modules* — never that the site is
66
+ legally compliant or that any platform will accept
67
+ it. The legal pages are templates generated from the
68
+ facts a profile states; they are **not legal advice**.
69
+
70
+ ## The receipt family
71
+
72
+ One grammar — *claims on one side, evidence on the
73
+ other, every verdict cited* — across the fleet:
74
+
75
+ - **[skill-vet](https://github.com/jasveerai88/skill-vet)
76
+ — is it dangerous?** Vets agent skills for stealing,
77
+ spying and hidden sending before you install them.
78
+ - **[permission-audit](https://github.com/jasveerai88/permission-audit)
79
+ — what can the agent actually do?** Audits Claude
80
+ Code permission rules against the documented
81
+ deny → ask → allow semantics.
82
+ - **[done-claim-auditor](https://github.com/jasveerai88/done-claim-auditor)
83
+ — did the agent do what it claimed?** Audits session
84
+ transcripts for done-claims the evidence contradicts.
85
+ - **[skill-claims](https://github.com/jasveerai88/skill-claims)
86
+ — is the package honest?** Checks an agent skill's
87
+ prose promises against its static behaviour.
88
+ - **[spec-receipt](https://github.com/jasveerai88/spec-receipt)
89
+ — does the code still match the spec?** Per-item
90
+ drift verdicts between a Markdown spec and the code's
91
+ declared surfaces.
92
+ - **[preflight-agent](https://github.com/jasveerai88/preflight-agent)
93
+ — is the agent setup safe to run?** Five setup checks
94
+ (clone-guard, secret-guard, hook-doctor, fleet-audit,
95
+ skill-sprawl) as one scan.
96
+ - **[charity-compliance](https://github.com/jasveerai88/charity-compliance)
97
+ — is this charity ready to file?** Donation receipts
98
+ and the T3010 return as one filing-readiness check.
99
+ - **site-kit — is this site ready to launch?** The
100
+ family's static-site member: the same discipline
101
+ pointed at a deploy folder instead of a codebase, a
102
+ charity's books or an agent's setup.
103
+
104
+ Two more fleet members run the same play on their own
105
+ ground: **[faceless-qc-lite](https://github.com/jasveerai88/faceless-qc-lite)**
106
+ — is this video ready to upload? — the pre-upload QC
107
+ suite for faceless video channels, and
108
+ **[gst-hst-tracker](https://github.com/jasveerai88/gst-hst-tracker)**
109
+ — quarterly GST/HST set-aside and the $30,000
110
+ small-supplier threshold for Canadian sole proprietors.
111
+
112
+ ## Quick start
113
+
114
+ ```bash
115
+ pipx install site-kit # or: pip install site-kit
116
+ site-kit launch-check path/to/site-folder
117
+ ```
118
+
119
+ *(The PyPI name goes live when v1.0.0 is published;
120
+ until then use a source checkout: `pip install .`, or
121
+ `pipx install git+https://github.com/jasveerai88/site-kit`.)*
122
+
123
+ Or each module on its own:
124
+
125
+ ```bash
126
+ site-kit site-audit audit SITE_DIR [--json]
127
+ site-kit compliance-pages check --profile PROFILE.json [--as-of YYYY-MM-DD] [--json]
128
+ site-kit compliance-pages make --profile PROFILE.json --out DIR [--json]
129
+ site-kit widget-kit make --config CONFIG.json --out DIR [--json]
130
+ site-kit link-page-kit preview CONFIG.json [--json]
131
+ site-kit link-page-kit build CONFIG.json [-o index.html] [--json]
132
+ site-kit wall-of-love preview TESTIMONIALS.json [--json]
133
+ site-kit wall-of-love build TESTIMONIALS.json [-o wall.html] [--json]
134
+ ```
135
+
136
+ Pure Python 3.10+ standard library. Local only, no
137
+ network. Exit codes everywhere: **0** pass, **1**
138
+ findings, **2** usage or input error. Every command
139
+ accepts `--json` and prints exactly one JSON object.
140
+
141
+ From a source checkout, the fixture builder in
142
+ `examples/` builds one fictional small-business site
143
+ (Exampleton Trail Gear) two ways — a clean folder and
144
+ a faulty one with exactly one planted fault per
145
+ module:
146
+
147
+ ```bash
148
+ python3 examples/make_fixture.py faulty
149
+ site-kit launch-check faulty --as-of 2026-04-01 # exit 1 — NOT READY
150
+ python3 examples/make_fixture.py clean --clean
151
+ site-kit launch-check clean --as-of 2026-04-01 # exit 0 — READY
152
+ ```
153
+
154
+ (`--as-of` pins the generation date compliance-pages
155
+ prints on its check, so the receipt is reproducible.)
156
+
157
+ ## The modules
158
+
159
+ | Command | Question it answers | Verdict words |
160
+ |---|---|---|
161
+ | `site-audit` | Does the deploy folder pass the pre-launch audit? | PASS / FAIL — errors block; warnings and info are labelled judgement calls |
162
+ | `compliance-pages` | Does the profile state every fact the legal pages need? | COMPLETE / INCOMPLETE, with each gap named as the `[TO FILL: ...]` placeholder it would ship as |
163
+ | `widget-kit` | Does the widgets config render clean? | The fragments it wrote, plus a warning for every defect the render exposes |
164
+ | `link-page-kit` | Is the link-page config structurally sound? | Checks passed, listed one by one; warnings for duplicates and defects |
165
+ | `wall-of-love` | Is the testimonials file sound? | Checks passed, listed one by one; warnings for duplicates and defects |
166
+ | `launch-check` | Is this site — all five sides together — ready to launch? | READY / NOT READY, one receipt over every module; a module with no input is SKIPPED with the reason, never passed |
167
+
168
+ **site-audit** — titles, meta, headings, alt text,
169
+ internal-link resolution, JSON-LD validity, sitemap
170
+ and robots, as a prioritised plain-language fix list.
171
+ Internal references are checked against the folder on
172
+ disk; external links are never fetched.
173
+
174
+ **compliance-pages** — privacy, terms and cookie
175
+ pages plus a self-hosted consent banner, generated
176
+ from one site-profile JSON. Templates state only the
177
+ facts the profile gives them; anything unstated ships
178
+ as a loud `[TO FILL: ...]` placeholder, never as an
179
+ invented fact. `check` reports the gaps without
180
+ generating anything; `make` writes the pages.
181
+
182
+ **widget-kit** — the four boring widgets as static
183
+ fragments you own: FAQ (with JSON-LD generated from
184
+ the same items), pricing, countdown, social proof.
185
+ No view metering, no third-party script phoning home.
186
+
187
+ **link-page-kit** — one config file in, one
188
+ self-contained link page out: a Linktree replacement
189
+ with no trackers, no monthly fee and no lock-in.
190
+ Dangerous URLs are refused; the page references only
191
+ your own links.
192
+
193
+ **wall-of-love** — a testimonials file in, one
194
+ self-contained wall page out, with schema.org JSON-LD
195
+ generated from the same data as the wall — the
196
+ aggregate and the count cannot drift.
197
+
198
+ **launch-check** discovers each module's input in the
199
+ folder (deterministically, recursive in sorted order,
200
+ `.git` never entered, extension matching
201
+ case-insensitive) and runs the module's read-only
202
+ mode:
203
+
204
+ | Module | Input it discovers | Combined-run mode |
205
+ |---|---|---|
206
+ | site-audit | the folder itself, when it holds `.html`/`.htm` pages | `audit` |
207
+ | compliance-pages | a `.json` with a `business` object and a `pages` list naming privacy/terms/cookies | `check` (never `make`) |
208
+ | widget-kit | a `.json` with a `widgets` list | `make`, trial-rendered into a fixed-name temporary folder that is removed when the run ends |
209
+ | link-page-kit | a `.json` with a `name` and a `links` list | `preview` (never `build`) |
210
+ | wall-of-love | a `.json` with a `testimonials` list, else a `.csv` whose header names `name` and `quote` | `preview` |
211
+
212
+ One file serves at most one module. A module with no
213
+ discoverable input reports **SKIPPED** with the
214
+ reason — skipped is never counted as passed. READY
215
+ requires at least one module to have run and every
216
+ module that ran to be clean; an empty folder is NOT
217
+ READY. The run writes nothing into the folder it
218
+ checks.
219
+
220
+ ## The receipt
221
+
222
+ The faulty fixture plants exactly one fault per
223
+ module: a page whose `<title>` was removed; a legal
224
+ profile with its `retention` fact deleted; a countdown
225
+ aimed at 2020-01-01; a link list with its first link
226
+ duplicated at the end; a testimonials file where two
227
+ people carry the same quote verbatim. This is the
228
+ complete, unedited output of
229
+ `site-kit launch-check faulty --as-of 2026-04-01`
230
+ (exit 1):
231
+
232
+ ```text
233
+ site-kit v1.0.0 — launch-check · folder faulty
234
+ 5 module(s) run · 0 clean · 5 with findings · 0 skipped
235
+
236
+ ===== site-audit — the deploy folder vs the pre-launch audit checks =====
237
+ site-audit v0.1.0 — audit · folder faulty
238
+ 1 page(s) · sitemap.xml present · robots.txt present
239
+ Local only: internal references are checked against the folder on disk; external links are never fetched.
240
+
241
+ ERRORS — fix before launch (1):
242
+ [title-missing] index.html — the page has no <title> (or it is empty) — browsers and search results will show the URL instead
243
+ fix: add a <title> in the <head> naming this page
244
+
245
+ Per-page summary (counts only):
246
+ index.html — 1 error(s) · 0 warning(s) · 0 info
247
+
248
+ Summary: 1 finding(s) · 1 error(s) · 0 warning(s) · 0 info across 1 page(s)
249
+ Verdict: FAIL — 1 error(s) to fix before launch.
250
+
251
+ ===== compliance-pages — the site profile vs the facts the legal pages need =====
252
+ compliance-pages v0.1.0 — check · profile profile.json
253
+ Variant: canada · pages make would generate: privacy, terms, cookies (+ consent.js, banner.html, manifest.txt always)
254
+ Generation date: 2026-04-01
255
+
256
+ GAPS — facts the documents need that the profile does not state (1):
257
+ - retention → [TO FILL: how long collected information is kept]
258
+
259
+ Verdict: INCOMPLETE — fill the gaps above in the profile; anything left unstated ships as a loud [TO FILL: ...] placeholder, never as an invented fact.
260
+
261
+ ===== widget-kit — the widgets config, validated by a trial render =====
262
+ widget-kit v0.1.0 — make · config widgets.json
263
+ Wrote 1 fragment(s) into /tmp/site-kit-launch-check/widgets:
264
+ sale.html — 772 bytes · countdown · target 1 Jan 2020, 00:00 (UTC-08:00)
265
+ Warnings:
266
+ ! widgets[0] (countdown): countdown target '2020-01-01T00:00:00-08:00' is already in the past — the fragment will show its ended_text
267
+ (fragments above were trial-rendered into a temporary directory and discarded — nothing was written into this folder)
268
+
269
+ ===== link-page-kit — the link-page config vs the structural checks =====
270
+ link-page-kit v0.1.0 — preview · config links.json
271
+ Maya Chen · 7 link(s), 2 social(s) · page weight 3,267 bytes
272
+
273
+ Links, in order:
274
+ 1. Watch on YouTube — https://youtube.com/@KelownaTrailcast — New video every Friday
275
+ 2. Follow on Instagram — https://instagram.com/kelownatrailcast
276
+ 3. Trailcast stickers — my shop — https://example.org/shop/stickers — Ships within Canada
277
+ 4. Listen to the podcast — https://example.org/trailcast
278
+ 5. Trail conditions map — https://example.org/trail-conditions
279
+ 6. Email me — mailto:maya@example.org — Sponsorships and ride invites
280
+ 7. Watch on YouTube — https://youtube.com/@KelownaTrailcast — New video every Friday
281
+
282
+ Socials:
283
+ 1. TikTok — https://tiktok.com/@kelownatrailcast
284
+ 2. X — https://x.com/kelownatrailcast
285
+
286
+ Checks passed:
287
+ ✓ name present
288
+ ✓ 7 link(s), every label present
289
+ ✓ every URL uses an allowed scheme (https, http, mailto, tel)
290
+ ✓ single file, no external requests besides the configured links, socials and avatar
291
+ ✓ avatar is referenced, not embedded
292
+ ✓ accent colour is a valid hex value
293
+ Warnings:
294
+ ! duplicate URL: 'https://youtube.com/@KelownaTrailcast' (links[6] 'Watch on YouTube') is the same target as links[0] 'Watch on YouTube'
295
+
296
+ ===== wall-of-love — the testimonials file vs the wall checks =====
297
+ wall-of-love v0.1.0 — preview · file testimonials.json
298
+ Exampleton Trail Gear · 2 testimonial(s) · page weight 3,321 bytes
299
+ Aggregate: 4.5 out of 5 from 2 rated testimonial(s) · review count 2
300
+
301
+ Testimonials, in display order (rating, then newest):
302
+ 1. Ana Ruiz — ★★★★★
303
+ 2. Ben Osei — ★★★★☆
304
+
305
+ Checks passed:
306
+ ✓ 2 testimonial(s), every name and quote present
307
+ ✓ every rating present is an integer from 1 to 5
308
+ ✓ single file, no external requests besides the configured logo, avatars and source links
309
+ ✓ JSON-LD generated from the same data as the wall — aggregate and count cannot drift
310
+ ✓ aggregate 4.5 from 2 rated testimonial(s)
311
+ Warnings:
312
+ ! duplicate quote: testimonials[1] ('Ben Osei') repeats testimonials[0] verbatim — the wall shows what the file holds, but a repeated quote reads as padding
313
+
314
+ VERDICT: NOT READY — findings in site-audit, compliance-pages, widget-kit, link-page-kit, wall-of-love — fix each module's section above before launch.
315
+
316
+ site-kit is a local checking and generation aid. launch-check writes nothing into the folder it checks (widget fragments are trial-rendered into a temporary directory and discarded). A READY verdict means every module that ran reported clean under its own rules — never that the site is legally compliant or will pass any platform or app-store review. compliance-pages generates templates from the facts a profile states; they are not legal advice — have them reviewed before relying on them.
317
+ ```
318
+
319
+ The clean folder, same command (exit 0):
320
+
321
+ ```text
322
+ site-kit v1.0.0 — launch-check · folder clean
323
+ 5 module(s) run · 5 clean · 0 with findings · 0 skipped
324
+ [...]
325
+ VERDICT: READY — every module that ran was clean (site-audit, compliance-pages, widget-kit, link-page-kit, wall-of-love). READY covers only the modules' own checks — it is never a statement of legal compliance or platform acceptance.
326
+ ```
327
+
328
+ ## Contracts
329
+
330
+ - Every command accepts `--json` and prints exactly one
331
+ JSON object. Module commands emit exactly the object
332
+ their standalone tool emits; `launch-check` emits one
333
+ combined object whose per-module sections are the
334
+ modules' own objects plus their `exit_code` (skipped
335
+ modules carry `status`, `reason`, `clean: null`).
336
+ - Exit codes everywhere: **0** pass, **1** findings,
337
+ **2** usage or input error. Errors — argparse
338
+ included — are `{"error": "..."}` in `--json` mode.
339
+ Never a traceback.
340
+ - Read-only where it matters: `launch-check` writes
341
+ nothing into the folder it checks, and site data
342
+ never leaves the machine. The generators write only
343
+ where their own `--out` / `-o` points, and only when
344
+ you run them directly.
345
+
346
+ ## Why this suite exists — the merge
347
+
348
+ site-kit is flagship B4 of the fleet audit
349
+ (FLEET-AUDIT-2026-11-04), which ordered 18 quiet tools
350
+ merged into 4 flagships — and it is the last of the
351
+ four. site-audit, compliance-pages, widget-kit,
352
+ link-page-kit and wall-of-love were each shipped,
353
+ tested tools, but they are five sides of one job, and
354
+ nobody was installing all five to answer "are we ready
355
+ to launch?" The engines are ported **byte-identical**
356
+ to their sources — no check, generator, verdict word
357
+ or honesty limit changed; each module still reports
358
+ its own v0.1.0 inside its sections. What is new is
359
+ only the dispatcher and the combined run, plus two
360
+ dispatcher-side lessons from stage 1, both about
361
+ determinism: widget-kit's trial render first used a
362
+ random temporary path, which leaked into its own
363
+ reported output directory and made repeat receipts
364
+ differ — it now renders into a fixed-name temporary
365
+ folder, removed when the run ends — and claim-tracking
366
+ ensures one discovered file serves at most one module,
367
+ so a config can never be silently double-counted.
368
+
369
+ One behaviour was observed in stage 1 and deliberately
370
+ **not** changed: compliance-pages' `check` treats
371
+ `--as-of` as a reported value and never parses it (only
372
+ `make` validates the date). That is the engine's own
373
+ source behaviour; engines are ported, not improved.
374
+
375
+ ## Tests
376
+
377
+ ```bash
378
+ python3 -m unittest discover -s tests
379
+ ```
380
+
381
+ 324 tests: the five source suites ported (71 + 34 +
382
+ 48 + 62 + 76 = 291; the only edit is each suite's
383
+ examples paths, since examples now live per-module
384
+ under `examples/<module>/`) plus 33 dispatcher /
385
+ launch-check tests covering routing, the JSON/error
386
+ contract, discovery, skip honesty, the planted-fault
387
+ fixture (one fault per module, each asserted exactly),
388
+ read-only behaviour and byte-identical repeat runs. All
389
+ pass on a clean checkout — including in a copy with
390
+ every executable bit stripped (the suites drive the
391
+ engines through the Python interpreter).
392
+
393
+ ## Honest limits
394
+
395
+ - **A checking and generation aid, not legal advice.**
396
+ READY is a statement about the modules' own checks
397
+ only — not legal compliance, not platform or
398
+ app-store acceptance. Have generated legal pages
399
+ reviewed before relying on them.
400
+ - The audit reads static `.html`/`.htm` files on disk;
401
+ it says nothing about server behaviour, and external
402
+ links are never fetched — link checks are structural,
403
+ never liveness.
404
+ - The legal templates state only the facts a profile
405
+ gives them. A profile that omits a fact produces a
406
+ loud `[TO FILL: ...]` placeholder, not an invention —
407
+ but filling placeholders in is a human's job, and a
408
+ COMPLETE verdict means the profile was complete, not
409
+ that its facts are true.
410
+ - The wall shows what the testimonials file holds.
411
+ Nothing here verifies that a testimonial is genuine;
412
+ a fabricated review in the input becomes a fabricated
413
+ review on the wall. The JSON-LD aggregate is computed
414
+ from the same data, so it cannot drift from the wall —
415
+ it also cannot make the data honest.
416
+ - Generators write only where their own `--out` / `-o`
417
+ points. `launch-check` never writes into the folder
418
+ it checks; widget fragments inside it are
419
+ trial-rendered into a temporary folder and discarded.
420
+
421
+ ## Contributing & security
422
+
423
+ See CONTRIBUTING.md (stdlib only, engines ported not
424
+ rewritten, skipped is not clean) and SECURITY.md
425
+ (private vulnerability reporting; the suite is
426
+ local-only, and its combined run is read-only by
427
+ design).
428
+
429
+ ## Support
430
+
431
+ If this suite saved you a launch-day surprise,
432
+ sponsoring keeps the receipt family maintained:
433
+ https://github.com/sponsors/jasveerai88
434
+
435
+ ## License
436
+
437
+ MIT — see LICENSE.