尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Conversation cards for groups. Next.js (App Router), no accounts. Ratings are
backed by Vercel KV (Upstash Redis) — see below.
Open http://localhost:3000 — it's designed for a phone, so use the device toolbar
in your browser's dev tools.
Ratings require a KV store (see next section). Without one, /api/rate and
/api/stats return a 503 and the "Most loved" screen just shows the seed
percentages from lib/content.js — everything else works normally.檢視完整 README ↗Conversation cards for groups. Next.js (App Router), no accounts. Ratings are backed by Vercel KV (Upstash Redis) — see below.
npm install
npm run dev
Open http://localhost:3000 — it's designed for a phone, so use the device toolbar in your browser's dev tools.
Ratings require a KV store (see next section). Without one, /api/rate and
/api/stats return a 503 and the "Most loved" screen just shows the seed
percentages from lib/content.js — everything else works normally.
KV_REST_API_URL / KV_REST_API_TOKEN env vars for you.vercel env pull .env.local
(requires the Vercel CLI, npm i -g vercel,
and vercel link once first).app/api/rate/route.js and app/api/stats/route.js read the
env vars automatically via @vercel/kv.Votes are stored as two Redis hashes (tralala:like, tralala:down) keyed by
question index, plus one small hash per anonymous device id so a changed vote
un-counts the old one first. No personal data is stored — just the device id
already generated by lib/analytics.js.
The "SAY" screen lets players submit a short suggestion (500 chars max, one
per device per day) and see + upvote/downvote what others wrote. It uses the
same KV store as ratings, so it works automatically once that's set up —
nothing extra to configure. Submissions are public to anyone using the app;
there's no moderation beyond the daily limit, so remove anything inappropriate
via the /moderate page (see "Admin" below).
Logged in as admin, open https://<your-site>/api/feedback/export in the
same browser to get every submission as JSON.
/moderate (linked from /admin) lists every submission with a DELETE
button next to each.
The app also tracks anonymous, aggregate-only product events — session
starts, cards viewed (with question, category, language, and whether the
category filter was left on "All" or narrowed), and shares — using the same
device id and the same KV store as ratings and feedback. No personal data,
no third-party analytics vendor; see lib/analytics.js (track()) for the
client side and app/api/track/route.js for how each event turns into a few
HINCRBYs. Every counter is day-bucketed (one hash per metric, fields shaped
like "2026-08-28|fun"), so a reader can sum any trailing window instead of
only ever seeing an all-time total.
Admin session only, like the feedback export:
https://<your-site>/api/analytics for everything since launch, or
add ?range=7 / ?range=30 / ?range=90
to scope sessions, views, and shares to that many trailing days (the
sessions-per-day breakdown always comes back in full either way, so a
caller can chart the whole history and still get lockstep totals for
whatever window it's showing).views.byCategoryByLang — card views broken down
by category within each language (e.g. "what's popular among English
players") — and views.byFilterMode — how often people browse with the
category filter left on "All" versus narrowed to one or a few categories./insights (linked from /admin) is a private page that reads
/api/analytics and /api/stats and renders them — sessions over time,
new vs. returning, languages, categories (overall or filtered to one
language), and question leaderboards (most seen, most loved, rarely loved).
The 7D / 30D / 90D / MAX chips re-fetch /api/analytics for that window; the
language chips just re-slice the single response already in hand. Like/down
percentages are always all-time (that data doesn't live in /api/analytics)
and only count questions with 3+ votes.
All owner-only pages sit behind one login (lib/adminAuth.js):
ADMIN_KEY: a long random string (openssl rand -hex 24). It goes in
the admin link: https://<your-site>/admin?key=<ADMIN_KEY>.ADMIN_CODE: the code you type on that page. Make it long enough not
to be guessed (a passphrase is fine)./admin then lists Insights, Moderation, promo codes and the
owner mode of /create; "Atsijungti" logs out.Without the session, every private page and API answers a plain 404, and all
of them send X-Robots-Tag: noindex (next.config.mjs). They are
deliberately not listed in robots.txt, which is public. Changing
ADMIN_KEY or ADMIN_CODE logs every browser out. Leaving either unset
switches admin off entirely.
Every push to main redeploys.
lib/content.js holds everything: categories, all 150 questions in English and
Lithuanian, every piece of interface copy, the card surfaces and category tints.
Add a question — append a row to Q:
['fun', 'English question?', 'Klausimas lietuviškai?', 50],
The fourth number is the like-rate shown on the "Most loved" screen as a fallback. Once a question has at least one real vote (via the ratings backend, see below), its live percentage is shown instead.
Add a category — add to CATS (id, en, lt, icon, optional note), add a hue
to CAT_TINT, then write its questions. Adding it to OPT_IN keeps it out of the
default deck (as with Spicy and Couples).
Change interface wording — edit UI.en / UI.lt.
app/layout.jsx fonts, metadata, PWA manifest link
app/page.jsx the whole app: home, deck, favourites, most loved, share, feedback
app/api/rate/route.js POST one up/down vote, returns the question's updated tally
app/api/stats/route.js GET aggregate tallies for every voted-on question
app/api/track/route.js POST one anonymous product event (session/view/share)
app/api/analytics/route.js GET the aggregated event counters (see Analytics below)
app/globals.css resets and font variables — all other styling is inline
lib/content.js ← all content
lib/deck.js shuffle and deck-building
lib/analytics.js anonymous device id, rating/stats fetch helpers, event tracking
public/manifest.json PWA
SURFACE at the top of app/page.jsx: 'Warm paper' (default), 'Ash grey',
'Category tint', or 'Ink card'.
@vercel/og.app/icon.png, app/apple-icon.png, app/opengraph-image.png, and
public/icon-192.png / icon-512.png are generated (not hand-drawn) — run
node scripts/generate-icons.mjs to regenerate them if the brand colors or
wordmark ever change. Uses the same Instrument Serif font as the app itself
(font files live in scripts/assets/, fetched from Google's font repo).