학습 기록 기반 경쟁 서비스 Clash의 Electron 데스크톱 클라이언트입니다.
- 프로젝트 개요
- 기술 스택
- 아키텍처
- 디렉토리 구조
- 시작하기
- 환경변수
- 주요 스크립트
- 개발 규칙
- 커밋 컨벤션
- Architecture: Electron + Renderer FSD
- License: AGPL-3.0-with-Commons-Clause
- 주요 기능:
- 학습/경쟁 데이터 시각화
- GitHub/Electron OAuth 딥링크 로그인
- Socket.IO 기반 실시간 기능
- IDE 사용시간 모니터링
- Electron 39
- React 19
- TypeScript
- react-router-dom 7
- React Query
- Zustand
- Axios
- Socket.IO
- react-hook-form
- zod
- styled-components
- Chart.js + react-chartjs-2
- electron-vite
- electron-builder
- ESLint + Prettier
Main Process (src/main)
└─ BrowserWindow, IPC, deep-link(clashapp://), AppMonitor
↓ IPC
Preload (src/preload)
└─ contextBridge로 window.api 노출
↓
Renderer (src/renderer/src)
└─ React + FSD + Router + React Query
src/main: 앱 생명주기/윈도우/IPC 핸들러 관리src/preload: Renderer에 안전한 브릿지 API 제공src/renderer/src: 화면 렌더링, 상태관리, API 호출
- 로그인:
- 개발: 앱 내부 로그인 폼에서 인증 요청
- 프로덕션: 외부 브라우저 인증 후
clashapp://딥링크로 앱 복귀
- AppMonitor:
- 2초 주기 체크
- 5분 비활성 시 세션 종료
src/
├── main/ # 윈도우, IPC, 딥링크, AppMonitor
├── preload/ # contextBridge API (window.api)
└── renderer/src/
├── app/ # 앱 초기화, 전역 Provider, 라우팅/레이아웃
├── pages/ # URL 기준 페이지 단위 화면 조합
├── widgets/ # 페이지에서 재사용되는 큰 UI 블록
├── features/ # 사용자 액션 중심 기능
├── entities/ # 도메인 모델과 도메인 API 단위
└── shared/ # 공통 UI, 유틸, 설정, API 인프라
- FSD 의존성 방향:
app -> pages -> widgets -> features -> entities -> shared - 하위 레이어는 상위 레이어를 import하지 않습니다.
- 코드 배치 기준:
- 특정 페이지에서만 쓰는 조합이면
pages - 여러 페이지에서 재사용되는 상호작용이면
features - 비즈니스 도메인 데이터/타입/API면
entities - 도메인과 무관한 범용 코드는
shared
- 특정 페이지에서만 쓰는 조합이면
pnpm install
pnpm dev개발 실행 시 apps/mac/.env.development를 사용하고, 프로덕션 빌드 시 apps/mac/.env.production를 사용합니다.
필수 키 목록은 apps/mac/.env.example을 기준으로 맞추면 됩니다.
개발 서버는 https://local.clash.kr:5173을 사용합니다.
필요 시 /etc/hosts에 아래를 추가하세요.
127.0.0.1 local.clash.kr
# 개발 서버 실행
pnpm dev
# 정적 검사
pnpm lint
pnpm typecheck
# 로컬 테스트 빌드
pnpm build- Renderer import는
@/alias 사용 (@/* -> src/renderer/src/*) - FSD 의존성 방향 유지:
app -> pages -> widgets -> features -> entities -> shared - 스타일은
styled-components+ theme token 우선 - API 호출은
src/renderer/src/shared/api/axios.ts인스턴스 사용 - 401 응답 기본 동작은
#/sign-in리다이렉트(인증 시작/교환 API 예외)
형식: {type}: {subject}
허용 type:
feat, fix, hotfix, docs, style, refactor, test, chore, revert, delete
마지막 업데이트: 2026-03-21