<p align="center">
<img src="https://raw.githubusercontent.com/HydroRoll-Team/DropOut/HEAD/assets/image.png" alt="DropOut 런처 인터페이스" width="700">
</p>
<h1 align="center">DropOut</h1>
<p align="center">
<em>재현 가능하고 검사 가능한 게임 환경을 위한 결정론적(deterministic) 마인크래프트 런처입니다.</em>
</p>
<p align="center">
<a href="https://github.com/HydroRoll-Team/DropOut"><img src="https://img.shields.io/github/stars/HydroRoll-Team/DropOut?logo=github" alt="GitHub 스타"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-AGPL--3.0-65a30d?style=flat" alt="AGPL-3.0 라이선스"></a>
<a href="https://github.com/HydroRoll-Team/DropOut/releases"><img src="https://img.shields.io/github/v/release/HydroRoll-Team/DropOut?display_name=tag&sort=semver" alt="최신 릴리스"></a>
<a href="https://github.com/HydroRoll-Team/DropOut/actions/workflows/test.yml"><img src="https://github.com/HydroRoll-Team/DropOut/actions/workflows/test.yml/badge.svg" alt="테스트 및 빌드"></a>
<a href="https://github.com/HydroRoll-Team/DropOut/actions/workflows/codeql.yml"><img src="https://github.com/HydroRoll-Team/DropOut/actions/workflows/codeql.yml/badge.svg?branch=main" alt="CodeQL"></a>
<a href="https://github.com/HydroRoll-Team/DropOut/actions/workflows/semifold-ci.yaml"><img src="https://github.com/HydroRoll-Team/DropOut/actions/workflows/semifold-ci.yaml/badge.svg" alt="Semifold CI"></a>
<br>
<img src="https://img.shields.io/badge/Tauri_2-000?style=flat&logo=tauri" alt="Tauri 2">
<img src="https://img.shields.io/badge/Rust-000?style=flat&logo=rust" alt="Rust">
<img src="https://img.shields.io/badge/React_19-000?style=flat&logo=react" alt="React 19">
<img src="https://img.shields.io/badge/Tailwind_CSS_4-000?style=flat&logo=tailwindcss" alt="Tailwind CSS 4">
<img src="https://img.shields.io/badge/TypeScript-000?style=flat&logo=typescript" alt="TypeScript">
<img src="https://img.shields.io/badge/pnpm_10-000?style=flat&logo=pnpm" alt="pnpm 10">
</p>
<p align="center">
<b>English</b> | <a href="README.CN.md">Chinese</a>
</p>
무엇인가요 (What Is This)
<b>DropOut</b>은 하나의 아이디어를 중심으로 구축된 현대적이고 개발자 수준의 마인크래프트 런처입니다: 게임 설정이 소프트웨어 프로젝트처럼 추적 가능해야 한다는 것입니다.
대부분의 런처는 게임 시작에 초점을 맞춥니다. DropOut은 주변 환경(계정 상태, Java 런타임, 게임 버전, 로더, 인스턴스 디렉토리, 에셋, 라이브러리 및 실행 로그) 또한 이해할 수 있도록 유지합니다.
마인크래프트 환경은 복잡한 시스템입니다. DropOut은 이를 버전 관리되는 작업 공간(versioned workspaces)으로 취급합니다.
프로젝트 구조 (Project Shape)
DropOut은 세 가지 활성 표면을 가진 데스크톱 애플리케이션입니다:
| Surface | Path | Stack | Purpose |
|---|
| Desktop shell | src-tauri/ | Rust, Tauri 2 | 인증(Authentication), 다운로드, Java/버전 해결, 인스턴스 저장소, 실행 오케스트레이션(launch orchestration) |
| ... | | | |
Rust 코어는 부작용(side effects)을 담당합니다. React UI는 Tauri 명령을 호출하고 상태를 렌더링합니다. docs 패키지는 제품, 아키텍처 및 사용자 워크플로우를 설명합니다.
기능 (Features)
- 마이크로소프트 인증(Microsoft authentication) - 디바이스 코드 OAuth 플로우(device-code OAuth flow), Minecraft Services 로그인, 토큰 새로고침, 및 영구 계정 상태 유지 기능.
- 오프라인 계정(Offline accounts) - 테스트 또는 비네트워크 플레이를 위한 로컬 계정 지원.
- 실행 명령 센터(Launch command center) - 로그인, 복구, 다운로드, 실행, 중지, 실패 복구를 위한 단일 상태 기반 액션으로, 실제 준비 상태 확인 기능이 백업됨.
- 인스턴스 라이브러리(Instance library) - 검색 및 정렬 가능한 그리드/목록 보기, 점진적 준비 상태 표시, 활성 인스턴스 상세 정보, 보호된 관리 액션 제공.
- 인스턴스 시스템(Instance system) - 인스턴스별 노트, 메모리 및 Java 오버라이드가 적용되는 격리된 게임 디렉토리, 버전, 로더, 모드, 저장 파일, 마이그레이션 진입점 포함.
- 자동 메모리(Automatic memory) - 실시간 RAM 및 모드 개수 인식 히프 크기 조정, 보호 시스템 헤드룸, 실행 압력 확인, 인스턴스별 오버라이드 지원.
- 마인크래프트 버전 관리(Minecraft version management) - 로컬 버전 설치, 검증, 목록화, 삭제 및 실행 기능.
- Fabric 및 Forge 지원(Fabric and Forge support) - 모드 인스턴스를 위한 로더 버전 검색 및 설치 흐름 제공.
- Java 관리(Java management) - 로컬 Java 감지, 호환성 확인, Adoptium 카탈로그 조회, 다운로드, 재개 및 취소 기능.
- 동시 다운로드(Concurrent downloads) - 진행 상황 이벤트와 복구 경로가 있는 에셋/라이브러리 큐 지원.
- 구성 편집기(Configuration editor) - 로컬에 번들된 Monaco를 사용하여 런처 JSON을 편집하며, 스키마 진단, 서식 지정, 키보드 저장 및 폐기 보호 기능을 제공.
- 릴리스 피드(Release feed) - GitHub 릴리스 노트가 홈 화면에 표시됨.
- 게임 어시스턴트(Game assistant) - 로그, 충돌 및 구성 질문을 위한 선택적 로컬 또는 OpenAI 호환 도우미 기능.
설치(Install)
사전 구축된 DropOut 번들은 릴리스 페이지에서 게시됩니다. 런처를 실행하는 데 Rust나 Node.js가 필요하지 않으며, 해당 기술은 개발 빌드에만 필요합니다.
| 플랫폼 | 아키텍처 | 다운로드 | 설치 |
|---|
| Windows 10/11 | x86_64, ARM64 | NSIS -setup.exe | 설치 프로그램을 실행한 다음, 시작 메뉴에서 DropOut을 실행합니다. |
| ... | | | |
에셋 이름에는 버전과 아키텍처가 포함되어 있습니다. 예를 들어 Dropout_0.2.0-rc.2_amd64.AppImage와 같습니다. 사용하려는 OS와 CPU 접미사(x64/amd64/x86_64 또는 arm64/aarch64)에 맞는 파일을 선택하세요. | | | |
모든 데스크톱 에셋에는 서명된 GitHub 빌드 출처(provenance)가 포함되어 있으므로, 설치하기 전에 이 리포지토리의 릴리스 워크플로우에서 왔는지 확인할 수 있습니다:
gh attestation verify ./downloaded-asset -R HydroRoll-Team/DropOut
Alpine Linux는 musl 아카이브가 시작되기 전에 네이티브 WebKitGTK 라이브러리가 필요합니다:
sudo apk add ca-certificates gtk+3.0 libayatana-appindicator librsvg openssl webkit2gtk-4.1
sha256sum -c Dropout_*-musl.tar.gz.sha256 &&
tar -xzf Dropout_*-musl.tar.gz &&
...
musl 아카이브는 Alpine 패키지에 동적으로 연결되어 있습니다. glibc 배포판에서는 대신 AppImage, .deb, 또는 .rpm을 사용하세요. 직접 번들을 구축하려면 데스크톱 릴리스 빌드를 참조하세요.
단계별 설치 지침, 첫 실행 가이드 및 문제 해결 방법은 문서에 있습니다: English · 简体中文.
빠른 시작 (Quick Start)
필수 조건 (Prerequisites)
의존성 설치 (Install Dependencies)
이 리포지토리는 pnpm-workspace.yaml을 사용하지 않습니다. 각 JavaScript 서피스(surface)를 루트 잠금 파일(root lockfile)에 대해 설치하세요:
pnpm install
pnpm -C packages/ui --lockfile-dir "$PWD" install
pnpm -C packages/docs --lockfile-dir "$PWD" install
pnpm install은 또한 리포지토리의 prepare 스크립트를 실행하여 로컬 prek 후크를 설치합니다.
데스크톱 앱 실행 (Run The Desktop App)
Tauri는 src-tauri/tauri.conf.json을 통해 React UI 개발 서버를 시작하고, http://localhost:1420에서 데스크톱 창을 엽니다.
데스크톱 릴리스 빌드하기
릴리스 아티팩트는 Tauri에 의해 Rust 타겟 디렉토리와 구성된 번들 디렉토리 아래에서 생성됩니다.
패키지 서피스 직접 실행하기
pnpm -C packages/ui dev
pnpm -C packages/docs dev
UI는 레이아웃 작업을 위해 브라우저에서 실행될 수 있지만, Tauri 기반 플로우(flow)는 데스크톱 셸(shell)을 필요로 합니다. 반복 가능한 브라우저 전용 UI 작업의 경우, packages/ui/README.md에 문서화된 개발 피처(fixtures) 및 Playwright 워크플로우를 사용하십시오.
공통 명령어
| 태스크 | 명령어 |
|---|
| 루트 툴링 설치 | pnpm install |
| ... | |
배포 유지 관리는 docs/cloudflare-deployment.md에 문서화되어 있습니다.
리포지토리 레이아웃
.
|-- assets/ # README 및 프로젝트 미디어
|-- crates/ # Rust 지원 크레이트 및 매크로
...
아키텍처 참고 사항
명령어 경계(command boundary)는 src-tauri/src/main.rs에 등록되어 있습니다. 기능 모듈은 src-tauri/src/core/ 아래에 존재합니다:
auth.rs와 account_storage.rs: Microsoft 및 오프라인 계정 상태를 처리합니다.
instance.rs: 격리된 인스턴스 디렉토리와 메타데이터를 소유합니다.
game_version.rs, manifest.rs, migration.rs: Minecraft 버전을 확인하고 실행 규칙을 결정합니다.
fabric.rs, forge.rs, maven.rs, downloader.rs: 로더, 라이브러리, 에셋 및 버전 파일을 설치합니다.
java/: 호환 가능한 Java 런타임을 감지, 검증 및 영구 저장합니다.
modpack/, mods.rs, content_search.rs: 모드팩 파싱, 모드 메타데이터, 콘텐츠 검색을 처리합니다.
assistant.rs: 선택적 문제 해결 어시스턴트(troubleshooting assistant)를 구동합니다.
UI는 packages/ui/src/models/에 장기 상태(long-lived state)를 유지하고, packages/ui/src/pages/에서 라우트를 렌더링하며, packages/ui/src/components/에서 재사용 가능한 컨트롤을 공유합니다.
로드맵
공개 로드맵은 https://roadmap.sh/r/minecraft-launcher-dev에서 확인할 수 있습니다.
기여 (Contributing)
DropOut은 장기적인 유지보수성을 염두에 두고 구축되었습니다. 유용한 기여는 보통 다음 영역 중 하나를 개선합니다:
- 인스턴스 및 프로필 워크플로우(instance and profile workflows)
- 모드 로더 호환성(mod loader compatibility)
- Java/런타임 감지(Java/runtime detection)
- 다운로더 신뢰성(downloader reliability)
- UI/UX 명확성(UI/UX clarity)
- 문서화 및 문제 해결 범위(documentation and troubleshooting coverage)
표준 GitHub 흐름을 사용하세요: 포크(fork), 브랜치(branch), 커밋(commit) 후 HydroRoll-Team/DropOut에 풀 리퀘스트(pull request)를 열어주세요.
UI 기여자들은 또한 fixture 및 회귀 테스트 가이드를 읽어야 합니다.
라이선스 (License)
AGPL-3.0
GNU Affero General Public License v3.0에 따라 배포됩니다. 자세한 내용은 LICENSE를 참조하세요.