Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
ee13d10
first phase of remodeling the worker
crosve Dec 20, 2025
565d796
working logic - still need to add in web parsing
crosve Dec 20, 2025
6ff88ea
bucketing ui deisgn v1
crosve Dec 22, 2025
367a979
new alembic version with folder table update
crosve Dec 22, 2025
1244064
folder put route working and connecting with the frontend
crosve Dec 23, 2025
cd89a8c
reverting to hardcoded ActiveMQ enviornment variables
angvit Dec 24, 2025
c6a7c67
indenting properly
crosve Dec 24, 2025
5121351
removing hard coded env variables
crosve Dec 24, 2025
65e9d97
adding psycong2 to the requirements.txt file
crosve Dec 24, 2025
2e786a1
bucket base processing(prior to testing)
crosve Dec 25, 2025
c242d13
finished v1 for bucket - not tested yet
crosve Dec 25, 2025
10be0e8
bucketing for reggex is working - need work on semantic matching'
crosve Dec 28, 2025
fd0c242
description column added to the folder and started to test matching algo
crosve Dec 29, 2025
203b05a
folder mebedding added and being generated upon folder creation'
crosve Dec 29, 2025
d4cb073
embedding is being generated when folder metadata is updated
crosve Dec 29, 2025
ad21916
first working algo for folder matching
crosve Dec 30, 2025
009a9fd
matching algo for folder improved (fuzz and centroid updated)
crosve Dec 31, 2025
edc2d83
handling edge cases when updating the folder update
crosve Dec 31, 2025
2c4498c
fixing overflowing of content
crosve Dec 31, 2025
95b7ed2
aligning the google signup button
crosve Jan 1, 2026
cc0d9a7
folder selection is available now
crosve Jan 1, 2026
0879442
folder penalization and some UI fixes
crosve Jan 2, 2026
52318ec
keeping it to only remove fodlers
crosve Jan 2, 2026
3e1574e
fixing merge conflict
crosve Jan 2, 2026
cdf56f2
fixing build issue
crosve Jan 2, 2026
a7fdc45
fixing input props for build
crosve Jan 2, 2026
9efb781
Merge pull request #74 from crosve/bucketing-feature
crosve Jan 2, 2026
3d88d14
pyscong version
crosve Jan 2, 2026
b3faf7c
Merge pull request #75 from crosve/bucketing-feature
crosve Jan 2, 2026
934a5fe
adding in psycong
crosve Jan 2, 2026
4ce8c44
updating the worker requiremnts
crosve Jan 2, 2026
a1a0a50
updating schema for MessageSchema
crosve Jan 2, 2026
4b2daa2
fixing title issue
crosve Jan 2, 2026
d31a2b9
fixing bucket processor issues
crosve Jan 2, 2026
13d24ee
refactoring api routes
crosve Jan 5, 2026
669d697
more refacoring for api routes
crosve Jan 6, 2026
dec50b5
updating the content routes
crosve Jan 6, 2026
b9c8fb4
use tags can now be added
crosve Jan 8, 2026
8ec7600
added demo video, cleaned up bookmark modal, and unified color scheme
angvit Jan 8, 2026
62380f3
Merge branch 'main' of https://github.com/crosve/Csphere
crosve Jan 20, 2026
7c251f4
updating the most up to date changes for main
crosve Jan 20, 2026
d7d9807
users are able to add tags and bulk delete them
crosve Jan 20, 2026
d4ac31e
user can input their edit
crosve Jan 20, 2026
a5323a9
adding in tag creation and editing
crosve Jan 21, 2026
85c9037
Merge pull request #76 from crosve/refactor-backend
crosve Jan 21, 2026
e6029ed
working code for firefox extension and fixing environment imports wit…
angvit Jan 22, 2026
2a860fc
restoring extension WIP from stash
angvit Jan 22, 2026
2c15b13
swicthing the bucket env name back
crosve Jan 22, 2026
f6a88c4
Renaming S3 environment variable and importing settings with get_sett…
angvit Jan 22, 2026
f904b6c
Merge branch 'main' of https://github.com/crosve/Csphere
angvit Jan 22, 2026
2b90019
fixing auth.py bucket naming
angvit Jan 22, 2026
1ac4b2e
working extension code for chrome and firefox browsers
angvit Jan 22, 2026
6da2407
some chrome etension changes - added the folder selection tab
crosve Jan 22, 2026
2080408
user tags are displayed and shown
crosve Jan 23, 2026
98bc73b
tag logic workaround - encountering pydnatic model parsing
crosve Jan 23, 2026
03809b1
new database revisions and tag insertion
crosve Jan 23, 2026
fe71d85
fixing category selection
crosve Jan 23, 2026
6e415a3
Merge branch 'main' of https://github.com/crosve/Csphere
crosve Jan 23, 2026
5ae1898
merging in main updates
crosve Jan 23, 2026
eac1b19
finalzing merged changes
crosve Jan 23, 2026
993fe10
Merge pull request #77 from crosve/chrome
crosve Jan 23, 2026
50c6a91
chrome bookmark extraction is logic is in place now
crosve Jan 24, 2026
df26004
bookmark from chrome export
crosve Jan 25, 2026
ebd837d
adding in user embedding for redsicover logic
crosve Jan 26, 2026
2b02181
updating the ci/cd pipeline
crosve Jan 26, 2026
d6cd08c
new embedding worker
crosve Jan 27, 2026
43aeb80
some further work with the embedding worker updated
crosve Jan 28, 2026
54a99ee
embedding worker v1 is functional
crosve Feb 2, 2026
d12a6ec
bookmarks showing up for redscovery page
crosve Feb 2, 2026
8f4a67f
kinor changes and updates
crosve Feb 2, 2026
f3c95ad
adding in the summary to the bookmark cards
crosve Feb 2, 2026
c9726c9
removed new keyword
crosve Feb 2, 2026
4f429e0
Merge pull request #78 from crosve/chrome
crosve Feb 2, 2026
eb61334
adding toml configs
crosve Feb 2, 2026
75048c0
Merge pull request #79 from crosve/chrome
crosve Feb 2, 2026
ce26536
exmaple env file
crosve Feb 3, 2026
20769f0
adding frontend env example
crosve Feb 4, 2026
8b19106
adding in some worker bug fixes - embedding issue
crosve Feb 4, 2026
0f64708
reorganized folder structure
crosve Feb 5, 2026
b317f8f
new layout for redsicover page and tags page
crosve Feb 9, 2026
9e96b1a
some minot changes - nothing really
crosve Feb 9, 2026
fce8fa0
deleting useless openai key
crosve Feb 9, 2026
a069c36
singlefile screenshot of page
crosve Feb 10, 2026
30bd023
adding work done to get snapshot of page
crosve Feb 11, 2026
f6bf157
Merge pull request #82 from crosve/singlefile
crosve Feb 11, 2026
8e06543
added in the requirements for csphere worker
crosve Feb 11, 2026
dc6b688
Merge pull request #83 from crosve/singlefile
crosve Feb 11, 2026
4e6ed16
updating browser args
crosve Feb 11, 2026
ad3b97f
Merge pull request #84 from crosve/singlefile
crosve Feb 11, 2026
7908715
forgot to do a json dump
crosve Feb 11, 2026
bb29134
Merge pull request #85 from crosve/singlefile
crosve Feb 11, 2026
b076fb6
Refactor: enqueue-only + worker HTML fetch
angvit Jan 30, 2026
156f75f
Refactor: enqueue-only + worker HTML fetch
angvit Jan 30, 2026
bf2a0d5
enabling light mode for every render
crosve Feb 23, 2026
a40d2de
first version of the notes editor
crosve Feb 23, 2026
9a79d51
full screen and notes downloader functioning
crosve Feb 24, 2026
06503cb
added 2 ways to download notes
crosve Feb 24, 2026
9866fcc
getting rid of some print statments
crosve Feb 25, 2026
23dee56
improving setup instructions and readme styling
angvit Jan 4, 2026
3664085
hardening extension code
angvit Feb 25, 2026
e244352
Optimize category filtering performance by improving caching mechanism
sparsha03 Mar 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
111 changes: 84 additions & 27 deletions .github/workflows/ci_cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,43 +6,68 @@ on:
- main

