Orbis: Rust와 React를 사용한 플러그인 기반 데스크톱 플랫폼 구축
Source: Dev.to
기존 플러그인 시스템의 고통
- 익숙하지 않은 환경 – 모든 플랫폼마다 고유한 API, 특이점, 제한 사항이 있습니다.
- UI는 어렵다 – 제한된 UI 기본 요소만 제공되거나 또 다른 프레임워크를 배워야 합니다.
- 보안은 사후 고려사항 – 대부분의 플러그인 시스템은 플러그인 코드를 암묵적으로 신뢰합니다.
- 상태 관리가 엉망이 된다 – 플러그인 상태와 호스트‑애플리케이션 상태를 조정하는 것이 악몽입니다.
나는 이러한 모든 문제를 성능을 희생하지 않고 해결하고 싶었고, 답은 Rust였습니다.
급진적인 아이디어: 플러그인은 React 코드가 아니라 JSON 스키마를 제공합니다
{
"type": "Container",
"children": [
{
"type": "Heading",
"level": 1,
"text": "Hello, {{state.username}}!"
},
{
"type": "Button",
"label": "Count: {{state.clicks}}",
"events": {
"onClick": [
{
"type": "updateState",
"path": "clicks",
"value": "{{state.clicks + 1}}"
}
]
}
}
]
}
그게 전부입니다. JSX도, 번들러도, 프레임워크 락인도 없습니다. Orbis 코어가 이 스키마를 해석해 shadcn/ui를 사용해 프로덕션 수준의 React 컴포넌트를 렌더링합니다.
제어된 액션 시스템
플러그인은 임의의 JavaScript를 제공할 수 없기 때문에 임의의 JavaScript를 실행할 수도 없습니다. 모든 상호작용은 제어된 액션 시스템을 통해 이루어집니다:
- API 호출이 필요합니까?
call_api액션을 사용하세요. - 페이지 이동이 필요합니까?
navigate액션을 사용하세요.
코어는 실행 전에 모든 액션을 검증합니다.
일관되고 네이티브한 UI
모든 플러그인은 동일한 컴포넌트 라이브러리를 통해 렌더링되므로 UI 불일치(예: 한 플러그인은 Material Design을 사용하고 다른 플러그인은 Bootstrap을 사용하는 경우) 문제가 사라집니다.
플러그인을 만들기 위해 프론트엔드 개발자가 될 필요는 없습니다.
JSON(또는 향후 우리의 커스텀 DSL)을 작성할 수 있다면 UI를 만들 수 있습니다.
계층형 아키텍처
┌─────────────────────────────────────────────────┐
│ User Interface │
│ (Plugin Pages & UI) │
├─────────────────────────────────────────────────┤
│ Frontend Layer │
│ Schema Renderer │ Zustand State │ Actions │
├─────────────────────────────────────────────────┤
│ Backend Layer │
│ Tauri Commands │ Plugin Runtime │ Auth │
├─────────────────────────────────────────────────┤
│ Plugin System │
│ WASM Sandbox │ Manifests │ UI Schemas │
├─────────────────────────────────────────────────┤
│ Storage Layer │
│ SQLite │ PostgreSQL │
└─────────────────────────────────────────────────┘
프론트엔드
- React 로 구축되었습니다.
- 상태 관리를 위해 Zustand 를 사용합니다.
- 플러그인 페이지당 격리된 상태 – 전역 상태 오염이 없습니다.
// Simplified: each page gets its own isolated state store
const pageStore = createPageStateStore({
username: "Guest",
clicks: 0
});
백엔드
- 데스크톱 래퍼로 Tauri, HTTP 서버로 Axum 을 사용한 순수 Rust.
- 장점:
- 네이티브 성능 – Electron 부하가 없습니다.
- 메모리 안전성 – Rust 의 보장이 플러그인까지 확장됩니다.
- 크로스 플랫폼 – 하나의 코드베이스로 Windows, macOS, Linux 를 지원합니다.
WASM 샌드박싱
플러그인은 WASM 으로 컴파일되어 wasmtime 샌드박스에서 실행되며, 다음을 제공합니다:
- 권한 없이는 파일 시스템 접근이 불가능합니다.
- 권한 없이는 네트워크 요청이 불가능합니다.
- 호스트 애플리케이션에 영향을 주는 충돌이 발생하지 않습니다.
- 격리된 메모리 공간.
내장 UI 구성 요소
기본 제공으로 Orbis는 다음을 제공합니다:
- Layout Components
- Form Components
- Display Components
- Interactive Components
각 항목은 잘 테스트된 shadcn/ui 구현에 매핑되어 접근성, 키보드 탐색 및 최신 UI 패턴을 무료로 제공합니다.
액션 – 플러그인이 세상과 상호작용하는 방법
{
"type": "call_api",
"api": "users.list",
"method": "GET",
"onSuccess": [
{
"type": "update_state",
"path": "users",
"value": "{{$response.body.data}}"
}
]
}
사용 가능한 액션
| Action | Description |
|---|---|
update_state | 페이지 상태 수정 |
call_api | HTTP 요청 수행 |
navigate | 라우트 변경 |
show_toast | 토스트 알림 표시 |
show_dialog / close_dialog | 모달 처리 |
validate_form / reset_form | 폼 상태 관리 |
conditional | if/else 로직 |
| … | 곧 더 많은 기능 제공 |
Storage Options
- Single‑user desktop apps – embedded SQLite (zero external dependencies).
- Multi‑user apps – connect to a central Orbis server with PostgreSQL backend, full authentication, session management, etc.
보안 – 기본에 내장, 추가가 아님
- 보안 인증 – Argon2 비밀번호 해싱을 사용한 JWT 토큰.
- 세션 관리 – 리프레시 토큰을 사용한 안전한 처리.
- WASM 샌드박싱 – 격리된 플러그인 실행.
- TLS 지원 – rustls를 이용한 선택적 HTTPS (OpenSSL이나 기타 시스템 의존성 없음).
로드맵
| 마일스톤 | 설명 |
|---|---|
| 플러그인 마켓플레이스 | 한 번의 클릭으로 플러그인을 검색하고 설치 |
| 플러그인 간 통신 | 플러그인 간 보안 메시지 전달 |
| 커스텀 DSL | 페이지 정의를 위한 JSON보다 깔끔한 구문 |
| 전체 GUI 오버라이드 | 플러그인이 기본 UI를 완전히 대체하도록 허용 |
| 자동 업데이트 | 원활한 업데이트를 위해 Tauri 내장 업데이트 기능 활용 |
| … | 파이프라인에 더 많은 기능 예정 |
업데이트
다가오는 기능에 대한 전체 로드맵 확인하기
리포지토리 복제
git clone https://github.com/cyberpath-HQ/orbis
cd orbis
프론트엔드 종속성 설치
cd orbis && bun install
개발 모드에서 실행
bun run tauri dev
첫 번째 플러그인은 이렇게 간단할 수 있습니다
{
"name": "hello-world",
"version": "0.1.0",
"pages": [
{
"id": "main",
"title": "Hello World",
"route": "/hello",
"state": {
"message": { "type": "string", "default": "Hello, Orbis!" }
},
"layout": {
"type": "Container",
"children": [
{
"type": "Heading",
"text": "{{state.message}}"
}
]
}
}
]
}
왜 Rust인가?
Rust를 선택한 것은 임의가 아니었습니다. 성능 이점 외에도, Rust의 소유권 모델은 다음을 보장합니다:
- 플러그인 런타임에서 데이터 레이스가 발생하지 않음
- 예측 가능한 메모리 사용량
- 플러그인 실행을 위한 두려움 없는 동시성
- 다른 곳에서는 런타임 오류가 될 수 있는 문제를 컴파일 타임에 보장
게다가 WASM을 위한 Rust 생태계는 성숙했습니다:
- Wasmtime – 검증된 샌드박스
- Tauri – 가벼운 데스크톱 래퍼
- Axum – 빠른 비동기 HTTP 서버
Orbis가 제공하는 것
Orbis는 확장 가능한 데스크톱 애플리케이션에 대한 새로운 접근 방식을 제공합니다. what(JSON 스키마)와 how(React 렌더링)를 분리함으로써 우리는 다음과 같은 플랫폼을 만들었습니다:
- 플러그인 개발자는 프레임워크의 특이점이 아니라 기능에 집중합니다
- 사용자는 일관되고, 안전하며, 아름다운 애플리케이션을 얻습니다
- 핵심 팀은 플러그인을 깨뜨리지 않고 렌더링 레이어를 발전시킬 수 있습니다
데스크톱 애플리케이션을 확장해야 하는 경우—내부 도구이든, 개발자 유틸리티이든, 완전한 제품이든—Orbis를 사용해 보세요.
리소스
- Website: orbis.cyberpath-hq.com
- GitHub: github.com/cyberpath-HQ/orbis
- Documentation: orbis.cyberpath-hq.com/docs
- Issues & Discussions: GitHub Issues
이 내용이 흥미로우셨다면, Rust, 보안, 그리고 개발자 도구에 대한 더 깊은 탐구를 위해 팔로우해주세요. 그리고 Orbis로 무언가를 만들었다면, 꼭 보여주세요!