Mar-Alto
Ticketing, voucher reservations and loyalty system for Mar-Alto, a cultural association in Nazaré (Círculo Cultural da Nazaré), non-profit with public-interest status.
- Client
- Círculo Cultural da Nazaré
- Year
- 2025
- Role
- Director
- Stack
- Next.js 16, Firebase, TypeScript, Vercel

The problem
Mar-Alto (Círculo Cultural da Nazaré) is a cultural association in Nazaré that didn’t have its own website, despite having a strong online presence and following on social media.
I was invited to join the association’s board in 2022, and at the time of writing (August 2026) I’m in my second term as a board member.
As a way to put my knowledge and experience to use, I first built a small public voting app for the masquerade ball, which until then only the jury could vote in.
Later, so the association would have an official place online, I built an institutional site not just for marketing, but also to help manage its own events.
The solution
Today, the Mar-Alto site is a complete platform integrating dedicated Carnival pages, event listings, a ticketing system with PDF and QR-code access control, voucher purchases for Carnival balls, and an admin backoffice for content management.
This solution complements the physical sale of tickets and vouchers with online payments (via MB Way and Multibanco), as well as letting users take part in public votes (mask contests; Mar-Alto Awards).
The admin dashboard also makes it possible to notify users via push notifications and email to promote events.
Stack and decisions
As a cultural association with public-interest status, there’s no profit motive. Every stack and architecture decision was made to allow the use of tools with generous free tiers, reaching for paid plans only when strictly necessary.
The Mar-Alto site uses Next.js 16 (App Router) with TypeScript on both frontend and backend — server-side API routes use firebase-admin to access Firestore (database) and authentication. The design is responsive, and the site is also a PWA, allowing native install and use on mobile devices.
Hosting is on Vercel with direct GitHub integration, to keep maintenance simple with no server to manage manually.
Challenges
To offer online payments, I needed to integrate with IfThenPay, a payment gateway with public documentation but no sandbox environment for testing. To test the full payment flow before launch, I built a local mock payment gateway to simulate the calls between services. Afterwards, I tested the real flow in production with money out of my own pocket, to make sure — before opening it to the public — that issuing, paying for and validating tickets worked without failures.
Another challenge came up during the Mar-Alto Awards vote, when a traffic spike disrupted the sending of confirmation emails. The native SMTP email client had a daily sending limit we hit without noticing; it was users themselves who reported not receiving their email. I switched sending over to Resend within a few hours and resent the missing emails, without the vote ever having to stop.