Novory is an image-first language learning product. It turns a photo into a useful study unit: concept extraction, multilingual cards, learning history, and a native iOS/iPadOS workflow backed by a web API.
Live App · Why · Preview · Quickstart · Release Readiness · Roadmap
Most language tools start with text.
Novory starts where memory is usually stronger: an image from real life. You take or upload a photo, the system detects the core concept, expands it into learning material, and saves the result into a study flow that can be revisited later.
This makes the product useful in ordinary moments:
- turn a street photo, menu, package, or object into a vocabulary entry
- build multilingual cards without manually assembling prompts
- keep history, streaks, and usage state in one place
- support both fast capture and richer follow-up enrichment
- Extracts a core object or concept from an image
- Generates multilingual study content for the detected concept
- Saves results into language-specific libraries and history
- Tracks usage, streaks, and subscription state
- Supports a native iOS/iPadOS client while the existing web stack is still being decomposed
- Live app: https://www.yulu34.top
- Main analyze flow: upload or capture an image, then review the generated learning card
- Typical output: concept, translations, study history, and library entries by target language
- App Store prep notes and submission checklist:
docs/app-store-prep.md - Privacy and permission copy reference:
docs/privacy-copy.md
The iOS target now reads release-facing values from ios/App/Config/*.xcconfig.
- Shared defaults:
ios/App/Config/App.shared.xcconfig - Debug overrides:
ios/App/Config/App.debug.xcconfig - Release overrides:
ios/App/Config/App.release.xcconfig
The fastest local CLI edits are now:
PRODUCT_BUNDLE_IDENTIFIERSNAPSHOT_API_BASE_URLSNAPSHOT_STOREKIT_PRODUCT_ID_MONTHLYSNAPSHOT_STOREKIT_PRODUCT_ID_YEARLYSNAPSHOT_STOREKIT_PRIMARY_PRODUCT_IDSNAPSHOT_STOREKIT_SUBSCRIPTION_GROUP_ID- Release-oriented environment template:
env.example
- Next.js 16 App Router for legacy web surfaces and API routes
- React 19
- Tailwind CSS 4
- Legacy web auth flows
- Framer Motion
- Native iOS shell under
ios/
- App Router API routes
- Neon Postgres
- Cloudflare R2
- Stripe subscriptions and webhooks for the web side, plus App Store billing foundations
- Sentry monitoring
- Resend transactional email hooks
- Gemini handles image understanding and fast concept extraction
- A text-generation endpoint enriches the result into fuller multilingual study content
- The workflow splits into a fast analyze path and a richer asynchronous enrichment path
app/ Legacy App Router pages and APIs pending native migration
components/ UI primitives and product surfaces
hooks/ Client hooks
lib/ services, billing, analytics, AI helpers, data access
public/ logos, preview assets, service worker
scripts/ database setup and migration scripts
tests/ Vitest coverage for billing, routes, validation
ios/ Native iOS shell in transition
npm installcp env.example .env.localFill values in env.example.
npm run db:setupnpm run devOpen http://localhost:3000.
GEMINI_API_KEY_POOL=
GEMINI_MODEL=gemini-2.5-flash-lite
TEXT_API_BASE_URL=
TEXT_API_KEY=
TEXT_MODEL=R2_ACCOUNT_ID=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_BUCKET_NAME=word-app-images
DATABASE_URL=
CDN_PUBLIC_BASE_URL=NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=
CLERK_SECRET_KEY=
NEXT_PUBLIC_APP_URL=https://www.yulu34.top
CAP_SERVER_URL=https://www.yulu34.topNEXT_PUBLIC_SUPPORT_EMAIL=support@example.com
NEXT_PUBLIC_PRIVACY_POLICY_URL=https://example.com/privacy
NEXT_PUBLIC_TERMS_URL=https://example.com/terms
NEXT_PUBLIC_APP_STORE_URL=https://apps.apple.com/app/id0000000000NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
STRIPE_SECRET_KEY=
STRIPE_PRICE_ID=
STRIPE_WEBHOOK_SECRET=
NEXT_PUBLIC_SENTRY_DSN=
SENTRY_DSN=
RESEND_API_KEY=
RESEND_FROM_EMAIL=npm run dev
npm run build
npm run start
npm run lint
npm run test
npm run db:setup
npm run db:migrateRecommended checks before shipping:
npm run lint
npx tsc --noEmit
npm run test
npm run buildNovory is deployed on Vercel for the web backend and distributed through Apple platforms for the native client.
- Import the repository into Vercel.
- Add the same environment variables used locally.
- Point the production domain to the Vercel project.
- Run
npm run db:setupagainst the target database. - Push to
mainfor production deployment. - For Apple release work, follow the checklist in
docs/app-store-prep.md.
- Improve the first-run onboarding flow for new learners
- Add clearer card review loops after image analysis
- Expand language support and enrichment quality controls
- Tighten mobile capture and install flows
- Publish more public product documentation and changelog notes

