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
8 changes: 4 additions & 4 deletions site/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ npm run preview

Set `DODO_CHECKOUT_URL` to the HTTPS hosted product checkout URL (for example `https://checkout.dodopayments.com/buy/pdt_example`) at build time. Do not set a private API key. Without the URL, the purchase button is disabled and shows “Checkout coming soon.”

Configure a one-time USD $12.99 product in Dodo. The build sets the checkout return URL to `https://diffy.run/thanks`. Put `https://diffy.run/downloads` in a Digital Files entitlement's external delivery link and attach it to the product as well, so buyers can keep it. The live product and its download entitlement are configured.
Configure a one-time USD $7.99 product in Dodo. The build sets the checkout return URL to `https://diffy.run/thanks`. Put `https://diffy.run/downloads` in a Digital Files entitlement's external delivery link and attach it to the product as well, so buyers can keep it. The live product and its download entitlement are configured.

```sh
DODO_CHECKOUT_URL='https://checkout.dodopayments.com/buy/YOUR_PRODUCT_ID' npm run build
Expand Down Expand Up @@ -62,16 +62,16 @@ The screenshot serves 480/960/1440px variants through `srcset`; the original 192

## Beta pricing and platform availability

The landing page displays regular price $24.99 crossed out and $12.99 during beta. It keeps the purchase CTA and “Or build for free”; platform downloads are offered after purchase on `/thanks` and through Dodo delivery. There is no separate beta announcement line. macOS is Beta; Windows/Linux are Alpha. The purchase supports all platforms. Keep the Dodo product's actual one-time USD price at 1299 cents to match the site.
The landing page displays $7.99 USD during beta, without a comparison price. It keeps the purchase CTA and “Or build for free”; platform downloads are offered after purchase on `/thanks` and through Dodo delivery. There is no separate beta announcement line. macOS is Beta; Windows/Linux are Alpha. The purchase supports all platforms. Keep the Dodo product's actual one-time USD price at 799 cents to match the site.

`src/data/platforms.json` supplies download choices, requirements, asset names, and installation instructions for `/downloads` and `/thanks`. `DIFFY_RELEASED_PLATFORMS` is a comma-separated list of published platforms, default `macos`. After the complete release is verified and published, set the GitHub repository variable to `macos,windows,linux` and rebuild the site. Keep it at `macos` until then; the site never advertises missing assets.

`node scripts/check-build.mjs` checks the built pricing, checkout return URL, availability, and redirect targets. Run it with the same environment used for `npm run build`. CI exercises both checkout configurations and all-platform availability.

## Dodo dashboard setup

The live product ID is `pdt_0NqoFXz9I2D2slqhYL42T`; its Digital Files entitlement ID is `ent_0NqoFXuK7ZzeWUnnHUAMW`. This is one **Diffy — all desktop platforms** product with a one-time **USD $12.99** price (1299 cents), covering macOS beta and Windows/Linux alpha. Its attached Digital Files entitlement is named **Diffy downloads**, with its external link set to **https://diffy.run/downloads**, and these delivery instructions:
The live product ID is `pdt_0NqoFXz9I2D2slqhYL42T`; its Digital Files entitlement ID is `ent_0NqoFXuK7ZzeWUnnHUAMW`. This is one **Diffy — all desktop platforms** product with a one-time **USD $7.99** price (799 cents), covering macOS beta and Windows/Linux alpha. Its attached Digital Files entitlement is named **Diffy downloads**, with its external link set to **https://diffy.run/downloads**, and these delivery instructions:

> Choose your platform on the download page. All versions require Git. macOS is beta; Windows and Linux are early alphas with limited hardware testing. Save the page for future releases.

Copy the hosted `https://checkout.dodopayments.com/buy/pdt_0NqoFXz9I2D2slqhYL42T` URL into the GitHub `DODO_CHECKOUT_URL` repository variable. The site adds the return URL `/thanks`. Keep checkout disabled until the product exists and its displayed charge matches $12.99. Public downloads and the return page do not verify payment or grant a license.
Copy the hosted `https://checkout.dodopayments.com/buy/pdt_0NqoFXz9I2D2slqhYL42T` URL into the GitHub `DODO_CHECKOUT_URL` repository variable. The site adds the return URL `/thanks`. Keep checkout disabled until the product exists and its displayed charge matches $7.99. Public downloads and the return page do not verify payment or grant a license.
4 changes: 2 additions & 2 deletions site/scripts/check-build.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
const read = path => readFileSync(new URL(`../dist/${path}`, import.meta.url), 'utf8');
const home = read('index.html');
assert(home.includes('$12.99') && home.includes('$24.99') && !home.includes('$19.99') && !home.includes('$14.99'));
assert(home.includes('<s>$24.99</s>') && home.includes('during beta'));
assert(home.includes('$7.99') && !home.includes('$12.99') && !home.includes('$24.99'));
assert(!home.includes('<s>') && home.includes('USD during beta'));
assert(!home.includes('Downloads &amp; installation') && !home.includes('Diffy is in beta.'));
const checkout = process.env.DODO_CHECKOUT_URL;
assert.equal(home.includes('checkout.dodopayments.com/buy/'), !!checkout);
Expand Down
2 changes: 1 addition & 1 deletion site/src/data/product.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export const questions = [
{ question: 'Which platforms does Diffy support?', answer: 'Diffy supports macOS, Windows, and Linux. macOS is in beta; Windows and Linux are early alphas with limited hardware testing. Every platform requires Git.' },
{ question: 'Does Diffy work with coding agents?', answer: 'Diffy discovers local Git projects from Herdr, Codex, and Claude Code. Choose which projects to import, then review their live file changes. Discovery reads local project metadata; it does not run agents or read their conversations.' },
{ question: 'Can Diffy review GitHub pull requests?', answer: 'Yes. Diffy shows read-only diffs for open and draft GitHub.com pull requests using your existing GitHub CLI login. It does not check out a branch. Review comments, approvals, merging, and GitHub Enterprise are not supported.' },
{ question: 'Is Diffy open source, and what does it cost?', answer: `Diffy is open source under the MIT license and can be built for free. The suggested one-time purchase is ${price.beta} during beta (regular price ${price.regular}) and supports all platforms. Public downloads are not payment gated.${import.meta.env.DODO_CHECKOUT_URL?.trim() ? '' : ' Checkout is not yet available.'}` },
{ question: 'Is Diffy open source, and what does it cost?', answer: `Diffy is open source under the MIT license and can be built for free. The suggested one-time purchase is ${price.beta} USD during beta and supports all platforms. Public downloads are not payment gated.${import.meta.env.DODO_CHECKOUT_URL?.trim() ? '' : ' Checkout is not yet available.'}` },
];