jobs:
confirm-changes:
name: confirm there are changes in the backend
deploy-backend:
name: deploy backend to tiptops server
runs-on: ubuntu-latest
outputs:
folder_changed: ${{ steps.check_files.outputs.folder_changed }}
steps:
- uses: actions/checkout@v4
- name: Execute remote ssh commands using passwords
uses: appleboy/ssh-action@v1
with:
fetch-depth: 2

- name: Find name of changes files with git
id: check_files
run: |
set +e
CHANGED_FILES=$(git diff --name-only ${{github.event.before}} ${{github.sha}} || true)
echo "changed files found: $CHANGED_FILES"

CHANGED_COUNT=$(echo "$CHANGED_FILES" | grep -c "backend")
host: ${{secrets.HOST}}
username: ${{secrets.USERNAME}}
password: ${{secrets.PASSWORD}}
port: ${{secrets.PORT}}

set -e
echo "file count that was changed: $CHANGED_COUNT"
script: |
echo "Starting deployment process"
# NOTE: Use 'sh' to avoid issues with inline script quoting
sudo -S bash -c '
cd /root/docker/csphere
#run the deployment script
./build-csphere-backend.sh
echo "deployment was a success"
' <<< "${{secrets.PASSWORD}}"

if [ "$CHANGED_COUNT" -gt 0 ]; then
echo "folder_changed=true" >> $GITHUB_OUTPUT
- name: Slack Notification
if: always()
run: |
if [[ "${{ job.status }}" == "success" ]]; then
STATUS_TEXT="Deployment Successful"
COLOR="#098824"
else
echo "folder_changed=false" >> $GITHUB_OUTPUT
STATUS_TEXT="Deployment Failed"
COLOR="#a80a0a"
fi

