SahrulRamadhani29/portfolio

mailbox.ramstudio.pro

Public sourceMVP

A custom email inbox that receives messages through a worker, stores them, and displays them on the web.

SoloReact inbox, API/sessions/admin, email worker parsing, and D1/R2 integration

My contribution highlights

Read all 8 contribution modules
Contents · 8 contribution modules

Main workflow

6 steps

Domain emails arrive at a worker, message content is separated from metadata, and an inbox displays them within each user’s session scope.

  1. 01Receive domain email

    1. Email arrives at the worker

      Sender & email worker
    2. Check the recipient

      Worker & account data
  2. 02Parse and store messages

    1. Parse email content

      PostalMime
    2. Separate metadata and objects

      Cloudflare D1 & R2
  3. 03Access the web inbox

    1. Sign in and load the list

      User & Hono API
    2. Read and manage status

      React frontend
Process details & branches
  1. Email arrives at the workerSender & email worker

    The worker receives the raw message and normalises the recipient address before resolving the destination account.

  2. Check the recipientWorker & account data

    The destination address is matched to an available account before inbox storage.

    Is the destination account recognised?

    • Recognised. The message is associated with the recipient account for further processing.
    • Not recognised. The message is not placed in another account’s inbox.
  3. Parse email contentPostalMime

    The raw message is parsed into text/HTML and message information needed for inbox snippets and details.

  4. Separate metadata and objectsCloudflare D1 & R2

    D1 stores metadata, text, timestamps, and account relationships. R2 stores original EML messages and associated HTML.

  5. Sign in and load the listUser & Hono API

    The session determines which account can be accessed. The API provides paginated lists and message details for that account.

  6. Read and manage statusReact frontend

    Display text or DOMPurify-sanitised HTML. Users can mark messages read/unread and soft-delete them.

The workflow focuses on receiving and reading email: the worker handles incoming messages, while sessions restrict inbox access by account.

CASE_STUDY.mdProduct & my contributions

About mailbox.ramstudio.pro

mailbox.ramstudio.pro is a web inbox for receiving and reading email on a custom domain. An email worker handles incoming messages, the API provides per-user access, and the frontend displays message lists and details. Metadata is stored in Cloudflare D1, while raw messages and HTML content use R2.

I built the React frontend, Hono backend, email receiver worker, authentication, and admin dashboard. The product focuses on receiving email and managing the inbox.

My contributions

Receiver worker and destination address validation

I built an email worker that normalises recipient addresses and checks destination accounts before processing messages. It reads raw messages and connects them to the correct user so incoming mail is stored in the inbox through account relationships.

MIME parsing and D1/R2 storage

I integrated PostalMime to parse text/HTML content and message information. Original messages are stored as EML in R2, alongside related HTML content. Metadata, snippets, text, received timestamps, and account relationships are stored in D1 to support inbox lists and details.

Inbox APIs and message status changes

I developed paginated list, message detail, read/unread, and soft deletion endpoints. Queries are restricted to the account holding the session. I connected query results and status changes to the frontend so message selection and user actions update the relevant inbox data.

Login, sessions, and password changes

I added login/logout, session cookies, bcrypt password hashes, and hashed session token storage. I also worked on recording and limiting login attempts and password change forms. This connects account identity to permission to use the inbox API.

Account management and admin roles

I built admin processes to create/manage accounts, reset passwords, suspend/activate accounts, and read audit logs. Role checks separate administrative processes from user inbox access so account management operations stay within the appropriate workflows.

Inbox interface and user navigation

I developed the inbox layout, message lists and selection, detail views, password visibility, and admin pages with React Router. I connected pagination, read status, and soft deletion to the API so user actions are reflected in the interface.

Text presentation and HTML sanitisation

I provided plain-text body views and connected HTML views through DOMPurify before rendering. This lets users read message contents while adding a processing layer for HTML arriving in incoming emails.

Migrations, worker configuration, and tests

I prepared D1 schemas/migrations, worker and R2 bindings, Wrangler configuration, and setup/deployment documentation. I also wrote email and session helper tests. Separating the email worker, API, and frontend allows message reception to run independently of the browser displaying the inbox.

Fields & core technologies

Project fields

Cloud & InfrastructureBackend & APIFull-stack WebData & Databases

Core technologies

ReactTypeScriptHonoCloudflare WorkersCloudflare Email RoutingCloudflare D1Cloudflare R2PostalMime

3 commits in the last 12 months

All branches
NovDecJanFebMarAprMayJunJulAugSeptOctNov
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Hover over a square or focus it to see the date.
LessMore
Current streak0 days
Longest streak in this period1 days
Active days in this period2 days
Verified data · updates scheduled hourly.
How it is counted · 1 repo · 1 branch

My authored commits reachable from all remote branches at sync time. Each SHA is counted once, even across branches or forks. Merge commits are excluded. Dates use the author timestamp in Western Indonesia Time (UTC+7), rather than push time. The current streak remains active when the last commit was yesterday and today is still in progress.

This calendar covers commits across all branches. Its totals may differ from GitHub’s contribution calendar, which includes other activity types and follows its own branch rules. This calendar covers only the project you are viewing.

Contribution history

3 of my non-merge commits · All branches · Data as of 3 November 2026.

Public commit examples
Back to all projects