Выпуск
Ember выглядит тепло, её главная страница переработана, и она говорит на трёх языках. Пора превратить её в настоящую, устанавливаемую тему — и представить её миру. Это финишная черта.
Справочные страницы для глубины: Сборка и упаковка и Публикация и Premium.
Шаг 1 — отполируйте манифест
В корне темы лежит manifest.json — карточка, которая говорит Pano (и всем остальным), что такое Ember. Заполните её как следует перед выпуском:
{
"id": "ember",
"title": "Ember",
"description": "A warm, cozy orange theme for survival servers.",
"version": "1.0.0",
"author": "YourName",
"panoVersion": "1.0.0",
"screenshots": ["screenshots/1.png"],
"premium": false
}| Поле | Примечания |
|---|---|
id | Уникальный, в нижнем регистре, через дефис идентификатор Ember: ember. Никогда не меняйте его после публикации — новый id это совершенно новая тема. Он никогда не может быть vanilla-theme. Файл пакета назван в его честь: ember-1.0.0.zip. |
title | Дружелюбное имя, которое видят люди: Ember. |
description | Одно-два предложения о внешнем виде. |
version | Автоматизация выпуска проставляет это за вас — не повышайте вручную. |
author | Ваше имя или команда. |
panoVersion | Версия Pano, на которую нацелена Ember. |
screenshots | Пути к изображениям из папки screenshots/ (ниже). |
premium | false для бесплатной; true для платной (см. необязательный раздел в конце). |
Добавьте скриншот
Скриншоты — это то, как люди оценивают тему с первого взгляда, и Marketplace требует хотя бы один. Положите изображения в папку screenshots/ в корне темы и перечислите их в манифесте:
ember/
├─ manifest.json
└─ screenshots/
└─ 1.pngХороший первый скриншот — полностраничный снимок главной страницы Ember, вместе с баннером. Сборка автоматически копирует screenshots/ в пакет, поэтому изображения отправляются внутри .zip.
Шаг 2 — проверка, сборка, упаковка
Три команды ведут Ember от исходников к устанавливаемому файлу:
bun run check # the safety net — Svelte version, plugin slots, settings, translations, manifest
bun run build # produces the optimized build/ folder
bun run package # wraps build/ into ember-1.0.0.zipЕсли check сообщает о проблеме, исправьте её и запустите снова. Зелёный check означает, что Ember безопасно упаковывать.
Сборки воспроизводимы
Сборка одного и того же кода дважды даёт побайтово идентичный результат. Это очень важно для премиум-тем, где SHA-256-отпечаток пакета является идентификатором лицензии.
Шаг 3 — установите её на свой Pano
Прежде чем делиться, установите Ember на свой Pano, чтобы убедиться, что она работает от начала до конца — тот самый процесс, которому будут следовать ваши пользователи:
- Откройте панель Pano и войдите как администратор.
- Перейдите в Просмотр → Темы.
- Выберите Установить и загрузите только что собранный
ember-1.0.0.zip. - Активируйте её и откройте сайт.
Теперь вы должны увидеть Ember, работающую как правильно установленная тема — без участия dev-сервера.
Шаг 4 — опубликуйте на GitHub
На практике вы будете автоматизировать выпуски. Pano поставляет переиспользуемый workflow, который запускает проверки, собирает, упаковывает детерминированный .zip и создаёт выпуск на GitHub за вас. Добавьте крошечный вызывающий workflow в .github/workflows/release.yml:
name: Release
on:
push:
branches: [main, dev]
jobs:
release:
uses: PanoMC/sdk/.github/workflows/theme-release.yml@dev
with:
theme-id: ember
secrets:
TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }}GITHUB_TOKEN предоставляется GitHub Actions автоматически — просто передайте его. Версии приходят из ваших Conventional Commits (feat:, fix:, chore:), так что вы никогда не повышаете version вручную.
Шаг 5 — опубликуйте на Marketplace
Marketplace на panomc.com — это место, где владельцы серверов находят и устанавливают темы прямо из своей панели.
Создайте ресурс:
- Зарегистрируйтесь (или войдите) на panomc.com.
- Откройте Create Resource, выберите тип Theme, выберите категорию и заполните заголовок и описание.
- Загрузите хотя бы один скриншот — обязательно для тем.
- Выберите цену: бесплатно или платно.
Когда ресурс создан, он получает resource ID (UUID). Найдите его позже под Profile → Resources.
Два разных ID
id в вашем manifest.json (ember) идентифицирует пакет темы. Resource ID Marketplace (UUID) идентифицирует её страницу в магазине. Это разные вещи, и автоматизации выпуска нужен UUID.
Автоматизируйте загрузки с помощью semantic-release-pano:
- На panomc.com создайте API-токен под Profile → Security → API tokens и добавьте его в ваш GitHub-репозиторий как секрет с именем
PANO_TOKEN(Settings → Secrets → Actions). - Укажите
semantic-release-panoна ваш resource ID в.releaserc.json:
["semantic-release-pano", {
"resourceId": "YOUR-RESOURCE-UUID",
"file": "ember-${version}.zip",
"panoVersion": "1.0.0",
"useGitHubLink": true,
"repositoryUrl": "https://github.com/YourName/ember.git"
}]С useGitHubLink бесплатная тема не загружается дважды — Marketplace просто ссылается на .zip, уже прикреплённый к вашему выпуску на GitHub (поэтому выпуск на GitHub должен выполниться первым). Без него плагин загружает файл напрямую, что и нужно для премиум-темы.
Вот и всё — сделайте push с commit feat:, и Ember публикуется на GitHub и Marketplace за один раз.
Необязательно — сделайте Ember премиум
Хотите продавать Ember? Переключите одно поле в manifest.json:
- "premium": false
+ "premium": trueЭто единственное изменение в исходниках; защита подключена за вас. Во время сборки вы предоставляете ключ, чтобы сборка могла привязать лицензию к вашему пакету — либо PANO_LICENSE_SERVER (переиспользуемый workflow задаёт это по ветке), либо PANO_LICENSE_PUBLIC_KEY, хранимый как CI-секрет. В bun run dev лицензионный барьер отключён, поэтому вы разрабатываете свободно.
Как это работает, простыми словами: production-сборка вычисляет SHA-256-отпечаток пакета и привязывает к нему лицензию. Чтобы запустить премиум-тему, у сервера в панели должна быть подключена учётная запись panomc.com, купившая Ember — проверяется как при установке, так и во время работы. Подделайте или переупакуйте .zip — и его отпечаток больше не совпадёт, поэтому Pano его отклонит.
Никакая защита не абсолютна — будьте честны с собой
Ни одна система лицензирования не защищает код на 100%. Цель — сделать несанкционированное использование как можно более трудным для подавляющего большинства пользователей, а не сделать его невозможным. Как и любое программное обеспечение, любой код, попадающий к конечному пользователю, по своей природе открыт — достаточно решительный и умелый человек всегда может его разобрать. Это верно для любой DRM когда-либо созданной, не только для Pano. Устанавливайте цену и поддерживайте Ember с учётом этой реальности.
Выпускайте изменения как новые релизы
Премиум-лицензия выдаётся на версию + пакет. Если вы отредактируете уже выпущенный .zip, его отпечаток изменится, и он перестанет быть лицензированным. Всегда отправляйте изменения как новый выпуск через процесс выше — никогда не редактируйте выпущенный .zip вручную.
Вы это сделали
Ember прошла путь от пустой папки до оформленной, переведённой, опубликованной темы — установленной на вашем собственном Pano и живой на Marketplace. Это всё путешествие, от начала до конца.
Куда двигаться дальше:
- Цвета и стили — углубитесь в токены и SCSS.
- Изменение дизайна страниц — переработайте больше из 26 представлений.
- Локализация — больше о переводах и новых языках.
- Публикация и Premium — полный справочник по выпуску и премиуму.
Приятного оформления. 🔥