A high-performance, mobile-first e-commerce application built with React, designed as a reusable skeleton for quick rebranding. Perfect for bike shops, accessory stores, and similar retail businesses.
To update pricing plans, edit one file: client/src/commerce/pricing.config.ts
export const PRICING = {
currency: "USD", // Change currency
tiers: [
{
id: "starter",
label: "Starter",
priceMonthly: 20, // Change price
features: ["Basic site", "Email support", "1 brand"] // Modify features
}
// Add/remove/modify tiers as needed
],
note: "7-day free trial available" // Optional note
};Example Pricing Plans:
| Plan | Monthly Price | Features |
|---|---|---|
| Starter | $20 | Basic site, Email support, 1 brand |
| Solo Hustler | $50 | Pro site, Priority support, 3 brands |
| Dealer Pro | $200 | Advanced e-com, VIP support, Unlimited brands |
To change currency from USD to EUR:
- Update
currency: "EUR" - Adjust prices accordingly
- No code changes needed - automatically renders
Add blog posts as markdown files in client/src/content/posts/:
---
title: "Your Post Title"
slug: "your-post-slug"
date: "2025-08-01"
excerpt: "Brief description of your post"
tags: ["tag1", "tag2"]
---
# Your Post Content
Write your blog post content here using markdown.Blog System Behavior:
- Prefers markdown: If
.mdfiles exist inclient/src/content/posts/, shows them - Database fallback: If no markdown files, shows database posts
- Graceful empty: If both empty, shows "No posts yet" message
Adding Images:
- Place images in
client/public/images/blog/ - Reference in markdown:

