ChinRooz.com is a bilingual Persian–Gregorian date utility built for Iranians, Afghans, and the worldwide Persian-speaking diaspora — and for anyone who works with them. At its core is a fast, private date converter; around it, five purpose-built tools answer the questions that two calendars raise in daily life: a birthday profile, a live Tehran time compass, an iCalendar export that puts Persian anniversaries into any calendar app on the correct day every year, an occasion countdown, and a dual-calendar date span calculator. Every computation runs deterministically in the visitor’s browser — no accounts, no server round-trips, no data leaves the device — and Persian is a first-class locale, not a translation layer: full RTL layout, written-Persian copy, Persian digits, and both the Iranian and the Afghan month-naming systems served knowingly.

StatusLive
Availabilityhttps://chinrooz.com
NameChinRooz
GenreUtility / Calendar Web Application
Subsidiary
Time-to-Market Effort≈40h (supervision, review & product decisions — implementation AI-orchestrated)
MaintenanceContinuous, search-demand-driven

Project Highlights

A deterministic calendar core. All Jalali–Gregorian conversion, date arithmetic, zodiac assignment, and boundary data live in one pure, dependency-free TypeScript package, validated across documented ranges (1800–2100 Gregorian) and covered by hundreds of unit tests. The web layer renders; it never reinvents a calendar rule.

Five interlocking tools. The Tehran time compass is a live SVG instrument — two rotating city dials, a verdict needle, and a seconds bead driven by pure CSS — that answers “can we meet?” across Iran’s Saturday-to-Wednesday work week. The calendar export solves a problem every calendar app has: yearly recurrence cannot express Persian years, so ChinRooz expands each anniversary into per-year events computed exactly, with stable UIDs so a re-imported file updates instead of duplicating (RFC 5545, octet-safe folding of Persian text included). Countdown and span calculator complete the suite, each stating its counting conventions and leap-year clamping rules in plain daylight rather than in footnotes.

Privacy by architecture, offline by design. Entered dates never reach analytics or logs. The application shell and all five tools are precached by a service worker and work fully offline; a single honest update prompt appears when a new version is ready.

Bilingual quality as an engineering discipline. Persian prose is written, never machine-shaped by the English; automated checks assert per-locale substance bounds, Persian digit rendering, RTL layout down to 320 px, and even computed grammar in both languages.

AI-assisted content, deterministically fact-checked. Reference pages (months, zodiac signs, occasions) are produced by a schema-validated generation pipeline in which every calendar fact is recomputed and mechanically compared — prose is generated, facts never are. Over 30 architecture decision records govern the platform’s boundaries and keep every trade-off auditable.

Search-driven product development. Features are scoped from measured Search Console demand rather than guesses: the site’s core Persian query cluster reached page-one positions within its first weeks live, and each development cycle harvests real queries to decide what gets built — and what gets deliberately declined.

Technologies Used

Frontend and build: Astro (static-first, zero-JS reading pages), TypeScript throughout, pnpm monorepo with a pure calendar-core package, CSS logical properties for a single LTR/RTL component tree.

Platform: Cloudflare Workers Static Assets, service-worker precaching with hash-versioned cache rotation, GitHub Actions CI/CD with a gated production verification suite.

Quality: more than 1,500 automated tests (unit, content-model, and Playwright end-to-end across viewports and both locales), build-output assertions that pin what actually ships, exact-string specs for every user-facing sentence whose words are computed.

Content pipeline: LLM-assisted bilingual generation under hard guardrails — JSON-schema validation, deterministic fact recomputation, per-locale length bands, and a review gate before anything merges.

Challenges and Solutions

Two calendars disagree about almost everything. Month lengths, leap years, and even “one month later” differ between the systems. The solution is a single deterministic core plus a product rule: every convention the tools use — last-valid-day clamping, elapsed-day counting, per-calendar recurrence — is stated visibly on the page it affects, so the user is never surprised by arithmetic they cannot see.

Time zones without shipping a timezone database. The Tehran tools need DST-correct conversion worldwide, but bundling tzdata would mean maintaining it forever. Instead, the browser’s own Intl implementation is the timezone authority while the core remains the calendar authority — each answers only the question it can answer correctly, and the boundary is recorded as an architecture decision.

Calendar apps cannot represent Persian recurrence. RRULE has no supported way to express “every year on 20 Mordad.” The export tool therefore computes each year’s true Gregorian date and ships individual events — an honest file that is correct in every calendar application, rather than a clever one that is subtly wrong.

Keeping generated content trustworthy. Generated prose must never invent a calendar fact. The pipeline separates facts (computed, injected, mechanically re-verified) from prose (generated, schema-validated, human-reviewed), and refused batches are preserved for inspection rather than silently retried.

Future Directions

Seasonal surfaces are already in place for Yalda and Nowruz, with post-season search-demand analysis deciding the next expansion. Lunar-Hijri conversion and further business tools for the diaspora are on the evaluated horizon — each behind the same rule that has shaped the product so far: build what measured demand asks for, and record what is deliberately declined.

Conclusion

ChinRooz demonstrates that a culturally specific utility can be engineered to general-purpose standards: deterministic to the day across two centuries, private by architecture, offline-capable, bilingual to the last computed plural — and grown feature by feature from what its audience actually searches for.

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *