Full-stack sneaker e-commerce platform built with Node.js, Express, PostgreSQL, and React.
iKicks is a full-stack sneaker store where users can browse, filter, and purchase sneakers with a seamless checkout experience. Built with a focus on clean architecture, relational data modeling, and secure authentication.
What users can do:
- Browse and filter sneakers by brand, size, colorway, and category
- View product details with multiple images
- Add items to cart by size
- Checkout securely via Stripe
- Save addresses and track orders
- Wishlist products for later
What admins can do:
- Add, update, and delete products
- Manage inventory per size
- View and manage all orders
- Access a protected admin dashboard
- JWT authentication (register, login, role-based access)
- Admin middleware β role verified from token, not request body
- PostgreSQL schema β 11 tables, fully normalized
- Cart logic β add, update, remove items by size
- Order placement with database transactions
- Price snapshot on cart and order items
- Shipping address management
- Wishlist
- React frontend
- Stripe payment integration
- Product image upload (Cloudinary)
- Admin dashboard UI
- Search and filtering
- Order history page
- Email notifications
- Analytics dashboard
| Layer | Technology |
|---|---|
| Frontend | React, React Router, Axios, TailwindCSS |
| Backend | Node.js, Express.js |
| Database | PostgreSQL (hosted on Neon) |
| Auth | JWT + bcrypt |
| Payments | Stripe |
| Media | Cloudinary |
| Dev Tools | Postman, draw.io, dbdiagram.io |
iKicks uses a fully normalized PostgreSQL schema with 11 tables.
Key design decisions:
- Snapshot pattern β prices stored at time of cart add and purchase
- Weak entity β
product_sizedepends onproducts - Role enforcement via JWT payload, not request body
- Database transactions for order placement
π See /docs/erd/README.md for full schema documentation and diagrams.
Base URL: http://localhost:3000/api
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| POST | /auth/register |
β | Create account |
| POST | /auth/login |
β | Login, receive JWT |
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| GET | /products |
β | Get all products |
| GET | /products/:id |
β | Get product by ID |
| POST | /products |
π Admin | Add a product |
| PUT | /products/:id |
π Admin | Update product |
| DELETE | /products/:id |
π Admin | Delete product |
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| GET | /cart |
β | Get user's cart |
| POST | /cart |
β | Add item to cart |
| PUT | /cart/:id |
β | Update item quantity |
| DELETE | /cart/:id |
β | Remove item |
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| POST | /orders |
β | Place an order |
| GET | /orders |
β | Get user's orders |
| GET | /admin/orders |
π Admin | Get all orders |
ikicks/
β
βββ client/ # React frontend
β βββ src/
β β βββ components/
β β βββ pages/
β β βββ hooks/
β β βββ utils/
β βββ package.json
β
βββ server/ # Express backend
β βββ controllers/ # Route logic
β βββ middleware/ # auth, admin, error handler
β βββ routes/ # Express routers
β βββ db/ # Pool config + schema SQL
β βββ utils/ # Regex validators, helpers
β βββ .env # Environment variables (gitignored)
β βββ .env.example
β βββ index.js
β
βββ docs/
β βββ erd/ # ERD diagrams + README
β βββ api/ # API documentation
β βββ screenshots/ # App screenshots
β
βββ .gitignore
βββ README.md
βββ package.json- Node.js v18+
- PostgreSQL or a Neon account
git clone https://github.com/yourusername/ikicks.git
cd ikickscd server
cp .env.example .envFill in your .env:
PORT=3000
DBURL=your_neon_connection_string
JWT_SECRET=your_secret_key
STRIPE_SECRET_KEY=your_stripe_keypsql -U postgres -f ./server/db/schema.sql# Backend
cd server && npm install && npm run dev
# Frontend (separate terminal)
cd client && npm install && npm run dev| Variable | Description |
|---|---|
PORT |
Server port (default 3000) |
DBURL |
PostgreSQL connection string |
JWT_SECRET |
Secret key for signing tokens |
STRIPE_SECRET_KEY |
Stripe secret key |
CLOUDINARY_URL |
Cloudinary media URL |
Jose Calderon
- GitHub: @yourusername
- LinkedIn: linkedin.com/in/yourprofile
Built as part of a summer full-stack development sprint β May 2026






