{"id":50512545,"url":"https://github.com/andyfrith/productizer-etsy-web","last_synced_at":"2026-06-02T21:03:49.687Z","repository":{"id":359148968,"uuid":"1242764208","full_name":"andyfrith/productizer-etsy-web","owner":"andyfrith","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-20T19:56:35.000Z","size":325,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-20T20:38:07.833Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andyfrith.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-18T18:25:29.000Z","updated_at":"2026-05-20T19:56:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/andyfrith/productizer-etsy-web","commit_stats":null,"previous_names":["andyfrith/productizer-etsy-web"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/andyfrith/productizer-etsy-web","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andyfrith%2Fproductizer-etsy-web","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andyfrith%2Fproductizer-etsy-web/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andyfrith%2Fproductizer-etsy-web/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andyfrith%2Fproductizer-etsy-web/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andyfrith","download_url":"https://codeload.github.com/andyfrith/productizer-etsy-web/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andyfrith%2Fproductizer-etsy-web/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33835766,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-02T21:03:49.593Z","updated_at":"2026-06-02T21:03:49.681Z","avatar_url":"https://github.com/andyfrith.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# productizer-etsy-web\n\nProductizer is a product creation platform where a user creates digital and print on demand products for listings on the Etsy marketplace. Users create products for specific niches and micro-niches by selecting design concepts, variations and product types for specific niches and micro-niches.\n\n## Image Generator Module\n\nThis tool will facilitate creating, managing and storing design concepts and variations of a concept. Additionally, the user will be able to create or reference product type variations, for instance, a certain type of coffee mug. With both the design concept and product type variation selected the user will then select a target-niche, provided the marketing niche tool and iterate on product design mocks generated by Google Nano Banana, Nano Banana Pro, etc. The end designs will then be managed and potentially used in actual product design listings for products sold on marketplaces; such as Etsy.\n\n## Constitution\n\nProject mission, tech stack, and phased roadmap live in **[specs/](specs/index.html)** (open `specs/index.html` in a browser). Initial phases focus on **design concept creation \u0026 management**; the niche research module comes later.\n\n### Git workflow\n\n- Integration branch: **`master`**\n- Phase work: branch **`phase/{N}-{slug}`** (e.g. `phase/0-scaffold`) — one phase per branch\n- Merge: **pull request only** — see [specs/git-workflow.html](specs/git-workflow.html)\n\n**Stack (summary):** Next.js, Tailwind, shadcn/ui, TanStack Query, TanStack AI, Zod, React Hook Form, Drizzle + Postgres, Vitest, Playwright, Framer Motion — **Docker Compose** for local services, polished UX throughout.\n\n## Local development\n\n**Requirements:** Node 22, pnpm 9+, Docker Desktop (Postgres on port 5432).\n\n```bash\ncp .env.example .env.local\ndocker compose up -d\npnpm install\npnpm db:migrate\npnpm dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) for the studio shell. **Concept gallery:** [http://localhost:3000/concepts](http://localhost:3000/concepts). DB health: [http://localhost:3000/api/health/db](http://localhost:3000/api/health/db).\n\nREST API: `GET/POST /api/concepts`, `GET/PATCH/DELETE /api/concepts/:id` (DELETE archives).\n\n**Asset upload (P2):** Add multiple reference images and choose a **preview** for the gallery. **Archive** hides images from Active (undo via toast); open **Archived** to permanently delete with confirmation. API: `GET /api/concepts/:id/references?archived=true|false`, `PUT …/preview`, `DELETE /api/assets/:id?conceptId=` (archive), `POST /api/assets/:id?conceptId=` (restore), `DELETE …\u0026permanent=true` (archived only).\n\n**Variation lineage (P3):** On concept detail, upload **variations** (art directions), optionally branch from preview or parent variation, and **approve** one winner at a time (approving another demotes the previous). API: `GET/POST /api/concepts/:id/variations`, `POST …/from-asset`, `PATCH …/:variationId`, `GET /api/variations/:id/file?variant=`.\n\n**Database UI:** With Postgres running, `pnpm db:studio` opens Drizzle Kit Studio for inspecting and editing tables (e.g. `design_concepts`, `design_assets`, `concept_variations`).\n\n### Scripts\n\n| Script | Purpose |\n|--------|---------|\n| `pnpm dev` | Next.js dev server |\n| `pnpm build` | Production build |\n| `pnpm start` | Run production server |\n| `pnpm lint` | ESLint |\n| `pnpm test` | Vitest unit tests |\n| `pnpm test:e2e` | Playwright (studio smoke, concept CRUD, asset upload, variation lineage) |\n| `pnpm db:generate` | Generate Drizzle migrations |\n| `pnpm db:migrate` | Apply migrations |\n| `pnpm db:studio` | Drizzle Kit Studio (browse/edit DB at [https://local.drizzle.studio](https://local.drizzle.studio); requires Postgres + `.env.local`) |\n\n### Validation (P3)\n\nOn branch `phase/3-variation-lineage`:\n\n```bash\n./scripts/validate-p3.sh\n```\n\nSee [specs/20260520-phase3-variation-lineage/validation.html](specs/20260520-phase3-variation-lineage/validation.html).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandyfrith%2Fproductizer-etsy-web","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandyfrith%2Fproductizer-etsy-web","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandyfrith%2Fproductizer-etsy-web/lists"}