Post a job and receive quotes from local 3D printer owners in minutes.
CommerceTypeScript · PLpgSQLGitHub @marquina640OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
All code for printmarket
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A production-ready marketplace connecting clients who need 3D printing with printer owners who have the equipment.
Stack: Next.js 15 (App Router) · TypeScript · Tailwind CSS · Supabase (Auth + DB + Storage) · VercelRead the full README ↗A production-ready marketplace connecting clients who need 3D printing with printer owners who have the equipment.
Stack: Next.js 15 (App Router) · TypeScript · Tailwind CSS · Supabase (Auth + DB + Storage) · Vercel
git clone <your-repo>
cd print-marketplace
npm install
supabase/migrations/001_initial_schema.sqlIn Supabase Dashboard → Storage → New bucket:
job-filesThen run these policies in SQL Editor:
-- Allow authenticated users to upload
create policy "job_files_upload"
on storage.objects for insert
with check (bucket_id = 'job-files' and auth.role() = 'authenticated');
-- Allow authenticated users to read
create policy "job_files_read"
on storage.objects for select
using (bucket_id = 'job-files' and auth.role() = 'authenticated');
cp .env.example .env.local
Edit .env.local:
NEXT_PUBLIC_SUPABASE_URL=https://your-project-ref.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
NEXT_PUBLIC_APP_URL=http://localhost:3000
In Supabase Dashboard → Authentication → URL Configuration:
http://localhost:3000http://localhost:3000/auth/callbacknpm run dev
After signing up, run in Supabase SQL Editor:
update public.profiles
set role = 'admin', onboarding_complete = true
where email = '[email protected]';
git init
git add .
git commit -m "Initial commit"
gh repo create print-marketplace --public --push
npx vercel --prod
Or connect via the Vercel dashboard → Import Git Repository.
In your Vercel project → Settings → Environment Variables, add:
| Key | Value |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Your Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Your Supabase anon key |
SUPABASE_SERVICE_ROLE_KEY | Your service role key |
NEXT_PUBLIC_APP_URL | Your Vercel deployment URL |
In Supabase → Authentication → URL Configuration:
https://your-app.vercel.apphttps://your-app.vercel.app/auth/callbackprint-marketplace/
├── app/
│ ├── (auth)/ # Login & signup pages
│ │ ├── login/
│ │ └── signup/
│ ├── auth/callback/ # Supabase OAuth callback
│ ├── onboarding/ # Role selection
│ ├── (protected)/ # Authenticated routes
│ │ ├── layout.tsx # Auth guard + sidebar layout
│ │ ├── dashboard/
│ │ │ ├── client/ # Client dashboard
│ │ │ ├── printer/ # Printer owner dashboard
│ │ │ └── admin/ # Admin dashboard
│ │ ├── jobs/ # Jobs feed + new job form
│ │ │ └── [id]/ # Job detail + quote flow
│ │ ├── messages/ # Message threads
│ │ │ └── [jobId]/
│ │ └── profile/setup/ # Printer profile form
│ ├── page.tsx # Public landing page
│ └── layout.tsx # Root layout
├── components/
│ ├── ui/ # Button, Input, Badge, etc.
│ ├── layout/ # Navbar, Sidebar
│ ├── jobs/ # JobCard
│ ├── quotes/ # QuoteForm
│ └── messages/ # MessageThread (realtime)
├── lib/
│ ├── supabase/ # Browser + server clients
│ ├── types/ # Full TypeScript DB types
│ └── utils.ts # Helpers, constants
├── middleware.ts # Auth + onboarding guards
├── supabase/migrations/ # SQL schema + RLS policies
└── .env.example
| Table | Purpose |
|---|---|
profiles | One per user; stores role, display name |
printer_profiles | Equipment, materials, pricing for printer owners |
jobs | Client job postings |
job_files | Uploaded 3D model files per job |
quotes | Printer owner bids on jobs |
messages | Per-job chat (client ↔ accepted printer) |
reviews | Post-completion ratings |
platform_settings | Admin-managed key-value config |
All tables have Row-Level Security. See supabase/migrations/001_initial_schema.sql for full policies.
Stripe is prepared but not activated. When ready:
STRIPE_SECRET_KEY, NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY, STRIPE_WEBHOOK_SECRETstripe_enabled to true in platform_settingsapp/api/stripe/ routes for Connect onboarding and payment intents