Fields & Floors Collectors
Search every numbered sports card on eBay by print run, autograph, rookie status and price, then save searches and get an email when a new card lists.
Translation pending
Browse deals from Lompoc, California businesses — restaurants, salons, services, and more. Updated daily.
CommerceHTML · TypeScriptGitHub @KreatipworldOnlineOwner 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
Lompoc Deals
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A local promotions feed for Lompoc, California. Businesses post coupons, specials, and announcements; locals browse a feed, search by category, view a map, and optionally subscribe to a weekly email digest.
• Next.js 14 (App Router, TypeScript)
• Tailwind CSS + shadcn/ui components
• Postgres via Neon (@neondatabase/serverless)
• Drizzle ORM for schema and migrations
• Auth.js v5 (NextAuth) with email/password + bcrypt
• Leaflet + react-leaflet for the map (OpenStreetMap tiles, no API key)
• Resend for transactional and digest emails
• Vercel Blob for image uploads
• Hosted on VercelRead the full README ↗A local promotions feed for Lompoc, California. Businesses post coupons, specials, and announcements; locals browse a feed, search by category, view a map, and optionally subscribe to a weekly email digest.
@neondatabase/serverless)git clone <your-repo-url> lompoc-deals
cd lompoc-deals
npm install
Copy .env.example to .env.local and fill in:
DATABASE_URL=postgresql://... # from Neon
AUTH_SECRET=... # openssl rand -base64 32
AUTH_URL=http://localhost:3000 # in prod: https://yourdomain.com
RESEND_API_KEY=re_... # from Resend
BLOB_READ_WRITE_TOKEN=vercel_blob_rw_... # from Vercel Blob
CRON_SECRET=... # openssl rand -base64 32
Generate the two secrets locally:
openssl rand -base64 32 # AUTH_SECRET
openssl rand -base64 32 # CRON_SECRET
npm run db:generate # generates SQL migrations from db/schema.ts
npm run db:migrate # applies migrations to DATABASE_URL
npm run db:seed # 7 categories, 5 sample businesses, 10 sample deals
npm run db:studio # browse data in a local Drizzle Studio UI
npm run dev
Visit http://localhost:3000.
After running npm run db:seed, you can sign in with:
| Role | Password | |
|---|---|---|
| Business owner | [email protected] | password123 |
app/
(public)/ ← homepage feed, biz profiles, categories, search, map, subscribe, favorites
(auth)/ ← login, signup
dashboard/ ← gated business dashboard (profile, deals CRUD, stats)
admin/ ← gated admin (approve businesses, soft-delete deals)
api/
auth/ ← NextAuth route handler
cron/digest/ ← weekly digest cron, bearer-protected
track/click/ ← click-tracking redirect
components/ ← reusable UI (DealCard, SiteHeader, etc.) + shadcn/ui primitives
db/
schema.ts ← Drizzle schema
client.ts ← Drizzle + Neon HTTP client
seed.ts ← seed script
migrations/ ← generated SQL
lib/
auth-actions.ts ← signup, login, logout
biz-actions.ts ← business dashboard server actions
admin-actions.ts ← admin server actions
favorite-actions.ts ← local user favorite toggle
subscribe-actions.ts ← email digest subscribe / confirm / unsubscribe
queries.ts ← read-side query helpers
viewer.ts ← unified session/role/favorites lookup
email.ts ← Resend wrappers
blob.ts ← Vercel Blob upload helper
geocode.ts ← Nominatim address → lat/lng
tracking.ts ← view + click counters
auth.ts ← Auth.js v5 config
middleware.ts ← gates /dashboard/* and /admin/*
docs/
build-plan.md ← original spec
Push to GitHub:
gh repo create lompoc-deals --private --source=. --push
Import to Vercel: https://vercel.com/new → pick the repo → Deploy
Add environment variables in Vercel → Project → Settings → Environment Variables. Same six vars as .env.local. Set AUTH_URL to your production URL (e.g. https://www.lompoclocals.com).
Run migrations against the production DB before first deploy:
DATABASE_URL=<prod-url> npm run db:migrate
DATABASE_URL=<prod-url> npm run db:seed # only if you want sample data in prod
Cron job: vercel.json declares a weekly cron at Saturday 9am UTC hitting /api/cron/digest. Vercel registers it on first deploy. Verify at Vercel → Project → Settings → Cron Jobs.
Custom domain: Vercel → Domains → add your domain. In your DNS provider, add the A record (@ → 76.76.21.21) and CNAME (www → cname.vercel-dns.com) Vercel shows you. Wait a few minutes for SSL.
After domain is live: update AUTH_URL env var in Vercel to https://yourdomain.com and redeploy.
The /api/cron/digest route is protected by an Authorization: Bearer <CRON_SECRET> header. Vercel automatically sends this header with the value of your CRON_SECRET env var when its scheduler hits the route. Without the bearer header, the route returns 401.
To trigger the cron manually for testing:
CRON=$(grep '^CRON_SECRET=' .env.local | cut -d= -f2-)
curl -H "Authorization: Bearer $CRON" http://localhost:3000/api/cron/digest
| Script | Purpose |
|---|---|
npm run dev | Start dev server on port 3000 |
npm run build | Production build |
npm run start | Start production build |
npm run lint | ESLint |
npm run db:generate | Generate SQL migrations from db/schema.ts |
npm run db:migrate | Apply migrations to DATABASE_URL |
npm run db:push | Push schema directly (interactive) |
npm run db:studio | Open Drizzle Studio |
npm run db:seed | Run the seed script |
Private project. All rights reserved.