nsyte

Deploy and manage censorship-resistant static websites on the Nostr network using nsyte CLI. Covers installation, project setup, configuration, authentication (NIP-46 bunkers), deployment to Blossom servers, CI/CD automation, and troubleshooting. Use when the user mentions nsyte, nsite, Nostr site hosting, Blossom uploads, or decentralized web publishing.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "nsyte" with this command: npx skills add sandwichfarm/nsyte/sandwichfarm-nsyte-nsyte

nsyte — Decentralized Static Site Deployment

nsyte is a Deno-based CLI that publishes static websites to the Nostr network using Blossom servers for file storage. Sites are content-addressed (SHA-256), censorship-resistant, and discoverable via Nostr relays.

Key concepts: For Nostr/Blossom domain knowledge (relays, pubkeys, nsec, NIP-46, events), see references/nostr-concepts.md.


Installation

Check if installed

nsyte --version

If this prints a version string, skip to Project Setup.

Linux / macOS (recommended — no Deno required)

curl -fsSL https://nsyte.run/get/install.sh | bash

Installs to /usr/local/bin/nsyte. Use sudo if that directory is not writable.

Linux / macOS (alternative — requires Deno 2.x)

deno install -A -f -g -n nsyte jsr:@nsyte/cli

Windows

Download the latest binary from https://github.com/sandwichfarm/nsyte/releases, place in %USERPROFILE%\bin\, and add that directory to PATH.

Troubleshooting installation

  • Command not found: Add /usr/local/bin to PATH in ~/.bashrc or ~/.zshrc and reload.
  • Permission denied: Use sudo for the curl install, or install to a user-writable location.
  • Deno version too old: Run deno upgrade or use the binary install instead.

Project Setup

cd /path/to/your/project
nsyte init

Interactive prompts ask for:

  1. Auth method — generate new key, enter existing nsec/hex key, or connect NIP-46 bunker
  2. Relay URLs — one or more wss:// relay WebSocket URLs
  3. Blossom server URLs — one or more https:// Blossom server URLs

On success, creates .nsite/config.json. See Configuration for the schema.


Configuration

Config file: .nsite/config.json

For the full JSON Schema, see assets/config.schema.json.

Required fields

