A modern, server-side rendered web platform for the zurich meets tanzania association — a non-profit organization supported by hospital staff in Zurich. The website provides information about the main project, subsidiary projects, news, finances, member areas, donation options and more.
The application is built as an Angular SSR project and is served by an Express backend. It supports, among other things, member management, newsletter functionality, contact forms, donation and payment flows, as well as German-language content and strong SEO metadata.
- About the Project
- Features
- Technology Stack
- Project Structure
- Prerequisites
- Local Development
- Build & Start
- Environment Variables
- Important Routes
- External Services
- Contributing
- License
zurich meets tanzania is the website of the association of the same name. Its focus is on providing information, communication, and support for work in Tanzania and for the association's activities in Switzerland.
The website provides, among other things:
- Project information and the history of the association
- Blog and news content
- Contact options
- Member and account functionality
- Donation and payment processes
- Financial and association documents
- Redirects and SEO-friendly routes
- SSR for improved loading times and search engine indexing
- Angular SSR for server-side rendering
- Express backend as the runtime and API/routing layer
- Session-based authentication
- Protected areas for logged-in users and admins
- Redirect handling for legacy and alternative paths
- SEO metadata per route
- Newsletter and email templates
- Donation and payment integration with Stripe
- MySQL integration for persistent data
- Media and upload support
- Frontend: Angular, Angular Router, Angular SSR
- Backend: Node.js, Express
- Styling: SCSS
- Database: MySQL
- Auth / Sessions: express-session, bcryptjs
- Email: node-mailjet (nodemailer in the future)
- Payments: Stripe
- Uploads / Data Processing: multer, xlsx
- Utilities: dotenv, cors, compression, rxjs
src/
app/
app.component.* Main app shell, routing, layout, theme/metadata
app.config.* Angular client/server configuration
app.routes.* Routing configuration
components/ UI components such as Header, Footer, Banner
services/ Business and UI services
middleware/ Express middleware for auth/session
router/ Backend router
shared/ Shared types and utility logic
styles/ Global styles, colors, fonts, layout
home/ Home page
contact/ Contact page
donate/ Donation section
blog/ Blog/news views
gallery/ Image gallery
privacy/ Privacy policy
imprint/ Legal notice
membership/ Membership
login/ Login
signup/ Registration
password-recovery/ Password reset
secured/ Protected user areas
admin/ Administration area
... Additional project/content pages
public/
assets, images, icons, pdfs, backups
dev/
compose.yaml Local development services
How it works together:
src/main.ts bootstraps the Angular application in the browser, src/main.server.ts starts the same application for SSR, and src/server.ts connects Express, sessions, CORS, static assets, redirects, and the Angular Node App Engine renderer. Route-specific metadata and redirects are centrally controlled through PUBLIC_CONFIG. This allows content, SEO titles, and legacy URLs to be maintained consistently.
The following are required for local development:
- Node.js
- npm
- Docker + Docker Compose
- A MySQL instance
- The required environment variables
- Optional: Stripe CLI for webhooks
The easiest way to get started is through the development setup defined in the project:
npm install
npm run devAccording to package.json, the development workflow starts:
- MySQL and other local services via Docker Compose
- Angular Dev Server on port
8080
If payment flows need to be tested, run the following in a second terminal:
npm run stripenpm install
npm run build
npm startOther useful commands:
npm test
npm run watch
npm run format
npm run stripe
npm run stopThe file src/config.ts shows which values are required at runtime. These include, among others:
ENVHOSTPORTALLOWED_HOSTSHTTPS_ACTIVEHTTPS_PORTHTTPS_CERT_PASSPHRASESESSION_SECRET_KEYMYSQL_HOSTMYSQL_PORTMYSQL_USERMYSQL_PWMYSQL_DBMAILJET_PUBLIC_KEYMAILJET_PRIVATE_KEYORIGINEMAIL_SENDER_ADDRESSEMAIL_SENDER_NAMEDELIVAPI_URLDELIVAPI_USERDELIVAPI_KEYPASSWORD_*Account/service passwordsEMAIL_*Account/service addressesTIANJI_*STRIPE_PRIVATE_KEYSTRIPE_PUBLIC_KEYSTRIPE_PRIVATE_KEY_TESTSTRIPE_PUBLIC_KEY_TESTSTRIPE_ENDPOINT_SECRETSTRIPE_ENDPOINT_SECRET_TESTSTRIPE_PRICE_MEMBERSHIPSTRIPE_PRICE_MEMBERSHIP_TEST
The following areas are defined by the project's configuration:
/– Home page/zurich-meets-tanzania– Main project/bajaji– Subsidiary project/cardiology/gynecology/mbuzi/meducation/surgery/tanzania-meets-zurich/blog/archive/current-team/donate/contact/membership/login/signup/password-recovery/account/admin/privacy/imprint/statutes/vision/gallery/general-meeting/finances/income-statement/newsletter/confirm/newsletter/unsubscribe/payment-success/payment-cancelled
There are also redirects for legacy or alternative URL variants, such as /zmt, /tmz, /vorstand, /impressum, /mitglied-werden, /kardiologie, /gyno, and many others.
The application integrates with or references several external services:
- Stripe for payments and webhooks
- Mailjet for email delivery
- Delivapi as a separate service in the development setup
- Tianji for analytics/tracking
- Unikat as a shop redirect
- Instagram and Facebook for social links
If you want to make changes:
- Clone the repository
- Install the dependencies
- Start the app locally
- Make changes in
src/ - Run the tests and build
- Open a pull request
Recommended checks:
npm test
npm run build
npm run formatThis project is licensed under the Mozilla Public License 2.0 (MPL-2.0).