export function productMarkdown(root: string) {
Expand Down
2 changes: 1 addition & 1 deletion site/src/data/releases.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import definitions from './platforms.json';
const published = new Set((import.meta.env.DIFFY_RELEASED_PLATFORMS || 'macos').split(',').map((value: string) => value.trim()));
export const platforms = definitions.map(platform => ({ ...platform, available: published.has(platform.id), href: `/download/${platform.id}` }));
export const price = { regular: '$24.99', beta: '$12.99' };
export const price = { beta: '$7.99' };
2 changes: 1 addition & 1 deletion site/src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ if (checkout) {
</ul>
<p class="compatibility">{platforms.map((platform, index) => <>{index > 0 && <span aria-hidden="true"> · </span>}{platform.name} {platform.stage.toLowerCase()}</>)} <span aria-hidden="true">·</span> Requires Git</p>
<div class="purchase">
<p class="beta-price"><span class="visually-hidden">Regular price </span><s>{price.regular}</s> <strong>{price.beta}</strong><span> USD during beta</span></p>
<p class="beta-price"><strong>{price.beta}</strong><span> USD during beta</span></p>
{purchaseUrl ? <a target="_blank" rel="noopener" class="button" href={purchaseUrl}>Buy once <span aria-hidden="true">—</span> {price.beta} <span class="button-arrow" aria-hidden="true">↗</span></a> : <button class="button" disabled aria-describedby="checkout-note">Buy once <span aria-hidden="true">—</span> {price.beta} <span class="button-arrow" aria-hidden="true">↗</span></button>}
{!purchaseUrl && <p id="checkout-note" class="checkout-note">Checkout coming soon.</p>}
<a target="_blank" rel="noopener" class="build-link" href="https://github.com/hitSlop/Diffy">Or build for free <span aria-hidden="true">↗</span></a>
Expand Down
1 change: 0 additions & 1 deletion site/src/styles/site.css
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
--quiet: #737379;
}
.beta-price { font-size: 14px; margin: 0 0 16px; color: var(--muted); }
.beta-price s { margin-right: 10px; }
.beta-price strong { font-size: 22px; font-weight: 500; color: #fff; }
.platform-downloads { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 36px; margin: 48px 0; text-align: left; }
.platform-download { min-width: 0; padding-top: 20px; border-top: 1px solid #303033; scroll-margin-top: 24px; }
Expand Down
Loading