FieldTypeDescription
relaysstring[]Nostr relay URLs (wss://), unique items
serversstring[]Blossom server URLs (https://), unique items

Authentication

FieldTypeDescription
bunkerPubkeystring64-char hex pubkey for NIP-46 bunker. Pattern: ^[0-9a-fA-F]{64}$. Always set via nsyte bunker use, never manually.

Site identity

FieldTypeDefaultDescription
idstring | nullnullnull/empty = root site (kind 15128). Non-empty = named site (kind 35128)
titlestringSite title for manifest event
descriptionstringSite description for manifest event
fallbackstring404 fallback HTML path (e.g., /index.html for SPAs)

Publishing flags (root sites only — id must be null/empty)

FieldTypeDescription
publishProfilebooleanPublish kind 0 profile metadata. Requires non-empty profile object
publishRelayListbooleanPublish kind 10002 relay list
publishServerListbooleanPublish kind 10063 Blossom server list
publishAppHandlerbooleanPublish NIP-89 handler. Requires appHandler with kinds

Optional objects

FieldTypeDescription
profileobjectNostr profile: name, display_name, about, picture, banner, website, nip05, lud16, lud06
appHandlerobjectNIP-89 config: kinds (required), id, name, description, icon, platforms
gatewayHostnamesstring[]Gateway hostnames (default: ["nsite.lol"])

Example configs

Minimal (root site):

{
  "relays": ["wss://relay.damus.io", "wss://nos.lol"],
  "servers": ["https://cdn.hzrd149.com"]
}

Named site (blog):

{
  "relays": ["wss://relay.damus.io"],
  "servers": ["https://cdn.hzrd149.com"],
  "id": "blog",
  "title": "My Blog",
  "description": "A blog about decentralized applications"
}

With profile publishing:

{
  "relays": ["wss://relay.damus.io", "wss://nos.lol"],
  "servers": ["https://cdn.hzrd149.com"],
  "publishProfile": true,
  "publishRelayList": true,
  "publishServerList": true,
  "profile": {
    "name": "Alice",
    "display_name": "Alice",
    "about": "Decentralization enthusiast",
    "picture": "https://example.com/avatar.jpg",
    "nip05": "alice@example.com",
    "lud16": "alice@getalby.com"
  }
}

With NIP-89 app handler:

{
  "relays": ["wss://relay.damus.io"],
  "servers": ["https://cdn.hzrd149.com"],
  "publishAppHandler": true,
  "appHandler": {
    "kinds": [1, 30023],
    "name": "My Nostr Viewer",
    "description": "A viewer for notes and articles",
    "icon": "https://example.com/logo.png"
  }
}

Interactive config editor

nsyte config

Requires an interactive terminal. Keys: / navigate, Enter edit, s save, r reset, q quit.

For non-interactive contexts, edit .nsite/config.json directly and validate:

nsyte validate

Authentication

NIP-46 Bunker (recommended)

Connect via QR code

nsyte bunker connect

Choose "Scan QR Code", enter a relay URL, scan with signer app (Amber, nsec.app), approve.

Connect via bunker URL

nsyte bunker connect 'bunker://pubkey?relay=wss://relay.example.com&secret=xxx'

CRITICAL: Always single-quote the URL — ? and & are shell metacharacters.

Link bunker to project

nsyte bunker use [pubkey]

Sets bunkerPubkey in config and stores nbunksec in OS keychain. Never manually edit bunkerPubkey.

Bunker management commands

CommandPurpose
nsyte bunker connectConnect interactively (QR or URL)
nsyte bunker connect '<url>'Connect via bunker URL
nsyte bunker import nbunksec1...Import existing nbunksec
nsyte bunker export [pubkey]Export stored bunker as nbunksec
nsyte bunker listList stored bunkers
nsyte bunker use [pubkey]Set project to use a bunker
nsyte bunker remove [pubkey]Remove a bunker from storage
nsyte bunker migrate [pubkeys...]Rebuild keychain index

Secrets storage

nsyte auto-selects the best backend:

  1. macOS: Keychain
  2. Linux: Secret Service (fallback: encrypted file)
  3. Windows: Credential Manager (fallback: encrypted file)

Override with NSYTE_FORCE_ENCRYPTED_STORAGE=true.


Deployment

Basic deploy

nsyte deploy ./dist

Auth resolution order

  1. --sec flag (highest priority):

    nsyte deploy ./dist --sec "nsec1..."
    nsyte deploy ./dist --sec "${NBUNK_SECRET}"
    

    Auto-detects format: nsec1..., nbunksec1..., bunker://..., or 64-char hex.

  2. Stored bunker from .nsite/config.json bunkerPubkey + OS keychain.

  3. If neither available, nsyte exits with an error.

Common flags

FlagPurpose
--sec <value>Provide signing key/credential
--forceRe-upload all files (skip diff)
--fallback=/index.htmlSPA fallback for 404s
--non-interactiveCI mode — no prompts, fail fast

Interpreting output

  • Full success: {N} files uploaded successfully ({size}) — all files to all servers
  • Partial success: {uploaded}/{total} files uploaded — some servers failed
  • Total failure: Failed to upload any files — check relay/server/auth errors

Gateway URL printed after deploy: https://{npub}.nsite.lol/


CI/CD

Step 1: Generate CI credential (one-time, on dev machine)

nsyte ci
# or with bunker URL:
nsyte ci 'bunker://pubkey?relay=wss://relay.example.com&secret=xxx'

The nbunksec1... string is printed once and never stored. Copy it immediately and save as a CI secret.

Step 2: Deploy in pipeline

nsyte deploy ./dist --non-interactive --sec "${NBUNK_SECRET}"

CRITICAL: Use --sec (not --nbunksec).

GitHub Actions example

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: denoland/setup-deno@v1
      - run: nsyte deploy ./dist --non-interactive --sec "${{ secrets.NBUNK_SECRET }}"

CI checklist

  • .nsite/config.json committed or provided as artifact
  • NBUNK_SECRET secret set to nbunksec1... string
  • --non-interactive flag present
  • Optionally run nsyte validate before deploy

Other Commands

CommandPurpose
nsyte lsList published files
nsyte browseInteractive TUI file browser with relay/server propagation tracking
nsyte download <dir>Download published files
nsyte serve -d <dir>Local dev server
nsyte runStart resolver server with npub subdomains
nsyte debug <npub>Debug nsite setup (relays, servers, integrity)
nsyte validateValidate config (exit 0 = valid, 1 = invalid)
nsyte purgeRemove published files from relays/servers
nsyte sitesList available sites (root + named)

Troubleshooting

Auth errors

  • "No valid signing method": Provide --sec or configure bunker via nsyte bunker use.
  • "No stored credential": bunkerPubkey set in config but keychain entry missing. Fix: nsyte bunker use [pubkey].
  • Bunker URL rejected: Shell ate metacharacters. Use single quotes: 'bunker://...'.

Deploy errors

  • Relay issues: Check relays array in config has valid wss:// URLs. Try --use-fallback-relays.
  • Blossom server rejection: Check servers array. Try adding a different server via nsyte config.
  • Config missing: Run nsyte init first.

Config errors

  • "Config editor requires interactive terminal": Edit JSON directly + nsyte validate.
  • Validation fails: Common causes: malformed URLs, publishAppHandler: true without appHandler.kinds, publish* on named site.
  • bunkerPubkey format: Must be 64 hex chars, not npub. Always use nsyte bunker use.

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

openclaw-version-monitor

监控 OpenClaw GitHub 版本更新,获取最新版本发布说明,翻译成中文, 并推送到 Telegram 和 Feishu。用于:(1) 定时检查版本更新 (2) 推送版本更新通知 (3) 生成中文版发布说明

Archived SourceRecently Updated
Coding

ask-claude

Delegate a task to Claude Code CLI and immediately report the result back in chat. Supports persistent sessions with full context memory. Safe execution: no data exfiltration, no external calls, file operations confined to workspace. Use when the user asks to run Claude, delegate a coding task, continue a previous Claude session, or any task benefiting from Claude Code's tools (file editing, code analysis, bash, etc.).

Archived SourceRecently Updated
Coding

ai-dating

This skill enables dating and matchmaking workflows. Use it when a user asks to make friends, find a partner, run matchmaking, or provide dating preferences/profile updates. The skill should execute `dating-cli` commands to complete profile setup, task creation/update, match checking, contact reveal, and review.

Archived SourceRecently Updated
Coding

clawhub-rate-limited-publisher

Queue and publish local skills to ClawHub with a strict 5-per-hour cap using the local clawhub CLI and host scheduler.

Archived SourceRecently Updated