2024-08-17 - 2025-08-17

Overview

0 active pull requests
83 active issues
Excluding merges, 2 authors have pushed 11 commits to main and 44 commits to all branches. On main, 49 files have changed and there have been 60122 additions and 2077 deletions.

73 issues closed from 1 user

Closed #20 20. The system shall store only the Google user ID, display name, and email hash, never the raw OAuth access token. 2025-08-05 20:14:29 +02:00

Closed #22 22. The Billing page shall display current plan, remaining quota, next renewal date, and an "Upgrade" button. 2025-08-05 20:14:28 +02:00

Closed #23 23. The Upgrade flow shall open a Stripe Checkout session in a modal. 2025-08-05 20:14:16 +02:00

Closed #24 24. Successful Stripe webhooks shall update the User's plan field and reset their quota counter immediately. 2025-08-05 20:14:16 +02:00

Closed #25 25. Cancellation in Stripe shall downgrade the user to Basic at the period's end and persist renamed files already created. 2025-08-05 20:14:15 +02:00

Closed #26 26. The Dashboard shall feature a drag‑and‑drop zone that accepts only .jpg, .jpeg, .png, .gif, and .webp MIME types. 2025-08-05 20:14:15 +02:00

Closed #27 27. The client shall block any drag event containing > N files, where N = user's remaining monthly quota. 2025-08-05 20:14:14 +02:00

Closed #28 28. The client shall compute SHA‑256 checksums of files to avoid duplicate uploads in the same batch. 2025-08-05 20:14:14 +02:00

Closed #29 29. After drop, the client shall POST a multipart/form‑data request to /api/batch containing files and raw Keyword Set. 2025-08-05 20:14:14 +02:00

Closed #30 30. The server shall persist the raw binary files to an object‑store bucket under a time‑based UUID folder. 2025-08-05 20:14:13 +02:00

Closed #31 31. The server shall enqueue one background job per image for AI Vision processing. 2025-08-05 20:13:27 +02:00

Closed #32 32. The server shall respond synchronously with a batch_id and an initial status of "PROCESSING". 2025-08-05 20:13:27 +02:00

Closed #33 33. The "Enhance keywords with AI" button shall be disabled until at least one keyword is typed. 2025-08-05 20:13:26 +02:00

Closed #34 34. Pressing the button shall call /api/keywords/enhance with the current Keyword Set and target locale "en‑US". 2025-08-05 20:13:26 +02:00

Closed #35 35. The enhancement endpoint shall invoke an LLM that returns up to ten additional, SEO‑relevant keywords ranked by search volume. 2025-08-05 20:13:25 +02:00

Closed #36 36. The client shall merge and de‑duplicate the Enhanced Keyword Set before re‑rendering the chip‑list UI. 2025-08-05 20:13:25 +02:00

Closed #37 37. Users can manually delete any auto‑suggested keyword before upload. 2025-08-05 20:13:25 +02:00

Closed #38 38. Each background job shall send the image to a vision API (e.g., OpenAI Vision or Google Vision) requesting labels and confidence scores. 2025-08-05 20:13:24 +02:00

Closed #39 39. The system shall discard any label below 0.40 confidence. 2025-08-05 20:13:24 +02:00

Closed #40 40. The remaining labels shall form the AI Vision Descriptor list for that image. 2025-08-05 20:13:23 +02:00

Closed #41 41. The server shall combine Enhanced Keyword Set + AI Vision Descriptor into a ranked pool, giving 70 % weight to Vision tags and 30 % to user keywords when resolving conflicts. 2025-08-05 20:12:27 +02:00

Closed #42 42. The final pool shall be truncated to a maximum of six distinct, natural‑language tokens. 2025-08-05 20:12:27 +02:00

Closed #43 43. The Proposed Filename shall start with an uppercase letter and contain only letters, numbers, spaces, and hyphens. 2025-08-05 20:12:26 +02:00

Closed #44 44. The Proposed Filename shall always exclude stop‑words such as "the", "a", "an", "and". 2025-08-05 20:12:26 +02:00

