OwnCardly
Features
- Drag & Drop Designer — Position text, images, shapes, icons, and QR codes on a visual canvas with snap-to-guide alignment
- 11 Starter Templates — Portrait and landscape designs, ready to customize
- Quick Create Flow — Pick a template, fill in your info, download — no account needed
- Company & Team Management — Manage multiple companies with people, photos, and custom fields
- CSV Bulk Import — Import entire teams with auto column mapping
- Asset Library — Upload logos, backgrounds, and icons per company
- Social Icons — LinkedIn, X/Twitter, Instagram, GitHub, and more with clickable links
- QR Code & vCard — Auto-generated QR codes and one-click contact download
- 18 Google Fonts — Full weight support (Light to Bold)
- Layers Panel — Reorder, group, lock, and hide elements like a proper design tool
- Undo/Redo — Ctrl+Z / Ctrl+Y with full history
- 10 Languages — English, German, French, Spanish, Portuguese, Italian, Dutch, Japanese, Chinese, Korean
- Guest Mode — Try everything without signing up (data stored locally)
- Mobile Responsive — Cards scale automatically on mobile devices
- Self-Contained Export — Generated HTML files work offline with embedded images, fonts, and vCards
- Google OAuth — Sign in with Google, data persists in Supabase
Tech Stack
| Layer |
Technology |
Framework
Next.js 16 (App Router)
Database
Supabase (PostgreSQL + Auth + Storage)
Styling
Tailwind CSS 4
Language
TypeScript 5
Drag & Drop
react-rnd
Animations
Framer Motion
QR Codes
qrcode
Image Cropping
react-easy-crop
CSV Parsing
PapaParse
ZIP Generation
JSZip
Quick Start
Prerequisites
- Node.js 18+
- Yarn
- A free Supabase account
Setup
-
Clone the repo
git clone https://github.com/kevinwielander/digital-business-cards.git
cd digital-business-cards
-
Install dependencies
-
Set up environment
cp .env.example .env.local
Fill in your Supabase URL and anon key from the Supabase Dashboard → Settings → API.
-
Set up database
npx supabase login
npx supabase link --project-ref YOUR_PROJECT_REF
npx supabase db push
-
Configure auth (optional, for Google sign-in)
- Create OAuth credentials in Google Cloud Console
- Add redirect URI:
https://YOUR_PROJECT_ID.supabase.co/auth/v1/callback
- Enable Google provider in Supabase → Authentication → Providers
-
Run the dev server
Open http://localhost:3000
Seed Sample Data (optional)
To populate with sample companies, people, and template assets:
npx tsx --env-file=.env.local scripts/seed-sample-assets.ts
Deployment
Vercel (Recommended)

Docker
docker build -t cardgen .
docker run -p 3000:3000 \
-e NEXT_PUBLIC_SUPABASE_URL=your-url \
-e NEXT_PUBLIC_SUPABASE_ANON_KEY=your-key \
cardgen
Self-Hosting
See Self-Hosting Guide for detailed instructions on deploying with Docker, Railway, or Render.
Project Structure
app/
api/ — API routes (card generation, image proxy)
auth/ — Auth callback and guest data migration
companies/ — Company management pages
components/ — All React components
designer/ — Card designer (canvas, layers, properties, icons)
create/ — Quick card creation flow
templates/ — Template management pages
lib/
i18n/ — Translation strings (10 languages)
supabase/ — Client helpers and constants
types.ts — TypeScript types
fonts.ts — Google Fonts config
sample-templates.ts — Starter template definitions
supabase/
migrations/ — Database migrations
Contributing
Contributions are welcome! See CONTRIBUTING.md for guidelines.
- Fork the repo
- Create a feature branch (
git checkout -b feat/amazing-feature)
- Commit your changes
- Push to the branch
- Open a Pull Request
License
MIT — free for personal and commercial use.
Acknowledgments