From ecc45c689ec88833600d0ae279003eab8565fa76 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Mon, 12 Aug 2024 21:07:21 -0700 Subject: [PATCH] initial release --- .github/workflows/nextjs.yml | 96 ---------------- README.md | 152 +++++++++++++++++++++---- extension/dist.zip | Bin 94380 -> 94373 bytes extension/src/env.tsx | 2 +- extension/src/pages/EnvVarSettings.tsx | 6 +- extension/src/popup.tsx | 2 +- web/.github/workflows/nextjs.yml | 96 ---------------- web/package.json | 3 +- 8 files changed, 136 insertions(+), 221 deletions(-) delete mode 100644 .github/workflows/nextjs.yml delete mode 100644 web/.github/workflows/nextjs.yml diff --git a/.github/workflows/nextjs.yml b/.github/workflows/nextjs.yml deleted file mode 100644 index 4adf3c79e..000000000 --- a/.github/workflows/nextjs.yml +++ /dev/null @@ -1,96 +0,0 @@ -# Sample workflow for building and deploying a Next.js site to GitHub Pages -# -# To get started with Next.js see: https://nextjs.org/docs/getting-started -# -name: Deploy Next.js site to Pages - -on: - # Runs on pushes targeting the default branch - push: - branches: ["main"] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: false - -jobs: - # Build job - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Detect package manager - id: detect-package-manager - run: | - if [ -f "${{ github.workspace }}/yarn.lock" ]; then - echo "manager=yarn" >> $GITHUB_OUTPUT - echo "command=install" >> $GITHUB_OUTPUT - echo "runner=yarn" >> $GITHUB_OUTPUT - exit 0 - elif [ -f "${{ github.workspace }}/package.json" ]; then - echo "manager=pnpm" >> $GITHUB_OUTPUT - echo "command=install --frozen-lockfile" >> $GITHUB_OUTPUT - echo "runner=pnpx" >> $GITHUB_OUTPUT - exit 0 - else - echo "Unable to determine package manager" - exit 1 - fi - - name: Setup pnpm - uses: pnpm/action-setup@v4.0.0 - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: "20" - cache: ${{ steps.detect-package-manager.outputs.manager }} - - name: Setup Pages - uses: actions/configure-pages@v5 - with: - # Automatically inject basePath in your Next.js configuration file and disable - # server side image optimization (https://nextjs.org/docs/api-reference/next/image#unoptimized). - # - # You may remove this line if you want to manage the configuration yourself. - static_site_generator: next - - name: Restore cache - uses: actions/cache@v4 - with: - path: | - .next/cache - # Generate a new cache whenever packages or source files change. - key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} - # If source files changed but packages didn't, rebuild from a prior cache. - restore-keys: | - ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}- - - name: Install dependencies - run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }} - - name: Build with Next.js - run: pnpm next build - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ./out - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/README.md b/README.md index c4033664f..a67bb8830 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,142 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). +![og image](https://surfsense.net/og-image.png) -## Getting Started +# SurfSense -First, run the development server: +When I’m browsing the internet, I tend to save a ton of content—but remembering it all? Total brain freeze! ❄️ That’s where SurfSense comes in. SurfSense is like a Knowledge Graph 🧠 Brain 🧠 for anything you see on the World Wide Web. Now, you’ll never forget any browsing session. Just ask your personal knowledge base anything about your saved content, and voilà—instant recall! 🧑‍💻🌐 -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev -``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +## Key Features -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. +- 💡 **Idea**: Save any content you see on the internet in your own Knowledge Graph. +- 🔍 **Powerful Search**: Quickly find anything in your Web Browsing Sessions. +- 💬 **Chat with your Web History**: Interact in Natural Language with your saved Web Browsing Sessions. +- 🏠 **Self Hostable**: Open source and easy to deploy locally. +- 📊 **Use GraphRAG**: Utilize the power of GraphRAG to find meaningful relations in your saved content. -This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. +## How to get started? -## Learn More +Since the official Chrome extension for SurfSense is still under review, you'll need to set up the SurfSense Backend and SurfSense extension yourself for now. Don’t worry, it’s dead simple—just change a few environment variables, and you’ll be ready to go. -To learn more about Next.js, take a look at the following resources: +Before we begin, we need to set up our Neo4j Graph Database. This is where SurfSense stores all your saved information. For a quick setup, I suggest getting your free Neo4j Aura DB from [https://neo4j.com/cloud/platform/aura-graph-database/](https://neo4j.com/cloud/platform/aura-graph-database/) or setting it up locally. -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +After obtaining your Neo4j credentials, make sure to get your OpenAI API Key from [https://platform.openai.com/](https://platform.openai.com/). -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! +For authentication purposes, you’ll also need a PostgreSQL instance running on your machine. -## Deploy on Vercel +Now lets setup the SurfSense BackEnd +1. Clone this repo. +2. Go to ./backend subdirectory. +3. Setup Python Virtual Enviroment +4. Run `pip install -r requirements.txt` to install all required dependencies. +5. Update the required Environment variables in envs.py + +|ENV VARIABLE|Description | +|--|--| +| POSTGRES_DATABASE_URL | postgresql+psycopg2://user:pass@host:5432/database| +| API_SECRET_KEY | Can be any Random String value. Make Sure to remember it for as you need to send it in request to Backend for security purposes.| -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. -Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. +6. Backend is a FastAPI Backend so now just run the server on unicorn using command `uvicorn server:app --host 0.0.0.0 --port 8000` +7. If everything worked fine you should see screen like this. + +![backend](https://i.ibb.co/542Vhqw/backendrunning.png) + +After Setting up the BackEnd Lets do a quick build of the extension. + +1. Go to ./extension subdirectory. +2. Run `pnpm i` to install required dependencies. +3. Update Env variables at `./src/env.tsx` + +|ENV VARIABLE|Description | +|--|--| +| API_SECRET_KEY | Same String value your set for Backend | +| BACKEND_URL | Give hosted backend url here. Eg. `http://127.0.0.1:8000`| + +4. Run `pnpm run build` to build your extension. Build will be generated in `./dist` folder +5. Enable Developer Mode in Chrome and load the extinction from `./dist` folder. +6. Extension will load successfully. + +Now resister a quick user through Swagger API > Try it Out: http://127.0.0.1:8000/docs#/default/register_user_register_post + +Make Sure in request body `"apisecretkey"` value is same value as `API_SECRET_KEY` we been assigning. + +--- + +Now you are ready to use SurfSense. Start by first logging into the Extension. + +When you start the extension you should see a Login page like this + +![extension login](https://i.ibb.co/qkkR5Lt/extlogin.png) + +After logging in you will need to fill your Neo4j Credentials & OpenAPI Key. + +![settings](https://i.ibb.co/j5PT171/extreqvalues.png) + +After Saving you should be able to use extension now. +![main](https://i.ibb.co/pvHCDSb/extmain.png) + +|Options|Explanations| +|--|--| +| Clear Inactive History Sessions | It clears the saved content for Inactive Tab Sessions. | +| Save Current Webpage Snapshot | Stores the current webpage session info into SurfSense history store| +| Save to SurfSense | Processes the SurfSense History Store & Initiates a Save Job | + +--- +Now just start browsing the Internet. Whatever you want to save any content take its Snapshot and save it to SurfSense. After Save Job is completed you are ready to ask anything about it to your Knowledge Graph Brain 🧠. + +If you don't want to deal with frontend local setup you can quickly go to https://www.surfsense.net/ and start interacting with your Knowledge Graph Brain 🧠. +Just login to SurfSense at https://www.surfsense.net/ using these demo credentials +|key|val| +|--|--| +| Username | test | +| Password | test| + +and then set the credentials of Neo4j & OpenAPI in https://www.surfsense.net/settings. + +--- + +For local frontend setup just fill out the `.env` file of frontend. + +|ENV VARIABLE|Description | +|--|--| +| NEXT_PUBLIC_API_SECRET_KEY | Same String value your set for Backend & Extension | +| NEXT_PUBLIC_BACKEND_URL | Give hosted backend url here. Eg. `http://127.0.0.1:8000`| +| NEXT_PUBLIC_RECAPTCHA_SITE_KEY | Google Recaptcha v2 Client Key | +| RECAPTCHA_SECRET_KEY | Google Recaptcha v2 Server Key| + +and run it using `pnpm run dev` + +--- + +After that just go to https://www.surfsense.net/chat and start interacting. +As an example lets visit : https://myanimelist.net/anime/season (Summer 2024 Anime atm) and save it to SurfSense. + +Now lets ask SurfSense "Give list of summer 2024 animes with images." + +Sample Response: +![res](https://i.ibb.co/k23FHzs/frontres.png) + +Now Let's ask it more information about our related session. +![more](https://i.ibb.co/PWzM97G/front-more-info.png) + +Sample More Description Response: +![enter image description here](https://i.ibb.co/cYtWJbB/more-info-out.png) + + + +## Tech Stack + + - **Extenstion** : Chrome Manifest v3 + - **BackEnd** : FastAPI with LangChain + - **FrontEnd**: Next.js with Aceternity. + +#### Architecture: +In Progress........... + + + +## Contribute + +Contributions are very welcome! A contribution can be as small as a ⭐ or even finding and creating issues. +Fine-tuning the Backend is always desired. + diff --git a/extension/dist.zip b/extension/dist.zip index a2513fb0109edd2465dfe067935ac56b94ab4c3f..9d96aec680f72eaad0b4011bc0a69d75ac88084e 100644 GIT binary patch delta 10322 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 delta 10367 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 P?NKN&uxV?+ztjH#hf5q^ diff --git a/extension/src/env.tsx b/extension/src/env.tsx index 06788c11b..067e78a06 100644 --- a/extension/src/env.tsx +++ b/extension/src/env.tsx @@ -1,2 +1,2 @@ export const API_SECRET_KEY = "SURFSENSENGvKkWM2VwcIlfFTOz3HR7zB0E4pHFM4llbT3BlbkFJJ0Ood1rgtXbvEXq6Lf" -export const BACKEND_URL = "http://18.227.190.91:8000" \ No newline at end of file +export const BACKEND_URL = "https://www.clashforacure.org" \ No newline at end of file diff --git a/extension/src/pages/EnvVarSettings.tsx b/extension/src/pages/EnvVarSettings.tsx index 826246a85..09e8903e5 100644 --- a/extension/src/pages/EnvVarSettings.tsx +++ b/extension/src/pages/EnvVarSettings.tsx @@ -48,12 +48,12 @@ export const FillEnvVariables = () => {