Closed #45 45. The Proposed Filename shall be ≤ 60 characters long, excluding the original extension. 2025-08-05 20:12:25 +02:00

Closed #46 46. The Proposed Filename shall never duplicate within the same batch; a numeric suffix " (2)" shall be appended when collisions occur. 2025-08-05 20:11:52 +02:00

Closed #47 47. The Proposed Filename shall always include at least one token derived from the AI Vision Descriptor. 2025-08-05 20:11:52 +02:00

Closed #48 48. The Proposed Filename shall always include at least one token derived from the user's original Keyword Set. 2025-08-05 20:11:52 +02:00

Closed #49 49. When all jobs in a batch reach status "DONE", the client shall auto‑navigate to /batch/{batch_id}/review. 2025-08-05 20:11:51 +02:00

Closed #50 50. The Review Table shall display columns: Thumbnail, Original Name, Proposed Filename (editable inline), and Vision Tags (tooltip). 2025-08-05 20:11:51 +02:00

Closed #51 51. Editing a Proposed Filename shall update the entry's state to "CUSTOM". 2025-08-05 20:11:50 +02:00

Closed #52 52. Pressing "Regenerate this name" on a row shall re‑run the naming algorithm with a new random seed. 2025-08-05 20:11:50 +02:00

Closed #53 53. The "Download ZIP" button shall remain disabled until at least one row exists and no rows are in "PROCESSING". 2025-08-05 20:11:16 +02:00

Closed #54 54. Clicking "Download ZIP" shall trigger a GET to /api/batch/{batch_id}/zip; the server shall stream a ZIP archive containing renamed files. 2025-08-05 20:11:15 +02:00

Closed #55 55. The ZIP archive shall preserve original EXIF metadata. 2025-08-05 20:11:15 +02:00

Closed #56 56. A usage table shall store one row per successfully renamed image with columns user_id, timestamp, and byte_size. 2025-08-05 20:11:14 +02:00

Closed #57 57. The server shall decrement the user's remaining quota atomically at the start of each job. 2025-08-05 20:11:14 +02:00

Closed #58 58. At UTC 00:00 on the first of each month, a cron job shall reset every user's quota to their plan limit. 2025-08-05 20:11:13 +02:00

Closed #59 59. All public pages shall score ≥ 90 on Google Lighthouse performance and accessibility audits. 2025-08-05 20:11:13 +02:00

Closed #60 60. The API shall respond to the /healthz probe in < 150 ms 95th percentile. 2025-08-05 20:11:13 +02:00

Closed #61 61. All endpoints shall enforce HTTPS via HSTS with a max‑age of 31536000 s. 2025-08-05 20:10:35 +02:00

Closed #62 62. Uploaded files shall be scanned by ClamAV; detections shall abort processing and log an alert. 2025-08-05 20:10:34 +02:00

Closed #63 63. The server shall store all secrets in environment variables managed by a secrets manager, never in the repo. 2025-08-05 20:10:34 +02:00

Closed #64 64. The system shall support horizontal scaling by keeping all session state in stateless JWTs and Redis. 2025-08-05 20:10:33 +02:00

Closed #65 65. Background queues shall run idempotent jobs retried with exponential backoff up to five attempts. 2025-08-05 20:10:33 +02:00

Closed #66 66. The landing‑page hero shall feature a single‑sentence value proposition followed by a "Try it free" call‑to‑action. 2025-08-05 20:10:32 +02:00

Closed #67 67. The Dashboard shall show a quota progress bar with a numeric fraction like "23 / 50 images used". 2025-08-05 20:10:32 +02:00

Closed #68 68. Drag‑and‑drop zone shall highlight when files hover over it and display the total number accepted. 2025-08-05 20:10:32 +02:00

Closed #69 69. Invalid files shall be listed with a red icon and a tooltip reason like "GIF over 25 MB rejected". 2025-08-05 20:09:53 +02:00

Closed #70 70. While Vision jobs run, each Proposed Filename cell shall display a looping shimmer placeholder animation. 2025-08-05 20:09:52 +02:00

