The community quest catalog for the Golden Grace habit-RPG app. The app reads this repo over HTTPS (no server, no accounts, no tracking) and lets people search it, sort by rating, preview a quest, and add it to their own list. New quests are added by pull request, so review is the moderation.
A "quest" is just a habit: something you do on a schedule that earns XP and keeps your character (and pet) thriving.
A light index for browsing, and one folder per quest for the full detail (so we can add more to a quest later — extra media, variants — without bloating the index):
catalog.json # the browse INDEX: array of summaries
bundles.json # themed packs: array of bundles (each a list of quest ids)
quests/
morning-run/
quest.json # the quest's full parameters (no description text)
description.md # the description (or description.html)
… # future: image.png, video.mp4, etc.
drink-water/
quest.json
description.md
…
- Fetches
catalog.json(the index) to build the browse list. Cached on-device, with a bundled copy as offline fallback. - When someone opens a quest, fetches
quests/<id>/quest.json+quests/<id>/description.<md|html>. - Add turns it into a real, editable quest in their app — nothing here touches their data.
A single JSON array of summaries. Keep it light; it's just for the list, search, and sort.
| Field | Type | Required | Notes |
|---|---|---|---|
id |
string | ✅ | Unique, kebab-case, stable. Must match the folder name quests/<id>/. |
name |
string | ✅ | Display name. |
category |
string | Filter chip, e.g. Fitness, Health, Mind, Home, Finance, Social, Productivity. | |
tags |
string[] | Searchable keywords. | |
rating |
number | 0–5. Editorial; drives sort. |
|
icon |
string | An SF Symbol name. | |
colorHex |
string | "#RRGGBB". |
{ "id": "morning-run", "name": "Morning run", "category": "Fitness",
"tags": ["cardio", "outdoors"], "rating": 4.7, "icon": "figure.run", "colorHex": "#E8743B" }Everything needed to create the habit. The description text is not here — it lives in the
description file next to it. Only id and name are required.
| Field | Type | Notes |
|---|---|---|
id |
string | Same as the folder name and the index entry. |
name |
string | Display name. |
category, tags, rating, icon, colorHex |
— | Same meaning as the index (repeated here so the detail is self-contained). |
recurrence |
string | "daily" (default) · "weekly" · "monthly" · "yearly". |
daysOfWeek |
int[] | Weekly only. 0=Mon … 6=Sun. |
dayOfMonth |
int | Monthly only. 1–31 (clamps to month length). |
month, day |
int | Yearly only (month 1–12, day 1–31). |
times |
string[] | 24-hour "HH:mm". Omit for an "anytime" quest (no reminder). |
owner |
string | "character" (default) · "pet" — whose stats the quest boosts. |
stats |
string[] | Stats boosted. For owner: "character": vitality, fitness, wealth, social, grooming. For owner: "pet": cleanliness, health, wellness. |
xpValue |
int | XP per completion (default 10). XP always accrues to your character. |
notesFormat |
string | "markdown" (default) · "html" — tells the app whether to load description.md or description.html. |
author |
string | Your handle / credit. |
{
"id": "morning-run",
"name": "Morning run",
"category": "Fitness",
"tags": ["cardio", "outdoors"],
"rating": 4.7,
"recurrence": "daily",
"times": ["07:00"],
"stats": ["fitness", "vitality"],
"colorHex": "#E8743B",
"icon": "figure.run",
"xpValue": 15,
"notesFormat": "markdown",
"author": "your-handle"
}recurrence |
Extra fields | Meaning |
|---|---|---|
"daily" |
— | Every day. |
"weekly" |
daysOfWeek |
Those weekdays each week. |
"monthly" |
dayOfMonth |
That day each month. |
"yearly" |
month, day |
Once a year on that date. |
The text shown on the quest's preview. Markdown by default; use description.html (and set
"notesFormat": "html" in quest.json) if you need embedded images. 1–3 sentences is plenty.
A single JSON array of bundles. A bundle is a curated set of existing quests (e.g. "Sportsman",
"Balanced Person") that the app shows as a pack with one "Add all quests" button. Bundles only
reference quests by id — they never duplicate quest data.
| Field | Type | Required | Notes |
|---|---|---|---|
id |
string | ✅ | Unique, kebab-case, stable. |
name |
string | ✅ | Display name, e.g. "Sportsman". |
description |
string | One-line pitch shown on the card. | |
icon |
string | An SF Symbol name. | |
colorHex |
string | "#RRGGBB". |
|
questIds |
string[] | ✅ | The quests in the pack. Each must be an existing id in catalog.json. |
owner |
string | "character" (default) · "pet" — a "pet" bundle only appears when the pet is enabled. |
{ "id": "sportsman", "name": "Sportsman",
"description": "Build strength and endurance with a daily athletic routine.",
"icon": "figure.run", "colorHex": "#E8743B",
"questIds": ["morning-run", "strength-workout", "stretch", "walk-8k", "cold-shower"] }- Fork the repo and create a branch.
- Create the folder
quests/<your-id>/with:quest.json— the full parameters (table above).description.md(ordescription.html) — the description text.
- Add a matching summary object to
catalog.json(the index). Theidmust match the folder. - Open a pull request.
See CONTRIBUTING.md for validation commands.
idis unique, kebab-case, and stable — it's the folder name, the index key, and how the app de-dupes. Renaming it later orphans anyone who added it.iconmust be a real SF Symbol, or omit it.owneris"character"(default) or"pet". Set"pet"for cat-care quests.statsmust match the owner: character quests usevitality/fitness/wealth/social/grooming; pet quests usecleanliness/health/wellness. Stats outside the owner's set are ignored.timesare 24-hour"HH:mm"; omit for an anytime quest.ratingis honest and editorial — don't ship everything at 5.0.- Keep colors readable (
#RRGGBB). - Bundles (
bundles.json) only reference quests — everyquestIdsentry must be an existingidincatalog.json, or it's silently skipped when the pack is added.