- setNeourl(e.target.value)} name="neourl" id="neourl" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" /> + setNeourl(e.target.value)} name="neourl" id="neourl" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="neo4j url" />
- setNeouser(e.target.value)} name="neouser" id="neouser" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" /> + setNeouser(e.target.value)} name="neouser" id="neouser" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="neo4j username" />
@@ -61,7 +61,7 @@ export const FillEnvVariables = () => {
- setOpenaiKey(e.target.value)} name="openaikey" id="openaikey" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" /> + setOpenaiKey(e.target.value)} name="openaikey" id="openaikey" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="OpenAI API Key" />
{error &&

{error}

} diff --git a/extension/src/popup.tsx b/extension/src/popup.tsx index 8d1d791c1..1061a861d 100644 --- a/extension/src/popup.tsx +++ b/extension/src/popup.tsx @@ -70,7 +70,7 @@ export const Popup = () => { useEffect(() => { const verifyToken = async () => { const token = localStorage.getItem('token'); - console.log(token) + // console.log(token) try { const response = await fetch(`${BACKEND_URL}/verify-token/${token}`); diff --git a/web/.github/workflows/nextjs.yml b/web/.github/workflows/nextjs.yml deleted file mode 100644 index 68bf0db7c..000000000 --- a/web/.github/workflows/nextjs.yml +++ /dev/null @@ -1,96 +0,0 @@ -# Sample workflow for building and deploying a Next.js site to GitHub Pages -# -# To get started with Next.js see: https://nextjs.org/docs/getting-started -# -name: Deploy Next.js site to Pages - -on: - # Runs on pushes targeting the default branch - push: - branches: ["main"] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: false - -jobs: - # Build job - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Detect package manager - id: detect-package-manager - run: | - if [ -f "/home/runner/work/SurfSense/yarn.lock" ]; then - echo "manager=yarn" >> $GITHUB_OUTPUT - echo "command=install" >> $GITHUB_OUTPUT - echo "runner=yarn" >> $GITHUB_OUTPUT - exit 0 - elif [ -f "$/home/runner/work/SurfSense/package.json" ]; then - echo "manager=pnpm" >> $GITHUB_OUTPUT - echo "command=install --frozen-lockfile" >> $GITHUB_OUTPUT - echo "runner=pnpx" >> $GITHUB_OUTPUT - exit 0 - else - echo "Unable to determine package manager" - exit 1 - fi - - name: Setup pnpm - uses: pnpm/action-setup@v4.0.0 - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: "20" - cache: ${{ steps.detect-package-manager.outputs.manager }} - - name: Setup Pages - uses: actions/configure-pages@v5 - with: - # Automatically inject basePath in your Next.js configuration file and disable - # server side image optimization (https://nextjs.org/docs/api-reference/next/image#unoptimized). - # - # You may remove this line if you want to manage the configuration yourself. - static_site_generator: next - - name: Restore cache - uses: actions/cache@v4 - with: - path: | - .next/cache - # Generate a new cache whenever packages or source files change. - key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} - # If source files changed but packages didn't, rebuild from a prior cache. - restore-keys: | - ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}- - - name: Install dependencies - run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }} - - name: Build with Next.js - run: pnpm next build - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ./out - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/web/package.json b/web/package.json index a68c9ce55..1c9916789 100644 --- a/web/package.json +++ b/web/package.json @@ -37,5 +37,6 @@ "postcss": "^8.4.41", "tailwindcss": "^3.4.9", "typescript": "^5" - } + }, + "packageManager": "^pnpm@6.32.4" }