Skip to content
ع
All projects

Irtajil

Press a button, get a topic you did not choose, and talk.

Irtajil: Press a button, get a topic you did not choose, and talk.
Role
Solo
Year
2026
Status
Live
Category
Web

An Arabic site for practising impromptu speaking. It deals a random topic from 800 hand-written prompts, then runs a countdown while you talk. No backend, no account, and it works offline.

Overview

People practising for interviews or public speaking spend their time choosing a topic instead of talking, and they unconsciously pick topics they already know. The practice ends up with no pressure and no surprise.

Irtajil takes the choice away. Pick a mode, quick-fire or deep-dive, and a category, everyday or out of your comfort zone. Press for a topic, read it, then press start. The topic is only counted as used when you commit to it.

The whole site is one static Astro page with a single interactive island. All four topic banks ship inside the bundle and all state lives in localStorage, so there is nothing to run and nothing to break.

Built with

  • Astro
  • JavaScript
  • PWA
  • Service Worker
  • localStorage

Links

Challenges

Never repeat a topic, without storing any text

Problem

Users should not see a topic they already spoke on. Storing the topic text in history is wasteful, but storing only its position breaks the moment the topic list changes.

Solution

A topic is identified by bank key and index, and the banks are append-only: no deletes, no reordering, no edits. A check script enforces it, failing on count changes, duplicates across banks, and blank or too-short lines. The history is the only source of truth, and the used set is derived from it on load.

A timer that does not drift

Problem

Browsers throttle setInterval in background tabs, so a countdown that counts ticks finishes late as soon as you switch away from it.

Solution

The remaining time is computed from the difference in Date.now(), and the interval only redraws. A 60-second timer ends within a second of 60 even when the tab was hidden.

Offline with zero dependencies

Problem

A service worker plugin would be the only dependency besides Astro, and a hand-written cache list goes stale the moment a hashed file name changes.

Solution

A small build script walks the final output and generates the cache list from the real hashed file names. The Arabic font is served locally, so after the first visit the site works fully offline.

Results

  • 800 original Arabic topics across four banks, with no duplicates.
  • Installable and fully usable offline.
  • No backend, no database, and no dependencies besides Astro.