A minimalist SaaS decision tool that captures your unique moment in time.
Ci Moment is a lightweight decision clarity tool.
Users select a context and receive an instant signal.
Seal your moment: https://cimoment.gumroad.com/l/rwffi
Ci Moment is sealed via Gumroad β no server-side payment secrets required: https://cimoment.gumroad.com/l/rwffi
- Open app
- Select context
- Receive decision signal
- Click "Seal this moment β $5"
- Complete checkout on Gumroad
Ci Moment is a single-page decision tool that helps users check their personal moment status for different life contexts (Career, Love, Timing). Each decision is locked to a specific UTC minute and can be sealed via Gumroad checkout.
Live Demo: https://ci-moment.vercel.app
- Deterministic Decision Engine: Status changes based on UTC time and context
- Artifact Generation: Unique cryptographic artifact codes for each decision
- Gumroad Checkout: Secure payment via Gumroad β no backend secrets required
- Verification System: SHA-256 based verification for sealed artifacts
- Serverless Architecture: Built for Vercel with Next.js 14 App Router
- Framework: Next.js 14 (App Router)
- Language: TypeScript
- Payments: Gumroad (redirect link)
- Deployment: Vercel
- Styling: Inline CSS (minimal approach)
- Node.js 20.x or higher
- npm or yarn
- Vercel account (for deployment)
git clone https://github.com/Ihorog/ci-moment.git
cd ci-momentnpm installnpm run devOpen http://localhost:3000 in your browser.
No environment variables are required for the default Gumroad mode.
The /api/moment/* endpoints use Prisma + PostgreSQL (Supabase) for full artifact persistence.
Copy .env.example to .env.local and fill in:
cp .env.example .env.localRequired for the moment API:
DATABASE_URL=postgresql://user:password@host:5432/dbnameFor Supabase, use the Transaction connection string from:
Dashboard β Settings β Database β Connection string β Transaction mode
npx prisma generatenpx prisma migrate dev --name initOr push schema directly (no migration history):
npx prisma db pushnpm run dev# Health check
curl http://localhost:3000/api/health
# Compute status (no DB write)
curl "http://localhost:3000/api/moment/status?context=career"
# Create artifact (writes to DB)
curl -X POST http://localhost:3000/api/moment/create \
-H "Content-Type: application/json" \
-d '{"context":"career","source":"web"}'
# Verify artifact
curl "http://localhost:3000/api/moment/verify?artifactCode=ci-4a-92f8b"
# Seal artifact
curl -X POST http://localhost:3000/api/moment/seal \
-H "Content-Type: application/json" \
-d '{"artifactCode":"ci-4a-92f8b"}'
# List artifacts (admin)
curl "http://localhost:3000/api/moment/list?context=career&limit=10&page=1"Add environment variables in the Vercel Dashboard and deploy:
vercel --prodVercel automatically runs npm run build which includes prisma generate.
ci-moment/
βββ app/ # Next.js 14 App Router
β βββ api/ # API routes (dormant in Gumroad mode)
β β βββ seal/ # Returns 410 Gone
β β βββ webhook/ # Returns 410 Gone
β βββ verify/ # Verification pages
β βββ layout.tsx # Root layout
β βββ page.tsx # Main application page
βββ components/ # React components
β βββ Landing.tsx # Landing screen
β βββ Threshold.tsx # Confirmation screen
β βββ Manifest.tsx # Loading animation
β βββ Result.tsx # Decision result
β βββ SealButton.tsx # Payment button (Gumroad link)
βββ lib/ # Shared utilities
β βββ engine.ts # Decision engine logic
β βββ engine.server.ts # Server-only crypto operations
β βββ design-system.ts # Centralized design tokens
β βββ payments.ts # Payment provider config
β βββ supabase.ts # Database client (verification only)
βββ db/ # Database schema
β βββ schema.sql # PostgreSQL schema
βββ docs/ # Documentation
βββ DEPLOYMENT.md # Deployment guide
- AGENTS.md - Instructions for GitHub Copilot agents
- ARCHITECTURE.md - System architecture and design decisions
- DEPLOYMENT-STRATEGY.md - Deployment strategy
- CONTRIBUTING.md - How to contribute
- SECURITY.md - Security policy
- CHANGELOG.md - Version history
npm run type-checknpm run lintnpm testnpm run check-dbThis verifies your Supabase database connection and schema. See scripts/README.md for details.
npm run buildThis project is optimized for deployment on Vercel. No payment secrets are required.
- Push your code to GitHub
- Import the repository in Vercel
- Deploy (no environment variables needed for Gumroad mode)
| Variable | Description | Required |
|---|---|---|
NEXT_PUBLIC_PAYMENT_PROVIDER |
Payment provider: gumroad (default) or disabled |
No |
All other payment secrets (FONDY_*, SUPABASE_* for payments) are not used in Gumroad mode.
Note: Supabase variables (
SUPABASE_URL,SUPABASE_SERVICE_KEY) are only needed if you use the/verify/[hash]artifact lookup feature.
- User selects context (Career, Love, or Timing)
- Confirmation screen displays decision threshold
- Manifest animation plays during processing
- Engine calculates status based on current UTC minute
- Result displayed with unique artifact code
- User can seal decision via Gumroad checkout link
- User clicks "Seal This Moment"
- Browser opens Gumroad checkout in new tab
- User completes payment on Gumroad
- User returns to app
/api/seal and /api/webhook return 410 Gone in Gumroad canonical mode.
They are kept as stubs for future extensibility but require no secrets.
Format: ci-XX-XXXXX where X is a hexadecimal character.
Example: ci-7a-3f2e1
Generated using cryptographically secure random bytes.
Status is calculated deterministically:
index = (utcMinute + contextId) % 3
status = STATUSES[index]
This ensures:
- Same minute + context = same status
- Status changes every minute
- Predictable but not gameable (depends on exact timing)
Copyright Β© 2026. All rights reserved.
This project is proprietary software. The source code is available for reference and learning purposes only. Use of this code in production requires explicit permission from the repository owner.
This is a personal project. For collaboration inquiries or questions, please open an issue or contact the repository owner.
For issues or questions:
- Open an issue on GitHub
- Check the documentation in the
/docsfolder
- Analytics integration
- Email notifications
- Mobile app version
Built with β€οΈ using Next.js and Gumroad