Closed #71 71. The billing modal shall summarise price, billing frequency, and confirm upgrade in ≤ three clicks. 2025-08-05 20:09:52 +02:00

Closed #72 72. All user‑facing times shall be displayed in the user's browser locale, derived via Intl.DateTimeFormat. 2025-08-05 20:09:52 +02:00

Closed #73 73. POST /api/batch → { batch_id, accepted_count, skipped_count }. 2025-08-05 20:09:51 +02:00

Closed #74 74. GET /api/batch/{batch_id}/status → { state: PROCESSING|DONE|ERROR, progress: 0‑100 }. 2025-08-05 20:09:51 +02:00

Closed #75 75. PUT /api/image/{image_id}/filename accepts { new_name } and returns the updated record. 2025-08-05 20:09:50 +02:00

Closed #76 76. POST /api/keywords/enhance accepts { keywords[] } and returns { enhanced_keywords[] }. 2025-08-05 20:09:50 +02:00

Closed #77 77. WebSocket ws://…/progress/{batch_id} streams JSON events { image_id, status }. 2025-08-05 20:09:11 +02:00

Closed #81 81. payments: id, user_id, stripe_session_id, plan, amount, currency, status. 2025-08-05 20:09:11 +02:00

Closed #82 82. All API calls shall log trace IDs compatible with OpenTelemetry. 2025-08-05 20:09:11 +02:00

Closed #83 83. Errors shall be sent to Sentry with user ID redacted. 2025-08-05 20:09:10 +02:00

Closed #84 84. Batch processing time per image shall be exported as a Prometheus histogram. 2025-08-05 20:09:10 +02:00

Closed #85 85. All interactive controls shall be reachable via keyboard and labelled with aria‑label. 2025-08-05 20:09:09 +02:00

Closed #86 86. The app shall support English only in V1, but all text shall be pulled from a translation JSON to allow later localisation. 2025-08-05 20:09:09 +02:00

Closed #87 87. The app shall be containerised in a multi‑stage Dockerfile producing a final Alpine image < 300 MB. 2025-08-05 20:09:09 +02:00

Closed #88 88. CI shall run ESLint, Prettier, unit tests, and Cypress e2e tests on every pull request. 2025-08-05 20:09:08 +02:00

Closed #80 80. images : id, batch_id, original_name, proposed_name, vision_tags jsonb, status. 2025-08-05 20:07:50 +02:00

Closed #79 79. batches : id, user_id, status, created_at. 2025-08-05 20:07:49 +02:00

Closed #78 78. users : id, google_uid, email_hash, plan, quota_remaining, created_at. 2025-08-05 20:07:35 +02:00

Closed #89 89. Production shall run on Kubernetes with separate pods for API, worker, and front‑end static hosting. 2025-08-05 20:03:48 +02:00

Closed #90 90. Zero‑downtime deploys shall be achieved with rolling updates and readiness probes. 2025-08-05 20:03:48 +02:00

Closed #91 91. Every sentence numbered 10‑90 defines a single, atomic requirement that an LLM can verify by querying the deployed system's observable behaviour, data, or codebase. 2025-08-05 20:03:48 +02:00

Closed #92 92. A compliance suite shall map each requirement ID to a unit‑test prompt following the pattern: "Assert that requirement NN is satisfied by …". 2025-08-05 20:03:31 +02:00

Closed #21 21. Password‑based logins are explicitly out of scope for V1. 2025-08-05 14:55:31 +02:00

83 issues created by 1 user

Opened #10 10. The product shall let any authenticated user rename many images in one batch using a combination of user‑supplied keywords and automatic computer‑vision tags. 2025-08-04 18:39:37 +02:00

Opened #11 11. The product shall output renamed images that are search‑engine‑friendly, syntactically safe for all major file systems, and semantically descriptive of image content. 2025-08-04 18:40:03 +02:00

Opened #12 12. The product shall monetise via tiered monthly quotas and Stripe‑handled subscriptions. 2025-08-04 18:40:20 +02:00

