forgejo_admin
  • Joined on 2025-07-24
87. The app shall be containerised in a multi‑stage Dockerfile producing a final Alpine image < 300 MB.
86. The app shall support English only in V1, but all text shall be pulled from a translation JSON to allow later localisation.
85. All interactive controls shall be reachable via keyboard and labelled with aria‑label.
84. Batch processing time per image shall be exported as a Prometheus histogram.
83. Errors shall be sent to Sentry with user ID redacted.
82. All API calls shall log trace IDs compatible with OpenTelemetry.
81. payments: id, user_id, stripe_session_id, plan, amount, currency, status.
80. images : id, batch_id, original_name, proposed_name, vision_tags jsonb, status.
79. batches : id, user_id, status, created_at.
78. users : id, google_uid, email_hash, plan, quota_remaining, created_at.
77. WebSocket ws://…/progress/{batch_id} streams JSON events { image_id, status }.
76. POST /api/keywords/enhance accepts { keywords[] } and returns { enhanced_keywords[] }.
75. PUT /api/image/{image_id}/filename accepts { new_name } and returns the updated record.
74. GET /api/batch/{batch_id}/status → { state: PROCESSING
73. POST /api/batch → { batch_id, accepted_count, skipped_count }.
72. All user‑facing times shall be displayed in the user's browser locale, derived via Intl.DateTimeFormat.
71. The billing modal shall summarise price, billing frequency, and confirm upgrade in ≤ three clicks.
70. While Vision jobs run, each Proposed Filename cell shall display a looping shimmer placeholder animation.
69. Invalid files shall be listed with a red icon and a tooltip reason like "GIF over 25 MB rejected".
68. Drag‑and‑drop zone shall highlight when files hover over it and display the total number accepted.