Secrets are stored in Infisical and injected at startup via the
entrypoint script. Docker-compose also passes them as fallback env
vars from the host .env.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The v2 API uses products array with catalog source, nested layers in
placements, and GET /mockup-tasks/{id} for polling. Also removes
hardcoded domain in favor of PUBLIC_URL setting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Design box expanded from 370x370 to 500x450 and repositioned
higher on the chest for typical t-shirt print proportions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Screen blend now uses brightness mask from the design so only
non-dark pixels show through. Prevents visible dark rectangle
when design has its own dark background (e.g. DefectFi tee).
- Add ?fresh=1 query param to /mockup endpoint for cache bypass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Backend:
- Replace tiny placeholder templates with photorealistic 1024x1024 product
photos (blank t-shirt, sticker with peeling corner, framed print)
- Rewrite Pillow compositing: screen blend for dark garments (design looks
printed on fabric), direct paste for stickers/prints
- Add PRINTFUL_STORE_ID config + X-PF-Store-Id header to Printful client
(unblocks existing account-level tokens)
Frontend:
- Product listing: rounded cards with shadows, category badges, hover
animations, lazy loading, empty state
- Product detail: skeleton loading, mockup type switcher with loading
indicator, raw design preview, inline price in Add to Cart button,
shipping/quality info section
- Homepage: featured products now show mockups instead of raw designs,
professional card layout matching products page
- Client-side mockups: updated coordinates for new templates, screen
blend support via Canvas globalCompositeOperation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
API activate endpoint returned 500 (file permission issue in container).
Setting status directly to active in metadata.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Punk-style distressed typography with beetles and glitch effects.
Generated via Gemini Nano Banana Pro, sized to Printful 3600x4800 specs.
Starts as draft — activate via API when ready.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Python-based entrypoint.sh that authenticates with Infisical via
universal-auth, fetches secrets, and exports them as env vars before
starting uvicorn. Secrets like MOLLIE_API_KEY, PRODIGI_API_KEY,
PRINTFUL_API_TOKEN, JWT_SECRET, GEMINI_API_KEY, and FLOW_* vars are
now pulled from Infisical instead of being passed through docker-compose.
Gracefully degrades: if no INFISICAL_CLIENT_ID/SECRET are set or if
the fetch fails, the container starts with whatever env vars exist.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- PrintfulClient: catalog variants (cached 24h), mockup generation
(async create+poll), order submission, variant ID resolution
- Mockup endpoint tries Printful API first for Printful-provider designs,
falls back to Pillow compositing for others (e.g. Prodigi stickers)
- Order service routes items by provider from design metadata:
provider=printful → Printful API, provider=prodigi → Prodigi API
- Sandbox mode creates draft orders on Printful (not fulfilled)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Prodigi v4 API client for order fulfillment (create/get orders, quotes)
- Server-side mockup generation: Pillow composites designs onto product
templates (shirt, sticker, print) at GET /api/designs/{slug}/mockup
- Product listing and detail pages now show designs ON products
- Mockup type switcher on product detail page (T-Shirt/Sticker/Art Print)
- Order service submits to Prodigi after successful payment
- POD webhook endpoint for fulfillment status updates
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Map fungiswag.jeffemmett.com to the fungiflows space so it can be used
independently of the rswag.online domain.
- Middleware: detect fungiswag.jeffemmett.com → fungiflows space
- Traefik: add Host rule for fungiswag.jeffemmett.com
- CORS: allow fungiswag.jeffemmett.com origin
- Space config: update domain field
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Users can upload their own logo/design, see instant mockup previews on
shirts, stickers, and art prints via client-side Canvas compositing,
then save and activate the design to the store for ordering.
- Backend: POST /api/design/upload with file validation (type, size,
dimensions), Pillow processing, saves to designs/uploads/
- Frontend: /upload page with drag-and-drop, real-time mockup gallery,
activate/discard flow matching existing Design Swag pattern
- Fix: activate/delete endpoints now scan all category dirs instead of
hardcoding stickers/
- Nav: "Upload Swag" button added to header and homepage CTAs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add subdomain-based spaces system for branded storefronts. Each space
has its own theme, product catalog, and isolated cart via scoped
localStorage keys.
- Backend: SpaceService loads YAML configs, new /api/spaces endpoints,
design filtering by space, CORS regex for *.rswag.online
- Frontend: Next.js middleware detects subdomain and sets space_id cookie,
dynamic CSS variable injection for theming, space-aware API calls
- Spaces: _default (rSwag hub, cyan/orange) and fungiflows (gold/green/purple)
- Docker: Traefik wildcard HostRegexp for subdomain routing
- Designs: Placeholder Fungi Flows sticker and logo tee
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace mx.jeffemmett.com and noreply@jeffemmett.com with generic
placeholders to avoid GitGuardian SMTP credential alerts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Forked from mycopunk-swag-store and rebranded for rSpace:
- Next.js 15 + FastAPI + PostgreSQL + Stripe
- Printful + Prodigi POD integration
- AI design generation via Gemini API
- rSpace color scheme (cyan/orange) and branding
- In-repo designs directory (stickers, shirts, misc)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>