A clean, modern client portal for freelancers and studios. Replace messy email threads and Drive folders with a professional workspace your clients will actually love.
Built with SvelteKit 5, Supabase, and Tailwind CSS.
Freelancer dashboard
- Project management with milestones, status tracking, and due date alerts
- Time tracking per project with running totals
- File uploads via Supabase Storage with signed download URLs
- Invoice creation and status management (draft → sent → paid)
- Client invitation via magic link email
- Internal notes per project (not visible to clients)
- Activity feed showing recent client comments
- Collapsible sidebar with persistent state
Client portal
- Clean, branded portal view per project
- Timeline/milestone progress
- File downloads
- Approve work or request revisions
- Comment thread
Auth
- Email/password signup and login
- Magic link client invitations
- Password reset flow
- Auth callback handler for invite links
| Layer | Choice |
|---|---|
| Framework | SvelteKit 5 (Svelte 5 runes) |
| Database | Supabase (PostgreSQL) |
| Auth | Supabase Auth |
| Storage | Supabase Storage |
| Styling | Tailwind CSS v4 |
| Icons | Phosphor Icons |
| Toasts | svelte-sonner |
| Runtime | Bun |
1. Clone and install
git clone https://github.com/dacrab/portlane
cd portlane
bun install2. Set up Supabase
supabase startCopy the keys from supabase status into .env:
PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
PUBLIC_SUPABASE_PUBLISHABLE_KEY=sb_publishable_...
SUPABASE_SECRET_KEY=sb_secret_...3. Run migrations and seed
supabase db reset
bunx tsx seed.ts4. Start dev server
bun devAfter running bunx tsx seed.ts:
| Role | Password | |
|---|---|---|
| Freelancer | alex@portlane.dev | password123 |
| Client | sarah@acmecorp.com | password123 |
| Client | james@startupxyz.com | password123 |
src/
├── lib/
│ ├── components/Sidebar.svelte
│ ├── stores.ts # sidebar collapsed state
│ ├── supabase.ts # browser client
│ └── database.types.ts # generated Supabase types
├── routes/
│ ├── (auth)/ # login, signup, forgot/reset password
│ ├── auth/callback/ # magic link handler
│ ├── dashboard/ # freelancer dashboard
│ │ ├── projects/
│ │ ├── invoices/
│ │ ├── clients/
│ │ └── settings/
│ ├── portal/ # client-facing portal
│ └── api/file-url/ # signed storage URLs
└── hooks.server.ts # SSR Supabase client + session
MIT