FlowDrive is a state-of-the-art, open-source multi-cloud storage platform that lets users bring their own cloud storage space (Google Drive & Cloudflare R2) under a unified, high-contrast Neobrutalism UI dashboard.
- π¨ Neobrutalism Design System: Built using
shadcn/uiNeobrutalism components β bold 4px black borders, drop shadows (4px 4px 0 #000), hover-shift interactions, and high-contrast typography (Space Grotesk&Inter). - π Multi-Account Google Drive Linking: Connect multiple Google Drive accounts to a single FlowDrive user profile. Switch default target drives with a single click.
- π‘οΈ Zero Data Lock-in: All permanent files live directly in your personal Google Drive inside a dedicated
FlowDrivefolder. - β±οΈ Temporary Auto-Expiring Storage: Store temporary files (1 hour, 24 hours, or 7 days) powered by Cloudflare R2 with automatic background cleanup schedules.
- π Parallel Upload Pool: Up to 5x multi-threaded parallel file uploads with live progress tracking and instant user cancellation support.
- π Enterprise-Grade Security:
- SHA-256 + Bcrypt password hashing for local accounts.
- Signed cryptographic state tokens (
itsdangerous) carrying PKCEcode_verifierfor OAuth 2.0. - SHA-256 derived Fernet symmetric encryption (AES-128-CBC) for storing Google OAuth refresh tokens securely.
SameSite=None; Securecross-site ASGI session cookies.
- Framework: React 19 + Vite
- UI & Components: Neobrutalism UI (
shadcn/uiprimitive set) - Styling: Tailwind CSS v4 + CSS Design Tokens
- Icons & Notifications: Lucide React + Sonner Toasts
- Framework: FastAPI (Python 3.11)
- Database ORM: SQLAlchemy 2.0 (SQLite & PostgreSQL compatible)
- Security & Encryption: Cryptography (Fernet), PyCryptodome, Bcrypt, ItsDangerous
- Background Tasks: APScheduler (Automated temporary file cleanup)
- Logging: Structlog + JSON-formatted unbuffered standard output
| Component | Platform | Live URL |
|---|---|---|
| Frontend UI | Cloudflare Pages | https://flowdrive-80s.pages.dev |
| Backend API | Render (Docker) | https://flowdrive-backend-2.onrender.com |
Follow this guide to deploy your own instance of FlowDrive with your own Google OAuth Client Credentials!
- Go to the Google Cloud Console.
- Create a new project named FlowDrive.
- Navigate to APIs & Services > Library and search for Google Drive API. Click Enable.
- Go to APIs & Services > OAuth consent screen:
- Choose External user type.
- Fill in app name (FlowDrive), user support email, and developer contact information.
- Under Scopes, add the following scopes:
openidhttps://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/userinfo.profilehttps://www.googleapis.com/auth/drive.file(Restricted scope β only accesses files created by FlowDrive)
- Add test users (your email address) if your app status is in Testing.
- Go to APIs & Services > Credentials > Create Credentials > OAuth client ID:
- Application Type: Web Application.
- Name:
FlowDrive Web Client. - Authorized JavaScript origins:
https://<your-cloudflare-pages-domain>.pages.devhttp://localhost:5173(for local development)
- Authorized redirect URIs:
https://<your-backend-render-domain>.onrender.com/api/v1/auth/google/callbackhttp://localhost:8000/api/v1/auth/google/callback(for local development)
- Copy your Client ID and Client Secret.
- Fork or push this repository to your GitHub account.
- Sign in to Render Dashboard and click New + > Web Service.
- Connect your GitHub repository.
- Select Docker as the Environment.
- Add the following Environment Variables in Render:
| Variable Name | Description | Example Value |
|---|---|---|
APP_ENV |
Application environment | production |
FRONTEND_URL |
Your Cloudflare Pages URL | https://your-flowdrive.pages.dev |
SESSION_SECRET |
Secret key for signed cookies | Any random 32+ character string |
TOKEN_ENCRYPTION_KEY |
Key for Fernet refresh token encryption | Any random 32+ character string |
GOOGLE_CLIENT_ID |
Your Google OAuth Client ID | 123456789-abc.apps.googleusercontent.com |
GOOGLE_CLIENT_SECRET |
Your Google OAuth Client Secret | GOCSPX-xyz123... |
GOOGLE_OAUTH_REDIRECT_URI |
Google OAuth Callback URL | https://your-flowdrive-backend.onrender.com/api/v1/auth/google/callback |
GOOGLE_DRIVE_FOLDER_NAME |
Folder created in user's Drive | FlowDrive |
- Click Create Web Service. Render will automatically build the Docker container and start your server!
- β‘ Pro Tip β Keep Free Render Instance Awake:
Render's free tier spins down web services after 15 minutes of inactivity. To prevent cold starts and keep your backend instantly responsive 24/7:
- Create a free account on cron-job.org or UptimeRobot.
- Set up an automated HTTP
GETrequest every 10-14 minutes targeting your/healthendpoint:https://<your-backend-render-domain>.onrender.com/health
- Log in to Cloudflare Dashboard and go to Workers & Pages.
- Click Create Application > Pages > Connect to Git.
- Select your repository.
- Configure Build Settings:
- Framework Preset:
Vite - Root directory:
/(or leave empty) - Build command:
cd frontend && npm install && npm run build - Build output directory:
frontend/dist
- Framework Preset:
- Under Environment Variables (Advanced), add:
VITE_API_BASE_URL:https://your-flowdrive-backend.onrender.com
- Click Save and Deploy. Cloudflare Pages will build and deploy your frontend globally!
- Python 3.11+
- Node.js 18+
- Git
git clone https://github.com/ShubhangDoley/FlowDrive.git
cd FlowDrivecd backend
python -m venv venv
# On Windows:
venv\Scripts\activate
# On Linux/macOS:
source venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000Backend will be running at http://localhost:8000 (Swagger docs at http://localhost:8000/docs).
cd frontend
npm install
npm run devFrontend will be running at http://localhost:5173.
FlowDrive API (/api/v1)
βββ /health [GET] Health check & DB status
βββ /auth
β βββ /register [POST] Register username/password
β βββ /login [POST] Authenticate user
β βββ /logout [POST] Clear session cookie
β βββ /me [GET] Fetch current authenticated user
β βββ /google/connect-url [GET] Fetch Google OAuth consent URL
β βββ /google/connect [GET] Direct OAuth redirect
β βββ /google/callback [GET] OAuth callback from Google
βββ /drive
β βββ /accounts
β βββ / [GET] List connected Google Drive accounts
β βββ /{id} [DELETE] Disconnect Drive account
β βββ /{id}/default [PATCH] Set default active Drive account
βββ /files
βββ / [GET] List all uploaded files
βββ /upload [POST] Upload file (Drive / R2)
βββ /{id} [DELETE] Remove file
βββ /{id}/download [GET] Download file from storage
Distributed under the MIT License. See LICENSE for more information.