Opened #13 13. Anonymous visitors can view the marketing landing page but cannot upload images. 2025-08-04 18:40:38 +02:00

Opened #14 14. Basic users can upload ≤ 50 images per month and access all core renaming features. 2025-08-04 18:41:08 +02:00

Opened #15 15. Pro users inherit Basic rights and raise the quota to 500 images per month. 2025-08-04 18:41:24 +02:00

Opened #16 16. Max users inherit Basic rights and raise the quota to 1 000 images per month. 2025-08-04 18:41:44 +02:00

Opened #17 17. Administrators can view global usage stats, force‑reset quotas, refund payments, and ban accounts. 2025-08-04 18:42:15 +02:00

Opened #18 18. The sign‑in button shall initiate Google OAuth 2.0 with email scope only. 2025-08-04 18:42:52 +02:00

Opened #19 19. The system shall create a new User record on first successful OAuth callback. 2025-08-04 18:43:14 +02:00

Opened #20 20. The system shall store only the Google user ID, display name, and email hash, never the raw OAuth access token. 2025-08-04 18:43:32 +02:00

Opened #21 21. Password‑based logins are explicitly out of scope for V1. 2025-08-04 18:43:59 +02:00

Opened #22 22. The Billing page shall display current plan, remaining quota, next renewal date, and an "Upgrade" button. 2025-08-04 18:44:18 +02:00

Opened #23 23. The Upgrade flow shall open a Stripe Checkout session in a modal. 2025-08-04 18:44:43 +02:00

Opened #24 24. Successful Stripe webhooks shall update the User's plan field and reset their quota counter immediately. 2025-08-04 18:44:56 +02:00

Opened #25 25. Cancellation in Stripe shall downgrade the user to Basic at the period's end and persist renamed files already created. 2025-08-04 18:45:33 +02:00

Opened #26 26. The Dashboard shall feature a drag‑and‑drop zone that accepts only .jpg, .jpeg, .png, .gif, and .webp MIME types. 2025-08-04 18:46:20 +02:00

Opened #27 27. The client shall block any drag event containing > N files, where N = user's remaining monthly quota. 2025-08-04 18:46:47 +02:00

Opened #28 28. The client shall compute SHA‑256 checksums of files to avoid duplicate uploads in the same batch. 2025-08-04 18:47:26 +02:00

Opened #29 29. After drop, the client shall POST a multipart/form‑data request to /api/batch containing files and raw Keyword Set. 2025-08-04 18:47:59 +02:00

Opened #30 30. The server shall persist the raw binary files to an object‑store bucket under a time‑based UUID folder. 2025-08-04 18:48:32 +02:00

Opened #31 31. The server shall enqueue one background job per image for AI Vision processing. 2025-08-04 18:49:09 +02:00

Opened #32 32. The server shall respond synchronously with a batch_id and an initial status of "PROCESSING". 2025-08-04 18:49:29 +02:00

Opened #33 33. The "Enhance keywords with AI" button shall be disabled until at least one keyword is typed. 2025-08-04 18:50:12 +02:00

Opened #34 34. Pressing the button shall call /api/keywords/enhance with the current Keyword Set and target locale "en‑US". 2025-08-04 18:51:04 +02:00

Opened #35 35. The enhancement endpoint shall invoke an LLM that returns up to ten additional, SEO‑relevant keywords ranked by search volume. 2025-08-04 18:51:44 +02:00

Opened #36 36. The client shall merge and de‑duplicate the Enhanced Keyword Set before re‑rendering the chip‑list UI. 2025-08-04 18:52:15 +02:00

Opened #37 37. Users can manually delete any auto‑suggested keyword before upload. 2025-08-04 18:52:44 +02:00

Opened #38 38. Each background job shall send the image to a vision API (e.g., OpenAI Vision or Google Vision) requesting labels and confidence scores. 2025-08-04 18:53:21 +02:00

Opened #39 39. The system shall discard any label below 0.40 confidence. 2025-08-04 18:53:41 +02:00

Opened #40 40. The remaining labels shall form the AI Vision Descriptor list for that image. 2025-08-04 18:53:59 +02:00

