Professional bike travel case rental service in Hamilton, ON. Built with Next.js 14, TypeScript, Material UI, Stripe, and Neon Postgres.
npm installCopy .env.example to .env.local and fill in your values:
cp .env.example .env.localRequired environment variables:
DATABASE_URL: Neon Postgres connection stringSTRIPE_SECRET_KEY: Your Stripe secret keyNEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: Your Stripe publishable keySTRIPE_WEBHOOK_SECRET: Stripe webhook endpoint secretNEXT_PUBLIC_BASE_URL: Your app URL (http://localhost:3000 for development)
Optional:
RESEND_API_KEY: For sending confirmation emailsADMIN_SECRET_KEY: For accessing the admin dashboard
- Create a Neon Postgres database at neon.tech
- Add the connection string to
.env.local - Push the schema to your database:
npm run db:push- Create a Stripe account at stripe.com
- Get your API keys from the Stripe Dashboard
- Set up a webhook endpoint:
- URL:
https://yourdomain.com/api/webhook/stripe - Events to listen for:
checkout.session.completedcheckout.session.expired
- URL:
- Add the webhook signing secret to
.env.local
npm run devOpen http://localhost:3000 to view the app.
- Push your code to GitHub
- Import the project in Vercel
- Add all environment variables in Vercel dashboard
- Deploy
- Update
NEXT_PUBLIC_BASE_URLto your production URL - Update Stripe webhook URL to production endpoint
- Test the complete booking flow
- Homepage with Tommy's story and bike box information
- Availability calendar with date picker
- Stripe Checkout integration for secure payments
- Booking confirmation page and email
- FAQ page with detailed specifications
- Admin dashboard for viewing bookings
- Mobile-responsive design
- View database:
npm run db:studio - Generate migrations:
npm run db:generate - Push schema changes:
npm run db:push
For issues or questions, contact: rummel.markus@gmail.com