Skip to main content

Hromada

Non-profitMediaCharityActive

The web platform for Hromada, a registered 501(c)(3) non-profit serving the Ukrainian-American community: a bilingual media site, an archive of its printed newspaper, an events calendar, fundraising campaigns with recurring donations, and the admin panel the organisation runs it all from.

Client
Hromada, a registered 501(c)(3) non-profit
My role
Architect and sole developer - platform, admin, donations, newsletter and infrastructure
Period
2025 - present
Hromada

Project Overview

A non-profit is a harder brief than it looks. It publishes like a magazine, takes money like a shop, reports like an accountant, and is staffed by volunteers who will not be trained on anything complicated. Hromada does all of that in two languages: a media platform with articles and authors, a digitised archive of the printed newspaper it has published since 2017, an events calendar with maps, fundraising campaigns for the Anhelyk Foundation programme supporting children who lost parents in the war, and public reports - because a 501(c)(3) has to show where the money went. Everything an editor or organiser touches lives behind one admin panel, and every visitor-facing page exists in English and Ukrainian. One part of the paper outgrew it. The classifieds section - people buying, selling and looking for work through a page in a monthly issue - became Sharvarok, a searchable marketplace with its own iOS and Android apps. The archive here still holds the issues it started in.

The project in numbers

Built by

One person, 750+ commits

Public site, admin panel, donation and subscription handling, newsletter delivery and the infrastructure under all of it, from May 2025 onward.

Donations

One-off and recurring, via PayPal

Recurring giving needed subscription plans for arbitrary amounts, which PayPal has no ready-made answer for: plans are created through the API on demand and tracked against the fundraiser they belong to.

Languages

English and Ukrainian, everywhere

Both locales carried through the site, the admin panel and the outgoing email - not a translated shell over English-only content.

Newspaper archive

Print issues since 2017, readable online

Each issue is uploaded as a PDF and turned into page images server-side, so an archive that existed only on paper became browsable and indexable.

Newsletter

Bulk campaigns over Amazon SES

Bilingual templates, a test-send mode, and rate limiting that respects the provider's throughput, so a campaign to thousands of subscribers does not get the sending domain throttled.

Challenges

  • Taking recurring donations of an amount the donor chooses, when PayPal's subscription model expects a fixed plan defined in advance.
  • Carrying two languages through everything - pages, admin, and outgoing email - rather than bolting translation onto an English-only site.
  • Making thirty years of a printed newspaper readable and indexable online, starting from PDFs.
  • Sending campaigns to thousands of subscribers without tripping the sending limits that would get the domain throttled.
  • Giving volunteers an admin panel they can run a media platform, an events calendar and a fundraising drive from, without a developer on call.
  • Showing an organisation what its own traffic is doing without running heavy aggregate queries on every dashboard load.

Solutions

  • Built recurring giving on PayPal subscription plans created through the API on demand, so a donor picks the amount and the plan is generated to match, tracked against the fundraiser it belongs to.
  • Implemented the whole site in next-intl with English and Ukrainian as equals, extending to the admin panel and the transactional and campaign email.
  • Built a newspaper pipeline that takes an uploaded PDF issue and renders it to page images server-side, turning a paper-only archive into something a reader can browse and a search engine can index.
  • Wired newsletter delivery through Amazon SES with bilingual Handlebars and react-email templates, a test-send mode, and rate limiting that respects the provider's throughput.
  • Built the admin panel the organisation actually runs on: articles with a rich-text editor, authors and categories, events, fundraising campaigns, subscription plans, subscribers, media, banners and YouTube.
  • Added first-party analytics with daily page-view rollups, so the dashboard answers from a summary table instead of scanning raw events, visualised with Highcharts.
  • Added banner slots with impression and click tracking, so the organisation can measure what its own promotion is doing.
  • Guarded public forms with reCAPTCHA v3 and MaxMind GeoIP, and routed operational alerts to Discord.
  • Integrated events with Google Maps and Places autocomplete, so an organiser types a venue and gets a mapped location rather than a text field.

Key Features

  • Bilingual Throughout - English and Ukrainian across the site, the admin panel and outgoing email.
  • Recurring Donations - PayPal subscription plans generated on demand for donor-chosen amounts, plus one-off giving.
  • Fundraising Campaigns - Per-campaign pages with galleries and donation tracking.
  • Newspaper Archive - Printed issues since 2017, uploaded as PDFs and rendered to browsable, indexable pages.
  • Events - Upcoming and past events with Google Maps, Places autocomplete and photo galleries.
  • Public Reports - Financial and activity reporting, as a 501(c)(3) is required to publish.
  • Newsletter - Bulk bilingual campaigns over Amazon SES with test sends and rate limiting, plus Mailchimp integration.
  • Admin Panel - Articles, authors, categories, events, fundraising, subscription plans, subscribers, media, banners and YouTube in one place.
  • First-party Analytics - Daily page-view rollups and banner impression/click tracking, charted with Highcharts.

Project Info

Launch Date:
May 10, 2025
Status:
Active

Technologies

Frontend

Next.jsReactTypeScriptnext-intlSassBootstrapCKEditor 5Highcharts

Backend

Node.jsPrismaMySQLNextAuthZodMaxMind GeoIP

Payments

PayPalRecurring subscriptionsDonation tracking

Messaging

Amazon SESreact-emailHandlebars templatesMailchimpDiscord webhooks

AI & APIs

Google Maps & Places APIYouTubeOpenAI API

Translations

next-intl (EN/UK)

Security

reCAPTCHA v3DOMPurifyRole-based admin access

Hosting & Deployment

DockerDocker Composenginx

DevOps & CI/CD

GitHub Actions

Monitoring & Analytics

First-party page-view rollupsBanner impression & click tracking
Available for new projects

Need something like this?

Tell me what you are building and where it is stuck. I will tell you plainly whether it is work I should be doing.