Self-hosted AI t-shirt design pipeline — seven stages from trend research to Printify publish.
Part of World of Pasa.
A quick tour — the production board, the seven-stage pipeline, and provider-agnostic settings. Click the GIF for the full-quality video.
Each project moves through the seven-stage pipeline — gather idea → validate → prompts → generate → optimize → placement → review & publish.
Provider-agnostic by design — choose your AI, image, upscale, background-removal, and fulfillment providers per workspace or per stage.
- Documentation: printpasa-docs.pages.dev
- Live demo (read-only): printpasa-demo.pages.dev
- User guide: docs/users/getting-started
- Developer guide: docs/developers/getting-started
- Seven-stage workflow: gather idea → validate → prompts → generate → optimize → placement → review
- Provider-agnostic AI, image, background removal, and fulfillment integrations
- Better Auth: email/password + optional Google OAuth
- Telegram pipeline operator (
/idea, scheduled runs) - Docker, Fly.io, Vercel + Turso, Cloudflare Pages
git clone https://github.com/worldofpasa/printpasa.git
cd printpasa
pnpm install
cp .env.example .env
# Set NUXT_SESSION_PASSWORD and at least one AI key (e.g. NUXT_GEMINI_API_KEY)
pnpm db:push
pnpm devOpen http://localhost:3000. Sign up or sign in as superuser (NUXT_SUPERUSER_USERNAME / NUXT_SUPERUSER_PASSWORD).
cp .env.example .env
docker compose up --buildLocal development (pnpm dev) works with no extra config. When you deploy
(NODE_ENV=production), a few settings become required — the app will refuse
to boot without them, by design:
NUXT_SESSION_PASSWORD— a random string of at least 32 characters (openssl rand -base64 32). Missing/short = the app won't start in production.NUXT_PUBLIC_APP_URL— your public origin, e.g.https://shirts.example.com(required for auth cookies and OAuth callbacks; serve over HTTPS).NUXT_DISABLE_SIGNUP=true— recommended for internet-exposed instances, or strangers can register and spend your provider API keys.NUXT_TELEGRAM_WEBHOOK_SECRET— required only if you enable the Telegram bot.
None of this applies to local development.
With one AI provider key + local-bg + local upscale you can run stages 1–5. Fulfillment (Printify) is optional for stages 6–7.
PrintPasa runs without any managed cloud service:
-
Database: local SQLite by default (
TURSO_DATABASE_URL=file:./data/printpasa.db). Turso is optional. -
Image storage: image storage is S3-compatible. To avoid AWS entirely, run the bundled MinIO service:
docker compose --profile local-storage up --build
Then set in
.env:NUXT_S3_ENDPOINT=http://minio:9000 NUXT_S3_ACCESS_KEY_ID=minioadmin NUXT_S3_SECRET_ACCESS_KEY=minioadmin NUXT_S3_BUCKET=printpasa NUXT_S3_REGION=us-east-1
Create the
printpasabucket once via the MinIO console at localhost:9001. -
Text AI: works with any OpenAI-compatible endpoint (including local runtimes like Ollama/vLLM) — set a custom base URL in provider settings.
-
Image generation: currently requires a hosted provider (fal, Krea, Leonardo, Replicate). There is no local image-generation adapter yet, so this is the one remaining hard external dependency for stages 4–5. Background removal and upscale both have
localoptions.
Note: an S3-compatible store is required for image storage — there is no local-filesystem backend. MinIO (above), Cloudflare R2, or AWS S3 all work.
PrintPasa generates content with AI and publishes to print-on-demand services. You are responsible for intellectual-property compliance, content moderation, and per-request AI costs. Read DISCLAIMER.md before commercial use.
See CONTRIBUTING.md. Security reports: SECURITY.md.
MIT — see LICENSE.


