
@3182/If Never Born
- 2 installs
- 1 repo stars
- Updated July 29, 2026
- starchild-ai-agent/community-skills
Generate a warm ~1000-word 'if I had never been born' fairy tale plus three illustrations as a publishable HTML storybook from a name, age, and 3 events.
About
A skill that generates a warm 'if this person had never been born' fairy tale of about 1000 words plus three storybook illustrations, output as a publishable HTML storybook. A developer or user uses it to make a personalized keepsake for birthdays, memorials, or encouragement gifts.
- Generates a ~1000-word parallel-universe healing fairy tale from a name and 3 events
- Outputs a polished HTML storybook with 3 cohesive illustrations
@3182/If Never Born by the numbers
- 2 all-time installs (skills.sh)
- Ranked #1,166 of 1,335 Generative Media skills by installs in the Skillselion catalog
- Data as of Jul 30, 2026 (Skillselion catalog sync)
npx skills add https://github.com/starchild-ai-agent/community-skills --skill if-never-bornAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 2 |
|---|---|
| repo stars | ★ 1 |
| Last updated | July 29, 2026 |
| Repository | starchild-ai-agent/community-skills ↗ |
What it does
Generate a warm ~1000-word 'if I had never been born' fairy tale plus three illustrations as a publishable HTML storybook from a name, age, and 3 events.
Files
If I Had Never Been Born — 平行宇宙治愈童话
You are the storyteller. This skill turns a real person into the hero of a tender fairy tale that proves, by gentle contrast, that their existence mattered. The device is a parallel world where they were never born — and the warmth that goes missing there.
Inputs (collect first)
Ask for these if not given. Keep it light, one short message:
1. Name — what to call the hero (real or nickname). 2. Age — used for tone (a child's tale vs. an elder's tale) and small details. 3. 3 key life events — moments that shaped them or touched others. Examples: "taught her little sister to ride a bike," "moved to a new city alone at 22," "started a small bakery," "stayed up nursing a sick friend." Mundane, human ripples work BETTER than grand achievements — the healing comes from small specifics.
Optional: language (default = match the user), gender/pronoun, a relationship note (whose gift this is), a favorite color/animal/place to weave in.
Then confirm the language and write in it. ~1000 words means ~1000 Chinese characters for zh, ~1000 words for en.
Narrative skeleton — "The Keeper of Maybes"
Always follow this 3-act arc. It guarantees the tone lands warm, not morbid.
Frame: A gentle cosmic guardian — the Keeper of Maybes (守梦人 / 星灵 / 织光者, pick a fitting name) — visits {name} and offers to show the world that would exist if {name} had never been born. Never frame this as death. It's a "what if you were never here at all" — softer, dreamlike.
Act 1 — The Spark (≈200 words). Introduce {name} warmly with age-appropriate, sensory detail. Establish their ordinary world and one small thing they think doesn't matter about themselves (this is the seed the story will redeem). The Keeper arrives and poses the question.
Act 2 — The Three Absences (≈600 words, ~200 each). Walk through three vignettes of the parallel world, one per life event. In each:
- Show concretely what/who is missing — a person never comforted, a dish never cooked, a song never heard, a courage never sparked, a chain of small kindnesses that never happened.
- Make it specific and sensory, never abstract ("the world would be sadder" = banned; "the bench by the river never heard her laugh, so the old man who sat there each morning never learned to smile again" = good).
- Each vignette ends on a quiet ache that the reader feels — but the dread is gentle, wrapped in beauty.
- Each vignette = one illustration (see below).
Act 3 — The Return (≈200 words). The Keeper brings {name} home; the parallel world's missing lights flicker back on, one by one, tied to the three vignettes. Land the healing thesis: a life isn't measured by how big it is, but by the warmth it leaves in others — and {name} leaves a great deal. End with a tender line spoken to {name} by name.
Tone & craft rules
- Warm, lyrical, hopeful. Fairy-tale register: simple sentences, a little magic, gentle rhythm. Read like a bedtime story for the soul.
- Concrete over abstract. Earn emotion with specific images, smells, sounds, names of small things.
- Never morbid. No grief over death; the absence is a soft "what if," always resolved into affirmation.
- Use the real details. Weave the 3 events naturally; don't list them. Use the optional color/animal/place if given.
- Length discipline. ~1000 words / 字. Tight and complete, not padded.
The 3 illustrations
Generate AFTER the story so prompts match the scenes you wrote. Use image_generate.
Style anchor (paste into every prompt for cohesion): dreamy storybook watercolor illustration, soft warm light, gentle pastel palette, golden-hour glow, picture-book aesthetic, tender and healing mood, delicate ink linework, no text
Character anchor: write a 1-line fixed description of {name} (approx age, hair, one signature item/color) and paste it into all 3 prompts so the hero looks consistent.
The 3 scenes map to the three vignettes — show the moment of warmth (the version where {name} exists), not the empty void, so the images feel healing: 1. Vignette 1's tender moment. 2. Vignette 2's tender moment. 3. The Return — {name} and the Keeper of Maybes under a sky of relit stars/lights.
Settings: aspect_ratio="landscape", quality="medium", n=1. Use nanopro (default) for warmth and coherence. Read each images[0].path from the tool result — never guess paths.
Assemble the storybook
Build a polished HTML page so it's shareable.
1. Write the story + metadata to a JSON file (see scripts/build_storybook.py header for schema). 2. Run: python3 skills/if-never-born/scripts/build_storybook.py <story.json> <out.html>
- The script interleaves the 3 images between story sections and applies the storybook CSS theme.
3. Save outputs under output/if-never-born/<name>/ (story.md, the 3 images, storybook.html).
Tell the user the full path: output/if-never-born/<name>/storybook.html.
Publishing (when the user wants to share)
The HTML is self-contained-ish (images are relative paths in the same folder). To make a public link:
- Load the community-publish skill and call
publish_preview()on the story folder, OR serve via thepreviewtool and share the/preview/{id}/link. - On web, you can also just point the user to the local
storybook.htmlpath — the frontend renders it.
Quick checklist
1. Collect name + age + 3 events (+ optional extras), confirm language. 2. Write the ~1000-word tale via the 3-act skeleton. 3. Generate 3 cohesive illustrations (style + character anchors). 4. Build the HTML storybook with the script. 5. Give the user the path; offer to publish.
<!DOCTYPE html>
<html lang="{{LANG}}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{TITLE}}</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;600;700&display=swap" rel="stylesheet">
<style>
:root{
--ink:#3a3230; --soft:#6f635d; --gold:#c9963f; --rose:#d98a7b;
--paper:#fbf6ee; --paper2:#f4ead9; --line:#e6d8c3;
}
*{box-sizing:border-box;}
html,body{margin:0;padding:0;}
body{
font-family:{{FONT_STACK}};
color:var(--ink);
background:
radial-gradient(1200px 600px at 50% -10%, #fff7ea 0%, rgba(255,247,234,0) 60%),
linear-gradient(180deg,#fdf8f0 0%, #f6ecdd 100%);
line-height:1.95; font-size:18px;
-webkit-font-smoothing:antialiased;
}
.wrap{max-width:760px; margin:0 auto; padding:64px 26px 96px;}
/* cover */
.cover{text-align:center; padding:40px 0 28px; position:relative;}
.stars{font-size:26px; letter-spacing:.5em; color:var(--gold); opacity:.85;}
h1{
font-size:clamp(30px,6vw,46px); font-weight:700; margin:.35em 0 .15em;
letter-spacing:.04em;
background:linear-gradient(90deg,#b9802f,#d98a7b 60%,#c9963f);
-webkit-background-clip:text; background-clip:text; color:transparent;
}
.subtitle{color:var(--soft); font-size:17px; margin:.2em 0 0; font-style:italic;}
.rule{width:84px; height:2px; margin:30px auto 8px;
background:linear-gradient(90deg,transparent,var(--gold),transparent);}
/* story */
.story-text p{margin:0 0 1.35em; text-align:justify;}
.story-text p:first-letter{}
.story-text em{color:var(--rose); font-style:italic;}
.story-text strong{color:var(--gold); font-weight:600;}
figure.story-illus{
margin:42px -10px; text-align:center;
}
figure.story-illus img{
width:100%; max-width:680px; border-radius:18px;
box-shadow:0 18px 50px -18px rgba(120,80,40,.45);
border:6px solid #fff;
}
figure.story-illus figcaption{
margin-top:12px; font-size:14.5px; color:var(--soft); font-style:italic;
}
.dedication{
margin:56px auto 0; max-width:560px; text-align:center;
padding:30px 28px; border-radius:18px;
background:linear-gradient(180deg,#fff9f0, #f7ecda);
border:1px solid var(--line);
}
.dedication p{margin:0; font-size:19px; color:var(--ink); line-height:1.9;}
footer{
margin-top:60px; text-align:center; color:var(--soft); font-size:13.5px;
}
footer .heart{color:var(--rose);}
</style>
</head>
<body>
<div class="wrap">
<header class="cover">
<div class="stars">· ✦ · ✧ · ✦ ·</div>
<h1>{{TITLE}}</h1>
{{SUBTITLE_BLOCK}}
<div class="rule"></div>
</header>
<main>
{{BODY}}
{{DEDICATION_BLOCK}}
</main>
<footer>
<p>{{FOOTER_MADE}} · {{HERO}} <span class="heart">♥</span></p>
</footer>
</div>
</body>
</html>
#!/usr/bin/env python3
"""Build a polished HTML storybook for the "If I Had Never Been Born" tale.
Usage:
python3 build_storybook.py <story.json> <out.html>
story.json schema:
{
"title": "如果你从未出生", # story title
"subtitle": "送给 {name} 的平行宇宙童话", # optional subtitle
"hero": "小满", # name
"age": "8", # optional, string or int
"language": "zh", # "zh" or "en" (affects font + footer text)
"sections": [ # ordered story blocks
{"type": "text", "html": "<p>...</p><p>...</p>"},
{"type": "image", "src": "vignette1.png", "caption": "..."},
{"type": "text", "html": "<p>...</p>"},
{"type": "image", "src": "vignette2.png", "caption": "..."},
...
],
"dedication": "愿你永远记得,你来过,世界因此不同。" # optional closing line
}
Notes:
- "src" should be a path RELATIVE to the output HTML (put images in the same folder).
- Text "html" may contain <p>, <em>, <strong>, <br>. Keep it simple.
- The script does no LLM work — the agent writes the story, this just renders it.
"""
import json
import sys
import html as _html
from pathlib import Path
TEMPLATE_PATH = Path(__file__).resolve().parent.parent / "assets" / "storybook_template.html"
def esc(s: str) -> str:
return _html.escape(s or "")
def render_sections(sections):
out = []
for sec in sections:
t = sec.get("type")
if t == "text":
out.append(f'<div class="story-text">{sec.get("html", "")}</div>')
elif t == "image":
cap = sec.get("caption", "")
cap_html = f'<figcaption>{esc(cap)}</figcaption>' if cap else ""
out.append(
'<figure class="story-illus">'
f'<img src="{esc(sec.get("src",""))}" alt="{esc(cap)}" loading="lazy">'
f'{cap_html}</figure>'
)
else:
# unknown block, skip safely
continue
return "\n".join(out)
def main():
if len(sys.argv) != 3:
print("Usage: build_storybook.py <story.json> <out.html>", file=sys.stderr)
sys.exit(2)
story_path, out_path = Path(sys.argv[1]), Path(sys.argv[2])
data = json.loads(story_path.read_text(encoding="utf-8"))
lang = (data.get("language") or "zh").lower()
is_zh = lang.startswith("zh")
title = data.get("title") or ("如果你从未出生" if is_zh else "If You Had Never Been Born")
subtitle = data.get("subtitle") or ""
hero = data.get("hero") or ""
dedication = data.get("dedication") or ""
body_html = render_sections(data.get("sections", []))
footer_made = "用 ✨ 为你定制" if is_zh else "Lovingly crafted for you"
ded_block = (
f'<div class="dedication"><p>{esc(dedication)}</p></div>' if dedication else ""
)
subtitle_block = f'<p class="subtitle">{esc(subtitle)}</p>' if subtitle else ""
font_stack = (
'"Noto Serif SC", "Songti SC", "STSong", serif' if is_zh
else '"Georgia", "Iowan Old Style", "Palatino", serif'
)
tpl = TEMPLATE_PATH.read_text(encoding="utf-8")
out = (
tpl.replace("{{LANG}}", "zh-CN" if is_zh else "en")
.replace("{{FONT_STACK}}", font_stack)
.replace("{{TITLE}}", esc(title))
.replace("{{SUBTITLE_BLOCK}}", subtitle_block)
.replace("{{BODY}}", body_html)
.replace("{{DEDICATION_BLOCK}}", ded_block)
.replace("{{FOOTER_MADE}}", footer_made)
.replace("{{HERO}}", esc(hero))
)
out_path.parent.mkdir(parents=True, exist_ok=True)
out_path.write_text(out, encoding="utf-8")
print(f"Storybook written: {out_path}")
if __name__ == "__main__":
main()