About this software
About RenewDesk UAE – Document Expiry & Reminder System
RenewDesk UAE lets a signed-in user manage companies and the documents tied to them, such as trade licenses, residence visas and Emirates IDs, and see expiry countdowns calculated on the Asia/Dubai calendar. A daily cron endpoint sends email reminders through the buyer's own Resend account at 30, 15, 7 and 1 days before expiry and on the expiry date. Each user chooses their own intervals on a Reminders page that also shows upcoming and past sends. It is built with React, TypeScript, TanStack Start and Supabase, and the Supabase schema uses owner-scoped Row Level Security. It deploys to Cloudflare Workers by default, or as a Node server or Docker image.
Why RenewDesk UAE – Document Expiry & Reminder System
What makes it better
than the alternatives
- 01
Bilingual with RTL
Every UI string has an English and Arabic dictionary of the same shape, and the layout switches to right-to-left using logical CSS utilities.
- 02
Dubai-calendar expiry logic
A single module computes expiry status and days remaining on the Asia/Dubai date, so the dashboard, reminders and activity views agree.
- 03
Idempotent reminder job
A secret-protected POST endpoint claims a unique document, expiry date and interval row in reminder_logs before sending, supports dry-run and simulated-date testing, and retries eligible failures.
- 04
Tamper-resistant activity history
Activity logs are written only by database triggers and users have read-only access, so the history cannot be forged from the client.
- 05
Self-host and rebrand ready
Branding is set through VITE_ environment variables, and the package includes setup, database, deployment and troubleshooting guides, a Dockerfile and a GitHub Actions scheduler.
Authentication
- Email and password sign-up and sign-in through Supabase Auth
- Password reset by email with a recovery-link flow
- Signed-in pages gated with a redirect to /auth
Companies
- Create
- edit and delete companies with emirate
- industry and notes
- Search by name
- industry or emirate and filter by emirate
- Company cards show document counts and a warning for expiring or expired documents
- Link from a company to its filtered documents list
Documents
- Track documents by type
- title
- employee name and expiry date
- assigned to a company
- Search and filter by company
- type and status
- Sorted by days remaining
- with status badges and a days-left display
- Edit and delete with a confirmation dialog
Dashboard
- Expiry overview of companies and documents
- Recent activity feed with localized relative timestamps
- Prompts to add a company before the first document
Email Reminders
- Per-user choice of reminder intervals and an email on/off toggle
- Upcoming reminders view that omits already sent or claimed occurrences
- Reminder history with sent
- failed and pending status and error details
- Test reminder send and a setup status check from server functions
- Reminders go only to the user's verified account email
Scheduled Job
- POST /
api/public/cron/remindersprotected by a CRON_SECRET bearer token - Constant-time secret comparison and a 16-character minimum secret length
- Dry-run and simulateDate options for testing without sending
- Daily GitHub Actions workflow included
Demo and Marketing Site
- Landing page with a feature overview
- FAQ accordion and calls to action
- Read-only /demo with fictional UAE sample data that never touches the database
- Privacy and Terms pages built from templates with configurable company details
Deployment and Docs
- Cloudflare Workers build by default
- plus a build:node target
- Dockerfile for Node 22 self-hosting
- SQL migrations for Supabase
- Unit tests for expiry
- reminders and relative time
- plus routing and form tests
| Language | Version | Framework | Used for | Share of code |
|---|---|---|---|---|
| TypeScript (React) | — | — | Front-end | 68.4% |
| TypeScript | — | — | Front-end | 25.5% |
| SQL | — | — | Database | 3.8% |
| CSS | — | — | Styling | 1.8% |
| JavaScript | — | — | Front-end | 0.5% |
- Primary language
- TypeScript 5.8 (React 19 UI, Node server build)
- Framework
- TanStack Start 1.168 on TanStack Router 1.170
- Database
- PostgreSQL via Supabase (minimum version not stated in digest)
- Authentication
- Supabase Auth email and password, bearer JWT on server functions, Row Level Security by owner (auth.uid())
- Licence
- Single-site
- Screens
- 10
- Database tables
- 5
- Supported languages
- English and Arabic (en + ar dictionaries); RTL set on <html> by I18nProvider
- Browser support
- Not stated in the code; test on current Chrome, Safari and Firefox before listing
| Minimum | Recommended | |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB (estimate, not stated in digest) | 2 GB (estimate, not stated in digest) |
| OS | Node.js 22 (Docker image node:22-alpine); Cloudflare Workers is the default build target | Node.js 22 (Docker image node:22-alpine); Cloudflare Workers is the default build target |
| Est. monthly hosting | $25 | $25 |
```sh docker build -t renewdesk . docker run -p 3000:3000 --env-file .env renewdesk ```
```sh npm install npm run build:node npm start ``` Serves .output/server/index.mjs. Set the variables from .env.example first.
```sh npm run build ``` Follow DEPLOYMENT.md for the Cloudflare steps.
Quality report
Manually reviewedHow to read the quality report
What this is. Every project on Vibe96 goes through an automated audit of its source code before a reviewer in Dubai checks it by hand. The score is out of 100; 75 is the minimum to be listed, and any single failing check blocks a listing regardless of the score.
- Security
- No real credentials in the code, every data-changing route protected, admin areas role-gated, no SQL built from user input.
- Code structure
- A developer can navigate and extend it: clear module boundaries, no giant files, little copy-paste.
- Docs & completeness
- The setup guide, example config, schema and required files the builder committed to are actually in the archive.
- Dependency health
- Packages pinned, no known critical vulnerabilities, no abandoned libraries in production paths.
- Build & deploy
- A clean machine can restore, build and start it by following the shipped instructions.
Warnings are problems that didn't block the listing; they stay visible here until a later version clears them. The audit reads the code — it does not run it — so always try the live demo before you buy. Lines of code are counted from the same audited archive.
Reviewer notes (4 minor)
Small improvements the developer has been told about. None of them stop the software from working.
Versions & updates
No updates yet. New versions appear here with a changelog.
Buyers receive updates free for 1 year.
What you get
- </>Full source codeThe complete audited source, delivered as a download from your account. No obfuscation.
- ▤DocumentationSetup guide, architecture notes, CLAUDE.md and AGENTS.md.
- ↻One year of updatesEvery new version the builder publishes, free for 12 months.
- ♧30 days of supportInstallation and defect support through Vibe96 tickets.