尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A people-first campaign by Pick at Store: share a memory of a neighbourhood
store, pin it to the map of India, and pass the memory on.
• Next.js (App Router, TypeScript, Tailwind CSS), deployed on Vercel while we build
• Firebase: Authentication (Google) and Cloud Firestore, on the free Spark plan
• Cloudinary (free plan) for story photos, private until approved, through src/app/api/photos
• Firebase projects: pas-dev-7786f (dev, default) and pas-prod-c8190 (prod)
Requires Node 22+ and Java 21+ (for the Firebase emulators).查看完整 README ↗A people-first campaign by Pick at Store: share a memory of a neighbourhood store, pin it to the map of India, and pass the memory on.
Product and build plan: https://claude.ai/code/artifact/d75832d4-2701-4e44-9837-514ab263cf98
src/app/api/photospas-dev-7786f (dev, default) and pas-prod-c8190 (prod)Requires Node 22+ and Java 21+ (for the Firebase emulators).
npm install
cp .env.example .env.local # fill in the dev web app config
npm run dev # http://localhost:3000
To work fully offline against local Firebase, set
NEXT_PUBLIC_USE_FIREBASE_EMULATORS=true in .env.local and run
npm run emulators in a second terminal (UI at http://localhost:4000).
| Command | What it does |
|---|---|
npm run lint | ESLint |
npm run typecheck | TypeScript, with Next.js route types |
npm run test:rules | Firestore and Storage security rules tests on the emulators |
npm run build | Production build |
All four run in GitHub Actions on every pull request.
Every story waits for a moderator at /moderate before anyone else can see it.
The app can't make anyone a moderator; that is done by hand in the Firebase
console:
/moderate and copies the code it shows.moderators
collection (choose Start collection the first time).name holding their name.Every decision is written to moderationLog, which nobody can edit or delete.
Moderators also see a Reports tab. Anyone signed in can report a memory from its page (or the flag on its Wall card); the memory stays up until a moderator hides it or keeps it. The Approved tab can feature a memory in the Wall's Featured row.
/wall shows every approved memory shared with everyone, and
/memories/<id> shows one memory, including those shared by link only.
Both are built on the server from what an anonymous visitor may read, then
cached, so visitors don't each cost a Firestore read:
src/app/api/wall/refresh).usersPrivate/<uid>/reactions plus a count on
the story that only its author is shown. There are no public counters.firestore.rules and storage.rules deny everything by default (Firebase
Storage is not used). Each build
step opens only what its screens need, and adds tests under tests/rules
proving the rest stays closed. Deploy rules with:
npx firebase deploy --only firestore:rules,storage --project dev
src/lib/post-limits.ts). The count lives in postLimits/<uid>, written
in the same batch as each new story and checked by the rules; /api/photos
checks it too before storing a photo.src/components/cookie-choice.tsx). Sign-in storage is essential.@vercel/analytics), cookieless. Turn
it on in the Vercel project's Analytics tab.src/app/sitemap.ts, src/app/robots.ts, canonical
links and link previews use the production address Vercel reports
(VERCEL_PROJECT_PRODUCTION_URL), so a custom domain needs no code change.
Set NEXT_PUBLIC_SITE_URL only to override it. Test links are never listed.next.config.ts.Google blocks its sign-in page inside apps' web views, so the Pick at Store
app signs in with Google itself and hands the page an ID token
(src/lib/google-sign-in.ts). The contract, web view settings and examples
for React Native, Flutter, Android and iOS are in
docs/pick-at-store-app.md. In other apps'
browsers (Instagram, Facebook) the sign-in pages explain how to open the site
in the phone's browser instead.