- Mobile-First Design - Optimized for all devices with responsive layouts
- Complete E-commerce - Product catalog, shopping cart, Stripe checkout
- Blog System - Built-in blog with categories and content management
- Easy Rebranding - Single configuration file for complete theme customization
- SEO Optimized - Meta tags, OpenGraph, structured data ready
- Modern Stack - React 18, TypeScript, Tailwind CSS, PostgreSQL
- Payment Ready - Stripe integration with test and live modes
- Contact Forms - Lead capture with database storage
stonee-bikes/
βββ client/src/
β βββ components/
β β βββ ui/ # Reusable UI components (buttons, inputs, etc.)
β β βββ Layout.tsx # Main layout wrapper
β β βββ Header.tsx # Navigation header
β β βββ Footer.tsx # Site footer
β β βββ ProductCard.tsx # Product display component
β β βββ CartDrawer.tsx # Shopping cart sidebar
β βββ pages/
β β βββ Home.tsx # Homepage with hero, featured products
β β βββ Shop.tsx # Product catalog with filters
β β βββ Accessories.tsx # Accessories page
β β βββ Cart.tsx # Shopping cart page
β β βββ Checkout.tsx # Stripe checkout flow
β β βββ Blog.tsx # Blog listing
β β βββ About.tsx # About us page
β β βββ Contact.tsx # Contact form
β βββ contexts/
β β βββ CartContext.tsx # Shopping cart state management
β β βββ ThemeContext.tsx # Theme configuration provider
β βββ styles/
β β βββ theme.config.ts # π¨ MAIN THEME CONFIG FILE
β βββ App.tsx # Main app with routing
βββ server/
β βββ db.ts # Database connection
β βββ routes.ts # API routes
β βββ storage.ts # Database operations
β βββ index.ts # Server entry point
βββ shared/
β βββ schema.ts # Database schema & types
βββ README.md
1. Edit the Theme Configuration
Open client/src/styles/theme.config.ts and customize:
export const defaultTheme: ThemeConfig = {
brandName: "Your Brand Name",
logo: {
text: "Your Logo Text",
imageUrl: "/path/to/your/logo.png", // Optional logo image
},
colors: {
primary: "#YOUR_PRIMARY_COLOR", // Main brand color
secondary: "#YOUR_SECONDARY_COLOR", // Accent color
accent: "#YOUR_ACCENT_COLOR", // Call-to-action color
muted: "#YOUR_MUTED_COLOR", // Text muted color
background: "#FFFFFF", // Background color
foreground: "#000000", // Text color
},
fonts: {
sans: "Your Font, system-ui, sans-serif",
serif: "Your Serif Font, serif",
mono: "Your Mono Font, monospace",
},
contact: {
phone: "Your Phone Number",
email: "your@email.com",
address: "Your Business Address",
},
social: {
facebook: "https://facebook.com/yourbrand",
twitter: "https://twitter.com/yourbrand",
instagram: "https://instagram.com/yourbrand",
},
};2. Replace Images & Content
- Add your product images to the database via seed endpoints
- Update hero section images in
client/src/pages/Home.tsx - Replace placeholder images with your brand assets
3. Update Content
- Modify the About page story in
client/src/pages/About.tsx - Update blog posts via the seeding endpoint
- Customize product descriptions in the database
Custom CSS Variables The theme automatically generates CSS variables from your config:
--primaryβ Your primary color--secondaryβ Your secondary color--brand-fontβ Your chosen font
Typography & Layout
Edit client/src/index.css for:
- Custom font loading
- Additional color variants
- Responsive breakpoints
- Animation preferences
- Node.js 18+
- PostgreSQL database (optional - has fallbacks)
- Stripe account (optional - demo mode available)
- Supabase account (optional - has fallbacks)
1. Clone and Install
git clone <your-repo>
cd stonee-bikes
npm install2. Environment Setup
Create your environment variables in Replit Secrets or .env.local:
# Database (PostgreSQL)
DATABASE_URL=your_postgresql_connection_string
# Stripe Keys (get from https://dashboard.stripe.com/apikeys)
VITE_STRIPE_PUBLIC_KEY=pk_test_your_stripe_publishable_key
STRIPE_SECRET_KEY=sk_test_your_stripe_secret_key
# Supabase - CLIENT (safe for browser)
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your_anon_public_key
# Supabase - SERVER (never expose to client)
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your_service_role_secret_key
# App Configuration
WEBSITE_ID=2
PAYMENTS_ENABLED=false3. Database Setup (PostgreSQL)
# Push schema to database
npm run db:push
# Seed with sample data
curl -X POST http://localhost:5000/api/seed/categories
curl -X POST http://localhost:5000/api/seed/products
curl -X POST http://localhost:5000/api/seed/blog4. Start Development
npm run devVisit http://localhost:5000 to see your store!
The app uses intelligent fallbacks for lead capture:
- Supabase (preferred) - Centralized across all brands
- PostgreSQL (fallback) - Local database storage
- Mock (fallback) - Demo mode for development
1. Create Supabase Project
- Go to supabase.com
- Create new project
- Note your project URL and keys
2. Run SQL Schema In Supabase SQL Editor, execute:
-- Multi-brand lead management
create table if not exists public.websites (
id bigint generated always as identity primary key,
name text not null,
domain text,
created_at timestamptz default now()
);
create table if not exists public.leads (
id bigint generated always as identity primary key,
website_id bigint not null references public.websites(id),
name text,
email text,
phone text,
message text,
created_at timestamptz default now()
);
-- Simple RLS for now
alter table public.leads enable row level security;
create policy "service role full access" on public.leads
for all using (true) with check (true);
-- Seed websites
insert into public.websites (id, name, domain) values
(1, 'Her Cookie Shop', 'hercookieshop.com'),
(2, 'Stonee Bikes', 'stoneebikes.com'),
(3, 'Prestigious Paths', 'prestigiouspaths.com')
on conflict (id) do nothing;3. Configure Environment Variables
# Get these from Supabase Project Settings > API
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your_anon_public_key
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your_service_role_secret_key
# Set your brand ID (2 = Stonee Bikes)
WEBSITE_ID=2SECURITY: Service role key is server-only. Never expose to client code.
| Scenario | Leads Storage | Behavior |
|---|---|---|
| All configured | Supabase | β Production ready |
| No Supabase | PostgreSQL | β Works locally |
| No databases | Mock mode |
The app gracefully handles missing services:
- Missing Supabase β Falls back to PostgreSQL
- Missing PostgreSQL β Uses mock responses
- Missing Stripe β Shows demo mode UI
- β Store functions fully
- β Checkout shows "Demo Mode" message
- π Perfect for client demos and development
- β Full Stripe integration
- π³ Use test card:
4242 4242 4242 4242 - π Requires STRIPE_SECRET_KEY + VITE_STRIPE_PUBLIC_KEY
# Enable payments
PAYMENTS_ENABLED=true
VITE_STRIPE_PUBLIC_KEY=pk_test_...
STRIPE_SECRET_KEY=sk_test_...Each brand gets a unique WEBSITE_ID:
1= Her Cookie Shop2= Stonee Bikes (default)3= Prestigious Paths
All leads are captured in one Supabase database with website_id for filtering. Perfect for managing multiple brands from one dashboard.
# Deploy Her Cookie Shop
WEBSITE_ID=1
# ... configure theme.config.ts for cookie theme
# Deploy Stonee Bikes
WEBSITE_ID=2
# ... configure theme.config.ts for bike theme- Persistent localStorage cart
- Add/remove/update quantities
- Real-time total calculation
- Mobile-optimized drawer interface
- Stripe Elements integration
- Secure card processing
- Order confirmation flow
- Test mode ready
- Category-based organization
- Featured products system
- Image optimization
- Inventory tracking
- SEO-friendly URLs
- Category organization
- Published/draft states
- Featured post support
- Responsive image handling
- Touch-friendly navigation and buttons
- Responsive images with proper sizing
- Fast loading with optimized assets
- Offline-ready cart persistence
- PWA-ready architecture
- Meta tags on all pages
- OpenGraph social sharing
- Structured data for products
- Semantic HTML structure
- Fast loading scores
npm run dev # Start development server
npm run build # Build for production
npm run db:push # Push schema changes
npm run db:studio # Database admin interfaceGET /api/products- List all productsGET /api/products/featured- Featured productsGET /api/categories- Product categoriesGET /api/blog- Published blog postsPOST /api/contact- Contact form submissionPOST /api/create-payment-intent- Stripe checkout
- Connect your Git repository
- Set environment variables in Vercel dashboard
- Deploy automatically on push
- Build the project:
npm run build - Set production environment variables
- Deploy to your hosting platform
To migrate this React app to Next.js:
- Install Next.js:
npm install next react react-dom - Move pages: Convert
client/src/pages/*to Next.js pages directory - Update routing: Replace Wouter with Next.js router
- API routes: Move
server/routes.tsendpoints to Next.js API routes - Static assets: Move to Next.js
publicdirectory - Configuration: Update build scripts and configuration files
The component structure and theme system will work seamlessly with Next.js with minimal changes.
MIT License - Perfect for commercial use and rebranding.
- Fork the repository
- Create your feature branch
- Commit your changes
- Push and create a Pull Request
Ready to launch your bike store? This skeleton provides everything you need to start selling online in minutes, not weeks.# Auto-deploy test