Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
3aff0c3
init broad listening
koenvanderveen Sep 11, 2025
8e51918
fix gitignore large files
koenvanderveen Sep 11, 2025
e19f041
fix gitignore large files
koenvanderveen Sep 11, 2025
d71a082
Enhance broad listening UI with comprehensive chat and dashboard feat…
koenvanderveen Sep 11, 2025
874301f
Merge branch 'broad-listening' of github.com:OpenMined/agentic-syftbo…
koenvanderveen Sep 11, 2025
6544897
Rebrand app from Vera to Omni and redesign connector onboarding flow
koenvanderveen Sep 11, 2025
9f764f0
Add welcome page and create list functionality to broad listening UI
koenvanderveen Sep 11, 2025
7517cc8
claude md
koenvanderveen Sep 11, 2025
5e84c48
changes
koenvanderveen Sep 15, 2025
b6a00c4
mcok data to bakcend
koenvanderveen Sep 15, 2025
775f9ad
remove mockd ata from frontend
koenvanderveen Sep 15, 2025
5be6942
try fix embedding
koenvanderveen Sep 17, 2025
16e30eb
some examples
koenvanderveen Sep 17, 2025
9e568fc
merge
koenvanderveen Sep 17, 2025
93fa9ea
connect new store
koenvanderveen Sep 18, 2025
1759729
fix ciruclar imports
koenvanderveen Sep 18, 2025
78cb8e9
connect new store
koenvanderveen Sep 18, 2025
bfbf95a
fix adding tweets, add deploy
koenvanderveen Sep 22, 2025
e224012
deploy
koenvanderveen Sep 22, 2025
2313fa5
add reranker
eelcovdw Sep 24, 2025
8dc7cea
change distance to score
eelcovdw Sep 24, 2025
d2c6b58
change onboarding
koenvanderveen Sep 24, 2025
42c8b6e
change onboarding
koenvanderveen Sep 24, 2025
60b142a
fix onboarding screen
koenvanderveen Sep 24, 2025
e795285
fix styling of smarlistlist
koenvanderveen Sep 24, 2025
fbda759
add score threshold
eelcovdw Sep 25, 2025
b424898
add queue
eelcovdw Sep 25, 2025
da2563d
creation of lists
koenvanderveen Sep 25, 2025
590d9dc
fix showing of lists and deleting of lists
koenvanderveen Sep 26, 2025
aae16df
fix torch version
koenvanderveen Sep 26, 2025
29b8333
add x scraper
eelcovdw Sep 26, 2025
eb11209
fix install?
koenvanderveen Sep 26, 2025
546e5a6
remove old files
eelcovdw Sep 26, 2025
0211e29
fix
koenvanderveen Sep 26, 2025
091de41
fix
koenvanderveen Sep 26, 2025
ea1314a
fix
koenvanderveen Sep 26, 2025
a5106d2
Merge branch 'broad-listening' of github.com:OpenMined/agentic-syftbo…
koenvanderveen Sep 26, 2025
3bf2795
-
koenvanderveen Sep 26, 2025
0462c57
-
koenvanderveen Sep 26, 2025
ffcde13
-
koenvanderveen Sep 26, 2025
455a57f
fix keyword
eelcovdw Sep 26, 2025
9982c53
-
koenvanderveen Sep 26, 2025
27b4f00
Merge pull request #59 from OpenMined/eelco/rerank
koenvanderveen Sep 26, 2025
33ba8ac
-
koenvanderveen Sep 26, 2025
cfda9ef
Merge pull request #60 from OpenMined/fix-lists-management
koenvanderveen Sep 26, 2025
a88a252
fix
eelcovdw Sep 26, 2025
9d16591
merge
eelcovdw Sep 27, 2025
d2d576c
fixes
eelcovdw Sep 29, 2025
c4a3369
fix test
eelcovdw Sep 29, 2025
f358dd3
fix flow
koenvanderveen Sep 29, 2025
4fb087a
Merge branch 'eelco/scraping' of github.com:OpenMined/agentic-syftbox…
koenvanderveen Sep 29, 2025
f6ee91e
fix
koenvanderveen Sep 29, 2025
d53fb22
fetch usertweets
eelcovdw Sep 29, 2025
1cf367b
add rerankers with fix
eelcovdw Sep 29, 2025
51daddd
better create list flow
koenvanderveen Sep 29, 2025
00c6a1d
Merge branch 'eelco/scraping' of github.com:OpenMined/agentic-syftbox…
koenvanderveen Sep 29, 2025
224a6ea
fix state when loading authors
koenvanderveen Sep 29, 2025
899ed19
analytics
koenvanderveen Sep 30, 2025
aa4aa89
deploy fixes
eelcovdw Sep 30, 2025
a7b62c8
Merge branch 'eelco/scraping' of https://github.com/OpenMined/toolbox…
eelcovdw Sep 30, 2025
c569ec3
fix failing account checking
koenvanderveen Sep 30, 2025
327c873
Merge branch 'eelco/scraping' of github.com:OpenMined/agentic-syftbox…
koenvanderveen Sep 30, 2025
2af5a44
fix rerankers version
eelcovdw Sep 30, 2025
3b58acb
fix
koenvanderveen Sep 30, 2025
8b68616
Merge branch 'eelco/scraping' of github.com:OpenMined/agentic-syftbox…
koenvanderveen Sep 30, 2025
8d78d81
fix fecther, fix list add
koenvanderveen Sep 30, 2025
049dbaf
fix summaries, dates and generation
koenvanderveen Sep 30, 2025
556a593
fix a bunch of things
koenvanderveen Sep 30, 2025
7ee79bb
-
koenvanderveen Oct 6, 2025
6c4e205
Merge pull request #61 from OpenMined/eelco/scraping
koenvanderveen Oct 6, 2025
8b6d2e3
add browser stealth
eelcovdw Oct 6, 2025
e154bc7
remove script
eelcovdw Oct 6, 2025
9a0e28a
-
koenvanderveen Oct 6, 2025
bd91943
Merge branch 'eelco/browser-stealth' of github.com:OpenMined/agentic-…
koenvanderveen Oct 6, 2025
6e3b960
implement updating of lists
koenvanderveen Oct 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
packages/notes_mcp/data/*
.claude/settings.local.json
*/.DS_Store
**/.DS_Store
.DS_Store

