{"id":50485669,"url":"https://github.com/darryldecode/cloudsurf-texture-ai","last_synced_at":"2026-06-01T22:01:58.828Z","repository":{"id":359907908,"uuid":"1247455523","full_name":"darryldecode/cloudsurf-texture-ai","owner":"darryldecode","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-31T13:21:33.000Z","size":1923,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-31T15:13:07.690Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://cloudsurf-texture-ai.vercel.app","language":"TypeScript","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/darryldecode.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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-23T10:43:32.000Z","updated_at":"2026-05-31T13:21:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/darryldecode/cloudsurf-texture-ai","commit_stats":null,"previous_names":["darryldecode/cloudsurf-texture-ai"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/darryldecode/cloudsurf-texture-ai","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darryldecode%2Fcloudsurf-texture-ai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darryldecode%2Fcloudsurf-texture-ai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darryldecode%2Fcloudsurf-texture-ai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darryldecode%2Fcloudsurf-texture-ai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/darryldecode","download_url":"https://codeload.github.com/darryldecode/cloudsurf-texture-ai/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darryldecode%2Fcloudsurf-texture-ai/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33795114,"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-01T02:00:06.963Z","response_time":115,"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-01T22:01:57.213Z","updated_at":"2026-06-01T22:01:58.821Z","avatar_url":"https://github.com/darryldecode.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cloudsurf Texture AI\n\nLocal-first Next.js app for creating architectural texture extraction workflows and generating two texture atlas outputs from reference images:\n\n- Repeatable seamless material atlas, finalized to `1024 x 2048`\n- Unique facade element atlas, finalized to `4096 x 4096`\n\nProjects, workflows, exclusions, and generated atlas metadata are stored in Neon Postgres behind the dashboard API. Uploaded references, generated atlases, PBR maps, and utility outputs are stored in Cloudflare R2 and referenced by signed URLs.\n\nAuthentication is handled by Neon Auth through the `@neondatabase/auth` Next.js SDK.\n\n## Run Locally\n\n```bash\nnpm install\nnpm run dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000). If that port is occupied, run `npm run dev -- --port 3001`.\n\n## App Configuration\n\nCopy `.env.example` to `.env.local` and set:\n\n```bash\nNEON_AUTH_BASE_URL=...\nNEON_AUTH_JWKS_URL=...\nNEON_AUTH_COOKIE_SECRET=...\nDATABASE_URL=postgresql://...neon.tech/...sslmode=require\nR2_ACCOUNT_ID=...\nR2_BUCKET=...\nR2_ACCESS_KEY_ID=...\nR2_SECRET_ACCESS_KEY=...\n```\n\n`NEON_AUTH_BASE_URL` and `NEON_AUTH_JWKS_URL` come from the Neon Auth configuration screen. Generate `NEON_AUTH_COOKIE_SECRET` yourself with `openssl rand -base64 32`; it signs the app's local session cache cookie.\n\n## Image AI Configuration\n\nGeneration is disabled until the signed-in user saves a provider API key in Account settings. Cloudsurf Texture AI credits cover platform usage only; Gemini or OpenAI image usage is billed directly to the user's own provider account.\n\n```bash\nIMAGE_AI_PROVIDER=google\nGOOGLE_IMAGE_MODEL=gemini-3.1-flash-image-preview\nGOOGLE_IMAGE_SIZE=2K\n\n# Fallback provider:\nIMAGE_AI_PROVIDER=openai\nOPENAI_IMAGE_MODEL=gpt-image-2\n```\n\n`IMAGE_AI_PROVIDER` supports `google` and `openai` for the default model selection. Google defaults to `gemini-2.5-flash-image`, but `gemini-3.1-flash-image-preview` is the recommended quality trial. `GOOGLE_IMAGE_SIZE` applies to Gemini 3 image models and supports `0.5K`, `1K`, `2K`, and `4K`. OpenAI defaults to `gpt-image-2`.\n\nSaved user provider keys are encrypted before they are stored in Postgres. Set `USER_API_KEY_ENCRYPTION_SECRET` to a stable secret; if it is omitted, the app falls back to `NEON_AUTH_COOKIE_SECRET`.\n\n## Paddle Billing\n\nCredit recharges use Paddle one-time prices and fulfill credits from the `transaction.completed` webhook. Credits are now a platform usage fee only, because users bring their own Gemini or OpenAI API keys. Suggested launch pricing is starter: 100 credits for `$9`, production: 500 credits for `$29`, and studio: 2000 credits for `$79`.\n\n```bash\nPADDLE_ENVIRONMENT=sandbox\nNEXT_PUBLIC_PADDLE_ENVIRONMENT=sandbox\nPADDLE_API_KEY=...\nPADDLE_WEBHOOK_SECRET=...\nNEXT_PUBLIC_PADDLE_CLIENT_TOKEN=...\nPADDLE_CHECKOUT_URL=http://localhost:3000/checkout\nAPP_URL=http://localhost:3000\nPADDLE_STARTER_PRICE_ID=pri_...\nPADDLE_PRODUCTION_PRICE_ID=pri_...\nPADDLE_STUDIO_PRICE_ID=pri_...\n```\n\nSet Paddle's default payment link to `/checkout` for the matching environment. The page loads Paddle.js and opens the `_ptxn` transaction returned by Paddle. Configure your webhook endpoint at `/api/paddle/webhook`.\n\n## Generated Files\n\nGenerated textures are saved to Cloudflare R2. The app stores only R2 object keys and metadata in Neon Postgres.\n\n## Verification\n\n```bash\nnpm run typecheck\nnpm run lint\nnpm test\nnpm run build\nnpm run verify:ui\n```\n\n`npm run verify:ui` expects the dev server to be running. Override the target with `VERIFY_BASE_URL=http://localhost:3001 npm run verify:ui`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarryldecode%2Fcloudsurf-texture-ai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdarryldecode%2Fcloudsurf-texture-ai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarryldecode%2Fcloudsurf-texture-ai/lists"}