/

Bremen, Germany

Designing an interactive database of 400+ nonviolent movements for CANVAS.

Client: CANVAS (Centre for Applied Nonviolent Action and Strategies) — a Belgrade-based non-profit that has worked with pro-democracy activists from 50+ countries since 2005.

My role: I led the UX direction and co-designed the UI together with another designer. I owned the information architecture, filter logic, and the pin system — and was the primary point of contact in stakeholder conversations where we had to push back on scope.

Problem space

CANVAS had spent years building a structured database of 400+ nonviolent resistance movements. Each entry was rich: dates, geographic context, tactics used, outcome scores, media coverage assessments, author credits. The dataset was real, rigorous, and completely inaccessible to anyone outside a spreadsheet.

To make this knowledge explorable by the people who needed it most: researchers and academics looking to analyze patterns across movements, and activists and NGO practitioners who wanted to learn from historical cases relevant to their own context.

These two users come to the map with different intent:

Researchers and academics

want to filter, compare, and find patterns — they have a question before they open the page.

Activists and NGO practitioners

want to explore and discover — they arrive curious, not with a specific query.

Problem #1

The data was too rich for the interface

The client wanted every attribute in the database surfaced as a filter. That's understandable — they built this data with care, and every field felt meaningful to them. But 17+ filters on a map interface doesn't give users power, it gives them paralysis.

How might we help users meaningfully explore 400+ cases without overwhelming them with every dimension of the data?

Problem #2

400+ pins on a world map is visual chaos

At a global zoom level, dense regions — the Middle East, Europe, Latin America — would collapse into an unreadable mass. Any solution had to preserve geographic meaning at every zoom level, not just when you're already close to a specific country.

How might we show the full dataset at once while keeping the map readable and navigable from any zoom level?

Key decision #1

Filter prioritisation

The client came with a spreadsheet and a request to put everything on the map. We said that wouldn't work. They disagreed. Instead of continuing the conversation, we built a prototype with all 17 filters fully exposed — exactly what they asked for. We put it in front of them.

Seeing it rendered changed the conversation immediately. The interface was unusable, and that was now undeniable. From there, we could finally work together on what actually mattered.

The framework we used to decide: A filter earns its place if it helps you find something. If it only describes something you've already found — it belongs on the case page, not the map.

Applying that lens, we landed on six filters:

Filter

Rationale

Country

Primary geographic orientation — how most users would start

Year

Enables temporal analysis — trends over decades

Type of protest

The 9 core categories, each with its own color on the map

Tactics used

Based on the 198 Methods of Nonviolent Action, grouped into clusters

Success score

Simple Low / Medium / High — immediately meaningful

Case writer

Surfaces credibility and lets users follow specific researchers

The 12 we cut — "Concessions were made", "Opponent response", "Media coverage was sympathetic" and others — were all descriptive attributes. Valuable on a case page. Noise on a map.

Key decision #2

The Pin system

With 400+ geographically distributed points, we needed a system that stayed readable at every zoom level — from world view to street level — and communicated category at a glance.

We defined a color-coded pin system built around the 9 protest categories — each category gets its own color, so the map is readable before any interaction.

2
Accountability / Corruption
2
Civil Rights and Equality
2
Economic Justice
2
Environment
2
Human Rights
2
National/Ethnic Identity
2
Peace
2
Pro-Democracy
2
Self-Determination / Independance

We defined two core states the pin system needed to handle:

Single pin

Colored by category, with one pin per category; the number indicates the total events. Tap to open a compact tooltip: name, category, year, country, and a link to the full case.

Cluster pin

At zoom-out, nearby pins group into a cluster. Same-category clusters inherit the category color; mixed-category clusters use a neutral style — a signal to zoom in rather than misrepresent what's inside.

Development & launch

We knew our development resources were finite from the start, so design decisions were made with buildability in mind throughout — not as a constraint discovered at the end. By the time we reached handoff, there were no surprises: most technical considerations had already been absorbed into the design during the process.

The product shipped to production and remains live. CANVAS continues to actively add new cases to the database — a meaningful signal that the system works well enough that they trust it and keep investing in it.

What I'd do differently

Stay more involved past handoff. There's a gap between a polished Figma file and a polished shipped product, and closing that gap requires a designer to be present and vocal during implementation. I underestimated how much that final mile matters. It's a lesson I carry into every project now: advocacy for the design doesn't end at handoff.