尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Skipline is a demo web app for a college business law class. It shows how bar "skip the line" and cover-charge pass apps work, and why their passes can't be faked. Every bar, address and event is fictional, set in the made-up college town of Larkspur Falls. No real payments are taken.
Tech: Next.js 15 (App Router) · Tailwind CSS · API routes · Postgres via Prisma · qrcode.react
The site runs on Vercel with a free Postgres database (Prisma Postgres or Neon). The code
lives on GitHub, and every push to main redeploys the site automatically.
DATABASE_URL for you.PASS_SIGNING_SECRET with a long random
value. You can generate one with:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"Changing the secret makes all existing passes fail with "Invalid signature". That's expected, since they were signed with the old key.
Edit the code, commit, and push to GitHub. Vercel rebuilds and redeploys in about a minute. Pushes to other branches get their own preview URL, so you can check a change before it goes live.
Common edits:
| To change… | Edit |
|---|---|
| Bars, prices, featured events | lib/seed.ts (redeploy; existing nights keep their old prices) |
| Service fee | lib/money.ts |
| Pass card colors | lib/passStyle.ts |
| Background, cards, buttons | app/globals.css, tailwind.config.ts |
| How It Works text | app/how-it-works/page.tsx |
| Time zone for "tonight" | NEXT_PUBLIC_APP_TIME_ZONE env var (default America/Chicago) |
You need Node.js 20+.
npm install.env file from .env.example. The easiest way is to install the Vercel CLI (npm i -g vercel)
and run vercel link and then vercel env pull .env. That gives you the same database as the live site.
You can also point DATABASE_URL at a local Postgres instead.npm run dev, then open http://localhost:3000.To wipe the database and reseed, run npm run db:reset. This also deletes every pass, including on the live
site if you're using its database.
| Piece | Where |
|---|---|
| Token signing / verification (HMAC-SHA256) | lib/token.ts |
| Redemption checks (signature → exists → venue → expiry → single use) | app/api/redeem/route.ts |
| Atomic inventory reservation (sold-out handling) | app/api/orders/route.ts |
| Pass screen (card, QR, staff redeem) | app/passes/PassesClient.tsx |
| Copycat token generator for the demo | app/api/demo/forge/route.ts |
A token looks like SKL1.<base64 payload>.<signature>. Only the server knows PASS_SIGNING_SECRET, so only the
server can make a valid signature. Redemption is a single conditional update ("set redeemedAt only if it's empty"),
so two attempts to use the same pass can't both succeed, even at the same moment.
Possible rejection reasons: Unknown pass, Invalid signature, Already redeemed, Expired, Wrong venue.
app/
page.tsx Venues list (home)
venues/[slug]/page.tsx Venue page with passes grouped by date
checkout/[optionId]/ Checkout + "Place Demo Order"
passes/ My Passes (card, QR, staff redeem)
account/page.tsx Passholder name, links
points/page.tsx Points balance (10 per $1 spent)
drops/page.tsx Drops (empty state)
how-it-works/ Explainer + forge demo
api/ venues, orders, passes, redeem, demo/forge
components/ Header, BottomNav, VenueArt (generated logos), icons
lib/ prisma, token, dates, money, seed data, demo user
prisma/ schema.prisma, seed.ts
localStorage, and that id owns its passes.lib/money.ts).