diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..7ecc2f7 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: "https://softpeanut.github.io/csv-preflight/support.html" diff --git a/index.html b/index.html index e256ec8..996ad06 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,5 @@ CSV Preflight — local CSV and Shopify product import checker -

Read: CSV Is a State Machine · Checkable example · Public CI case study · 한국어 서비스

LOCAL-ONLY CSV CHECK

Catch import failures
before your importer does.

Drop or paste CSV. Nothing leaves your browser.

+

Read: CSV Is a State Machine · Checkable example · Public CI case study · Support the project · 한국어 서비스

LOCAL-ONLY CSV CHECK

Catch import failures
before your importer does.

Drop or paste CSV. Nothing leaves your browser.

OR PASTE
Shopify preset reviewed against the official product CSV guide on 2026-08-27. It checks a bounded set of documented rules and does not guarantee import success.
diff --git a/offer.test.mjs b/offer.test.mjs index 4431601..2bc6e9b 100644 --- a/offer.test.mjs +++ b/offer.test.mjs @@ -29,6 +29,8 @@ const githubActionGuide = readFileSync(new URL("./validate-csv-github-actions.ht const ciSetupTerms = readFileSync(new URL("./ci-setup-terms.html", import.meta.url), "utf8"); const ciSetupTermsZhCn = readFileSync(new URL("./ci-setup-terms-zh-CN.html", import.meta.url), "utf8"); const ciSetupTemplate = readFileSync(new URL("./.github/ISSUE_TEMPLATE/ci-setup.yml", import.meta.url), "utf8"); +const supportPage = readFileSync(new URL("./support.html", import.meta.url), "utf8"); +const funding = readFileSync(new URL("./.github/FUNDING.yml", import.meta.url), "utf8"); import { analyze, serializeCsv } from "./csv.mjs"; test("presents a bounded service without pretending payment or booking is live", () => { @@ -85,6 +87,12 @@ test("optional tips cannot be mistaken for service payment", () => { assert.match(koreanPage, /2 sats 이상 팁/); assert.match(koreanPage, /정리 작업·지원·기능·가져오기 성공을 구매하지 않습니다/); assert.match(koreanPage, /고정 범위 서비스와 별개입니다/); + assert.match(page, /support\.html/); + assert.match(supportPage, /lightning:softpeanut@stacker\.news/); + assert.match(supportPage, /buys no product, cleanup, support, feature, priority, service, guarantee, or tax receipt/); + assert.match(supportPage, /Do not send CSV data, credentials, contact details, or payment proof/); + assert.match(supportPage, /If you intend to buy a product or service, do not use this link/); + assert.equal(funding.trim(), 'custom: "https://softpeanut.github.io/csv-preflight/support.html"'); }); test("offers only the completed bounded offline batch product", () => { @@ -214,6 +222,7 @@ test("publishes truthful search metadata for every public page", () => { "https://softpeanut.github.io/csv-preflight/validate-csv-github-actions.html", "https://softpeanut.github.io/csv-preflight/ci-setup-terms.html", "https://softpeanut.github.io/csv-preflight/ci-setup-terms-zh-CN.html", + "https://softpeanut.github.io/csv-preflight/support.html", ]) { assert.match(sitemap, new RegExp(`${location.replaceAll(".", "\\.")}`)); } diff --git a/sitemap.xml b/sitemap.xml index 0a09aef..4d2800e 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -44,4 +44,8 @@ https://softpeanut.github.io/csv-preflight/ci-setup-terms-zh-CN.html 2026-08-27 + + https://softpeanut.github.io/csv-preflight/support.html + 2026-08-28 + diff --git a/support.html b/support.html new file mode 100644 index 0000000..66ea677 --- /dev/null +++ b/support.html @@ -0,0 +1,28 @@ + + + + + + Support CSV Preflight + + + + + + +
+

← CSV Preflight

+
+ VOLUNTARY OPEN-SOURCE SUPPORT +

Keep the free checker free.

+

CSV Preflight runs without uploads, accounts, analytics, or subscriptions.

+
+
+

Lightning tip

+

softpeanut@stacker.news

+

This is an optional donation to support the open-source project. It buys no product, cleanup, support, feature, priority, service, guarantee, or tax receipt. Do not send CSV data, credentials, contact details, or payment proof.

+

There is no refund process for voluntary tips. If you intend to buy a product or service, do not use this link.

+
+
+ +