Hi, I’m Nibras.

Ahammed Nibras smiling in front of a carved stone wall.
Software engineer

I build AI products and the backend systems they depend on.

Cascade

Project

Cascade runs background tasks and keeps a durable record of each run. I started the project and maintain it.

TypeScript · PostgreSQL · Redis

Background work that survives failure

A task starts in the TypeScript SDK, passes through the API and Redis queue, runs in a worker, and appears in the dashboard with its output and logs. It can be retried, scheduled, cancelled, or replayed.

Why I built it

The project started with three questions: What happens if a worker dies? What if the same request arrives twice? What if a deployment changes while a task is still running? I built Cascade to answer them in one system.

What had to be true

  • A run could not disappear when a worker stopped.
  • Repeating a request could not create duplicate work.
  • One organization could never read another one’s data.
  • The dashboard had to show stored system state, not temporary browser state.
  • Tests had to use the real SDK, API, queue, and worker path.

The important choices

PostgreSQL is the source of truth for runs and deployments. Redis handles short-lived coordination such as queues, rate limits, and concurrency. Large payloads can move to object storage. The dashboard reads the same durable records used by the workers.

Run lifecycle

  1. TypeScript SDKSends a task trigger.
  2. API + PostgreSQLRecords a pending run before execution.
  3. RedisQueues the run ID for a worker.
  4. WorkerClaims the run and writes logs, heartbeats, and output.
  5. DashboardReloads the stored state for the user.
Simplified from Cascade’s documented runtime path. Read the source documentation

What changed my approach

An early browser test created successful records directly in the database. The screen passed even though that setup skipped the real product. I replaced it with a test that starts from the SDK and continues through the API, queue, worker, and dashboard.

The replacement is slower. It catches failures the old test could not see.

How this site runs.

Infrastructure

This portfolio is static HTML. GitHub Actions builds and tests it once, then Cloudflare Pages serves the verified files.

Astro · GitHub Actions · Cloudflare Pages

One artifact, two controlled paths

  1. GitHubProtected mainA reviewed commit starts the workflow.starts
  2. GitHub ActionsVerify and buildAll checks run before one static build is kept.uploads once
  3. Workflow artifactportfolio-dist-<SHA>The immutable build is retained for 14 days.

Shared inputBoth deployment jobs download the SHA-qualified artifact. Production also waits for feedback and approval.

Separate recovery pathPrevious successful productioncan manually replace the live deploymentCloudflare rollback reference
Solid connectors show workflow dependencies. The dashed recovery path is manual. This diagram describes the system; it is not live deployment status.

About

My work often starts with an action on a screen. I follow it through the API, database, queue, and worker, then back to the result or failure the user sees.