A Spreadsheet OpenSource applicaion inspired by GoogleSheet with templates and organiation feature
- Real time collaboration with live presence indicators
- Formula support
- Cell formatting — bold, italic, colors, borders, merges
- Column and row resize and management
- Data validation (Google Sheets-style panel)
- Chart support
- templates
- Export to CSV, PDF, JSON
- Organization and team sharing
- URL based invite system
- Frontend — Next.js 15, React, TypeScript, Tailwind CSS
- Spreadsheet — react-data-grid
- Backend/DB — Supabase (PostgreSQL, Realtime, RLS, Auth)
- Deployment — Vercel
- Node.js 18+
- Yarn (
npm install -g yarn) - A Supabase account (free tier works)
git clone https://github.com/hassan524/sheetsync.git
cd sheetsyncyarn installCreate a .env.local file in the root and paste the following, filling in your own values:
# ─── EMAIL ────────────────────────────────────────────────
# Get from: resend.com → API Keys
RESEND_API_KEY=
# ─── SUPABASE ─────────────────────────────────────────────
# Get from: Supabase Dashboard → Project Settings → API
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
# ─── APP URLS ─────────────────────────────────────────────
# Local dev: http://localhost:3000
NEXT_PUBLIC_APP_URL=
# Production: https://sheetsync.site
NEXT_PUBLIC_PROD_APP_URL=
# ─── FIREBASE (Client) ────────────────────────────────────
# Get from: Firebase Console → Project Settings → General → Your Apps
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=
NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=
# ─── FIREBASE ADMIN (Server-side push notifications) ──────
# Get from: Firebase Console → Project Settings → Service Accounts → Generate New Private Key
# Paste the full JSON as a single-line string
FIREBASE_SERVICE_ACCOUNT=
# ─── WEB PUSH (VAPID) ─────────────────────────────────────
# Get from: Firebase Console → Project Settings → Cloud Messaging → Web Push certificates
NEXT_PUBLIC_VAPID_KEY=
NEXT_PUBLIC_SUPABASE_URLandNEXT_PUBLIC_SUPABASE_ANON_KEYare safe to expose — they're designed for client-side use and your RLS policies protect the data. Never exposeSUPABASE_SERVICE_ROLE_KEYanywhere in client code.
- Create a new project at supabase.com
- Go to SQL Editor and run the migration files in order from
/db/ - Enable Email Auth under Authentication → Providers
- Optionally enable Google OAuth and add your credentials
- Copy your project URL and anon key from Settings → API into
.env.local
yarn devOpen http://localhost:3000.
Contributions are welcome! Here's how to get started:
| Type | Pattern | Example |
|---|---|---|
| Feature | feat/short-description |
feat/column-freeze |
| Bug fix | fix/short-description |
fix/merge-cell-scroll |
| Docs | docs/short-description |
docs/update-readme |
| Refactor | refactor/short-description |
refactor/sheet-client |
- Always branch off
mainand PR back intomain - Keep PRs focused — one feature or fix per PR
- Write a clear title and description explaining what changed and why
- Make sure the app runs locally before submitting
- No direct pushes to
main— all changes go through PRs
feat: add column freeze support
fix: resolve merge cell overflow on scroll
docs: update env variable instructions
refactor: extract useHistory hook
- TypeScript everywhere — avoid
any - Tailwind for all styling — no inline styles
- Keep components small and focused
- Add types for all props and function signatures
If you find a security vulnerability, please do not open a public issue.
Email hassanrehan9975@gmail.com or open a GitHub Security Advisory privately.
SheetSync uses Supabase RLS to ensure users can only access their own data and sheets they've been explicitly granted access to. RLS bypasses are treated as high-priority reports.
MIT © Hassan