Back to projects

In plain English

A website that gathers Lithuanian community events in Denmark into one place. Instead of checking six different organizations, people see everything on one calendar with a map and can add events to their own. (Now retired.)

End-to-end · Solo build · Discontinued

Ecalendy

A community events platform for Lithuanians in Denmark. Aggregates 6 organizations' Google Calendars into one searchable interface with grid and list views, an interactive map, one-click calendar export, and full Lithuanian language support. The site is still live and serving the existing event feeds, but I'm no longer actively maintaining it.

ProductDesignFrontendBackend
Ecalendy · Lithuanian events calendar with mobile view
Community events from 6 Lithuanian organizations in one place

Browse the calendar

Lithuanian community events in Denmark, one place

Aggregated from 6 organizations' Google Calendars. Grid, list, and map views. Free, no signup. Still live, no longer actively maintained.

By the numbers

Status

Live · discontinued

Site serving, not actively maintained

Organizations

6

LYS, Credo, Embassy, DLB, AI Workshops, LP

Refresh

Daily 06:00 UTC

Vercel Cron + 1h ISR revalidation

Stack cost

Free

Vercel free tier, no DB

Why I built this

As president of the Lithuanian Youth Society in Denmark, I saw that Lithuanian events in Copenhagen were scattered across different organizations' Google Calendars, Facebook pages, and websites. Nobody had a single place to see everything. I built Ecalendy to aggregate all events into one searchable, filterable interface that the entire community can use.

How it works

1

Aggregate from 6 organizations

Fetches events from LYS, Credo choir, Lithuanian Embassy, DLB community, AI Workshops CPH, and Lithuanian Professionals, all via Google Calendar API. AllEvents.in scraper serves as a fallback source.

2

Geocode and enrich

Smart address parsing extracts street names using Danish patterns (gade, vej, stræde, allé), geocodes via Nominatim with rate limiting and caching. Events get keyword-based fallback images when no photo is available.

3

Browse, search, and filter

Desktop shows card grid with holographic shimmer effects; mobile shows a compact list. Filter by organization, language (Lithuanian or English), and month. Real-time text search across titles and descriptions.

4

Export to your calendar

One-click export to Google Calendar via URL intent, or download .ics files for Apple Calendar / Outlook. Lithuanian characters (ąčęėįšųūž) are properly encoded.

Integrated organizations

LYS · Lietuvių Jaunimo Draugija

Lithuanian

Choras Credo

Lithuanian

LR Ambasada Danijoje

Lithuanian

Danijos Lietuvių Bendruomenė

Lithuanian

AI Workshops CPH

English

Lithuanian Professionals in CPH

English

Key features

Grid + list views

Desktop card grid with holographic shimmer; mobile compact list, CSS-based responsive switching

Interactive map

Leaflet map with color-coded organization markers, popups, legend, and unmapped count indicator

Smart geocoding

Multi-strategy address parsing with Danish street patterns, Nominatim fallback, and in-memory caching

Lithuanian localization

Full Lithuanian UI with proper grammatical cases (nominative + genitive months), weekday names, and date formatting

Calendar export

Google Calendar URL intent + ICS download with UTF-8 Lithuanian character support

PWA installable

Add to home screen on iOS/Android, dark theme default, custom geometric logo icon

Tech stack

Frontend

Next.jsReactTypeScriptTailwind CSS

Maps

Leaflet

react-leaflet with dynamic imports for SSR safety, CartoDB dark/light tiles

Data Sources

Google Calendar APICheerio

6 Google Calendars + AllEvents.in scraper as fallback

Infrastructure

Vercel

ISR (1h revalidation), Vercel Cron (daily 06:00 UTC), file-based event cache

Under the hood

It pulls events from all six organisations at once and refreshes itself automatically every morning, so if one calendar is down the rest still come through and nobody has to update anything by hand.

All the searching and filtering happens instantly in your browser because everything is already loaded, so flipping between organisations, languages, and months feels immediate.

Brand & creative

Marketing posters and animated creative

Two brand posters and an animated 9:16 creative generated with Pomelli, Google's AI brand toolkit.

Ecalendy brand posterBrand poster
Ecalendy value-prop posterValue prop
Animated MP4

Common questions

Is the site still up?+

Yes. renginiukalendorius.vercel.app is live and the daily 06:00 UTC cron still fetches new events. I just stopped adding features and onboarding new organizations.

Why is it discontinued?+

It served its purpose for a while, but the underlying audience is small (Lithuanian community in Copenhagen) and most of the organizations stopped using their public Google Calendars. The build is solid; the user need shrunk.

Can I add my organization to it?+

In theory yes, in practice no longer maintained. The integration is one config entry per org plus a Google Calendar API key, but I'm not actively onboarding new ones. If you really want it back, fork the repo.

Is the source open?+

Yes, the GitHub repo at AuriDevcourse/renginiukalendorius is public. You'd need a Google Calendar API key and an org config to run your own.

What did it cost to run?+

Nothing. Vercel free tier, no database, no paid APIs. Google Calendar API and Nominatim geocoding are both free at this volume.

Is the design any good?+

I'm proud of the holographic shimmer cards and the Leaflet map with color-coded org markers. The Lithuanian-language UI with proper grammatical cases (Balandis vs Balandžio depending on context) was a small detail nobody noticed but I'd do again.

What I learned

  • ·Building for a real community gives you honest feedback you never get from projects nobody uses.
  • ·A solid build can still outlive its audience. The site worked well, but the small community moved on, and that is a product lesson, not a code one.
  • ·Getting the small language details right, like the correct Lithuanian month forms, made it feel genuinely made for the community even if almost nobody consciously noticed.

Why I stopped

Honest accounting. Sometimes the right call is to let a project keep serving its current users without forcing it forward.

Audience shrunk

The Lithuanian-in-Copenhagen community is small. Most of the orgs I onboarded stopped publishing on Google Calendar (moved to Facebook Events, Luma, or stopped publishing publicly altogether). Aggregating empty calendars isn't a product.

Single-community ceiling

Generalising to other diaspora communities in Denmark (Latvian, Estonian, Polish, etc) was the obvious next move. Each would need org outreach, calendar config, language localisation. Not the right project for me right now.

Replaced by lighter alternatives

For my own use, I now lean on a Notion calendar that links to events. Less polished, but doesn't require six orgs to keep publishing in the same place.

Keeping it live anyway

The site costs nothing to run on Vercel free tier. The cron still fires daily and serves the orgs that DO publish. Better to leave it up for them than tear it down on principle.

Let's talk about this project

More projects

Next.jsReactTypeScriptTailwind CSSLeafletGoogle Calendar APICheerioVercel