Constellation sky links

A sky is a map of skills for one activity: each skill is a star, and lines between stars say what to learn first. Constellation is an iPhone app for tracking practice this way, and a sky can also live entirely inside a link, at https://sky.alexhumphreys.me/s/#…. Everything after the # is the sky. The page that opens it runs in the browser and never sends the sky to a server.

This page explains the format, for people and for AI assistants. If someone asked you to make them a sky, the next section is all you need.

Making a sky for someone

Write JSON in this shape:

{
  "version": 2,
  "title": "Bouldering basics",
  "practices": [{ "name": "Bouldering" }],
  "stars": [
    { "name": "Straight arms" },
    { "name": "Quiet feet" },
    { "name": "Flagging", "prereqs": ["Straight arms"] },
    { "name": "Drop knee", "prereqs": ["Quiet feet"] },
    { "name": "Heel hook", "prereqs": ["Flagging"], "softPrereqs": ["Drop knee"],
      "notes": ["Pull with the hamstring, not the arms."] },
    { "name": "Dyno", "prereqs": ["Heel hook"] }
  ]
}

Then give it to them in one of two ways:

Guidelines that make a sky useful:

Every line is drawn on the sky, so a sky with fewer, truer lines reads better. When choosing prereqs:

Names in prereqs, softPrereqs, from and to can be star names, as above, or ids. Anything the page can't use is dropped and listed, never an error.

Fields

Top level:

Each star:

Unknown fields are kept and ignored, so links made by newer versions still open.

Take everything after the #.

In Python:

import base64, json, zlib
frag = link.split("#", 1)[1]
raw = base64.urlsafe_b64decode(frag + "=" * (-len(frag) % 4))
body = zlib.decompress(raw[6:], -15) if raw[1] & 1 else raw[6:]
sky = json.loads(body)

This link holds a two-star sky; decode it to check your reader:

https://sky.alexhumphreys.me/s/#AgHoVDm3bZHBTsMwDIZfxTLXdCpDYmJXLkhw23HqITReG5YmJXG3VdMkXoPX40lwBmObxCWKrN-_v9_eo_W1GwwlnC_R6TEMjAp9YKlUCkO0jfU4x1WIneai1w0VSXe9I5H1Udds62PzHq0RXZtyu-5I_k_am8T5kRpbz1K7ma3MvS7xIOaRNji_VSiaeGGx1c6dTR5bSlxwKHIZ2uDMH58QL-yOR0hUB5mioM3DILVhcIZisbWGWwWvJPQEHEfrG9CwtvW6GPpJDniKcELfCdG0LBWOOH8oy4P6hco9Z6jnH4dLkpfBN6TABP_18cnwNnT9BBYiB2c9gU6wXOYIVfXv3D5SpPej0zF_dY0yuyvzxtiyu9os5N3li20oJhvkUtPDNw

Privacy

The sky lives in the link, not on a server: the part after # is never sent when a page loads. The page counts visits with GoatCounter: it sends the page's path (/ or /s/), the site you came from, and a ?from= tag if the link has one, and nothing else. No cookies, and never the sky. Anyone with a link can read the whole sky, notes included, so share it the way you'd share the text inside it.