- Astro 91.6%
- CSS 6%
- TypeScript 2%
- JavaScript 0.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .claude | ||
| public | ||
| src | ||
| .gitignore | ||
| astro.config.mjs | ||
| CLAUDE.md | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
tendlore.com
Static Astro marketing + commerce site for Tendlore (a Volarra product). Requires Node >= 22.12.
Dev
npm install
npm run dev # http://localhost:4322
npm run build # → dist/
npm run preview
Deploy (manual — no git auto-deploy)
Cloudflare Pages project tendlore, account michael@m-davis.com:
npm run build && npx wrangler pages deploy dist --project-name tendlore
Domains: tendlore.com, www.tendlore.com, tendlore.pages.dev.
Downloads & update feed (R2)
The installer is a Velopack Tendlore-win-Setup.exe that lives inside the update feed folder,
so one upload serves first installs and updates:
- Bucket:
tendlore-downloads, custom domaindownloads.tendlore.com - Feed root:
downloads.tendlore.com/updates/tendlore-win-x64/(must matchUpdateService.FeedUrlin the app repo) - Upload after
pwsh eng/build-velopack.ps1in the app repo — every file inartifacts/velopack/:
for f in ../tendlore/artifacts/velopack/*; do
npx wrangler r2 object put "tendlore-downloads/updates/tendlore-win-x64/$(basename "$f")" --file "$f" --remote
done
Shipping a new app version (lockstep)
- Bump
<Version>intendlore/Directory.Build.props, build the Velopack release, upload the folder to R2 (above). - Bump
APP_VERSIONinsrc/config.tsto match. npm run build && npx wrangler pages deploy dist --project-name tendlore.
Homepage screenshots (src/assets/screenshots/)
App screenshots used on the homepage (src/pages/index.astro) live in src/assets/screenshots/
and are imported via astro:assets (<Image>), not public/ — Astro optimizes them to webp
srcsets at build time and unused files are excluded from dist/ automatically. To swap or add
one: drop the PNG in that folder, import it in index.astro, and give it real alt text. Never
put raw app screenshots in public/ — anything there ships byte-for-byte and unreferenced, so a
screenshot with something sensitive in frame (a phone number, an address) would be silently
published even if unused on any page.
Commerce wiring (src/config.ts + public/_redirects)
STRIPE_PAYMENT_LINK— the $39 one-time Stripe Payment Link. Itsplink_…id must be mapped in the license worker'sCATALOGvar (studio repo,license-worker/wrangler.jsonc), and the link's after-payment redirect must behttps://tendlore.com/activate?session_id={CHECKOUT_SESSION_ID}.public/_redirects/buy— the stable checkout URL the desktop app opens; point it at the same payment link.LICENSE_API_BASE— the shared Volarra license worker (license.volarra.com);/activateand/recovercall it from the browser, so tendlore.com must be in the worker'sALLOWED_ORIGINS.
Verify after deploy
curl -sI https://tendlore.com | head -2
curl -sI "https://downloads.tendlore.com/updates/tendlore-win-x64/Tendlore-win-Setup.exe" | grep -i 'HTTP\|content-length'
curl -s "https://license.volarra.com/health"