Commit Graph

32 Commits

Author SHA1 Message Date
Jeff Emmett 32c6cb6c91 ci: retrigger pipeline
CI/CD / deploy (push) Failing after 1m44s Details
2026-04-02 15:10:08 -07:00
Jeff Emmett 221d0940a9 ci: retrigger pipeline
CI/CD / deploy (push) Has been cancelled Details
2026-04-02 15:03:24 -07:00
Jeff Emmett f1ad44c936 fix(ci): use SSH-based container status check for smoke test
CI/CD / deploy (push) Failing after 2m11s Details
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 15:05:33 -07:00
Jeff Emmett 3f38091428 ci: use internal registry (bypass Cloudflare upload limit)
CI/CD / deploy (push) Successful in 29s Details
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 10:44:58 -07:00
Jeff Emmett 381a2a3fcf ci: add Gitea Actions CI/CD pipeline
CI/CD / deploy (push) Successful in 1m36s Details
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 10:29:14 -07:00
Jeff Emmett c48e9e741d chore: add backlog-notify onStatusChange hook
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 10:29:14 -07:00
Jeff Emmett 9e06d4dba4 Create task task-001 2026-02-16 05:25:47 +00:00
Jeff Emmett 9cf65260f0 Add AI agent instructions 2026-02-16 03:12:20 +00:00
Jeff Emmett cdd6e6bb99 fix: center slides with uniform margins and prevent image cropping
Images were getting cut off because the web layout used fit: "cover"
(which crops) instead of fit: "contain" (which scales to fit). Also
changed margins from inner-edges-only to uniform 0.125" on all sides
so each slide is properly centered in its 1/8th panel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 02:26:46 +00:00
Jeff Emmett ad135ed75e feat: edge-to-edge layout with inner gutters + B&W mode
- Margins now only between panels (0.125" gutters), not on page edges
- Content fills to outer edges of 8.5x11" page
- Added --bw flag for high-contrast black & white output
- Added --threshold option for B&W conversion (0-255)
- Optimized for zero-ink thermal printing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 15:09:46 +01:00
Jeff Emmett 9960a861ee fix: update regenerate-page to use gemini-2.0-flash-exp model
Old gemini-1.5-flash model is no longer available in v1beta API

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 23:28:55 -05:00
Jeff Emmett 3143e8e338 feat: add simple image generation API for canvas integration
- New /api/generate-image endpoint that returns base64 directly
- Uses RunPod proxy to bypass geo-restrictions
- Enables canvas-website MycroZine tool to generate images
- Includes CORS headers for cross-origin requests

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 23:16:48 -05:00
Jeff Emmett 44c30fa1a1 fix: correct print layout URL and separate preview from download
- Fixed print-layout API to return correct URL format (?print=true instead of /print)
- Modified print endpoint to only force download when &download=true is added
- Updated create page and share page to use download parameter for download button
- Print preview now renders properly as an image

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 22:42:45 -05:00
Jeff Emmett 1aec028c52 feat: switch to RunPod proxy for Gemini image generation
- Use RunPod serverless endpoint (US-based) to bypass EU geo-restrictions
- Add RUNPOD_API_KEY and RUNPOD_GEMINI_ENDPOINT_ID env vars
- Add fallback to direct Gemini API if RunPod not configured
- Endpoint ID: ntqjz8cdsth42i

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 22:10:13 -05:00
Jeff Emmett e5a7b67927 ci: add GitHub Action to build and push Gemini proxy image
Automatically builds the runpod-proxy Docker image and pushes to
GitHub Container Registry when changes are made to runpod-proxy/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 21:39:26 -05:00
Jeff Emmett 20f761218a feat: add RunPod serverless proxy for Gemini API
Creates a US-based proxy to bypass geo-restrictions on Gemini
image generation. RunPod runs in the US, allowing access to
Gemini's image generation from EU servers.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 21:33:33 -05:00
Jeff Emmett b96e20dcbc feat: add progress bar UI and styled placeholder images
- Add overall progress bar with percentage during page generation
- Add per-page progress indicators with checkmarks for completed pages
- Show current page title/type while generating
- Create styled placeholder images with actual page content when
  AI image generation is geo-blocked
- Style placeholders match selected zine style (punk, minimal, etc.)
- Add cache-busting timestamps to force image reload
- Update worker to return helpful error for geo-blocking

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 21:09:25 -05:00
Jeff Emmett 0c85c840a6 fix: use lazy initialization for Gemini SDK to use runtime env vars
The SDK was being initialized at module load time with the build-time
env var (empty string), instead of the runtime env var. Changed to
lazy initialization pattern that creates the client on first use.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 20:07:27 -05:00
Jeff Emmett 2e855c8875 chore: add explicit GEMINI_PROXY_URL env variable
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 20:01:37 -05:00
Jeff Emmett 06dc335013 feat: add Cloudflare Worker proxy for Gemini image generation
- Created gemini-proxy worker to route requests through US edge
- Updated generate-page to use proxy for bypassing geo-restrictions
- Gemini image generation is blocked in Germany, proxy routes through US

Worker URL: https://gemini-proxy.jeffemmett.workers.dev

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 19:45:31 -05:00
Jeff Emmett 779a0806a2 fix: correct image URL path to match API route
Changed from /api/zine/[id]/image/p1.png to /api/zine/[id]?image=p1
to match the actual API route handler.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 19:27:13 -05:00
Jeff Emmett 2099757b5d fix: update Gemini image generation to use correct API format
- Use gemini-2.0-flash-exp with responseModalities: ["TEXT", "IMAGE"]
- Remove invalid responseMimeType and non-existent model names
- Simplify to single model with placeholder fallback

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 19:21:24 -05:00
Jeff Emmett b001e4eec8 fix: update Gemini model from 1.5-flash to 2.0-flash
The gemini-1.5-flash model is not available in the v1beta API.
Updated to gemini-2.0-flash for outline generation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 19:11:34 -05:00
Jeff Emmett 584428d028 fix: use IPv4 address in healthcheck to fix Traefik detection
The healthcheck was using localhost which resolves to IPv6 [::1],
but Next.js only listens on IPv4. Changed to 127.0.0.1.
Also removed deprecated 'version' key from docker-compose.yml.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 18:59:55 -05:00
Jeff Emmett 0c5f98b6fe fix: add public directory for Docker build 2025-12-18 18:16:17 -05:00
Jeff Emmett efc6b8158b feat: add prompt-to-print web app at zine.jeffemmett.com
Full-stack Next.js 15 web application for creating mycro-zines:

Features:
- Text or voice input for concept description
- Style/tone selection (punk-zine, minimal, collage, etc.)
- AI-powered outline generation via Gemini
- 8-page image generation with refinement loop
- Print-ready PNG download (300 DPI)
- Shareable zine URLs (/z/[id])

Tech stack:
- Next.js 15 with App Router
- Tailwind CSS v4 + Radix UI
- Gemini API for text and image generation
- Sharp for print layout assembly
- Docker + Traefik for deployment

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 17:55:39 -05:00
Jeff Emmett 2aa9dacfc4 feat: add timestamped filenames and --name flag for print layouts
- Print layouts now auto-generate unique filenames with timestamps
- Added --name/-n flag to customize zine name in filename
- Example files default to 'undernet' as zine name
- Added --help flag with usage examples

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 19:16:46 -05:00
Jeff Emmett 10d9459990 feat: add QR code generator for zine CTAs
- generateQRCode() - create QR codes with punk-zine colors
- generateQRCodeDataURL() - for embedding in HTML/canvas
- generateZineQRCodes() - batch generate multiple QR codes
- generateUndernetQRCodes() - preset for Undernet zine
- CLI support: node src/qrcode.mjs <url> [options]
- Default colors: black QR on green background

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 19:11:38 -05:00
Jeff Emmett 6b848ccd03 feat: regenerate all 8 zine pages with correct dimensions and fixed text
- All pages now 3:4 aspect ratio (fits 7cm x 10.8cm panels)
- Fixed spelling errors:
  - Page 2: Clear readable text for all concepts
  - Page 3: Proper "METAcelium" formatting
  - Page 7: Fixed garbled text, now reads correctly:
    "TO GOVERN WITHOUT BEING GOVERNED"
    "TO REVEAL WITHOUT BEING REVEALED"
    "TO COORDINATE WITHOUT COERCION"
    "TECHNOLOGY FOR COMMUNITIES, NOT CORPORATIONS"
- Improved visual consistency across all pages
- Generated using Gemini 2.0 Flash Exp

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 19:06:21 -05:00
Jeff Emmett 1ff7a68d4f fix: correct print layout for traditional mini-zine folding
- Paper orientation: landscape 11"x8.5" (US Letter rotated)
- Panel size: 7cm x 10.8cm (825x1275 pixels at 300 DPI)
- Layout: 4 columns x 2 rows
- Top row (upside down): pages 1, 8, 7, 6
- Bottom row (right side up): pages 2, 3, 4, 5
- Updated folding instructions in README

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 18:56:45 -05:00
Jeff Emmett 9987ea3722 chore: initialize backlog for task tracking
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 18:46:57 -05:00
Jeff Emmett d8b5c2cd88 feat: initial mycro-zine generator toolkit
- Single-page print layout (2x4 grid) for 8-page zines
- Prompt templates for AI content/image generation
- Example Undernet zine pages
- Support for US Letter and A4 paper sizes
- CLI and programmatic API

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 18:37:45 -05:00