deploy-backend:
name: deploy backend to tiptops server
runs-on: ubuntu-latest
# needs: confirm-changes
REPO_URL="https://github.com/${{ github.repository }}"
RUN_URL="$REPO_URL/actions/runs/${{ github.run_id }}"
COMMIT_URL="$REPO_URL/commit/${{ github.sha }}"

curl -X POST -H 'Content-type: application/json; charset=utf-8' \
-H "Authorization: Bearer ${{ secrets.SLACK_TOKEN }}" \
--data "{
\"channel\": \"${{ secrets.SLACK_CHANNEL }}\",
\"attachments\": [
{
\"color\": \"$COLOR\",
\"title\": \"Csphere CI/CD Update - Backend\",
\"title_link\": \"$RUN_URL\",
\"text\": \"$STATUS_TEXT\n\n*Repository:* ${{ github.repository }}\n*Branch:* \`${{ github.ref_name }}\` \n*Commit:* <$COMMIT_URL|${{ github.event.head_commit.message }}>\n*Author:* ${{ github.actor }}\",
\"footer\": \"GitHub Actions • Build #${{ github.run_number }}\",
\"ts\": $(date +%s)
}
]
}" \
https://slack.com/api/chat.postMessage

deploy-worker:
name: deploy worker to the backend servers
runs-on: ununtu-latest

steps:
- name: Execute remote ssh commands using passwords
# if: needs.confirm-changes.outputs.folder_changed == 'true'
- name: Execute remote ssh commands
uses: appleboy/ssh-action@v1

with:
host: ${{secrets.HOST}}
username: ${{secrets.USERNAME}}
Expand All @@ -55,6 +80,38 @@ jobs:
sudo -S bash -c '
cd /root/docker/csphere
#run the deployment script
./build-csphere-backend.sh
./build-csphere-worker.sh
echo "deployment was a success"
' <<< "${{secrets.PASSWORD}}"

