DEV Community

Caleb Nkunze
Caleb Nkunze Subscriber

Posted on

MarketMail

This is a submission for the Postmark Challenge: Inbox Innovators.

What I Built šŸš€

MarketMail – a crowdsourced produce‑price exchange for Uganda & East Africa that runs entirely by e‑mail.

Farmers or enumerators send a simple price list to prices@your-domain.com; Postmark’s inbound webhook feeds the data into a Node.js API, which:

  1. Parses and validates the e‑mail (body or CSV/XLSX attachment).
  2. Normalises units/currency and stores records in MongoDB.
  3. Calculates daily deltas and 7‑day averages.
  4. Sends the sender an automated market‑trend report.
  5. Publishes an open JSON API and a React dashboard so anyone can view live prices.

The flow works from any basic e‑mail client, so even users on feature phones with intermittent data can contribute and benefit.

Demo šŸ“¹

Live URL: https://marketmail.vercel.app

Test: e‑mail the sample below to send@marketmail.canktech.com.

Country: Uganda
Market: Nakasero
Date: 2025‑05‑28
Maize (kg): 1850
Beans (kg): 2950
Tomatoes (crate): 9800
Enter fullscreen mode Exit fullscreen mode

You’ll receive a reply within ~10 s containing a cleaned table and a mini market report. The dashboard at https://marketmail.vercel.app/dashboard?market=Nakasero will update automatically.

Code Repository šŸ—„ļø

https://github.com/Cank256/market-mail Ā (MIT licence)

How I Built It šŸ”§

  • Email layer: Postmark inbound/outbound (signature verification, bounce hooks).
  • Backend: Node.jsĀ 20, Express, TypeScript, Zod validation.
  • Parsing: RegEx + optional OpenAI for fuzzy headers; papaparse / xlsx for attachments.
  • Data: MongoDB Atlas (MarketPrice schema, aggregation pipelines).
  • Front‑end: ReactĀ 18 + Vite, Recharts, TailwindĀ CSS + shadcn/ui.
  • CI/CD: GitHub Actions → Vercel.
  • Accessibility: Plain‑text fallbacks, semantic HTML, dashboard passes WCAGĀ 2.1Ā AA.
  • Dev‑experience: Detailed PROJECT.md, Jest tests cover parser & API routes.

Team: solo submission — Caleb Nkunze @cank256.

Top comments (0)