Skip to content

Feat/per format optional fields - #51

Open
RomanDenysov wants to merge 5 commits into
mainfrom
feat/per-format-optional-fields
Open

Feat/per format optional fields#51
RomanDenysov wants to merge 5 commits into
mainfrom
feat/per-format-optional-fields

Conversation

@RomanDenysov

Copy link
Copy Markdown
Owner

No description provided.

RomanDenysov and others added 5 commits July 11, 2026 09:13
Rebuilt the generator as a single card with segmented format control,
per-format optional fields behind a Fields menu (persisted per format
in localStorage), auto-submit hooks, and redesigned UI primitives
(sharp corners, pixel title, drafting-grid background).

Also riding in the shared files:
- SEO metadata/CTR rework: titles lead with per-locale head queries
  (sk "Generátor QR platby", cs "QR platba generátor", en "SEPA QR
  Code Generator"), descriptions 140-160 chars with free/no-signup
  differentiators
- Per-locale first-visit format default (sk bysquare, cs spayd, en epc)
  and /?format= query param support
- Soft IBAN/format mismatch hint (never auto-switches) with
  format_hint_accepted + form_validation_failed events
- API layer sync for optional fields (qr-docs, qr-schema, mcp-server,
  webmcp, gpt-config, docs try-it/parameters)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two content pages built on next-intl pathnames (first use in the app):
- "How to create a payment QR code" guide - answer-first intro, step
  cards, per-format explainer (cs leads SPAYD, en leads EPC), FAQ,
  HowTo + FAQPage + BreadcrumbList JSON-LD
  (sk /ako-vytvorit-qr-kod-na-platbu, cs /jak-vytvorit-qr-kod-pro-platbu,
  en /how-to-create-payment-qr-code)
- SEPA QR landing targeting NL/DE/UK "sepa qr" demand, CTA prefills
  the EPC tab via /?format=epc

localePath/getAlternates now resolve localized slugs via getPathname;
locale switcher moved to typed object-href replace; internal links
from home "More tools" and FAQ items; sitemap entries.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upstash counters stats:qr:total / stats:qr:{YYYY-MM} / stats:api:total.
Body-less sendBeacon POST /api/v1/stats/hit after client generation
(single + bulk, count capped at 100); /api/v1/qr increments via after().
Public GET /api/v1/stats returns { total, month, api }, s-maxage=600.

Homepage renders three cards from a direct Redis read (10-min in-memory
cache); month card gated on a full previous month of data, section
hidden below 100 total. No payment data ever reaches the endpoints.

openapi.json + llms.txt document the stats endpoint and new pages.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Random 32-byte secret minted on first Copy link, stored only in
localStorage on the history entry; public id =
base64url(sha256(secret)).slice(0,16) travels as ?t= on the share URL.
The /p page fires POST /api/v1/t/{id} from client JS only (never SSR,
so unfurl bots don't count); Redis keeps count + last-opened with
90-day TTL. Owner sees "Opened N× · last <time>" in the share dialog
and history list by re-deriving the id from the secret.

Count + timestamp only - no uniques, no IP, no fingerprinting; the
payment payload never touches the server; copy says "opened", never
"paid".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
qr-payment Ready Ready Preview Aug 3, 2026 12:33pm

Request Review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant