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.
- package/dist/contribs/_shared/fastbrowser_helper.d.ts +13 -0
- package/dist/contribs/_shared/fastbrowser_helper.d.ts.map +1 -0
- package/dist/contribs/_shared/fastbrowser_helper.js +39 -0
- package/dist/contribs/_shared/fastbrowser_helper.js.map +1 -0
- package/dist/contribs/linkedin_cli/src/cli.d.ts +3 -0
- package/dist/contribs/linkedin_cli/src/cli.d.ts.map +1 -0
- package/dist/contribs/linkedin_cli/src/cli.js +299 -0
- package/dist/contribs/linkedin_cli/src/cli.js.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.d.ts +73 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.d.ts.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.js +866 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.js.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.d.ts +61 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.d.ts.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.js +885 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.js.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.d.ts +11 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.d.ts.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.js +145 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.js.map +1 -0
- package/dist/contribs/twitter_cli/src/cli.d.ts +3 -0
- package/dist/contribs/twitter_cli/src/cli.d.ts.map +1 -0
- package/dist/contribs/twitter_cli/src/cli.js +273 -0
- package/dist/contribs/twitter_cli/src/cli.js.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.d.ts +28 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.d.ts.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.js +274 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.js.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.d.ts +43 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.d.ts.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.js +519 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.js.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.d.ts +11 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.d.ts.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.js +213 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.js.map +1 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.js +43 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.js.map +1 -1
- package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts +4 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts.map +1 -1
- package/dist/fastbrowser_httpd/libs/tool-schemas.js +4 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.js.map +1 -1
- package/dist/fastbrowser_mcp/fastbrowser_mcp.js +36 -2
- package/dist/fastbrowser_mcp/fastbrowser_mcp.js.map +1 -1
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts +2 -0
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts.map +1 -1
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.js +12 -0
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.js.map +1 -1
- package/dist/fastbrowser_mcp/libs/response_formatter.d.ts +1 -0
- package/dist/fastbrowser_mcp/libs/response_formatter.d.ts.map +1 -1
- package/dist/fastbrowser_mcp/libs/response_formatter.js +27 -0
- package/dist/fastbrowser_mcp/libs/response_formatter.js.map +1 -1
- package/dist/shared/fastbrowser_helper.d.ts +13 -0
- package/dist/shared/fastbrowser_helper.d.ts.map +1 -0
- package/dist/shared/fastbrowser_helper.js +39 -0
- package/dist/shared/fastbrowser_helper.js.map +1 -0
- package/examples/linkedin_cli_TOREMOVE/README.md +7 -0
- package/examples/{linkedin_cli → linkedin_cli_TOREMOVE}/linkedin_dm.sh +8 -4
- package/examples/linkedin_cli_TOREMOVE/linkedin_dm.ts +326 -0
- package/examples/linkedin_cli_TOREMOVE/linkedin_dm_messages.ts +279 -0
- package/examples/linkedin_cli_TOREMOVE/linkedin_full_cycle.sh +5 -0
- package/examples/{linkedin_cli → linkedin_cli_TOREMOVE}/linkedin_post.sh +3 -0
- package/examples/linkedin_cli_TOREMOVE/message_thread.a11y.txt +252 -0
- package/listitem +4 -0
- package/package.json +7 -3
- package/skills/fastbrowser/SKILL.md +33 -25
- package/src/contribs/_shared/fastbrowser_helper.ts +49 -0
- package/src/contribs/linkedin_cli/README.md +80 -0
- package/src/contribs/linkedin_cli/data/linkedin_posts_jeromeetienne.a11y.txt +2364 -0
- package/src/contribs/linkedin_cli/data/linkedin_posts_jontwigge.a11y.txt +2740 -0
- package/src/contribs/linkedin_cli/data/linkedin_posts_julien_guezennec.a11y.txt +2073 -0
- package/src/contribs/linkedin_cli/data/linkedin_profile_jeromeetienne.a11y.txt +1863 -0
- package/src/contribs/linkedin_cli/data/linkedin_profile_jontwigge.a11y.txt +1738 -0
- package/src/contribs/linkedin_cli/data/linkedin_profile_julien_guezennec.a11y.txt +2182 -0
- package/src/contribs/linkedin_cli/src/cli.ts +345 -0
- package/src/contribs/linkedin_cli/src/libs/linkedin_profile_helper.ts +964 -0
- package/src/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.ts +982 -0
- package/src/contribs/linkedin_cli/src/libs/linkedin_thread_helper.ts +171 -0
- package/src/contribs/twitter_cli/README.md +79 -0
- package/src/contribs/twitter_cli/data/twitter_chat.a11y.txt +215 -0
- package/src/contribs/twitter_cli/data/twitter_home.a11y.txt +467 -0
- package/src/contribs/twitter_cli/data/twitter_profile.a11y.txt +418 -0
- package/src/contribs/twitter_cli/data/twitter_profile_jontwigge.a11y.txt +484 -0
- package/src/contribs/twitter_cli/data/twitter_profile_molokoloco.a11y.txt +483 -0
- package/src/contribs/twitter_cli/src/cli.ts +315 -0
- package/src/contribs/twitter_cli/src/libs/twitter_profile_helper.ts +328 -0
- package/src/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.ts +607 -0
- package/src/contribs/twitter_cli/src/libs/twitter_thread_helper.ts +240 -0
- package/src/fastbrowser_cli/fastbrowser_cli.ts +51 -0
- package/src/fastbrowser_httpd/libs/tool-schemas.ts +6 -0
- package/src/fastbrowser_mcp/fastbrowser_mcp.ts +46 -3
- package/src/fastbrowser_mcp/libs/mcp_target_helper.ts +11 -0
- package/src/fastbrowser_mcp/libs/response_formatter.ts +29 -0
- package/src/shared/fastbrowser_helper.ts +49 -0
- package/tsconfig.json +1 -1
- package/examples/mcp_client_playwright.ts +0 -34
- /package/examples/{linkedin_cli → linkedin_cli_TOREMOVE}/linkedin.snapshot.txt +0 -0
- /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
|