원클릭으로
oasis-server-setup
Expert guide for integrating Oasis update server with Tauri apps for auto-updates, crash reporting, and feedback collection.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Expert guide for integrating Oasis update server with Tauri apps for auto-updates, crash reporting, and feedback collection.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Expert guide for building AI-powered applications with the Glove framework. Use when working with glove-core, glove-react, glove-next, tools, display stack, model adapters, stores, or any Glove example project.
Expert guide for integrating Oasis into Tauri applications. Use when working with oasis-sdk, auto-updates, crash reporting, user feedback, release workflows, or any Oasis-powered Tauri project.
Expert guide for setting up Tauri deployment pipelines with GitHub Actions, code signing, and Oasis update server integration.
Expert guide for bumping versions, creating git tags, and managing releases for Tauri and Node.js projects.
| name | oasis-server-setup |
| description | Expert guide for integrating Oasis update server with Tauri apps for auto-updates, crash reporting, and feedback collection. |
You are an expert on the Oasis update server. Use this knowledge when configuring auto-updates, crash reporting, or feedback collection for Tauri applications.
Oasis is a self-hosted release management and analytics server for Tauri applications. It provides update manifests, crash reporting, and feedback collection.
Server repo: https://github.com/porkytheblack/oasis
Reusable workflow: porkytheblack/oasis/.github/workflows/tauri-release.yml@main
┌─────────────────────────────────────────────────────────────────┐
│ Tauri Desktop App │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ Auto-Update │ │ Crash SDK │ │ Feedback SDK │ │
│ └──────┬──────┘ └──────┬──────┘ └───────────┬─────────────┘ │
└─────────┼────────────────┼─────────────────────┼────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ Oasis Server │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ /update │ │ /crashes │ │ /feedback │ │
│ │ manifests │ │ collection │ │ collection │ │
│ └──────┬──────┘ └─────────────┘ └─────────────────────────┘ │
└─────────┼───────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Cloudflare R2 (CDN) │
│ Artifact storage: .dmg, .exe, .AppImage │
└─────────────────────────────────────────────────────────────────┘
npx @tauri-apps/cli signer generate -w ~/.tauri/keys/your-app.key
# Output: Public key + private key file
{
"plugins": {
"updater": {
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6...",
"endpoints": [
"https://oasis.yourdomain.com/your-app/update/{{target}}-{{arch}}/{{current_version}}"
],
"windows": {
"installMode": "passive"
}
}
}
}
// capabilities/default.json
{
"permissions": [
"updater:default",
"updater:allow-check",
"updater:allow-download-and-install",
"process:default",
"process:allow-restart"
]
}
pnpm add @oasis/sdk
// lib/oasis.ts
import { initOasis } from '@oasis/sdk';
export const oasis = initOasis({
apiKey: process.env.NEXT_PUBLIC_OASIS_API_KEY!,
serverUrl: process.env.NEXT_PUBLIC_OASIS_SERVER_URL!,
appVersion: '0.1.0',
enableAutoCrashReporting: true,
});
import { check } from '@tauri-apps/plugin-updater';
import { relaunch } from '@tauri-apps/plugin-process';
async function checkForUpdates() {
const update = await check();
if (update?.available) {
await update.downloadAndInstall();
await relaunch();
}
}
| Endpoint | Method | Purpose |
|---|---|---|
/{app_slug}/update/{target}-{arch}/{version} | GET | Update manifest |
/sdk/{app_slug}/feedback | POST | Submit feedback |
/sdk/{app_slug}/crashes | POST | Report crashes |
/api/releases/{app_slug} | POST | Register release (CI only) |
{
"version": "0.2.0",
"notes": "Bug fixes and improvements",
"pub_date": "2024-01-15T10:00:00Z",
"platforms": {
"darwin-aarch64": {
"signature": "dW50cnVzdGVkIGNvbW1lbnQ6...",
"url": "https://cdn.example.com/app/v0.2.0/App_aarch64.app.tar.gz"
},
"darwin-x86_64": {
"signature": "...",
"url": "https://cdn.example.com/app/v0.2.0/App_x64.app.tar.gz"
},
"windows-x86_64": {
"signature": "...",
"url": "https://cdn.example.com/app/v0.2.0/App_x64-setup.nsis.zip"
},
"linux-x86_64": {
"signature": "...",
"url": "https://cdn.example.com/app/v0.2.0/App_amd64.AppImage.tar.gz"
}
}
}
No update available returns HTTP 204 No Content.
| Variable | Description | Example |
|---|---|---|
{{target}} | Operating system | darwin, windows, linux |
{{arch}} | CPU architecture | x86_64, aarch64 |
{{current_version}} | App version | 0.1.0 |
| Key Type | Format | Purpose |
|---|---|---|
| Public Key | pk_{app-slug}_{random} | SDK operations (client-side) |
| CI Key | ci_{app-slug}_{random} | Release registration (server-side) |
Example: pk_coco_a1b2c3d4e5f6g7h8
// Categorized feedback
await oasis.feedback.submit({
category: 'bug', // 'bug' | 'feature' | 'general'
message: 'Save button not working',
email: 'user@example.com',
metadata: { screen: 'settings' },
});
// Convenience methods
await oasis.feedback.reportBug('Description');
await oasis.feedback.requestFeature('Description');
await oasis.feedback.sendFeedback('Description');
// Manual capture
try {
riskyOperation();
} catch (error) {
await oasis.crashes.captureException(error, {
appState: { screen: 'checkout' },
severity: 'error', // 'warning' | 'error' | 'fatal'
});
}
// Toggle auto-capture
oasis.crashes.enableAutoCrashReporting();
oasis.crashes.disableAutoCrashReporting();
oasis.breadcrumbs.addNavigation('/home', '/settings');
oasis.breadcrumbs.addClick('Save Button');
oasis.breadcrumbs.addHttp('POST', '/api/save', 200);
oasis.breadcrumbs.addCustom('wallet', 'Connected', { address: '0x...' });
// Set after authentication
oasis.setUser({
id: 'user-123',
email: 'user@example.com',
username: 'johndoe',
});
// Clear on logout
oasis.setUser(null);
| Option | Type | Default | Description |
|---|---|---|---|
apiKey | string | required | Public API key |
serverUrl | string | required | Oasis server URL |
appVersion | string | required | Current app version |
enableAutoCrashReporting | boolean | false | Catch uncaught errors |
maxBreadcrumbs | number | 50 | Breadcrumb history limit |
timeout | number | 10000 | Request timeout (ms) |
debug | boolean | false | Enable debug logging |
beforeSend | function | - | Filter/modify events |
onError | function | - | Error callback |
| Secret | Description |
|---|---|
OASIS_SERVER_URL | Base URL (e.g., https://oasis.yourdomain.com) |
OASIS_CI_KEY | CI key for release registration |
NEXT_PUBLIC_OASIS_API_KEY | Public SDK key (exposed to client) |
NEXT_PUBLIC_OASIS_SERVER_URL | Public server URL (exposed to client) |
TAURI_SIGNING_PRIVATE_KEY | Update signing key |
TAURI_SIGNING_PRIVATE_KEY_PASSWORD | Signing key password |
{{target}} not {target}. Single braces are for workflow variables.0.1.0, not v0.1.0 in code. Tags use v prefix.initOasis() early in app lifecycle to catch startup crashes.null to filter sensitive data from crash reports.