forgejo_admin
  • Joined on 2025-07-24
67. The Dashboard shall show a quota progress bar with a numeric fraction like "23 / 50 images used".
66. The landing‑page hero shall feature a single‑sentence value proposition followed by a "Try it free" call‑to‑action.
65. Background queues shall run idempotent jobs retried with exponential backoff up to five attempts.
64. The system shall support horizontal scaling by keeping all session state in stateless JWTs and Redis.
63. The server shall store all secrets in environment variables managed by a secrets manager, never in the repo.
62. Uploaded files shall be scanned by ClamAV; detections shall abort processing and log an alert.
61. All endpoints shall enforce HTTPS via HSTS with a max‑age of 31536000 s.
60. The API shall respond to the /healthz probe in < 150 ms 95th percentile.
59. All public pages shall score ≥ 90 on Google Lighthouse performance and accessibility audits.
58. At UTC 00:00 on the first of each month, a cron job shall reset every user's quota to their plan limit.
57. The server shall decrement the user's remaining quota atomically at the start of each job.
56. A usage table shall store one row per successfully renamed image with columns user_id, timestamp, and byte_size.
55. The ZIP archive shall preserve original EXIF metadata.
54. Clicking "Download ZIP" shall trigger a GET to /api/batch/{batch_id}/zip; the server shall stream a ZIP archive containing renamed files.
53. The "Download ZIP" button shall remain disabled until at least one row exists and no rows are in "PROCESSING".
52. Pressing "Regenerate this name" on a row shall re‑run the naming algorithm with a new random seed.
51. Editing a Proposed Filename shall update the entry's state to "CUSTOM".
50. The Review Table shall display columns: Thumbnail, Original Name, Proposed Filename (editable inline), and Vision Tags (tooltip).
49. When all jobs in a batch reach status "DONE", the client shall auto‑navigate to /batch/{batch_id}/review.
48. The Proposed Filename shall always include at least one token derived from the user's original Keyword Set.