fastbrowser_cli 1.0.37 → 1.0.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/contribs/_shared/fastbrowser_helper.d.ts +13 -0
  2. package/dist/contribs/_shared/fastbrowser_helper.d.ts.map +1 -0
  3. package/dist/contribs/_shared/fastbrowser_helper.js +39 -0
  4. package/dist/contribs/_shared/fastbrowser_helper.js.map +1 -0
  5. package/dist/contribs/linkedin_cli/src/cli.d.ts +3 -0
  6. package/dist/contribs/linkedin_cli/src/cli.d.ts.map +1 -0
  7. package/dist/contribs/linkedin_cli/src/cli.js +299 -0
  8. package/dist/contribs/linkedin_cli/src/cli.js.map +1 -0
  9. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.d.ts +73 -0
  10. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.d.ts.map +1 -0
  11. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.js +866 -0
  12. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.js.map +1 -0
  13. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.d.ts +61 -0
  14. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.d.ts.map +1 -0
  15. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.js +885 -0
  16. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.js.map +1 -0
  17. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.d.ts +11 -0
  18. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.d.ts.map +1 -0
  19. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.js +145 -0
  20. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.js.map +1 -0
  21. package/dist/contribs/twitter_cli/src/cli.d.ts +3 -0
  22. package/dist/contribs/twitter_cli/src/cli.d.ts.map +1 -0
  23. package/dist/contribs/twitter_cli/src/cli.js +273 -0
  24. package/dist/contribs/twitter_cli/src/cli.js.map +1 -0
  25. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.d.ts +28 -0
  26. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.d.ts.map +1 -0
  27. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.js +274 -0
  28. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.js.map +1 -0
  29. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.d.ts +43 -0
  30. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.d.ts.map +1 -0
  31. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.js +519 -0
  32. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.js.map +1 -0
  33. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.d.ts +11 -0
  34. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.d.ts.map +1 -0
  35. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.js +213 -0
  36. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.js.map +1 -0
  37. package/dist/fastbrowser_cli/fastbrowser_cli.js +43 -0
  38. package/dist/fastbrowser_cli/fastbrowser_cli.js.map +1 -1
  39. package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts +4 -0
  40. package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts.map +1 -1
  41. package/dist/fastbrowser_httpd/libs/tool-schemas.js +4 -0
  42. package/dist/fastbrowser_httpd/libs/tool-schemas.js.map +1 -1
  43. package/dist/fastbrowser_mcp/fastbrowser_mcp.js +36 -2
  44. package/dist/fastbrowser_mcp/fastbrowser_mcp.js.map +1 -1
  45. package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts +2 -0
  46. package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts.map +1 -1
  47. package/dist/fastbrowser_mcp/libs/mcp_target_helper.js +12 -0
  48. package/dist/fastbrowser_mcp/libs/mcp_target_helper.js.map +1 -1
  49. package/dist/fastbrowser_mcp/libs/response_formatter.d.ts +1 -0
  50. package/dist/fastbrowser_mcp/libs/response_formatter.d.ts.map +1 -1
  51. package/dist/fastbrowser_mcp/libs/response_formatter.js +27 -0
  52. package/dist/fastbrowser_mcp/libs/response_formatter.js.map +1 -1
  53. package/dist/shared/fastbrowser_helper.d.ts +13 -0
  54. package/dist/shared/fastbrowser_helper.d.ts.map +1 -0
  55. package/dist/shared/fastbrowser_helper.js +39 -0
  56. package/dist/shared/fastbrowser_helper.js.map +1 -0
  57. package/examples/linkedin_cli_TOREMOVE/README.md +7 -0
  58. package/examples/{linkedin_cli → linkedin_cli_TOREMOVE}/linkedin_dm.sh +8 -4
  59. package/examples/linkedin_cli_TOREMOVE/linkedin_dm.ts +326 -0
  60. package/examples/linkedin_cli_TOREMOVE/linkedin_dm_messages.ts +279 -0
  61. package/examples/linkedin_cli_TOREMOVE/linkedin_full_cycle.sh +5 -0
  62. package/examples/{linkedin_cli → linkedin_cli_TOREMOVE}/linkedin_post.sh +3 -0
  63. package/examples/linkedin_cli_TOREMOVE/message_thread.a11y.txt +252 -0
  64. package/listitem +4 -0
  65. package/package.json +7 -3
  66. package/skills/fastbrowser/SKILL.md +33 -25
  67. package/src/contribs/_shared/fastbrowser_helper.ts +49 -0
  68. package/src/contribs/linkedin_cli/README.md +80 -0
  69. package/src/contribs/linkedin_cli/data/linkedin_posts_jeromeetienne.a11y.txt +2364 -0
  70. package/src/contribs/linkedin_cli/data/linkedin_posts_jontwigge.a11y.txt +2740 -0
  71. package/src/contribs/linkedin_cli/data/linkedin_posts_julien_guezennec.a11y.txt +2073 -0
  72. package/src/contribs/linkedin_cli/data/linkedin_profile_jeromeetienne.a11y.txt +1863 -0
  73. package/src/contribs/linkedin_cli/data/linkedin_profile_jontwigge.a11y.txt +1738 -0
  74. package/src/contribs/linkedin_cli/data/linkedin_profile_julien_guezennec.a11y.txt +2182 -0
  75. package/src/contribs/linkedin_cli/src/cli.ts +345 -0
  76. package/src/contribs/linkedin_cli/src/libs/linkedin_profile_helper.ts +964 -0
  77. package/src/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.ts +982 -0
  78. package/src/contribs/linkedin_cli/src/libs/linkedin_thread_helper.ts +171 -0
  79. package/src/contribs/twitter_cli/README.md +79 -0
  80. package/src/contribs/twitter_cli/data/twitter_chat.a11y.txt +215 -0
  81. package/src/contribs/twitter_cli/data/twitter_home.a11y.txt +467 -0
  82. package/src/contribs/twitter_cli/data/twitter_profile.a11y.txt +418 -0
  83. package/src/contribs/twitter_cli/data/twitter_profile_jontwigge.a11y.txt +484 -0
  84. package/src/contribs/twitter_cli/data/twitter_profile_molokoloco.a11y.txt +483 -0
  85. package/src/contribs/twitter_cli/src/cli.ts +315 -0
  86. package/src/contribs/twitter_cli/src/libs/twitter_profile_helper.ts +328 -0
  87. package/src/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.ts +607 -0
  88. package/src/contribs/twitter_cli/src/libs/twitter_thread_helper.ts +240 -0
  89. package/src/fastbrowser_cli/fastbrowser_cli.ts +51 -0
  90. package/src/fastbrowser_httpd/libs/tool-schemas.ts +6 -0
  91. package/src/fastbrowser_mcp/fastbrowser_mcp.ts +46 -3
  92. package/src/fastbrowser_mcp/libs/mcp_target_helper.ts +11 -0
  93. package/src/fastbrowser_mcp/libs/response_formatter.ts +29 -0
  94. package/src/shared/fastbrowser_helper.ts +49 -0
  95. package/tsconfig.json +1 -1
  96. package/examples/mcp_client_playwright.ts +0 -34
  97. /package/examples/{linkedin_cli → linkedin_cli_TOREMOVE}/linkedin.snapshot.txt +0 -0
  98. /package/examples/{twitter_cli → twitter_cli_TOREMOVE}/twitter_post.sh +0 -0
