habits-free.openapps.xyz

Source

This app’s code and revision history are public. Download a copy or explore the files below.

Public
The app’s code and revision history are public.
Owned app · rev bc888334fc51
Run it yourself
Take the whole tree and run it on your own machine. The download needs no account. Cloning needs a sign-in.
Download .zip
bounded clone e8a688fd21351d04b05468df
A copy you download is not bounded. The guarantees this app runs under - declared egress, proven invariants, writes that fail closed - live in the runtime serving this page, not in the files. What you get is auditable source you can read and run, with no runtime guarantees attached.
← All files
policy-tests/sharing.json
{
 "version": "1",
 "name": "a shared habit: the link is the permission, each person writes only their own streak",
 "actors": {
  "Ann": "ann_user",
  "Ben": "ben_user",
  "Eve": "eve_user"
 },
 "steps": [
  {
   "op": "setTime",
   "epoch": 1800000000
  },
  {
   "op": "as",
   "who": "Ann"
  },
  {
   "op": "setMany",
   "writes": [
    {
     "path": "teams/aaaaaaaaaaaaaaaaaaaa",
     "data": {
      "name": "Read 10 pages",
      "kind": "count",
      "target": 10,
      "unit": "pages",
      "schedule": "{\"type\":\"daily\"}",
      "createdBy": "ben_user",
      "createdAt": 1800000000
     }
    },
    {
     "path": "teams/aaaaaaaaaaaaaaaaaaaa/joins/ann_user",
     "data": {
      "at": 1800000000
     }
    }
   ],
   "shouldFail": true
  },
  {
   "op": "setMany",
   "writes": [
    {
     "path": "teams/aaaaaaaaaaaaaaaaaaaa",
     "data": {
      "name": "Read 10 pages",
      "kind": "count",
      "target": 10,
      "unit": "pages",
      "schedule": "{\"type\":\"daily\"}",
      "createdBy": "ann_user",
      "createdAt": 1800009999
     }
    },
    {
     "path": "teams/aaaaaaaaaaaaaaaaaaaa/joins/ann_user",
     "data": {
      "at": 1800000000
     }
    }
   ],
   "shouldFail": true
  },
  {
   "op": "setMany",
   "writes": [
    {
     "path": "teams/short",
     "data": {
      "name": "Read 10 pages",
      "kind": "count",
      "target": 10,
      "unit": "pages",
      "schedule": "{\"type\":\"daily\"}",
      "createdBy": "ann_user",
      "createdAt": 1800000000
     }
    },
    {
     "path": "teams/short/joins/ann_user",
     "data": {
      "at": 1800000000
     }
    }
   ],
   "shouldFail": true
  },
  {
   "op": "setMany",
   "writes": [
    {
     "path": "teams/aaaaaaaaaaaaaaaaaaaa",
     "data": {
      "name": "Read 10 pages",
      "kind": "money",
      "target": 10,
      "unit": "pages",
      "schedule": "{\"type\":\"daily\"}",
      "createdBy": "ann_user",
      "createdAt": 1800000000
     }
    },
    {
     "path": "teams/aaaaaaaaaaaaaaaaaaaa/joins/ann_user",
     "data": {
      "at": 1800000000
     }
    }
   ],
   "shouldFail": true
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa",
   "data": {
    "name": "Read 10 pages",
    "kind": "count",
    "target": 10,
    "unit": "pages",
    "schedule": "{\"type\":\"daily\"}",
    "createdBy": "ann_user",
    "createdAt": 1800000000
   },
   "shouldFail": true
  },
  {
   "op": "setMany",
   "writes": [
    {
     "path": "teams/aaaaaaaaaaaaaaaaaaaa",
     "data": {
      "name": "Read 10 pages",
      "kind": "count",
      "target": 10,
      "unit": "pages",
      "schedule": "{\"type\":\"daily\"}",
      "createdBy": "ann_user",
      "createdAt": 1800000000
     }
    },
    {
     "path": "teams/aaaaaaaaaaaaaaaaaaaa/joins/ann_user",
     "data": {
      "at": 1800000000
     }
    },
    {
     "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ann_user",
     "data": {
      "name": "Ann",
      "streak": 3,
      "best": 5,
      "unit": "day",
      "last": "2027-01-15"
     }
    }
   ]
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ann_user",
   "data": {
    "name": "Ann",
    "streak": 3,
    "best": 5,
    "unit": "day",
    "last": "2027-01-15",
    "note": "anything else"
   },
   "shouldFail": true
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/chat/c1",
   "data": {
    "text": "hi"
   },
   "shouldFail": true
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa",
   "data": {
    "name": "Renamed"
   },
   "shouldFail": true
  },
  {
   "op": "as",
   "who": "Eve"
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/eve_user",
   "data": {
    "name": "Eve",
    "streak": 1,
    "best": 1,
    "unit": "day",
    "last": "2027-01-15"
   },
   "shouldFail": true
  },
  {
   "op": "as",
   "who": "Ben"
  },
  {
   "op": "set",
   "path": "teams/bbbbbbbbbbbbbbbbbbbb/joins/ben_user",
   "data": {
    "at": 1800000000
   },
   "shouldFail": true
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/joins/eve_user",
   "data": {
    "at": 1800000000
   },
   "shouldFail": true
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/joins/ben_user",
   "data": {
    "at": 1800000000
   }
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/joins/ben_user",
   "data": {
    "at": 1700000000
   },
   "shouldFail": true
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ben_user",
   "data": {
    "name": "Ben",
    "streak": 2,
    "best": 1,
    "unit": "day",
    "last": "2027-01-15"
   },
   "shouldFail": true
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ben_user",
   "data": {
    "name": "Ben",
    "streak": 2,
    "best": 4,
    "unit": "year",
    "last": "2027-01-15"
   },
   "shouldFail": true
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ben_user",
   "data": {
    "name": "Ben",
    "streak": 2,
    "best": 4,
    "unit": "day",
    "last": "yesterday"
   },
   "shouldFail": true
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ben_user",
   "data": {
    "name": "",
    "streak": 2,
    "best": 4,
    "unit": "day",
    "last": "2027-01-15"
   },
   "shouldFail": true
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ben_user",
   "data": {
    "name": "Ben",
    "streak": 2,
    "best": 4,
    "unit": "day",
    "last": "2027-01-15"
   }
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ben_user",
   "data": {
    "name": "Ben",
    "streak": 3,
    "best": 4,
    "unit": "day",
    "last": "2027-01-16"
   }
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ann_user",
   "data": {
    "name": "Ann",
    "streak": 0,
    "best": 0,
    "unit": "day",
    "last": "2027-01-15"
   },
   "shouldFail": true
  },
  {
   "op": "delete",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ann_user",
   "shouldFail": true
  },
  {
   "op": "delete",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/joins/ann_user",
   "shouldFail": true
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa",
   "data": {
    "name": "Taken over",
    "kind": "count",
    "target": 10,
    "unit": "pages",
    "schedule": "{\"type\":\"daily\"}",
    "createdBy": "ann_user",
    "createdAt": 1800000000
   },
   "shouldFail": true
  },
  {
   "op": "expect",
   "expr": "get(/teams/aaaaaaaaaaaaaaaaaaaa/members/ann_user).streak == 3"
  },
  {
   "op": "expect",
   "expr": "get(/teams/aaaaaaaaaaaaaaaaaaaa/members/ben_user).streak == 3"
  },
  {
   "op": "expect",
   "expr": "get(/teams/aaaaaaaaaaaaaaaaaaaa).name == 'Read 10 pages'"
  },
  {
   "op": "deleteMany",
   "paths": [
    "teams/aaaaaaaaaaaaaaaaaaaa/members/ben_user",
    "teams/aaaaaaaaaaaaaaaaaaaa/joins/ben_user"
   ]
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ben_user",
   "data": {
    "name": "Ben",
    "streak": 4,
    "best": 4,
    "unit": "day",
    "last": "2027-01-15"
   },
   "shouldFail": true
  },
  {
   "op": "as",
   "who": "Ann"
  },
  {
   "op": "set",
   "path": "teams/aaaaaaaaaaaaaaaaaaaa/members/ann_user",
   "data": {
    "name": "Ann",
    "streak": 4,
    "best": 5,
    "unit": "without",
    "last": ""
   }
  }
 ]
}

Change history

Point OpenApps links to openapps.free
bc888334fc · 18 hours ago
Bind agent address in policy
1f744a2b83 · 19 hours ago
Use OpenApp service URLs and add contribution strip
a9bb601ee0 · 19 hours ago
Bounded source sync
5646afc3a0 · 1 day ago
Bounded source sync
f1b1bac8d6 · 1 day ago
Bounded source sync
b1e14b41b0 · 1 day ago