Ecommerce Template
Modern ecommerce template built with Next.js 16, React 19, Drizzle, Better Auth, Supabase, and Stripe.
Find apartments and houses for sale or rent directly from owners in Spain, France, Italy and Portugal. Listing your property is free.
CommerceTypeScript · PLpgSQLGitHub @rasbi-tools-calOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Property portal for Spain, France, Italy and Portugal: owners list for free, buyers and tenants search
with filters and a map, contact owners directly and get email alerts.
Stack: Next.js 16 (App Router, Turbopack) · React 19 · TypeScript · Tailwind CSS v4 + shadcn/ui ·
next-intl (EN/ES/FR/IT/PT) · Supabase (Postgres + PostGIS, Auth, Storage, RLS) · Leaflet ·
Cloudflare Turnstile · SMTP email (any provider).
Requirements: Node 22+, pnpm, Docker Desktop.Read the full README ↗Property portal for Spain, France, Italy and Portugal: owners list for free, buyers and tenants search with filters and a map, contact owners directly and get email alerts.
Stack: Next.js 16 (App Router, Turbopack) · React 19 · TypeScript · Tailwind CSS v4 + shadcn/ui · next-intl (EN/ES/FR/IT/PT) · Supabase (Postgres + PostGIS, Auth, Storage, RLS) · Leaflet · Cloudflare Turnstile · SMTP email (any provider).
Requirements: Node 22+, pnpm, Docker Desktop.
pnpm install
pnpm db:start # Supabase in Docker (first run downloads images)
pnpm db:reset # applies supabase/migrations + supabase/seed.sql (demo accounts)
pnpm seed:demo # 16 demo listings with photos (local only)
cp .env.example .env.local # then paste the keys printed by `npx supabase status`
pnpm dev # http://localhost:3100
| What | Where |
|---|---|
| Site | http://localhost:3100 |
| Emails (sign-up, alerts, messages) | Mailpit — http://127.0.0.1:54324 |
| Database UI | Supabase Studio — http://127.0.0.1:54323 |
Demo accounts (password Evalorio2026): [email protected] (moderator),
[email protected] (trusted owner, publishes instantly), [email protected] (first listing goes to review).
pnpm typecheck
pnpm lint
pnpm db:test # 24 pgTAP tests: RLS, privilege escalation, listing workflow, location privacy
pnpm test:e2e # Playwright: sign-up → post listing → moderation → search → contact → favourites
Trigger the alert emails by hand:
curl -H "Authorization: Bearer $CRON_SECRET" "http://localhost:3100/api/cron/alerts?frequency=daily"
app/[locale]/ pages (English at /, other languages under /es, /fr, /it, /pt)
[country]/[[...segments]] SEO search pages: /spain/madrid/apartments-for-sale, /es/espana/madrid/pisos-en-venta
listing/[ref] /listing/100002-penthouse-with-terrace
post, post/[id] 5-step listing wizard (draft autosaved per step)
account/*, admin/* owner dashboard, moderation
app/api/ auth callbacks, cron, GDPR export, one-click unsubscribe
components/ UI (shadcn in components/ui)
lib/actions/ server actions (validated with zod, rate limited)
lib/catalog.ts countries, property types, localized URL slugs
messages/*.json translations
supabase/migrations/ schema, RLS, triggers, search functions, geography data
supabase/tests/ database security tests
proxy.ts i18n routing + session refresh + protected routes
anon/authenticated by default, grants are explicit and
column-level where it matters (users can never change role, is_banned, is_trusted).listing_private (owner/admin only).
The public pin is offset by 80–200 m unless the owner opts in. Phone numbers are revealed on click,
rate limited and logged.pnpm remote:link, remote:push, remote:config, remote:check).https://yourdomain/**),
Email templates (copy supabase/templates/*), Captcha → Turnstile secret, custom SMTP,
Google provider (optional; then set NEXT_PUBLIC_GOOGLE_AUTH_ENABLED=true).pnpm remote:make-admin [email protected]..env.example in Vercel (production keys, never the local ones).NEXT_PUBLIC_MAP_TILE_URL / _ATTRIBUTION / _ORIGINS to a provider (MapTiler, Stadia, …).vercel.json (instant every 15 min needs a paid Vercel plan).lib/static-content.tsx) reviewed and completed; fill in the [brackets].