A mobile-web platform for matching musicians for jam sessions & band practice
Helps amateur/hobby musicians in Korea find people to play with β hosting or joining jam sessions based on region, genre, and skill level.
JAMMING is a mobile-only (PWA) web service for amateur and hobbyist musicians in Korea. A host opens a jam session, other musicians apply with their instrument/position, and the host approves applicants β completing the match.
β οΈ This repository is public for portfolio purposes. No production infrastructure (Supabase instance, API keys, etc.) is included; all secrets are kept in environment variables.
| Feature | Description |
|---|---|
| π΅ Jam Session CRUD | Create/edit/delete sessions with date, venue, genre, skill level, per-position headcount, and a setlist |
| π Apply & Approve | Apply by position, host approval/rejection, and re-application (re-jam) flow |
| π Notifications | Alerts for apply/approve/reject events; open-chat link revealed on approval |
| πΊοΈ Region Filter | Browse and filter sessions across 19 regions |
| π Song & Venue Search | Integrations with ManiaDB (songs) and Naver Map (venues) |
| π€ Profile & My Page | Manage position, genre, skill level, tags, and playlist |
| π Kakao OAuth | Authentication via Kakao social login |
| Category | Technology |
|---|---|
| Framework | Next.js 16 (App Router, Server Actions) |
| Language | TypeScript |
| UI | React 19 RC Β· Tailwind CSS 4 Β· Framer Motion Β· MUI Β· Radix UI |
| State | Zustand Β· TanStack React Query 5 |
| Form / Validation | React Hook Form Β· Zod |
| Backend | Supabase (Auth Β· Postgres Β· Storage) |
| Infra | Vercel Β· Upstash Redis (rate limiting) |
| External APIs | ManiaDB (songs) Β· Naver Map (venues) Β· Kakao (OAuth) |
| Testing | Vitest Β· React Testing Library Β· Playwright Β· MSW |
- Mobile-first: fixed
375px ~ 600pxviewport with touch-optimized UI (bottom sheets, swipe gestures) - Server Actionsβbased CRUD: minimizes client bundle and handles data server-side
- Domain-oriented structure: per-page
functions/directories isolate data-access logic - Type safety: single source of truth between Zod schemas and TypeScript interfaces
- Test coverage: four layers β unit Β· integration Β· component Β· e2e
app/
βββ (pages)/
β βββ (signin)/ # Public area (login, sign-up)
β βββ (only-user)/ # Auth-required area (jam sessions, my page)
β βββ layout.tsx # Global providers
βββ api/ # Server Actions & Route Handlers
β βββ functions/ # CRUD server functions
β βββ maniadb/ Β· naver/ # External API proxies
β βββ auth/ # OAuth callback
βββ lib/ # enums, interfaces, zod schemas, utils
βββ stores/ # Zustand stores
βββ ui/ # design system, shared components
βββ util/supabase/ # Supabase client/server helpers
__tests__/ # unit Β· integration Β· component Β· e2e
docs/ # architecture Β· patterns Β· design Β· reference docs
- iOS Safari compatibility β the most heavily debugged area of the project: a dynamic
--vhCSS variable to handle the changing address-bar height, auto-zoom prevention (maximum-scale=1), and layout stabilization during keyboard input. - Server Actions for all mutations β CRUD runs server-side to keep the client bundle lean and secrets off the client.
- Rate limiting β Upstash Redis guards write-heavy endpoints against abuse.
- End-to-end type safety β Zod schemas double as runtime validators and the source of TypeScript types, eliminating drift between validation and types.
- Four-layer testing β unit, integration, component, and Playwright e2e, with external APIs mocked via MSW for deterministic runs.
- Node.js 20+
- pnpm (required β do not use npm/yarn)
- A Supabase project (Auth Β· DB Β· Storage)
# 1. Install dependencies
pnpm install
# 2. Configure environment variables (see .env.example)
cp .env.example .env
# β fill in real values in .env
# 3. Start the dev server (http://localhost:3038)
pnpm dev
NEXT_PUBLIC_SUPABASE_URLmust be set β it drives Supabase auth/storage and thenext/imageallow-list. If it's missing, Supabase-hosted images (e.g. profile photos) won't load.
| Command | Description |
|---|---|
pnpm dev |
Dev server (:3038) |
pnpm build |
Production build |
pnpm start |
Production server |
pnpm lint |
Run ESLint |
pnpm test |
Unit/integration tests (watch) |
pnpm test:run |
Run tests once |
pnpm test:coverage |
Coverage report |
pnpm test:e2e |
Playwright E2E tests |
Unit/integration/component tests run on Vitest, with end-to-end tests on Playwright. External API calls are mocked with MSW.
pnpm test:run # unit Β· integration Β· component
pnpm test:e2e # e2eDetailed design docs live in docs/.
| Doc | Contents |
|---|---|
| Context | Project overview Β· domain model |
| Architecture | System structure |
| Patterns | Code patterns |
| Design | Design system guide |
| Reference | API Β· schema reference |
Β© 2026 bswebdevlpr. All rights reserved. See LICENSE.
This repository is public for portfolio viewing only β reuse, copying, or redistribution of the code is not permitted.

