Pano'nun varsayılan teması. Aynı zamanda yeni tema oluştururken template olarak kullanılır — bütün license/DRM altyapısı bu klasörde hazır, yeni temayı bunu kopyalayarak başlatırsan otomatik miras alır.
bun install
bun run dev # vite dev — :3000
bun run build # production build → build/bun run dev sırasında license/DRM altyapısı devre dışı, premium check'ler no-op olur. License doğrulaması sadece bun run build ile çalışan prebuild adımından sonra devreye girer.
İki şey değişir, başka hiçbir şey yapmana gerek yok:
-
manifest.jsoniçinde:- "premium": false // ya da bu satır yok + "premium": true
-
CI ortamında
PANO_LICENSE_SERVERenv değişkeninin set olduğundan emin ol (zaten release.yml'dabranch == 'main' ? 'prod' : 'dev'olarak ayarlanmış, dokunmana gerek yok).
bun run build çalıştırıldığında:
- prebuild script (
scripts/license/generate-license-constants.js) panomc.com'dan public key'i çeker,src/lib/server/license-constants.generated.js'e gömer - vite build sonrası fingerprint plugin'i tüm
build/dosyalarının kümülatif SHA-256'sını hesaplayıpbuild/manifest.json'afileFingerprintolarak yazar - Pano host bu temayı kurarken/başlatırken aynı hash'i tekrar hesaplar, eşleşmiyorsa reddeder
- Çalışma zamanında tema kendi dosyalarını da bağımsız olarak doğrular
prebuild script şu sırayla seçim yapar:
| Öncelik | Env değişkeni | Davranış |
|---|---|---|
| 1 | PANO_LICENSE_PUBLIC_KEY |
Public key'i direkt env'den alır (CI secret olarak), sunucuya hiç bağlanmaz |
| 2 | PANO_LICENSE_SERVER=prod |
https://api.panomc.com'dan key fetch eder |
| 2 | PANO_LICENSE_SERVER=dev |
https://api-dev.panomc.com'dan key fetch eder |
| 2 | PANO_LICENSE_SERVER=http://localhost:8087 |
Verilen URL'den key fetch eder (lokal backend testi için) |
| 3 | (hiçbiri set değil) | Git branch'ten otomatik tespit eder: main/master/release-* → prod, dev/develop/feat-*/fix-*/hotfix-* → dev |
| 4 | (yine yok) | Premium tema build'i fail eder (sessizce free build'e düşmez) |
Bonus: PANO_LICENSE_ISSUER — JWT iss doğrulaması için override (genelde gerekmez, server'dan otomatik türetilir).
Mevcut .github/workflows/release.yml zaten her şeyi hallediyor:
- name: Build
env:
PANO_LICENSE_SERVER: ${{ steps.extract_branch.outputs.branch == 'main' && 'prod' || 'dev' }}
run: bun run builddevbranch'e push → otomatik dev sunucudan key fetchmainbranch'e push (veya release) → prod sunucudan key fetch
Free temalarda bu env zararsız (manifest.premium=false olduğu için prebuild script onu görmezden gelir).
Public key'i bir kez prod'dan alıp GH repository secret'a koy:
Settings → Secrets → Actions → New repository secret
Name: PANO_LICENSE_PUBLIC_KEY
Value: <base64 RSA-2048 key, panomc.com'dan>
Sonra workflow:
- name: Build
env:
PANO_LICENSE_PUBLIC_KEY: ${{ secrets.PANO_LICENSE_PUBLIC_KEY }}
run: bun run buildBu durumda prebuild hiçbir HTTP çağrısı yapmaz, key'i secret'tan okur.
# Lokal Pano backend'ini :8087'de çalıştırıyorsan
PANO_LICENSE_SERVER=http://localhost:8087 bun run build
# Veya panomc.com'un dev sunucusunu kullanmak istersen
PANO_LICENSE_SERVER=dev bun run build
# Geçici olarak free build (test için)
PANO_LICENSE_REQUIRED=false bun run buildcp -r vanilla-theme shadow-theme
cd shadow-theme
# 1. manifest.json düzenle: id, title, version, screenshots
# 2. Premium olacaksa: "premium": true ekle
# 3. (varsa) .github/workflows/release.yml içinde zip ismini güncelle
bun install
bun run devscripts/license/ ve src/lib/server/license-runtime.js zaten bütün premium altyapıyı kapsıyor; sadece manifest'i değiştirmek yeterli.