@@ -0,0 +1,171 @@
1
+ // npm imports
2
+ import { A11yQuery, AxNode } from 'a11y_parse';
3
+
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ ///////////////////////////////////////////////////////////////////////////////
6
+ //
7
+ ///////////////////////////////////////////////////////////////////////////////
8
+ ///////////////////////////////////////////////////////////////////////////////
9
+
10
+ export class LinkedinThreadHelper {
11
+ static async parseMessagesThread(
12
+ axNodeThread: AxNode,
13
+ overrideYear?: number,
14
+ ): Promise<string> {
15
+ const lines: string[] = [];
16
+ let currentDate: Date | null = null;
17
+ let currentSender: string | null = null;
18
+ let currentTime: { hours: number; minutes: number } | null = null;
19
+ const year = overrideYear !== undefined ? overrideYear : new Date().getFullYear();
20
+
21
+ for (const item of axNodeThread.children) {
22
+ if (item.children.length === 0) {
23
+ continue;
24
+ }
25
+
26
+ const dateChild = item.children.find(
27
+ (c) => c.role === 'time'
28
+ && c.attributes['value'] !== undefined
29
+ && c.attributes['value'].startsWith('•') === false,
30
+ );
31
+ if (dateChild !== undefined && dateChild.attributes['value'] !== undefined) {
32
+ currentDate = LinkedinThreadHelper.parseDateMarker(dateChild.attributes['value'], year);
33
+ }
34
+
35
+ const headerChild = item.children.find(
36
+ (c) => c.role === 'generic'
37
+ && c.attributes['value'] !== undefined
38
+ && / sent the following messages at /.test(c.attributes['value']),
39
+ );
40
+ if (headerChild !== undefined && headerChild.attributes['value'] !== undefined) {
41
+ const parsed = LinkedinThreadHelper.extractSenderFromHeader(headerChild.attributes['value']);
42
+ if (parsed !== null) {
43
+ currentSender = parsed.sender;
44
+ currentTime = LinkedinThreadHelper.parseTimeOfDay(parsed.time);
45
+ }
46
+ }
47
+
48
+ const innerTimes = A11yQuery.querySelectorAll(item, 'time');
49
+ const bulletTime = innerTimes.find(
50
+ (t) => t.attributes['value'] !== undefined && t.attributes['value'].startsWith('•'),
51
+ );
52
+ if (bulletTime !== undefined && bulletTime.attributes['value'] !== undefined) {
53
+ currentTime = LinkedinThreadHelper.parseTimeOfDay(bulletTime.attributes['value']);
54
+ }
55
+
56
+ if (headerChild === undefined) {
57
+ const linkNodes = A11yQuery.querySelectorAll(item, 'link[url*="linkedin.com/in/"]');
58
+ const senderLink = linkNodes.find(
59
+ (l) => l.name !== undefined
60
+ && l.name.length > 0
61
+ && l.name.startsWith('View ') === false,
62
+ );
63
+ if (senderLink !== undefined && senderLink.name !== undefined) {
64
+ currentSender = senderLink.name;
65
+ }
66
+ }
67
+
68
+ const paragraphs = A11yQuery.querySelectorAll(item, 'paragraph')
69
+ .filter((p) => LinkedinThreadHelper.hasButtonAncestor(p, item) === false);
70
+ const texts = paragraphs
71
+ .map((p) => LinkedinThreadHelper.extractParagraphText(p))
72
+ .filter((t) => t.length > 0);
73
+ if (texts.length === 0) {
74
+ continue;
75
+ }
76
+ if (currentDate === null || currentSender === null || currentTime === null) {
77
+ continue;
78
+ }
79
+
80
+ const iso = LinkedinThreadHelper.combineDateTime(currentDate, currentTime);
81
+ lines.push(`${iso}:${currentSender}: ${texts.join(' ')}`);
82
+ }
83
+
84
+ return lines.join('\n');
85
+ }
86
+
87
+ ///////////////////////////////////////////////////////////////////////////////
88
+ ///////////////////////////////////////////////////////////////////////////////
89
+ //
90
+ ///////////////////////////////////////////////////////////////////////////////
91
+ ///////////////////////////////////////////////////////////////////////////////
92
+
93
+ private static parseDateMarker(value: string, fallbackYear: number): Date {
94
+ const months: Record<string, number> = {
95
+ Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5,
96
+ Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11,
97
+ };
98
+ const match = value.match(/^([A-Za-z]+)\s+(\d{1,2})(?:,\s*(\d{4}))?$/);
99
+ if (match === null) {
100
+ throw new Error(`Cannot parse date marker: "${value}"`);
101
+ }
102
+ const monthIndex = months[match[1]];
103
+ if (monthIndex === undefined) {
104
+ throw new Error(`Unknown month name: "${match[1]}"`);
105
+ }
106
+ const year = match[3] !== undefined ? parseInt(match[3], 10) : fallbackYear;
107
+ return new Date(year, monthIndex, parseInt(match[2], 10));
108
+ }
109
+
110
+ private static parseTimeOfDay(value: string): { hours: number; minutes: number } {
111
+ const cleaned = value.replace(/^•\s*/, '').trim();
112
+ const match = cleaned.match(/^(\d{1,2}):(\d{2})\s*(AM|PM)$/i);
113
+ if (match === null) {
114
+ throw new Error(`Cannot parse time of day: "${value}"`);
115
+ }
116
+ let hours = parseInt(match[1], 10);
117
+ const minutes = parseInt(match[2], 10);
118
+ const meridiem = match[3].toUpperCase();
119
+ if (meridiem === 'AM' && hours === 12) {
120
+ hours = 0;
121
+ } else if (meridiem === 'PM' && hours !== 12) {
122
+ hours += 12;
123
+ }
124
+ return { hours, minutes };
125
+ }
126
+
127
+ private static combineDateTime(date: Date, time: { hours: number; minutes: number }): string {
128
+ const yyyy = date.getFullYear().toString().padStart(4, '0');
129
+ const mm = (date.getMonth() + 1).toString().padStart(2, '0');
130
+ const dd = date.getDate().toString().padStart(2, '0');
131
+ const hh = time.hours.toString().padStart(2, '0');
132
+ const mi = time.minutes.toString().padStart(2, '0');
133
+ return `${yyyy}-${mm}-${dd}T${hh}:${mi}:00`;
134
+ }
135
+
136
+ private static extractParagraphText(paragraph: AxNode): string {
137
+ if (paragraph.attributes['value'] !== undefined) {
138
+ return paragraph.attributes['value'].trim();
139
+ }
140
+ const parts: string[] = [];
141
+ for (const child of paragraph.children) {
142
+ if (child.name !== undefined && child.name.length > 0) {
143
+ parts.push(child.name);
144
+ continue;
145
+ }
146
+ if (child.attributes['value'] !== undefined) {
147
+ parts.push(child.attributes['value']);
148
+ }
149
+ }
150
+ return parts.join(' ').trim();
151
+ }
152
+
153
+ private static extractSenderFromHeader(value: string): { sender: string; time: string } | null {
154
+ const match = value.match(/^(.+?) sent the following messages at (.+)$/);
155
+ if (match === null) {
156
+ return null;
157
+ }
158
+ return { sender: match[1], time: match[2] };
159
+ }
160
+
161
+ private static hasButtonAncestor(node: AxNode, stopAt: AxNode): boolean {
162
+ let current: AxNode | undefined = node.parent;
163
+ while (current !== undefined && current.uid !== stopAt.uid) {
164
+ if (current.role === 'button') {
165
+ return true;
166
+ }
167
+ current = current.parent;
168
+ }
169
+ return false;
170
+ }
171
+ }
@@ -0,0 +1,79 @@
1
+ # twitter_cli
2
+
3
+ Command-line tool to interact with X (twitter.com) through a real browser session, driven by `fastbrowser_cli`.
4
+
5
+ It lets you create posts, manage direct-message conversations (list, read, send), and export public profiles from the terminal.
6
+
7
+ ## Requirements
8
+
9
+ - A running `fastbrowser_cli` session already authenticated on `x.com`.
10
+ - The `_shared/fastbrowser_helper.ts` wrapper located in the sibling `contribs/_shared/` folder.
11
+
12
+ ## Usage
13
+
14
+ ```bash
15
+ npx tsx ./src/cli.ts <command> [args]
16
+ ```
17
+
18
+ ### Commands
19
+
20
+ | Command | Description |
21
+ |---------|-------------|
22
+ | `post <content>` | Create a post on x.com. |
23
+ | `profile <handle> [-f markdown\|json]` | Export the profile of a twitter handle (default: `markdown`). |
24
+ | `dm_page` | Navigate to the x.com direct messages page. Run this first before any `dm_*` command. |
25
+ | `dm_list` | List the handles of people you have conversations with. |
26
+ | `dm_select <handle>` | Open an existing conversation by handle. |
27
+ | `dm_thread <handle>` | Print the message thread of a conversation with `handle`. |
28
+ | `dm_send <handle> <message>` | Send a message in an existing conversation with `handle`. |
29
+
30
+ `handle` is the X username without the leading `@` (e.g. `JamesCorbett`), as it appears at the end of the user's profile URL.
31
+
32
+ ### Examples
33
+
34
+ Create a post:
35
+
36
+ ```bash
37
+ npx tsx ./src/cli.ts post "Hello X from the CLI"
38
+ ```
39
+
40
+ Export a profile:
41
+
42
+ ```bash
43
+ npx tsx ./src/cli.ts profile jerome_etienne
44
+ npx tsx ./src/cli.ts profile jerome_etienne -f json
45
+ ```
46
+
47
+ List your conversations:
48
+
49
+ ```bash
50
+ npx tsx ./src/cli.ts dm_page
51
+ npx tsx ./src/cli.ts dm_list
52
+ ```
53
+
54
+ Read a thread:
55
+
56
+ ```bash
57
+ npx tsx ./src/cli.ts dm_page
58
+ npx tsx ./src/cli.ts dm_thread JamesCorbett
59
+ ```
60
+
61
+ Output is one message per line in the form:
62
+
63
+ ```
64
+ 2026-05-03T14:32:00:JamesCorbett: hey, are you free this week?
65
+ ```
66
+
67
+ Send a reply:
68
+
69
+ ```bash
70
+ npx tsx ./src/cli.ts dm_page
71
+ npx tsx ./src/cli.ts dm_send JamesCorbett "Sounds good"
72
+ ```
73
+
74
+ ## Layout
75
+
76
+ - [src/cli.ts](src/cli.ts) — Commander entry point, defines the commands and orchestrates browser actions through `FastBrowserHelper`.
77
+ - [src/libs/twitter_thread_helper.ts](src/libs/twitter_thread_helper.ts) — Parses the X message thread from an accessibility tree snapshot into timestamped lines.
78
+ - [src/libs/twitter_profile_helper.ts](src/libs/twitter_profile_helper.ts) — Parses a public X profile page snapshot into a `TwitterProfile` object and renders it as markdown.
79
+ - [NOTES_dm.md](NOTES_dm.md), [NOTES_profile.md](NOTES_profile.md) — Raw `fastbrowser_cli` selectors and accessibility-tree snippets used while reverse-engineering the X UI.
@@ -0,0 +1,215 @@
1
+ uid=e2 generic
2
+ uid=s4 generic
3
+ uid=s5 generic
4
+ uid=e3 heading "To view keyboard shortcuts, press question mark View keyboard shortcuts" level="2"
5
+ uid=e4 generic value="To view keyboard shortcuts, press question mark"
6
+ uid=e5 link "View keyboard shortcuts" url="/i/keyboard_shortcuts"
7
+ uid=e6 generic
8
+ uid=e1139 button "Skip to home timeline"
9
+ uid=e1141 button "Skip to trending"
10
+ uid=e11 banner
11
+ uid=e13 generic
12
+ uid=e14 generic
13
+ uid=e16 heading "X" level="1"
14
+ uid=e17 link "X" url="/home"
15
+ uid=e19 img
16
+ uid=e23 navigation "Primary"
17
+ uid=e24 link "Home" url="/home"
18
+ uid=e27 img
19
+ uid=e30 link "Search and explore" url="/explore"
20
+ uid=e33 img
21
+ uid=e36 link "Notifications" url="/notifications"
22
+ uid=e39 img
23
+ uid=e42 link "Direct Messages" active url="/i/chat"
24
+ uid=e1143 img
25
+ uid=e48 link "Grok" url="/i/grok"
26
+ uid=e51 img
27
+ uid=e54 link "Bookmarks" url="/i/bookmarks"
28
+ uid=e57 img
29
+ uid=e60 link "Creator Studio" url="/i/jf/creators/studio"
30
+ uid=e63 img
31
+ uid=e66 link "Premium" url="/i/premium_sign_up"
32
+ uid=e69 img
33
+ uid=e72 link "Profile" url="/jerome_etienne"
34
+ uid=e1146 img
35
+ uid=e78 button "More menu items"
36
+ uid=e81 img
37
+ uid=e85 link "Post" url="/compose/post"
38
+ uid=e87 img
39
+ uid=e92 button "Account menu"
40
+ uid=e100 generic
41
+ uid=s6 generic
42
+ uid=s7 generic
43
+ uid=s8 generic
44
+ uid=s9 unknown
45
+ uid=s10 unknown
46
+ uid=e103 main
47
+ uid=e1152 generic "Home timeline"
48
+ uid=e1156 generic
49
+ uid=e1157 generic
50
+ uid=e1158 generic
51
+ uid=e1160 generic value="Chat"
52
+ uid=e1161 generic
53
+ uid=e1162 button "All"
54
+ uid=e1163 generic value="All"
55
+ uid=e1164 img
56
+ uid=e1166 button
57
+ uid=e1167 img
58
+ uid=e1171 generic
59
+ uid=e1172 img
60
+ uid=e1174 generic value="Search"
61
+ uid=e1176 generic
62
+ uid=e1177 listitem
63
+ uid=s11 unknown url="/i/chat/10162102-14637220"
64
+ uid=e1180 generic
65
+ uid=e1182 link "user avatar" url="https://x.com/molokoloco"
66
+ uid=e1183 img "user avatar"
67
+ uid=e1184 generic
68
+ uid=e1185 generic
69
+ uid=e1188 generic value="Julien G. (julienweb.fr)"
70
+ uid=e1190 generic value="3h"
71
+ uid=e1193 generic value="You: hello how are you"
72
+ uid=e1194 listitem
73
+ uid=s12 unknown url="/i/chat/10162102-189239506"
74
+ uid=e1197 generic
75
+ uid=e1199 link "user avatar" url="https://x.com/michaelybecker"
76
+ uid=e1200 img "user avatar"
77
+ uid=e1201 generic
78
+ uid=e1202 generic
79
+ uid=e1205 generic value="Michael Becker"
80
+ uid=e1207 generic value="63w"
81
+ uid=e1210 generic value="You: aka i would have to use a chrome extension, but i dont think it is a problem for sales people. Those people are willing to win, and to install a chrome ext wont stop it :)"
82
+ uid=e1211 listitem
83
+ uid=e1213 link "user avatar James Baicoianu 63w Oof, sorry - so did the company I was working at, I was working on the web client for JanusVR. Very similar product, but the market just wasn't there for that kind of thing at the time. Ah well, what can we do but move on to the next thing, eh?" url="/i/chat/10162102-38413353"
84
+ uid=e1214 generic
85
+ uid=e1216 link "user avatar" url="https://x.com/bai0"
86
+ uid=e1217 img "user avatar"
87
+ uid=e1218 generic
88
+ uid=e1219 generic
89
+ uid=e1222 generic value="James Baicoianu"
90
+ uid=e1224 generic value="63w"
91
+ uid=e1227 generic value="Oof, sorry - so did the company I was working at, I was working on the web client for JanusVR. Very similar product, but the market just wasn't there for that kind of thing at the time. Ah well, what can we do but move on to the next thing, eh?"
92
+ uid=e1228 listitem
93
+ uid=e1230 link "user avatar JOANN AMELINE 272w Hi Jerome, how are you? I would like to know if you are open for new jobs?" url="/i/chat/10162102-10809532"
94
+ uid=e1231 generic
95
+ uid=e1233 link "user avatar" url="https://x.com/joannameline"
96
+ uid=e1234 img "user avatar"
97
+ uid=e1235 generic
98
+ uid=e1236 generic
99
+ uid=e1239 generic value="JOANN AMELINE"
100
+ uid=e1241 generic value="272w"
101
+ uid=e1244 generic value="Hi Jerome, how are you? I would like to know if you are open for new jobs?"
102
+ uid=e1245 listitem
103
+ uid=e1247 link "user avatar Juan Pablo Rodriguez 288w Do You know someone who might be interested in the project?" url="/i/chat/10162102-65428988"
104
+ uid=e1248 generic
105
+ uid=e1250 link "user avatar" url="https://x.com/andromedaleader"
106
+ uid=e1251 img "user avatar"
107
+ uid=e1252 generic
108
+ uid=e1253 generic
109
+ uid=e1256 generic value="Juan Pablo Rodriguez"
110
+ uid=e1258 generic value="288w"
111
+ uid=e1261 generic value="Do You know someone who might be interested in the project?"
112
+ uid=e1262 listitem
113
+ uid=e1264 link "user avatar Tomasz Świetlikowski 🏴󠁧󠁢󠁳󠁣󠁴󠁿 342w Is AR.js ready to work with geo points instead of markers?" url="/i/chat/10162102-196165576"
114
+ uid=e1265 generic
115
+ uid=e1267 link "user avatar" url="https://x.com/swietlikowski"
116
+ uid=e1268 img "user avatar"
117
+ uid=e1269 generic
118
+ uid=e1270 generic
119
+ uid=e1272 generic
120
+ uid=e1273 generic value="Tomasz Świetlikowski 🏴󠁧󠁢󠁳󠁣󠁴󠁿"
121
+ uid=e1277 button
122
+ uid=e1278 img
123
+ uid=e1281 generic value="342w"
124
+ uid=e1284 generic value="Is AR.js ready to work with geo points instead of markers?"
125
+ uid=e1285 listitem
126
+ uid=e1287 link "user avatar Sivan Iram 342w Hey, how are you man? Would love to catch up with you" url="/i/chat/10162102-441000026"
127
+ uid=e1288 generic
128
+ uid=e1290 link "user avatar" url="https://x.com/SivanIram"
129
+ uid=e1291 img "user avatar"
130
+ uid=e1292 generic
131
+ uid=e1293 generic
132
+ uid=e1296 generic value="Sivan Iram"
133
+ uid=e1298 generic value="342w"
134
+ uid=e1301 generic value="Hey, how are you man? Would love to catch up with you"
135
+ uid=e1302 listitem
136
+ uid=s13 unknown url="/i/chat/10162102-616203093"
137
+ uid=e1305 generic
138
+ uid=e1307 link "user avatar" url="https://x.com/cipri_tom"
139
+ uid=e1308 img "user avatar"
140
+ uid=e1309 generic
141
+ uid=e1310 generic
142
+ uid=e1313 generic value="Ciprian Tomoiagă"
143
+ uid=e1315 generic value="346w"
144
+ uid=e1318 generic value="You: Hehe"
145
+ uid=e1319 listitem
146
+ uid=e1321 link "user avatar Luke Weldon 362w Have you had a chance to check out the ARjs_Unity project? I'm curious what your thoughts are on it. Or if there is anything I could change about it (at least from what I have so far)." url="/i/chat/10162102-47129544"
147
+ uid=e1322 generic
148
+ uid=e1324 link "user avatar" url="https://x.com/weldlu"
149
+ uid=e1325 img "user avatar"
150
+ uid=e1326 generic
151
+ uid=e1327 generic
152
+ uid=e1330 generic value="Luke Weldon"
153
+ uid=e1332 generic value="362w"
154
+ uid=e1335 generic value="Have you had a chance to check out the ARjs_Unity project? I'm curious what your thoughts are on it. Or if there is anything I could change about it (at least from what I have so far)."
155
+ uid=e1336 listitem
156
+ uid=s14 unknown url="/i/chat/10162102-19057948"
157
+ uid=e1339 generic
158
+ uid=e1341 link "user avatar" url="https://x.com/AharonWasserman"
159
+ uid=e1342 img "user avatar"
160
+ uid=e1343 generic
161
+ uid=e1344 generic
162
+ uid=e1347 generic value="Aharon Wasserman"
163
+ uid=e1349 generic value="381w"
164
+ uid=e1352 generic value="You: lets do that next week"
165
+ uid=e1353 listitem
166
+ uid=e1355 link "user avatar marco sparagna 384w 6ish" url="/i/chat/10162102-96414314"
167
+ uid=e1356 generic
168
+ uid=e1358 link "user avatar" url="https://x.com/thetallestuser"
169
+ uid=e1359 img "user avatar"
170
+ uid=e1360 generic
171
+ uid=e1361 generic
172
+ uid=e1364 generic value="marco sparagna"
173
+ uid=e1366 generic value="384w"
174
+ uid=e1369 generic value="6ish"
175
+ uid=e1370 listitem
176
+ uid=e1372 link "user avatar Alexandra Etienne 385w 🤡🤡" url="/i/chat/10162102-2416259222"
177
+ uid=e1373 generic
178
+ uid=e1375 link "user avatar" url="https://x.com/AndraConnect"
179
+ uid=e1376 img "user avatar"
180
+ uid=e1377 generic
181
+ uid=e1378 generic
182
+ uid=e1381 generic value="Alexandra Etienne"
183
+ uid=e1383 generic value="385w"
184
+ uid=e1386 generic value="🤡🤡"
185
+ uid=e1387 listitem
186
+ uid=s15 unknown url="/i/chat/10162102-874985095068663808"
187
+ uid=e1390 generic
188
+ uid=e1392 link "user avatar" url="https://x.com/NellWaliczek"
189
+ uid=e1393 img "user avatar"
190
+ uid=e1394 generic
191
+ uid=e1395 generic
192
+ uid=e1398 generic value="Nell Waliczek"
193
+ uid=e1400 generic value="387w"
194
+ uid=e1403 generic value="You: Hi Nell. Just wanted to send you a message to say that it was a pleasure working with you. Unfortunately, things haven't worked out with Amazon. But please let me know if you are ever around Dublin. Take care and hopefully our paths will cross again in the future. Cheers!"
195
+ uid=e1404 listitem
196
+ uid=s16 unknown url="/i/chat/10142-10162102"
197
+ uid=e1407 generic
198
+ uid=e1409 link "user avatar" url="https://x.com/JamesCorbett"
199
+ uid=e1410 img "user avatar"
200
+ uid=e1411 generic
201
+ uid=e1412 generic
202
+ uid=e1415 generic value="James Corbett"
203
+ uid=e1417 generic value="387w"
204
+ uid=e1420 generic value="You: Sounds good"
205
+ uid=e1421 listitem
206
+ uid=e1423 link "user avatar Preston Tamkin 387w Hey. I'm sorry to hear that and I'm sorry things didn't work out. It was nice to work with you too." url="/i/chat/10162102-15667471"
207
+ uid=e1424 generic
208
+ uid=e1426 link "user avatar" url="https://x.com/prestomation"
209
+ uid=e1427 img "user avatar"
210
+ uid=e1428 generic
211
+ uid=e1429 generic
212
+ uid=e1432 generic value="Preston Tamkin"
213
+ uid=e1434 generic value="387w"
214
+ uid=e1437 generic value="Hey. I'm sorry to hear that and I'm sorry things didn't work out. It was nice to work with you too."
215
+ uid=e1441 img