Fears of atrocities as RSF surrounds key city in Sudan
Fears of atrocities as RSF surrounds key city in Sudan
Listen
Read this story aloud
Listen to the clean text version of this article
Ready
7 min listen
Audio reading is not supported on this browser.
As Sudan’s paramilitary Rapid Support Forces mass around the strategic city of el-Obeid, fears are growing of atrocities similar to those seen in Darfur’s el-Fasher. Could sanctions still prevent bloodshed?
The next major front line in Sudan’s war is most likely the strategically important city of el-Obeid in North Kordofan.
This week, the UN Security Council, several European countries and the United States flagged “the imminent risk of mass atrocities” as increasing numbers of paramilitary Rapid Support Forces (RSF) troops are deployed around the city.
The assumption is largely that the RSF is preparing a ground offensive to try to retake the city, which has been under the control of the Sudanese Armed Forces (SAF) since February 2025.
More To Read
- US sanctions Sudan defence networks aiding warring SAF and RSF factions
- Sudan army says it captured rebel stronghold near Ethiopia border amid renewed Blue Nile
- Fighting intensifies across multiple fronts in Sudan amid deepening humanitarian crisis
- Report details widespread use of sexual violence in Sudan war
- Drone strikes shut down critical services in Sudan’s El Obeid
- Sudan War: AU demands halt to hostilities as violence escalates in El Obeid with millions facing humanitarian emergency
The war in Sudan has been ongoing since a rift between the two rival generals — Abdel-Fattah Burhan of the Sudanese Armed Forces and Mohamed Hamdan Dagalo of the Rapid Support Forces — escalated in April 2023.
Since then, fighting has divided the country into army-held territories in the north and centre, including Sudan’s capital, Khartoum, and RSF-controlled areas in Sudan’s western Darfur region and parts of the south.
Sudan, rich in oil and gold and with its vast agricultural lands, has also turned into the world’s largest humanitarian and displacement crisis over the course of the war.
Latest Stories
- Ugandan rights lawyer Sarah Bireete, activist Eunice Musiime reportedly abducted
- Government given 24 hours to produce missing activist Davis Lichuma or face fresh protests
- Omanyala, Serem to lead strong 10-man Kenyan squad at Paris Diamond League
- Matiang’i calls for suspension of mandatory annual vehicle inspection fees, says move will worsen cost of living
According to the UN, more than 14 million people have been displaced within Sudan and neighbouring countries. The estimated death toll ranges between 40,000 and 250,000 people, as reliable figures remain difficult to obtain due to ongoing fighting.
What makes el-Obeid a target?
The city of el-Obeid, with a population of about 500,000 people, is at the crossroads between central Sudan, Khartoum and the western Darfur region. It is therefore a key gateway for troop movements and military or humanitarian supplies. It is also home to a large SAF military base and a military airfield.
“El-Obeid has been an important logistical hub for supply lines throughout its entire history,” Hager Ali, a researcher at the German think tank GIGA Institute for Global and Area Studies, told DW.
“If the RSF managed to retake el-Obeid, they would not only profit from its urban infrastructure and lucrative gum arabic trade but they could also use the city as a strategic forward operating base for launching drones,” she said.
Over the course of the war, drones have become a key weapon for both factions. According to the UN human rights agency, more than 1,000 civilians were killed in drone strikes between January and May 2026.
However, with the beginning of the rainy season in July, the trajectory of combat drones becomes less predictable, Ali said.
“If the RSF wants to advance towards other cities within Sudan, the most sensible course of action is to find a forward operating base that is much closer to their intended targets, just to combat the difficulties that you get in operating drones in the rainy season,” she said.
Repeating warnings to avoid ‘horrors of el-Fasher’
A spokesman for UN Secretary-General Antonio Guterres warned in a statement earlier in June that “we must not allow the horrors of el-Fasher to be repeated in el-Obeid.”
The Darfur city of el-Fasher has become synonymous with mass atrocities after RSF troops besieged the city for 18 months before fighters killed about 6,000 people over three days last October in what the UN and human rights observers said bore the “hallmarks of genocide.”
“We have every reason to fear that the RSF will continue their mass atrocities if they are allowed to take el-Obeid,” Kenneth Roth, former executive director of Human Rights Watch, told DW. “The RSF have shown utter disregard for civilian life. […] Indeed, deliberately killing large numbers of civilians seems to be their primary aim.”
Amgad Fareid Eltayeb, political and foreign affairs adviser to the Transitional Sovereign Council of Sudan, also views the situation as similar to the months preceding the attack on el-Fasher.
“We are watching the same script, reformed again over el-Obeid,” he said, pointing to “the same grammar of concern, the same vocabulary of alarm and the same closing line that the world is watching.”
Last October, the warnings did not fail because of a lack of evidence, he said. “They failed because the warnings were never meant to become prevention,” said Fareid Eltayeb.
Justice, accountability, sanctions
For Philippe Dam, Human Rights Watch’s EU director for advocacy, speaking up is nevertheless important. “It sends a clear message to the leadership of the Rapid Support Forces, but the international states should also send a very clear message to the backers,” he said.
“The United Arab Emirates has a proven responsibility for fueling the conflict and the atrocities that are committed by the Rapid Support Forces; those involved should be sanctioned,” Dam told DW.
However, the United Arab Emirates has denied any involvement in the war or support for the RSF. The SAF is officially supported by Egypt, Turkey, Russia and Iran.
In Dam’s view, immediate sanctions could help to protect civilians and still prevent atrocities.
“Sanctioning the RSF leadership today is essential given their command responsibility in the crimes the RSF commit and to make clear that this person should have no role in the future of the country,” he added.
RSF General Mohamed Hamdan Dagalo, also known as Hemedti, established his “Government of Peace and Unity” in areas under his control in 2025. However, he actually claims to have jurisdiction over all of Sudan, just like his counterpart, al-Burhan of the Sudanese Armed Forces.
The US sanctioned both generals in January 2025, as well as multiple individuals linked to both factions later on. The EU also sanctioned individuals and entities linked to both sides, but the UN has neither sanctioned the generals nor their respective organisations as a whole.
“The designation of the RSF as a terrorist organisation is the only way to make it harder for the United Arab Emirates to continue supporting and funding one genocide after another in Sudan,” said Fareid Eltayeb.
Other Topics To Read
“However, the world chooses not to act seriously,” he added. In his view, every statement from the international community that mourns the coming atrocity, while avoiding naming its financier, is not a step toward prevention, it’s a step around it.”
Top Stories Today
- Government given 24 hours to produce missing activist Lichuma or face fresh protests
- Ugandan rights lawyer Sarah Bireete, activist Eunice Musiime reportedly abducted
- Omanyala, Serem to lead strong 10-man Kenyan squad at Paris Diamond League
- Matiang’i calls for suspension of mandatory annual vehicle inspection fees
- Saboti MP Caleb Amisi calls for release of activist Bob Njagi, claims activist facing treason charge
- Wajir, Siaya and Nairobi among counties with highest manual payroll payments
`;
}
return “;
}
function commentActionsMarkup(comment, canComment) {
const likeLabel = comment.liked_by_me ? ‘Liked’ : ‘Like’;
const likeCount = Number(comment.like_count || 0) > 0
? “
: ”;
const likeButton = canComment && comment.status === ‘approved’
? “
: “;
const replyButton = canComment && comment.status === ‘approved’
? “
: ”;
return `
`;
}
function commentMarkup(comment, canComment, isReply = false) {
const pendingBadge = comment.status && comment.status !== ‘approved’
? “
: ”;
const edited = comment.is_edited
? “
: ”;
const repliesHtml = Array.isArray(comment.replies) && comment.replies.length
? `
`
: “;
return `
`;
}
function replyFormMarkup(commentId) {
return `
`;
}
function setNotice(widget, message, type = ‘info’) {
const notice = widget.querySelector(‘[data-role=”notice”]’);
if (!notice) return;
if (!message) {
notice.hidden = true;
notice.textContent = ”;
notice.classList.remove(‘is-error’);
return;
}
notice.hidden = false;
notice.textContent = message;
notice.classList.toggle(‘is-error’, type === ‘error’);
}
function setCount(widget, total) {
const count = widget.querySelector(‘[data-role=”count”]’);
if (!count) return;
const num = Number(total || 0);
count.textContent = num === 1 ? ‘1 comment’ : `${num} comments`;
}
function openReplyBox(widget, commentId) {
widget.querySelectorAll(‘[data-role=”reply-box”]’).forEach(box => {
box.hidden = true;
box.innerHTML = ”;
});
const targetItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (!targetItem) return;
const replyBox = targetItem.querySelector(‘[data-role=”reply-box”]’);
if (!replyBox) return;
replyBox.hidden = false;
replyBox.innerHTML = replyFormMarkup(commentId);
const textarea = replyBox.querySelector(‘textarea’);
if (textarea) textarea.focus();
}
function closeReplyBox(container) {
if (!container) return;
container.hidden = true;
container.innerHTML = ”;
}
async function initCommentsWidget(widget) {
const state = {
articleId: Number(widget.dataset.articleId),
loadUrl: widget.dataset.loadUrl,
storeUrl: widget.dataset.storeUrl,
commentsBaseUrl: widget.dataset.commentsBaseUrl,
canComment: widget.dataset.canComment === ‘1’,
page: 1,
perPage: 10,
sort: ‘newest’,
total: 0,
hasMore: false,
busy: false
};
const list = widget.querySelector(‘[data-role=”list”]’);
const loading = widget.querySelector(‘[data-role=”loading”]’);
const empty = widget.querySelector(‘[data-role=”empty”]’);
const loadMoreBtn = widget.querySelector(‘[data-role=”load-more”]’);
const sortSelect = widget.querySelector(‘[data-role=”sort”]’);
const composerForm = widget.querySelector(‘[data-role=”composer-form”]’);
async function loadComments(reset = true) {
if (state.busy) return;
state.busy = true;
setNotice(widget, ”);
loading.hidden = false;
if (reset) {
state.page = 1;
list.innerHTML = ”;
empty.hidden = true;
}
try {
const url = new URL(state.loadUrl, window.location.origin);
url.searchParams.set(‘page’, state.page);
url.searchParams.set(‘per_page’, state.perPage);
url.searchParams.set(‘sort’, state.sort);
const response = await requestJson(url.toString(), {
method: ‘GET’,
headers: {
‘Accept’: ‘application/json’,
‘X-Requested-With’: ‘XMLHttpRequest’
}
});
const items = Array.isArray(response.data) ? response.data : [];
const meta = response.meta || {};
state.total = Number(meta.total || 0);
state.hasMore = !!meta.has_more;
setCount(widget, state.total);
if (reset) {
list.innerHTML = ”;
}
if (!items.length && reset) {
empty.hidden = false;
} else {
empty.hidden = true;
list.insertAdjacentHTML(
‘beforeend’,
items.map(item => commentMarkup(item, state.canComment, false)).join(”)
);
}
loadMoreBtn.hidden = !state.hasMore;
} catch (error) {
if (!list.children.length) {
empty.hidden = false;
empty.textContent = ‘Unable to load comments right now.’;
}
setNotice(widget, error.message || ‘Unable to load comments.’, ‘error’);
} finally {
loading.hidden = true;
state.busy = false;
}
}
async function submitTopLevelComment(form) {
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘[data-role=”submit-comment”]’);
if (!textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(state.storeUrl, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
textarea.value = ”;
if (response?.data) {
list.insertAdjacentHTML(
‘afterbegin’,
commentMarkup(response.data, state.canComment, false)
);
empty.hidden = true;
if ((response.data.status || ”) === ‘approved’) {
state.total += 1;
setCount(widget, state.total);
}
}
setNotice(widget, response.message || ‘Comment posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post comment.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post comment’;
}
}
}
async function submitReply(form) {
const commentId = Number(form.dataset.commentId || 0);
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘.ev-comments__reply-submit’);
if (!commentId || !textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/reply`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
if (response?.data) {
const parentItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (parentItem) {
const repliesWrap = parentItem.querySelector(‘.ev-comments__replies’);
if (repliesWrap) {
repliesWrap.insertAdjacentHTML(
‘beforeend’,
commentMarkup(response.data, state.canComment, true)
);
}
}
}
closeReplyBox(form.closest(‘[data-role=”reply-box”]’));
setNotice(widget, response.message || ‘Reply posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post reply.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post reply’;
}
}
}
async function toggleLike(button) {
const commentId = Number(button.dataset.commentId || 0);
if (!commentId) return;
const originalHtml = button.innerHTML;
try {
button.disabled = true;
button.innerHTML = ‘Working…’;
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/like`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({})
});
const liked = !!response?.data?.liked;
const likeCount = Number(response?.data?.like_count || 0);
button.classList.toggle(‘is-liked’, liked);
button.innerHTML = `${liked ? ‘Liked’ : ‘Like’} ${likeCount > 0 ? “ : ”}`;
} catch (error) {
button.innerHTML = originalHtml;
setNotice(widget, error.message || ‘Unable to update like.’, ‘error’);
} finally {
button.disabled = false;
}
}
if (composerForm) {
composerForm.addEventListener(‘submit’, function (e) {
e.preventDefault();
submitTopLevelComment(composerForm);
});
}
if (sortSelect) {
sortSelect.addEventListener(‘change’, function () {
state.sort = this.value || ‘newest’;
loadComments(true);
});
}
if (loadMoreBtn) {
loadMoreBtn.addEventListener(‘click’, function () {
if (state.busy || !state.hasMore) return;
state.page += 1;
loadComments(false);
});
}
widget.addEventListener(‘click’, function (e) {
const likeBtn = e.target.closest(‘[data-action=”toggle-like”]’);
if (likeBtn) {
e.preventDefault();
toggleLike(likeBtn);
return;
}
const replyBtn = e.target.closest(‘[data-action=”toggle-reply”]’);
if (replyBtn) {
e.preventDefault();
openReplyBox(widget, Number(replyBtn.dataset.commentId || 0));
return;
}
const cancelReplyBtn = e.target.closest(‘[data-action=”cancel-reply”]’);
if (cancelReplyBtn) {
e.preventDefault();
closeReplyBox(cancelReplyBtn.closest(‘[data-role=”reply-box”]’));
}
});
widget.addEventListener(‘submit’, function (e) {
const replyForm = e.target.closest(‘.ev-comments__reply-form’);
if (replyForm) {
e.preventDefault();
submitReply(replyForm);
}
});
loadComments(true);
}
document.addEventListener(‘DOMContentLoaded’, function () {
document.querySelectorAll(‘.ev-comments’).forEach(initCommentsWidget);
});
})();
Trending
Government given 24 hours to produce missing activist Davis Lichuma or face fresh protests
Kane becomes England’s all-time World Cup top scorer as Croatia edge Ghana to clinch knockout spot
Messi makes World Cup history as Argentina complete perfect group stage while Algeria survive dramatic finale to seal knockout spot
DR Congo end 52-year World Cup wait with historic first victory to reach knockout round
UN appoints Somali diplomat Mohamed Yahya as Assistant Secretary-General for Humanitarian Affairs
South Africa strengthens migration management ahead of planned demonstrations
Suspect in Minnesota child nutrition fraud case arrested in Mogadishu
Uganda’s army chief Muhoozi orders closure of NTV Uganda, Spark TV and Daily Monitor after night raid
Businesses win as MPs extend tax relief in Finance Bill 2026
Saboti MP Caleb Amisi calls for release of activist Bob Njagi, claims activist facing treason charge
