71 lines
2.5 KiB
Markdown
71 lines
2.5 KiB
Markdown
# Deklinationstrainer
|
|
|
|
A daily-practice German declension trainer. Self-hosted so your progress actually saves.
|
|
|
|
## Deploy to Coolify
|
|
|
|
### One-time setup
|
|
|
|
1. Push these files to a git repo (GitHub / Gitea / whatever Coolify is connected to).
|
|
|
|
2. In Coolify, create a new **Application**:
|
|
- Source: your git repo
|
|
- Build pack: **Nixpacks** (auto-detects Vite) or **Static**
|
|
- Build command: `npm run build`
|
|
- Publish directory: `dist`
|
|
- Port: not needed for static output (Coolify serves it directly)
|
|
|
|
3. Add a domain (e.g. `deklination.yourdomain.com`). Coolify provisions HTTPS via Caddy/Traefik automatically.
|
|
|
|
4. Deploy. Visit the URL on any device.
|
|
|
|
### Local dev
|
|
|
|
```bash
|
|
npm install
|
|
npm run dev # http://localhost:5173
|
|
npm run build # outputs to ./dist
|
|
```
|
|
|
|
## On iPhone
|
|
|
|
Open the URL in Safari, tap Share → **Add to Home Screen**. It opens fullscreen like a native app, and progress saves in localStorage across reboots, sessions, and app closes.
|
|
|
|
## Storage
|
|
|
|
The app tries `window.storage` first (Claude artifact environment), then falls back to `localStorage`. When self-hosted, only localStorage runs, which iOS Safari persists reliably.
|
|
|
|
To wipe progress: open browser devtools → Application → Local Storage → delete the `gd-v10` key. Or on iPhone: Settings → Safari → Advanced → Website Data → search your domain → delete.
|
|
|
|
## Stripe checkout
|
|
|
|
Beug uses public Stripe Checkout or Payment Link URLs, supplied through environment variables. Do not put Stripe secret keys in this Vite app.
|
|
|
|
Create one product in Stripe, for example `Beug Premium`, with three prices:
|
|
|
|
- Weekly subscription: `$2.99` every week
|
|
- Yearly subscription: `$9.99` every year
|
|
- Lifetime access: `$19.99` one-time payment
|
|
|
|
Create a Payment Link or Checkout link for each price. Set the success redirect URL to:
|
|
|
|
```text
|
|
https://beug.george1.dev/?checkout=success
|
|
```
|
|
|
|
Set the cancel URL to:
|
|
|
|
```text
|
|
https://beug.george1.dev/
|
|
```
|
|
|
|
Then add these public URLs in the deployment environment:
|
|
|
|
```bash
|
|
VITE_STRIPE_YEARLY_URL=https://buy.stripe.com/...
|
|
VITE_STRIPE_LIFETIME_URL=https://buy.stripe.com/...
|
|
VITE_STRIPE_WEEKLY_URL=https://buy.stripe.com/...
|
|
```
|
|
|
|
The current v1 unlock is intentionally simple: after Stripe redirects back with `?checkout=success`, Beug stores the unlock in this browser's localStorage. This avoids accounts for the tiny-app version, but it is a soft paywall. A stricter version needs a small backend, Stripe webhooks, and account or email-based entitlement lookup.
|