Opened #41 41. The server shall combine Enhanced Keyword Set + AI Vision Descriptor into a ranked pool, giving 70 % weight to Vision tags and 30 % to user keywords when resolving conflicts. 2025-08-04 18:54:25 +02:00

Opened #42 42. The final pool shall be truncated to a maximum of six distinct, natural‑language tokens. 2025-08-04 18:54:45 +02:00

Opened #43 43. The Proposed Filename shall start with an uppercase letter and contain only letters, numbers, spaces, and hyphens. 2025-08-04 18:55:25 +02:00

Opened #44 44. The Proposed Filename shall always exclude stop‑words such as "the", "a", "an", "and". 2025-08-04 18:55:39 +02:00

Opened #45 45. The Proposed Filename shall be ≤ 60 characters long, excluding the original extension. 2025-08-04 18:56:17 +02:00

Opened #46 46. The Proposed Filename shall never duplicate within the same batch; a numeric suffix " (2)" shall be appended when collisions occur. 2025-08-04 18:56:53 +02:00

Opened #47 47. The Proposed Filename shall always include at least one token derived from the AI Vision Descriptor. 2025-08-04 18:57:32 +02:00

Opened #48 48. The Proposed Filename shall always include at least one token derived from the user's original Keyword Set. 2025-08-04 18:57:57 +02:00

Opened #49 49. When all jobs in a batch reach status "DONE", the client shall auto‑navigate to /batch/{batch_id}/review. 2025-08-04 18:58:27 +02:00

Opened #50 50. The Review Table shall display columns: Thumbnail, Original Name, Proposed Filename (editable inline), and Vision Tags (tooltip). 2025-08-04 18:58:46 +02:00

Opened #51 51. Editing a Proposed Filename shall update the entry's state to "CUSTOM". 2025-08-04 18:59:12 +02:00

Opened #52 52. Pressing "Regenerate this name" on a row shall re‑run the naming algorithm with a new random seed. 2025-08-04 18:59:48 +02:00

Opened #53 53. The "Download ZIP" button shall remain disabled until at least one row exists and no rows are in "PROCESSING". 2025-08-04 19:00:16 +02:00

Opened #54 54. Clicking "Download ZIP" shall trigger a GET to /api/batch/{batch_id}/zip; the server shall stream a ZIP archive containing renamed files. 2025-08-04 19:00:54 +02:00

Opened #55 55. The ZIP archive shall preserve original EXIF metadata. 2025-08-04 19:01:39 +02:00

Opened #56 56. A usage table shall store one row per successfully renamed image with columns user_id, timestamp, and byte_size. 2025-08-04 19:02:00 +02:00

Opened #57 57. The server shall decrement the user's remaining quota atomically at the start of each job. 2025-08-04 19:02:33 +02:00

Opened #58 58. At UTC 00:00 on the first of each month, a cron job shall reset every user's quota to their plan limit. 2025-08-04 19:02:48 +02:00

Opened #59 59. All public pages shall score ≥ 90 on Google Lighthouse performance and accessibility audits. 2025-08-04 19:03:14 +02:00

Opened #60 60. The API shall respond to the /healthz probe in < 150 ms 95th percentile. 2025-08-04 19:04:06 +02:00

Opened #61 61. All endpoints shall enforce HTTPS via HSTS with a max‑age of 31536000 s. 2025-08-04 19:04:33 +02:00

Opened #62 62. Uploaded files shall be scanned by ClamAV; detections shall abort processing and log an alert. 2025-08-04 19:05:10 +02:00

Opened #63 63. The server shall store all secrets in environment variables managed by a secrets manager, never in the repo. 2025-08-04 19:05:58 +02:00

Opened #64 64. The system shall support horizontal scaling by keeping all session state in stateless JWTs and Redis. 2025-08-04 19:06:12 +02:00

Opened #65 65. Background queues shall run idempotent jobs retried with exponential backoff up to five attempts. 2025-08-04 19:06:54 +02:00

