Serbia anti-corruption protests

Data on Serbia anti-corruption protests.
social movements
counter-mobilisation
Author
Published

Saturday, 1 February 2025

Updated on 15 February 2025

Concerns about corruption in the government and public institutions of Serbia have been prevalent for many years. But the collapse of the concrete roof at Novi Sad rail station on 1 November 2024 quickly took on a symbolic dimension, epitomising the hazardous consequences of graft in the public sector. This symbol became the catalyst for a wave of protests. Since the Serbian Progressive Party (Srpska napredna stranka, SNS) has led the Serbian government since 2012 (under President Aleksandar Vučić since 2017), protests inevitably focused on Vučić and the SNS, decrying their culpability for such public infrastructure failures.

The protest wave has included vigils, demonstrations, blockades, and strikes. It has triggered violent clashes (some linked to state actors), governmental reactions and concessions. (Some of these developments are represented in Figure 1 — but the unfolding of events is more complex.)

Figure 1: Timeline of events related to the protests.

As shown in Figure 2, the number of protests since November 2024 dwarfs preceding rates of protest. As of 1 February 2025, the protests have shown no signs of dissipating, with thousands of protesters continuing to demand justice and accountability for the deaths of 15 people in Novi Sad.

Figure 2: Number of protests by week.

The 2024-2025 anti-corruption protests in Serbia have been characterized by widespread demonstrations and traffic blockades across the country. Data from ACLED (the Armed Conflict Location and Event Data Project) allows us to inspect this protest wave in greater detail. The spatial patterns of these protests have been marked by a strong presence in urban areas, with protesters often gathering in front of government buildings, universities, and other public institutions. The cities of Belgrade and Novi Sad (where the rail station roof collapse occurred) have seen the most frequent protest activity. Figure 3 and Figure 4 show that (unsurprisingly) the capital of Belgrade has seen the highest concentration of protest activity; thousands of protesters have gathered in front of the Serbian state TV building and other government institutions to demand unbiased reporting and accountability from the government. Novi Sad, the city where the railway station roof collapse occurred, has also seen significant protests, with demonstrators holding daily 15-minute traffic blockades to honour the 15 people who died in the tragedy.

Figure 3: Map of protests by region.
Figure 4: Plot of protests. Plot A shows all protests by location. In Plot B, protests in different areas of Belgrade are grouped together.

As shown in Figure 5, other cities across Serbia, including Niš, Čačak, and Kraljevo, have also experienced protests, with educators, students, and citizens demanding better working conditions, increased funding for education, and an end to government corruption. The protests have also taken on a symbolic dimension, with protesters leaving red hand-prints on government buildings and using slogans like “corruption kills” to emphasise their demands for transparency and accountability.

Figure 5: Plot of protests, similar to the map in Hellmeier (2022).

Figure 6 shows the occurrence of protests in the weeks since the anti-corruption campaign began in November 2024. Since early January the frequency and average size of protests has risen significantly. Several protests have attracted more than 20,000 participants.

Figure 6: Plot of protests since 1 November 2024. The red circles represent protests of 20,000 or more; the orange, between 1,000 and 20,000; the yellow, between 100 and 1,000; and the green, fewer than 100 participants.

Further protests may bring further concessions and resignations from the Serbian government. In the meantime, the interactive map in Figure 7 plots the protests that have occurred since 1 November 2024 through mid-January 2025.

SRB_sf <- SRB %>% 
  st_as_sf(
    coords = c("longitudeJIT", "latitudeJIT"),
    crs = st_crs("EPSG:8682") # CRS for Serbia (https://epsg.io/?q=Serbia)
  )

st_crs(SRB_sf) <- st_crs(rs)

mapview(SRB_sf, col.regions = "maroon", label = "event_date",
        legend = T, layer.name = 'Anti-corruption Protests',
        map.types = c("CartoDB.Positron","CartoDB.DarkMatter"),
        popup = popupTable(SRB_sf,
                           zcol = c("country","admin1","admin2",
                                    "location","notes","tags")))
Figure 7: Map of protests.