Pre-launch landing page for pinka.finance — a Croatian onchain group-funding (crowdfunding) platform built on Monerium EURe, Safe and SEPA Instant.
This repo is only the marketing landing page. There are two separate web properties:
| Domain | What | Source |
|---|---|---|
| pinka.finance | Marketing landing page (this repo) | pinka-finance/landing |
| pinka.io | The actual application — public campaign pages + EPC/SEPA checkout | pinka-finance/app |
When the landing needs to link out to the live product, link to https://pinka.io.
pinka is a real-time, zero-fee onchain crowdfunding / group-funding platform. It is not podcast-specific — it supports several campaign types: donacije (donations), crowdfunding with a target goal, ulaznice (tickets), soft tokenizacija (on-chain attestation badges, not securities) and grupno financiranje nekretnina (real-estate).
Supporters pay by scanning a SEPA QR code in their banking app — funds settle in seconds via SEPA Instant and the Monerium-issued EURe stablecoin, into a per-campaign Safe multisig. Organizers withdraw on their own schedule, on-chain, with full transparency.
The platform sustains itself through optional supporter tips (Zeffy-style), not transaction fees on creators or causes.
- Monerium — MiCA-licensed e-money institution issuing EURe
- Safe — industry-standard multisig for treasury security
- Gnosis Chain — EVM settlement layer optimized for EURe
🚧 Pre-launch. This repository hosts the landing page only. Public launch and pilot cohort target Q3 2026.
- Next.js 14 (App Router), static export (
output: "export") - TypeScript (strict mode)
- Tailwind CSS + Radix primitives
- Framer Motion
- Cloudflare Workers + Static Assets (hosting) with D1 for waitlist/newsletter signups
- Optional Resend for transactional email (called from the Worker via
fetch)
There is no application server and no Postgres/Prisma — the site is fully static, and the only dynamic surface is the Worker in worker/index.js.
npm install
npm run dev # http://localhost:3000 (Next dev server)
npm run build # static export → ./out
npm run typecheck # tsc --noEmit
npm run lint # next lintNote:
npm run devruns the normal Next dev server, but the/api/waitlistand/api/newsletterendpoints only exist in the deployed Worker. To exercise them locally, runnpx wrangler dev(serves./out+ the Worker, with a local D1) after anpm run build.
app/
page.tsx # composes all sections
layout.tsx # global metadata + fonts + JSON-LD
opengraph-image.tsx # build-time OG image (next/og, static)
icon.tsx # build-time favicon
robots.ts / sitemap.ts
privacy / terms # legal pages
components/
sections/ # one file per landing section
waitlist/ # segmented signup form + dialog
ui/ # shadcn-style primitives
phone-mockup.tsx # animated hero device (campaign QR demo)
lib/
utils.ts # cn() helper
waitlist-schema.ts # zod schemas (client-side validation)
worker/
index.js # Cloudflare Worker: serves ./out + /api/* → D1
d1/
schema.sql # waitlist_signups + newsletter_signups tables
public/
_headers # security headers + PNG MIME for /icon, /opengraph-image
The landing is deployed as a Worker with Static Assets on the pinka.finance apex
(zone in the D.O.M. Cloudflare account). Config lives in wrangler.toml.
# Account that owns the pinka.finance zone:
export CLOUDFLARE_ACCOUNT_ID=7dc7167b7e2e00923bfa7cd697df14e4
# 1. (one time) create the D1 database, then put its id in wrangler.toml
wrangler d1 create pinka-landing
# 2. (one time) apply the schema
npm run cf:d1:init # wrangler d1 execute pinka-landing --remote --file=./d1/schema.sql
# 3. build + deploy (uploads ./out as assets, binds D1, attaches the apex route)
npm run cf:deploy # npm run build && wrangler deploy
# 4. (optional) transactional email via Resend
wrangler secret put RESEND_API_KEY
wrangler secret put WAITLIST_NOTIFY_EMAIL # admin signup notifications
# and uncomment RESEND_FROM under [vars] in wrangler.tomlThe Worker route pinka.finance/* attaches to the existing proxied DNS record for the apex.
Note on Cloudflare Access: the apex was previously gated by a Cloudflare Access (Zero Trust) application. For the public landing this must be removed in the dashboard: Zero Trust → Access → Applications → the app with domain
pinka.finance→ Delete (or set its policy to Bypass / Everyone). It should not be active for this domain.
See CONTRIBUTING.md for contribution guidelines.
- 🌐 pinka.finance — landing (this repo)
- 🚀 pinka.io — the app
- 🐙 pinka-finance — GitHub organization
- 📧 hello@pinka.finance — general inquiries
- 🔒 security@pinka.finance — security disclosures (see SECURITY.md)
MIT — see LICENSE.