A Hungarian civic initiative website documenting the cryptocurrency "validation" law (Act LXVII of 2025) and its consequences.
This website tracks Hungary's crypto asset regulations:
- Timeline of regulatory changes and their impacts
- Crypto exchange service availability in Hungary
- Parliamentary member database with voting records
- Original provider confirmations and historical source documents
The validation regime ended on August 7, 2026, when Act XXXVIII of 2026 entered into force. The site preserves the regulatory history and tracks which providers have restored services and where restrictions remain.
- Timeline: Regulatory events, provider decisions and their sources
- Exchange tracking: Restrictions, closures, announced returns and confirmed restorations
- MP database: 199 parliamentary members with voting records
- Bilingual: Hungarian and English
Requires Node.js 24.21.0 LTS and pnpm 12.10.1 (pinned in package.json).
The runtime is pinned in .node-version and .nvmrc.
If you use nvm, run nvm install from this directory to install and select the pinned runtime.
pnpm install --frozen-lockfile # Install dependencies
pnpm dev # Cloudflare-backed Vite development server (workerd)
pnpm build # Prerender a static Cloudflare Pages export
pnpm preview # Preview the static export with Wrangler Pages
pnpm start # Alias for pnpm preview
pnpm deploy # Build and deploy the static export to Cloudflare Pages
pnpm check # Format, lint, type check
pnpm test # Production build + unit/component/HTTP regression tests
pnpm test:browser # Browser regression tests (requires agent-browser)
pnpm audit:search # Read-only production crawl/agent-discovery report
pnpm setup # Install the optional pre-commit hookTanStack Start/Router, React, Tailwind CSS v4, Vite+ (build, lint, format, test), pnpm, Cloudflare Pages. Node.js runs build/maintenance tools; production is static and needs no Node server, Worker or Pages Functions.
pnpm build prerenders the public page inventory (both languages), writes a static sitemap and 404 page, and verifies that the
export has real HTML and no backend dependencies. Deploy only dist/client. The dist/server bundle is used for
build-time rendering and must not be deployed.
Cloudflare Pages Git integration:
- Framework preset: None
- Install dependencies:
pnpm install --frozen-lockfile - Build command:
pnpm build - Build output directory:
dist/client - Production branch:
master - Node.js:
24.21.0; pnpm:12.10.1 - Custom domain:
stopkriptovalidacio.hu(matchesconstants/seo.ts)
For manual deployment, log in once with pnpm exec wrangler login, then run pnpm deploy.
Set the Pages project name in wrangler.jsonc to match your Cloudflare project. Do not use wrangler deploy: this is a
Pages static deployment, not a Workers deployment.
wrangler-dev.jsonc configures the Cloudflare Vite plugin for local development and build-time rendering.
wrangler.jsonc configures static Pages preview/deployment. The build removes the Vite plugin's generated Workers
deployment pointer so Wrangler Pages reads the static configuration.
Page URLs use trailing slashes to match Cloudflare Pages' directory serving: Hungarian pages use /, /rolunk/,
/szavazas/, etc.; English versions use /en/, /en/rolunk/, /en/szavazas/, etc. Old slashless URLs redirect to these
pages. Navigation, canonical URLs, hreflang alternates and the sitemap use the same language-specific directory URLs.
Language links preserve the page, query filters and fragment; cookie/Accept-Language-based rendering and /set-lang
are no longer used.
The default page content is present in the exported HTML without JavaScript. Query filters apply immediately after hydration and continue to support reloads and browser history. Content changes require a rebuild/redeployment.
Editorial dates live in utils/content-dates.ts; source publication/update dates live in data/sources.json.
Update them when the corresponding content changes, not when deploying. These dates feed visible page timestamps,
JSON-LD and sitemap lastmod. Historical event dates describe the event, not when we published its account.
Provider detail pages are registered in data/provider-pages.ts, with an explicit status-evidence event and editorial dates.
Their summaries reuse exchange translations and their histories reuse timeline events. Add a page only when its status
has linked evidence. The /hatter/ page exposes background events without requiring the timeline's JavaScript filter.
The finalizer generates a .md alternate for every indexable page, plus /llms.txt and /llms-full.txt.
Homepages use /index.md and /en/index.md; other URLs replace their trailing slash with .md.
Markdown is extracted from our own prerendered <main> at build time, so translations, source quotations and default
filter content stay aligned with the HTML. Navigation, scripts and interactive filter controls are omitted.
Background events remain available at /hatter.md, and all default voting records are included at /szavazas.md.
HTML advertises the alternate in its head. Generated Pages headers mark Markdown noindex, follow, set its content type,
and link to the canonical HTML. Only HTML URLs appear in the sitemap. No content negotiation or production backend is
required; regular HTML URLs always return HTML. The exports are available after pnpm build through pnpm preview.
Register new pages in utils/static-pages.ts with their content dates and canonical/indexable head metadata to include them.
See Search visibility checks for the bilingual query set, optional Brave API rank observations, Cloudflare crawler checks, AI citation records and Umami referral monitoring.
The global 404 fallback keeps its prerendered HTML and stylesheet but does not load the app hydration runtime. A small inline script selects its document language and home link from the requested URL, without a backend.
All maintenance scripts run directly with Node's native TypeScript support:
pnpm inspect-current-winners --help
pnpm backfill-mps-kpn-ids --help
pnpm download-mp-images
pnpm post-telegram --dry-runpost-telegram reads an optional .env file and requires TELEGRAM_BOT_TOKEN only when actually posting.
Image optimization uses the project-local Sharp dependency, with ImageMagick as a fallback.
Tests cover both languages, approved page/SEO fingerprints, timeline visibility,
representative filtering and selection, email editing/copying, language-specific URLs, 404 responses, sitemap and static assets.
The HTTP and browser suites exercise the actual static export using Wrangler Pages (not an SSR server).
The browser suite covers desktop/mobile, direct filtered URLs, language switching, and hydration/runtime errors.
Baseline fingerprints are intentionally fixed; review them when changing published content or styling.
After reviewing an intentional change, pnpm test:browser --print-baseline prints replacement fingerprints
without changing the fixture; all other browser assertions still run. Update only the affected entries in
tests/fixtures/migration-baseline.json, then run the regression tests normally.
MIT