- name: Slack Notification
if: always()
run: |
if [[ "${{ job.status }}" == "success" ]]; then
STATUS_TEXT="Deployment Successful"
COLOR="#098824"
else
STATUS_TEXT="Deployment Failed"
COLOR="#a80a0a"
fi

REPO_URL="https://github.com/${{ github.repository }}"
RUN_URL="$REPO_URL/actions/runs/${{ github.run_id }}"
COMMIT_URL="$REPO_URL/commit/${{ github.sha }}"

curl -X POST -H 'Content-type: application/json; charset=utf-8' \
-H "Authorization: Bearer ${{ secrets.SLACK_TOKEN }}" \
--data "{
\"channel\": \"${{ secrets.SLACK_CHANNEL }}\",
\"attachments\": [
{
\"color\": \"$COLOR\",
\"title\": \"Csphere CI/CD Update - worker\",
\"title_link\": \"$RUN_URL\",
\"text\": \"$STATUS_TEXT\n\n*Repository:* ${{ github.repository }}\n*Branch:* \`${{ github.ref_name }}\` \n*Commit:* <$COMMIT_URL|${{ github.event.head_commit.message }}>\n*Author:* ${{ github.actor }}\",
\"footer\": \"GitHub Actions • Build #${{ github.run_number }}\",
\"ts\": $(date +%s)
}
]
}" \
https://slack.com/api/chat.postMessage
42 changes: 0 additions & 42 deletions .github/workflows/heroku.yaml

This file was deleted.

180 changes: 113 additions & 67 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,100 +1,146 @@
<img src="https://github.com/angvit/Content-Rediscovery-Platform/blob/main/frontend/public/cspherelogo2.png?raw=true" alt="logo" width="350" height="200"/>

<h1>Rediscover what matters — faster.</h1>



<h1 align="center">Csphere</h1>

<p align="center">
<a href="https://chromewebstore.google.com/detail/csphere/naacmldkjnlfmhnkbbpppjpmdoiednnn">
<img
src="https://img.shields.io/badge/Chrome-Install-blue?logo=googlechrome"
alt="Install Csphere on Chrome"
/>
</a>
&nbsp;&nbsp;
<a href="https://addons.mozilla.org/en-US/firefox/addon/csphere">
<img
src="https://img.shields.io/badge/Firefox-Install-orange?logo=firefoxbrowser"
alt="Install Csphere on Firefox"
/>
</a>
</p>

<hr />

<p>
Short for “content sphere”,
<a href="https://www.csphere.io/">Csphere.io</a> is a bookmark management application
and browser extension that allows users to easily save, search, and organize the
web content they consume.
</p>

<h2>Features</h2>

<ul>
<li>Save different forms of web content (e.g. articles, blogs, documentation)</li>
<li>Add context via notes, descriptions, and custom keyword tags</li>
<li>Organize content using a custom folder structure managed through Csphere’s backend UI</li>
<li>
Semantically search your content by meaning, time saved, or source
<br />
<em>(e.g. “Which articles have I read about jet engines this past month?”)</em>
</li>
<li>Cross-platform access across browsers and mobile devices</li>
</ul>

<hr />

<h2>Local Setup Guide</h2>

<p>
<strong>Note:</strong> This project uses
<a href="https://github.com/astral-sh/uv">uv</a> for Python dependency and virtual
environment management. All Python commands below assume
<code>uv</code> is installed and active.
</p>

<h3>1. Backend (Python + FastAPI)</h3>

<pre><code>cd backend
uv venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
uv pip install -r requirements.txt
uvicorn app.api.main:app --reload
</code></pre>

A full-stack web app and browser extension that helps users **save**, **summarize**, and **search** web content using **embeddings** and **ai-generated summaries**.

