Landing page for tabby, the on-device AI autocomplete for macOS.

Built by @FuJacob and @jam-cai
- Next.js 16 with the App Router
- React 19
- TypeScript
- Tailwind CSS 4
- Framer Motion for page motion and interaction details
- Supabase for mailing list collection
- Vercel Analytics
frontend/
app/
components/ Reusable landing-page sections and UI primitives
lib/site.ts Site-wide URLs, support email, and creator metadata
lib/supabase.ts Supabase client
privacy/ Privacy policy route
release-notes/ Release notes route
terms/ Terms route
page.tsx Home page composition
public/ Icons, app logos, and static media
.env.example Environment variable template
package.json Scripts and dependencies
The home page is composed from section components in frontend/app/components/. Each section owns its copy, layout, and motion behavior.
cd frontend
cp .env.example .env.local # fill in your keys
npm install
npm run devOpen http://localhost:3000.
Copy .env.example to .env.local and fill in the values:
| Variable | Description |
|---|---|
GITHUB_TOKEN |
GitHub PAT for star count fetching |
NEXT_PUBLIC_SUPABASE_URL |
Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase anon/public key |
SUPABASE_SERVICE_ROLE_KEY |
Supabase service role key (server-side only) |
Run these from frontend/:
npm run dev # Start the local development server
npm run lint # Run ESLint
npm run build # Build the production site
npm run start # Serve the production build locallyGlobal links and metadata live in frontend/app/lib/site.ts. Update that file when the landing page needs a new canonical site URL, GitHub link, release-download URL, support email, or creator profile.
The app is a standard Next.js site deployed on Vercel. Before shipping:
cd frontend
npm run lint
npm run buildAGPL-3.0 — see LICENSE for details.
