Project Plateau
Project Plateau: four glass plates, one living valley, and the road back to camp.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Interactive Bible quiz app for youth meetings, Sunday schools, and family nights. "Guess the Bible hero from a selfie!" — Players scan a QR code to join and compete in real-time.
🌐 Live: youthconnect.church
# Install dependencies
npm install
# Copy environment file
cp .env.example .env.local
# Fill in the values (see "Environment Variables" below)
# Run development server
npm run dev
# For testing on phones in the same network:
npm run dev -- -H 0.0.0.0
Open:
Copy .env.example to .env.local and fill in the values:
PUSHER_APP_ID=your_app_id
PUSHER_SECRET=your_secret
NEXT_PUBLIC_PUSHER_KEY=your_key
NEXT_PUBLIC_PUSHER_CLUSTER=eu
DATABASE_URL=postgres://user:pass@host/dbname?sslmode=require
Generate with: openssl rand -base64 32
AUTH_SECRET=your_generated_secret
https://yourdomain.com/api/auth/callback/googleAUTH_GOOGLE_ID=your_client_id
AUTH_GOOGLE_SECRET=your_client_secret
https://yourdomain.com/api/auth/callback/yandexAUTH_YANDEX_ID=your_client_id
AUTH_YANDEX_SECRET=your_client_secret
STRIPE_SECRET_KEY=sk_test_...
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
NEXT_PUBLIC_STRIPE_DONATE_LINK=https://buy.stripe.com/...
NEXT_PUBLIC_PAYPAL_DONATE_LINK=https://paypal.me/yourlink
NEXT_PUBLIC_BOOSTY_LINK=https://boosty.to/yourpage
NEXT_PUBLIC_CRYPTO_LINK=https://nowpayments.io/donation/...
# Show text quizzes (currently hidden for selfie-only mode)
NEXT_PUBLIC_ENABLE_TEXT_QUIZZES=false
After setting up DATABASE_URL, run migrations:
# Generate migration from schema
npx drizzle-kit generate
# Apply migration
npx drizzle-kit migrate
src/
├── app/
│ ├── [locale]/ # i18n routes
│ │ ├── page.tsx # Landing page
│ │ ├── play/
│ │ │ ├── page.tsx # Player game page
│ │ │ └── host/ # Host screen
│ │ ├── auth/ # Sign in/error pages
│ │ ├── profile/ # User history
│ │ └── settings/ # User settings
│ ├── api/
│ │ ├── auth/ # Auth.js handlers
│ │ ├── join/ # Player join
│ │ ├── answer/ # Player answer
│ │ ├── host/ # Host events
│ │ └── donate/ # Stripe checkout
│ └── globals.css
├── auth/ # Auth.js config
├── db/ # Drizzle schema
├── data/
│ ├── characters.ts # Character manifest with levels
│ └── quizzes.json # Legacy fixed quizzes (kept for text mode)
├── i18n/ # Internationalization config
├── lib/
│ ├── quiz-generator.ts # Random quiz generation
│ ├── pusher-*.ts # Pusher client/server
│ └── types.ts # Shared types
└── components/
messages/ # i18n translation files
public/images/selfie/ # Character selfie images
scripts/
└── import-selfies.mjs # Image import script
/play/host, selects difficulty, shows QR codesrc/selfie/ as NN_CharacterName.pngsrc/data/characters.ts with character infonode scripts/import-selfies.mjsThis compresses images to public/images/selfie/ and updates the quiz data.
npm run build
npm start
Currently supported languages:
Add translations in messages/{locale}.json.
MIT © YouthConnect