chat / client / test / vectors / lobby-view.json
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
{
  "_": [
    "The lobby's golden vector — sueta.app.lobby (Phase 5a), the first UI vector",
    "in this repo. Inputs are the EDN state strings under `states`; `hiccup` and",
    "`html` are what `view` produces for each, and `steps` pins the pure state",
    "machine as [state, event, [state' effects]].",
    "",
    "There is NO generator script, on purpose. This was recorded once and read",
    "line by line against the screen; a snapshot refreshed from the code it",
    "constrains records the bug instead of catching it. Change the screen on",
    "purpose, then hand-edit here.",
    "",
    "`:now` is a field of the state rather than a call to js/Date.now, which is",
    "what makes '7m ago' pinnable at all. The four rooms below span all four",
    "branches of fmt-ago: 20s, 7min, 5h and 3d before :now."
  ],
  "hostileLabel": "<img src=x onerror=alert(1)>&\"'",
  "init": {
    "rooms": [
      {
        "s": "b1",
        "label": "kitchen",
        "ts": 1756399980000,
        "lts": 1756399999901
      },
      {
        "s": "b2",
        "label": "porch",
        "ts": 1756399580000
      }
    ],
    "now": 1756400000000,
    "state": "{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000}"
  },
  "states": {
    "empty": "{:rooms [], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000}",
    "list": "{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000}",
    "armed-b1": "{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed \"b1\", :join-bad? false, :now 1756400000000}",
    "armed-b2": "{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed \"b2\", :join-bad? false, :now 1756400000000}",
    "renaming-b1": "{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming \"b1\", :armed nil, :join-bad? false, :now 1756400000000}",
    "renaming-b2": "{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming \"b2\", :armed nil, :join-bad? false, :now 1756400000000}",
    "join-bad": "{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? true, :now 1756400000000}",
    "xss": "{:rooms [{:s \"b9\", :label \"<img src=x onerror=alert(1)>&\\\"'\", :ts 1756399980000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000}"
  },
  "hiccup": {
    "empty": "[:div.overlay.lobby [:div.modal.lobby-box [:h2 \"sueta\"] [:p \"p2p · end-to-end encrypted · rooms are private links,\" [:br] \"saved on your devices — never on a server\"] [:div.room-list [:p.hint \"no rooms yet — start one below\"]] [:form#new-room-form.new-room-form {:on {:submit [:create]}} [:input#new-room-name {:type \"text\", :maxlength \"40\", :placeholder \"new room name…\", :enterkeyhint \"go\", :autocomplete \"off\"}] [:button#new-room.primary {:type \"submit\"} \"➕ start\"]] [:form#join-form.new-room-form {:on {:submit [:join]}} [:input#join-link {:type \"text\", :placeholder \"…or paste an invite link\", :enterkeyhint \"go\", :autocomplete \"off\", :spellcheck \"false\"}] [:button#join-room.primary.ghosty {:type \"submit\"} \"join\"]] [:p.hint \"links open the room directly in a browser — in the installed app, paste the invite here\"] [:p.hint.ver \"version 0\"] [:div.lang-slot {:replicant/on-mount [:mount-lang-picker]}]]]",
    "list": "[:div.overlay.lobby [:div.modal.lobby-box [:h2 \"sueta\"] [:p \"p2p · end-to-end encrypted · rooms are private links,\" [:br] \"saved on your devices — never on a server\"] [:div.room-list ([:div.room-row {:replicant/key \"b1\"} [:button.room-open {:on {:click [:open \"b1\"]}} [:span.room-label \"kitchen\"] [:span.room-ago \"now\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b1\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b1\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b2\"} [:button.room-open {:on {:click [:open \"b2\"]}} [:span.room-label \"porch\"] [:span.room-ago \"7m ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b2\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b2\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b3\"} [:button.room-open {:on {:click [:open \"b3\"]}} [:span.room-label \"studio\"] [:span.room-ago \"5h ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b3\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b3\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b4\"} [:button.room-open {:on {:click [:open \"b4\"]}} [:span.room-label \"the loft\"] [:span.room-ago \"3d ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b4\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b4\"]}} \"🗑\"]])] [:form#new-room-form.new-room-form {:on {:submit [:create]}} [:input#new-room-name {:type \"text\", :maxlength \"40\", :placeholder \"new room name…\", :enterkeyhint \"go\", :autocomplete \"off\"}] [:button#new-room.primary {:type \"submit\"} \"➕ start\"]] [:form#join-form.new-room-form {:on {:submit [:join]}} [:input#join-link {:type \"text\", :placeholder \"…or paste an invite link\", :enterkeyhint \"go\", :autocomplete \"off\", :spellcheck \"false\"}] [:button#join-room.primary.ghosty {:type \"submit\"} \"join\"]] [:p.hint \"links open the room directly in a browser — in the installed app, paste the invite here\"] [:p.hint.ver \"version 0\"] [:div.lang-slot {:replicant/on-mount [:mount-lang-picker]}]]]",
    "armed-b1": "[:div.overlay.lobby [:div.modal.lobby-box [:h2 \"sueta\"] [:p \"p2p · end-to-end encrypted · rooms are private links,\" [:br] \"saved on your devices — never on a server\"] [:div.room-list ([:div.room-row {:replicant/key \"b1\"} [:button.room-open {:on {:click [:open \"b1\"]}} [:span.room-label \"kitchen\"] [:span.room-ago \"now\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b1\"]}} \"✎\"] [:button.icon-btn.small.forget {:class \"armed\", :title \"forget\", :on {:click [:forget-tap \"b1\"]}} \"sure?\"]] [:div.room-row {:replicant/key \"b2\"} [:button.room-open {:on {:click [:open \"b2\"]}} [:span.room-label \"porch\"] [:span.room-ago \"7m ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b2\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b2\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b3\"} [:button.room-open {:on {:click [:open \"b3\"]}} [:span.room-label \"studio\"] [:span.room-ago \"5h ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b3\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b3\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b4\"} [:button.room-open {:on {:click [:open \"b4\"]}} [:span.room-label \"the loft\"] [:span.room-ago \"3d ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b4\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b4\"]}} \"🗑\"]])] [:form#new-room-form.new-room-form {:on {:submit [:create]}} [:input#new-room-name {:type \"text\", :maxlength \"40\", :placeholder \"new room name…\", :enterkeyhint \"go\", :autocomplete \"off\"}] [:button#new-room.primary {:type \"submit\"} \"➕ start\"]] [:form#join-form.new-room-form {:on {:submit [:join]}} [:input#join-link {:type \"text\", :placeholder \"…or paste an invite link\", :enterkeyhint \"go\", :autocomplete \"off\", :spellcheck \"false\"}] [:button#join-room.primary.ghosty {:type \"submit\"} \"join\"]] [:p.hint \"links open the room directly in a browser — in the installed app, paste the invite here\"] [:p.hint.ver \"version 0\"] [:div.lang-slot {:replicant/on-mount [:mount-lang-picker]}]]]",
    "armed-b2": "[:div.overlay.lobby [:div.modal.lobby-box [:h2 \"sueta\"] [:p \"p2p · end-to-end encrypted · rooms are private links,\" [:br] \"saved on your devices — never on a server\"] [:div.room-list ([:div.room-row {:replicant/key \"b1\"} [:button.room-open {:on {:click [:open \"b1\"]}} [:span.room-label \"kitchen\"] [:span.room-ago \"now\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b1\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b1\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b2\"} [:button.room-open {:on {:click [:open \"b2\"]}} [:span.room-label \"porch\"] [:span.room-ago \"7m ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b2\"]}} \"✎\"] [:button.icon-btn.small.forget {:class \"armed\", :title \"forget\", :on {:click [:forget-tap \"b2\"]}} \"sure?\"]] [:div.room-row {:replicant/key \"b3\"} [:button.room-open {:on {:click [:open \"b3\"]}} [:span.room-label \"studio\"] [:span.room-ago \"5h ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b3\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b3\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b4\"} [:button.room-open {:on {:click [:open \"b4\"]}} [:span.room-label \"the loft\"] [:span.room-ago \"3d ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b4\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b4\"]}} \"🗑\"]])] [:form#new-room-form.new-room-form {:on {:submit [:create]}} [:input#new-room-name {:type \"text\", :maxlength \"40\", :placeholder \"new room name…\", :enterkeyhint \"go\", :autocomplete \"off\"}] [:button#new-room.primary {:type \"submit\"} \"➕ start\"]] [:form#join-form.new-room-form {:on {:submit [:join]}} [:input#join-link {:type \"text\", :placeholder \"…or paste an invite link\", :enterkeyhint \"go\", :autocomplete \"off\", :spellcheck \"false\"}] [:button#join-room.primary.ghosty {:type \"submit\"} \"join\"]] [:p.hint \"links open the room directly in a browser — in the installed app, paste the invite here\"] [:p.hint.ver \"version 0\"] [:div.lang-slot {:replicant/on-mount [:mount-lang-picker]}]]]",
    "renaming-b1": "[:div.overlay.lobby [:div.modal.lobby-box [:h2 \"sueta\"] [:p \"p2p · end-to-end encrypted · rooms are private links,\" [:br] \"saved on your devices — never on a server\"] [:div.room-list ([:div.room-row {:replicant/key \"b1\"} [:input.rename-in {:type \"text\", :maxlength \"40\", :value \"kitchen\", :enterkeyhint \"done\", :on {:keydown [:rename-key \"b1\"], :blur [:rename-blur \"b1\"]}, :replicant/on-mount [:focus-rename \"b1\"]}]] [:div.room-row {:replicant/key \"b2\"} [:button.room-open {:on {:click [:open \"b2\"]}} [:span.room-label \"porch\"] [:span.room-ago \"7m ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b2\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b2\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b3\"} [:button.room-open {:on {:click [:open \"b3\"]}} [:span.room-label \"studio\"] [:span.room-ago \"5h ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b3\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b3\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b4\"} [:button.room-open {:on {:click [:open \"b4\"]}} [:span.room-label \"the loft\"] [:span.room-ago \"3d ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b4\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b4\"]}} \"🗑\"]])] [:form#new-room-form.new-room-form {:on {:submit [:create]}} [:input#new-room-name {:type \"text\", :maxlength \"40\", :placeholder \"new room name…\", :enterkeyhint \"go\", :autocomplete \"off\"}] [:button#new-room.primary {:type \"submit\"} \"➕ start\"]] [:form#join-form.new-room-form {:on {:submit [:join]}} [:input#join-link {:type \"text\", :placeholder \"…or paste an invite link\", :enterkeyhint \"go\", :autocomplete \"off\", :spellcheck \"false\"}] [:button#join-room.primary.ghosty {:type \"submit\"} \"join\"]] [:p.hint \"links open the room directly in a browser — in the installed app, paste the invite here\"] [:p.hint.ver \"version 0\"] [:div.lang-slot {:replicant/on-mount [:mount-lang-picker]}]]]",
    "renaming-b2": "[:div.overlay.lobby [:div.modal.lobby-box [:h2 \"sueta\"] [:p \"p2p · end-to-end encrypted · rooms are private links,\" [:br] \"saved on your devices — never on a server\"] [:div.room-list ([:div.room-row {:replicant/key \"b1\"} [:button.room-open {:on {:click [:open \"b1\"]}} [:span.room-label \"kitchen\"] [:span.room-ago \"now\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b1\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b1\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b2\"} [:input.rename-in {:type \"text\", :maxlength \"40\", :value \"porch\", :enterkeyhint \"done\", :on {:keydown [:rename-key \"b2\"], :blur [:rename-blur \"b2\"]}, :replicant/on-mount [:focus-rename \"b2\"]}]] [:div.room-row {:replicant/key \"b3\"} [:button.room-open {:on {:click [:open \"b3\"]}} [:span.room-label \"studio\"] [:span.room-ago \"5h ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b3\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b3\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b4\"} [:button.room-open {:on {:click [:open \"b4\"]}} [:span.room-label \"the loft\"] [:span.room-ago \"3d ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b4\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b4\"]}} \"🗑\"]])] [:form#new-room-form.new-room-form {:on {:submit [:create]}} [:input#new-room-name {:type \"text\", :maxlength \"40\", :placeholder \"new room name…\", :enterkeyhint \"go\", :autocomplete \"off\"}] [:button#new-room.primary {:type \"submit\"} \"➕ start\"]] [:form#join-form.new-room-form {:on {:submit [:join]}} [:input#join-link {:type \"text\", :placeholder \"…or paste an invite link\", :enterkeyhint \"go\", :autocomplete \"off\", :spellcheck \"false\"}] [:button#join-room.primary.ghosty {:type \"submit\"} \"join\"]] [:p.hint \"links open the room directly in a browser — in the installed app, paste the invite here\"] [:p.hint.ver \"version 0\"] [:div.lang-slot {:replicant/on-mount [:mount-lang-picker]}]]]",
    "join-bad": "[:div.overlay.lobby [:div.modal.lobby-box [:h2 \"sueta\"] [:p \"p2p · end-to-end encrypted · rooms are private links,\" [:br] \"saved on your devices — never on a server\"] [:div.room-list ([:div.room-row {:replicant/key \"b1\"} [:button.room-open {:on {:click [:open \"b1\"]}} [:span.room-label \"kitchen\"] [:span.room-ago \"now\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b1\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b1\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b2\"} [:button.room-open {:on {:click [:open \"b2\"]}} [:span.room-label \"porch\"] [:span.room-ago \"7m ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b2\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b2\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b3\"} [:button.room-open {:on {:click [:open \"b3\"]}} [:span.room-label \"studio\"] [:span.room-ago \"5h ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b3\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b3\"]}} \"🗑\"]] [:div.room-row {:replicant/key \"b4\"} [:button.room-open {:on {:click [:open \"b4\"]}} [:span.room-label \"the loft\"] [:span.room-ago \"3d ago\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b4\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b4\"]}} \"🗑\"]])] [:form#new-room-form.new-room-form {:on {:submit [:create]}} [:input#new-room-name {:type \"text\", :maxlength \"40\", :placeholder \"new room name…\", :enterkeyhint \"go\", :autocomplete \"off\"}] [:button#new-room.primary {:type \"submit\"} \"➕ start\"]] [:form#join-form.new-room-form {:on {:submit [:join]}} [:input#join-link {:type \"text\", :placeholder \"that's not an invite link — paste the full link\", :enterkeyhint \"go\", :autocomplete \"off\", :spellcheck \"false\"}] [:button#join-room.primary.ghosty {:type \"submit\"} \"join\"]] [:p.hint \"links open the room directly in a browser — in the installed app, paste the invite here\"] [:p.hint.ver \"version 0\"] [:div.lang-slot {:replicant/on-mount [:mount-lang-picker]}]]]",
    "xss": "[:div.overlay.lobby [:div.modal.lobby-box [:h2 \"sueta\"] [:p \"p2p · end-to-end encrypted · rooms are private links,\" [:br] \"saved on your devices — never on a server\"] [:div.room-list ([:div.room-row {:replicant/key \"b9\"} [:button.room-open {:on {:click [:open \"b9\"]}} [:span.room-label \"<img src=x onerror=alert(1)>&\\\"'\"] [:span.room-ago \"now\"]] [:button.icon-btn.small {:title \"rename\", :on {:click [:rename-start \"b9\"]}} \"✎\"] [:button.icon-btn.small.forget {:class nil, :title \"forget\", :on {:click [:forget-tap \"b9\"]}} \"🗑\"]])] [:form#new-room-form.new-room-form {:on {:submit [:create]}} [:input#new-room-name {:type \"text\", :maxlength \"40\", :placeholder \"new room name…\", :enterkeyhint \"go\", :autocomplete \"off\"}] [:button#new-room.primary {:type \"submit\"} \"➕ start\"]] [:form#join-form.new-room-form {:on {:submit [:join]}} [:input#join-link {:type \"text\", :placeholder \"…or paste an invite link\", :enterkeyhint \"go\", :autocomplete \"off\", :spellcheck \"false\"}] [:button#join-room.primary.ghosty {:type \"submit\"} \"join\"]] [:p.hint \"links open the room directly in a browser — in the installed app, paste the invite here\"] [:p.hint.ver \"version 0\"] [:div.lang-slot {:replicant/on-mount [:mount-lang-picker]}]]]"
  },
  "html": {
    "empty": "<div class=\"overlay lobby\"><div class=\"modal lobby-box\"><h2>sueta</h2><p>p2p · end-to-end encrypted · rooms are private links,<br>saved on your devices — never on a server</p><div class=\"room-list\"><p class=\"hint\">no rooms yet — start one below</p></div><form id=\"new-room-form\" class=\"new-room-form\"><input type=\"text\" maxlength=\"40\" placeholder=\"new room name…\" enterkeyhint=\"go\" autocomplete=\"off\" id=\"new-room-name\"><button type=\"submit\" id=\"new-room\" class=\"primary\">➕ start</button></form><form id=\"join-form\" class=\"new-room-form\"><input type=\"text\" placeholder=\"…or paste an invite link\" enterkeyhint=\"go\" autocomplete=\"off\" spellcheck=\"false\" id=\"join-link\"><button type=\"submit\" id=\"join-room\" class=\"primary ghosty\">join</button></form><p class=\"hint\">links open the room directly in a browser — in the installed app, paste the invite here</p><p class=\"hint ver\">version 0</p><div class=\"lang-slot\"></div></div></div>",
    "list": "<div class=\"overlay lobby\"><div class=\"modal lobby-box\"><h2>sueta</h2><p>p2p · end-to-end encrypted · rooms are private links,<br>saved on your devices — never on a server</p><div class=\"room-list\"><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">kitchen</span><span class=\"room-ago\">now</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">porch</span><span class=\"room-ago\">7m ago</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">studio</span><span class=\"room-ago\">5h ago</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">the loft</span><span class=\"room-ago\">3d ago</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div></div><form id=\"new-room-form\" class=\"new-room-form\"><input type=\"text\" maxlength=\"40\" placeholder=\"new room name…\" enterkeyhint=\"go\" autocomplete=\"off\" id=\"new-room-name\"><button type=\"submit\" id=\"new-room\" class=\"primary\">➕ start</button></form><form id=\"join-form\" class=\"new-room-form\"><input type=\"text\" placeholder=\"…or paste an invite link\" enterkeyhint=\"go\" autocomplete=\"off\" spellcheck=\"false\" id=\"join-link\"><button type=\"submit\" id=\"join-room\" class=\"primary ghosty\">join</button></form><p class=\"hint\">links open the room directly in a browser — in the installed app, paste the invite here</p><p class=\"hint ver\">version 0</p><div class=\"lang-slot\"></div></div></div>",
    "armed-b2": "<div class=\"overlay lobby\"><div class=\"modal lobby-box\"><h2>sueta</h2><p>p2p · end-to-end encrypted · rooms are private links,<br>saved on your devices — never on a server</p><div class=\"room-list\"><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">kitchen</span><span class=\"room-ago\">now</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">porch</span><span class=\"room-ago\">7m ago</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"armed icon-btn small forget\">sure?</button></div><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">studio</span><span class=\"room-ago\">5h ago</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">the loft</span><span class=\"room-ago\">3d ago</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div></div><form id=\"new-room-form\" class=\"new-room-form\"><input type=\"text\" maxlength=\"40\" placeholder=\"new room name…\" enterkeyhint=\"go\" autocomplete=\"off\" id=\"new-room-name\"><button type=\"submit\" id=\"new-room\" class=\"primary\">➕ start</button></form><form id=\"join-form\" class=\"new-room-form\"><input type=\"text\" placeholder=\"…or paste an invite link\" enterkeyhint=\"go\" autocomplete=\"off\" spellcheck=\"false\" id=\"join-link\"><button type=\"submit\" id=\"join-room\" class=\"primary ghosty\">join</button></form><p class=\"hint\">links open the room directly in a browser — in the installed app, paste the invite here</p><p class=\"hint ver\">version 0</p><div class=\"lang-slot\"></div></div></div>",
    "renaming-b2": "<div class=\"overlay lobby\"><div class=\"modal lobby-box\"><h2>sueta</h2><p>p2p · end-to-end encrypted · rooms are private links,<br>saved on your devices — never on a server</p><div class=\"room-list\"><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">kitchen</span><span class=\"room-ago\">now</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div><div class=\"room-row\"><input type=\"text\" maxlength=\"40\" value=\"porch\" enterkeyhint=\"done\" class=\"rename-in\"></div><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">studio</span><span class=\"room-ago\">5h ago</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">the loft</span><span class=\"room-ago\">3d ago</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div></div><form id=\"new-room-form\" class=\"new-room-form\"><input type=\"text\" maxlength=\"40\" placeholder=\"new room name…\" enterkeyhint=\"go\" autocomplete=\"off\" id=\"new-room-name\"><button type=\"submit\" id=\"new-room\" class=\"primary\">➕ start</button></form><form id=\"join-form\" class=\"new-room-form\"><input type=\"text\" placeholder=\"…or paste an invite link\" enterkeyhint=\"go\" autocomplete=\"off\" spellcheck=\"false\" id=\"join-link\"><button type=\"submit\" id=\"join-room\" class=\"primary ghosty\">join</button></form><p class=\"hint\">links open the room directly in a browser — in the installed app, paste the invite here</p><p class=\"hint ver\">version 0</p><div class=\"lang-slot\"></div></div></div>",
    "join-bad": "<div class=\"overlay lobby\"><div class=\"modal lobby-box\"><h2>sueta</h2><p>p2p · end-to-end encrypted · rooms are private links,<br>saved on your devices — never on a server</p><div class=\"room-list\"><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">kitchen</span><span class=\"room-ago\">now</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">porch</span><span class=\"room-ago\">7m ago</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">studio</span><span class=\"room-ago\">5h ago</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">the loft</span><span class=\"room-ago\">3d ago</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div></div><form id=\"new-room-form\" class=\"new-room-form\"><input type=\"text\" maxlength=\"40\" placeholder=\"new room name…\" enterkeyhint=\"go\" autocomplete=\"off\" id=\"new-room-name\"><button type=\"submit\" id=\"new-room\" class=\"primary\">➕ start</button></form><form id=\"join-form\" class=\"new-room-form\"><input type=\"text\" placeholder=\"that&apos;s not an invite link — paste the full link\" enterkeyhint=\"go\" autocomplete=\"off\" spellcheck=\"false\" id=\"join-link\"><button type=\"submit\" id=\"join-room\" class=\"primary ghosty\">join</button></form><p class=\"hint\">links open the room directly in a browser — in the installed app, paste the invite here</p><p class=\"hint ver\">version 0</p><div class=\"lang-slot\"></div></div></div>",
    "xss": "<div class=\"overlay lobby\"><div class=\"modal lobby-box\"><h2>sueta</h2><p>p2p · end-to-end encrypted · rooms are private links,<br>saved on your devices — never on a server</p><div class=\"room-list\"><div class=\"room-row\"><button class=\"room-open\"><span class=\"room-label\">&lt;img src=x onerror=alert(1)&gt;&amp;&#39;&apos;</span><span class=\"room-ago\">now</span></button><button title=\"rename\" class=\"icon-btn small\">✎</button><button title=\"forget\" class=\"icon-btn small forget\">🗑</button></div></div><form id=\"new-room-form\" class=\"new-room-form\"><input type=\"text\" maxlength=\"40\" placeholder=\"new room name…\" enterkeyhint=\"go\" autocomplete=\"off\" id=\"new-room-name\"><button type=\"submit\" id=\"new-room\" class=\"primary\">➕ start</button></form><form id=\"join-form\" class=\"new-room-form\"><input type=\"text\" placeholder=\"…or paste an invite link\" enterkeyhint=\"go\" autocomplete=\"off\" spellcheck=\"false\" id=\"join-link\"><button type=\"submit\" id=\"join-room\" class=\"primary ghosty\">join</button></form><p class=\"hint\">links open the room directly in a browser — in the installed app, paste the invite here</p><p class=\"hint ver\">version 0</p><div class=\"lang-slot\"></div></div></div>"
  },
  "steps": [
    [
      "list",
      "[:open \"b1\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} [[:resolve \"b1\"]]]"
    ],
    [
      "list",
      "[:rename-start \"b2\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming \"b2\", :armed nil, :join-bad? false, :now 1756400000000} []]"
    ],
    [
      "renaming-b2",
      "[:rename-commit \"b2\" \"  study  \"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} [[:rename \"b2\" \"study\"] [:reload]]]"
    ],
    [
      "renaming-b2",
      "[:rename-commit \"b2\" \"   \"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} []]"
    ],
    [
      "renaming-b2",
      "[:rename-cancel]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} []]"
    ],
    [
      "list",
      "[:rename-commit \"b2\" \"sneaky\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} []]"
    ],
    [
      "list",
      "[:forget-tap \"b2\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed \"b2\", :join-bad? false, :now 1756400000000} [[:disarm-after 3500 \"b2\"]]]"
    ],
    [
      "armed-b2",
      "[:forget-tap \"b2\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} [[:forget \"b2\"] [:reload]]]"
    ],
    [
      "armed-b2",
      "[:forget-tap \"b1\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed \"b1\", :join-bad? false, :now 1756400000000} [[:disarm-after 3500 \"b1\"]]]"
    ],
    [
      "armed-b2",
      "[:disarm \"b2\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} []]"
    ],
    [
      "armed-b2",
      "[:disarm \"b1\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed \"b2\", :join-bad? false, :now 1756400000000} []]"
    ],
    [
      "list",
      "[:join \"https://chat.ardegazu.ro/#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} [[:touch \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ\"] [:resolve \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ\"]]]"
    ],
    [
      "list",
      "[:join \"#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ&relay\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} [[:touch \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ\"] [:resolve \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ\"]]]"
    ],
    [
      "list",
      "[:join \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} [[:touch \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ\"] [:resolve \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ\"]]]"
    ],
    [
      "list",
      "[:join \"https://x.example/cb?state=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ&next=1\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? true, :now 1756400000000} [[:clear-join]]]"
    ],
    [
      "list",
      "[:join \"not a link\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? true, :now 1756400000000} [[:clear-join]]]"
    ],
    [
      "join-bad",
      "[:join \"#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ\"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} [[:touch \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ\"] [:resolve \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ\"]]]"
    ],
    [
      "list",
      "[:create \"  study  \"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} [[:create \"study\"]]]"
    ],
    [
      "list",
      "[:create \"   \"]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} [[:create \"\"]]]"
    ],
    [
      "list",
      "[:rooms-loaded []]",
      "[{:rooms [], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} []]"
    ],
    [
      "list",
      "[:nonsense]",
      "[{:rooms [{:s \"b1\", :label \"kitchen\", :ts 1756399980000} {:s \"b2\", :label \"porch\", :ts 1756399580000} {:s \"b3\", :label \"studio\", :ts 1756382000000} {:s \"b4\", :label \"the loft\", :ts 1756140800000}], :renaming nil, :armed nil, :join-bad? false, :now 1756400000000} []]"
    ]
  ]
}

static mirror of HEAD · about · clone: git clone https://git.ardegazu.ro/chat.git