**Live App**: [https://www.csphere.io/]
<h3>2. Frontend (Next.js)</h3>

---
<pre><code>cd frontend
npm install
npm run dev
</code></pre>

# Chrome Extension Download
<h3>3. Chrome Extension (Local)</h3>

#### 1. Downonload the zipped folder from this link: [download](https://download-directory.github.io/?url=https%3A%2F%2Fgithub.com%2Fcrosve%2FCsphere%2Ftree%2Fmain%2Fchrome_extension)
#### 2. Extract the folder.
#### 3. Go to `chrome://extensions/` in Chrome.
#### 4. Enable **Developer mode**.
#### 5. Click **"Load unpacked"** and select the extracted folder.
<ol>
<li>Open <code>chrome://extensions</code></li>
<li>Enable <strong>Developer Mode</strong></li>
<li>Click <strong>Load Unpacked</strong></li>
<li>Select the <code>chrome_extension/</code> folder</li>
</ol>

## Local Setup
<hr />

### 1. Backend (Python + FastAPI)
<h2>Alembic Setup – Database Migrations</h2>

```bash
cd backend
python -m venv venv
source venv/bin/activate (for windows: source venv/scripts/Activate )
pip install -r requirements.txt
uvicorn app.api.main:app --reload
```
<h3>1. Install Alembic</h3>

API general structure
```bash
/<resource-prefix>/<resource-id>/<sub-resource>?<query-params>
```
<pre><code>uv pip install alembic</code></pre>

<h3>2. Initialize Alembic</h3>

### 2. Frontend (Next.js)
<pre><code>alembic init</code></pre>

```bash
cd frontend
npm install
npm run dev
```
<h3>3. Configure <code>alembic.ini</code></h3>

### 3. Chrome Extension
<p>
Set <code>sqlalchemy.url</code> to your PostgreSQL connection string.
</p>

1. Load the `chrome_extension/` folder into Chrome via `chrome://extensions`
<h3>4. Set Target Metadata</h3>

2. Enable Developer Mode -> "Load Unpacked" -> Select `chrome_extension/`
<pre><code>from app.db.base import Base
target_metadata = Base.metadata
</code></pre>

<h3>5. Create a Migration</h3>

### Alembic Setup - Database Migrations
<pre><code>alembic revision --autogenerate -m "create users table"</code></pre>

1. Install alembic
<h3>6. Apply Migration</h3>

```bash
pip install alembic
```
<pre><code>alembic upgrade head</code></pre>

2. Initialize Alembic at the root of the backend folder
<h3>Downgrade</h3>

```bash
alembic init
```
<pre><code>alembic downgrade -1</code></pre>

3. Configure your alembic INI file
set your sqlalchemy.url to your postgresql connector string
<hr />

<h2>Why Csphere?</h2>

4. Set Target Metadata
<p>
The problem we identified is for someone who parses thousands of pages of web content daily and experiences trouble locating where this content was consumed, be it on a Chrome or Firefox browser. The user possibly has thousands of web pages already saved in their bookmarks folders and are looking for a more intelligent and context-rich search and storage over their content.
</p>

In alembic/env.py, update the target_metadata to use your SQLAlchemy models' metadata.
<p>
Install this if you are tired of having thousands of tabs open on your browser, debating if they should be saved with your important bookmarks or not. With Csphere you centralize and take control over the content you consume while organizing your desktop.
</p>

For example, if you have a Base object defined in app/db/base.py:
<h2>FAQ</h2>

```bash
from app.db.base import Base # Adjust the path based on your project
target_metadata = Base.metadata
```
<h3>How do I pronounce Csphere?</h3>

5. Create a Migration Script
```bash
alembic revision --autogenerate -m "create users table"
```
6. Apply your migration to the database
<p>
Csphere is pronounced as "see-sphere".
</p>

```bash
alembic upgrade head
```
<h3>Can I start using Csphere now? </h3>

-To Downgrade a migration run this command
<p>
Visit <a href="https://www.csphere.io/">Csphere.io</a> and download the extension to start using Csphere.
</p>

```bash
alembic downgrade -1
```
<h3>Is Csphere free?</h3>

<p>
Yes, Csphere is 100% free to use.
</p>

Loading