New /hitherdither page with design picker, algorithm/palette controls,
side-by-side preview, palette swatch display, and PNG download.
Nav link added between Upload and Shop.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Full-res images (1743x1786) took 45s for error diffusion, hitting
Cloudflare's timeout. Downscaling to 1024px max keeps it under 10s.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The 2>&1 redirect captured stderr log messages into EXPORTS variable,
causing eval to fail on "[infisical] ..." lines. Now only lines
starting with "export" are eval'd.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reinforces the r-suite "your tools" philosophy across all rApp landing pages.
Also normalizes title separators to em-dash for consistency.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Frontend was crashing with "Unexpected token 'I'" when the backend
returned plain text errors (e.g. "Internal Server Error" from proxy).
Now safely falls back to response.text() when JSON parsing fails.
Also prevents backend from swallowing HTTPException in catch-all.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Simplify deployment to serve only the static landing page at rswag.online.
The actual swag app now lives in rspace-online at /demo/swag.
Remove PostgreSQL, Redis, FastAPI backend, and Next.js frontend services.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CLAUDE.md may contain project context with credentials and is now
covered by global gitignore to prevent accidental secret commits.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace custom HeaderBar with standard Header.tsx + SwagNavActions
- AppSwitcher: rTube/rSwag → Creating, rSocials → Sharing, rData → Observing
- EcosystemFooter: updated link order to match new categories
- UserMenu: 🔑 Sign In button, 🔐 lock when logged in
- SpaceSwitcher: reads EncryptID token, sends Bearer header
- /api/spaces proxy: forwards to rspace.online (canonical spaces)
- /api/me: verifies EncryptID token for auth status
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Consolidating rswag-online static landing page into landing/ directory
before renaming this repo to rswag-online on Gitea.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Traefik wildcard HostRegexp for <space>.r*.online subdomains
- Middleware subdomain extraction and path rewriting
- Provision endpoint with owner_did acknowledgement
- Registry enforces space ownership via EncryptID JWT
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The rSwag Infisical project has stale SMTP values that can't be
updated (admin identity not a project member). Fetch authoritative
SMTP_HOST, SMTP_USER, and SMTP_PASSWORD from claude-ops /mail
folder which overrides stale values from both .env and rSwag
Infisical project.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entrypoint now fetches RSWAG_SMTP_PASSWORD from claude-ops /mail
folder if SMTP_PASSWORD is not already set. This allows the rSwag
container to get its SMTP credentials without needing direct write
access to the .env file.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All email sending now uses mail.rmail.online as the SMTP host,
replacing the legacy mx.jeffemmett.com hostname.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- EmailService with async SMTP via aiosmtplib (Mailcow)
- HTML email templates matching rSwag dark theme branding
- Order confirmation sent after successful Mollie payment
- Shipping notification with tracking info sent when POD ships
- Non-blocking: email failures logged but don't break order flow
- SMTP config: smtp_host, smtp_port, smtp_user, smtp_password in .env
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Space links now go to <space>.<app-domain> (e.g., myspace.rswag.online)
instead of rspace.online/<space>. Matches the standard rApp header
pattern used across all rStack apps.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Matches the rApp header pattern: [AppSwitcher | SpaceSwitcher | Logo].
SpaceSwitcher fetches available spaces from /api/spaces and allows
switching between community storefronts (rSwag, Fungi Flows, etc.).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add @encryptid/sdk (vendored) for WebAuthn passkey authentication
- Add zustand auth store matching rMaps/rWork pattern
- Create AuthButton component (sign in / register / sign out)
- Create HeaderBar client component: AppSwitcher + logo + nav + auth + cart
- Remove custom SpaceSwitcher (not part of standard rApp header)
- Fix hero: "Noticed" and "rMerch" now use same gradient color
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Matches the shared header pattern used across rWork, rMaps, and other rApps.
AppSwitcher shows all 19 r* ecosystem apps grouped by category.
SpaceSwitcher allows switching between rSwag spaces (e.g. Fungi Flows).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Switch to dark theme by default (globals.css + default space.yaml)
- Rewrite landing page copy to emphasize community revenue streams
- "Revenue for Your Community" hero
- "Merch That Funds Your Mission" section with revenue breakdown
- Revenue routing to rFunds/DAOs/treasuries
- Step 1: "Upload or Create a Design"
- Step 3: "Ship Locally — Worldwide" (local fulfillment, less carbon)
- Features: Revenue Streams, Local Fulfillment replace old cards
- All designs now show on default space (space: all)
- DefectFi design gets hoodie product variant
- Fix light-mode hardcoded colors for dark compatibility (red-50, green-600)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaces simple hero+products page with full rApp-style landing:
- Ecosystem badge ("Part of the rSpace Ecosystem")
- Hero section with gradient text and dual CTA
- "How It Works" 3-step cards (Upload → Pick Products → Ship)
- 6-feature grid (AI Studio, Spaces, Zero Inventory, Mockups, Payments, Ecosystem)
- Featured products section (first 6, with "view all" link)
- CTA card with gradient background
- Sticky nav with logo badge, cart icon, and compact links
- r* ecosystem footer with links to all rApps
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Flood-fill from edges to make background transparent while
preserving white text, red accents, and bug illustrations.
Design now works on any shirt color.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v2 returns {data: [...]} (array) not {data: {...}} (object).
Also fixes mockup task polling to use ?id= query param and
extracts mockup_url from nested catalog_variant_mockups structure.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>