Opened #66 66. The landing‑page hero shall feature a single‑sentence value proposition followed by a "Try it free" call‑to‑action. 2025-08-04 19:07:51 +02:00

Opened #67 67. The Dashboard shall show a quota progress bar with a numeric fraction like "23 / 50 images used". 2025-08-04 19:08:49 +02:00

Opened #68 68. Drag‑and‑drop zone shall highlight when files hover over it and display the total number accepted. 2025-08-04 19:09:22 +02:00

Opened #69 69. Invalid files shall be listed with a red icon and a tooltip reason like "GIF over 25 MB rejected". 2025-08-04 19:09:55 +02:00

Opened #70 70. While Vision jobs run, each Proposed Filename cell shall display a looping shimmer placeholder animation. 2025-08-04 19:10:21 +02:00

Opened #71 71. The billing modal shall summarise price, billing frequency, and confirm upgrade in ≤ three clicks. 2025-08-04 19:11:05 +02:00

Opened #72 72. All user‑facing times shall be displayed in the user's browser locale, derived via Intl.DateTimeFormat. 2025-08-04 19:11:51 +02:00

Opened #73 73. POST /api/batch → { batch_id, accepted_count, skipped_count }. 2025-08-04 19:12:27 +02:00

Opened #74 74. GET /api/batch/{batch_id}/status → { state: PROCESSING|DONE|ERROR, progress: 0‑100 }. 2025-08-04 19:13:00 +02:00

Opened #75 75. PUT /api/image/{image_id}/filename accepts { new_name } and returns the updated record. 2025-08-04 19:13:59 +02:00

Opened #76 76. POST /api/keywords/enhance accepts { keywords[] } and returns { enhanced_keywords[] }. 2025-08-04 19:14:33 +02:00

Opened #77 77. WebSocket ws://…/progress/{batch_id} streams JSON events { image_id, status }. 2025-08-04 19:15:00 +02:00

Opened #78 78. users : id, google_uid, email_hash, plan, quota_remaining, created_at. 2025-08-04 19:15:40 +02:00

Opened #79 79. batches : id, user_id, status, created_at. 2025-08-04 19:16:13 +02:00

Opened #80 80. images : id, batch_id, original_name, proposed_name, vision_tags jsonb, status. 2025-08-04 19:16:45 +02:00

Opened #81 81. payments: id, user_id, stripe_session_id, plan, amount, currency, status. 2025-08-04 19:17:26 +02:00

Opened #82 82. All API calls shall log trace IDs compatible with OpenTelemetry. 2025-08-04 19:17:56 +02:00

Opened #83 83. Errors shall be sent to Sentry with user ID redacted. 2025-08-04 19:18:22 +02:00

Opened #84 84. Batch processing time per image shall be exported as a Prometheus histogram. 2025-08-04 19:18:47 +02:00

Opened #85 85. All interactive controls shall be reachable via keyboard and labelled with aria‑label. 2025-08-04 19:19:33 +02:00

Opened #86 86. The app shall support English only in V1, but all text shall be pulled from a translation JSON to allow later localisation. 2025-08-04 19:20:01 +02:00

Opened #87 87. The app shall be containerised in a multi‑stage Dockerfile producing a final Alpine image < 300 MB. 2025-08-04 19:20:38 +02:00

Opened #88 88. CI shall run ESLint, Prettier, unit tests, and Cypress e2e tests on every pull request. 2025-08-04 19:21:09 +02:00

Opened #89 89. Production shall run on Kubernetes with separate pods for API, worker, and front‑end static hosting. 2025-08-04 19:21:43 +02:00

Opened #90 90. Zero‑downtime deploys shall be achieved with rolling updates and readiness probes. 2025-08-04 19:22:30 +02:00

Opened #91 91. Every sentence numbered 10‑90 defines a single, atomic requirement that an LLM can verify by querying the deployed system's observable behaviour, data, or codebase. 2025-08-04 19:23:21 +02:00

Opened #92 92. A compliance suite shall map each requirement ID to a unit‑test prompt following the pattern: "Assert that requirement NN is satisfied by …". 2025-08-04 19:24:02 +02:00