Skip to content

1. Your first greenhouse story

You need a text editor, Python 3.11 or later, and about 20 minutes. No programming experience or StoryOrbit account is required. We will make The Last Light in the Greenhouse: a visitor meets Rowan beside a wilting seedling before closing. The reader can help, ask questions, or leave.

Download this lesson’s ZIP below and extract it into a new folder. Open a terminal inside that folder, where check.py and requirements.txt are visible. start/pack.json is your draft; finished/pack.json is a complete worked answer. Both are valid packs. Keep your own edits in a copy.

On macOS or Linux:

Terminal window
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python check.py start/pack.json

On Windows PowerShell:

Terminal window
py -3 -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt
.venv\Scripts\python.exe check.py start/pack.json

The dependency installation needs internet once. The check then works offline. You should see Structural check passed: Creator Pack 0.3 and a Schema SHA-256. If Python is missing, install Python 3.11 or later first. If the command cannot find check.py, return to the extracted folder.

Write an invitation, not the reader’s decision

Section titled “Write an invitation, not the reader’s decision”

Open start/pack.json. JSON uses double-quoted names and strings, commas between fields, square brackets for lists, and braces for objects. It does not accept comments or a trailing comma. Use a plain text editor rather than a word processor.

Change manifest.title to The Last Light in the Greenhouse and manifest.revision from 1 to 2. Keep pack_id, the entry id arrival, and the matching runtime entry unchanged. IDs connect pieces; titles are for people.

Replace the string in entries[0].opening with a short paragraph that shows the bench, Rowan, and the dry soil. Offer something to respond to. “You immediately trust Rowan and take the can” decides for the reader; “Rowan sets down a small watering can” leaves room to act. The worked answer below is one possible voice, not a required sentence.

Run the check again, then check finished/pack.json with the same command. Expected result: both pass, and your draft has the new title and one nonempty opening paragraph. A string containing a newline is not a valid paragraph here; later lessons use a list of paragraphs.

The checker verifies JSON structure against the exact bundled schema. It does not execute a story, judge its voice, inspect image bytes, approve rights, or publish anything. Our examples keep source review pending. Lesson 9 explains service admission and private trials.

Try deleting the opening temporarily. The failure should point to the affected JSON path. Restore it and confirm the pass. You now have a small complete draft, rather than a fragment copied from a field reference.

Save as UTF-8 text and keep the filename pack.json. Save your edits before running the checker: it reads the file on disk, so an unsaved editor tab is not part of the result.

Check your work locally

From the extracted bundle folder, create the environment and install the pinned dependencies once. Then check both files, and repeat the start check after your edits. The same commands work for every lesson.

macOS / Linux

python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python check.py start/pack.json
.venv/bin/python check.py finished/pack.json

Windows PowerShell

py -3 -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt
.venv\Scripts\python.exe check.py start/pack.json
.venv\Scripts\python.exe check.py finished/pack.json

Expected for the finished pack: Structural check passed: Creator Pack 0.3 followed by the exact Schema SHA-256. This is a structural check, not host admission or a live playtest.

Working excerpt from the finished pack

This excerpt is generated from the tested download. It is not a complete pack; edit the named fields inside start/pack.json or compare finished/pack.json.

{
  "manifest": {
    "pack_id": "last-light-greenhouse-en",
    "revision": 2,
    "title": "The Last Light in the Greenhouse",
    "language": "en",
    "source_documents": []
  },
  "opening": [
    "The last strip of sunlight rests on the greenhouse bench. Beside a drooping seedling, Rowan sets down a small watering can. “I haven't closed up yet. Would you like to look at this little one with me?” The soil is dry to the touch. The path home remains open behind you."
  ]
}

Look up the fields: manifest · entries

Next lesson