Landed is a Next.js app for international students getting set up in the United States. It turns profile answers into a personalized roadmap with milestones, deadlines, tax guidance, and an in-app assistant.
- Signs users in with Supabase email OTP
- Saves profile answers and roadmap data to Supabase and local storage
- Builds a personalized roadmap for U.S. setup and F-1 style milestones
- Shows a chapter-style roadmap with completed, open, and locked steps
- Surfaces deadline cards and tax guidance when relevant
- Lets users open a step drawer for explanations, official links, and draft help
- Includes an in-app assistant for roadmap questions and next-step guidance
- Supports light mode and dark mode
Landed is currently focused on users getting set up in the United States.
It is built around:
- roadmap guidance
- profile-based milestone tracking
- deadline awareness
- tax reminders and guidance
- contextual assistant help
It does not currently handle filing or submitting forms.
- Next.js 14
- TypeScript
- Tailwind CSS
- Supabase Auth and storage
- Groq SDK for explanation and draft-generation APIs
- Lucide React icons
npm installcp .env.example .env.localFill in .env.local with your values:
GROQ_API_KEY=your_groq_api_key_here
NEXT_PUBLIC_SUPABASE_URL=https://your-project-ref.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_publishable_key_hereNotes:
- Use your Supabase project URL
- Use the client-safe Supabase publishable key
- Do not put a Supabase secret key in
.env.local
In Supabase:
- Create a project
- Enable email sign-in / OTP
- Set
Site URLtohttp://localhost:3000 - Add
http://localhost:3000to redirect URLs - Run the SQL in supabase-schema.sql in the SQL Editor
npm run devOpen http://localhost:3000.
For a production-like local test:
npm run build
npm run startnpm run dev
npm run build
npm run start
npm run lint- Sign in with an emailed 6-digit code
- Fill in or edit your saved profile
- Build your roadmap
- Move through milestone chapters on the dashboard
- Open any step for more detail and official links
- Ask the assistant for help understanding what to do next
landed/
├── app/
│ ├── page.tsx
│ ├── dashboard/page.tsx
│ └── api/
│ ├── chat-assistant/
│ ├── generate-plan/
│ ├── explain-step/
│ └── draft-message/
├── components/
│ ├── ChatAssistant.tsx
│ ├── DeadlineCard.tsx
│ ├── ProfileEditorDialog.tsx
│ ├── RoadmapNode.tsx
│ ├── RoadmapSection.tsx
│ ├── StepDrawer.tsx
│ ├── ThemeScript.tsx
│ └── ThemeToggle.tsx
├── data/
│ └── f1-steps.json
├── lib/
│ ├── deadlines.ts
│ ├── roadmap-storage.ts
│ ├── supabase.ts
│ ├── tax.ts
│ └── types.ts
└── supabase-schema.sql
- Roadmap generation is deterministic in the API route
- Saved profile answers affect which steps are done, open now, or blocked
- OPT timing uses graduation date
- ITIN should not appear when the user already has an SSN
- Tax suggestions depend on whether the user was in the U.S. during the last tax year and whether they had U.S. income
This app deploys well on Vercel.
Typical deployment flow:
- Push to GitHub
- Import the repo into Vercel
- Add the same environment variables in Vercel project settings
- Add your Vercel URL to Supabase Auth redirect URLs
- Push to
mainfor automatic production redeploys
Wait before requesting another OTP code. Repeated local testing can hit Supabase auth email rate limits quickly.
Clear the local Next build cache and restart:
rm -rf .next
npm run devnext dev is slower because it recompiles and does extra development checks. Use npm run build && npm run start to test production-like performance.
See .env.example.