eleven / ocho Public

Clone
git clone https://amadan.net/eleven/ocho

Plain git — no account needed to clone.

Download

Download this file

1{
2 "schema": 1,
3 "flow": "setup",
4 "entry": "hello",
5 "resumedIf": {
6 "any": [
7 "done.name",
8 "done.group",
9 "done.email",
10 "done.photo",
11 "done.invites",
12 "done.extras",
13 "done.keys"
14 ]
15 },
16 "resumeUnless": {
17 "all": [
18 "bridge.enrolled",
19 "!done.keys"
20 ]
21 },
22 "resumeSay": "Welcome back β€” let's pick up where we left off.",
23 "steps": [
24 {
25 "id": "hello",
26 "skipIf": [
27 "resumed"
28 ],
29 "bubbles": [
30 {
31 "text": "Hi β€” I'm Eleven! πŸ‘‹ This is your space now: everything in it is end-to-end encrypted, and you're its administrator.\n\nLet's take two minutes to set things up."
32 }
33 ],
34 "auto": "name"
35 },
36 {
37 "id": "name",
38 "entries": [
39 {
40 "if": "bridge.myName",
41 "recordIfNew": {
42 "label": "noted the name you go by",
43 "value": "known"
44 },
45 "goto": "group"
46 }
47 ],
48 "skipIf": [
49 "done"
50 ],
51 "skipTo": "group",
52 "bubbles": [
53 {
54 "text": "First β€” what should everyone here call you? Reply with your name.",
55 "label": "Your name:",
56 "hint": "e.g. Finn Wolfhard"
57 }
58 ],
59 "chips": [
60 {
61 "label": "Fill in a form instead",
62 "trailing": true,
63 "advancing": false,
64 "effect": {
65 "verb": "openQuickForm"
66 }
67 }
68 ],
69 "input": {
70 "kind": "text",
71 "required": true,
72 "maxLen": 32,
73 "clean": "name",
74 "confirm": {
75 "when": "email",
76 "goto": "name-email"
77 }
78 },
79 "effect": {
80 "verb": "setMyName",
81 "args": [
82 "$answer"
83 ]
84 },
85 "on": {
86 "ok": {
87 "record": {
88 "label": "noted: you're {vars.answer}",
89 "value": "$answer"
90 },
91 "ack": "Lovely to meet you, {vars.answer}! 🀝",
92 "goto": "group"
93 }
94 }
95 },
96 {
97 "id": "name-email",
98 "bubbles": [
99 {
100 "text": "That's an email address β€” is that what you'd like to be called here? It's the name everyone in this space sees.",
101 "key": "q-name-email"
102 }
103 ],
104 "chips": [
105 {
106 "label": "Use it anyway",
107 "spent": "Kept",
108 "effect": {
109 "verb": "setMyName",
110 "args": [
111 "$answer"
112 ]
113 },
114 "record": {
115 "step": "name",
116 "label": "noted: you're {vars.answer}",
117 "value": "$answer"
118 },
119 "ack": "Righto β€” {vars.answer} it is. 🀝",
120 "goto": "group"
121 },
122 {
123 "label": "Type a different name",
124 "spent": "Changed",
125 "goto": "name"
126 }
127 ]
128 },
129 {
130 "id": "group",
131 "skipIf": [
132 "done"
133 ],
134 "bubbles": [
135 {
136 "text": "{ack?}Next, this space needs a name. It's the one everyone sees β€” on the sign-in page, in invites, on the app icon.",
137 "key": "q-group"
138 },
139 {
140 "text": {
141 "if": "space.nameSet",
142 "then": "It's currently β€œ{space.name}” β€” keep that, or reply with a new name.",
143 "else": "What should we call it? Reply with a name."
144 },
145 "label": "Space name:",
146 "hint": "e.g. The Book Club"
147 }
148 ],
149 "chips": [
150 {
151 "if": "space.nameSet",
152 "label": "Keep β€œ{space.name}”",
153 "spent": "Kept",
154 "goto": "email"
155 }
156 ],
157 "input": {
158 "kind": "text",
159 "required": true
160 },
161 "effect": {
162 "verb": "setGroupName",
163 "args": [
164 "$answer"
165 ]
166 },
167 "on": {
168 "ok": {
169 "set": {
170 "space.name": "$answer"
171 },
172 "record": {
173 "label": "named this space β€œ{vars.answer}”",
174 "value": "$answer"
175 },
176 "goto": "email"
177 },
178 "invalid": {
179 "say": "Hmm, that name didn't stick β€” it needs to be 1–60 characters. Try another?",
180 "retry": "step"
181 },
182 "error": {
183 "say": "Something went wrong saving that β€” it's not the name's fault. Give it another go in a moment.",
184 "retry": "step"
185 }
186 }
187 },
188 {
189 "id": "email",
190 "skipIf": [
191 "done"
192 ],
193 "bubbles": [
194 {
195 "text": "Your contact email is shared with members β€” useful if someone's locked out, or something needs a human. It's optional."
196 },
197 {
198 "text": "How can people here reach you outside the chat? Reply with an email address, or skip it.",
199 "label": "Contact email:",
200 "hint": "e.g. finn@example.com"
201 }
202 ],
203 "chips": [
204 {
205 "label": "Skip for now",
206 "spent": "Skipped",
207 "record": {
208 "label": "skipped the contact email",
209 "value": "skipped"
210 },
211 "goto": "photo"
212 }
213 ],
214 "input": {
215 "kind": "text"
216 },
217 "effect": {
218 "verb": "setContactEmail",
219 "args": [
220 "$answer"
221 ]
222 },
223 "on": {
224 "ok": {
225 "record": {
226 "label": "noted a contact email",
227 "value": "$answer"
228 },
229 "goto": "photo"
230 },
231 "invalid": {
232 "ask": "That doesn't look like an email address β€” try again, or skip it."
233 },
234 "error": {
235 "ask": "Something went wrong saving that β€” try again in a moment, or skip it."
236 }
237 }
238 },
239 {
240 "id": "photo",
241 "skipIf": [
242 "done",
243 "native"
244 ],
245 "skipTo": "invites",
246 "bubbles": [
247 {
248 "text": "Want to give this space a face? The photo shows on the welcome page and when people join β€” you can always change it later."
249 },
250 {
251 "text": "Send me a photo β€” tap the + next to the message box, or just drag a picture into the chat, and hit send. Type a message with it if you want to include alt text.",
252 "attachHint": "Optional: type alt text for the photo"
253 }
254 ],
255 "chips": [
256 {
257 "label": "Skip for now",
258 "spent": "Skipped",
259 "cancelInput": true,
260 "record": {
261 "label": "skipped the space photo",
262 "value": "skipped"
263 },
264 "goto": "invites"
265 }
266 ],
267 "input": {
268 "kind": "photo",
269 "reject": {
270 "text": "Send it as a picture β€” tap the + next to the message box or drag one in β€” or tap Skip."
271 }
272 },
273 "effect": {
274 "verb": "adoptServerPhoto"
275 },
276 "on": {
277 "ok": {
278 "set": {
279 "vars.photoAlt": "$answerText"
280 },
281 "goto": "photo-preview"
282 },
283 "error": {
284 "say": "Hmm, I couldn't use that one β€” try another?",
285 "ask": "Send another photo when you're ready, or skip it."
286 }
287 }
288 },
289 {
290 "id": "photo-preview",
291 "bubbles": [
292 {
293 "text": [
294 "Here's how it looks.",
295 {
296 "if": "vars.photoAlt",
297 "text": "\n\nIts alt text is the message you sent β€” β€œ{vars.photoAlt}” β€” and like the photo itself it's PUBLIC: anyone with an invite link can see both."
298 },
299 "\n\nHappy with it, or want to try another?"
300 ],
301 "img": "$serverAvatar",
302 "imgAlt": "{vars.photoAlt|The space photo}",
303 "local": true
304 }
305 ],
306 "chips": [
307 {
308 "label": "Keep this photo",
309 "spent": "Kept",
310 "record": {
311 "step": "photo",
312 "label": "set the space photo",
313 "value": "{vars.photoAlt}"
314 },
315 "goto": "invites"
316 },
317 {
318 "label": "Use a different photo",
319 "gotoAsk": {
320 "step": "photo",
321 "text": "Of course! Send me another one whenever you're ready β€” and pop a message with it if you'd like alt text. πŸ“·"
322 }
323 }
324 ]
325 },
326 {
327 "id": "invites",
328 "skipIf": [
329 "done"
330 ],
331 "bubbles": [
332 {
333 "text": "Who gets to bring people in? You can always invite people. The question is whether members can too, or whether new faces only arrive through you."
334 }
335 ],
336 "chips": [
337 {
338 "label": "Members can invite people",
339 "effect": {
340 "verb": "setUserInvites",
341 "args": [
342 true
343 ]
344 },
345 "record": {
346 "label": "decided members can invite people",
347 "value": "members"
348 },
349 "goto": "extras"
350 },
351 {
352 "label": "Only me",
353 "effect": {
354 "verb": "setUserInvites",
355 "args": [
356 false
357 ]
358 },
359 "record": {
360 "label": "decided only the admin invites people",
361 "value": "admin only"
362 },
363 "goto": "extras"
364 }
365 ]
366 },
367 {
368 "id": "extras",
369 "skipIf": [
370 "done"
371 ],
372 "skipTo": "ai-optin",
373 "entries": [
374 {
375 "if": "done.extras-apps",
376 "recordIfNew": {
377 "label": "chose this space's extras",
378 "value": "chosen"
379 },
380 "goto": "ai-optin"
381 }
382 ],
383 "bubbles": [
384 {
385 "text": "Nearly there. Your space comes with a couple of extras:\n\nβ€’ Bots β€” little helpers members can create for reminders and jobs.\nβ€’ Apps β€” to-dos, polls, whiteboards, and a studio for building your own.\n\nEverything essential works with these off, and you can change your mind anytime in Admin."
386 }
387 ],
388 "chips": [
389 {
390 "label": "Keep both on",
391 "spent": "Kept",
392 "record": {
393 "label": "kept bots and apps on",
394 "value": "all-on"
395 },
396 "goto": "ai-optin"
397 },
398 {
399 "label": "Let me choose",
400 "goto": "extras-bots"
401 }
402 ]
403 },
404 {
405 "id": "extras-bots",
406 "skipIf": [
407 "done"
408 ],
409 "bubbles": [
410 {
411 "text": "Bots β€” helpers that live in chats and do jobs: reminders, summaries, little tools. Members can create their own."
412 }
413 ],
414 "chips": [
415 {
416 "label": "Enable bots",
417 "effect": {
418 "verb": "setFeature",
419 "args": [
420 "bots",
421 true
422 ]
423 },
424 "record": {
425 "label": "enabled bots",
426 "value": "on"
427 },
428 "goto": "extras-apps"
429 },
430 {
431 "label": "No bots here",
432 "spent": "Off",
433 "effect": {
434 "verb": "setFeature",
435 "args": [
436 "bots",
437 false
438 ]
439 },
440 "record": {
441 "label": "switched bots off",
442 "value": "off"
443 },
444 "goto": "extras-apps"
445 }
446 ]
447 },
448 {
449 "id": "extras-apps",
450 "skipIf": [
451 "done"
452 ],
453 "bubbles": [
454 {
455 "text": "And apps β€” the built-in extras like to-dos, polls, and whiteboards, plus the App Studio where members build their own."
456 }
457 ],
458 "chips": [
459 {
460 "label": "Enable apps",
461 "effect": {
462 "verb": "setFeature",
463 "args": [
464 "apps",
465 true
466 ]
467 },
468 "record": {
469 "label": "enabled apps",
470 "value": "on"
471 },
472 "goto": "ai-optin"
473 },
474 {
475 "label": "No apps here",
476 "spent": "Off",
477 "effect": {
478 "verb": "setFeature",
479 "args": [
480 "apps",
481 false
482 ]
483 },
484 "record": {
485 "label": "switched apps off",
486 "value": "off"
487 },
488 "goto": "ai-optin"
489 }
490 ]
491 },
492 {
493 "id": "ai-optin",
494 "skipIf": [
495 "done"
496 ],
497 "bubbles": [
498 {
499 "text": "Last choice β€” AI. Say yes and Eleven, the built-in helper, joins this space: members can ask it things in plain language and it answers, builds, and helps out.\n\nAn honest note before you decide: Eleven's AI runs on Eleven Messenger's machines, and it can read the chats it's invited to β€” that's what lets it help. It never sees chats it isn't in, and you can switch it off anytime in Admin."
500 }
501 ],
502 "chips": [
503 {
504 "label": "Bring Eleven in",
505 "spent": "On",
506 "effect": {
507 "verb": "setFeature",
508 "args": [
509 "ai",
510 true
511 ]
512 },
513 "record": {
514 "label": "invited Eleven's AI in",
515 "value": "on"
516 },
517 "goto": "plan"
518 },
519 {
520 "label": "Not now",
521 "spent": "Off",
522 "effect": {
523 "verb": "setFeature",
524 "args": [
525 "ai",
526 false
527 ]
528 },
529 "record": {
530 "label": "kept AI off",
531 "value": "off"
532 },
533 "goto": "plan"
534 }
535 ]
536 },
537 {
538 "id": "plan",
539 "skipIf": [
540 "done",
541 "native"
542 ],
543 "skipTo": "keys",
544 "entries": [
545 {
546 "if": "!bridge.planPrices",
547 "goto": "keys"
548 }
549 ],
550 "bubbles": [
551 {
552 "text": "One more question β€” who is this space for?\n\nEvery space starts free, and free is a real home β€” kept that way by the spaces that pay. If this one's for a team, a community, or family, there's a plan that backs it (and the free spaces too).",
553 "key": "q-plan"
554 }
555 ],
556 "chips": [
557 {
558 "if": "bridge.planTeam",
559 "label": "A team",
560 "goto": "plan-team"
561 },
562 {
563 "if": "bridge.planCommunity",
564 "label": "A community",
565 "goto": "plan-community"
566 },
567 {
568 "if": "bridge.planFamily",
569 "label": "Family & friends",
570 "goto": "plan-family"
571 },
572 {
573 "label": "Keep it free",
574 "spent": "Free",
575 "trailing": true,
576 "record": {
577 "label": "kept this space free",
578 "value": "free"
579 },
580 "goto": "keys"
581 }
582 ]
583 },
584 {
585 "id": "plan-team",
586 "bubbles": [
587 {
588 "text": "For a team that's {bridge.planNameTeam}: {bridge.planPriceTeam} β€” it scales with the team, and bots are free.\n\nA paid space never counts against your space limit, is never reclaimed as unused, and carries a bigger storage allowance.",
589 "key": "q-plan-team"
590 }
591 ],
592 "chips": [
593 {
594 "label": "Choose {bridge.planNameTeam}",
595 "spent": "Chosen",
596 "set": {
597 "vars.planTier": "team"
598 },
599 "record": {
600 "step": "plan",
601 "label": "chose the {bridge.planNameTeam} plan β€” payment waits at the finish line",
602 "value": "team"
603 },
604 "goto": "keys"
605 },
606 {
607 "label": "Keep it free",
608 "spent": "Free",
609 "record": {
610 "step": "plan",
611 "label": "kept this space free",
612 "value": "free"
613 },
614 "goto": "keys"
615 }
616 ]
617 },
618 {
619 "id": "plan-community",
620 "bubbles": [
621 {
622 "text": "For a community that's {bridge.planNameCommunity}: {bridge.planPriceCommunity}.\n\nA paid space never counts against your space limit, is never reclaimed as unused, and carries a bigger storage allowance.",
623 "key": "q-plan-community"
624 }
625 ],
626 "chips": [
627 {
628 "label": "Choose {bridge.planNameCommunity}",
629 "spent": "Chosen",
630 "set": {
631 "vars.planTier": "community"
632 },
633 "record": {
634 "step": "plan",
635 "label": "chose the {bridge.planNameCommunity} plan β€” payment waits at the finish line",
636 "value": "community"
637 },
638 "goto": "keys"
639 },
640 {
641 "label": "Keep it free",
642 "spent": "Free",
643 "record": {
644 "step": "plan",
645 "label": "kept this space free",
646 "value": "free"
647 },
648 "goto": "keys"
649 }
650 ]
651 },
652 {
653 "id": "plan-family",
654 "bubbles": [
655 {
656 "text": "For family and friends that's {bridge.planNameFamily}: {bridge.planPriceFamily}.\n\nA paid space never counts against your space limit, is never reclaimed as unused, and carries a bigger storage allowance.",
657 "key": "q-plan-family"
658 }
659 ],
660 "chips": [
661 {
662 "label": "Choose {bridge.planNameFamily}",
663 "spent": "Chosen",
664 "set": {
665 "vars.planTier": "family"
666 },
667 "record": {
668 "step": "plan",
669 "label": "chose the {bridge.planNameFamily} plan β€” payment waits at the finish line",
670 "value": "family"
671 },
672 "goto": "keys"
673 },
674 {
675 "label": "Keep it free",
676 "spent": "Free",
677 "record": {
678 "step": "plan",
679 "label": "kept this space free",
680 "value": "free"
681 },
682 "goto": "keys"
683 }
684 ]
685 },
686 {
687 "id": "keys",
688 "entries": [
689 {
690 "if": {
691 "all": [
692 "native",
693 "bridge.homeSignedIn"
694 ]
695 },
696 "set": {
697 "vars.backedUp": true
698 },
699 "recordIfNew": {
700 "label": "Your space's key is saved with your Eleven account",
701 "value": "native"
702 },
703 "goto": "finish"
704 },
705 {
706 "if": "bridge.enrolled",
707 "set": {
708 "vars.backedUp": true
709 },
710 "recordIfNew": {
711 "label": "Signed in β€” your space's key is safe",
712 "value": "passkey"
713 },
714 "sayIfNew": "You're signed in β€” your space's key is safe. βœ…",
715 "goto": "finish"
716 },
717 {
718 "if": "done",
719 "goto": "finish"
720 },
721 {
722 "if": "!bridge.canEnrol",
723 "recordIfNew": {
724 "label": {
725 "if": "native",
726 "then": "This device holds this space's key",
727 "else": "This browser holds this space's key"
728 },
729 "value": "local"
730 },
731 "goto": "finish"
732 },
733 {
734 "if": "bridge.fromHome",
735 "goto": "keys-home"
736 }
737 ],
738 "settle": {
739 "when": {
740 "any": [
741 "bridge.enrolled",
742 "bridge.homeSignedIn"
743 ]
744 }
745 },
746 "bubbles": [
747 {
748 "text": [
749 "Now the most important thing of all. πŸ”‘\n\n",
750 "Everything here is locked with a key that exists only on your devices. There's no password reset and no support desk β€” not even whoever runs the server can read your messages or recover that key. That's not a flaw; it's the whole point.\n\n",
751 "But it means: right now, ",
752 {
753 "if": "native",
754 "text": "this device holds"
755 },
756 {
757 "if": "!native",
758 "text": "this browser holds"
759 },
760 " the only key to your space. If it's lost β€” cleared, broken, stolen β€” your space is gone with it, and nobody can get it back."
761 ]
762 },
763 {
764 "text": {
765 "if": "native",
766 "then": "Sign in with Eleven and your key stays safe β€” it's saved to your account, and every device you sign in on can open this space.",
767 "else": "Sign in with Eleven and your key stays safe β€” one tap, your face or fingerprint, and you'll be brought straight back."
768 }
769 }
770 ],
771 "chips": [
772 {
773 "label": "Sign in",
774 "advancing": false,
775 "effect": {
776 "verb": "savePasskey"
777 },
778 "probe": {
779 "afterMs": 1500,
780 "unless": {
781 "any": [
782 "bridge.enrolled",
783 "bridge.homeSignedIn"
784 ]
785 },
786 "goto": "keys-waiting"
787 }
788 },
789 {
790 "label": "Not now",
791 "spent": "Skipped",
792 "goto": "keys-confirm"
793 }
794 ]
795 },
796 {
797 "id": "keys-home",
798 "entries": [
799 {
800 "if": "bridge.enrolled",
801 "set": {
802 "vars.backedUp": true
803 },
804 "recordIfNew": {
805 "label": "Signed in β€” your space's key is safe",
806 "value": "passkey"
807 },
808 "sayIfNew": "You're signed in β€” your space's key is safe. βœ…",
809 "goto": "finish"
810 }
811 ],
812 "settle": {
813 "when": "bridge.enrolled"
814 },
815 "bubbles": [
816 {
817 "text": "Last thing β€” the key. πŸ”‘\n\nThis space is locked with a key that was just created here, in this browser. Your Eleven sign-in doesn't hold it yet β€” so if this browser is lost, the space goes with it."
818 },
819 {
820 "text": "Sign in and it's added to your account β€” one tap, and you'll be brought straight back."
821 }
822 ],
823 "chips": [
824 {
825 "label": "Sign in",
826 "advancing": false,
827 "effect": {
828 "verb": "savePasskey"
829 },
830 "probe": {
831 "afterMs": 1500,
832 "unless": {
833 "any": [
834 "bridge.enrolled",
835 "bridge.homeSignedIn"
836 ]
837 },
838 "goto": "keys-waiting"
839 }
840 },
841 {
842 "label": "Not now",
843 "spent": "Skipped",
844 "goto": "keys-confirm"
845 }
846 ]
847 },
848 {
849 "id": "keys-waiting",
850 "settle": {
851 "when": {
852 "any": [
853 "bridge.enrolled",
854 "bridge.homeSignedIn"
855 ]
856 },
857 "goto": "keys"
858 },
859 "bubbles": [
860 {
861 "text": "I'll wait here while you finish signing in. When you're done, tap Continue."
862 }
863 ],
864 "chips": [
865 {
866 "label": "Continue",
867 "record": {
868 "step": "keys",
869 "label": {
870 "if": {
871 "any": [
872 "bridge.enrolled",
873 "bridge.homeSignedIn"
874 ]
875 },
876 "then": "Signed in β€” your space's key is safe",
877 "else": "Signed in (in this browser)"
878 },
879 "value": "passkey"
880 },
881 "set": {
882 "vars.backedUp": true
883 },
884 "goto": "finish"
885 },
886 {
887 "label": "It didn't work β€” skip for now",
888 "spent": "Skipped",
889 "record": {
890 "step": "keys",
891 "label": "Skipped signing in for now",
892 "value": "skipped"
893 },
894 "set": {
895 "vars.backedUp": false
896 },
897 "goto": "finish"
898 }
899 ]
900 },
901 {
902 "id": "keys-confirm",
903 "settle": {
904 "when": {
905 "any": [
906 "bridge.enrolled",
907 "bridge.homeSignedIn"
908 ]
909 },
910 "goto": "keys"
911 },
912 "bubbles": [
913 {
914 "text": "I have to be straight with you: if you don't sign in, one lost or cleared browser means this space and everything in it is gone β€” permanently, for everyone, and no one can help. I'll remind you again in a day or so."
915 }
916 ],
917 "chips": [
918 {
919 "label": "Go back and sign in",
920 "advancing": false,
921 "effect": {
922 "verb": "savePasskey"
923 },
924 "probe": {
925 "afterMs": 1500,
926 "unless": {
927 "any": [
928 "bridge.enrolled",
929 "bridge.homeSignedIn"
930 ]
931 },
932 "goto": "keys-waiting"
933 }
934 },
935 {
936 "label": "I understand the risk",
937 "spent": "Understood",
938 "record": {
939 "step": "keys",
940 "label": "Skipped signing in for now",
941 "value": "skipped"
942 },
943 "set": {
944 "vars.backedUp": false
945 },
946 "goto": "finish"
947 }
948 ]
949 },
950 {
951 "id": "finish",
952 "record": {
953 "label": "Your space is ready",
954 "value": "done"
955 },
956 "effects": [
957 {
958 "if": "!vars.backedUp",
959 "verb": "deferBackupReminders"
960 },
961 {
962 "verb": "markSetupComplete"
963 }
964 ],
965 "bubbles": [
966 {
967 "text": [
968 "That's it β€” {space.name|your space} is ready! πŸŽ‰\n\n",
969 "Everything we just set up lives in your Admin panel β€” invite links, the space's name and photo, who can invite. Type `/admin` anywhere to open it; it's yours alone as this space's admin.",
970 {
971 "if": {
972 "all": [
973 "!vars.backedUp",
974 "bridge.canEnrol"
975 ]
976 },
977 "text": "\n\nOne more reminder before you go: you haven't signed in, so this browser holds the only key to this space. If it's lost or cleared, the space is gone with it β€” for everyone. Sign in any time and it's safe."
978 },
979 {
980 "if": "vars.planTier",
981 "text": "\n\nAnd the plan you picked β€” tap below whenever you're ready to set up the payment. Your space runs free until then."
982 }
983 ],
984 "key": "q-finish"
985 },
986 {
987 "text": "Where would you like to start?"
988 }
989 ],
990 "chips": [
991 {
992 "if": {
993 "all": [
994 "!vars.backedUp",
995 "bridge.canEnrol"
996 ]
997 },
998 "label": "Sign in",
999 "advancing": false,
1000 "effect": {
1001 "verb": "savePasskey"
1002 }
1003 },
1004 {
1005 "if": "vars.planTier",
1006 "label": "Set up your plan",
1007 "advancing": false,
1008 "effect": {
1009 "verb": "openPlanCheckout"
1010 }
1011 },
1012 {
1013 "label": "Open admin",
1014 "advancing": false,
1015 "effect": {
1016 "verb": "openAdmin"
1017 }
1018 },
1019 {
1020 "if": "!native",
1021 "label": "Take the tour",
1022 "advancing": false,
1023 "effect": {
1024 "verb": "startTour"
1025 }
1026 },
1027 {
1028 "label": "Done for now",
1029 "spent": "Done",
1030 "say": "You're all set. πŸ‘ I'm here whenever you want me β€” just say hello, or type `/` to see what I can do."
1031 }
1032 ],
1033 "end": true
1034 }
1035 ]
1036}
1037