Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions .github/ISSUE_TEMPLATE/ci-setup.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: CSV CI setup fit check
description: Check whether one public or sanitized repository fits the fixed $99 workflow setup.
title: "CSV CI setup fit check: "
labels:
- service-inquiry
body:
- type: markdown
attributes:
value: |
This is a public fit check, not a booking or payment request. Do not post CSV data, credentials, private repository links, customer information, or secrets. The pilot covers one public repository or sanitized minimal reproduction only.
- type: input
id: repository
attributes:
label: Public repository or sanitized example URL
description: Use only a public GitHub URL containing no sensitive or regulated data.
placeholder: https://github.com/example/public-repository
validations:
required: true
- type: dropdown
id: delivery
attributes:
label: Delivery format
options:
- Pull request to one public repository
- Workflow patch against one sanitized minimal reproduction
validations:
required: true
- type: dropdown
id: file_count
attributes:
label: CSV scope
options:
- One generic UTF-8 CSV path up to 10 MiB
- More than one file or an importer-specific schema (outside this pilot)
validations:
required: true
- type: checkboxes
id: boundaries
attributes:
label: Safety, environment, and terms
options:
- label: The example and target CSV contain no sensitive or regulated data.
required: true
- label: The repository uses a GitHub-hosted Ubuntu runner and needs no secrets, private dependencies, or self-hosted infrastructure.
required: true
- label: I will not post data, credentials, private links, customer information, or payment proof in this issue.
required: true
- label: I understand the fixed price is $99, quoted as an exact Lightning amount only after written scope agreement.
required: true
- label: I understand that opening this issue is not a booking and work starts only after scope, delivery, payment, and cancellation terms are agreed.
required: true
18 changes: 18 additions & 0 deletions ci-setup-terms.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<!doctype html>
<html lang="en"><head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>$99 CSV GitHub Actions setup — scope and terms</title>
<meta name="description" content="Fixed scope, delivery, payment, cancellation, and safety terms for a one-repository CSV GitHub Actions setup.">
<link rel="canonical" href="https://softpeanut.github.io/csv-preflight/ci-setup-terms.html"><link rel="stylesheet" href="styles.css">
</head><body><main>
<p><a href="index.html">← CSV Preflight</a> · <a href="validate-csv-github-actions.html">Workflow guide</a></p>
<header><span class="eyebrow">FIXED-SCOPE CSV CI SETUP · $99</span><h1>One repository. One CSV gate.</h1><p>Last updated August 27, 2026.</p></header>
<section class="card">
<h2>Included</h2><p>The fixed price is USD 99. The service configures one GitHub Actions workflow for one generic UTF-8 CSV path up to 10 MiB in one public repository or sanitized minimal reproduction. Delivery is either one pull request to a public repository or one workflow patch against the sanitized example. The workflow uses CSV Preflight's free public Action, read-only repository permission, path-scoped triggers, normalized and issue-report artifacts, a five-minute timeout, and failure on detected structural issues. Delivery includes a short usage note and one revision requested within seven calendar days.</p>
<h2>Not included</h2><p>The pilot excludes multiple CSV files, importer-specific schema or business rules, custom parser features, data repair, import execution, private repository access, private dependencies, secrets, self-hosted runners, paid infrastructure, regulated or sensitive data, ongoing maintenance, and guarantees that an external importer accepts the file. It is not an audit, security review, or GitHub-endorsed service.</p>
<h2>Fit and delivery</h2><p>The public fit-check issue must link only to a public repository or sanitized example and must contain no data, credentials, private links, customer information, or payment proof. After written scope agreement and verified payment, delivery is due within three business days. The customer remains responsible for reviewing and merging the pull request or applying the patch, repository policies, third-party Action pinning, artifact retention, and the correctness and rights of their data.</p>
<h2>Payment</h2><p>No payment is requested by the public issue. After scope and availability are confirmed in writing, the seller quotes an exact sats amount corresponding to USD 99 and supplies an issue-bound, single-use BOLT11 Lightning invoice with a 30-minute payment window. The seller verifies settlement directly. Do not send a tip or unsolicited payment as payment for this service.</p>
<h2>Cancellation, revision, and refund</h2><p>The buyer may cancel before work begins and receive the paid sats back to a compatible Lightning invoice they provide. After work begins, the fixed fee is non-refundable except when the seller does not deliver the agreed pull request or patch; in that case the paid sats are returned. One in-scope revision requested within seven calendar days is included. New files, schema rules, environments, or features require a separate agreement. Mandatory consumer-protection rules override conflicting terms.</p>
<h2>Code and privacy</h2><p>The delivered workflow and usage note may be used and modified in the customer's repository. CSV Preflight's existing source remains under its public license, and no exclusive ownership of general techniques is transferred. The seller requests no private repository access, credentials, or real CSV content. GitHub, Stacker News, and the Lightning network apply their own terms and privacy practices.</p>
</section>
</main></body></html>
1 change: 1 addition & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<section id="results" class="card" hidden><div class="summary"><div><small>ENCODING</small><strong id="encoding">Pasted text</strong></div><div><small>DELIMITER</small><strong id="delimiter">Comma</strong></div><div><small>ROWS</small><strong id="rows">0</strong></div><div><small>ISSUES</small><strong id="count">0</strong></div></div><h2>Preflight report</h2><ul id="issues"></ul><div class="actions"><button id="csvDownload">Download cleaned CSV</button><button id="reportDownload" class="secondary">Download error report</button></div></section>
<section class="pro"><div><span class="eyebrow">FREE NODE.JS 20+ CLI</span><h2>Check one CSV in a terminal.</h2><p>Run the same generic structural preflight locally with no package install. The CLI writes a normalized CSV and issues report, returns CI-friendly exit codes, and refuses to overwrite existing output. The free CLI is limited to one generic file per run; batch, Shopify profiles, ZIP, and JSON automation remain Pro features.</p><p><code>node cli.mjs input.csv --output normalized.csv --report issues.csv</code></p></div><a href="cli.mjs" download>Download free CLI ↗</a></section>
<section class="pro"><div><span class="eyebrow">FREE GITHUB ACTION · v0.5.0</span><h2>Fail CI before a broken CSV reaches an importer.</h2><p>The public composite Action runs the same one-file structural check inside GitHub Actions. It reads the path through an environment variable, keeps the file on the runner, writes normalized CSV and issue-report artifacts under the runner temporary directory by default, and fails the step when issues are found.</p><p><code>- uses: softpeanut/csv-preflight@v0.5.0</code></p><p class="fine-print">One generic UTF-8 CSV up to 10 MiB. Pin a full commit SHA when immutable third-party code is required. Batch, Shopify profiles, ZIP, and JSON output remain Pro features. <a href="validate-csv-github-actions.html">Read the complete workflow guide.</a></p></div><a href="https://github.com/softpeanut/csv-preflight/releases/tag/v0.5.0" target="_blank" rel="noopener">View Action release ↗</a></section>
<section class="pro"><div><span class="eyebrow">FIXED-SCOPE CSV CI SETUP · $99</span><h2>Get one repository wired correctly.</h2><p>One public repository or sanitized minimal reproduction, one generic UTF-8 CSV path, one GitHub-hosted Ubuntu workflow, diagnostic artifacts, a short usage note, and one revision. No private access, secrets, schema rules, import execution, or ongoing maintenance. Delivery within three business days after written scope and verified payment.</p><p><a href="ci-setup-terms.html">Read the complete scope, payment, cancellation, and refund terms.</a></p></div><a href="https://github.com/softpeanut/csv-preflight/issues/new?template=ci-setup.yml" target="_blank" rel="noopener">Check setup fit ↗</a></section>
<section class="pro product"><div><span class="eyebrow">OFFLINE BATCH + CI CLI · PERSONAL 15,000 / TEAM 100,000 SATS</span><h2>Process up to 20 files locally or in CI.</h2><p>The completed Pro edition creates comma-separated UTF-8 normalized files, per-file issue reports, and a manifest in one ZIP. It includes a browser interface and a Node.js 20+ CLI with JSON output, deterministic exit codes, and no-overwrite protection. Both keep every parsed data row and include generic, Shopify new-product, and Shopify update profiles.</p><p>Choose Personal for one user (15,000 sats) or Team for up to 10 named users in one legal organization (100,000 sats). Both tiers receive the same completed archive; only the license scope differs. No upload, account, subscription, schema mapping, sensitive data, or import guarantee. After availability is confirmed, the seller posts an issue-bound single-use Lightning invoice matching the selected tier and verifies its status directly. Delivery is through a buyer-only private GitHub repository.</p><p><a href="pro-terms.html">Review the license, delivery, and refund terms</a></p></div><a href="https://github.com/softpeanut/csv-preflight/issues/new?template=batch-license.yml" target="_blank" rel="noopener">Start Pro order ↗</a></section>
<section class="pro"><div><span class="eyebrow">FIXED-SCOPE SERVICE</span><h2>Need a difficult CSV cleaned?</h2><p><strong>$29 structural cleanup:</strong> one file up to 1 MB, a normalized CSV, and an issue report. No schema mapping or revision.</p><p><strong>$99 importer-fit cleanup:</strong> one file up to 10 MB, one target schema—including a bounded Shopify product import—plus a cleaned CSV, an issue report, and one revision.</p><p><strong>Payment available by Lightning:</strong> after scope and terms are agreed, the exact sats amount is quoted for <code>softpeanut@stacker.news</code>. Do not pay before receiving that written quote.</p><p class="fine-print">Fit, delivery, payment, and cancellation terms are confirmed before any work or payment. No sensitive or regulated data. Do not attach data, credentials, or private links to a public issue.</p></div><a href="https://github.com/softpeanut/csv-preflight/issues/new?template=csv-cleanup.yml" target="_blank" rel="noopener">Check project fit ↗</a></section>
</main><script type="module" src="app.mjs"></script></body></html>
23 changes: 23 additions & 0 deletions offer.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ const batchTemplateKo = readFileSync(new URL("./.github/ISSUE_TEMPLATE/batch-lic
const action = readFileSync(new URL("./action.yml", import.meta.url), "utf8");
const shopifyGuideKo = readFileSync(new URL("./shopify-csv-guide-ko.html", import.meta.url), "utf8");
const githubActionGuide = readFileSync(new URL("./validate-csv-github-actions.html", import.meta.url), "utf8");
const ciSetupTerms = readFileSync(new URL("./ci-setup-terms.html", import.meta.url), "utf8");
const ciSetupTemplate = readFileSync(new URL("./.github/ISSUE_TEMPLATE/ci-setup.yml", import.meta.url), "utf8");
import { analyze, serializeCsv } from "./csv.mjs";

test("presents a bounded service without pretending payment or booking is live", () => {
Expand Down Expand Up @@ -143,6 +145,26 @@ test("publishes the tested free Action without blurring the Pro boundary", () =>
assert.doesNotMatch(page, /Marketplace|official GitHub Action/i);
});

test("offers a bounded $99 one-repository CI setup without collecting secrets", () => {
assert.match(page, /FIXED-SCOPE CSV CI SETUP · \$99/);
assert.match(page, /one generic UTF-8 CSV path/);
assert.match(page, /No private access, secrets, schema rules, import execution, or ongoing maintenance/);
assert.match(page, /template=ci-setup\.yml/);
assert.match(page, /ci-setup-terms\.html/);
assert.match(ciSetupTerms, /fixed price is USD 99/);
assert.match(ciSetupTerms, /one public repository or sanitized minimal reproduction/);
assert.match(ciSetupTerms, /within three business days/);
assert.match(ciSetupTerms, /single-use BOLT11 Lightning invoice/);
assert.match(ciSetupTerms, /cancel before work begins/);
assert.match(ciSetupTerms, /One in-scope revision requested within seven calendar days/);
assert.match(ciSetupTerms, /requests no private repository access, credentials, or real CSV content/);
assert.match(ciSetupTemplate, /not a booking or payment request/i);
assert.match(ciSetupTemplate, /fixed price is \$99/);
assert.match(ciSetupTemplate, /will not post data, credentials, private links/);
assert.doesNotMatch(ciSetupTemplate, /type: textarea/);
assert.doesNotMatch(page, /Buy now|Book now|instant setup/i);
});

test("publishes a bounded Korean Shopify CSV troubleshooting guide", () => {
assert.match(koreanPage, /shopify-csv-guide-ko\.html/);
assert.match(shopifyGuideKo, /UTF-8과 쉼표 구분/);
Expand Down Expand Up @@ -174,6 +196,7 @@ test("publishes truthful search metadata for every public page", () => {
"https://softpeanut.github.io/csv-preflight/pro-terms-ko.html",
"https://softpeanut.github.io/csv-preflight/shopify-csv-guide-ko.html",
"https://softpeanut.github.io/csv-preflight/validate-csv-github-actions.html",
"https://softpeanut.github.io/csv-preflight/ci-setup-terms.html",
]) {
assert.match(sitemap, new RegExp(`<loc>${location.replaceAll(".", "\\.")}</loc>`));
}
Expand Down
4 changes: 4 additions & 0 deletions sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,8 @@
<loc>https://softpeanut.github.io/csv-preflight/validate-csv-github-actions.html</loc>
<lastmod>2026-08-27</lastmod>
</url>
<url>
<loc>https://softpeanut.github.io/csv-preflight/ci-setup-terms.html</loc>
<lastmod>2026-08-27</lastmod>
</url>
</urlset>
2 changes: 1 addition & 1 deletion validate-csv-github-actions.html
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ <h2>Use schema checks separately</h2>

<p>Structural validation cannot decide whether a price is negative, a customer ID exists, or a date belongs to the required timezone. Add importer-specific schema and business-rule checks after structural parsing. Keep their reports separate so reviewers can distinguish malformed CSV from valid CSV containing invalid domain values.</p>

<p>Start with the <a href="./">browser checker</a>, inspect the <a href="https://github.com/softpeanut/csv-preflight">source and tests</a>, or use the public <a href="https://github.com/softpeanut/csv-preflight/releases/tag/v0.5.0">v0.5.0 Action release</a>. For offline batch and team use, the <a href="pro-terms.html">published Pro terms</a> describe the completed product and its limits before any payment.</p>
<p>Start with the <a href="./">browser checker</a>, inspect the <a href="https://github.com/softpeanut/csv-preflight">source and tests</a>, or use the public <a href="https://github.com/softpeanut/csv-preflight/releases/tag/v0.5.0">v0.5.0 Action release</a>. For offline batch and team use, the <a href="pro-terms.html">published Pro terms</a> describe the completed product. If you want this exact one-file workflow configured against a public or sanitized repository, the separate <a href="ci-setup-terms.html">$99 fixed-scope setup terms</a> define every deliverable and exclusion before payment.</p>
</article>
</main>
</body>
Expand Down
Loading