SkilStak Members Database

Beginning on May 1st 2019 I began to maintain membership data in a JSON flat-file database instead of Google Sheets. Anyone not enrolled on that date is not in the database and anyone leaving will automatically have their data purged after a length of time determined by that person’s VIP score, which accrues entropy over time.

[“Why should I stop using Google?”]

The SkilStak members database is stored in simple, private JSON files that are stored with each members sessions notes securely.

“Why save the data on skilstak.io?”

This data is saved with skilstak.io because the session-notes already are as well. This means that any given commit of this private data is saved along with the current state of the session log giving the most accurate representation of where a member is at any moment in time. While it is true the regular rebases of this skilstak.io repo are required for maintenance destroying historical change history, that last 16 weeks of commits is always kept for reference.

All data related to past members can be removed by removing this one directory.

In addition, any change to the data is captured as any change to any source code would be allowing the specific changes to be tracked by date and ensure that corrupt data can be identified and correct when and if mistakes are made.

Member Data is Always Private

Because the data is kept within hidden files they will never be published with the site publicly since all directories beginning with dot . are ignored by Netlify.

Data Model

Here’s the JSON version.

{
  "id": "sk555555",
  "name": { "first": "Rob", "last": "Muhlestein", "nick": "Mr. Rob" },
  "gender": "male",
  "school": "Brigham Young University",
  "contact": {
    "web": "robs.io",
    "phone": "704-555-5555",
    "email": "rwx@robs.io",
    "protonmail": "rwx",
    "google": "robmuh",
    "discord": "Mr. Rob#555555",
    "gitlab": "robmuh",
    "github": "robmuh",
    "address": {
      "line1": "528 Beaty St.",
      "city": "Davidson",
      "state": "NC",
      "zip": "28036"
    }
  },
  "vip": {
    "start": "2013-05-01",
    "bday": "1955-05-05",
    "wpm": 78,
    "miles": 0
  },
  "sponsors": [
    {"name": "Doris", "email": "some@body", "phone": "704-555-5555"}
  ],
  "reserved": [
    {"day": 3, "time": 18}
  ],
  "enrollment": [
    {
      "invoice": {num: "5555", "sum": 800, "paid": true},
      "note": null,
      "laptop": "sk",
      "sessions": [
        {"d": "2019-05-01", "t": "18", "p": "e0"},
        {"d": "2019-05-08", "t": "18", "p": "l6"},
        {"d": "2019-05-15", "t": "18", "p": "e2"},
        {"d": "2019-05-22", "t": "18", "p": "e0"},
        {"d": "2019-05-29", "t": "18", "x": "po, sick"},
        {"d": "2019-06-05", "t": "18", "p": "e4"},
        {"d": "2019-06-12", "t": "18", "x": "po, conf"},
        {"d": "2019-06-19", "t": "18", "p": "e0"},
        {"d": "2019-06-26", "t": "18", "X": "sick"},
        {"d": "2019-07-03", "t": "18"},
        {"d": "2019-07-10", "t": "18"},
        {"d": "2019-07-17", "t": "18"},
        {"d": "2019-07-24", "t": "18"},
        {"d": "2019-07-31", "t": "18"},
        {"d": "2019-08-07", "t": "18"},
        {"d": "2019-08-14", "t": "18"}
      ]
    }
  ]
}

Reserved

Indicates the weekday (Monday is 1) and time slot (military) reserved. This does not prevent attendance at different times as available during the Summer for workshops and camps or other available make-up options.

Generally, however, one should not expect there to be available time outside of this reserved time slot, which is rare because the schedule is usually full.

Sessions

Key Type Description
d str Date in ISO format.
t str Time in military ISO.
p int Arrival offset (e0 on time, l3 3 late).
x str Reason for excused miss.
X str Reason unexcused miss (if any)