{"_id":"@aethermc/sdk","_rev":"2-bede9714b2c5f9e849ae82381379127b","name":"@aethermc/sdk","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@aethermc/sdk","version":"1.0.0","keywords":["aether","minecraft","launcher","extensions","sdk"],"author":{"name":"Aether"},"license":"GPL-3.0-only","_id":"@aethermc/sdk@1.0.0","maintainers":[{"name":"wayback","email":"wayback145b@gmail.com"}],"homepage":"https://github.com/wayback09/Aether-SDK","bugs":{"url":"https://github.com/wayback09/Aether-SDK/issues"},"dist":{"shasum":"48335ca295e610146f01761273be6c8af70a32de","tarball":"https://registry.npmjs.org/@aethermc/sdk/-/sdk-1.0.0.tgz","fileCount":9,"integrity":"sha512-jI9vPtI5kWJ7nPUSohligcnZlLvJB5W2jH5wFvTwHUkfZ7utmFrIpxBqBfbkT8EdvvvUIXz+auTqTpgnvb8b6g==","signatures":[{"sig":"MEUCIQD516P4ZLOtS49ozUBq2dQRilXvWabjtYeJc9rHxSHVFQIgDThPSZpLLpdihix5LTjESZIjR6X40LgVE5B1VXkOozc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46967},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"c47773e329123568c749c72c6d6809c347a676a2","scripts":{"build":"tsup && tsc --emitDeclarationOnly","prepare":"npm run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"wayback","email":"wayback145b@gmail.com"},"repository":{"url":"git+https://github.com/wayback09/Aether-SDK.git","type":"git"},"_npmVersion":"11.7.0","description":"TypeScript SDK and type definitions for Aether extensions","directories":{},"sideEffects":false,"_nodeVersion":"25.4.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.0_1787058879563_0.4072901266249107","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aethermc/sdk","version":"1.1.0","description":"TypeScript SDK and type definitions for Aether extensions","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"sideEffects":false,"scripts":{"build":"tsup && tsc --emitDeclarationOnly","prepare":"npm run build","typecheck":"tsc --noEmit"},"keywords":["aether","minecraft","launcher","extensions","sdk"],"author":{"name":"Aether"},"license":"SEE LICENSE IN LICENSE","type":"commonjs","devDependencies":{"tsup":"^8.5.1","typescript":"^7.0.2"},"repository":{"type":"git","url":"git+https://github.com/Aether-Launcher/Aether-SDK.git"},"homepage":"https://github.com/Aether-Launcher/Aether-SDK","gitHead":"e2b42f800748e5703ec9ad1a726cdb8f2837fcf7","_id":"@aethermc/sdk@1.1.0","bugs":{"url":"https://github.com/Aether-Launcher/Aether-SDK/issues"},"_nodeVersion":"25.4.0","_npmVersion":"11.7.0","dist":{"integrity":"sha512-re4jri7r2dvHPTwICwOMKCt1/CfXw3p7iklWtGh+tQcjtLu1DdEYy47hubTLW2fl8bLkZEnOO7ZZaGpMS2kp5A==","shasum":"5f37ecf6ff68143736fd33a74d1017c3a648c228","tarball":"https://registry.npmjs.org/@aethermc/sdk/-/sdk-1.1.0.tgz","fileCount":9,"unpackedSize":42304,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD95C8iiCr+0A8xJkVBjrH3LTcQGM7px1jrFne0P5O/wgIhAPj6aQShgSwpntcppg0fw2mAJ7WjJOSDTflmboE2dAhW"}]},"_npmUser":{"name":"wayback","email":"wayback145b@gmail.com"},"directories":{},"maintainers":[{"name":"wayback","email":"wayback145b@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_1.1.0_1788281235255_0.29076224720524846"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-18T13:14:39.147Z","modified":"2026-09-01T16:47:15.559Z","1.0.0":"2026-08-18T13:14:39.762Z","1.1.0":"2026-09-01T16:47:15.408Z"},"bugs":{"url":"https://github.com/Aether-Launcher/Aether-SDK/issues"},"author":{"name":"Aether"},"license":"SEE LICENSE IN LICENSE","homepage":"https://github.com/Aether-Launcher/Aether-SDK","keywords":["aether","minecraft","launcher","extensions","sdk"],"repository":{"type":"git","url":"git+https://github.com/Aether-Launcher/Aether-SDK.git"},"description":"TypeScript SDK and type definitions for Aether extensions","maintainers":[{"name":"wayback","email":"wayback145b@gmail.com"}],"readme":"# Aether SDK (`@aethermc/sdk`)\n\n<p align=\"center\">\n  <a href=\"https://discord.gg/pQc9NnGhpG\">\n    <img src=\"https://img.shields.io/badge/discord-Join%20our%20Discord-5865F2?logo=discord&logoColor=white&style=for-the-badge\" alt=\"Discord\">\n  </a>\n  <img src=\"https://img.shields.io/badge/license-Aether%20Extension%20API%20License-blue?style=for-the-badge\" alt=\"License\">\n  <img src=\"https://img.shields.io/badge/version-1.1.0-green?style=for-the-badge\" alt=\"Version\">\n</p>\n\nThe official TypeScript SDK for building extensions for the **Aether Minecraft Launcher**. Provides full type definitions for the `Aether` global API injected by the sandbox runtime, plus helper utilities for safe permission checking, logging, and mod loader registration.\n\n---\n\n## Installation\n\n```bash\nnpm install --save-dev @aethermc/sdk\n```\n\n---\n\n## Permissions & Capabilities\n\nEvery capability in the API must be declared in your extension's `manifest.json` before it can be used. The sandbox enforces this at the Go level — undeclared capabilities simply won't exist on the `Aether` object.\n\n| Permission | API surface |\n|---|---|\n| `ui:sidebar` | `Aether.ui.registerSidebarPage`, `onMessage`, `postMessage` |\n| `ui:dialogs` | `Aether.ui.openDialog` |\n| `instances:list` | `Aether.instances.list` |\n| `mods:install` | `Aether.instances.installMod` |\n| `mods:list` | `Aether.instances.listMods` |\n| `mods:delete` | `Aether.instances.deleteMod` |\n| `mods:toggle` | `Aether.instances.toggleMod` |\n| `modpacks:install` | `Aether.instances.installModpack` |\n| `resourcepacks:install` | `Aether.instances.installResourcePack` |\n| `shaderpacks:install` | `Aether.instances.installShaderPack` |\n| `screenshots:read` | `Aether.instances.listScreenshots`, `openScreenshot`, `getScreenshotData` |\n| `screenshots:write` | `Aether.instances.deleteScreenshot` |\n| `network:http` | `Aether.http.get` |\n| `fs:download` | `Aether.fs.download` |\n| `launcher:modloader` | `Aether.launcher.registerModLoader` |\n| `discord:presence` | `Aether.discord.setActivity`, `clearActivity` |\n| `skin:export` | `Aether.skins.export` |\n\n---\n\n## Usage\n\n### Basic extension entry point\n\n```typescript\nimport { onReady, createLogger, assertPermission } from '@aethermc/sdk';\n\nconst log = createLogger('my-extension');\n\nonReady(() => {\n  log.info('Extension started!');\n\n  assertPermission('ui:sidebar');\n\n  Aether.ui.registerSidebarPage({\n    id: 'my-page',\n    label: 'My Extension',\n    url: 'ui/index.html',\n  });\n});\n```\n\n### Listing instances and installing mods\n\n```typescript\nimport { onReady, assertPermission } from '@aethermc/sdk';\n\nonReady(() => {\n  assertPermission('instances:list');\n  assertPermission('mods:install');\n\n  const instances = Aether.instances.list();\n  instances.forEach((inst) => {\n    console.log(`${inst.name} — ${inst.version} (${inst.loader})`);\n  });\n});\n```\n\n### Registering a mod loader\n\n```typescript\nimport { onReady, defineProvider } from '@aethermc/sdk';\n\nonReady(() => {\n  defineProvider({\n    id: 'my-loader',\n    name: 'My Loader',\n    description: 'A custom mod loader.',\n    onLaunch: (ctx) => ({\n      jvmArgs: ['-Dmy.loader.enabled=true'],\n      mainClass: 'com.example.Main',\n    }),\n  });\n});\n```\n\n### Working with screenshots\n\n```typescript\nimport { onReady, assertPermission } from '@aethermc/sdk';\n\nonReady(() => {\n  assertPermission('screenshots:read');\n\n  Aether.ui.onMessage(async (msg: any) => {\n    if (msg.type === 'get_screenshots') {\n      const screenshots = Aether.instances.listScreenshots(msg.instanceId);\n      // Each screenshot has: name, size, modified, url\n      // Use `url` directly in <img src=\"...\"> for native rendering\n      Aether.ui.postMessage({ type: 'screenshots', data: screenshots });\n    }\n  });\n});\n```\n\n### Discord Rich Presence\n\n```typescript\nimport { onReady, assertPermission } from '@aethermc/sdk';\n\nonReady(() => {\n  assertPermission('discord:presence');\n\n  Aether.events.on('instance:launched', (data: any) => {\n    Aether.discord.setActivity({\n      details: `Playing ${data.instance.name}`,\n      state: data.instance.version,\n      startTimestamp: Date.now(),\n    });\n  });\n});\n```\n\n---\n\n## manifest.json reference\n\n```json\n{\n  \"id\": \"my-extension\",\n  \"name\": \"My Extension\",\n  \"version\": \"1.0.0\",\n  \"author\": \"Your Name\",\n  \"description\": \"What your extension does.\",\n  \"main\": \"main.js\",\n  \"api\": \"1\",\n  \"minLauncherVersion\": \"v1.0.0\",\n  \"permissions\": [\n    \"ui:sidebar\",\n    \"instances:list\",\n    \"mods:install\"\n  ],\n  \"hosts\": [\n    \"https://api.example.com\"\n  ]\n}\n```\n\n> **`minLauncherVersion`** — If set, Aether will show an \"Incompatible\" badge in the Gallery for users on older launcher versions and prevent installation until they update.\n\n---\n\n## Distribution & Licensing\n\nExtensions built with this SDK may be **open-source or closed-source** — your choice. However, **distribution through the Aether Gallery requires review and approval by the Aether team**.\n\nSee [LICENSE](LICENSE) for the full terms. Key points:\n\n- ✅ Closed-source extensions are allowed\n- ✅ You own your extension's code\n- ✅ Aether reviews extensions before Gallery listing (security, quality, policy)\n- ❌ You may not use this SDK to build a competing launcher or extension platform\n- ❌ You may not distribute extensions outside approved channels without written permission from Aether\n\nTo submit your extension for review:  \n→ [Aether-Extensions Registry](https://github.com/Aether-Launcher/Aether-Extensions)\n","readmeFilename":"README.md"}