Transfer files to your Kobo e-reader wirelessly using a simple pairing code.
- Upload files from your computer or phone
- Download on your Kobo e-reader using a 6-character pairing code
- Server-rendered Kobo page (works on Kobo's limited browser)
- Supports all Kobo-compatible formats: EPUB, PDF, MOBI, TXT, CBZ, CBR, and more
- Sessions expire after 3 months (auto-extended on access)
- 5GB max file size
- On your computer: Visit
https://your-site.web.app/upload, get a 6-character pairing code, and upload files - On your Kobo: Open the browser, go to
https://your-site.web.app/kobo, enter the code, and download your files
The Kobo page (/kobo) is server-rendered via Cloud Functions, so it works on the Kobo's old WebKit browser which can't run modern JavaScript.
- Books: EPUB, PDF, MOBI, KEPUB
- Text: TXT, HTML, RTF
- Comics: CBZ, CBR
- Images: JPEG, PNG, BMP, TIFF, GIF
- Frontend: SvelteKit + TypeScript + Vanilla CSS (no Tailwind - for e-ink compatibility)
- Backend: Firebase (Firestore + Storage + Cloud Functions)
- Hosting: Firebase Hosting
- Go to Firebase Console
- Create a new project
- Upgrade to Blaze plan (required for Cloud Functions)
- Enable Firestore Database (start in test mode)
- Enable Storage (start in test mode)
- Register a web app and copy the config
Create a .env file with your Firebase config:
PUBLIC_FIREBASE_API_KEY=your-api-key
PUBLIC_FIREBASE_AUTH_DOMAIN=your-project.firebaseapp.com
PUBLIC_FIREBASE_PROJECT_ID=your-project-id
PUBLIC_FIREBASE_STORAGE_BUCKET=your-project.appspot.com
PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your-sender-id
PUBLIC_FIREBASE_APP_ID=your-app-id
# Install frontend dependencies
npm install
# Install Cloud Functions dependencies
cd functions && npm install && cd ..npm run devNote: The /kobo endpoint requires Cloud Functions, so it won't work locally without the Firebase emulator.
npm install -g firebase-tools
firebase loginnpm run buildcd functions && npm run build && cd ..firebase deploy --project your-project-idOr deploy individually:
# Deploy hosting only
firebase deploy --only hosting
# Deploy functions only
firebase deploy --only functions
# Deploy Firestore rules
firebase deploy --only firestore:rules
# Deploy Storage rules
firebase deploy --only storage:rulessend2kobo/
├── src/
│ ├── routes/ # SvelteKit pages
│ │ ├── +page.svelte # Home page
│ │ ├── upload/ # Upload page (for computers/phones)
│ │ └── download/ # Download page (modern browsers)
│ ├── components/ # Svelte components
│ └── lib/ # Utilities, Firebase config
├── functions/
│ └── src/
│ └── index.ts # Cloud Functions (kobo page, download proxy)
├── static/ # Static assets
└── build/ # Production build output
/kobo- Server-rendered download page for Kobo e-readers/download- Download proxy that sets correct filename headerscleanupExpiredSessions- Scheduled weekly (Sundays 3am UTC) to delete sessions expired 7+ days ago and their files
# Start dev server
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview
# Type check
npm run check
# Build functions
cd functions && npm run build- Upload page:
https://your-site.web.app/upload?code=ABC123- Reconnect to an existing session - Download page:
https://your-site.web.app/download?code=ABC123- Auto-connect with code - Kobo page:
https://your-site.web.app/kobo?code=ABC123- Auto-connect with code
The project uses GitHub Actions to automatically deploy on push to main. See .github/workflows/deploy.yml.
- Go to Firebase Console → Project Settings → Service Accounts
- Click "Generate new private key" → Download the JSON file
- Go to your GitHub repo → Settings → Secrets and variables → Actions
- Click "New repository secret"
- Name:
FIREBASE_SERVICE_ACCOUNT - Value: Paste the entire JSON content from the downloaded file
- Upgrade firebase-functions to latest version (
cd functions && npm install --save firebase-functions@latest)