Install
openclaw skills install webnovel-serial-pipelineBuild and publish a Quartz-hosted Korean web-novel serial (draft→cover→webp→episode md→lint→publish). Uses Nano Banana Pro + ffmpeg.
openclaw skills install webnovel-serial-pipelineThis skill may trigger antivirus false positives due to:
curl, wget to DETECT (not execute) malicious codeAll code is open source and auditable. No malicious behavior.
This skill documents the end-to-end workflow we used for Quartz-hosted Korean web-novel serials (e.g., Drama/야간조).
From a terminal:
# 1) Install
clawhub install webnovel-serial-pipeline
# 2) Go to the skill folder
cd skills/webnovel-serial-pipeline
# 3) Set your Quartz root (env var)
export WEBNOVEL_QUARTZ_ROOT="/absolute/path/to/8.quartz"
# 4) Verify deps
bash scripts/check_deps.sh
# 5) After you say “검수 완료”, publish + sync index
bash scripts/publish_review_ok.sh --series "야간조" --episode 2 --slug "불-꺼지면-가지-마세요" --draft-file "/path/to/draft.md"
1K → webp (q 70~80, max 1200px)This section captures the proposal + requirements analysis process we used (the part before the pipeline).
아래 질문을 한 메시지로 던지고, 사용자가 선택/응답하면 그걸로 톤을 고정한다.
For distribution we do not hardcode machine-specific paths.
Required environment variable:
WEBNOVEL_QUARTZ_ROOT = your Quartz vault root (published content folder)Optional:
WEBNOVEL_DRAFT_ROOT = where you keep draftsNANO_BANANA_KEY (only if you generate covers using nano-banana-pro)Example:
export WEBNOVEL_QUARTZ_ROOT="/absolute/path/to/8.quartz"
export WEBNOVEL_DRAFT_ROOT="/absolute/path/to/drafts" # optional
From inside this skill folder:
bash scripts/check_deps.sh
Before clawhub publish, run:
python3 scripts/prepublish_check.py
This fails if obvious exfil/download markers are found.
$WEBNOVEL_QUARTZ_ROOT (example: /path/to/8.quartz)Drama/<series>/index.md (landing + 제작 규칙)Drama/<series>/<series>-01-....md (published episodes)Drama/<series>/images/*.webp (covers)$WEBNOVEL_DRAFT_ROOT/<series>_serial_drafts/ (example: /path/to/drafts/yaganjo_serial_drafts/)Write the episode in the drafts folder first.
Generate cover PNG (1K) using Nano Banana Pro, then convert to WebP.
domain/topic/format/audience/intent/lang![[Drama/<series>/images/<cover>.webp]]Before publishing, run a quick linter:
같아서/것 같아서Only after the user says OK.
Recommended publish command (copies draft into Quartz and normalizes filename):
python3 scripts/publish_episode.py \
--draft-file /path/to/draft.md \
--quartz-root "$WEBNOVEL_QUARTZ_ROOT" \
--series-dir "$WEBNOVEL_QUARTZ_ROOT/Drama/<series>" \
--series "<series>" \
--episode 2 \
--slug "불-꺼지면-가지-마세요"
Add markers once in Drama/<series>/index.md:
## 에피소드
<!-- episodes:start -->
<!-- episodes:end -->
Then run:
python3 scripts/sync_index.py \
--index-file "$WEBNOVEL_QUARTZ_ROOT/Drama/<series>/index.md" \
--series-dir "$WEBNOVEL_QUARTZ_ROOT/Drama/<series>" \
--series "<series>"
This is the recommended human-safe workflow: wait for the user to explicitly say 검수 완료, then run:
bash scripts/publish_review_ok.sh \
--series "야간조" \
--episode 2 \
--slug "불-꺼지면-가지-마세요" \
--draft-file "/path/to/drafts/yaganjo_serial_drafts/야간조-연재-02-불-꺼지면-가지-마세요.md"
It will:
Drama/<series>/index.md between episode markerspython3 scripts/new_episode.py \
--series "야간조" \
--series-dir "$WEBNOVEL_QUARTZ_ROOT/Drama/야간조" \
--episode 2 \
--slug "불-꺼지면-가지-마세요" \
--draft-dir "/path/to/drafts/yaganjo_serial_drafts"
bash scripts/to_webp.sh \
/path/to/cover.png \
/path/to/cover.webp
python3 scripts/lint_episode.py \
--file /path/to/episode.md
~같아서 chains