data/*

examples/home_latest_timeline.json
examples/home_latest_timeline_2.json

# Byte-compiled / optimized / DLL files
__pycache__/
Expand Down
25 changes: 25 additions & 0 deletions examples/arxiv_downloader.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import json

import arxiv

# Search for newest AI articles
search = arxiv.Search(
query="cat:cs.AI",
max_results=5,
sort_by=arxiv.SortCriterion.SubmittedDate,
sort_order=arxiv.SortOrder.Descending,
)

results = []
for result in search.results():
results.append(
{
"title": result.title,
"authors": [author.name for author in result.authors],
"summary": result.summary,
"published": result.published.strftime("%Y-%m-%d"),
"pdf_url": result.pdf_url,
}
)

print(json.dumps(results, indent=2))
17 changes: 17 additions & 0 deletions examples/browseruse.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import asyncio

from browser_use import Agent, ChatAnthropic
from dotenv import load_dotenv

load_dotenv()


async def main():
agent = Agent(
task="Go to x.com, then wait until the user has logged in. Once tweets are loaded on the screen print the first 10 tweets.",
llm=ChatAnthropic(model="claude-sonnet-4-0", temperature=0.0),
)
await agent.run()


asyncio.run(main())
54 changes: 54 additions & 0 deletions examples/hf_daily_papers_downloader.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import os
from datetime import datetime, timedelta

import requests

# --- CONFIG ---
API_KEY = os.getenv("HF_PAPERS_KEY")
MONTH = 9 # September
YEAR = 2025
TOP_N = 10


# --- FUNCTION TO FETCH PAPERS FOR A GIVEN DATE ---
def fetch_papers_for_date(date_str):
url = f"https://huggingface.co/api/daily_papers?date={date_str}"
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json() # List of papers
else:
print(f"Failed to fetch {date_str}: {response.status_code}")
return []


# --- COLLECT PAPERS FOR THE MONTH ---
papers = []
start_date = datetime(YEAR, MONTH, 1)
end_date = (start_date.replace(month=MONTH % 12 + 1) - timedelta(days=1)).day

for day in range(1, end_date + 1):
# INSERT_YOUR_CODE
date_obj = datetime(YEAR, MONTH, day)
if date_obj > datetime.now():
continue
date_str = f"{YEAR}-{MONTH:02d}-{day:02d}"
daily_papers = fetch_papers_for_date(date_str)
papers.extend(daily_papers)

# --- SORT BY POPULARITY (UPVOTES) ---
print(papers[0]["paper"]["upvotes"])
papers_sorted = sorted(
papers, key=lambda x: x.get("paper", {}).get("upvotes", 0), reverse=True
)
# print(papers_sorted[0])
print(len(papers_sorted))

# --- TAKE TOP N ---
top_papers = papers_sorted[:TOP_N]

# --- PRINT RESULTS ---
for i, paper in enumerate(top_papers, start=1):
print(
f"{i}. {paper['title']} ({paper.get('paper', {}).get('upvotes', 0)} upvotes) - {paper.get('url', '')}"
)
54 changes: 54 additions & 0 deletions examples/parse_tweets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import json

# Load your JSON response (replace with your variable or file)
with open("home_latest_timeline.json", "r", encoding="utf-8") as f:
data = json.load(f)

results = []

# Navigate to the entries
entries = data["data"]["home"]["home_timeline_urt"]["instructions"][0]["entries"]

for entry in entries:
content = entry.get("content", {})
item_content = content.get("itemContent", {})

# Skip if not a Tweet
if item_content.get("__typename") != "TimelineTweet":
continue

tweet = item_content["tweet_results"]["result"]
user = tweet["core"]["user_results"]["result"]

# Extract details
name = user["core"]["name"]
handle = "@" + user["core"]["screen_name"]
date = tweet["legacy"]["created_at"]
likes = tweet["legacy"].get("favorite_count", 0)
retweets = tweet["legacy"].get("retweet_count", 0)
text = tweet["legacy"]["full_text"]

# "Reactions" = likes + retweets + replies + quotes + bookmarks
reactions = (
likes
+ retweets
+ tweet["legacy"].get("reply_count", 0)
+ tweet["legacy"].get("quote_count", 0)
+ tweet["legacy"].get("bookmark_count", 0)
)

results.append(
{
"name": name,
"handle": handle,
"date": date,
"likes": likes,
"retweets": retweets,
"reactions": reactions,
"text": text,
}
)

# Example: print results
for r in results:
print(r)
109 changes: 109 additions & 0 deletions examples/twitter_scrape_wiith_cookie.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import asyncio
import json
from http.cookiejar import Cookie
from pathlib import Path

import browser_cookie3

# Keep all cookies that might be relevant for authentication
x_cookies = []
for c in browser_cookie3.brave(domain_name="x.com"):
if c.domain == ".x.com" and c.name in ["auth_token"]:
x_cookies.append(c)
print("Found x auth_token")

print(x_cookies)


def cookie_to_playwright_cookie(cookie: Cookie) -> dict:
cookie_dict = {
"name": cookie.name,
"value": cookie.value,
"domain": cookie.domain.lstrip("."), # Playwright expects no leading dot
"path": cookie.path,
"secure": bool(cookie.secure),
"httpOnly": getattr(cookie, "httponly", False)
or c.get_nonstandard_attr("HttpOnly", False),
}
# Optional: expires
if cookie.expires is not None:
cookie_dict["expires"] = cookie.expires
return cookie_dict


def is_home_latest_timeline_url(url):
if "graphql" in url and ("HomeLatestTimeline" in url or "HomeTimeline" in url):
return True
return False


async def on_request(request):
if is_home_latest_timeline_url(request.url):
# INSERT_YOUR_CODE
response = await request.response()
if response is not None:
try:
json_data = await response.json()
from datetime import datetime

dt_str = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"home_latest_timeline_{dt_str}.json"
output_path = Path(".").parent / "data" / filename
output_path.parent.mkdir(parents=True, exist_ok=True)
with open(output_path, "w") as f:
json.dump(json_data, f)
print(f"Saved JSON to {filename}")
except Exception as e:
print(f"Failed to get JSON from response: {e}")

print("API call to HomeLatestTimeline")


async def playwright_login_with_cookies():
from playwright.async_api import async_playwright

# Use the first cookie found (auth_token) for x.com
cookies = []
for c in x_cookies:
cookies.append(cookie_to_playwright_cookie(c))

async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
context = await browser.new_context()
# Set cookies before navigating
await context.add_cookies(cookies)
# Print all cookies currently in the context
cookies_in_context = await context.cookies()
print("All cookies in context after setting:")
for cookie in cookies_in_context:
print(cookie)
page = await context.new_page()
await asyncio.sleep(3)
page.on("request", on_request)

await page.goto("https://x.com")

# INSERT_YOUR_CODE
# Print all spans content with class "r-poiln3"
await asyncio.sleep(3)

# INSERT_YOUR_CODE
# Find the span (button) that says "Following" and click it
following_span = await page.query_selector("span:has-text('Following')")
if following_span:
await following_span.click()
print("Clicked the 'Following' button.")
else:
print("Could not find the 'Following' button.")

# spans = await page.query_selector_all("span.r-poiln3")
# print("Contents of all <span class='r-poiln3'> elements:")
# for span in spans:
# text = await span.text_content()
# print(text)
await asyncio.sleep(10000)
await browser.close()


# Run the async function
asyncio.run(playwright_login_with_cookies())
Binary file removed other_packages/whisper/.DS_Store
Binary file not shown.
32 changes: 32 additions & 0 deletions packages/omni/.claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"permissions": {
"allow": [
"Read(/Users/koen/workspace/toolbox/data/**)",
"Read(/Users/koen/workspace/toolbox/data/**)",
"Read(/Users/koen/workspace/toolbox/data/**)",
"Read(/Users/koen/workspace/toolbox/packages/discord_mcp/discord_mcp/**)",
"Bash(curl:*)",
"Bash(python:*)",
"Read(/Users/koen/workspace/toolbox/data/**)",
"Bash(sqlite3:*)",
"Read(/Users/koen/workspace/toolbox/data/**)",
"Read(/Users/koen/workspace/toolbox/data/**)",
"Read(/Users/koen/workspace/toolbox/data/**)",
"Read(/Users/koen/workspace/toolbox/packages/toolbox_store/tests/**)",
"Read(/Users/koen/workspace/toolbox/**)",
"Read(/Users/koen/workspace/toolbox/packages/toolbox_store/src/toolbox_store/**)",
"Read(/Users/koen/workspace/toolbox/packages/toolbox_store/src/toolbox_store/**)",
"Read(/Users/koen/workspace/toolbox/packages/toolbox_store/src/toolbox_store/**)",
"Read(/Users/koen/workspace/toolbox/packages/toolbox_store/src/toolbox_store/**)",
"Read(/Users/koen/workspace/toolbox/data/**)",
"Read(/Users/koen/workspace/toolbox/**)",
"Read(/Users/koen/workspace/toolbox/data/**)",
"Read(/Users/koen/workspace/toolbox/packages/toolbox_store/tests/**)",
"Read(/Users/koen/workspace/toolbox/packages/toolbox_store/tests/**)",
"Read(/Users/koen/workspace/toolbox/packages/toolbox_store/tests/**)",
"Read(/Users/koen/workspace/toolbox/data/**)"
],
"deny": [],
"ask": []
}
}
19 changes: 19 additions & 0 deletions packages/omni/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
node_modules
dist
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

.DS_Store
.vscode
*.local
examples/twitter/
settings.local.json

55 changes: 55 additions & 0 deletions packages/omni/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Frontend

When you create frontend code, you are a Vue.js developer who will be creating frontend code using Vue 3 and Pinia for state management. You will receive a request for code and should implement it following specific guidelines and best practices.

Follow these important guidelines when writing the code:

**Architecture & State Management:**

- Use Pinia for all global state management
- Define stores in Pinia for any data that needs to be shared across components
- Use Vue 3 Composition API, only use Options API if absolutely necessary

**Component Guidelines:**

- Keep components at an average size - not too small (avoid over-componentization) and not too large (break down if getting unwieldy)
- Focus on single responsibility principle for each component
- Use simple Vue concepts - avoid overly complex patterns, advanced directives, or esoteric features
- Prefer straightforward, readable code over clever implementations

**Styling Rules:**

- Never use inline CSS styles
- Use a single CSS file for all custom styles
- Clean up any unused CSS - remove any styles that aren't being used
- Use Tailwind CSS classes as much as possible for styling
- Only write custom CSS when Tailwind doesn't provide the needed functionality
- Follow good CSS practices: use meaningful class names, avoid deep nesting, prefer flexbox/grid for layouts

**Code Behavior:**

- Do not refactor existing code unless explicitly asked to do so
- Implement exactly what is requested without making assumptions about additional features
- Write clean, maintainable code that follows Vue.js best practices
- Use proper Vue lifecycle hooks when needed
- Handle errors appropriately

**Output Format:**
Provide your response with clear file structure. If multiple files are needed, clearly separate them with file names as headers. Include:

- Vue component files (.vue)
- Pinia store files (.js) if needed
- CSS file if custom styles are required
- Any other necessary files

# Backend

When writing backend python code, take the following into consideration

- use fastapi for the backend
- when returning from an api endpoint, always use pydantic models
- when initializing a pydantic model from database values, use a classmethod like `from_sqlite_row`
- when querying data, do as much as possible in the query for efficiency, only fall back to python if it would complicate things a lot
- keep query logic as much as possible in single file

Write the complete, functional code that addresses the code request while following all the guidelines above.
Loading